@axiom-lattice/gateway 1.0.20 → 1.0.22

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @axiom-lattice/gateway@1.0.10 build /home/runner/work/agentic/agentic/packages/gateway
2
+ > @axiom-lattice/gateway@1.0.11 build /home/runner/work/agentic/agentic/packages/gateway
3
3
  > tsup src/index.ts --format cjs,esm --dts --clean --sourcemap
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -9,13 +9,13 @@
9
9
  CLI Cleaning output folder
10
10
  CJS Build start
11
11
  ESM Build start
12
- CJS dist/index.js 19.40 KB
13
- CJS dist/index.js.map 42.46 KB
14
- CJS ⚡️ Build success in 74ms
15
- ESM dist/index.mjs 17.31 KB
16
- ESM dist/index.mjs.map 42.34 KB
17
- ESM ⚡️ Build success in 75ms
12
+ CJS dist/index.js 18.73 KB
13
+ CJS dist/index.js.map 38.46 KB
14
+ CJS ⚡️ Build success in 84ms
15
+ ESM dist/index.mjs 16.71 KB
16
+ ESM dist/index.mjs.map 38.37 KB
17
+ ESM ⚡️ Build success in 87ms
18
18
  DTS Build start
19
- DTS ⚡️ Build success in 5664ms
20
- DTS dist/index.d.ts 109.00 B
21
- DTS dist/index.d.mts 109.00 B
19
+ DTS ⚡️ Build success in 4259ms
20
+ DTS dist/index.d.ts 737.00 B
21
+ DTS dist/index.d.mts 737.00 B
package/dist/index.d.mts CHANGED
@@ -1,5 +1,13 @@
1
+ import * as fastify from 'fastify';
2
+ import * as http from 'http';
3
+
1
4
  declare const LatticeGateway: {
2
- startAsHttpEndpoint: () => Promise<void>;
5
+ startAsHttpEndpoint: ({ port }: {
6
+ port: number;
7
+ }) => Promise<void>;
8
+ app: fastify.FastifyInstance<http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>, http.IncomingMessage, http.ServerResponse<http.IncomingMessage>, fastify.FastifyBaseLogger, fastify.FastifyTypeProviderDefault> & PromiseLike<fastify.FastifyInstance<http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>, http.IncomingMessage, http.ServerResponse<http.IncomingMessage>, fastify.FastifyBaseLogger, fastify.FastifyTypeProviderDefault>> & {
9
+ __linterBrands: "SafePromiseLike";
10
+ };
3
11
  };
4
12
 
5
13
  export { LatticeGateway };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,13 @@
1
+ import * as fastify from 'fastify';
2
+ import * as http from 'http';
3
+
1
4
  declare const LatticeGateway: {
2
- startAsHttpEndpoint: () => Promise<void>;
5
+ startAsHttpEndpoint: ({ port }: {
6
+ port: number;
7
+ }) => Promise<void>;
8
+ app: fastify.FastifyInstance<http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>, http.IncomingMessage, http.ServerResponse<http.IncomingMessage>, fastify.FastifyBaseLogger, fastify.FastifyTypeProviderDefault> & PromiseLike<fastify.FastifyInstance<http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>, http.IncomingMessage, http.ServerResponse<http.IncomingMessage>, fastify.FastifyBaseLogger, fastify.FastifyTypeProviderDefault>> & {
9
+ __linterBrands: "SafePromiseLike";
10
+ };
3
11
  };
4
12
 
5
13
  export { LatticeGateway };
package/dist/index.js CHANGED
@@ -37,33 +37,6 @@ var import_fastify = __toESM(require("fastify"));
37
37
  var import_cors = __toESM(require("@fastify/cors"));
38
38
  var import_sensible = __toESM(require("@fastify/sensible"));
39
39
 
40
- // src/config/index.ts
41
- var import_dotenv = __toESM(require("dotenv"));
42
- var import_path = __toESM(require("path"));
43
- import_dotenv.default.config({ path: import_path.default.resolve(__dirname, "../../.env") });
44
- var config = {
45
- server: {
46
- port: process.env.PORT || 4001,
47
- env: process.env.NODE_ENV || "development"
48
- },
49
- supabase: {
50
- url: process.env.SUPABASE_URL || "",
51
- key: process.env.SUPABASE_KEY || ""
52
- },
53
- // langgraph: {
54
- // apiKey: process.env.LANGGRAPH_API_KEY || "dummy_key",
55
- // },
56
- webhook: {
57
- url: process.env.WEBHOOK_URL || ""
58
- },
59
- // java_api_url: process.env.JAVA_API_URL || "",
60
- // common_api_url: process.env.COMMON_API_URL || "",
61
- // azure_openai_api_key: process.env.AZURE_OPENAI_API_KEY || "",
62
- database_url: process.env.DATABASE_URL || ""
63
- };
64
- var validateConfig = () => {
65
- };
66
-
67
40
  // src/services/agent_service.ts
68
41
  var import_messages = require("@langchain/core/messages");
69
42
  var import_langgraph = require("@langchain/langgraph");
@@ -143,7 +116,14 @@ async function agent_stream({
143
116
  try {
144
117
  for await (const chunk of agentStream) {
145
118
  let data;
146
- if (chunk[0] === "messages") {
119
+ if (chunk[0] === "updates") {
120
+ const update = chunk[1];
121
+ const values = Object.values(update);
122
+ const messages2 = values[0].messages;
123
+ if (messages2?.[0]?.tool_call_id) {
124
+ data = messages2[0].toDict();
125
+ }
126
+ } else if (chunk[0] === "messages") {
147
127
  const messages2 = chunk[1];
148
128
  data = messages2?.[0]?.toDict();
149
129
  }
@@ -151,7 +131,6 @@ async function agent_stream({
151
131
  data = chunk?.[1]?.[0]?.toDict();
152
132
  }
153
133
  if (data) {
154
- console.log(data);
155
134
  yield data;
156
135
  }
157
136
  }
@@ -634,12 +613,6 @@ var Logger = class _Logger {
634
613
  process.on("unhandledRejection", (reason, promise) => {
635
614
  console.error("\u672A\u5904\u7406\u7684Promise\u62D2\u7EDD:", reason);
636
615
  });
637
- try {
638
- validateConfig();
639
- } catch (error) {
640
- console.error("\u914D\u7F6E\u9519\u8BEF:", error.message);
641
- process.exit(1);
642
- }
643
616
  var logger = new Logger({
644
617
  serviceName: "lattice-gateway",
645
618
  name: "fastify-server"
@@ -697,19 +670,19 @@ app.setErrorHandler((error, request, reply) => {
697
670
  });
698
671
  app.decorate("logger", logger);
699
672
  registerRoutes(app);
700
- var start = async () => {
673
+ var start = async ({ port }) => {
701
674
  try {
702
- const port = Number(config.server.port);
703
- await app.listen({ port, host: "0.0.0.0" });
675
+ const target_port = port || Number(process.env.PORT) || 4001;
676
+ await app.listen({ port: target_port, host: "0.0.0.0" });
704
677
  logger.info(`Lattice Gateway is running on port: ${port}`);
705
- logger.info(`Environment: ${config.server.env}`);
706
678
  } catch (err) {
707
679
  logger.error("Server start failed", { error: err });
708
680
  process.exit(1);
709
681
  }
710
682
  };
711
683
  var LatticeGateway = {
712
- startAsHttpEndpoint: start
684
+ startAsHttpEndpoint: start,
685
+ app
713
686
  };
714
687
  // Annotate the CommonJS export names for ESM import in node:
715
688
  0 && (module.exports = {
package/dist/index.js.map CHANGED
@@ -1 +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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,kBAAiB;AACjB,sBAAqB;;;ACFrB,oBAAmB;AACnB,kBAAiB;AAGjB,cAAAA,QAAO,OAAO,EAAE,MAAM,YAAAC,QAAK,QAAQ,WAAW,YAAY,EAAE,CAAC;AAEtD,IAAM,SAAS;AAAA,EACpB,QAAQ;AAAA,IACN,MAAM,QAAQ,IAAI,QAAQ;AAAA,IAC1B,KAAK,QAAQ,IAAI,YAAY;AAAA,EAC/B;AAAA,EACA,UAAU;AAAA,IACR,KAAK,QAAQ,IAAI,gBAAgB;AAAA,IACjC,KAAK,QAAQ,IAAI,gBAAgB;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS;AAAA,IACP,KAAK,QAAQ,IAAI,eAAe;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAIA,cAAc,QAAQ,IAAI,gBAAgB;AAC5C;AAGO,IAAM,iBAAiB,MAAY;AAgB1C;;;AC5CA,sBAQO;AACP,uBAAuC;AACvC,kBAAmB;AAEnB,kBAAgD;AAehD,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,qBAAiB,6BAAgB,YAAY,GAAG;AACtD,QAAM,EAAE,OAAO,SAAS,GAAG,KAAK,IAAI;AACpC,QAAM,eAAe,IAAI,6BAAa,WAAW,EAAE;AACnD,eAAa,oBAAoB,EAAE,MAAa;AAChD,QAAM,WAAW,CAAC,YAAY;AAC9B,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AAEA,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC,UACI,IAAI,yBAAQ,OAAO,IACnB,EAAE,GAAG,MAAM,UAAU,eAAe,UAAU;AAAA,IAClD;AAAA,MACE,cAAc;AAAA,QACZ;AAAA,QACA,QAAQ,cAAU,gBAAG;AAAA,QACrB,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,qBAAiB,4BAAe,YAAY;AAClD,QAAM,EAAE,OAAO,SAAS,GAAG,KAAK,IAAI;AACpC,MAAI,WAA0B,CAAC;AAC/B,MAAI,CAAC,SAAS;AACZ,UAAM,eAAe,IAAI,6BAAa,OAAO;AAC7C,iBAAa,oBAAoB,EAAE,MAAa;AAChD,eAAW,CAAC,YAAY;AAAA,EAC1B;AAEA,MAAI;AACF,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,IACnD;AACA,UAAM,cAAc,MAAM,eAAe;AAAA,MACvC,UACI,IAAI,yBAAQ,OAAO,IACnB;AAAA,QACE,GAAG;AAAA,QACH;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,MAEJ;AAAA,QACE,cAAc;AAAA,UACZ;AAAA,UACA,QAAQ,cAAU,gBAAG;AAAA,UACrB,eAAe;AAAA,UACf,gBAAgB;AAAA,UAChB,eAAe;AAAA,QACjB;AAAA,QACA,YAAY,CAAC,WAAW,UAAU;AAAA,QAClC,WAAW;AAAA,MACb;AAAA,IACF;AAGA,WAAO;AAAA,MACL,CAAC,OAAO,aAAa,GAAG,mBAAmB;AACzC,YAAI;AACF,2BAAiB,SAAS,aAAa;AAErC,gBAAI;AAWJ,gBAAI,MAAM,CAAC,MAAM,YAAY;AAE3B,oBAAMC,YAAW,MAAM,CAAC;AACxB,qBAAOA,YAAW,CAAC,GAAG,OAAO;AAAA,YA8C/B;AAEA,gBAAK,QAAQ,CAAC,GAAW,eAAe;AACtC,qBAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO;AAAA,YAWjC;AAEA,gBAAI,MAAM;AACR,sBAAQ,IAAI,IAAI;AAChB,oBAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,iBAAiB,KAAK;AACpC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,YAAY;AAAA,EAChC;AAAA,EACA;AACF,GAGG;AACD,QAAM,qBAAiB,4BAAe,YAAY;AAClD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AACA,QAAM,QAAQ,MAAM,eAAe,SAAS;AAAA,IAC1C,cAAc,EAAE,WAAsB,WAAW,MAAM;AAAA,EACzD,CAAC;AACD,SAAO;AACT;AAEA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,qBAAiB,4BAAe,YAAY;AAClD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AACA,QAAM,QAAQ,MAAM,eAAe,SAAS;AAAA,IAC1C,cAAc,EAAE,WAAsB,WAAW,MAAM;AAAA,EACzD,CAAC;AAED,QAAM,WAAW,MAAM,OAAO,YAAY,CAAC;AAC3C,QAAM,uBAAmB,gCAAe,UAAU;AAAA,IAChD,cAAc,CAAC,MAAM,SAAS,MAAM;AAAA;AAAA,EACtC,CAAC;AAID,MAAI,gBAAgB,iBAAiB,IAAI,CAAC,aAA0B;AAAA,IAClE,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ,QAAQ;AAAA,IACtB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ,kBAAkB;AAAA,IACjC,GAAG,QAAQ;AAAA,EACb,EAAE;AAEF,QAAM,kBAAkB,MAAM,MAAM,QAAQ,CAAC,SAAS;AACpD,WAAO,KAAK,WAAW,IAAI,CAAC,cAAc;AACxC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,UAAU;AAAA,QACnB,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,QAAM,eAAe,CAAC,GAAG,eAAe,GAAG,eAAe;AAG1D,SAAO;AACT;AAEA,eAAsB,WAAW,cAAsB;AACrD,QAAM,qBAAiB,4BAAe,YAAY;AAClD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AACA,QAAM,gBAAgB,MAAM,eAAe,cAAc;AACzD,QAAM,QAAQ,MAAM,cAAc,YAAY;AAC9C,SAAO;AACT;;;AChSA,IAAAC,eAAmB;AAGZ,IAAM,YAAY,OACvB,SACA,UACkB;AAClB,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,IAAI,QAAQ;AAEZ,UAAM,YAAY,QAAQ,QAAQ,aAAa;AAC/C,UAAM,eAAgB,QAAQ,QAAQ,cAAc,SAAgB,iBAAG;AAGvE,QAAI,CAAC,cAAc;AACjB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAGA,QAAI,WAAW;AAEb,YAAM,SAAS,MAAmB,aAAa;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAGD,YAAM,IAAI,UAAU,KAAK;AAAA,QACvB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,+BAA+B;AAAA,MACjC,CAAC;AAED,UAAI;AACF,yBAAiB,SAAS,QAAQ;AAChC,gBAAM,IAAI,MAAM,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA,CAAM;AAAA,QACtD;AAAA,MACF,SAAS,OAAO;AAAA,MAEhB,UAAE;AACA,cAAM,IAAI,IAAI;AAEd,eAAO,MAAM,OAAO;AAAA,MACtB;AAAA,IACF,OAAO;AAEL,YAAM,SAAS,MAAmB,aAAa;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAAA,IAC/B;AAAA,EACF,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,2DAAc,MAAM,OAAO;AAAA,IACpC,CAAC;AAAA,EACH;AACF;;;AC7EO,IAAM,gBAAgB,OAC3B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,IAAI,QAAQ;AAIrC,UAAM,QAAQ,QAAQ;AAEtB,QAAI,CAAC,eAAe,CAAC,KAAK;AACxB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,UAAU,QAAW;AACvB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,GAAG,EAAE,KAAK;AACvB;AAAA,EAIF,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,iEAAe,MAAM,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,gBAAgB,OAC3B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,IAAI,QAAQ;AAKrC,QAAI,CAAC,eAAe,CAAC,KAAK;AACxB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,GAAG,EAAE,KAAK;AACvB;AAAA,EAIF,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,iEAAe,MAAM,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,oBAAoB,OAC/B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,UAAU,IAAI,QAAQ;AAI3C,UAAM,YAAY,QAAQ,QAAQ,aAAa;AAE/C,QAAI,CAAC,WAAW;AACd,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,eAAe;AAAA,MAClC,cAAc;AAAA,MACd;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ;AACX,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAC7B;AAAA,IACF;AAEA,UAAM,KAAK,MAAM;AAAA,EACnB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,6EAAiB,MAAM,OAAO;AAAA,IACvC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,gBAAgB,OAC3B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,UAAU,IAAI,QAAQ;AAK3C,QAAI,CAAC,WAAW;AACd,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,YAAY;AAAA,MAC/B,cAAc;AAAA,MACd;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ;AACX,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAC7B;AAAA,IACF;AAEA,UAAM,KAAK,MAAM;AAAA,EACnB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,uEAAgB,MAAM,OAAO;AAAA,IACtC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,mBAAmB,OAC9B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,IAAI,QAAQ;AAKrC,QAAI,CAAC,eAAe,CAAC,KAAK;AACxB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,GAAG,EAAE,KAAK;AACvB;AAGA,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,EACzB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,iEAAe,MAAM,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,cAAc,OACzB,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,YAAY,IAAI,QAAQ;AAEhC,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI;AAEJ,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAC7B;AAAA,IACF;AAEA,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,EACzB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,2DAAc,MAAM,OAAO;AAAA,IACpC,CAAC;AAAA,EACH;AACF;;;AC9OO,IAAM,gBAAgB,OAC3B,SAGA,UACG;AACH,MAAI;AACF,UAAM,EAAE,YAAY,IAAI,QAAQ;AAGhC,UAAM,YAAY,MAAM,WAAW,WAAW;AAG9C,UAAM,OAAO,gBAAgB,kBAAkB,EAAE,KAAK;AAAA,MACpD,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,MAAM,WAAW;AAAA,IAC1B,CAAC;AAAA,EACH;AACF;;;ACnBO,IAAM,iBAAiB,CAACC,SAA+B;AAE5D,EAAAA,KAAI,KAED,aAA2B,SAAS;AAevC,EAAAA,KAAI;AAAA,IAGF;AAAA,IACiB;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACiB;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACiB;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAIF;AAAA,IACiB;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACiB;AAAA,EACnB;AAEA,EAAAA,KAAI,OAED,uCAAwD,WAAW;AAGtE,EAAAA,KAAI,IAED,sCAAsD,aAAa;AACxE;;;ACrEA,kBAAiB;AACjB,yBAAO;AACP,uBAAO;AAoBP,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAId,cAAc;AACpB,UAAM,SAAS,QAAQ,IAAI,aAAa;AAExC,UAAM,eAAmC;AAAA;AAAA,MAEvC,WAAW,MAAM,mBAAkB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA,MAG3D,MAAM;AAAA,QACJ,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,cAAc;AAAA,QACd,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,MAEA,YAAY;AAAA,QACV,OAAO,CAAC,OAAO,WAAW;AACxB,iBAAO;AAAA,YACL,OAAO,MAAM,YAAY;AAAA,YACzB,aAAa,SAAS;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ;AACV,UAAI;AACF,aAAK,iBAAa,YAAAC;AAAA,UAChB;AAAA,UACA,YAAAA,QAAK,UAAU;AAAA,YACb,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,MAAM;AAAA,cACN,WAAW;AAAA,cACX,OAAO;AAAA,YACT;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAEA,aAAK,iBAAa,YAAAA,SAAK;AAAA,UACrB,GAAG;AAAA,UACH,WAAW;AAAA,YACT,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AAEL,WAAK,iBAAa,YAAAA,SAAK;AAAA,QACrB,GAAG;AAAA,QACH,WAAW;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAc,cAAiC;AAC7C,QAAI,CAAC,mBAAkB,UAAU;AAC/B,yBAAkB,WAAW,IAAI,mBAAkB;AAAA,IACrD;AACA,WAAO,mBAAkB;AAAA,EAC3B;AAAA,EAEO,gBAA6B;AAClC,WAAO,KAAK;AAAA,EACd;AACF;AAKO,IAAM,SAAN,MAAM,QAAO;AAAA,EAKlB,YAAY,SAAyB;AACnC,SAAK,UAAU,SAAS,WAAW,CAAC;AACpC,SAAK,OAAO,SAAS,QAAQ;AAC7B,SAAK,cAAc,SAAS,eAAe;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,mBAAyC;AACnE,UAAM,aAAa,kBAAkB,YAAY,EAAE,cAAc;AAGjE,UAAM,aAAa;AAAA,MACjB,aAAa,KAAK,QAAQ,WAAW,KAAK;AAAA,MAC1C,eAAe,KAAK,QAAQ,aAAa,KAAK;AAAA,MAC9C,gBAAgB,KAAK,QAAQ,cAAc,KAAK;AAAA,MAChD,aAAa,KAAK,QAAQ,WAAW,KAAK;AAAA,MAC1C,eAAe,KAAK,QAAQ,aAAa,KAAK;AAAA,MAC9C,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,GAAG;AAAA,IACL;AAGA,WAAO,WAAW,MAAM,UAAU;AAAA,EACpC;AAAA,EAEA,KAAK,KAAa,KAAoB;AACpC,SAAK,oBAAoB,GAAG,EAAE,KAAK,GAAG;AAAA,EACxC;AAAA,EAEA,MAAM,KAAa,KAA4B;AAC7C,SAAK,oBAAoB,GAAG,EAAE,MAAM,GAAG;AAAA,EACzC;AAAA,EAEA,KAAK,KAAa,KAAoB;AACpC,SAAK,oBAAoB,GAAG,EAAE,KAAK,GAAG;AAAA,EACxC;AAAA,EAEA,MAAM,KAAa,KAAoB;AACrC,SAAK,oBAAoB,GAAG,EAAE,MAAM,GAAG;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAuC;AACnD,SAAK,UAAU;AAAA,MACb,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAyC;AAC7C,WAAO,IAAI,QAAO;AAAA,MAChB,MAAM,QAAQ,QAAQ,KAAK;AAAA,MAC3B,aAAa,QAAQ,eAAe,KAAK;AAAA,MACzC,SAAS;AAAA,QACP,GAAG,KAAK;AAAA,QACR,GAAG,QAAQ;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;APjLA,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,YAAY;AACpD,UAAQ,MAAM,gDAAkB,MAAM;AAExC,CAAC;AAGD,IAAI;AACF,iBAAe;AACjB,SAAS,OAAY;AACnB,UAAQ,MAAM,6BAAS,MAAM,OAAO;AACpC,UAAQ,KAAK,CAAC;AAChB;AAGA,IAAM,SAAS,IAAI,OAAO;AAAA,EACxB,aAAa;AAAA,EACb,MAAM;AACR,CAAC;AAGD,IAAM,UAAM,eAAAC,SAAQ;AAAA,EAClB,QAAQ;AAAA;AACV,CAAC;AAGD,IAAI,QAAQ,aAAa,CAAC,SAAS,OAAO,SAAS;AACjD,QAAM,UAAU;AAAA,IACd,eAAe,QAAQ,QAAQ,aAAa;AAAA,IAC5C,gBAAgB,QAAQ,QAAQ,cAAc;AAAA,EAChD;AACA,OAAK;AACP,CAAC;AAED,IAAI,QAAQ,cAAc,CAAC,SAAS,OAAO,SAAS;AAClD,QAAM,UAAU;AAAA,IACd,eAAe,QAAQ,QAAQ,aAAa;AAAA,IAC5C,gBAAgB,QAAQ,QAAQ,cAAc;AAAA,EAChD;AACA,OAAK;AACP,CAAC;AAGD,IAAI,SAAS,YAAAC,SAAM;AAAA,EACjB,QAAQ;AAAA,EACR,SAAS,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS;AAAA,EACnD,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB,CAAC,cAAc;AAAA,EAC/B,aAAa;AACf,CAAC;AACD,IAAI,SAAS,gBAAAC,OAAQ;AAGrB,IAAI,gBAAgB,CAAC,OAAO,SAAS,UAAU;AAC7C,QAAM,UAAU;AAAA,IACd,eAAe,QAAQ,QAAQ,aAAa;AAAA,IAC5C,gBAAgB,QAAQ,QAAQ,cAAc;AAAA,EAChD;AACA,SAAO;AAAA,IACL,6BAAS,QAAQ,MAAM,IAAI,QAAQ,GAAG,UAAU,MAAM,OAAO;AAAA,IAC7D;AAAA,MACE,GAAG;AAAA,MACH,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MACb,YAAY,MAAM,cAAc;AAAA,IAClC;AAAA,EACF;AACA,QAAM,OAAO,MAAM,cAAc,GAAG,EAAE,KAAK;AAAA,IACzC,SAAS;AAAA,IACT,OAAO,MAAM,WAAW;AAAA,EAC1B,CAAC;AACH,CAAC;AAGD,IAAI,SAAS,UAAU,MAAM;AAG7B,eAAe,GAAG;AAGlB,IAAM,QAAQ,YAAY;AACxB,MAAI;AACF,UAAM,OAAO,OAAO,OAAO,OAAO,IAAI;AACtC,UAAM,IAAI,OAAO,EAAE,MAAM,MAAM,UAAU,CAAC;AAC1C,WAAO,KAAK,uCAAuC,IAAI,EAAE;AACzD,WAAO,KAAK,gBAAgB,OAAO,OAAO,GAAG,EAAE;AAAA,EACjD,SAAS,KAAK;AACZ,WAAO,MAAM,uBAAuB,EAAE,OAAO,IAAI,CAAC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,IAAM,iBAAiB;AAAA,EACrB,qBAAqB;AACvB;","names":["dotenv","path","messages","import_uuid","app","pino","fastify","cors","sensible"]}
1
+ {"version":3,"sources":["../src/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 { 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// 创建自定义日志记录器\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 ({ port }: { port: number }) => {\n try {\n const target_port = port || Number(process.env.PORT) || 4001;\n await app.listen({ port: target_port, host: \"0.0.0.0\" });\n logger.info(`Lattice Gateway is running on port: ${port}`);\n } catch (err) {\n logger.error(\"Server start failed\", { error: err });\n process.exit(1);\n }\n};\n\nconst LatticeGateway = {\n startAsHttpEndpoint: start,\n app,\n};\n\nexport { LatticeGateway };\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 let data;\n if (chunk[0] === \"updates\") {\n const update = chunk[1];\n const values = Object.values(update);\n const messages = values[0].messages;\n if (messages?.[0]?.tool_call_id) {\n data = messages[0].toDict();\n }\n } else if (chunk[0] === \"messages\") {\n const messages = chunk[1];\n // console.log(messages);\n data = messages?.[0]?.toDict();\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","import_uuid","app","pino","fastify","cors","sensible"]}
package/dist/index.mjs CHANGED
@@ -3,33 +3,6 @@ import fastify from "fastify";
3
3
  import cors from "@fastify/cors";
4
4
  import sensible from "@fastify/sensible";
5
5
 
6
- // src/config/index.ts
7
- import dotenv from "dotenv";
8
- import path from "path";
9
- dotenv.config({ path: path.resolve(__dirname, "../../.env") });
10
- var config = {
11
- server: {
12
- port: process.env.PORT || 4001,
13
- env: process.env.NODE_ENV || "development"
14
- },
15
- supabase: {
16
- url: process.env.SUPABASE_URL || "",
17
- key: process.env.SUPABASE_KEY || ""
18
- },
19
- // langgraph: {
20
- // apiKey: process.env.LANGGRAPH_API_KEY || "dummy_key",
21
- // },
22
- webhook: {
23
- url: process.env.WEBHOOK_URL || ""
24
- },
25
- // java_api_url: process.env.JAVA_API_URL || "",
26
- // common_api_url: process.env.COMMON_API_URL || "",
27
- // azure_openai_api_key: process.env.AZURE_OPENAI_API_KEY || "",
28
- database_url: process.env.DATABASE_URL || ""
29
- };
30
- var validateConfig = () => {
31
- };
32
-
33
6
  // src/services/agent_service.ts
34
7
  import {
35
8
  filterMessages,
@@ -112,7 +85,14 @@ async function agent_stream({
112
85
  try {
113
86
  for await (const chunk of agentStream) {
114
87
  let data;
115
- if (chunk[0] === "messages") {
88
+ if (chunk[0] === "updates") {
89
+ const update = chunk[1];
90
+ const values = Object.values(update);
91
+ const messages2 = values[0].messages;
92
+ if (messages2?.[0]?.tool_call_id) {
93
+ data = messages2[0].toDict();
94
+ }
95
+ } else if (chunk[0] === "messages") {
116
96
  const messages2 = chunk[1];
117
97
  data = messages2?.[0]?.toDict();
118
98
  }
@@ -120,7 +100,6 @@ async function agent_stream({
120
100
  data = chunk?.[1]?.[0]?.toDict();
121
101
  }
122
102
  if (data) {
123
- console.log(data);
124
103
  yield data;
125
104
  }
126
105
  }
@@ -603,12 +582,6 @@ var Logger = class _Logger {
603
582
  process.on("unhandledRejection", (reason, promise) => {
604
583
  console.error("\u672A\u5904\u7406\u7684Promise\u62D2\u7EDD:", reason);
605
584
  });
606
- try {
607
- validateConfig();
608
- } catch (error) {
609
- console.error("\u914D\u7F6E\u9519\u8BEF:", error.message);
610
- process.exit(1);
611
- }
612
585
  var logger = new Logger({
613
586
  serviceName: "lattice-gateway",
614
587
  name: "fastify-server"
@@ -666,19 +639,19 @@ app.setErrorHandler((error, request, reply) => {
666
639
  });
667
640
  app.decorate("logger", logger);
668
641
  registerRoutes(app);
669
- var start = async () => {
642
+ var start = async ({ port }) => {
670
643
  try {
671
- const port = Number(config.server.port);
672
- await app.listen({ port, host: "0.0.0.0" });
644
+ const target_port = port || Number(process.env.PORT) || 4001;
645
+ await app.listen({ port: target_port, host: "0.0.0.0" });
673
646
  logger.info(`Lattice Gateway is running on port: ${port}`);
674
- logger.info(`Environment: ${config.server.env}`);
675
647
  } catch (err) {
676
648
  logger.error("Server start failed", { error: err });
677
649
  process.exit(1);
678
650
  }
679
651
  };
680
652
  var LatticeGateway = {
681
- startAsHttpEndpoint: start
653
+ startAsHttpEndpoint: start,
654
+ app
682
655
  };
683
656
  export {
684
657
  LatticeGateway
@@ -1 +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"]}
1
+ {"version":3,"sources":["../src/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 { 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// 创建自定义日志记录器\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 ({ port }: { port: number }) => {\n try {\n const target_port = port || Number(process.env.PORT) || 4001;\n await app.listen({ port: target_port, host: \"0.0.0.0\" });\n logger.info(`Lattice Gateway is running on port: ${port}`);\n } catch (err) {\n logger.error(\"Server start failed\", { error: err });\n process.exit(1);\n }\n};\n\nconst LatticeGateway = {\n startAsHttpEndpoint: start,\n app,\n};\n\nexport { LatticeGateway };\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 let data;\n if (chunk[0] === \"updates\") {\n const update = chunk[1];\n const values = Object.values(update);\n const messages = values[0].messages;\n if (messages?.[0]?.tool_call_id) {\n data = messages[0].toDict();\n }\n } else if (chunk[0] === \"messages\") {\n const messages = chunk[1];\n // console.log(messages);\n data = messages?.[0]?.toDict();\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":";AAAA,OAAO,aAAa;AACpB,OAAO,UAAU;AACjB,OAAO,cAAc;;;ACFrB;AAAA,EAIE;AAAA,EACA;AAAA,OAGK;AACP,SAAS,eAA8B;AACvC,SAAS,UAAU;AAEnB,SAAS,gBAAgB,uBAAuB;AAehD,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,iBAAiB,gBAAgB,YAAY,GAAG;AACtD,QAAM,EAAE,OAAO,SAAS,GAAG,KAAK,IAAI;AACpC,QAAM,eAAe,IAAI,aAAa,WAAW,EAAE;AACnD,eAAa,oBAAoB,EAAE,MAAa;AAChD,QAAM,WAAW,CAAC,YAAY;AAC9B,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AAEA,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC,UACI,IAAI,QAAQ,OAAO,IACnB,EAAE,GAAG,MAAM,UAAU,eAAe,UAAU;AAAA,IAClD;AAAA,MACE,cAAc;AAAA,QACZ;AAAA,QACA,QAAQ,UAAU,GAAG;AAAA,QACrB,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,iBAAiB,eAAe,YAAY;AAClD,QAAM,EAAE,OAAO,SAAS,GAAG,KAAK,IAAI;AACpC,MAAI,WAA0B,CAAC;AAC/B,MAAI,CAAC,SAAS;AACZ,UAAM,eAAe,IAAI,aAAa,OAAO;AAC7C,iBAAa,oBAAoB,EAAE,MAAa;AAChD,eAAW,CAAC,YAAY;AAAA,EAC1B;AAEA,MAAI;AACF,QAAI,CAAC,gBAAgB;AACnB,YAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,IACnD;AACA,UAAM,cAAc,MAAM,eAAe;AAAA,MACvC,UACI,IAAI,QAAQ,OAAO,IACnB;AAAA,QACE,GAAG;AAAA,QACH;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,MAEJ;AAAA,QACE,cAAc;AAAA,UACZ;AAAA,UACA,QAAQ,UAAU,GAAG;AAAA,UACrB,eAAe;AAAA,UACf,gBAAgB;AAAA,UAChB,eAAe;AAAA,QACjB;AAAA,QACA,YAAY,CAAC,WAAW,UAAU;AAAA,QAClC,WAAW;AAAA,MACb;AAAA,IACF;AAGA,WAAO;AAAA,MACL,CAAC,OAAO,aAAa,GAAG,mBAAmB;AACzC,YAAI;AACF,2BAAiB,SAAS,aAAa;AACrC,gBAAI;AACJ,gBAAI,MAAM,CAAC,MAAM,WAAW;AAC1B,oBAAM,SAAS,MAAM,CAAC;AACtB,oBAAM,SAAS,OAAO,OAAO,MAAM;AACnC,oBAAMA,YAAW,OAAO,CAAC,EAAE;AAC3B,kBAAIA,YAAW,CAAC,GAAG,cAAc;AAC/B,uBAAOA,UAAS,CAAC,EAAE,OAAO;AAAA,cAC5B;AAAA,YACF,WAAW,MAAM,CAAC,MAAM,YAAY;AAClC,oBAAMA,YAAW,MAAM,CAAC;AAExB,qBAAOA,YAAW,CAAC,GAAG,OAAO;AAAA,YAC/B;AAEA,gBAAK,QAAQ,CAAC,GAAW,eAAe;AACtC,qBAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO;AAAA,YAWjC;AAEA,gBAAI,MAAM;AAER,oBAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,MAAM,iBAAiB,KAAK;AACpC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,YAAY;AAAA,EAChC;AAAA,EACA;AACF,GAGG;AACD,QAAM,iBAAiB,eAAe,YAAY;AAClD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AACA,QAAM,QAAQ,MAAM,eAAe,SAAS;AAAA,IAC1C,cAAc,EAAE,WAAsB,WAAW,MAAM;AAAA,EACzD,CAAC;AACD,SAAO;AACT;AAEA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,iBAAiB,eAAe,YAAY;AAClD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AACA,QAAM,QAAQ,MAAM,eAAe,SAAS;AAAA,IAC1C,cAAc,EAAE,WAAsB,WAAW,MAAM;AAAA,EACzD,CAAC;AAED,QAAM,WAAW,MAAM,OAAO,YAAY,CAAC;AAC3C,QAAM,mBAAmB,eAAe,UAAU;AAAA,IAChD,cAAc,CAAC,MAAM,SAAS,MAAM;AAAA;AAAA,EACtC,CAAC;AAID,MAAI,gBAAgB,iBAAiB,IAAI,CAAC,aAA0B;AAAA,IAClE,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ,QAAQ;AAAA,IACtB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ,kBAAkB;AAAA,IACjC,GAAG,QAAQ;AAAA,EACb,EAAE;AAEF,QAAM,kBAAkB,MAAM,MAAM,QAAQ,CAAC,SAAS;AACpD,WAAO,KAAK,WAAW,IAAI,CAAC,cAAc;AACxC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,UAAU;AAAA,QACnB,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,QAAM,eAAe,CAAC,GAAG,eAAe,GAAG,eAAe;AAG1D,SAAO;AACT;AAEA,eAAsB,WAAW,cAAsB;AACrD,QAAM,iBAAiB,eAAe,YAAY;AAClD,MAAI,CAAC,gBAAgB;AACnB,UAAM,IAAI,MAAM,SAAS,YAAY,YAAY;AAAA,EACnD;AACA,QAAM,gBAAgB,MAAM,eAAe,cAAc;AACzD,QAAM,QAAQ,MAAM,cAAc,YAAY;AAC9C,SAAO;AACT;;;AC/OA,SAAS,MAAAC,WAAU;AAGZ,IAAM,YAAY,OACvB,SACA,UACkB;AAClB,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,IAAI,QAAQ;AAEZ,UAAM,YAAY,QAAQ,QAAQ,aAAa;AAC/C,UAAM,eAAgB,QAAQ,QAAQ,cAAc,KAAgBA,IAAG;AAGvE,QAAI,CAAC,cAAc;AACjB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAGA,QAAI,WAAW;AAEb,YAAM,SAAS,MAAmB,aAAa;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAGD,YAAM,IAAI,UAAU,KAAK;AAAA,QACvB,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,QACZ,+BAA+B;AAAA,MACjC,CAAC;AAED,UAAI;AACF,yBAAiB,SAAS,QAAQ;AAChC,gBAAM,IAAI,MAAM,SAAS,KAAK,UAAU,KAAK,CAAC;AAAA;AAAA,CAAM;AAAA,QACtD;AAAA,MACF,SAAS,OAAO;AAAA,MAEhB,UAAE;AACA,cAAM,IAAI,IAAI;AAEd,eAAO,MAAM,OAAO;AAAA,MACtB;AAAA,IACF,OAAO;AAEL,YAAM,SAAS,MAAmB,aAAa;AAAA,QAC7C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAAA,IAC/B;AAAA,EACF,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,2DAAc,MAAM,OAAO;AAAA,IACpC,CAAC;AAAA,EACH;AACF;;;AC7EO,IAAM,gBAAgB,OAC3B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,IAAI,QAAQ;AAIrC,UAAM,QAAQ,QAAQ;AAEtB,QAAI,CAAC,eAAe,CAAC,KAAK;AACxB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,UAAU,QAAW;AACvB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,GAAG,EAAE,KAAK;AACvB;AAAA,EAIF,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,iEAAe,MAAM,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,gBAAgB,OAC3B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,IAAI,QAAQ;AAKrC,QAAI,CAAC,eAAe,CAAC,KAAK;AACxB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,GAAG,EAAE,KAAK;AACvB;AAAA,EAIF,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,iEAAe,MAAM,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,oBAAoB,OAC/B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,UAAU,IAAI,QAAQ;AAI3C,UAAM,YAAY,QAAQ,QAAQ,aAAa;AAE/C,QAAI,CAAC,WAAW;AACd,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,eAAe;AAAA,MAClC,cAAc;AAAA,MACd;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ;AACX,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAC7B;AAAA,IACF;AAEA,UAAM,KAAK,MAAM;AAAA,EACnB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,6EAAiB,MAAM,OAAO;AAAA,IACvC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,gBAAgB,OAC3B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,UAAU,IAAI,QAAQ;AAK3C,QAAI,CAAC,WAAW;AACd,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,YAAY;AAAA,MAC/B,cAAc;AAAA,MACd;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ;AACX,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAC7B;AAAA,IACF;AAEA,UAAM,KAAK,MAAM;AAAA,EACnB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,uEAAgB,MAAM,OAAO;AAAA,IACtC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,mBAAmB,OAC9B,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,IAAI,QAAQ;AAKrC,QAAI,CAAC,eAAe,CAAC,KAAK;AACxB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAKA,UAAM,OAAO,GAAG,EAAE,KAAK;AACvB;AAGA,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,EACzB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,iEAAe,MAAM,OAAO;AAAA,IACrC,CAAC;AAAA,EACH;AACF;AAGO,IAAM,cAAc,OACzB,SACA,UACkB;AAClB,MAAI;AACF,UAAM,EAAE,YAAY,IAAI,QAAQ;AAEhC,QAAI,CAAC,aAAa;AAChB,YAAM,OAAO,GAAG,EAAE,KAAK;AAAA,QACrB,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,QAAI;AAEJ,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,OAAO,GAAG,EAAE,KAAK,MAAM;AAC7B;AAAA,IACF;AAEA,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,EACzB,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,2DAAc,MAAM,OAAO;AAAA,IACpC,CAAC;AAAA,EACH;AACF;;;AC9OO,IAAM,gBAAgB,OAC3B,SAGA,UACG;AACH,MAAI;AACF,UAAM,EAAE,YAAY,IAAI,QAAQ;AAGhC,UAAM,YAAY,MAAM,WAAW,WAAW;AAG9C,UAAM,OAAO,gBAAgB,kBAAkB,EAAE,KAAK;AAAA,MACpD,OAAO;AAAA,IACT,CAAC;AAAA,EACH,SAAS,OAAY;AACnB,UAAM,OAAO,GAAG,EAAE,KAAK;AAAA,MACrB,SAAS;AAAA,MACT,OAAO,MAAM,WAAW;AAAA,IAC1B,CAAC;AAAA,EACH;AACF;;;ACnBO,IAAM,iBAAiB,CAACC,SAA+B;AAE5D,EAAAA,KAAI,KAED,aAA2B,SAAS;AAevC,EAAAA,KAAI;AAAA,IAGF;AAAA,IACiB;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACiB;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACiB;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAIF;AAAA,IACiB;AAAA,EACnB;AAEA,EAAAA,KAAI;AAAA,IAGF;AAAA,IACiB;AAAA,EACnB;AAEA,EAAAA,KAAI,OAED,uCAAwD,WAAW;AAGtE,EAAAA,KAAI,IAED,sCAAsD,aAAa;AACxE;;;ACrEA,OAAO,UAAU;AACjB,OAAO;AACP,OAAO;AAoBP,IAAM,oBAAN,MAAM,mBAAkB;AAAA,EAId,cAAc;AACpB,UAAM,SAAS,QAAQ,IAAI,aAAa;AAExC,UAAM,eAAmC;AAAA;AAAA,MAEvC,WAAW,MAAM,mBAAkB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA,MAG3D,MAAM;AAAA,QACJ,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,cAAc;AAAA,QACd,aAAa;AAAA,QACb,aAAa;AAAA,MACf;AAAA,MAEA,YAAY;AAAA,QACV,OAAO,CAAC,OAAO,WAAW;AACxB,iBAAO;AAAA,YACL,OAAO,MAAM,YAAY;AAAA,YACzB,aAAa,SAAS;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ;AACV,UAAI;AACF,aAAK,aAAa;AAAA,UAChB;AAAA,UACA,KAAK,UAAU;AAAA,YACb,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,MAAM;AAAA,cACN,WAAW;AAAA,cACX,OAAO;AAAA,YACT;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAEA,aAAK,aAAa,KAAK;AAAA,UACrB,GAAG;AAAA,UACH,WAAW;AAAA,YACT,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AAEL,WAAK,aAAa,KAAK;AAAA,QACrB,GAAG;AAAA,QACH,WAAW;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAc,cAAiC;AAC7C,QAAI,CAAC,mBAAkB,UAAU;AAC/B,yBAAkB,WAAW,IAAI,mBAAkB;AAAA,IACrD;AACA,WAAO,mBAAkB;AAAA,EAC3B;AAAA,EAEO,gBAA6B;AAClC,WAAO,KAAK;AAAA,EACd;AACF;AAKO,IAAM,SAAN,MAAM,QAAO;AAAA,EAKlB,YAAY,SAAyB;AACnC,SAAK,UAAU,SAAS,WAAW,CAAC;AACpC,SAAK,OAAO,SAAS,QAAQ;AAC7B,SAAK,cAAc,SAAS,eAAe;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,mBAAyC;AACnE,UAAM,aAAa,kBAAkB,YAAY,EAAE,cAAc;AAGjE,UAAM,aAAa;AAAA,MACjB,aAAa,KAAK,QAAQ,WAAW,KAAK;AAAA,MAC1C,eAAe,KAAK,QAAQ,aAAa,KAAK;AAAA,MAC9C,gBAAgB,KAAK,QAAQ,cAAc,KAAK;AAAA,MAChD,aAAa,KAAK,QAAQ,WAAW,KAAK;AAAA,MAC1C,eAAe,KAAK,QAAQ,aAAa,KAAK;AAAA,MAC9C,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,GAAG;AAAA,IACL;AAGA,WAAO,WAAW,MAAM,UAAU;AAAA,EACpC;AAAA,EAEA,KAAK,KAAa,KAAoB;AACpC,SAAK,oBAAoB,GAAG,EAAE,KAAK,GAAG;AAAA,EACxC;AAAA,EAEA,MAAM,KAAa,KAA4B;AAC7C,SAAK,oBAAoB,GAAG,EAAE,MAAM,GAAG;AAAA,EACzC;AAAA,EAEA,KAAK,KAAa,KAAoB;AACpC,SAAK,oBAAoB,GAAG,EAAE,KAAK,GAAG;AAAA,EACxC;AAAA,EAEA,MAAM,KAAa,KAAoB;AACrC,SAAK,oBAAoB,GAAG,EAAE,MAAM,GAAG;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAuC;AACnD,SAAK,UAAU;AAAA,MACb,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAyC;AAC7C,WAAO,IAAI,QAAO;AAAA,MAChB,MAAM,QAAQ,QAAQ,KAAK;AAAA,MAC3B,aAAa,QAAQ,eAAe,KAAK;AAAA,MACzC,SAAS;AAAA,QACP,GAAG,KAAK;AAAA,QACR,GAAG,QAAQ;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ANlLA,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,YAAY;AACpD,UAAQ,MAAM,gDAAkB,MAAM;AAExC,CAAC;AAGD,IAAM,SAAS,IAAI,OAAO;AAAA,EACxB,aAAa;AAAA,EACb,MAAM;AACR,CAAC;AAGD,IAAM,MAAM,QAAQ;AAAA,EAClB,QAAQ;AAAA;AACV,CAAC;AAGD,IAAI,QAAQ,aAAa,CAAC,SAAS,OAAO,SAAS;AACjD,QAAM,UAAU;AAAA,IACd,eAAe,QAAQ,QAAQ,aAAa;AAAA,IAC5C,gBAAgB,QAAQ,QAAQ,cAAc;AAAA,EAChD;AACA,OAAK;AACP,CAAC;AAED,IAAI,QAAQ,cAAc,CAAC,SAAS,OAAO,SAAS;AAClD,QAAM,UAAU;AAAA,IACd,eAAe,QAAQ,QAAQ,aAAa;AAAA,IAC5C,gBAAgB,QAAQ,QAAQ,cAAc;AAAA,EAChD;AACA,OAAK;AACP,CAAC;AAGD,IAAI,SAAS,MAAM;AAAA,EACjB,QAAQ;AAAA,EACR,SAAS,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS;AAAA,EACnD,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,gBAAgB,CAAC,cAAc;AAAA,EAC/B,aAAa;AACf,CAAC;AACD,IAAI,SAAS,QAAQ;AAGrB,IAAI,gBAAgB,CAAC,OAAO,SAAS,UAAU;AAC7C,QAAM,UAAU;AAAA,IACd,eAAe,QAAQ,QAAQ,aAAa;AAAA,IAC5C,gBAAgB,QAAQ,QAAQ,cAAc;AAAA,EAChD;AACA,SAAO;AAAA,IACL,6BAAS,QAAQ,MAAM,IAAI,QAAQ,GAAG,UAAU,MAAM,OAAO;AAAA,IAC7D;AAAA,MACE,GAAG;AAAA,MACH,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MACb,YAAY,MAAM,cAAc;AAAA,IAClC;AAAA,EACF;AACA,QAAM,OAAO,MAAM,cAAc,GAAG,EAAE,KAAK;AAAA,IACzC,SAAS;AAAA,IACT,OAAO,MAAM,WAAW;AAAA,EAC1B,CAAC;AACH,CAAC;AAGD,IAAI,SAAS,UAAU,MAAM;AAG7B,eAAe,GAAG;AAGlB,IAAM,QAAQ,OAAO,EAAE,KAAK,MAAwB;AAClD,MAAI;AACF,UAAM,cAAc,QAAQ,OAAO,QAAQ,IAAI,IAAI,KAAK;AACxD,UAAM,IAAI,OAAO,EAAE,MAAM,aAAa,MAAM,UAAU,CAAC;AACvD,WAAO,KAAK,uCAAuC,IAAI,EAAE;AAAA,EAC3D,SAAS,KAAK;AACZ,WAAO,MAAM,uBAAuB,EAAE,OAAO,IAAI,CAAC;AAClD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,IAAM,iBAAiB;AAAA,EACrB,qBAAqB;AAAA,EACrB;AACF;","names":["messages","v4","app"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiom-lattice/gateway",
3
- "version": "1.0.20",
3
+ "version": "1.0.22",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
@@ -30,8 +30,8 @@
30
30
  "pino-roll": "^3.1.0",
31
31
  "redis": "^5.0.1",
32
32
  "uuid": "^9.0.1",
33
- "@axiom-lattice/core": "1.0.20",
34
- "@axiom-lattice/protocols": "1.0.20"
33
+ "@axiom-lattice/core": "1.0.22",
34
+ "@axiom-lattice/protocols": "1.0.22"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/jest": "^29.5.14",
package/src/index.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import fastify from "fastify";
2
2
  import cors from "@fastify/cors";
3
3
  import sensible from "@fastify/sensible";
4
- import { config, validateConfig } from "./config";
5
4
  import { registerRoutes } from "./routes";
6
5
  // 导入自定义 Logger 类
7
6
  import { Logger } from "./logger/Logger";
@@ -11,14 +10,6 @@ process.on("unhandledRejection", (reason, promise) => {
11
10
  // 可以在这里进行日志记录或其他处理
12
11
  });
13
12
 
14
- // 验证配置
15
- try {
16
- validateConfig();
17
- } catch (error: any) {
18
- console.error("配置错误:", error.message);
19
- process.exit(1);
20
- }
21
-
22
13
  // 创建自定义日志记录器
23
14
  const logger = new Logger({
24
15
  serviceName: "lattice-gateway",
@@ -91,12 +82,11 @@ app.decorate("logger", logger);
91
82
  registerRoutes(app);
92
83
 
93
84
  // 启动服务器
94
- const start = async () => {
85
+ const start = async ({ port }: { port: number }) => {
95
86
  try {
96
- const port = Number(config.server.port);
97
- await app.listen({ port, host: "0.0.0.0" });
87
+ const target_port = port || Number(process.env.PORT) || 4001;
88
+ await app.listen({ port: target_port, host: "0.0.0.0" });
98
89
  logger.info(`Lattice Gateway is running on port: ${port}`);
99
- logger.info(`Environment: ${config.server.env}`);
100
90
  } catch (err) {
101
91
  logger.error("Server start failed", { error: err });
102
92
  process.exit(1);
@@ -105,6 +95,7 @@ const start = async () => {
105
95
 
106
96
  const LatticeGateway = {
107
97
  startAsHttpEndpoint: start,
98
+ app,
108
99
  };
109
100
 
110
101
  export { LatticeGateway };
@@ -123,67 +123,18 @@ export async function agent_stream({
123
123
  [Symbol.asyncIterator]: async function* () {
124
124
  try {
125
125
  for await (const chunk of agentStream) {
126
- // console.log("-----chunk----", chunk);
127
126
  let data;
128
- // for (const [node, values] of Object.entries(chunk)) {
129
- // console.log(`Receiving update from node: ${node}`);
130
- // console.log(values);
131
- // console.log("\n====\n");
132
- // }
133
- //console.log("chunk", JSON.stringify(chunk));
134
- // if (chunk[0] === "updates") {
135
- // const updates = chunk[1];
136
- // console.log("update", updates);
137
- // }
138
- if (chunk[0] === "messages") {
139
- //console.log(chunk[1][0]);
127
+ if (chunk[0] === "updates") {
128
+ const update = chunk[1];
129
+ const values = Object.values(update);
130
+ const messages = values[0].messages;
131
+ if (messages?.[0]?.tool_call_id) {
132
+ data = messages[0].toDict();
133
+ }
134
+ } else if (chunk[0] === "messages") {
140
135
  const messages = chunk[1];
136
+ // console.log(messages);
141
137
  data = messages?.[0]?.toDict();
142
-
143
- // const messagesArray = messages
144
- // .map((message: any) => {
145
- // if (isAIMessageChunk(message)) {
146
- // return {
147
- // id: message.id,
148
- // role: "ai",
149
- // name: message.name,
150
- // content: message.content,
151
- // type: "message_chunk",
152
- // tool_calls: message.tool_calls,
153
- // tool_call_chunks: message.tool_call_chunks,
154
- // };
155
- // } else if (isToolMessage(message)) {
156
- // return {
157
- // id: message.id,
158
- // role: "tool",
159
- // content: message.content,
160
- // type: "tool_message",
161
- // tool_call_id: message.tool_call_id,
162
- // name: message.name,
163
- // };
164
- // } else if (isAIMessage(message)) {
165
- // return {
166
- // id: message.id,
167
- // role: "ai",
168
- // content: message.content,
169
- // type: "message",
170
- // };
171
- // } else if (isToolMessageChunk(message)) {
172
- // return {
173
- // id: message.id,
174
- // role: "tool",
175
- // type: "tool_message_chunk",
176
- // content: message.content,
177
- // };
178
- // }
179
- // })
180
- // .filter((item: any) => item);
181
- // // 如果messagesArray为空,则不返回数据,如果返回数据会导致界面清掉历史message
182
- // if (messagesArray.length > 0) {
183
- // data = {
184
- // messages: messagesArray,
185
- // };
186
- // }
187
138
  }
188
139
 
189
140
  if ((chunk?.[1] as any)?.__interrupt__) {
@@ -201,7 +152,7 @@ export async function agent_stream({
201
152
  }
202
153
 
203
154
  if (data) {
204
- console.log(data);
155
+ //console.log(data);
205
156
  yield data;
206
157
  }
207
158
  }
@@ -1,45 +0,0 @@
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
- };