github.com/anthropics/anthropic-sdk-go@v1.70.1/betasessionutil.go (about) 1 package anthropic 2 3 import "strings" 4 5 // BetaManagedAgentsEventAccumulator folds event_start / event_delta preview 6 // events into per-event-id agent.message snapshots. The zero value is ready 7 // to use. 8 // 9 // var previews anthropic.BetaManagedAgentsEventAccumulator 10 // for stream.Next() { 11 // event := stream.Current() 12 // previews.Accumulate(event) 13 // 14 // if event.Type == "event_delta" { 15 // fmt.Print(previews.AgentMessageText(event.EventID)) 16 // } 17 // } 18 type BetaManagedAgentsEventAccumulator struct { 19 // AgentMessages holds one snapshot per event id. Reconciled canonical 20 // agent.message events persist across model requests; unreconciled previews 21 // are dropped at span.model_request_end because the server will never 22 // complete them. The buffered event stream is the authoritative transcript. 23 AgentMessages map[string]BetaManagedAgentsAgentMessageEvent 24 } 25 26 func (acc *BetaManagedAgentsEventAccumulator) Accumulate(event BetaManagedAgentsStreamSessionEventsUnion) { 27 if acc == nil { 28 return 29 } 30 if acc.AgentMessages == nil { 31 acc.AgentMessages = map[string]BetaManagedAgentsAgentMessageEvent{} 32 } 33 34 switch event.Type { 35 case "event_start": 36 start := event.AsEventStart() 37 if start.Event.Type == "agent.message" { 38 preview := start.Event.AsAgentMessage() 39 acc.AgentMessages[preview.ID] = BetaManagedAgentsAgentMessageEvent{ 40 ID: preview.ID, 41 Type: BetaManagedAgentsAgentMessageEventTypeAgentMessage, 42 } 43 } 44 45 case "event_delta": 46 delta := event.AsEventDelta() 47 msg, ok := acc.AgentMessages[delta.EventID] 48 if !ok || msg.JSON.ProcessedAt.Valid() { 49 return 50 } 51 idx := int(delta.Delta.Index) 52 if idx < 0 || idx > len(msg.Content) { 53 return 54 } 55 if idx == len(msg.Content) { 56 var block BetaManagedAgentsAgentMessageEventContentUnion 57 _ = block.UnmarshalJSON([]byte(delta.Delta.Content.RawJSON())) 58 msg.Content = append(msg.Content, block) 59 } else { 60 msg.Content[idx].Text += delta.Delta.Content.Text 61 } 62 acc.AgentMessages[delta.EventID] = msg 63 64 case "agent.message": 65 msg := event.AsAgentMessage() 66 acc.AgentMessages[msg.ID] = msg 67 68 case "span.model_request_end": 69 for id, msg := range acc.AgentMessages { 70 if !msg.JSON.ProcessedAt.Valid() { 71 delete(acc.AgentMessages, id) 72 } 73 } 74 } 75 } 76 77 func (acc *BetaManagedAgentsEventAccumulator) AgentMessageText(eventID string) string { 78 if acc == nil { 79 return "" 80 } 81 var b strings.Builder 82 for _, block := range acc.AgentMessages[eventID].Content { 83 b.WriteString(block.Text) 84 } 85 return b.String() 86 }