Files
锦麟 王 61ce809634 feat: 多平台 Coding Plan 统一管理系统初始实现
- 支持 MiniMax/OpenAI/Google Gemini/智谱/Kimi 五个平台
- 插件化 Provider 架构,自动发现注册
- 多维度 QuotaRule 额度追踪(固定间隔/自然周期/API同步/手动)
- OpenAI + Anthropic 兼容 API 代理,SSE 流式转发
- Model 路由表 + 额度耗尽自动 fallback
- 多媒体任务队列(图片/语音/视频)
- Vue3 + Tailwind 单文件 Web 仪表盘
- Docker 一键部署

Made-with: Cursor
2026-03-31 15:50:42 +08:00

47 lines
1.4 KiB
Python

"""Kimi / Moonshot 适配器 -- OpenAI 兼容格式"""
from __future__ import annotations
import json
from typing import Any, AsyncGenerator
import httpx
from app.providers.base import BaseProvider, Capability
class KimiProvider(BaseProvider):
name = "kimi"
display_name = "Kimi (Moonshot)"
capabilities = [Capability.CHAT]
async def chat(
self,
messages: list[dict],
model: str,
plan: dict,
stream: bool = True,
**kwargs,
) -> AsyncGenerator[str, None]:
"""Moonshot API 兼容 OpenAI 格式"""
url = f"{self._base_url(plan)}/chat/completions"
body: dict[str, Any] = {
"model": model,
"messages": messages,
"stream": stream,
**kwargs,
}
headers = self._build_headers(plan)
async with httpx.AsyncClient(timeout=120) as client:
if stream:
async with client.stream("POST", url, json=body, headers=headers) as resp:
resp.raise_for_status()
async for line in resp.aiter_lines():
if line.startswith("data: "):
yield line + "\n\n"
else:
resp = await client.post(url, json=body, headers=headers)
resp.raise_for_status()
yield json.dumps(resp.json())