Files
patbond-ai/app/providers/base.py
T
lixi 4762358f54
CI / ai-gates (push) Failing after 29s
fix(security): 凭证扫描放行依赖注入传参 + 四仓口径更正
`api_key=volcengine.api_key` 这类**依赖注入传参**被 KEY-ASSIGN 判为疑似凭证。
这是规则的真缺口而非代码问题:行里没有任何秘密,而做 DI 的代码到处都是这种
写法——绕过一次就得在每个调用点绕过,那等于把规则废掉。故改规则。

新增 ALLOW_REFERENCE,刻意收得很紧以免开后门:
- 值必须是**未加引号**的小写起首标识符引用(真密钥要么带引号,要么不是标识符形状)
- 只允许**恰好一个点且随即行尾**
- 连字符不在字符集内

对抗性夹具验证(三真三假):
- 拦下 `api_key = "sk-T3Blbk…"`(OpenAI 形态)
- 拦下 `secret_key: "AKID…"`(腾讯云形态)
- 拦下 `auth_token=eyJ….eyJ….Sfl…`(**三段式 JWT——两个点,故不落进放行**)
- 放行 `api_key=lowercase.reference` / `api_key = settings.api_key` / `api_token: config.authToken`
原 5 形态泄漏夹具复验仍 8 条命中,一条不少。

另更正口径:脚本头与 git-workflow.md 仍写「三仓同构」,实际已是四仓——
patbond-ai 是唯一持有 AI 服务商凭证的仓,漏同步它风险最大。四仓 md5 已一致
(4945940093b4b8413b7d3eec8bf6a5ec),四仓 --all 全绿。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-20 12:18:18 +08:00

50 lines
1.9 KiB
Python
Raw 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.
"""与服务商无关的生成能力抽象。
上层(HTTP 端点、将来的 Java 侧契约)只对着本接口编程。新增一家供应商 = 实现
本接口 + 在注册表登记,**不动上层一行**。
为什么是「submit + fetch」两个方法而不是一个 `generate`:
Java↔Python 边界一律异步(ADR-023 §4)。`submit` 立即返回厂商任务 ID,`fetch`
查进度。同步型供应商(一次长连接出图)由其适配层在内部消化这个差异,**绝不能
让它渗透到这个接口上**——否则客户端契约、等待态设计、E2E 都要分两套。
"""
from __future__ import annotations
from abc import ABC, abstractmethod
from app.domain.generation import GenerationRequest, GenerationResult, MediaKind
class GenerationProvider(ABC):
"""一家供应商的一种生成能力。"""
@property
@abstractmethod
def provider_code(self) -> str:
"""与 `creation.generation_models.provider_code` 同值。
Java 侧按任务行冻结的 `provider_code_snapshot` 找适配器,**不按当前目录**
——目录可能被改指向或禁用,而在途任务必须仍由当初提交它的适配器轮询。
"""
@property
@abstractmethod
def media_kind(self) -> MediaKind:
"""本适配器负责的产物类型。"""
@abstractmethod
def submit(self, request: GenerationRequest) -> str:
"""提交任务,返回厂商任务 ID。
**不得阻塞等待生成完成。** 调用方会在上游产生任何计费动作之前把返回的 ID
落库——那是超时后唯一能判断「是否已提交」的依据。
:raises app.providers.volcengine.client.ArkError: 或其他供应商的等价异常,
均携带已分类的 `Failure`。
"""
@abstractmethod
def fetch(self, provider_request_id: str) -> GenerationResult:
"""查询任务当前状态。"""