workflow.internal.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import request from '../utils/request'
  2. /**
  3. * 工作流 API。
  4. *
  5. * 路由策略(方案C):URL 路径参数统一使用 name(kebab-case);
  6. * 旧数字 id 作为字符串传入时也可被后端 getWorkflow(nameOrId) 兜底解析。
  7. */
  8. export function getWorkflows(params = {}) {
  9. return request.get('/workflows', { params })
  10. }
  11. export function setWorkflowCategory(nameOrId, categoryId) {
  12. return request.put(`/workflows/${nameOrId}/category`, { categoryId })
  13. }
  14. export function getWorkflow(nameOrId) {
  15. return request.get(`/workflows/${nameOrId}`)
  16. }
  17. export function createWorkflow(data) {
  18. return request.post('/workflows', data)
  19. }
  20. export function saveWorkflow(nameOrId, data) {
  21. return request.post(`/workflows/${nameOrId}/save`, data)
  22. }
  23. /**
  24. * AI 生成工作流描述(LLM 单轮调用,timeout 加长到 120s)。
  25. * 返回 Result{ data: { skipped, reason, description } }:
  26. * skipped=true 表示当前描述已清晰无需修改。
  27. * 接口只生成、不保存,由调用方决定是否再调 saveWorkflow 写回。
  28. */
  29. export function generateWorkflowDescription(nameOrId) {
  30. return request.post(`/workflows/${nameOrId}/generate-description`, null, { timeout: 120000 })
  31. }
  32. /**
  33. * 仅更新工作流描述(不建版本快照)。
  34. * 用于批量生成描述后的自动保存,避免污染版本历史。
  35. */
  36. export function updateWorkflowDescription(nameOrId, description) {
  37. return request.put(`/workflows/${nameOrId}/description`, { description })
  38. }
  39. export function deleteWorkflow(nameOrId) {
  40. return request.post(`/workflows/${nameOrId}/delete`)
  41. }
  42. /**
  43. * 运行工作流(POST SSE 流式响应)
  44. * 支持文件/目录上传:使用 FormData 提交
  45. * paths 为每个文件在工作目录中的相对路径(目录上传时保留目录结构)
  46. * 返回原生 fetch Response,需自行解析 SSE 流
  47. */
  48. export function runWorkflow(nameOrId, inputs, files = [], paths = []) {
  49. const formData = new FormData()
  50. formData.append('inputs', JSON.stringify(inputs || {}))
  51. files.forEach((file, i) => {
  52. formData.append('files', file)
  53. formData.append('paths', paths[i] || file.name)
  54. })
  55. return fetch(`/api/workflows/${nameOrId}/run`, {
  56. method: 'POST',
  57. body: formData
  58. })
  59. }
  60. /**
  61. * v1.1:断线重连入口 —— 按 runId 重新订阅 SSE。
  62. * 客户端 reader.read() 抛错时记录 lastEventId 后通过此端点续接。
  63. * 返回原生 fetch Response,需自行解析 SSE 流(与 runWorkflow 一致)。
  64. *
  65. * @param {string} runId 工作流运行 ID
  66. * @param {number} lastEventId 上次收到的最大事件 id(来自 SSE event.id 字段)
  67. */
  68. export function reconnectRunStream(runId, lastEventId) {
  69. const url = `/api/workflows/runs/${runId}/stream`
  70. + (lastEventId != null ? `?lastEventId=${lastEventId}` : '')
  71. return fetch(url)
  72. }
  73. /**
  74. * v1.1:查询运行状态 + 当前未答暂停点。
  75. * 用户离开几小时后回来时,前端先调此端点:
  76. * 若 status=RUNNING 且 currentPause 非空,立即恢复 Askfor UI;
  77. * 然后再调 reconnectRunStream 续接 SSE。
  78. */
  79. export function getRunState(runId) {
  80. return request.get(`/workflows/runs/${runId}/state`)
  81. }
  82. /**
  83. * v1.1:提交用户对 clarify_request 的回答。
  84. * 唤醒后端 Bridge 中阻塞等待的 Hermes Agent 线程,工作流继续执行。
  85. */
  86. export function submitClarifyAnswer(runId, clarifyId, answer) {
  87. return request.post(`/workflows/runs/${runId}/resume`, { clarifyId, answer })
  88. }
  89. /**
  90. * 自动关联分析:识别 Skill/SmartAction 节点隐式引用的其他 Skill
  91. */
  92. export function autoAssociate(graphData) {
  93. return request.post('/workflows/auto-associate', { graphData })
  94. }
  95. // ==================== 版本管理 ====================
  96. export function listWorkflowVersions(nameOrId) {
  97. return request.get(`/workflows/${nameOrId}/versions`)
  98. }
  99. export function getWorkflowVersionContent(nameOrId, version) {
  100. return request.get(`/workflows/${nameOrId}/versions/${version}/content`)
  101. }
  102. export function rollbackWorkflowVersion(nameOrId, version) {
  103. return request.post(`/workflows/${nameOrId}/versions/${version}/rollback`)
  104. }
  105. export function updateWorkflowVersionMessage(nameOrId, version, message) {
  106. return request.put(`/workflows/${nameOrId}/versions/${version}/message`, { message })
  107. }