@axiom-lattice/gateway 1.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +22 -0
- package/.turbo/turbo-build.log +21 -0
- package/LICENSE +201 -0
- package/README.md +45 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +718 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +686 -0
- package/dist/index.mjs.map +1 -0
- package/jest.config.js +23 -0
- package/package.json +61 -0
- package/src/__tests__/setup.ts +5 -0
- package/src/config/index.ts +45 -0
- package/src/controllers/assistant.ts +26 -0
- package/src/controllers/memory.ts +242 -0
- package/src/controllers/run.ts +233 -0
- package/src/index.ts +110 -0
- package/src/logger/Logger.ts +186 -0
- package/src/routes/index.ts +70 -0
- package/src/services/AgentManager.ts +42 -0
- package/src/services/agent_service.ts +292 -0
- package/src/services/agent_task_types.ts +2 -0
- package/src/services/event_bus.ts +62 -0
- package/src/services/queue_service.ts +82 -0
- package/src/services/supabase.ts +26 -0
- package/src/types/index.ts +123 -0
- package/src/types/koa.d.ts +7 -0
- package/tsconfig.json +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/config/index.ts","../src/services/agent_service.ts","../src/controllers/run.ts","../src/controllers/memory.ts","../src/controllers/assistant.ts","../src/routes/index.ts","../src/logger/Logger.ts"],"sourcesContent":["import fastify from \"fastify\";\nimport cors from \"@fastify/cors\";\nimport sensible from \"@fastify/sensible\";\nimport { config, validateConfig } from \"./config\";\nimport { registerRoutes } from \"./routes\";\n// 导入自定义 Logger 类\nimport { Logger } from \"./logger/Logger\";\n\nprocess.on(\"unhandledRejection\", (reason, promise) => {\n console.error(\"未处理的Promise拒绝:\", reason);\n // 可以在这里进行日志记录或其他处理\n});\n\n// 验证配置\ntry {\n validateConfig();\n} catch (error: any) {\n console.error(\"配置错误:\", error.message);\n process.exit(1);\n}\n\n// 创建自定义日志记录器\nconst logger = new Logger({\n serviceName: \"lattice-gateway\",\n name: \"fastify-server\",\n});\n\n// 创建 Fastify 应用\nconst app = fastify({\n logger: false, // 禁用内置日志记录器\n});\n\n// 添加自定义日志记录\napp.addHook(\"onRequest\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n done();\n});\n\napp.addHook(\"onResponse\", (request, reply, done) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n done();\n});\n\n// cors\napp.register(cors, {\n origin: true,\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n allowedHeaders: [\n \"Content-Type\",\n \"Authorization\",\n \"X-Requested-With\",\n \"x-tenant-id\",\n \"x-request-id\",\n ],\n exposedHeaders: [\"Content-Type\"],\n credentials: true,\n});\napp.register(sensible);\n\n// 错误处理\napp.setErrorHandler((error, request, reply) => {\n const context = {\n \"x-tenant-id\": request.headers[\"x-tenant-id\"],\n \"x-request-id\": request.headers[\"x-request-id\"],\n };\n logger.error(\n `请求错误: ${request.method} ${request.url} error:${error.message}`,\n {\n ...context,\n error: error.message,\n stack: error.stack,\n statusCode: error.statusCode || 500,\n }\n );\n reply.status(error.statusCode || 500).send({\n success: false,\n error: error.message || \"服务器内部错误\",\n });\n});\n\n// 将日志记录器添加到应用实例中,以便在路由中使用\napp.decorate(\"logger\", logger);\n\n// 注册路由\nregisterRoutes(app);\n\n// 启动服务器\nconst start = async () => {\n try {\n const port = Number(config.server.port);\n await app.listen({ port, host: \"0.0.0.0\" });\n logger.info(`Lattice Gateway is running on port: ${port}`);\n logger.info(`Environment: ${config.server.env}`);\n } catch (err) {\n logger.error(\"Server start failed\", { error: err });\n process.exit(1);\n }\n};\n\nconst LatticeGateway = {\n startAsHttpEndpoint: start,\n};\n\nexport { LatticeGateway };\n","import dotenv from \"dotenv\";\nimport path from \"path\";\n\n// 加载环境变量\ndotenv.config({ path: path.resolve(__dirname, \"../../.env\") });\n\nexport const config = {\n server: {\n port: process.env.PORT || 4001,\n env: process.env.NODE_ENV || \"development\",\n },\n supabase: {\n url: process.env.SUPABASE_URL || \"\",\n key: process.env.SUPABASE_KEY || \"\",\n },\n // langgraph: {\n // apiKey: process.env.LANGGRAPH_API_KEY || \"dummy_key\",\n // },\n webhook: {\n url: process.env.WEBHOOK_URL || \"\",\n },\n // java_api_url: process.env.JAVA_API_URL || \"\",\n // common_api_url: process.env.COMMON_API_URL || \"\",\n // azure_openai_api_key: process.env.AZURE_OPENAI_API_KEY || \"\",\n database_url: process.env.DATABASE_URL || \"\",\n};\n\n// 验证必要的环境变量\nexport const validateConfig = (): void => {\n // 在开发环境中不验证环境变量\n // if (config.server.env === \"development\") {\n // console.warn(\"开发环境:跳过环境变量验证\");\n // return;\n // }\n // const { supabase, azure_openai_api_key, database_url } = config;\n // if (!supabase.url || !supabase.key) {\n // throw new Error(\"Supabase URL and key are required\");\n // }\n // if (!azure_openai_api_key) {\n // throw new Error(\"Azure OpenAI API key is required\");\n // }\n // if (!database_url) {\n // throw new Error(\"Database URL is required\");\n // }\n};\n","import {\n AIMessage,\n AIMessageChunk,\n BaseMessage,\n filterMessages,\n HumanMessage,\n ToolMessage,\n ToolMessageChunk,\n} from \"@langchain/core/messages\";\nimport { Command, CommandParams } from \"@langchain/langgraph\";\nimport { v4 } from \"uuid\";\n// 修改导入路径,使用 lattice_core 包\nimport { getAgentClient, getAgentLattice } from \"@axiom-lattice/core\";\n\nfunction isAIMessageChunk(msg: any): msg is AIMessageChunk {\n return msg && msg.constructor.name === \"AIMessageChunk\";\n}\nfunction isToolMessageChunk(msg: any): msg is ToolMessageChunk {\n return msg && msg.constructor.name === \"ToolMessageChunk\";\n}\nfunction isAIMessage(msg: any): msg is AIMessage {\n return msg && msg.constructor.name === \"AIMessage\";\n}\nfunction isToolMessage(msg: any): msg is ToolMessage {\n return msg && msg.constructor.name === \"ToolMessage\";\n}\n\nexport async function agent_invoke({\n input,\n thread_id,\n assistant_id,\n tenant_id,\n command,\n run_id,\n}: {\n assistant_id: string;\n input: any;\n thread_id: string;\n tenant_id: string;\n run_id?: string;\n command?: CommandParams<any>;\n}) {\n const runnable_agent = getAgentLattice(assistant_id)?.client;\n const { files, message, ...rest } = input;\n const humanMessage = new HumanMessage(message || \"\");\n humanMessage.additional_kwargs = { files: files };\n const messages = [humanMessage];\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n\n const result = await runnable_agent.invoke(\n command\n ? new Command(command)\n : { ...rest, messages, \"x-tenant-id\": tenant_id },\n {\n configurable: {\n thread_id: thread_id,\n run_id: run_id || v4(),\n recursionLimit: 200,\n \"x-tenant-id\": tenant_id,\n \"x-request-id\": run_id,\n \"x-thread-id\": thread_id,\n },\n }\n );\n\n return result;\n}\n\nexport async function agent_stream({\n input,\n thread_id,\n command,\n tenant_id,\n assistant_id,\n run_id,\n}: {\n assistant_id: string;\n input: any;\n thread_id: string;\n command?: CommandParams<any>;\n tenant_id: string;\n run_id?: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n const { files, message, ...rest } = input;\n let messages: BaseMessage[] = [];\n if (!command) {\n const humanMessage = new HumanMessage(message);\n humanMessage.additional_kwargs = { files: files };\n messages = [humanMessage];\n }\n\n try {\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const agentStream = await runnable_agent.stream(\n command\n ? new Command(command)\n : {\n ...rest,\n messages,\n \"x-tenant-id\": tenant_id,\n },\n\n {\n configurable: {\n thread_id: thread_id,\n run_id: run_id || v4(),\n \"x-tenant-id\": tenant_id,\n \"x-request-id\": run_id,\n \"x-thread-id\": thread_id,\n },\n streamMode: [\"updates\", \"messages\"],\n subgraphs: false,\n }\n );\n\n // 创建一个可迭代的 ReadableStream\n return {\n [Symbol.asyncIterator]: async function* () {\n try {\n for await (const chunk of agentStream) {\n // console.log(\"-----chunk----\", chunk);\n let data;\n // for (const [node, values] of Object.entries(chunk)) {\n // console.log(`Receiving update from node: ${node}`);\n // console.log(values);\n // console.log(\"\\n====\\n\");\n // }\n //console.log(\"chunk\", JSON.stringify(chunk));\n // if (chunk[0] === \"updates\") {\n // const updates = chunk[1];\n // console.log(\"update\", updates);\n // }\n if (chunk[0] === \"messages\") {\n //console.log(chunk[1][0]);\n const messages = chunk[1];\n data = messages?.[0]?.toDict();\n\n // const messagesArray = messages\n // .map((message: any) => {\n // if (isAIMessageChunk(message)) {\n // return {\n // id: message.id,\n // role: \"ai\",\n // name: message.name,\n // content: message.content,\n // type: \"message_chunk\",\n // tool_calls: message.tool_calls,\n // tool_call_chunks: message.tool_call_chunks,\n // };\n // } else if (isToolMessage(message)) {\n // return {\n // id: message.id,\n // role: \"tool\",\n // content: message.content,\n // type: \"tool_message\",\n // tool_call_id: message.tool_call_id,\n // name: message.name,\n // };\n // } else if (isAIMessage(message)) {\n // return {\n // id: message.id,\n // role: \"ai\",\n // content: message.content,\n // type: \"message\",\n // };\n // } else if (isToolMessageChunk(message)) {\n // return {\n // id: message.id,\n // role: \"tool\",\n // type: \"tool_message_chunk\",\n // content: message.content,\n // };\n // }\n // })\n // .filter((item: any) => item);\n // // 如果messagesArray为空,则不返回数据,如果返回数据会导致界面清掉历史message\n // if (messagesArray.length > 0) {\n // data = {\n // messages: messagesArray,\n // };\n // }\n }\n\n if ((chunk?.[1] as any)?.__interrupt__) {\n data = chunk?.[1]?.[0]?.toDict();\n // 原有的中断消息处理\n // data = {\n // messages: [\n // {\n // role: \"ai\",\n // content: (chunk?.[1] as any)?.__interrupt__[0].value,\n // type: \"action\",\n // },\n // ],\n // };\n }\n\n if (data) {\n console.log(data);\n yield data;\n }\n }\n } catch (error) {\n console.error(\"Stream error:\", error);\n throw error;\n }\n },\n };\n } catch (error) {\n throw error;\n }\n}\n\nexport async function agent_state({\n thread_id,\n assistant_id,\n}: {\n assistant_id: string;\n thread_id: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const state = await runnable_agent.getState({\n configurable: { thread_id: thread_id, subgraphs: false },\n });\n return state;\n}\n\nexport async function agent_messages({\n thread_id,\n tenant_id,\n assistant_id,\n}: {\n assistant_id: string;\n thread_id: string;\n tenant_id: string;\n}) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const state = await runnable_agent.getState({\n configurable: { thread_id: thread_id, subgraphs: false },\n });\n\n const messages = state.values.messages || [];\n const filteredMessages = filterMessages(messages, {\n includeTypes: [\"ai\", \"human\", \"tool\"], //[\"human\", \"ai\", \"tool\"],\n });\n\n // console.log(filteredMessages);\n\n let messagesArray = filteredMessages.map((message: BaseMessage) => ({\n id: message.id,\n role: message.getType(),\n content: message.content,\n files: message.additional_kwargs.files,\n ...message.lc_kwargs,\n }));\n\n const action_messages = state.tasks.flatMap((task) => {\n return task.interrupts.map((interrupt) => {\n return {\n role: \"ai\",\n content: interrupt.value,\n type: \"action\",\n };\n });\n });\n\n const new_messages = [...messagesArray, ...action_messages];\n // console.log(messagesArray);\n\n return new_messages;\n}\n\nexport async function draw_graph(assistant_id: string) {\n const runnable_agent = getAgentClient(assistant_id);\n if (!runnable_agent) {\n throw new Error(`Agent ${assistant_id} not found`);\n }\n const drawableGraph = await runnable_agent.getGraphAsync();\n const image = await drawableGraph.drawMermaid();\n return image;\n}\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport * as agentService from \"../services/agent_service\";\nimport { CreateRunRequest } from \"../types\";\nimport { v4 } from \"uuid\";\n\n// 创建运行\nexport const createRun = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const {\n assistant_id,\n thread_id,\n command,\n streaming,\n background,\n ...input\n } = request.body as CreateRunRequest;\n\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n const x_request_id = (request.headers[\"x-request-id\"] as string) || v4();\n\n // 验证请求数据\n if (!assistant_id) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n // 如果请求streaming,则agent_stream\n if (streaming) {\n // 开始运行\n const stream = await agentService.agent_stream({\n assistant_id: assistant_id,\n input: input,\n thread_id: thread_id,\n command,\n tenant_id: tenant_id,\n run_id: x_request_id,\n });\n\n // 设置 SSE 响应头\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n try {\n for await (const chunk of stream) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n } catch (error) {\n //console.error(\"Stream processing error:\", error);\n } finally {\n reply.raw.end();\n // 通知 Fastify 我们将手动处理响应\n return reply.hijack();\n }\n } else {\n // 后台运行的情况\n const result = await agentService.agent_invoke({\n assistant_id: assistant_id,\n input: input,\n command: command,\n thread_id: thread_id,\n tenant_id: tenant_id,\n run_id: x_request_id,\n });\n reply.status(200).send(result);\n }\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `创建运行时发生错误: ${error.message}`,\n });\n }\n};\n\n// // 获取运行\n// export const getRun = async (\n// request: FastifyRequest,\n// reply: FastifyReply\n// ): Promise<void> => {\n// try {\n// const { id } = request.params as { id: string };\n\n// if (!id) {\n// reply.status(400).send({\n// success: false,\n// error: \"运行ID是必需的\",\n// });\n// return;\n// }\n\n// const result = await runModel.getRun(id);\n\n// if (!result.success) {\n// reply.status(404).send(result);\n// return;\n// }\n\n// reply.send(result);\n// } catch (error: any) {\n// reply.status(500).send({\n// success: false,\n// error: `获取运行时发生错误: ${error.message}`,\n// });\n// }\n// };\n\n// // 获取助手的所有运行\n// export const getRunsByAssistant = async (\n// request: FastifyRequest,\n// reply: FastifyReply\n// ): Promise<void> => {\n// try {\n// const { assistantId } = request.params as { assistantId: string };\n\n// if (!assistantId) {\n// reply.status(400).send({\n// success: false,\n// error: \"助手ID是必需的\",\n// });\n// return;\n// }\n\n// const result = await runModel.getRunsByAssistant(assistantId);\n\n// reply.send(result);\n// } catch (error: any) {\n// reply.status(500).send({\n// success: false,\n// error: `获取助手运行时发生错误: ${error.message}`,\n// });\n// }\n// };\n\n// // 取消运行\n// export const cancelRun = async (\n// request: FastifyRequest,\n// reply: FastifyReply\n// ): Promise<void> => {\n// try {\n// const { id } = request.params as { id: string };\n\n// if (!id) {\n// reply.status(400).send({\n// success: false,\n// error: \"运行ID是必需的\",\n// });\n// return;\n// }\n\n// const result = await runModel.updateRunStatus(id, RunStatus.CANCELLED);\n\n// if (!result.success) {\n// reply.status(404).send(result);\n// return;\n// }\n\n// reply.send(result);\n// } catch (error: any) {\n// reply.status(500).send({\n// success: false,\n// error: `取消运行时发生错误: ${error.message}`,\n// });\n// }\n// };\n\n// // 添加消息\n// export const addMessage = async (\n// request: FastifyRequest,\n// reply: FastifyReply\n// ): Promise<void> => {\n// try {\n// const data = request.body as AddMessageRequest;\n\n// // 验证请求数据\n// if (!data.runId || !data.role || !data.content) {\n// reply.status(400).send({\n// success: false,\n// error: \"运行ID、角色和内容是必需的\",\n// });\n// return;\n// }\n\n// const result = await messageModel.addMessage(data);\n\n// if (!result.success) {\n// reply.status(500).send(result);\n// return;\n// }\n\n// reply.status(201).send(result);\n// } catch (error: any) {\n// reply.status(500).send({\n// success: false,\n// error: `添加消息时发生错误: ${error.message}`,\n// });\n// }\n// };\n\n// // 获取运行的所有消息\n// export const getMessages = async (\n// request: FastifyRequest,\n// reply: FastifyReply\n// ): Promise<void> => {\n// try {\n// const { runId } = request.params as { runId: string };\n\n// if (!runId) {\n// reply.status(400).send({\n// success: false,\n// error: \"运行ID是必需的\",\n// });\n// return;\n// }\n\n// const result = await messageModel.getMessagesByRun(runId);\n\n// reply.send(result);\n// } catch (error: any) {\n// reply.status(500).send({\n// success: false,\n// error: `获取消息时发生错误: ${error.message}`,\n// });\n// }\n// };\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { agent_messages, agent_state } from \"../services/agent_service\";\n\n// 设置内存项\nexport const setMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n const value = request.body;\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n if (value === undefined) {\n reply.status(400).send({\n success: false,\n error: \"值是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.setMemoryItem(assistantId, key, value);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `设置内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取内存项\nexport const getMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.getMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(404).send();\n return;\n // }\n\n //reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取所有内存项\nexport const getAllMemoryItems = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n const tenant_id = request.headers[\"x-tenant-id\"] as string;\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const result = await agent_messages({\n assistant_id: assistantId,\n thread_id: thread_id,\n tenant_id: tenant_id,\n });\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取所有内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 获取助手状态\nexport const getAgentState = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, thread_id } = request.params as {\n assistantId: string;\n thread_id: string;\n };\n\n if (!thread_id) {\n reply.status(400).send({\n success: false,\n error: \"线程ID是必需的\",\n });\n return;\n }\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n const result = await agent_state({\n assistant_id: assistantId,\n thread_id: thread_id,\n });\n\n if (!result) {\n reply.status(500).send(result);\n return;\n }\n\n reply.send(result);\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `获取助手状态时发生错误: ${error.message}`,\n });\n }\n};\n\n// 删除内存项\nexport const deleteMemoryItem = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId, key } = request.params as {\n assistantId: string;\n key: string;\n };\n\n if (!assistantId || !key) {\n reply.status(400).send({\n success: false,\n error: \"助手ID和键是必需的\",\n });\n return;\n }\n\n //const result = await memoryModel.deleteMemoryItem(assistantId, key);\n\n // if (!result.success) {\n reply.status(500).send();\n return;\n // }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `删除内存项时发生错误: ${error.message}`,\n });\n }\n};\n\n// 清除内存\nexport const clearMemory = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n try {\n const { assistantId } = request.params as { assistantId: string };\n\n if (!assistantId) {\n reply.status(400).send({\n success: false,\n error: \"助手ID是必需的\",\n });\n return;\n }\n\n let result: any; //= await memoryModel.clearMemory(assistantId);\n\n if (!result.success) {\n reply.status(500).send(result);\n return;\n }\n\n reply.status(204).send();\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: `清除内存时发生错误: ${error.message}`,\n });\n }\n};\n","import { FastifyRequest, FastifyReply } from \"fastify\";\nimport { draw_graph } from \"../services/agent_service\";\n\nexport const getAgentGraph = async (\n request: FastifyRequest<{\n Params: { assistantId: string };\n }>,\n reply: FastifyReply\n) => {\n try {\n const { assistantId } = request.params;\n\n // 调用绘图服务获取图片数据\n const imageData = await draw_graph(assistantId);\n\n // 设置响应头并返回图片数据\n reply.header(\"Content-Type\", \"application/json\").send({\n image: imageData,\n });\n } catch (error: any) {\n reply.status(500).send({\n success: false,\n error: error.message || \"获取代理图表失败\",\n });\n }\n};\n","import { FastifyInstance } from \"fastify\";\n//import * as assistantController from \"../controllers/assistant\";\nimport * as runController from \"../controllers/run\";\nimport * as memoryController from \"../controllers/memory\";\nimport * as graphController from \"../controllers/assistant\";\n\nexport const registerRoutes = (app: FastifyInstance): void => {\n // 运行路由\n app.post<{\n Body: any;\n }>(\"/api/runs\", runController.createRun);\n\n // app.get<{\n // Params: { id: string };\n // }>(\"/api/runs/:id\", runController.getRun);\n\n // app.get<{\n // Params: { assistantId: string };\n // }>(\"/api/assistants/:assistantId/runs\", runController.getRunsByAssistant);\n\n // app.post<{\n // Params: { id: string };\n // }>(\"/api/runs/:id/cancel\", runController.cancelRun);\n\n // 内存路由\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/memory\",\n memoryController.getAllMemoryItems\n );\n\n app.get<{\n Params: { assistantId: string; thread_id: string };\n }>(\n \"/api/assistants/:assistantId/:thread_id/state\",\n memoryController.getAgentState\n );\n\n app.get<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n memoryController.getMemoryItem\n );\n\n app.put<{\n Params: { assistantId: string; key: string };\n Body: any;\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n memoryController.setMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string; key: string };\n }>(\n \"/api/assistants/:assistantId/memory/:key\",\n memoryController.deleteMemoryItem\n );\n\n app.delete<{\n Params: { assistantId: string };\n }>(\"/api/assistants/:assistantId/memory\", memoryController.clearMemory);\n\n // 图表路由\n app.get<{\n Params: { assistantId: string };\n }>(\"/api/assistants/:assistantId/graph\", graphController.getAgentGraph);\n};\n","import pino from \"pino\";\nimport \"pino-pretty\";\nimport \"pino-roll\";\nimport { AsyncLocalStorage } from \"async_hooks\";\n\nexport interface LoggerContext {\n \"x-user-id\"?: string;\n \"x-tenant-id\"?: string;\n \"x-request-id\"?: string;\n \"x-task-id\"?: string;\n \"x-thread-id\"?: string;\n}\n\nexport interface LoggerOptions {\n name?: string;\n serviceName?: string;\n context?: LoggerContext;\n}\n\n/**\n * 单例的Pino日志工厂类,管理底层pino实例\n */\nclass PinoLoggerFactory {\n private static instance: PinoLoggerFactory;\n private pinoLogger: pino.Logger;\n\n private constructor() {\n const isProd = process.env.NODE_ENV === \"production\";\n\n const loggerConfig: pino.LoggerOptions = {\n // 自定义时间戳格式\n timestamp: () => `,\"@timestamp\":\"${new Date().toISOString()}\"`,\n\n // 关闭默认的时间戳键\n base: {\n \"@version\": \"1\",\n app_name: \"lattice\",\n service_name: \"lattice/graph-server\",\n thread_name: \"main\",\n logger_name: \"lattice-graph-logger\",\n },\n\n formatters: {\n level: (label, number) => {\n return {\n level: label.toUpperCase(),\n level_value: number * 1000,\n };\n },\n },\n };\n\n // 生产环境使用文件日志\n if (isProd) {\n try {\n this.pinoLogger = pino(\n loggerConfig,\n pino.transport({\n target: \"pino-roll\",\n options: {\n file: \"./logs/fin_ai_graph_server\",\n frequency: \"daily\",\n mkdir: true,\n },\n })\n );\n } catch (error) {\n console.error(\n \"无法初始化 pino-roll 日志记录器,回退到控制台日志\",\n error\n );\n // 回退到开发环境的配置\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n } else {\n // 开发环境使用格式化输出\n this.pinoLogger = pino({\n ...loggerConfig,\n transport: {\n target: \"pino-pretty\",\n options: {\n colorize: true,\n },\n },\n });\n }\n }\n\n public static getInstance(): PinoLoggerFactory {\n if (!PinoLoggerFactory.instance) {\n PinoLoggerFactory.instance = new PinoLoggerFactory();\n }\n return PinoLoggerFactory.instance;\n }\n\n public getPinoLogger(): pino.Logger {\n return this.pinoLogger;\n }\n}\n\n/**\n * Logger类,可以创建多个实例,每个实例有自己的上下文\n */\nexport class Logger {\n private context: LoggerContext;\n private name: string;\n private serviceName: string;\n\n constructor(options?: LoggerOptions) {\n this.context = options?.context || {};\n this.name = options?.name || \"lattice-graph-logger\";\n this.serviceName = options?.serviceName || \"lattice/graph-server\";\n }\n\n /**\n * 获取合并了上下文的日志对象\n * @param additionalContext 额外的上下文数据\n * @returns 带有上下文的pino日志对象\n */\n private getContextualLogger(additionalContext?: object): pino.Logger {\n const pinoLogger = PinoLoggerFactory.getInstance().getPinoLogger();\n\n // 合并Logger实例的上下文和额外上下文\n const contextObj = {\n \"x-user-id\": this.context[\"x-user-id\"] || \"\",\n \"x-tenant-id\": this.context[\"x-tenant-id\"] || \"\",\n \"x-request-id\": this.context[\"x-request-id\"] || \"\",\n \"x-task-id\": this.context[\"x-task-id\"] || \"\",\n \"x-thread-id\": this.context[\"x-thread-id\"] || \"\",\n service_name: this.serviceName,\n logger_name: this.name,\n ...additionalContext,\n };\n\n // 创建带有上下文的子日志记录器\n return pinoLogger.child(contextObj);\n }\n\n info(msg: string, obj?: object): void {\n this.getContextualLogger(obj).info(msg);\n }\n\n error(msg: string, obj?: object | Error): void {\n this.getContextualLogger(obj).error(msg);\n }\n\n warn(msg: string, obj?: object): void {\n this.getContextualLogger(obj).warn(msg);\n }\n\n debug(msg: string, obj?: object): void {\n this.getContextualLogger(obj).debug(msg);\n }\n\n /**\n * 更新Logger实例的上下文\n */\n updateContext(context: Partial<LoggerContext>): void {\n this.context = {\n ...this.context,\n ...context,\n };\n }\n\n /**\n * 创建一个新的Logger实例,继承当前Logger的上下文\n */\n child(options: Partial<LoggerOptions>): Logger {\n return new Logger({\n name: options.name || this.name,\n serviceName: options.serviceName || this.serviceName,\n context: {\n ...this.context,\n ...options.context,\n },\n });\n }\n}\n"],"mappings":"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","names":["messages","v4","app"]}
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
preset: "ts-jest",
|
|
3
|
+
testEnvironment: "node",
|
|
4
|
+
roots: ["<rootDir>/src"],
|
|
5
|
+
testMatch: ["**/__tests__/**/*.test.ts", "**/?(*.)+(spec|test).ts"],
|
|
6
|
+
transform: {
|
|
7
|
+
"^.+\\.ts$": [
|
|
8
|
+
"ts-jest",
|
|
9
|
+
{
|
|
10
|
+
isolatedModules: true,
|
|
11
|
+
},
|
|
12
|
+
],
|
|
13
|
+
},
|
|
14
|
+
moduleNameMapper: {
|
|
15
|
+
"^@/(.*)$": "<rootDir>/src/$1",
|
|
16
|
+
"^@services/(.*)$": "<rootDir>/src/services/$1",
|
|
17
|
+
"^@utils/(.*)$": "<rootDir>/src/utils/$1",
|
|
18
|
+
"^@types$": "<rootDir>/src/types/index.ts",
|
|
19
|
+
},
|
|
20
|
+
collectCoverageFrom: ["src/**/*.ts", "!src/**/*.d.ts", "!src/__tests__/**/*"],
|
|
21
|
+
coverageReporters: ["text", "lcov", "html"],
|
|
22
|
+
testTimeout: 30000,
|
|
23
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@axiom-lattice/gateway",
|
|
3
|
+
"version": "1.0.20",
|
|
4
|
+
"main": "dist/index.js",
|
|
5
|
+
"module": "dist/index.mjs",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"keywords": [],
|
|
15
|
+
"author": "",
|
|
16
|
+
"license": "ISC",
|
|
17
|
+
"description": "API Gateway for LangGraph agent-based applications",
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@fastify/cors": "^11.0.0",
|
|
20
|
+
"@fastify/sensible": "^6.0.3",
|
|
21
|
+
"@langchain/core": "^0.3.72",
|
|
22
|
+
"@langchain/langgraph": "^0.4.6",
|
|
23
|
+
"@supabase/supabase-js": "^2.49.1",
|
|
24
|
+
"dotenv": "^16.6.1",
|
|
25
|
+
"fastify": "^5.5.0",
|
|
26
|
+
"fastify-plugin": "^5.0.1",
|
|
27
|
+
"lodash": "^4.17.21",
|
|
28
|
+
"pino": "^9.7.0",
|
|
29
|
+
"pino-pretty": "^13.0.0",
|
|
30
|
+
"pino-roll": "^3.1.0",
|
|
31
|
+
"redis": "^5.0.1",
|
|
32
|
+
"uuid": "^9.0.1",
|
|
33
|
+
"@axiom-lattice/core": "1.0.20",
|
|
34
|
+
"@axiom-lattice/protocols": "1.0.20"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/jest": "^29.5.14",
|
|
38
|
+
"@types/lodash": "^4.17.16",
|
|
39
|
+
"@types/node": "^20.17.23",
|
|
40
|
+
"@types/uuid": "^9.0.8",
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
|
42
|
+
"@typescript-eslint/parser": "^7.2.0",
|
|
43
|
+
"eslint": "^8.57.0",
|
|
44
|
+
"jest": "^29.7.0",
|
|
45
|
+
"nodemon": "^3.1.9",
|
|
46
|
+
"ts-jest": "^29.4.0",
|
|
47
|
+
"ts-node": "^10.9.2",
|
|
48
|
+
"tsconfig-paths": "^4.2.0",
|
|
49
|
+
"tsup": "^8.5.0",
|
|
50
|
+
"typescript": "^5.8.2"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"build": "tsup src/index.ts --format cjs,esm --dts --clean --sourcemap",
|
|
54
|
+
"start": "node dist/index.js",
|
|
55
|
+
"dev": "tsup src/index.ts --format cjs,esm --dts --watch --sourcemap",
|
|
56
|
+
"lint": "tsc --noEmit",
|
|
57
|
+
"test": "jest",
|
|
58
|
+
"test:watch": "jest --watch",
|
|
59
|
+
"test:coverage": "jest --coverage"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import dotenv from "dotenv";
|
|
2
|
+
import path from "path";
|
|
3
|
+
|
|
4
|
+
// 加载环境变量
|
|
5
|
+
dotenv.config({ path: path.resolve(__dirname, "../../.env") });
|
|
6
|
+
|
|
7
|
+
export const config = {
|
|
8
|
+
server: {
|
|
9
|
+
port: process.env.PORT || 4001,
|
|
10
|
+
env: process.env.NODE_ENV || "development",
|
|
11
|
+
},
|
|
12
|
+
supabase: {
|
|
13
|
+
url: process.env.SUPABASE_URL || "",
|
|
14
|
+
key: process.env.SUPABASE_KEY || "",
|
|
15
|
+
},
|
|
16
|
+
// langgraph: {
|
|
17
|
+
// apiKey: process.env.LANGGRAPH_API_KEY || "dummy_key",
|
|
18
|
+
// },
|
|
19
|
+
webhook: {
|
|
20
|
+
url: process.env.WEBHOOK_URL || "",
|
|
21
|
+
},
|
|
22
|
+
// java_api_url: process.env.JAVA_API_URL || "",
|
|
23
|
+
// common_api_url: process.env.COMMON_API_URL || "",
|
|
24
|
+
// azure_openai_api_key: process.env.AZURE_OPENAI_API_KEY || "",
|
|
25
|
+
database_url: process.env.DATABASE_URL || "",
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// 验证必要的环境变量
|
|
29
|
+
export const validateConfig = (): void => {
|
|
30
|
+
// 在开发环境中不验证环境变量
|
|
31
|
+
// if (config.server.env === "development") {
|
|
32
|
+
// console.warn("开发环境:跳过环境变量验证");
|
|
33
|
+
// return;
|
|
34
|
+
// }
|
|
35
|
+
// const { supabase, azure_openai_api_key, database_url } = config;
|
|
36
|
+
// if (!supabase.url || !supabase.key) {
|
|
37
|
+
// throw new Error("Supabase URL and key are required");
|
|
38
|
+
// }
|
|
39
|
+
// if (!azure_openai_api_key) {
|
|
40
|
+
// throw new Error("Azure OpenAI API key is required");
|
|
41
|
+
// }
|
|
42
|
+
// if (!database_url) {
|
|
43
|
+
// throw new Error("Database URL is required");
|
|
44
|
+
// }
|
|
45
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
+
import { draw_graph } from "../services/agent_service";
|
|
3
|
+
|
|
4
|
+
export const getAgentGraph = async (
|
|
5
|
+
request: FastifyRequest<{
|
|
6
|
+
Params: { assistantId: string };
|
|
7
|
+
}>,
|
|
8
|
+
reply: FastifyReply
|
|
9
|
+
) => {
|
|
10
|
+
try {
|
|
11
|
+
const { assistantId } = request.params;
|
|
12
|
+
|
|
13
|
+
// 调用绘图服务获取图片数据
|
|
14
|
+
const imageData = await draw_graph(assistantId);
|
|
15
|
+
|
|
16
|
+
// 设置响应头并返回图片数据
|
|
17
|
+
reply.header("Content-Type", "application/json").send({
|
|
18
|
+
image: imageData,
|
|
19
|
+
});
|
|
20
|
+
} catch (error: any) {
|
|
21
|
+
reply.status(500).send({
|
|
22
|
+
success: false,
|
|
23
|
+
error: error.message || "获取代理图表失败",
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
};
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
+
import { agent_messages, agent_state } from "../services/agent_service";
|
|
3
|
+
|
|
4
|
+
// 设置内存项
|
|
5
|
+
export const setMemoryItem = async (
|
|
6
|
+
request: FastifyRequest,
|
|
7
|
+
reply: FastifyReply
|
|
8
|
+
): Promise<void> => {
|
|
9
|
+
try {
|
|
10
|
+
const { assistantId, key } = request.params as {
|
|
11
|
+
assistantId: string;
|
|
12
|
+
key: string;
|
|
13
|
+
};
|
|
14
|
+
const value = request.body;
|
|
15
|
+
|
|
16
|
+
if (!assistantId || !key) {
|
|
17
|
+
reply.status(400).send({
|
|
18
|
+
success: false,
|
|
19
|
+
error: "助手ID和键是必需的",
|
|
20
|
+
});
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (value === undefined) {
|
|
25
|
+
reply.status(400).send({
|
|
26
|
+
success: false,
|
|
27
|
+
error: "值是必需的",
|
|
28
|
+
});
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
//const result = await memoryModel.setMemoryItem(assistantId, key, value);
|
|
33
|
+
|
|
34
|
+
// if (!result.success) {
|
|
35
|
+
reply.status(500).send();
|
|
36
|
+
return;
|
|
37
|
+
// }
|
|
38
|
+
|
|
39
|
+
//reply.send(result);
|
|
40
|
+
} catch (error: any) {
|
|
41
|
+
reply.status(500).send({
|
|
42
|
+
success: false,
|
|
43
|
+
error: `设置内存项时发生错误: ${error.message}`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// 获取内存项
|
|
49
|
+
export const getMemoryItem = async (
|
|
50
|
+
request: FastifyRequest,
|
|
51
|
+
reply: FastifyReply
|
|
52
|
+
): Promise<void> => {
|
|
53
|
+
try {
|
|
54
|
+
const { assistantId, key } = request.params as {
|
|
55
|
+
assistantId: string;
|
|
56
|
+
key: string;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
if (!assistantId || !key) {
|
|
60
|
+
reply.status(400).send({
|
|
61
|
+
success: false,
|
|
62
|
+
error: "助手ID和键是必需的",
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
//const result = await memoryModel.getMemoryItem(assistantId, key);
|
|
68
|
+
|
|
69
|
+
// if (!result.success) {
|
|
70
|
+
reply.status(404).send();
|
|
71
|
+
return;
|
|
72
|
+
// }
|
|
73
|
+
|
|
74
|
+
//reply.send(result);
|
|
75
|
+
} catch (error: any) {
|
|
76
|
+
reply.status(500).send({
|
|
77
|
+
success: false,
|
|
78
|
+
error: `获取内存项时发生错误: ${error.message}`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
// 获取所有内存项
|
|
84
|
+
export const getAllMemoryItems = async (
|
|
85
|
+
request: FastifyRequest,
|
|
86
|
+
reply: FastifyReply
|
|
87
|
+
): Promise<void> => {
|
|
88
|
+
try {
|
|
89
|
+
const { assistantId, thread_id } = request.params as {
|
|
90
|
+
assistantId: string;
|
|
91
|
+
thread_id: string;
|
|
92
|
+
};
|
|
93
|
+
const tenant_id = request.headers["x-tenant-id"] as string;
|
|
94
|
+
|
|
95
|
+
if (!thread_id) {
|
|
96
|
+
reply.status(400).send({
|
|
97
|
+
success: false,
|
|
98
|
+
error: "线程ID是必需的",
|
|
99
|
+
});
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (!assistantId) {
|
|
104
|
+
reply.status(400).send({
|
|
105
|
+
success: false,
|
|
106
|
+
error: "助手ID是必需的",
|
|
107
|
+
});
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const result = await agent_messages({
|
|
112
|
+
assistant_id: assistantId,
|
|
113
|
+
thread_id: thread_id,
|
|
114
|
+
tenant_id: tenant_id,
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
if (!result) {
|
|
118
|
+
reply.status(500).send(result);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
reply.send(result);
|
|
123
|
+
} catch (error: any) {
|
|
124
|
+
reply.status(500).send({
|
|
125
|
+
success: false,
|
|
126
|
+
error: `获取所有内存项时发生错误: ${error.message}`,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
// 获取助手状态
|
|
132
|
+
export const getAgentState = async (
|
|
133
|
+
request: FastifyRequest,
|
|
134
|
+
reply: FastifyReply
|
|
135
|
+
): Promise<void> => {
|
|
136
|
+
try {
|
|
137
|
+
const { assistantId, thread_id } = request.params as {
|
|
138
|
+
assistantId: string;
|
|
139
|
+
thread_id: string;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
if (!thread_id) {
|
|
143
|
+
reply.status(400).send({
|
|
144
|
+
success: false,
|
|
145
|
+
error: "线程ID是必需的",
|
|
146
|
+
});
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (!assistantId) {
|
|
151
|
+
reply.status(400).send({
|
|
152
|
+
success: false,
|
|
153
|
+
error: "助手ID是必需的",
|
|
154
|
+
});
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const result = await agent_state({
|
|
159
|
+
assistant_id: assistantId,
|
|
160
|
+
thread_id: thread_id,
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
if (!result) {
|
|
164
|
+
reply.status(500).send(result);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
reply.send(result);
|
|
169
|
+
} catch (error: any) {
|
|
170
|
+
reply.status(500).send({
|
|
171
|
+
success: false,
|
|
172
|
+
error: `获取助手状态时发生错误: ${error.message}`,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
// 删除内存项
|
|
178
|
+
export const deleteMemoryItem = async (
|
|
179
|
+
request: FastifyRequest,
|
|
180
|
+
reply: FastifyReply
|
|
181
|
+
): Promise<void> => {
|
|
182
|
+
try {
|
|
183
|
+
const { assistantId, key } = request.params as {
|
|
184
|
+
assistantId: string;
|
|
185
|
+
key: string;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
if (!assistantId || !key) {
|
|
189
|
+
reply.status(400).send({
|
|
190
|
+
success: false,
|
|
191
|
+
error: "助手ID和键是必需的",
|
|
192
|
+
});
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
//const result = await memoryModel.deleteMemoryItem(assistantId, key);
|
|
197
|
+
|
|
198
|
+
// if (!result.success) {
|
|
199
|
+
reply.status(500).send();
|
|
200
|
+
return;
|
|
201
|
+
// }
|
|
202
|
+
|
|
203
|
+
reply.status(204).send();
|
|
204
|
+
} catch (error: any) {
|
|
205
|
+
reply.status(500).send({
|
|
206
|
+
success: false,
|
|
207
|
+
error: `删除内存项时发生错误: ${error.message}`,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// 清除内存
|
|
213
|
+
export const clearMemory = async (
|
|
214
|
+
request: FastifyRequest,
|
|
215
|
+
reply: FastifyReply
|
|
216
|
+
): Promise<void> => {
|
|
217
|
+
try {
|
|
218
|
+
const { assistantId } = request.params as { assistantId: string };
|
|
219
|
+
|
|
220
|
+
if (!assistantId) {
|
|
221
|
+
reply.status(400).send({
|
|
222
|
+
success: false,
|
|
223
|
+
error: "助手ID是必需的",
|
|
224
|
+
});
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
let result: any; //= await memoryModel.clearMemory(assistantId);
|
|
229
|
+
|
|
230
|
+
if (!result.success) {
|
|
231
|
+
reply.status(500).send(result);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
reply.status(204).send();
|
|
236
|
+
} catch (error: any) {
|
|
237
|
+
reply.status(500).send({
|
|
238
|
+
success: false,
|
|
239
|
+
error: `清除内存时发生错误: ${error.message}`,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
};
|