@axiom-lattice/gateway 2.1.44 → 2.1.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +8 -8
- package/CHANGELOG.md +21 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +237 -559
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +68 -397
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -4
- package/src/controllers/assistant.ts +5 -4
- package/src/controllers/memory.ts +17 -13
- package/src/controllers/models.ts +8 -0
- package/src/controllers/run.ts +63 -51
- package/src/controllers/thread_status.ts +228 -0
- package/src/index.ts +8 -1
- package/src/routes/index.ts +18 -0
- package/src/services/agent_task_consumer.ts +12 -107
- package/src/__tests__/agent_service.test.ts +0 -238
- package/src/services/agent_service.ts +0 -375
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@axiom-lattice/gateway",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.46",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "dist/index.mjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -35,16 +35,19 @@
|
|
|
35
35
|
"pino": "^9.7.0",
|
|
36
36
|
"pino-pretty": "^13.0.0",
|
|
37
37
|
"pino-roll": "^3.1.0",
|
|
38
|
+
"pg": "^8.11.0",
|
|
38
39
|
"redis": "^5.0.1",
|
|
39
40
|
"uuid": "^9.0.1",
|
|
40
|
-
"@axiom-lattice/core": "2.1.
|
|
41
|
-
"@axiom-lattice/
|
|
42
|
-
"@axiom-lattice/
|
|
41
|
+
"@axiom-lattice/core": "2.1.40",
|
|
42
|
+
"@axiom-lattice/pg-stores": "1.0.30",
|
|
43
|
+
"@axiom-lattice/protocols": "2.1.22",
|
|
44
|
+
"@axiom-lattice/queue-redis": "1.0.21"
|
|
43
45
|
},
|
|
44
46
|
"devDependencies": {
|
|
45
47
|
"@types/jest": "^29.5.14",
|
|
46
48
|
"@types/lodash": "^4.17.16",
|
|
47
49
|
"@types/node": "^20.19.13",
|
|
50
|
+
"@types/pg": "^8.11.0",
|
|
48
51
|
"@types/uuid": "^9.0.8",
|
|
49
52
|
"@types/ws": "^8.18.1",
|
|
50
53
|
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
-
import {
|
|
3
|
-
import { getStoreLattice } from "@axiom-lattice/core";
|
|
2
|
+
import { agentInstanceManager, getStoreLattice } from "@axiom-lattice/core";
|
|
4
3
|
import type {
|
|
5
4
|
Assistant,
|
|
6
5
|
CreateAssistantRequest,
|
|
@@ -26,7 +25,7 @@ function getTenantId(request: FastifyRequest): string {
|
|
|
26
25
|
if (userTenantId) {
|
|
27
26
|
return userTenantId;
|
|
28
27
|
}
|
|
29
|
-
|
|
28
|
+
|
|
30
29
|
// Fallback to request headers for backward compatibility
|
|
31
30
|
return (request.headers["x-tenant-id"] as string) || "default";
|
|
32
31
|
}
|
|
@@ -321,8 +320,10 @@ export const getAgentGraph = async (
|
|
|
321
320
|
const { assistantId } = request.params;
|
|
322
321
|
const tenant_id = getTenantId(request);
|
|
323
322
|
|
|
323
|
+
const agent = agentInstanceManager.getAgent({ assistant_id: assistantId, tenant_id, thread_id: '' })
|
|
324
|
+
|
|
324
325
|
// Call drawing service to get image data
|
|
325
|
-
const imageData = await
|
|
326
|
+
const imageData = await agent.get_draw_graph()
|
|
326
327
|
|
|
327
328
|
// Set response header and return image data
|
|
328
329
|
reply.header("Content-Type", "application/json").send({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
-
import {
|
|
2
|
+
import { agentInstanceManager } from "@axiom-lattice/core";
|
|
3
3
|
|
|
4
4
|
// 设置内存项
|
|
5
5
|
export const setMemoryItem = async (
|
|
@@ -108,11 +108,9 @@ export const getAllMemoryItems = async (
|
|
|
108
108
|
return;
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
tenant_id: tenant_id,
|
|
115
|
-
});
|
|
111
|
+
const agent = agentInstanceManager.getAgent({ assistant_id: assistantId, tenant_id, thread_id: thread_id })
|
|
112
|
+
|
|
113
|
+
const result = await agent.getCurrentMessages();
|
|
116
114
|
|
|
117
115
|
if (!result) {
|
|
118
116
|
reply.status(500).send(result);
|
|
@@ -156,19 +154,25 @@ export const getAgentState = async (
|
|
|
156
154
|
}
|
|
157
155
|
|
|
158
156
|
const tenant_id = request.headers["x-tenant-id"] as string;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
157
|
+
const agent = agentInstanceManager.getAgent({ assistant_id: assistantId, tenant_id, thread_id: thread_id })
|
|
158
|
+
|
|
159
|
+
// 1. 获取 LangGraph 状态(现有逻辑)
|
|
160
|
+
const result = await agent.getCurrentState();
|
|
161
|
+
const pendingMessages = await agent.getPendingMessages();
|
|
162
|
+
|
|
165
163
|
|
|
166
164
|
if (!result) {
|
|
167
165
|
reply.status(500).send(result);
|
|
168
166
|
return;
|
|
169
167
|
}
|
|
170
168
|
|
|
171
|
-
|
|
169
|
+
// 3. 合并返回
|
|
170
|
+
const mergedResult = {
|
|
171
|
+
...result,
|
|
172
|
+
pendingMessages
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
reply.send(mergedResult);
|
|
172
176
|
} catch (error: any) {
|
|
173
177
|
reply.status(500).send({
|
|
174
178
|
success: false,
|
|
@@ -43,6 +43,7 @@ function extractModelKey(tenantId: string, tenantModelKey: string): string {
|
|
|
43
43
|
interface ModelConfig {
|
|
44
44
|
key: string;
|
|
45
45
|
model: string;
|
|
46
|
+
displayName?: string;
|
|
46
47
|
provider: "azure" | "openai" | "deepseek" | "siliconcloud" | "volcengine";
|
|
47
48
|
streaming?: boolean;
|
|
48
49
|
apiKey?: string;
|
|
@@ -75,10 +76,16 @@ export async function getModels(request: FastifyRequest, reply: FastifyReply) {
|
|
|
75
76
|
// Extract config from the lattice client
|
|
76
77
|
// Note: This is a simplified approach - you may need to adjust based on actual implementation
|
|
77
78
|
const config = (lattice.client as any).config || {};
|
|
79
|
+
// Use provided displayName or auto-generate from key
|
|
80
|
+
const displayName = config.displayName || lattice.key
|
|
81
|
+
.split('-')
|
|
82
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
83
|
+
.join(' ');
|
|
78
84
|
return {
|
|
79
85
|
key: lattice.key,
|
|
80
86
|
model: config.model || "",
|
|
81
87
|
provider: config.provider || "openai",
|
|
88
|
+
displayName: displayName,
|
|
82
89
|
streaming: config.streaming || false,
|
|
83
90
|
apiKey: config.apiKey || "",
|
|
84
91
|
baseURL: config.baseURL || "",
|
|
@@ -144,6 +151,7 @@ export async function updateModels(
|
|
|
144
151
|
const llmConfig: LLMConfig = {
|
|
145
152
|
provider: modelConfig.provider,
|
|
146
153
|
model: modelConfig.model,
|
|
154
|
+
displayName: modelConfig.displayName,
|
|
147
155
|
streaming: modelConfig.streaming ?? false,
|
|
148
156
|
apiKey: modelConfig.apiKey,
|
|
149
157
|
baseURL: modelConfig.baseURL,
|
package/src/controllers/run.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
-
import * as agentService from "../services/agent_service";
|
|
3
2
|
import { CreateRunRequest } from "../types";
|
|
4
3
|
import { v4 } from "uuid";
|
|
4
|
+
import {
|
|
5
|
+
Agent,
|
|
6
|
+
ThreadStatus,
|
|
7
|
+
agentLatticeManager,
|
|
8
|
+
agentInstanceManager,
|
|
9
|
+
} from "@axiom-lattice/core";
|
|
5
10
|
|
|
6
11
|
interface ResumeStreamRequest {
|
|
7
12
|
thread_id: string;
|
|
@@ -10,7 +15,7 @@ interface ResumeStreamRequest {
|
|
|
10
15
|
poll_interval?: number;
|
|
11
16
|
}
|
|
12
17
|
|
|
13
|
-
//
|
|
18
|
+
// Create run
|
|
14
19
|
export const createRun = async (
|
|
15
20
|
request: FastifyRequest,
|
|
16
21
|
reply: FastifyReply
|
|
@@ -31,7 +36,7 @@ export const createRun = async (
|
|
|
31
36
|
const project_id = request.headers["x-project-id"] as string;
|
|
32
37
|
const x_request_id = (request.headers["x-request-id"] as string) || v4();
|
|
33
38
|
|
|
34
|
-
//
|
|
39
|
+
// Validate request
|
|
35
40
|
if (!assistant_id) {
|
|
36
41
|
reply.status(400).send({
|
|
37
42
|
success: false,
|
|
@@ -40,35 +45,21 @@ export const createRun = async (
|
|
|
40
45
|
return;
|
|
41
46
|
}
|
|
42
47
|
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// 开始运行
|
|
56
|
-
const stream = await agentService.agent_stream({
|
|
57
|
-
assistant_id: assistant_id,
|
|
58
|
-
input: input,
|
|
59
|
-
thread_id: thread_id,
|
|
60
|
-
command,
|
|
61
|
-
tenant_id: tenant_id,
|
|
62
|
-
workspace_id: workspace_id,
|
|
63
|
-
project_id: project_id,
|
|
64
|
-
run_id: x_request_id,
|
|
65
|
-
custom_run_config,
|
|
66
|
-
});
|
|
48
|
+
// Get or create Agent instance (ensures single instance per thread)
|
|
49
|
+
const agent = agentInstanceManager.getAgent({
|
|
50
|
+
assistant_id,
|
|
51
|
+
thread_id,
|
|
52
|
+
tenant_id,
|
|
53
|
+
workspace_id,
|
|
54
|
+
project_id,
|
|
55
|
+
custom_run_config,
|
|
56
|
+
});
|
|
67
57
|
|
|
68
|
-
// 通知 Fastify 我们将手动处理响应
|
|
69
|
-
reply.hijack();
|
|
70
58
|
|
|
71
|
-
|
|
59
|
+
// Handle streaming requests
|
|
60
|
+
if (streaming) {
|
|
61
|
+
// Setup SSE
|
|
62
|
+
reply.hijack();
|
|
72
63
|
reply.raw.writeHead(200, {
|
|
73
64
|
"Content-Type": "text/event-stream",
|
|
74
65
|
"Cache-Control": "no-cache",
|
|
@@ -77,41 +68,59 @@ export const createRun = async (
|
|
|
77
68
|
});
|
|
78
69
|
|
|
79
70
|
try {
|
|
80
|
-
|
|
71
|
+
|
|
72
|
+
// Execute agent with streaming
|
|
73
|
+
const result = await agent.addMessage({
|
|
74
|
+
input,
|
|
75
|
+
command,
|
|
76
|
+
custom_run_config,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// const agentStatus = await agent.getRunStatus()
|
|
80
|
+
// console.log(agentStatus)
|
|
81
|
+
// if (agentStatus === "busy") {
|
|
82
|
+
// reply.status(200).send({
|
|
83
|
+
// success: true,
|
|
84
|
+
|
|
85
|
+
// });
|
|
86
|
+
// return
|
|
87
|
+
// }
|
|
88
|
+
|
|
89
|
+
const stream = agent.chunkStream((result).messageId)
|
|
90
|
+
|
|
91
|
+
// Forward all chunks to SSE
|
|
81
92
|
for await (const chunk of stream) {
|
|
82
|
-
|
|
93
|
+
console.log(input.message, chunk.data.content);
|
|
83
94
|
const success = reply.raw.write(`data: ${JSON.stringify(chunk)}\n\n`);
|
|
84
95
|
if (!success) {
|
|
85
96
|
await new Promise(resolve => reply.raw.once('drain', resolve));
|
|
86
97
|
}
|
|
87
98
|
}
|
|
88
99
|
} catch (error: any) {
|
|
89
|
-
// Send error as SSE event
|
|
100
|
+
// Send error as SSE event
|
|
90
101
|
const errorEvent = {
|
|
91
102
|
type: 'error',
|
|
92
103
|
data: {
|
|
93
104
|
id: v4(),
|
|
94
|
-
content: error.message || 'Stream processing error'
|
|
95
|
-
}
|
|
105
|
+
content: error.message || 'Stream processing error',
|
|
106
|
+
},
|
|
96
107
|
};
|
|
97
108
|
reply.raw.write(`data: ${JSON.stringify(errorEvent)}\n\n`);
|
|
98
109
|
} finally {
|
|
99
110
|
reply.raw.end();
|
|
100
111
|
}
|
|
101
112
|
} else {
|
|
102
|
-
//
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
input:
|
|
106
|
-
command
|
|
107
|
-
thread_id: thread_id,
|
|
108
|
-
tenant_id: tenant_id,
|
|
109
|
-
workspace_id: workspace_id,
|
|
110
|
-
project_id: project_id,
|
|
111
|
-
run_id: x_request_id,
|
|
113
|
+
// Non-streaming: use agentExecutor
|
|
114
|
+
const { message: msg, ...restInputNonStream } = input;
|
|
115
|
+
const result = await agent.invoke({
|
|
116
|
+
input: { message: msg, ...restInputNonStream },
|
|
117
|
+
command,
|
|
112
118
|
custom_run_config,
|
|
113
119
|
});
|
|
114
|
-
reply.status(200).send(
|
|
120
|
+
reply.status(200).send({
|
|
121
|
+
success: true,
|
|
122
|
+
...result,
|
|
123
|
+
});
|
|
115
124
|
}
|
|
116
125
|
} catch (error: any) {
|
|
117
126
|
reply.status(500).send({
|
|
@@ -151,14 +160,17 @@ export const resumeStream = async (
|
|
|
151
160
|
});
|
|
152
161
|
|
|
153
162
|
try {
|
|
154
|
-
//
|
|
155
|
-
|
|
163
|
+
// Create Agent instance for accessing chunk buffer
|
|
164
|
+
// Note: assistant_id, tenant_id are not required for chunkStream
|
|
165
|
+
const agent = new Agent({
|
|
166
|
+
assistant_id: '',
|
|
156
167
|
thread_id,
|
|
157
|
-
|
|
158
|
-
known_content: known_content,
|
|
159
|
-
poll_interval: poll_interval || 100,
|
|
168
|
+
tenant_id: '',
|
|
160
169
|
});
|
|
161
170
|
|
|
171
|
+
// Get the stream from agent's chunk buffer
|
|
172
|
+
const stream = agent.chunkStream(message_id, known_content);
|
|
173
|
+
|
|
162
174
|
// Stream the chunks to the client
|
|
163
175
|
for await (const chunk of stream) {
|
|
164
176
|
reply.raw.write(`data: ${JSON.stringify(chunk)}\n\n`);
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// import { FastifyRequest, FastifyReply } from "fastify";
|
|
2
|
+
// import { QueueMode } from "@axiom-lattice/core";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// /**
|
|
6
|
+
// * GET /api/threads/:thread_id/status
|
|
7
|
+
// * Query single thread status
|
|
8
|
+
// */
|
|
9
|
+
// export async function getThreadStatusHandler(
|
|
10
|
+
// request: FastifyRequest,
|
|
11
|
+
// reply: FastifyReply
|
|
12
|
+
// ) {
|
|
13
|
+
// try {
|
|
14
|
+
// const { thread_id } = request.params as { thread_id: string };
|
|
15
|
+
// const tenant_id = request.headers["x-tenant-id"] as string;
|
|
16
|
+
|
|
17
|
+
// if (!tenant_id) {
|
|
18
|
+
// return reply.code(400).send({ error: "Missing x-tenant-id header" });
|
|
19
|
+
// }
|
|
20
|
+
|
|
21
|
+
// const state = lifecycleManager.getThreadStatus(tenant_id, thread_id);
|
|
22
|
+
|
|
23
|
+
// if (!state) {
|
|
24
|
+
// return reply.code(404).send({
|
|
25
|
+
// error: "Thread not found",
|
|
26
|
+
// threadId: thread_id,
|
|
27
|
+
// });
|
|
28
|
+
// }
|
|
29
|
+
|
|
30
|
+
// return reply.send(state);
|
|
31
|
+
// } catch (error) {
|
|
32
|
+
// console.error("Error getting thread status:", error);
|
|
33
|
+
// return reply.code(500).send({
|
|
34
|
+
// error: "Internal server error",
|
|
35
|
+
// message: error instanceof Error ? error.message : String(error),
|
|
36
|
+
// });
|
|
37
|
+
// }
|
|
38
|
+
// }
|
|
39
|
+
|
|
40
|
+
// /**
|
|
41
|
+
// * GET /api/assistants/:assistant_id/threads/status
|
|
42
|
+
// * Query all threads status for an agent
|
|
43
|
+
// */
|
|
44
|
+
// export async function getAgentThreadsHandler(
|
|
45
|
+
// request: FastifyRequest,
|
|
46
|
+
// reply: FastifyReply
|
|
47
|
+
// ) {
|
|
48
|
+
// try {
|
|
49
|
+
// const { assistant_id } = request.params as { assistant_id: string };
|
|
50
|
+
// const tenant_id = request.headers["x-tenant-id"] as string;
|
|
51
|
+
|
|
52
|
+
// if (!tenant_id) {
|
|
53
|
+
// return reply.code(400).send({ error: "Missing x-tenant-id header" });
|
|
54
|
+
// }
|
|
55
|
+
|
|
56
|
+
// const threads = lifecycleManager.getAgentThreads(tenant_id, assistant_id);
|
|
57
|
+
|
|
58
|
+
// return reply.send({
|
|
59
|
+
// assistantId: assistant_id,
|
|
60
|
+
// threads,
|
|
61
|
+
// count: threads.length,
|
|
62
|
+
// });
|
|
63
|
+
// } catch (error) {
|
|
64
|
+
// console.error("Error getting agent threads:", error);
|
|
65
|
+
// return reply.code(500).send({
|
|
66
|
+
// error: "Internal server error",
|
|
67
|
+
// message: error instanceof Error ? error.message : String(error),
|
|
68
|
+
// });
|
|
69
|
+
// }
|
|
70
|
+
// }
|
|
71
|
+
|
|
72
|
+
// /**
|
|
73
|
+
// * GET /api/threads/active
|
|
74
|
+
// * Query all active threads (BUSY + INTERRUPTED)
|
|
75
|
+
// */
|
|
76
|
+
// export async function getActiveThreadsHandler(
|
|
77
|
+
// request: FastifyRequest,
|
|
78
|
+
// reply: FastifyReply
|
|
79
|
+
// ) {
|
|
80
|
+
// try {
|
|
81
|
+
// const tenant_id = request.headers["x-tenant-id"] as string;
|
|
82
|
+
|
|
83
|
+
// if (!tenant_id) {
|
|
84
|
+
// return reply.code(400).send({ error: "Missing x-tenant-id header" });
|
|
85
|
+
// }
|
|
86
|
+
|
|
87
|
+
// const threads = lifecycleManager.getActiveThreads(tenant_id);
|
|
88
|
+
|
|
89
|
+
// return reply.send({
|
|
90
|
+
// threads,
|
|
91
|
+
// count: threads.length,
|
|
92
|
+
// });
|
|
93
|
+
// } catch (error) {
|
|
94
|
+
// console.error("Error getting active threads:", error);
|
|
95
|
+
// return reply.code(500).send({
|
|
96
|
+
// error: "Internal server error",
|
|
97
|
+
// message: error instanceof Error ? error.message : String(error),
|
|
98
|
+
// });
|
|
99
|
+
// }
|
|
100
|
+
// }
|
|
101
|
+
|
|
102
|
+
// /**
|
|
103
|
+
// * POST /api/threads/:thread_id/messages
|
|
104
|
+
// * Add message to queue or execute immediately (steer mode)
|
|
105
|
+
// */
|
|
106
|
+
// export async function addMessageHandler(
|
|
107
|
+
// request: FastifyRequest,
|
|
108
|
+
// reply: FastifyReply
|
|
109
|
+
// ) {
|
|
110
|
+
// try {
|
|
111
|
+
// const { thread_id } = request.params as { thread_id: string };
|
|
112
|
+
// const tenant_id = request.headers["x-tenant-id"] as string;
|
|
113
|
+
// const { assistant_id, content, mode } = request.body as {
|
|
114
|
+
// assistant_id: string;
|
|
115
|
+
// content: any;
|
|
116
|
+
// mode?: QueueMode;
|
|
117
|
+
// };
|
|
118
|
+
|
|
119
|
+
// if (!tenant_id) {
|
|
120
|
+
// return reply.code(400).send({ error: "Missing x-tenant-id header" });
|
|
121
|
+
// }
|
|
122
|
+
|
|
123
|
+
// if (!assistant_id || !content) {
|
|
124
|
+
// return reply.code(400).send({ error: "Missing assistant_id or content" });
|
|
125
|
+
// }
|
|
126
|
+
|
|
127
|
+
// const result = await lifecycleManager.addMessage(
|
|
128
|
+
// tenant_id,
|
|
129
|
+
// assistant_id,
|
|
130
|
+
// thread_id,
|
|
131
|
+
// content,
|
|
132
|
+
// mode
|
|
133
|
+
// );
|
|
134
|
+
|
|
135
|
+
// return reply.send({
|
|
136
|
+
// success: true,
|
|
137
|
+
// threadId: thread_id,
|
|
138
|
+
// ...result,
|
|
139
|
+
// });
|
|
140
|
+
// } catch (error) {
|
|
141
|
+
// console.error("Error adding message:", error);
|
|
142
|
+
// return reply.code(500).send({
|
|
143
|
+
// error: "Internal server error",
|
|
144
|
+
// message: error instanceof Error ? error.message : String(error),
|
|
145
|
+
// });
|
|
146
|
+
// }
|
|
147
|
+
// }
|
|
148
|
+
|
|
149
|
+
// /**
|
|
150
|
+
// * DELETE /api/threads/:thread_id/messages/:message_id
|
|
151
|
+
// * Remove pending message
|
|
152
|
+
// */
|
|
153
|
+
// export async function removeMessageHandler(
|
|
154
|
+
// request: FastifyRequest,
|
|
155
|
+
// reply: FastifyReply
|
|
156
|
+
// ) {
|
|
157
|
+
// try {
|
|
158
|
+
// const { thread_id, message_id } = request.params as {
|
|
159
|
+
// thread_id: string;
|
|
160
|
+
// message_id: string;
|
|
161
|
+
// };
|
|
162
|
+
// const tenant_id = request.headers["x-tenant-id"] as string;
|
|
163
|
+
|
|
164
|
+
// if (!tenant_id) {
|
|
165
|
+
// return reply.code(400).send({ error: "Missing x-tenant-id header" });
|
|
166
|
+
// }
|
|
167
|
+
|
|
168
|
+
// const success = await lifecycleManager.removePendingMessage(
|
|
169
|
+
// tenant_id,
|
|
170
|
+
// thread_id,
|
|
171
|
+
// message_id
|
|
172
|
+
// );
|
|
173
|
+
|
|
174
|
+
// if (!success) {
|
|
175
|
+
// return reply.code(404).send({
|
|
176
|
+
// error: "Message not found",
|
|
177
|
+
// messageId: message_id,
|
|
178
|
+
// });
|
|
179
|
+
// }
|
|
180
|
+
|
|
181
|
+
// return reply.send({
|
|
182
|
+
// success: true,
|
|
183
|
+
// messageId: message_id,
|
|
184
|
+
// });
|
|
185
|
+
// } catch (error) {
|
|
186
|
+
// console.error("Error removing message:", error);
|
|
187
|
+
// return reply.code(500).send({
|
|
188
|
+
// error: "Internal server error",
|
|
189
|
+
// message: error instanceof Error ? error.message : String(error),
|
|
190
|
+
// });
|
|
191
|
+
// }
|
|
192
|
+
// }
|
|
193
|
+
|
|
194
|
+
// /**
|
|
195
|
+
// * PUT /api/threads/:thread_id/queue-config
|
|
196
|
+
// * Update queue configuration
|
|
197
|
+
// */
|
|
198
|
+
// export async function updateQueueConfigHandler(
|
|
199
|
+
// request: FastifyRequest,
|
|
200
|
+
// reply: FastifyReply
|
|
201
|
+
// ) {
|
|
202
|
+
// try {
|
|
203
|
+
// const { thread_id } = request.params as { thread_id: string };
|
|
204
|
+
// const tenant_id = request.headers["x-tenant-id"] as string;
|
|
205
|
+
// const config = request.body as {
|
|
206
|
+
// mode?: QueueMode;
|
|
207
|
+
// maxSize?: number;
|
|
208
|
+
// };
|
|
209
|
+
|
|
210
|
+
// if (!tenant_id) {
|
|
211
|
+
// return reply.code(400).send({ error: "Missing x-tenant-id header" });
|
|
212
|
+
// }
|
|
213
|
+
|
|
214
|
+
// await lifecycleManager.setQueueConfig(tenant_id, thread_id, config);
|
|
215
|
+
|
|
216
|
+
// return reply.send({
|
|
217
|
+
// success: true,
|
|
218
|
+
// threadId: thread_id,
|
|
219
|
+
// config,
|
|
220
|
+
// });
|
|
221
|
+
// } catch (error) {
|
|
222
|
+
// console.error("Error updating queue config:", error);
|
|
223
|
+
// return reply.code(500).send({
|
|
224
|
+
// error: "Internal server error",
|
|
225
|
+
// message: error instanceof Error ? error.message : String(error),
|
|
226
|
+
// });
|
|
227
|
+
// }
|
|
228
|
+
// }
|
package/src/index.ts
CHANGED
|
@@ -116,7 +116,7 @@ app.addHook("onResponse", (request, reply, done) => {
|
|
|
116
116
|
"x-tenant-id": getHeaderValue(request.headers["x-tenant-id"]),
|
|
117
117
|
"x-request-id": getHeaderValue(request.headers["x-request-id"]),
|
|
118
118
|
};
|
|
119
|
-
loggerLattice.info(`${request.method} ${request.url} - ${reply.statusCode}`);
|
|
119
|
+
//loggerLattice.info(`${request.method} ${request.url} - ${reply.statusCode}`);
|
|
120
120
|
done();
|
|
121
121
|
});
|
|
122
122
|
|
|
@@ -244,6 +244,13 @@ const start = async (config?: LatticeGatewayConfig) => {
|
|
|
244
244
|
await app.listen({ port: target_port, host: "0.0.0.0" });
|
|
245
245
|
logger.info(`Lattice Gateway is running on port: ${target_port}`);
|
|
246
246
|
|
|
247
|
+
// Initialize AgentLifecycleManager
|
|
248
|
+
try {
|
|
249
|
+
logger.info("AgentLifecycleManager initialized");
|
|
250
|
+
} catch (error) {
|
|
251
|
+
logger.warn("Failed to initialize AgentLifecycleManager", { error });
|
|
252
|
+
}
|
|
253
|
+
|
|
247
254
|
// Configure queue service
|
|
248
255
|
const queueServiceConfig = config?.queueServiceConfig;
|
|
249
256
|
if (queueServiceConfig) {
|
package/src/routes/index.ts
CHANGED
|
@@ -38,6 +38,14 @@ import { registerMcpServerConfigRoutes } from "../controllers/mcp-configs";
|
|
|
38
38
|
import { registerUserRoutes } from "../controllers/users";
|
|
39
39
|
import { registerTenantRoutes } from "../controllers/tenants";
|
|
40
40
|
import { registerAuthRoutes } from "../controllers/auth";
|
|
41
|
+
// import {
|
|
42
|
+
// getThreadStatusHandler,
|
|
43
|
+
// getAgentThreadsHandler,
|
|
44
|
+
// getActiveThreadsHandler,
|
|
45
|
+
// addMessageHandler,
|
|
46
|
+
// removeMessageHandler,
|
|
47
|
+
// updateQueueConfigHandler,
|
|
48
|
+
// } from "../controllers/thread_status";
|
|
41
49
|
|
|
42
50
|
export const registerLatticeRoutes = (app: FastifyInstance): void => {
|
|
43
51
|
// 运行路由
|
|
@@ -328,4 +336,14 @@ export const registerLatticeRoutes = (app: FastifyInstance): void => {
|
|
|
328
336
|
autoApproveUsers: process.env.AUTO_APPROVE_USERS !== "false",
|
|
329
337
|
allowTenantRegistration: process.env.ALLOW_TENANT_REGISTRATION !== "false",
|
|
330
338
|
});
|
|
339
|
+
|
|
340
|
+
// // Thread 状态查询路由
|
|
341
|
+
// app.get("/api/threads/:thread_id/status", getThreadStatusHandler);
|
|
342
|
+
// app.get("/api/assistants/:assistant_id/threads/status", getAgentThreadsHandler);
|
|
343
|
+
// app.get("/api/threads/active", getActiveThreadsHandler);
|
|
344
|
+
|
|
345
|
+
// // Thread 消息队列路由
|
|
346
|
+
// app.post("/api/threads/:thread_id/messages", addMessageHandler);
|
|
347
|
+
// app.delete("/api/threads/:thread_id/messages/:message_id", removeMessageHandler);
|
|
348
|
+
// app.put("/api/threads/:thread_id/queue-config", updateQueueConfigHandler);
|
|
331
349
|
};
|