Files
ai-video-fullstack/docs-developer/prompt-task-backends.mdx
T

141 lines
11 KiB
Plaintext
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.
---
title: 提示词助手的对话模型与任务后端
description: Speaker 与内置 Reasoner、外部 OpenCode 任务后端的配置和运行边界。
---
# 提示词助手的对话模型与任务后端
状态:第一版已实现。任务后端使用独立资源配置;内置 Reasoner 和外部 OpenCode 都有运行路径。真实模型和远端 OpenCode 仍需使用有效连接配置进行部署联调,模拟协议测试不代表完成过真实编码任务。操作步骤见[后台任务使用说明](/prompt-background-tasks)。
## 范围与职责
仅提示词 Pipeline。一个助手配置一个 Speaker,可选一个任务后端:内置 Reasoner 或外部 OpenCode。Workflow、Realtime 和启动 Action 不支持任务委派。切换为 Realtime 时,界面会先确认解除当前助手的任务后端绑定,后端资源仍保留。
Speaker 使用现有 ASR → 对话 LLM → TTS 链路,负责交流、澄清、委派与播报。任务后端使用独立上下文处理目标,执行期间 Speaker 继续响应用户。
```text
用户 ⇄ ASR / Speaker / TTS
│ 委派、查询、回答问题、取消
▼
TaskService + 应用级 Coordinator
│ Pipecat 原生 Jobs
┌───────┴────────┐
▼ ▼
内置 Reasoner OpenCode 后端
BackendLLMWorker HTTP / SSE 适配
独立 LLMContext 远端 session
│ │
平台 ToolExecutor 自己的工具、技能与环境
└───────┬────────┘
▼
任务事件、结果、待回答问题
▼
数据库存储 / 网页 / Speaker
```
管理员在「组件库 → 任务后端」创建资源,再在提示词助手中选择。普通工具资源只包含 HTTP、MCP、Client。Speaker 通过平台自动注册的 `delegate_task` 发起委派,无需填写函数名或绑定一项 OpenCode 工具。
## 资源与配置
`TaskBackendResource` 与模型、工具资源并列,类型为 `reasoner | opencode`。资源负责连接、模型、执行策略和技能;助手的 `taskBackend` 只包含 `backendId`、`instructions` 和 `instructionSource`。
| 配置 | 内置 Reasoner | OpenCode |
| --- | --- | --- |
| 基本信息 | 名称、说明、启用状态 | 名称、说明、启用状态 |
| 连接与模型 | 引用已启用的 LLM 模型资源,凭据在服务端解析 | 服务地址、用户名、服务密码、远端工作目录 |
| 推理配置 | 模型默认,或经能力声明的 low / medium / high | 可选远端 Agent;可成对指定 Provider ID / Model ID |
| 执行策略 | HTTP/MCP 工具白名单、任务时限;并发固定 1 | 任务时限;权限和沙箱由远端管理;并发固定 1 |
| 技能 | 内联技能名称与说明,加载到任务上下文 | 记录远端已部署技能的说明,平台不上传或安装技能 |
| 任务指令 | 可复用的后端指令,加上该助手的任务指令 | 相同 |
默认任务时限为 600 秒,可设置 30–7200 秒。资源配置保存时和助手绑定时都会校验模型、工具及变量引用。修改资源不会改变已创建任务的冻结配置。
Speaker 每次委派前会重新读取后端、模型、工具及 MCP Server 的有效状态和凭据;助手绑定、任务要求来源或变量声明发生变化时,需要重新连接。业务变量使用提交时的快照,指令中的系统时间沿用共享渲染器,在执行时刷新。
停用资源允许保留暂时失效的引用。若后端仍被助手绑定,新会话会因配置无效而拒绝启动;先解绑或重新启用即可。已有通话继续,但新委派会重新校验并拒绝使用停用资源。
### 内置 Reasoner
Reasoner 引用 `openai-llm` 或 `dashscope-llm` 的 LLM 模型资源。即使与 Speaker 选择同一资源,每个任务也会创建独立的模型服务、上下文和运行设置。
推理强度使用实际的 `reasoning_effort` 参数。选择 low / medium / high 前,管理员须确认模型支持该参数,并在模型资源中声明 `values.supportsReasoningEffort = true`。未声明时只能使用「模型默认」;服务端会拒绝非默认值。当前没有通用 thinking budget 配置,也不自动推测模型能力。
Reasoner 只能调用该后端显式绑定的 HTTP/MCP 服务端工具,继续复用现有 `ToolExecutor`。Client 工具依赖浏览器连接,不能作为后台工具。技能是工作方法,不能扩大工具许可。平台没有为 Reasoner 增加通用 Shell/文件环境;需要远端编码执行时选择 OpenCode。
### 外部 OpenCode
平台连接已有的 OpenCode 服务,不安装软件、不启动远端进程。地址必须由平台后端可访问;工作目录使用远端机器上的绝对路径。服务鉴权凭据、远端模型 API 凭据与执行权限分别管理。
- 服务地址、用户名与密码负责 HTTP Basic 鉴权。
- `agent` 留空使用远端默认 Agent。
- `modelProviderId` / `modelId` 同时填写或同时留空;留空使用远端默认模型。模型凭据在 OpenCode 端配置。
- 文件、Shell、沙箱、技能权限由远端 Agent、运行账号和部署环境执行。工作目录不等于沙箱。
- `skillsNote` 仅记录远端技能及配置来源;平台不保证自动同步远端 `SKILL.md`。
界面没有提供无法实际生效的权限或沙箱开关,也不会自动授予远端执行权限。需要确认权限时由用户在任务卡片处理。
## Pipecat 复用与任务生命周期
应用级 `WorkerRunner`、常驻 Coordinator 和串行任务 Worker 持有执行 Jobs;媒体 Pipeline 只订阅任务事件。断线或用户插话不会取消任务,明确取消时才进入停止流程。
内置 Reasoner 使用 Pipecat `BackendLLMWorker` 管理独立的上下文和模型/工具调用循环;业务适配器注册 `complete_task` 与 `ask_user`。必须明确完成或提出问题,普通文本、模型空闲或 attach 回执都不是任务成功证明。平台没有自行实现第二套推理循环,也未修改 Pipecat。
任务结束后通过公开接口清空上下文、工具与处理器引用。当前 Pipecat 运行器仍保留结束 Worker 的注册对象直到应用关闭;本版适用于 MVP,长期高任务量运行还需要验证该框架行为。
`LLMWithBackend` / `BackendConnector` 可供后续评估,但本版没有直接替换 Speaker 的 LLM 槽;保留应用级所有者才能维持语音断线后的执行。
Pipecat 负责 Job 派发、FIFO 串行、超时和取消。`TaskService` 负责业务任务 ID、后端选择、冻结配置、记录和事件投影。数据库记录不代替原生调度器。
- **并发与部署**:仅单应用进程、一个 Uvicorn worker;所有任务全局并发固定为 1。已有未结束的 OpenCode 句柄会阻止新任务提交到后端,需先核查或停止旧任务。该约束无法控制平台之外的 OpenCode 客户端。
- **截止时间**:新任务在创建时保存截止时间,覆盖排队和执行;OpenCode 重连观察或应用重启后使用剩余时间,不重新延长截止时间。迁移前没有截止时间的历史任务保留原有观察时限语义。
- **成功判定**:OpenCode 的 204 只表示接收,需要取得关联到本次 message ID 的完成消息。Reasoner 通过 `complete_task(status, result)` 报告成功或失败;仅完成部分目标时标为失败并说明限制。这是执行模型的结果报告,平台没有独立核验业务目标。
- **取消**:先取消原生执行 Job,再核查对应后端。OpenCode 需 abort 后确认状态,未确认时保留「停止待确认」。Reasoner 可停止本地执行;已发出的 HTTP/MCP 请求可能已有副作用,应核查业务系统结果。
- **恢复**:OpenCode 使用已存 session/message 句柄重新观察,不重发未知提交。Reasoner 在应用重启后标为中断失败,保留记录,不自动重放可能有副作用的工具。
- **输入与目标变更**:共同支持查询、取消、回答当前待处理问题。首版不支持任意运行中 steer;修改目标时先停止,再创建新任务。
- **通知**:网页保存和展示进度、问题及结果;Speaker 接收必要状态和结果,不默认播报内部推理或原始工具日志。离线结果保留在任务卡片,新语音连接不自动重播旧结果。
自动测试/Responses 的模拟工具执行路径不会提交或控制真实后台任务,不能用该路径证明真实任务后端已连通。
## 数据迁移与升级
迁移 `20261023_0027` 把旧 task 工具迁为 OpenCode 后端资源,迁移助手绑定,并保留固定值、变量或模板形式的 `instructionSource`。旧工具记录和普通工具绑定会移除。历史任务保留任务 ID、结果、冻结连接和远端句柄,并补充后端来源。
迁移不可安全 downgrade。升级前备份数据库;回退需要恢复迁移前备份与匹配的旧代码,不要只回退应用版本。若旧数据包含多个 task 绑定或非提示词 Pipeline 绑定,迁移会明确失败,需先修正这些配置。
本机运行时更新依赖后执行:
```bash
cd backend
.venv/bin/python -m alembic upgrade head
.venv/bin/python -m db.sync_interface_definitions
```
也可在仓库根目录运行 `make db-init`,它会迁移并同步模型接口定义。不要用演示数据 seed 代替正常升级。
迁移后的原 instruction 预设显示在助手「任务要求来源」中;未修改时保存仍保留该来源。默认「Speaker 生成任务要求」适用于新的对话委派。
## 代码位置
| 模块 | 职责 |
| --- | --- |
| `task_backend_schemas.py` / `db.models` | 后端资源、助手绑定和任务来源 |
| `routes/task_backends.py` / `services/task_backend_resources.py` | 管理、校验、服务端凭据解析 |
| `services/background_tasks/service.py` / `native.py` | 业务任务投影与应用级原生 Jobs |
| `services/background_tasks/reasoner.py` | `BackendLLMWorker`、完成/提问控制与工具桥 |
| `services/background_tasks/opencode.py` | HTTP/SSE、结果关联、abort、重新观察 |
| `services/brains/prompt_tasks.py` | Speaker 委派入口、查询/输入/取消与通知 |
| `routes/background_tasks.py` | 从助手已绑定的后端解析提交配置,任务 API 不接收 toolId |
| 前端任务后端资源页 / 提示词编辑器 | 独立资源、Speaker 标注、指令预设和任务卡片 |
## 验证边界
验收应检查上下文隔离、不支持的推理配置明确拒绝、工具白名单和技能不能扩大权限、状态未知不重复执行、断线继续执行、取消可核查,以及旧凭据和指令预设不会丢失。仓库自动测试中使用的模型和 OpenCode 协议模拟会明确标注;真实 Provider、远端编码执行与部署网络仍需单独联调。具体执行记录以 `implement-stage/task-backends/BUILD_NOTE.md` 为准。
## 参考
- [Pipecat BackendLLMWorker](https://reference-server.pipecat.ai/en/latest/api/pipecat.workers.llm.backend_llm_worker.html)
- [Pipecat LLMWithBackend](https://reference-server.pipecat.ai/en/latest/api/pipecat.pipeline.llm_with_backend.html)
- [OpenCode Server](https://opencode.ai/docs/server/)
- [OpenCode 权限](https://opencode.ai/docs/permissions/)
- [OpenCode 技能](https://opencode.ai/docs/skills/)