Skip to content

Commit 850336f

Browse files
authored
feat(cache): add provider prompt cache planner (#1426)
* feat(cache): add provider prompt cache planner * feat(provider): refine zenmux cache and UI * fix(zenmux): guard anthropic embeddings
1 parent ebe12d2 commit 850336f

41 files changed

Lines changed: 2718 additions & 69 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/main/presenter/deepchatAgentPresenter/accumulator.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ export function accumulate(state: StreamState, event: LLMCoreStreamEvent): void
168168
state.metadata.outputTokens = event.usage.completion_tokens
169169
state.metadata.totalTokens = event.usage.total_tokens
170170
state.metadata.cachedInputTokens = event.usage.cached_tokens
171+
state.metadata.cacheWriteInputTokens = event.usage.cache_write_tokens
171172
break
172173
}
173174
case 'stop': {

src/main/presenter/deepchatAgentPresenter/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1405,7 +1405,8 @@ export class DeepChatAgentPresenter implements IAgentImplementation {
14051405
maxTokens: generationSettings.maxTokens,
14061406
thinkingBudget: generationSettings.thinkingBudget,
14071407
reasoningEffort: generationSettings.reasoningEffort,
1408-
verbosity: generationSettings.verbosity
1408+
verbosity: generationSettings.verbosity,
1409+
conversationId: sessionId
14091410
}
14101411

14111412
const traceEnabled = this.configPresenter.getSetting<boolean>('traceDebugEnabled') === true

src/main/presenter/deepchatAgentPresenter/process.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,5 +308,8 @@ function buildUsageSnapshot(state: StreamState): Record<string, number> {
308308
if (typeof state.metadata.cachedInputTokens === 'number') {
309309
usage.cachedInputTokens = state.metadata.cachedInputTokens
310310
}
311+
if (typeof state.metadata.cacheWriteInputTokens === 'number') {
312+
usage.cacheWriteInputTokens = state.metadata.cacheWriteInputTokens
313+
}
311314
return usage
312315
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
export type PromptCacheMode =
2+
| 'disabled'
3+
| 'openai_implicit'
4+
| 'anthropic_auto'
5+
| 'anthropic_explicit'
6+
7+
function normalizeId(value: string | undefined): string {
8+
return value?.trim().toLowerCase() ?? ''
9+
}
10+
11+
function isClaudeModel(modelId: string): boolean {
12+
return modelId.includes('claude')
13+
}
14+
15+
export function resolvePromptCacheMode(providerId: string, modelId: string): PromptCacheMode {
16+
const normalizedProviderId = normalizeId(providerId)
17+
const normalizedModelId = normalizeId(modelId)
18+
19+
if (normalizedProviderId === 'openai') {
20+
return 'openai_implicit'
21+
}
22+
23+
if (normalizedProviderId === 'anthropic' && isClaudeModel(normalizedModelId)) {
24+
return 'anthropic_auto'
25+
}
26+
27+
if (
28+
normalizedProviderId === 'zenmux' &&
29+
normalizedModelId.startsWith('anthropic/') &&
30+
isClaudeModel(normalizedModelId)
31+
) {
32+
return 'anthropic_explicit'
33+
}
34+
35+
if (
36+
normalizedProviderId === 'aws-bedrock' &&
37+
(normalizedModelId.includes('anthropic.claude') || isClaudeModel(normalizedModelId))
38+
) {
39+
return 'anthropic_explicit'
40+
}
41+
42+
if (
43+
normalizedProviderId === 'openrouter' &&
44+
(normalizedModelId.startsWith('anthropic/') || isClaudeModel(normalizedModelId))
45+
) {
46+
return 'anthropic_explicit'
47+
}
48+
49+
return 'disabled'
50+
}

0 commit comments

Comments
 (0)