(t *testing.T)
| 597 | } |
| 598 | |
| 599 | func TestSessionFromEventsWithPerMessageUsage(t *testing.T) { |
| 600 | t.Parallel() |
| 601 | |
| 602 | events := []map[string]any{ |
| 603 | {"type": "agent_choice", "content": "Hello!", "agent_name": "root"}, |
| 604 | { |
| 605 | "type": "token_usage", |
| 606 | "usage": map[string]any{ |
| 607 | "input_tokens": float64(100), |
| 608 | "output_tokens": float64(50), |
| 609 | "cost": 0.005, |
| 610 | "last_message": map[string]any{ |
| 611 | "input_tokens": float64(100), |
| 612 | "output_tokens": float64(50), |
| 613 | "cached_input_tokens": float64(25), |
| 614 | "Model": "gpt-4o", |
| 615 | "Cost": 0.005, |
| 616 | }, |
| 617 | }, |
| 618 | }, |
| 619 | {"type": "stream_stopped"}, |
| 620 | } |
| 621 | |
| 622 | sess := SessionFromEvents(events, "test", []string{"hi"}) |
| 623 | |
| 624 | // Check session-level usage |
| 625 | assert.Equal(t, int64(100), sess.InputTokens) |
| 626 | assert.Equal(t, int64(50), sess.OutputTokens) |
| 627 | assert.InDelta(t, 0.005, sess.Cost, 0.0001) |
| 628 | |
| 629 | // Find the assistant message |
| 630 | var assistantMsg *session.Message |
| 631 | for _, item := range sess.Messages { |
| 632 | if item.Message != nil && item.Message.Message.Role == chat.MessageRoleAssistant { |
| 633 | assistantMsg = item.Message |
| 634 | break |
| 635 | } |
| 636 | } |
| 637 | |
| 638 | require.NotNil(t, assistantMsg, "should have assistant message") |
| 639 | assert.Equal(t, "gpt-4o", assistantMsg.Message.Model) |
| 640 | assert.InDelta(t, 0.005, assistantMsg.Message.Cost, 0.0001) |
| 641 | require.NotNil(t, assistantMsg.Message.Usage) |
| 642 | assert.Equal(t, int64(100), assistantMsg.Message.Usage.InputTokens) |
| 643 | assert.Equal(t, int64(50), assistantMsg.Message.Usage.OutputTokens) |
| 644 | assert.Equal(t, int64(25), assistantMsg.Message.Usage.CachedInputTokens) |
| 645 | } |
| 646 | |
| 647 | func TestSessionFromEventsWithError(t *testing.T) { |
| 648 | t.Parallel() |
nothing calls this directly
no test coverage detected