core/agent: always emit UsageEvent with api or estimate

Every model round yields usage; prefer provider usage, else estimate
from request messages and assistant content.
This commit is contained in:
2026-07-15 10:52:48 +08:00
parent 0a3127454d
commit 6bdf7ea283
4 changed files with 29 additions and 11 deletions
+11
View File
@@ -201,6 +201,17 @@ async def test_non_stream_emits_usage() -> None:
assert usages[0].usage.prompt_tokens == 9
assert usages[0].usage.completion_tokens == 2
assert usages[0].usage.total_tokens == 11
assert usages[0].usage.source == "api"
async def test_non_stream_estimates_usage_when_missing() -> None:
client = ScriptedClient([_response(AssistantChatMessage(content="hello"))])
messages: list[AnyChatMessage] = [UserChatMessage(content="hi")]
events = [e async for e in run_chat_loop(client, messages, model="m", stream=False)]
usages = [e for e in events if isinstance(e, UsageEvent)]
assert len(usages) == 1
assert usages[0].usage.source == "estimate"
assert usages[0].usage.total_tokens > 0
async def test_chat_agent_accumulates_session_usage() -> None: