@@ -217,3 +217,104 @@ func TestGetMessages_CacheControlWithSummary(t *testing.T) {
217217 // Verify checkpoint #2 is on date
218218 assert .Contains (t , messages [checkpointIndices [1 ]].Content , "Today's date" , "checkpoint #2 should be on date message" )
219219}
220+
221+ func TestUpdateLastAssistantMessageUsage (t * testing.T ) {
222+ testAgent := & agent.Agent {}
223+
224+ s := New ()
225+
226+ // Add user message
227+ s .AddMessage (NewAgentMessage (testAgent , & chat.Message {
228+ Role : chat .MessageRoleUser ,
229+ Content : "hello" ,
230+ }))
231+
232+ // Add assistant message without usage
233+ s .AddMessage (NewAgentMessage (testAgent , & chat.Message {
234+ Role : chat .MessageRoleAssistant ,
235+ Content : "response" ,
236+ }))
237+
238+ // Update the last assistant message with usage data
239+ usage := & chat.Usage {
240+ InputTokens : 100 ,
241+ OutputTokens : 50 ,
242+ CachedInputTokens : 10 ,
243+ }
244+ s .UpdateLastAssistantMessageUsage (usage , 0.005 , "gpt-4" )
245+
246+ // Verify the update
247+ messages := s .GetAllMessages ()
248+ assert .Len (t , messages , 2 )
249+
250+ lastMsg := messages [1 ]
251+ assert .Equal (t , chat .MessageRoleAssistant , lastMsg .Message .Role )
252+ assert .NotNil (t , lastMsg .Message .Usage )
253+ assert .Equal (t , int64 (100 ), lastMsg .Message .Usage .InputTokens )
254+ assert .Equal (t , int64 (50 ), lastMsg .Message .Usage .OutputTokens )
255+ assert .Equal (t , int64 (10 ), lastMsg .Message .Usage .CachedInputTokens )
256+ assert .InEpsilon (t , 0.005 , lastMsg .Message .Cost , 0.0001 )
257+ assert .Equal (t , "gpt-4" , lastMsg .Message .Model )
258+ }
259+
260+ func TestUpdateLastAssistantMessageUsage_NoAssistantMessage (t * testing.T ) {
261+ testAgent := & agent.Agent {}
262+
263+ s := New ()
264+
265+ // Add only user message
266+ s .AddMessage (NewAgentMessage (testAgent , & chat.Message {
267+ Role : chat .MessageRoleUser ,
268+ Content : "hello" ,
269+ }))
270+
271+ // Should not panic when no assistant message exists
272+ usage := & chat.Usage {InputTokens : 100 }
273+ s .UpdateLastAssistantMessageUsage (usage , 0.01 , "model" )
274+
275+ // Verify nothing changed
276+ messages := s .GetAllMessages ()
277+ assert .Len (t , messages , 1 )
278+ assert .Equal (t , chat .MessageRoleUser , messages [0 ].Message .Role )
279+ }
280+
281+ func TestUpdateLastAssistantMessageUsage_UpdatesOnlyLast (t * testing.T ) {
282+ testAgent := & agent.Agent {}
283+
284+ s := New ()
285+
286+ // Add multiple assistant messages
287+ s .AddMessage (NewAgentMessage (testAgent , & chat.Message {
288+ Role : chat .MessageRoleAssistant ,
289+ Content : "first response" ,
290+ Usage : & chat.Usage {InputTokens : 10 },
291+ }))
292+
293+ s .AddMessage (NewAgentMessage (testAgent , & chat.Message {
294+ Role : chat .MessageRoleUser ,
295+ Content : "follow up" ,
296+ }))
297+
298+ s .AddMessage (NewAgentMessage (testAgent , & chat.Message {
299+ Role : chat .MessageRoleAssistant ,
300+ Content : "second response" ,
301+ }))
302+
303+ // Update usage - should only affect the last assistant message
304+ usage := & chat.Usage {InputTokens : 200 }
305+ s .UpdateLastAssistantMessageUsage (usage , 0.02 , "new-model" )
306+
307+ // Verify only the last assistant message was updated
308+ messages := s .GetAllMessages ()
309+ assert .Len (t , messages , 3 )
310+
311+ // First assistant message should keep original usage
312+ assert .NotNil (t , messages [0 ].Message .Usage )
313+ assert .Equal (t , int64 (10 ), messages [0 ].Message .Usage .InputTokens )
314+
315+ // Last assistant message should have new usage
316+ assert .NotNil (t , messages [2 ].Message .Usage )
317+ assert .Equal (t , int64 (200 ), messages [2 ].Message .Usage .InputTokens )
318+ assert .InEpsilon (t , 0.02 , messages [2 ].Message .Cost , 0.0001 )
319+ assert .Equal (t , "new-model" , messages [2 ].Message .Model )
320+ }
0 commit comments