CacheSignatureBestEffort stores a thinking signature for completed response paths.
(ctx context.Context, modelName, text, signature string)
| 121 | |
| 122 | // CacheSignatureBestEffort stores a thinking signature for completed response paths. |
| 123 | func CacheSignatureBestEffort(ctx context.Context, modelName, text, signature string) bool { |
| 124 | if text == "" || signature == "" { |
| 125 | return false |
| 126 | } |
| 127 | if len(signature) < MinValidSignatureLen { |
| 128 | return false |
| 129 | } |
| 130 | |
| 131 | if client, homeMode, errClient := currentSignatureKVClient(); homeMode { |
| 132 | if errClient != nil { |
| 133 | log.Errorf("home kv best-effort signature set failed prefix=cpa:signature:*: %v", errClient) |
| 134 | return false |
| 135 | } |
| 136 | written, errSet := client.KVSet(ctx, signatureKVKey(modelName, text), []byte(signature), homekv.KVSetOptions{EX: SignatureCacheTTL}) |
| 137 | if errSet != nil { |
| 138 | log.Errorf("home kv best-effort signature set failed prefix=cpa:signature:*: %v", errSet) |
| 139 | return false |
| 140 | } |
| 141 | return written |
| 142 | } |
| 143 | |
| 144 | groupKey := GetModelGroup(modelName) |
| 145 | textHash := hashText(text) |
| 146 | sc := getOrCreateGroupCache(groupKey) |
| 147 | sc.mu.Lock() |
| 148 | defer sc.mu.Unlock() |
| 149 | |
| 150 | sc.entries[textHash] = SignatureEntry{ |
| 151 | Signature: signature, |
| 152 | Timestamp: time.Now(), |
| 153 | } |
| 154 | return true |
| 155 | } |
| 156 | |
| 157 | // GetCachedSignature retrieves a cached signature for a given model group and text. |
| 158 | // Returns empty string if not found or expired. |