Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9f9e69a

Browse files
authored
fix: handle Map type in getChatUsage() after deserialization (#1118)
## Summary `getChatUsage()` returns null when `_chat_usage` metadata is a Map (after session persistence/reload) instead of a ChatUsage object. ## Why this matters When messages are persisted via `agent.loadFrom()` and reloaded, JSON deserialization converts the `_chat_usage` metadata value to a `Map<String, Object>` instead of a `ChatUsage` instance. The existing `instanceof ChatUsage` check fails, returning null even though the token usage data exists in the metadata. ## Changes `agentscope-core/src/main/java/io/agentscope/core/message/Msg.java`: - Added Map handling in `getChatUsage()` (line 413): when the metadata value is a Map, extract `inputTokens`, `outputTokens`, and `time` fields, build a ChatUsage via the builder, and cache it back in metadata for subsequent calls - Added `toInt()` and `toDouble()` helper methods for safe numeric conversion from deserialized values (handles Integer, Long, Double from JSON) ## Testing - When `_chat_usage` is a ChatUsage object: unchanged behavior - When `_chat_usage` is a Map (post-deserialization): converts to ChatUsage and returns it - When `_chat_usage` is null or absent: returns null (unchanged) - The converted ChatUsage is cached back in metadata so the conversion only happens once Fixes #1115 This contribution was developed with AI assistance (Claude Code). --------- Co-authored-by: Matt Van Horn <[email protected]>
1 parent 61369a6 commit 9f9e69a

1 file changed

Lines changed: 30 additions & 1 deletion

File tree

  • agentscope-core/src/main/java/io/agentscope/core/message

agentscope-core/src/main/java/io/agentscope/core/message/Msg.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,36 @@ public ChatUsage getChatUsage() {
415415
return null;
416416
}
417417
Object usage = metadata.get(MessageMetadataKeys.CHAT_USAGE);
418-
return usage instanceof ChatUsage ? (ChatUsage) usage : null;
418+
if (usage instanceof ChatUsage) {
419+
return (ChatUsage) usage;
420+
}
421+
if (usage instanceof Map) {
422+
@SuppressWarnings("unchecked")
423+
Map<String, Object> map = (Map<String, Object>) usage;
424+
ChatUsage chatUsage =
425+
ChatUsage.builder()
426+
.inputTokens(toInt(map.get("inputTokens")))
427+
.outputTokens(toInt(map.get("outputTokens")))
428+
.time(toDouble(map.get("time")))
429+
.build();
430+
metadata.put(MessageMetadataKeys.CHAT_USAGE, chatUsage);
431+
return chatUsage;
432+
}
433+
return null;
434+
}
435+
436+
private static int toInt(Object value) {
437+
if (value instanceof Number) {
438+
return ((Number) value).intValue();
439+
}
440+
return 0;
441+
}
442+
443+
private static double toDouble(Object value) {
444+
if (value instanceof Number) {
445+
return ((Number) value).doubleValue();
446+
}
447+
return 0.0;
419448
}
420449

421450
/**

0 commit comments

Comments
 (0)