66 lines
4.4 KiB
Markdown
66 lines
4.4 KiB
Markdown
# pipeline-platform
|
||
|
||
产线平台内部 agent 模块(宿主不装则零接触)。
|
||
|
||
## 内容
|
||
|
||
- **能力包** `pipeline_platform/platform_ability.py`:pipeline_id=`platform_general`
|
||
- platform_llm_status — 模型治理状态(供应商/账号余额/模型定价)
|
||
- fetch_model_doc — 抓取模型 API 文档(SSRF 防护:仅公网域名)
|
||
- extract_llm_api_spec — LLM 通读文档提取配置规格(端点/协议/定价)
|
||
- apply_llm_config — 写入配置(幂等:供应商按名复用、模型按 (vendor, vendor_model_id) 只更新定价)
|
||
- platform_modules — 平台模块清单
|
||
- db_query — 只读数据库查询(2026-09-07):SELECT 白名单 + ${k}$ 强制参数化(禁裸 %,
|
||
aiomysql 会误当格式占位符)+ tables 参数直查列定义(sqlor 返回列名转小写,用 AS 别名)
|
||
+ 行数 200/字符 8000 显式截断 + SELECT 后 COMMIT 防 MDL 锁 + ns 剔除 'page' 键
|
||
(sqlor.sqlExe 见 page 键走分页路径返回变形)。根治 agent 拿 run_command 手搓连库
|
||
脚本撞沙箱四重摩擦(/tmp tmpfs 不持久、平台目录只读、输出双截断、框架 API 试错)
|
||
- **前端入口** `wwwroot/agent_platform/index.ui`:主菜单「平台内部助手」(仅管理员可见)
|
||
- **模型治理页弹窗入口**(2026-09-07):pipeline-llm `wwwroot/index.ui` 的模型注册卡片弹窗内
|
||
「🤖 自动配置」「✅ 上线检查」按钮分别弹出 `auto_config_popup.dspy` / `online_check_popup.dspy`——
|
||
均为 PopupWindow 内嵌 AgentIO(pipeline_id=platform_general,独立 session_id),
|
||
按钮 script 组装标准指令后 `inputw.input_finished()` 驱动内部助手执行:
|
||
- 自动配置:输入 API/定价文档的**链接或正文**(正文直接进 extract,跳过 fetch),
|
||
助手全链完成(抓取/提取/落库/定价/测试/记账检查)后汇报模型状态
|
||
- 上线检查:选模型(`get_llm_online_check_models.dspy`,value=模型名)→ 助手按
|
||
test_model_call → check_model_accounting(created 等 60~120s 复查)→ platform_llm_status
|
||
的测试过程处理,最后明确告知通过/不通过
|
||
- 对应 PLATFORM_PROMPT 新增「输入形态判定(第0步)」与「上线检查工作流」两节
|
||
- **技能**随 pipeline-core `skills_library/pipelines/platform_general/` 分发(平台架构地图 + 模型自动配置工作流)
|
||
|
||
## 权限
|
||
|
||
所有工具仅 `owner.superuser` / `owner.admin` 可用,**代码层硬门禁**(每个 handler 入口校验
|
||
RBAC 角色),不依赖 prompt。菜单入口同样 Jinja `{% if is_admin %}` 门控。
|
||
|
||
## 端点/路径职责约定(2026-09-12 端点可互换重构,配套 pipeline-llm 3ea03be)
|
||
|
||
- **端点 = 纯连接点**(主机根+region+timeout),不带 protocol 标签、不参与协议过滤,
|
||
对所有模型可互换;账号 endpoint_ids 空 = 选用全部端点。
|
||
- **请求形态完全由模型适配模板 profile.path 承载**:path 是从主机根起的完整相对路径
|
||
(含版本段,如 /compatible-mode/v1/chat/completions),运行时 url = 端点主机根 + path;
|
||
模型禁把端点写进 path。
|
||
- extract 提取提示词:base_url 只提主机根(禁路径段),chat_path 必须含版本段。
|
||
- apply 落库:端点经 normalize_endpoints 归一主机根 + 同(主机根,region)去重 + timeout 取 max;
|
||
path 经 _norm_relative_path 归一(全 URL 剥 scheme+host,保留版本段);
|
||
裸域拦截与协议补绑自检已删。
|
||
|
||
## 定价真实性规则
|
||
|
||
- 定价只允许来自文档原文,文档没写一律 null(禁止编造)
|
||
- 单位统一「元/千tokens」(元/百万 ÷1000)
|
||
- 非 openai_compat 协议的模板存档但运行时不可调,如实告知
|
||
|
||
## 模板生成规则(补充)
|
||
|
||
- **数值强转**(2026-09-06 真实调用实抓后加固):文档示例值为 int/float 的参数,
|
||
request_template 渲染表达式加 `|int`/`|float` 强转——表单/agent 传参常为字符串
|
||
数字(如 duration="5"),直接 tojson 出带引号字符串会被 API 拒
|
||
InvalidParameter。bool 是 int 子类,先行排除不加强转(保 UI 真值语义)。
|
||
强转改变模板内容 → 形态指纹漂移 → apply 自动弃旧建新,属预期行为。
|
||
|
||
## 宿主集成(已接入)
|
||
|
||
- `pipeline-app/build.sh`:clone/pip install/wwwroot 软链列表已含本模块
|
||
- `pipeline-app/app/pipeline_app.py`:`load_pipeline_platform()`(在 load_pipeline_service 之后)
|