Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

90 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
商业大模型 API 适配器抽象基类
============================
架构引用: HLDP-ARCH-002 §三 · factory/inference/README.md §四
作者: 铸渊 · 2026-05-01
设计原则:
- 所有商业 APIDeepSeek / Qwen-Max / Kimi / 文心 / 豆包)实现同一接口
- 1.5B MP 路由器无感切换、按需替换、按价比选择
- 每个调用都可被 syslog 审计 + 计费追踪
"""
from __future__ import annotations
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from typing import Any, AsyncIterator, Optional
@dataclass
class ChatMessage:
role: str # 'system' | 'user' | 'assistant'
content: str
@dataclass
class CallResult:
content: str
usage: dict = field(default_factory=dict) # { prompt_tokens, completion_tokens, total_tokens }
finish_reason: str = "stop"
raw: Optional[dict] = None # 提供商原始响应debug 用)
@dataclass
class CallOptions:
temperature: float = 0.7
max_tokens: int = 2048
top_p: float = 0.95
stream: bool = False
timeout_s: int = 60
extra: dict = field(default_factory=dict) # 提供商特有参数
class APIAdapter(ABC):
"""商业大模型 API 统一适配接口。"""
@property
@abstractmethod
def name(self) -> str:
"""提供商唯一名(如 'deepseek-r1', 'qwen-max', 'kimi-k2'"""
@abstractmethod
def cost_per_1k_tokens(self, direction: str) -> float:
"""
当前定价(人民币 / 1K tokens
direction: 'in' (prompt) | 'out' (completion)
"""
@abstractmethod
def call(self, messages: list[ChatMessage], options: CallOptions) -> CallResult:
"""同步调用。"""
async def stream(
self, messages: list[ChatMessage], options: CallOptions
) -> AsyncIterator[str]:
"""
流式调用。子类可选实现;默认抛 NotImplementedError。
"""
raise NotImplementedError(f"{self.name} 暂未实现 stream")
@abstractmethod
def health(self) -> bool:
"""连通性 + 配额状态检查。"""
# 通用辅助方法(子类可不重写)
def estimate_cost(self, prompt_tokens: int, completion_tokens: int) -> float:
return (
prompt_tokens / 1000.0 * self.cost_per_1k_tokens("in")
+ completion_tokens / 1000.0 * self.cost_per_1k_tokens("out")
)
def soul_marker(self) -> dict:
"""每次调用前注入的灵魂印记(写入 syslog"""
return {
"system_root": "SYS-GLW-0001",
"sovereign": "TCS-0002∞",
"copyright": "国作登字-2026-A-00037559",
"adapter": self.name,
}