feat: resolve account platforms prioritizing structural snapshot values and correction on existing accounts

This commit is contained in:
SmartUp Developer
2026-07-02 22:58:15 +08:00
parent 1cb13e878e
commit fd2755d539
4 changed files with 359 additions and 13 deletions
+154
View File
@@ -410,3 +410,157 @@ def test_import_upstream_key_with_custom_concurrency_and_priority(monkeypatch, d
assert body["concurrency"] == 20
assert body["priority"] == 5
assert body["credentials"]["base_url"] == "http://packy.local"
def test_import_platform_from_snapshot(monkeypatch, db_session):
"""验证快照 platform=anthropic 且名称不含 Claude 时,创建账号平台必须为 anthropic"""
from app.models.snapshot import UpstreamRateSnapshot
website, generated = seed_account_import_rows(db_session)
generated.key_name = "MyCustomKey" # 不含 Claude
# 写入快照指定平台为 anthropic
snapshot = UpstreamRateSnapshot(
upstream_id=generated.upstream_id,
snapshot_json=json.dumps({
"groups": {
"vip": {
"group_name": "VIP",
"rate": 0.1,
"platform": "anthropic"
}
}
})
)
db_session.add(snapshot)
db_session.commit()
account_bodies = []
class FakeWebsiteClient:
def __init__(self, **kwargs):
pass
def __enter__(self): return self
def __exit__(self, *args): return False
def create_account(self, body, endpoint="/accounts"):
account_bodies.append(body)
return {"id": 101, "name": body["name"]}
def account_exists(self, account_id): return True
@staticmethod
def extract_id(data): return "101"
monkeypatch.setattr(websites_router, "Sub2ApiWebsiteClient", FakeWebsiteClient)
websites_router.import_upstream_keys_as_accounts(
website.id,
ImportAccountsRequest(
upstream_key_ids=[generated.id],
target_group_map={"vip": "7"},
default_platform="openai",
platform_mode="auto",
),
db_session,
object(),
)
assert len(account_bodies) == 1
assert account_bodies[0]["platform"] == "anthropic"
def test_import_platform_fallback_to_name(monkeypatch, db_session):
"""验证快照无 platform 但名称含 Claude 时,仍兜底为 anthropic"""
from app.models.snapshot import UpstreamRateSnapshot
website, generated = seed_account_import_rows(db_session)
generated.key_name = "Claude-Key"
# 写入快照但不含 platform 字段
snapshot = UpstreamRateSnapshot(
upstream_id=generated.upstream_id,
snapshot_json=json.dumps({
"groups": {
"vip": {
"group_name": "VIP",
"rate": 0.1,
}
}
})
)
db_session.add(snapshot)
db_session.commit()
account_bodies = []
class FakeWebsiteClient:
def __init__(self, **kwargs):
pass
def __enter__(self): return self
def __exit__(self, *args): return False
def create_account(self, body, endpoint="/accounts"):
account_bodies.append(body)
return {"id": 101, "name": body["name"]}
def account_exists(self, account_id): return True
@staticmethod
def extract_id(data): return "101"
monkeypatch.setattr(websites_router, "Sub2ApiWebsiteClient", FakeWebsiteClient)
websites_router.import_upstream_keys_as_accounts(
website.id,
ImportAccountsRequest(
upstream_key_ids=[generated.id],
target_group_map={"vip": "7"},
default_platform="openai",
platform_mode="auto",
),
db_session,
object(),
)
assert len(account_bodies) == 1
assert account_bodies[0]["platform"] == "anthropic"
def test_import_platform_manual_override(monkeypatch, db_session):
"""手动模式下不使用快照平台,仍按用户指定平台"""
from app.models.snapshot import UpstreamRateSnapshot
website, generated = seed_account_import_rows(db_session)
# 快照虽然指定为 anthropic
snapshot = UpstreamRateSnapshot(
upstream_id=generated.upstream_id,
snapshot_json=json.dumps({
"groups": {
"vip": {
"group_name": "VIP",
"rate": 0.1,
"platform": "anthropic"
}
}
})
)
db_session.add(snapshot)
db_session.commit()
account_bodies = []
class FakeWebsiteClient:
def __init__(self, **kwargs):
pass
def __enter__(self): return self
def __exit__(self, *args): return False
def create_account(self, body, endpoint="/accounts"):
account_bodies.append(body)
return {"id": 101, "name": body["name"]}
def account_exists(self, account_id): return True
@staticmethod
def extract_id(data): return "101"
monkeypatch.setattr(websites_router, "Sub2ApiWebsiteClient", FakeWebsiteClient)
websites_router.import_upstream_keys_as_accounts(
website.id,
ImportAccountsRequest(
upstream_key_ids=[generated.id],
target_group_map={"vip": "7"},
default_platform="gemini",
platform_mode="manual", # 手动模式
),
db_session,
object(),
)
assert len(account_bodies) == 1
assert account_bodies[0]["platform"] == "gemini"