|
|
@@ -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 })
|