Răsfoiți Sursa

chore: auto bump version and changelog [skip ci]

iwt 3 luni în urmă
părinte
comite
9267bf3ee6
2 a modificat fișierele cu 66 adăugiri și 1 ștergeri
  1. 65 0
      cfc-frontend/utils/api.js
  2. 1 1
      cfc-web/.last_build_commit

+ 65 - 0
cfc-frontend/utils/api.js

@@ -1,6 +1,8 @@
 import config from '@/config.js'
 
 const BASE_URL = config.API_BASE_URL
+const LANGGRAPH_URL = config.LANGGRAPH_BASE_URL
+const DIFY_URL = config.DIFY_BASE_URL
 
 var _redirectingToLogin = false
 
@@ -70,6 +72,69 @@ const request = (url, method = 'POST', data = {}, options = {}) => {
   })
 }
 
+// ===================== LangGraph 适配层(含 Dify fallback) =====================
+//
+// langgraphRequest() 是 AI 对话/分析的统一入口:
+//   1. 先尝试调用 LangGraph 适配层(/api/v1/chat/completion 或 /api/v1/analysis/run)
+//   2. 若 LangGraph 不可达(网络错误/超时/非 2xx),自动回退到 Dify(/api/ai/*)
+//
+// 参数:
+//   langgraphPath  - LangGraph 端点路径(如 '/api/v1/chat/completion')
+//   langgraphBody  - 发给 LangGraph 的请求体(DifyChatRequest / DifyAnalysisRequest)
+//   difyFallbackPath - Dify 回退端点路径(如 '/api/ai/chat/send')
+//   difyFallbackData  - 发给 Dify 的请求体(原 request() 的 data 参数)
+//   difyFallbackMethod - Dify 回退请求方法(默认 'POST')
+//   difyFallbackOptions - Dify 回退请求 options(同 request() 的 options)
+//   transform - 可选,把 LangGraph 响应转成页面期望的 { code, data, ... } 结构
+//
+// 返回 Promise,resolve 形态与 request() 一致:{ code: 200, data: {...}, message: ... }
+const langgraphRequest = (opts) => {
+  var langgraphPath = opts.langgraphPath
+  var langgraphBody = opts.langgraphBody || {}
+  var difyFallbackPath = opts.difyFallbackPath
+  var difyFallbackData = opts.difyFallbackData || {}
+  var difyFallbackMethod = opts.difyFallbackMethod || 'POST'
+  var difyFallbackOptions = opts.difyFallbackOptions || {}
+  var transform = opts.transform
+
+  return new Promise((resolve, reject) => {
+    var token = uni.getStorageSync('token')
+    var userId = uni.getStorageSync('userId') || ''
+
+    uni.request({
+      url: LANGGRAPH_URL + langgraphPath,
+      method: 'POST',
+      data: langgraphBody,
+      header: {
+        'Content-Type': 'application/json',
+        'X-User-Id': userId,
+        'Authorization': token ? ('Bearer ' + token) : ''
+      },
+      timeout: 30000,
+      success: (res) => {
+        // LangGraph 不可用(非 2xx)→ 回退 Dify
+        if (res.statusCode < 200 || res.statusCode >= 300) {
+          _fallbackToDify(difyFallbackPath, difyFallbackMethod, difyFallbackData, difyFallbackOptions, resolve, reject)
+          return
+        }
+        // LangGraph 成功 → 转成页面期望的 { code: 200, data: {...} } 结构
+        var lgData = res.data || {}
+        var pageData = transform ? transform(lgData) : lgData
+        resolve({ code: 200, message: 'ok', data: pageData })
+      },
+      fail: () => {
+        // LangGraph 网络错误 → 回退 Dify
+        _fallbackToDify(difyFallbackPath, difyFallbackMethod, difyFallbackData, difyFallbackOptions, resolve, reject)
+      }
+    })
+  })
+}
+
+// 内部:Dify 回退(复用 request(),保持原有鉴权/错误处理/重定向逻辑)
+function _fallbackToDify(path, method, data, options, resolve, reject) {
+  request(path, method, data, options).then(resolve).catch(reject)
+}
+
 // 登录模块
 export const wechatLogin = (code, userInfo) => {
   return request('/api/auth/wechat-login', 'POST', { code, ...userInfo })

+ 1 - 1
cfc-web/.last_build_commit

@@ -1 +1 @@
-51410dc6226718ad9ed09083544194a307220211
+94a767588f55727c11ce8a206bc44f1064e6aeb6