独立的通讯平面项目,用于统一接入外部渠道,并将任务路由给:
doops.shdowork当前已经落地的最小可运行能力:
webhook / stream 模式切换DoopsAdapter / DoworkAdapter 统一适配器接口在当前环境下建议使用本地已缓存依赖离线编译:
mvn -o -Dmaven.repo.local=$HOME/.m2/repository -DskipTests compile
默认配置文件已经改成环境变量占位符,真实地址与密钥建议通过环境变量或本地覆盖文件注入。
仓库里额外提供了一份本地模板:
src/main/resources/application-local.yml.example推荐做法:
application-local.ymldoops / dowork / 飞书 / 钉钉 配置--spring.profiles.active=localmvn -o -Dmaven.repo.local=$HOME/.m2/repository spring-boot:run
默认端口:
18088前端入口:
http://127.0.0.1:18088/POST /api/v1/channel/api/submit
示例:
curl -X POST http://127.0.0.1:18088/api/v1/channel/api/submit \
-H 'Content-Type: application/json' \
-d '{
"tenantId": "tenant-a",
"conversationId": "conv-001",
"senderId": "user-001",
"content": "请帮我查看 k8s deployment 日志"
}'
POST /api/v1/channel/{source}/webhook
例如:
/api/v1/channel/feishu/webhook/api/v1/channel/dingtalk/webhookPOST /api/v1/channel/feishu/webhook
支持:
challenge 校验请求POST /api/v1/channel/dingtalk/webhook
支持:
challenge 校验请求channel-plane.ingress.dingtalk.mode=webhook 时启用GET /api/v1/tasks/{taskId}
GET /api/v1/tasks
可选参数:
tenantIdGET /api/v1/tasks/{taskId}/events
POST /api/v1/tasks/{taskId}/refresh
POST /api/v1/tasks/{taskId}/interrupt
POST /api/v1/tasks/{taskId}/stop
POST /api/v1/outbox/dispatch
POST /api/v1/backend/{backendType}/tasks/{taskId}/callbacks
示例:
curl -X POST http://127.0.0.1:18088/api/v1/backend/doops/tasks/task_xxx/callbacks \
-H 'Content-Type: application/json' \
-d '{
"status": "RUNNING",
"currentStep": "collecting logs",
"summary": "正在采集 deployment 与 pod 日志"
}'
POST /api/v1/users
POST /api/v1/users/{userId}/bindings
GET /api/v1/users?tenantId=default
GET /api/v1/users/{userId}
doopsdowork当前两个后端适配器默认使用:
stub-mode = true也就是:
doops.shdoworkbackendRef 和 backendSessionRef后续接真实后端时,只需要:
stub-modebase-urlsubmit-pathauth-header 与 auth-tokencallbackUrl 回调任务状态channel-plane 已按 doops-agent 的真实协议接入:
/wsX-Doops-Keydoops_agent_promptsession_id 默认使用 taskId适配策略:
channel-plane 先受理任务并立即返回doops-agentnotifications/messagechannel-plane 已按 dowork-agent 的真实接口接入:
/api/lab/instances/standalone/api/lab/instances/{id}/startuser_id 使用通讯平面解析出的本地用户 ID适配策略:
startRUNNINGFAILED同时会把以下上下文透传到实例环境变量:
CHANNEL_TASK_IDCHANNEL_TASK_TITLECHANNEL_TASK_CONTENTCHANNEL_INITIATOR_USER_IDCHANNEL_INITIATOR_DISPLAY_NAMECHANNEL_CALLBACK_URL目前 channel-plane 已经支持:
默认仍然是 stub-mode = true,因此本地调试不会真的往外发消息。
如果要接真实机器人 webhook,可以在 application.yml 中配置:
channel-plane:
egress:
feishu:
stub-mode: false
webhook-url: https://open.feishu.cn/open-apis/bot/v2/hook/xxx
secret: your-feishu-secret
dingtalk:
stub-mode: false
webhook-url: https://oapi.dingtalk.com/robot/send?access_token=xxx
secret: your-dingtalk-secret
配置完成后,任务受理消息会自动通过 outbox 派发出去。
如果要改成钉钉 Stream 通道,在 application.yml 中配置:
channel-plane:
ingress:
dingtalk:
mode: stream
stream:
client-id: your-client-id
client-secret: your-client-secret
consume-threads: 2
如果仍然走 webhook:
channel-plane:
ingress:
dingtalk:
mode: webhook
两种模式共用同一套消息标准化和任务提交流程。
首页管理台已支持:
现在每个任务会保存:
initiatorUserIdinitiatorDisplayNamesourceUserIdsourceUserName如果渠道消息的发送人还没有绑定到本地用户,系统会自动创建一个用户并建立绑定关系,这样任务从第一天开始就是可追溯的。
手工绑定示例:
curl -X POST http://127.0.0.1:18088/api/v1/users \
-H 'Content-Type: application/json' \
-d '{
"tenantId": "tenant-a",
"displayName": "张三",
"email": "zhangsan@example.com"
}'
curl -X POST http://127.0.0.1:18088/api/v1/users/usr_xxx/bindings \
-H 'Content-Type: application/json' \
-d '{
"tenantId": "tenant-a",
"sourceType": "FEISHU",
"channelAccountId": "feishu-default",
"externalUserId": "ou_001",
"externalDisplayName": "张三"
}'
飞书支持:
verification-token 校验钉钉支持:
verification-token 校验timestamp + sign + secret 校验后端回调支持:
auth-header + auth-token 鉴权channel-plane:
backends:
callback:
base-url: http://channel-plane.xxx.svc.cluster.local:18088
auth-header: X-Callback-Token
auth-token: your-callback-token
doops:
stub-mode: false
base-url: http://doops-agent.example.internal:42222
submit-path: /ws
auth-header: X-Doops-Key
auth-token: your-doops-password
dowork:
stub-mode: false
base-url: http://dowork-gateway.example.internal:8080
submit-path: /api/lab/instances/standalone
auth-header: Authorization
auth-token: Bearer your-token
当前判断很明确:
doops.sh 没有完整业务用户模型,通讯平面负责补齐用户归属和渠道绑定dowork 有 user_id / session ownership,但仍不是统一企业用户中心因此统一策略是:
channel-plane 为准doops.sh 时透传为任务上下文dowork 时直接适配为它的 user_id