返回 DeepSeek-Reasonix
thinking_stream.go
根目录 / internal / provider / anthropic / thinking_stream.go
1 package anthropic
2
3 import "reasonix/internal/provider"
4
5 func updateThinkingStream(blocks map[int]*provider.ThinkingBlock, ev streamEvent, send func(provider.Chunk) bool) bool {
6 chunk := provider.Chunk{Type: provider.ChunkReasoning}
7 switch ev.Type {
8 case "content_block_start":
9 b := ev.ContentBlock
10 if b == nil || b.Type != "thinking" && b.Type != "redacted_thinking" {
11 return true
12 }
13 blocks[ev.Index] = &provider.ThinkingBlock{Type: b.Type, Thinking: b.Thinking, Signature: b.Signature, Data: b.Data}
14 chunk.Text, chunk.Signature, chunk.ReasoningState = b.Thinking, b.Signature, provider.ReasoningIncomplete
15 case "content_block_delta":
16 if ev.Delta == nil {
17 return true
18 }
19 b := blocks[ev.Index]
20 switch ev.Delta.Type {
21 case "thinking_delta":
22 if b != nil {
23 b.Thinking += ev.Delta.Thinking
24 }
25 chunk.Text = ev.Delta.Thinking
26 case "signature_delta":
27 if b != nil {
28 b.Signature += ev.Delta.Signature
29 }
30 chunk.Signature = thinkingSignature(b, ev.Delta.Signature)
31 default:
32 return true
33 }
34 case "content_block_stop":
35 b := blocks[ev.Index]
36 if b == nil {
37 return true
38 }
39 chunk.ThinkingBlock, chunk.ReasoningState = b, provider.ReasoningComplete
40 delete(blocks, ev.Index)
41 default:
42 return true
43 }
44 return send(chunk)
45 }
46
46 lines GO