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  }