/** * Dify 服务端基础 API 模块 * * 提供 Node.js 服务端调用 FastAPI 后端的基础功能 * 包括配置管理和基础请求函数 * * 调用链路: * Remix Server → FastAPI /dify/* → Dify * * @module api/dify/client.server */ import { API_BASE_URL } from '~/config/api-config'; // ============================================================================ // 配置 // ============================================================================ /** * 获取环境变量的服务端函数 */ const getServerEnvVar = (name: string, defaultValue: string = ''): string => { return process.env[name] || defaultValue; }; /** * Dify API 客户端配置 * 通过 FastAPI 后端的 /dify 路由代理访问 Dify */ const DIFY_CONFIG = { API_URL: `${API_BASE_URL}/dify_chat`, API_KEY: getServerEnvVar('NEXT_PUBLIC_APP_KEY', ''), APP_ID: (() => { const rawAppId = getServerEnvVar('NEXT_PUBLIC_APP_ID', ''); const match = rawAppId.match(/\/app\/([a-f0-9-]{36})/); return match ? match[1] : rawAppId; })(), }; console.log('[Dify Server] 配置:', { apiUrl: DIFY_CONFIG.API_URL, apiBaseUrl: API_BASE_URL, appId: DIFY_CONFIG.APP_ID, configComplete: !!(DIFY_CONFIG.API_URL && DIFY_CONFIG.APP_ID) }); // ============================================================================ // 基础请求函数 // ============================================================================ /** * Dify API 基础请求函数 * * 使用 JWT 认证通过 FastAPI 代理访问 Dify * * @param endpoint - API 端点路径 * @param options - fetch 请求选项 * @param jwt - JWT 认证令牌 * @returns Response 对象 */ export async function difyFetch( endpoint: string, options: RequestInit = {}, jwt?: string ): Promise { const url = `${DIFY_CONFIG.API_URL}/${endpoint.replace(/^\//, '')}`; const headers: HeadersInit = { 'Content-Type': 'application/json', ...options.headers, }; if (jwt) { (headers as Record)['Authorization'] = `Bearer ${jwt}`; } else { console.warn('[Dify Server] 没有提供 JWT,转发fastapi请求可能失败'); } const response = await fetch(url, { ...options, headers, }); if (!response.ok) { const errorText = await response.text(); console.error('[Dify Server] 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; } // ============================================================================ // 工具函数 // ============================================================================ /** * Dify 工具函数 */ export const difyUtils = { /** * 获取 Dify 配置 */ getConfig: () => DIFY_CONFIG, }; // 重新导出 chat 模块的 difyClient export { difyClient } from './chat';