feat: 实现日历提醒完整功能(操作执行、通知服务重构、归档)
- 新增 ReminderActionExecutor 处理取消/稍后提醒操作 - 新增 ReminderOutboxStore 本地存储待处理操作 - 重构 LocalNotificationService 支持聚合提醒和交互操作 - 新增 event_color_resolver 工具类统一颜色解析 - 新增 CalendarService.archiveEvent 归档方法 - 增强 ModelTracking 支持缓存命中、推理token和成本追踪 - 添加 qwen3.5-35b-a3b 模型配置 - 更新 AndroidManifest 全屏intent权限 - 补充相关单元测试和文档
This commit is contained in:
@@ -44,10 +44,75 @@ def test_build_usage_metadata_calculates_cost_from_usage_summary() -> None:
|
||||
},
|
||||
)
|
||||
|
||||
assert metadata == {
|
||||
"model": "dashscope/qwen3.5-flash",
|
||||
"inputTokens": 2000,
|
||||
"outputTokens": 100,
|
||||
"cost": pytest.approx(0.00051),
|
||||
"latencyMs": 321,
|
||||
}
|
||||
assert metadata["model"] == "dashscope/qwen3.5-flash"
|
||||
assert metadata["inputTokens"] == 2000
|
||||
assert metadata["outputTokens"] == 100
|
||||
assert metadata["totalTokens"] == 2100
|
||||
assert metadata["cachedPromptTokens"] == 500
|
||||
assert metadata["promptCacheHitTokens"] == 500
|
||||
assert metadata["promptCacheMissTokens"] == 1500
|
||||
assert metadata["reasoningTokens"] == 0
|
||||
assert metadata["cost"] == pytest.approx(0.00051)
|
||||
assert metadata["costSource"] == "catalog_fallback"
|
||||
assert metadata["usageComplete"] is True
|
||||
assert metadata["latencyMs"] == 321
|
||||
|
||||
|
||||
def test_build_usage_metadata_prefers_provider_direct_cost() -> None:
|
||||
service = LiteLLMService()
|
||||
|
||||
metadata = service.build_usage_metadata(
|
||||
model="deepseek-chat",
|
||||
usage_summary={
|
||||
"input_tokens": 1000,
|
||||
"output_tokens": 100,
|
||||
"latency_ms": 100,
|
||||
"cached_prompt_tokens": 0,
|
||||
"direct_cost": 0.1234,
|
||||
"direct_cost_observed": 1,
|
||||
"direct_cost_complete": 1,
|
||||
},
|
||||
)
|
||||
|
||||
assert metadata["cost"] == pytest.approx(0.1234)
|
||||
assert metadata["costSource"] == "provider"
|
||||
assert metadata["usageComplete"] is True
|
||||
|
||||
|
||||
def test_build_usage_metadata_falls_back_when_provider_cost_incomplete() -> None:
|
||||
service = LiteLLMService()
|
||||
|
||||
metadata = service.build_usage_metadata(
|
||||
model="deepseek-chat",
|
||||
usage_summary={
|
||||
"input_tokens": 1000,
|
||||
"output_tokens": 100,
|
||||
"latency_ms": 100,
|
||||
"cached_prompt_tokens": 0,
|
||||
"direct_cost": 0.1234,
|
||||
"direct_cost_observed": 1,
|
||||
"direct_cost_complete": 0,
|
||||
},
|
||||
)
|
||||
|
||||
assert metadata["cost"] == pytest.approx(0.0023)
|
||||
assert metadata["costSource"] == "catalog_fallback_incomplete_provider_cost"
|
||||
|
||||
|
||||
def test_build_usage_metadata_marks_incomplete_usage_fallback() -> None:
|
||||
service = LiteLLMService()
|
||||
|
||||
metadata = service.build_usage_metadata(
|
||||
model="deepseek-chat",
|
||||
usage_summary={
|
||||
"input_tokens": 0,
|
||||
"output_tokens": 0,
|
||||
"latency_ms": 0,
|
||||
"cached_prompt_tokens": 0,
|
||||
"model_call_records": 1,
|
||||
"usage_records": 0,
|
||||
},
|
||||
)
|
||||
|
||||
assert metadata["costSource"] == "incomplete_usage_fallback"
|
||||
assert metadata["usageComplete"] is False
|
||||
|
||||
Reference in New Issue
Block a user