mirror of
https://github.com/fawney19/Aether.git
synced 2026-09-02 01:10:23 +08:00
feat: 添加视频生成功能增强和多维度计费系统适配
- 视频生成: 增强 video_handler,重构 task_poller,新增 telemetry - 计费系统: 适配新的 signature 格式,支持 video 任务类型回退 - 数据库迁移: 添加 api_family/endpoint_kind 字段和 video_formats
This commit is contained in:
@@ -1,7 +1,10 @@
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from src.models.database import DimensionCollector
|
||||
from src.services.billing.dimension_collector_service import (
|
||||
DimensionCollectInput,
|
||||
DimensionCollectorRuntime,
|
||||
DimensionCollectorService,
|
||||
)
|
||||
|
||||
|
||||
@@ -10,7 +13,7 @@ class TestDimensionCollectorRuntime:
|
||||
runtime = DimensionCollectorRuntime()
|
||||
collectors = [
|
||||
DimensionCollector(
|
||||
api_format="OPENAI",
|
||||
api_format="openai:chat",
|
||||
task_type="chat",
|
||||
dimension_name="input_tokens",
|
||||
source_type="response",
|
||||
@@ -20,7 +23,7 @@ class TestDimensionCollectorRuntime:
|
||||
is_enabled=True,
|
||||
),
|
||||
DimensionCollector(
|
||||
api_format="OPENAI",
|
||||
api_format="openai:chat",
|
||||
task_type="chat",
|
||||
dimension_name="input_tokens",
|
||||
source_type="response",
|
||||
@@ -42,7 +45,7 @@ class TestDimensionCollectorRuntime:
|
||||
runtime = DimensionCollectorRuntime()
|
||||
collectors = [
|
||||
DimensionCollector(
|
||||
api_format="GEMINI",
|
||||
api_format="gemini:video",
|
||||
task_type="video",
|
||||
dimension_name="file_size_mb",
|
||||
source_type="metadata",
|
||||
@@ -63,7 +66,7 @@ class TestDimensionCollectorRuntime:
|
||||
runtime = DimensionCollectorRuntime()
|
||||
collectors = [
|
||||
DimensionCollector(
|
||||
api_format="CLAUDE",
|
||||
api_format="claude:chat",
|
||||
task_type="chat",
|
||||
dimension_name="input_tokens",
|
||||
source_type="request",
|
||||
@@ -73,7 +76,7 @@ class TestDimensionCollectorRuntime:
|
||||
is_enabled=True,
|
||||
),
|
||||
DimensionCollector(
|
||||
api_format="CLAUDE",
|
||||
api_format="claude:chat",
|
||||
task_type="chat",
|
||||
dimension_name="cache_read_tokens",
|
||||
source_type="request",
|
||||
@@ -83,7 +86,7 @@ class TestDimensionCollectorRuntime:
|
||||
is_enabled=True,
|
||||
),
|
||||
DimensionCollector(
|
||||
api_format="CLAUDE",
|
||||
api_format="claude:chat",
|
||||
task_type="chat",
|
||||
dimension_name="total_input_tokens",
|
||||
source_type="computed",
|
||||
@@ -103,3 +106,56 @@ class TestDimensionCollectorRuntime:
|
||||
assert dims["input_tokens"] == 100
|
||||
assert dims["cache_read_tokens"] == 20
|
||||
assert dims["total_input_tokens"] == 120
|
||||
|
||||
|
||||
class TestDimensionCollectorService:
|
||||
def test_video_fallback_merges_base_collectors(self) -> None:
|
||||
db = MagicMock()
|
||||
|
||||
video_collectors = [
|
||||
DimensionCollector(
|
||||
api_format="openai:video",
|
||||
task_type="video",
|
||||
dimension_name="duration_seconds",
|
||||
source_type="metadata",
|
||||
source_path="task.duration_seconds",
|
||||
value_type="int",
|
||||
priority=0,
|
||||
is_enabled=True,
|
||||
)
|
||||
]
|
||||
base_collectors = [
|
||||
# Should be kept (dimension not present in video_collectors)
|
||||
DimensionCollector(
|
||||
api_format="openai:chat",
|
||||
task_type="video",
|
||||
dimension_name="resolution",
|
||||
source_type="metadata",
|
||||
source_path="task.resolution",
|
||||
value_type="string",
|
||||
priority=0,
|
||||
is_enabled=True,
|
||||
),
|
||||
# Should be ignored (dimension already present in video_collectors)
|
||||
DimensionCollector(
|
||||
api_format="openai:chat",
|
||||
task_type="video",
|
||||
dimension_name="duration_seconds",
|
||||
source_type="metadata",
|
||||
source_path="task.duration_seconds",
|
||||
value_type="int",
|
||||
priority=0,
|
||||
is_enabled=True,
|
||||
),
|
||||
]
|
||||
|
||||
q1 = MagicMock()
|
||||
q1.filter.return_value.all.return_value = video_collectors
|
||||
q2 = MagicMock()
|
||||
q2.filter.return_value.all.return_value = base_collectors
|
||||
db.query.side_effect = [q1, q2]
|
||||
|
||||
svc = DimensionCollectorService(db)
|
||||
result = svc.list_enabled_collectors(api_format="openai:video", task_type="video")
|
||||
|
||||
assert [c.dimension_name for c in result] == ["duration_seconds", "resolution"]
|
||||
|
||||
Reference in New Issue
Block a user