3f5c23123b
- 新增对话应用管理模块(dify-chat-apps),支持获取和切换对话应用 - 优化对话应用切换后自动刷新会话列表功能 - 知识库管理页面新增下拉选择器,支持切换不同知识库 - API 层支持 app_id 参数传递,实现多应用会话隔离 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
99 lines
2.8 KiB
TypeScript
99 lines
2.8 KiB
TypeScript
/**
|
||
* Dify Chat 服务端 API 模块
|
||
*
|
||
* 提供 Node.js 服务端调用 FastAPI 后端的基础功能
|
||
* Dify 的 API_KEY 和 APP_ID 由 FastAPI 后端管理,前端只负责转发请求
|
||
*
|
||
* 调用链路:
|
||
* Remix Server → FastAPI /dify_chat/* → Dify
|
||
*
|
||
* @module api/dify-chat/client.server
|
||
*/
|
||
|
||
import { API_BASE_URL } from '~/config/api-config';
|
||
|
||
// ============================================================================
|
||
// 配置
|
||
// ============================================================================
|
||
|
||
/**
|
||
* Dify Chat API 代理地址
|
||
* 通过 FastAPI 后端的 /dify_chat 路由代理访问 Dify
|
||
* Dify 的认证(API_KEY)由 FastAPI 后端处理
|
||
*/
|
||
const DIFY_CHAT_API_URL = `${API_BASE_URL}/dify_chat`;
|
||
|
||
// ============================================================================
|
||
// 基础请求函数
|
||
// ============================================================================
|
||
|
||
/**
|
||
* Dify Fetch 请求选项
|
||
*/
|
||
export interface DifyFetchOptions extends RequestInit {
|
||
/** 对话应用 ID,用于切换不同的 Dify 应用 */
|
||
appId?: string;
|
||
}
|
||
|
||
/**
|
||
* Dify Chat API 基础请求函数
|
||
*
|
||
* 使用用户 JWT 认证通过 FastAPI 代理访问 Dify
|
||
* FastAPI 后端会验证 JWT 并添加 Dify API_KEY
|
||
*
|
||
* @param endpoint - API 端点路径
|
||
* @param options - fetch 请求选项(可包含 appId)
|
||
* @param jwt - 用户 JWT 认证令牌
|
||
* @returns Response 对象
|
||
*/
|
||
export async function difyFetch(
|
||
endpoint: string,
|
||
options: DifyFetchOptions = {},
|
||
jwt?: string
|
||
): Promise<Response> {
|
||
const { appId, ...fetchOptions } = options;
|
||
const url = `${DIFY_CHAT_API_URL}/${endpoint.replace(/^\//, '')}`;
|
||
|
||
const headers: HeadersInit = {
|
||
'Content-Type': 'application/json',
|
||
...fetchOptions.headers,
|
||
};
|
||
|
||
if (jwt) {
|
||
(headers as Record<string, string>)['Authorization'] = `Bearer ${jwt}`;
|
||
} else {
|
||
console.warn('[Dify Chat] 没有提供 JWT,FastAPI 请求可能失败');
|
||
}
|
||
|
||
// 如果指定了应用 ID,添加 X-Dify-App-Id 请求头
|
||
if (appId) {
|
||
(headers as Record<string, string>)['X-Dify-App-Id'] = appId;
|
||
console.log('[Dify Chat] 使用应用 ID:', appId);
|
||
}
|
||
|
||
const response = await fetch(url, {
|
||
...fetchOptions,
|
||
headers,
|
||
});
|
||
|
||
if (!response.ok) {
|
||
const errorText = await response.text();
|
||
console.error('[Dify Chat] API 转发错误:', {
|
||
status: response.status,
|
||
statusText: response.statusText,
|
||
error: errorText
|
||
});
|
||
|
||
if (response.status === 401) {
|
||
throw new Error('JWT认证失败,请重新登录');
|
||
}
|
||
|
||
throw new Error(`Dify API Error: ${response.status} ${response.statusText}`);
|
||
}
|
||
|
||
return response;
|
||
}
|
||
|
||
// 重新导出 chat 模块的 difyClient
|
||
export { difyClient } from './chat';
|