后端: - 新增 celery_health 生成前置闸——无 worker 在线时图片/视频生成入口 一律 503,防"提交到 ARK 后无人轮询、结果悬空+额度冻结"的数据丢失 - 拼接导出:帧率跟随源众数、字幕逐句重映射、原声/BGM 混音修复 - 资金核算审计脚本 + genesis 账目回填 + 滞留预留清理命令 - 接入 yunqi provider 与豆包 TTS 模型(catalog/migrations/bootstrap 命令) 前端:全站页面更新(pipeline/library/products/projects/team/account 等), 新增共享 pager 分页组件 QA:刷新 function-audit 全量输出,新增 full-qa 报告 文档:BP 产品介绍资料、design/CLAUDE.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
from typing import Any
|
|
|
|
import requests
|
|
from django.conf import settings
|
|
|
|
from .volcano import VolcanoArkProvider
|
|
|
|
|
|
class YunqiProvider(VolcanoArkProvider):
|
|
"""YunQi AI(New API 网关)适配器:OpenAI 兼容 images/generations。
|
|
|
|
与火山 ARK 的差异:不接受 watermark/sequential_image_generation/response_format 私有参数;
|
|
size 用 OpenAI 枚举(1024x1024/1024x1536/1536x1024);gpt-image-2 固定返回 b64_json,
|
|
下游 extract_first_media_url / media_to_bytes 已兼容 base64,无需改动。
|
|
"""
|
|
|
|
def __post_init__(self) -> None:
|
|
self.api_key = self.api_key or settings.YUNQI.get("api_key")
|
|
self.base_url = self.base_url or settings.YUNQI.get("base_url")
|
|
|
|
def image_generation(
|
|
self,
|
|
*,
|
|
model: str,
|
|
prompt: str,
|
|
endpoint: str = "images/generations",
|
|
image: str | list[str] | None = None,
|
|
size: str = "1024x1536",
|
|
) -> dict[str, Any]:
|
|
if not self.api_key:
|
|
raise ValueError("YUNQI_API_KEY is not configured")
|
|
if image:
|
|
raise ValueError("gpt-image-2 via YunQi only supports text-to-image; reference image is not supported")
|
|
body: dict[str, Any] = {"model": model, "prompt": prompt, "size": size, "n": 1}
|
|
# 实测该网关生图平均延迟 75s+,超时须显著高于火山的 180s
|
|
response = requests.post(
|
|
f"{self.base_url.rstrip('/')}/{endpoint.lstrip('/')}",
|
|
headers={"Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json"},
|
|
json=body,
|
|
timeout=300,
|
|
)
|
|
response.raise_for_status()
|
|
return response.json()
|