Files
social-app/backend/tests/unit/services/test_llm_pricing_service.py
T
qzl 18b5e876ee test: 修复所有预存的失败测试
- test_auth_routes: monkeypatch 环境为 production 使 phone-session 限速生效
- test_schedule_items_routes: 补充必填 timezone 字段
- test_llm_pricing_service: 更新 deepseek-chat 费率期望值匹配实际 catalog
- test_sse_flow_live: 补充 runId 查询参数、改用附件上传 API、修复 history 响应断言、独立 DB session 避免跨事件循环崩溃
- test_agent_prompt: 移除已删除的 project_cli_defaults 断言
- test_toolkit: 更新 action card 断言匹配 module/method 格式
2026-04-24 14:11:11 +08:00

119 lines
3.4 KiB
Python

from __future__ import annotations
import pytest
from services.llm_pricing.service import LlmPricingService
def test_calculate_cost_uses_first_qwen_tier() -> None:
service = LlmPricingService()
cost = service.calculate_cost(
model="qwen3.5-flash",
prompt_tokens=100_000,
completion_tokens=1_000,
cached_prompt_tokens=10_000,
)
assert cost == pytest.approx(0.0202)
def test_calculate_cost_uses_second_qwen_tier() -> None:
service = LlmPricingService()
cost = service.calculate_cost(
model="qwen3.5-flash",
prompt_tokens=200_000,
completion_tokens=5_000,
cached_prompt_tokens=20_000,
)
assert cost == pytest.approx(0.1856)
def test_build_usage_metadata_calculates_cost_from_usage_summary() -> None:
service = LlmPricingService()
metadata = service.build_usage_metadata(
model="qwen3.5-flash",
usage_summary={
"input_tokens": 2000,
"output_tokens": 100,
"latency_ms": 321,
"cached_prompt_tokens": 500,
},
)
assert metadata["model"] == "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 = LlmPricingService()
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 = LlmPricingService()
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.0012)
assert metadata["costSource"] == "catalog_fallback_incomplete_provider_cost"
def test_build_usage_metadata_marks_incomplete_usage_fallback() -> None:
service = LlmPricingService()
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