返回 DeepSeek-Reasonix
session_context_cache.go
根目录 / internal / provider / anthropic / session_context_cache.go
1 package anthropic
2
3 import (
4 "slices"
5
6 "reasonix/internal/sessioncontext"
7 )
8
9 func sessionContextTextBlocks(content string) []contentBlock {
10 parts := sessioncontext.SplitBlocks(content)
11 blocks := make([]contentBlock, 0, len(parts))
12 for _, part := range parts {
13 blocks = append(blocks, contentBlock{Type: "text", Text: part.Text})
14 }
15 return blocks
16 }
17
18 // markPromptCacheBreakpoints marks stable system/tools, the latest valid
19 // session context, and the request tail. Native Anthropic permits four cache
20 // breakpoints; Reasonix uses at most three and keeps the default five-minute TTL.
21 func markPromptCacheBreakpoints(system []textBlock, tools []anthTool, messages []anthMessage) {
22 if n := len(system); n > 0 {
23 system[n-1].CacheControl = ephemeral()
24 } else if n := len(tools); n > 0 {
25 tools[n-1].CacheControl = ephemeral()
26 }
27
28 contextMessage, contextBlock := -1, -1
29 for i := len(messages) - 1; i >= 0 && contextMessage < 0; i-- {
30 for j := range slices.Backward(messages[i].Content) {
31 block := messages[i].Content[j]
32 if block.Type == "text" && sessioncontext.IsContent(block.Text) {
33 contextMessage, contextBlock = i, j
34 break
35 }
36 }
37 }
38 if contextMessage >= 0 {
39 messages[contextMessage].Content[contextBlock].CacheControl = ephemeral()
40 }
41 if n := len(messages); n > 0 {
42 if k := len(messages[n-1].Content); k > 0 {
43 messages[n-1].Content[k-1].CacheControl = ephemeral()
44 }
45 }
46 }
47
47 lines GO