march-ai-sdk 0.3.0
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/README.md +732 -0
- package/dist/app-C_umwZXh.d.ts +790 -0
- package/dist/extensions/langgraph.d.ts +144 -0
- package/dist/extensions/langgraph.js +326 -0
- package/dist/extensions/langgraph.js.map +1 -0
- package/dist/extensions/vercel-ai.d.ts +124 -0
- package/dist/extensions/vercel-ai.js +177 -0
- package/dist/extensions/vercel-ai.js.map +1 -0
- package/dist/index.d.ts +260 -0
- package/dist/index.js +1695 -0
- package/dist/index.js.map +1 -0
- package/dist/proto/gateway.proto +99 -0
- package/package.json +83 -0
- package/src/agent-state-client.ts +115 -0
- package/src/agent.ts +293 -0
- package/src/api-paths.ts +60 -0
- package/src/app.ts +235 -0
- package/src/artifact.ts +59 -0
- package/src/attachment-client.ts +78 -0
- package/src/checkpoint-client.ts +175 -0
- package/src/conversation-client.ts +109 -0
- package/src/conversation-message.ts +61 -0
- package/src/conversation.ts +123 -0
- package/src/exceptions.ts +78 -0
- package/src/extensions/index.ts +6 -0
- package/src/extensions/langgraph.ts +351 -0
- package/src/extensions/vercel-ai.ts +177 -0
- package/src/gateway-client.ts +420 -0
- package/src/heartbeat.ts +89 -0
- package/src/index.ts +70 -0
- package/src/memory-client.ts +125 -0
- package/src/memory.ts +68 -0
- package/src/message.ts +178 -0
- package/src/proto/gateway.proto +99 -0
- package/src/streamer.ts +242 -0
- package/src/types.ts +196 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { M as MarchAgentApp } from '../app-C_umwZXh.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* March Agent SDK - LangGraph Extension
|
|
6
|
+
*
|
|
7
|
+
* HTTPCheckpointSaver for LangGraph that stores state via HTTP API.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
interface RunnableConfig {
|
|
13
|
+
configurable?: {
|
|
14
|
+
thread_id?: string;
|
|
15
|
+
checkpoint_ns?: string;
|
|
16
|
+
checkpoint_id?: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
interface Checkpoint {
|
|
20
|
+
v?: number;
|
|
21
|
+
id?: string;
|
|
22
|
+
ts?: string;
|
|
23
|
+
channel_values?: Record<string, unknown>;
|
|
24
|
+
channel_versions?: Record<string, string>;
|
|
25
|
+
versions_seen?: Record<string, Record<string, string>>;
|
|
26
|
+
pending_sends?: unknown[];
|
|
27
|
+
}
|
|
28
|
+
interface CheckpointMetadata {
|
|
29
|
+
source?: string;
|
|
30
|
+
step?: number;
|
|
31
|
+
writes?: unknown;
|
|
32
|
+
parents?: Record<string, string>;
|
|
33
|
+
}
|
|
34
|
+
interface CheckpointTuple {
|
|
35
|
+
config: RunnableConfig;
|
|
36
|
+
checkpoint: Checkpoint;
|
|
37
|
+
metadata: CheckpointMetadata;
|
|
38
|
+
parent_config?: RunnableConfig;
|
|
39
|
+
pending_writes?: unknown[];
|
|
40
|
+
}
|
|
41
|
+
interface PendingWrite {
|
|
42
|
+
[key: string]: unknown;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* HTTP-based checkpoint saver for LangGraph.
|
|
46
|
+
*
|
|
47
|
+
* Stores graph state via HTTP calls to the conversation-store checkpoint API,
|
|
48
|
+
* enabling distributed checkpoint storage without direct database access.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* import { MarchAgentApp } from 'march-ai-sdk'
|
|
53
|
+
* import { HTTPCheckpointSaver } from 'march-ai-sdk/extensions/langgraph'
|
|
54
|
+
* import { StateGraph } from '@langchain/langgraph'
|
|
55
|
+
*
|
|
56
|
+
* const app = new MarchAgentApp({
|
|
57
|
+
* gatewayUrl: 'agent-gateway:8080',
|
|
58
|
+
* apiKey: 'your-key',
|
|
59
|
+
* })
|
|
60
|
+
*
|
|
61
|
+
* const checkpointer = new HTTPCheckpointSaver(app)
|
|
62
|
+
*
|
|
63
|
+
* const graph = new StateGraph(MyState)
|
|
64
|
+
* // ... define graph ...
|
|
65
|
+
* const compiled = graph.compile({ checkpointer })
|
|
66
|
+
*
|
|
67
|
+
* const config = { configurable: { thread_id: 'my-thread' } }
|
|
68
|
+
* const result = await compiled.invoke({ messages: [...] }, config)
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
declare class HTTPCheckpointSaver {
|
|
72
|
+
private readonly client;
|
|
73
|
+
constructor(app: MarchAgentApp);
|
|
74
|
+
/**
|
|
75
|
+
* Get thread_id from config.
|
|
76
|
+
*/
|
|
77
|
+
private getThreadId;
|
|
78
|
+
/**
|
|
79
|
+
* Get checkpoint_ns from config.
|
|
80
|
+
*/
|
|
81
|
+
private getCheckpointNs;
|
|
82
|
+
/**
|
|
83
|
+
* Get checkpoint_id from config.
|
|
84
|
+
*/
|
|
85
|
+
private getCheckpointId;
|
|
86
|
+
/**
|
|
87
|
+
* Generate a unique checkpoint ID.
|
|
88
|
+
*/
|
|
89
|
+
private generateCheckpointId;
|
|
90
|
+
/**
|
|
91
|
+
* Fetch a checkpoint tuple asynchronously.
|
|
92
|
+
*/
|
|
93
|
+
getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined>;
|
|
94
|
+
/**
|
|
95
|
+
* List checkpoints asynchronously.
|
|
96
|
+
*/
|
|
97
|
+
list(config: RunnableConfig | undefined, options?: {
|
|
98
|
+
filter?: Record<string, unknown>;
|
|
99
|
+
before?: RunnableConfig;
|
|
100
|
+
limit?: number;
|
|
101
|
+
}): AsyncGenerator<CheckpointTuple>;
|
|
102
|
+
/**
|
|
103
|
+
* Store a checkpoint asynchronously.
|
|
104
|
+
*/
|
|
105
|
+
put(config: RunnableConfig, checkpoint: Checkpoint, metadata: CheckpointMetadata, newVersions?: Record<string, unknown>): Promise<RunnableConfig>;
|
|
106
|
+
/**
|
|
107
|
+
* Store intermediate writes asynchronously.
|
|
108
|
+
*/
|
|
109
|
+
putWrites(_config: RunnableConfig, _writes: PendingWrite[], _taskId: string): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Delete all checkpoints for a thread.
|
|
112
|
+
*/
|
|
113
|
+
deleteThread(threadId: string): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Convert checkpoint to API format.
|
|
116
|
+
*/
|
|
117
|
+
private checkpointToApi;
|
|
118
|
+
/**
|
|
119
|
+
* Convert metadata to API format.
|
|
120
|
+
*/
|
|
121
|
+
private metadataToApi;
|
|
122
|
+
/**
|
|
123
|
+
* Convert API response to CheckpointTuple.
|
|
124
|
+
*/
|
|
125
|
+
private responseToTuple;
|
|
126
|
+
/**
|
|
127
|
+
* Serialize channel values for transmission.
|
|
128
|
+
*/
|
|
129
|
+
private serializeChannelValues;
|
|
130
|
+
/**
|
|
131
|
+
* Serialize a value for JSON transmission.
|
|
132
|
+
*/
|
|
133
|
+
private serializeValue;
|
|
134
|
+
/**
|
|
135
|
+
* Deserialize checkpoint data.
|
|
136
|
+
*/
|
|
137
|
+
private deserializeCheckpoint;
|
|
138
|
+
/**
|
|
139
|
+
* Deserialize a value.
|
|
140
|
+
*/
|
|
141
|
+
private deserializeValue;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export { type Checkpoint, type CheckpointMetadata, type CheckpointTuple, HTTPCheckpointSaver, type PendingWrite, type RunnableConfig };
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
// src/exceptions.ts
|
|
2
|
+
var MarchAgentError = class extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "MarchAgentError";
|
|
6
|
+
Error.captureStackTrace?.(this, this.constructor);
|
|
7
|
+
}
|
|
8
|
+
};
|
|
9
|
+
var APIException = class extends MarchAgentError {
|
|
10
|
+
statusCode;
|
|
11
|
+
constructor(message, statusCode) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "APIException";
|
|
14
|
+
this.statusCode = statusCode;
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// src/checkpoint-client.ts
|
|
19
|
+
var CheckpointClient = class {
|
|
20
|
+
baseUrl;
|
|
21
|
+
constructor(baseUrl) {
|
|
22
|
+
this.baseUrl = baseUrl.replace(/\/$/, "");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Store a checkpoint.
|
|
26
|
+
*/
|
|
27
|
+
async put(config, checkpoint, metadata, newVersions = {}) {
|
|
28
|
+
const url = `${this.baseUrl}/checkpoints/`;
|
|
29
|
+
const payload = {
|
|
30
|
+
config,
|
|
31
|
+
checkpoint,
|
|
32
|
+
metadata,
|
|
33
|
+
new_versions: newVersions
|
|
34
|
+
};
|
|
35
|
+
try {
|
|
36
|
+
const response = await fetch(url, {
|
|
37
|
+
method: "PUT",
|
|
38
|
+
headers: { "Content-Type": "application/json" },
|
|
39
|
+
body: JSON.stringify(payload)
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
const errorText = await response.text();
|
|
43
|
+
throw new APIException(`Failed to store checkpoint: ${response.status} - ${errorText}`, response.status);
|
|
44
|
+
}
|
|
45
|
+
return await response.json();
|
|
46
|
+
} catch (error) {
|
|
47
|
+
if (error instanceof APIException) throw error;
|
|
48
|
+
throw new APIException(`Failed to store checkpoint: ${error}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get a checkpoint tuple.
|
|
53
|
+
*/
|
|
54
|
+
async getTuple(threadId, checkpointNs = "", checkpointId) {
|
|
55
|
+
const url = new URL(`${this.baseUrl}/checkpoints/${threadId}`);
|
|
56
|
+
url.searchParams.set("checkpoint_ns", checkpointNs);
|
|
57
|
+
if (checkpointId) {
|
|
58
|
+
url.searchParams.set("checkpoint_id", checkpointId);
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const response = await fetch(url.toString());
|
|
62
|
+
if (response.status === 404) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
const errorText = await response.text();
|
|
67
|
+
throw new APIException(`Failed to get checkpoint: ${response.status} - ${errorText}`, response.status);
|
|
68
|
+
}
|
|
69
|
+
const result = await response.json();
|
|
70
|
+
return result || null;
|
|
71
|
+
} catch (error) {
|
|
72
|
+
if (error instanceof APIException) throw error;
|
|
73
|
+
throw new APIException(`Failed to get checkpoint: ${error}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* List checkpoints.
|
|
78
|
+
*/
|
|
79
|
+
async list(options = {}) {
|
|
80
|
+
const url = new URL(`${this.baseUrl}/checkpoints/`);
|
|
81
|
+
if (options.threadId) url.searchParams.set("thread_id", options.threadId);
|
|
82
|
+
if (options.checkpointNs !== void 0) url.searchParams.set("checkpoint_ns", options.checkpointNs);
|
|
83
|
+
if (options.before) url.searchParams.set("before", options.before);
|
|
84
|
+
if (options.limit) url.searchParams.set("limit", String(options.limit));
|
|
85
|
+
try {
|
|
86
|
+
const response = await fetch(url.toString());
|
|
87
|
+
if (!response.ok) {
|
|
88
|
+
const errorText = await response.text();
|
|
89
|
+
throw new APIException(`Failed to list checkpoints: ${response.status} - ${errorText}`, response.status);
|
|
90
|
+
}
|
|
91
|
+
return await response.json();
|
|
92
|
+
} catch (error) {
|
|
93
|
+
if (error instanceof APIException) throw error;
|
|
94
|
+
throw new APIException(`Failed to list checkpoints: ${error}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Delete all checkpoints for a thread.
|
|
99
|
+
*/
|
|
100
|
+
async deleteThread(threadId) {
|
|
101
|
+
const url = `${this.baseUrl}/checkpoints/${threadId}`;
|
|
102
|
+
try {
|
|
103
|
+
const response = await fetch(url, { method: "DELETE" });
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
const errorText = await response.text();
|
|
106
|
+
throw new APIException(`Failed to delete checkpoints: ${response.status} - ${errorText}`, response.status);
|
|
107
|
+
}
|
|
108
|
+
return await response.json();
|
|
109
|
+
} catch (error) {
|
|
110
|
+
if (error instanceof APIException) throw error;
|
|
111
|
+
throw new APIException(`Failed to delete checkpoints: ${error}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// src/extensions/langgraph.ts
|
|
117
|
+
var HTTPCheckpointSaver = class {
|
|
118
|
+
client;
|
|
119
|
+
constructor(app) {
|
|
120
|
+
this.client = new CheckpointClient(app.gatewayClient.conversationStoreUrl);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get thread_id from config.
|
|
124
|
+
*/
|
|
125
|
+
getThreadId(config) {
|
|
126
|
+
const threadId = config.configurable?.thread_id;
|
|
127
|
+
if (!threadId) {
|
|
128
|
+
throw new Error("Config must contain configurable.thread_id");
|
|
129
|
+
}
|
|
130
|
+
return threadId;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get checkpoint_ns from config.
|
|
134
|
+
*/
|
|
135
|
+
getCheckpointNs(config) {
|
|
136
|
+
return config.configurable?.checkpoint_ns ?? "";
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Get checkpoint_id from config.
|
|
140
|
+
*/
|
|
141
|
+
getCheckpointId(config) {
|
|
142
|
+
return config.configurable?.checkpoint_id;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Generate a unique checkpoint ID.
|
|
146
|
+
*/
|
|
147
|
+
generateCheckpointId() {
|
|
148
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Fetch a checkpoint tuple asynchronously.
|
|
152
|
+
*/
|
|
153
|
+
async getTuple(config) {
|
|
154
|
+
const threadId = this.getThreadId(config);
|
|
155
|
+
const checkpointNs = this.getCheckpointNs(config);
|
|
156
|
+
const checkpointId = this.getCheckpointId(config);
|
|
157
|
+
const result = await this.client.getTuple(threadId, checkpointNs, checkpointId);
|
|
158
|
+
if (!result) {
|
|
159
|
+
return void 0;
|
|
160
|
+
}
|
|
161
|
+
return this.responseToTuple(result);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* List checkpoints asynchronously.
|
|
165
|
+
*/
|
|
166
|
+
async *list(config, options) {
|
|
167
|
+
const threadId = config?.configurable?.thread_id;
|
|
168
|
+
const checkpointNs = config?.configurable?.checkpoint_ns;
|
|
169
|
+
const beforeId = options?.before?.configurable?.checkpoint_id;
|
|
170
|
+
const results = await this.client.list({
|
|
171
|
+
threadId,
|
|
172
|
+
checkpointNs,
|
|
173
|
+
before: beforeId,
|
|
174
|
+
limit: options?.limit
|
|
175
|
+
});
|
|
176
|
+
for (const result of results) {
|
|
177
|
+
const tuple = this.responseToTuple(result);
|
|
178
|
+
if (tuple) {
|
|
179
|
+
yield tuple;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Store a checkpoint asynchronously.
|
|
185
|
+
*/
|
|
186
|
+
async put(config, checkpoint, metadata, newVersions) {
|
|
187
|
+
const threadId = this.getThreadId(config);
|
|
188
|
+
const checkpointNs = this.getCheckpointNs(config);
|
|
189
|
+
let checkpointId = this.getCheckpointId(config);
|
|
190
|
+
if (!checkpointId) {
|
|
191
|
+
checkpointId = checkpoint.id ?? this.generateCheckpointId();
|
|
192
|
+
}
|
|
193
|
+
const apiConfig = {
|
|
194
|
+
configurable: {
|
|
195
|
+
thread_id: threadId,
|
|
196
|
+
checkpoint_ns: checkpointNs,
|
|
197
|
+
checkpoint_id: checkpointId
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
const checkpointData = this.checkpointToApi(checkpoint);
|
|
201
|
+
const metadataData = this.metadataToApi(metadata);
|
|
202
|
+
const result = await this.client.put(
|
|
203
|
+
apiConfig,
|
|
204
|
+
checkpointData,
|
|
205
|
+
metadataData,
|
|
206
|
+
newVersions ?? {}
|
|
207
|
+
);
|
|
208
|
+
return result.config;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Store intermediate writes asynchronously.
|
|
212
|
+
*/
|
|
213
|
+
async putWrites(_config, _writes, _taskId) {
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Delete all checkpoints for a thread.
|
|
217
|
+
*/
|
|
218
|
+
async deleteThread(threadId) {
|
|
219
|
+
await this.client.deleteThread(threadId);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Convert checkpoint to API format.
|
|
223
|
+
*/
|
|
224
|
+
checkpointToApi(checkpoint) {
|
|
225
|
+
return {
|
|
226
|
+
v: checkpoint.v ?? 1,
|
|
227
|
+
id: checkpoint.id ?? this.generateCheckpointId(),
|
|
228
|
+
ts: checkpoint.ts ?? (/* @__PURE__ */ new Date()).toISOString(),
|
|
229
|
+
channel_values: this.serializeChannelValues(checkpoint.channel_values ?? {}),
|
|
230
|
+
channel_versions: checkpoint.channel_versions ?? {},
|
|
231
|
+
versions_seen: checkpoint.versions_seen ?? {},
|
|
232
|
+
pending_sends: checkpoint.pending_sends ?? []
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Convert metadata to API format.
|
|
237
|
+
*/
|
|
238
|
+
metadataToApi(metadata) {
|
|
239
|
+
return {
|
|
240
|
+
source: metadata.source ?? "input",
|
|
241
|
+
step: metadata.step ?? -1,
|
|
242
|
+
writes: metadata.writes,
|
|
243
|
+
parents: metadata.parents ?? {}
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Convert API response to CheckpointTuple.
|
|
248
|
+
*/
|
|
249
|
+
responseToTuple(response) {
|
|
250
|
+
return {
|
|
251
|
+
config: response.config,
|
|
252
|
+
checkpoint: this.deserializeCheckpoint(response.checkpoint),
|
|
253
|
+
metadata: response.metadata,
|
|
254
|
+
parent_config: response.parent_config,
|
|
255
|
+
pending_writes: response.pending_writes ?? []
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Serialize channel values for transmission.
|
|
260
|
+
*/
|
|
261
|
+
serializeChannelValues(values) {
|
|
262
|
+
return this.serializeValue(values);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Serialize a value for JSON transmission.
|
|
266
|
+
*/
|
|
267
|
+
serializeValue(value, depth = 0) {
|
|
268
|
+
const MAX_DEPTH = 100;
|
|
269
|
+
if (depth > MAX_DEPTH) {
|
|
270
|
+
return { __max_depth_exceeded__: true };
|
|
271
|
+
}
|
|
272
|
+
if (value === null || value === void 0) {
|
|
273
|
+
return value;
|
|
274
|
+
}
|
|
275
|
+
if (Buffer.isBuffer(value) || value instanceof Uint8Array) {
|
|
276
|
+
return { __bytes__: Buffer.from(value).toString("base64") };
|
|
277
|
+
}
|
|
278
|
+
if (Array.isArray(value)) {
|
|
279
|
+
return value.map((item) => this.serializeValue(item, depth + 1));
|
|
280
|
+
}
|
|
281
|
+
if (typeof value === "object") {
|
|
282
|
+
const result = {};
|
|
283
|
+
for (const [key, val] of Object.entries(value)) {
|
|
284
|
+
result[key] = this.serializeValue(val, depth + 1);
|
|
285
|
+
}
|
|
286
|
+
return result;
|
|
287
|
+
}
|
|
288
|
+
return value;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Deserialize checkpoint data.
|
|
292
|
+
*/
|
|
293
|
+
deserializeCheckpoint(data) {
|
|
294
|
+
return {
|
|
295
|
+
...data,
|
|
296
|
+
channel_values: this.deserializeValue(data.channel_values)
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Deserialize a value.
|
|
301
|
+
*/
|
|
302
|
+
deserializeValue(value) {
|
|
303
|
+
if (value === null || value === void 0) {
|
|
304
|
+
return value;
|
|
305
|
+
}
|
|
306
|
+
if (typeof value === "object" && !Array.isArray(value)) {
|
|
307
|
+
const obj = value;
|
|
308
|
+
if ("__bytes__" in obj && typeof obj.__bytes__ === "string") {
|
|
309
|
+
return Buffer.from(obj.__bytes__, "base64");
|
|
310
|
+
}
|
|
311
|
+
const result = {};
|
|
312
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
313
|
+
result[key] = this.deserializeValue(val);
|
|
314
|
+
}
|
|
315
|
+
return result;
|
|
316
|
+
}
|
|
317
|
+
if (Array.isArray(value)) {
|
|
318
|
+
return value.map((item) => this.deserializeValue(item));
|
|
319
|
+
}
|
|
320
|
+
return value;
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
export { HTTPCheckpointSaver };
|
|
325
|
+
//# sourceMappingURL=langgraph.js.map
|
|
326
|
+
//# sourceMappingURL=langgraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/exceptions.ts","../../src/checkpoint-client.ts","../../src/extensions/langgraph.ts"],"names":[],"mappings":"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","file":"langgraph.js","sourcesContent":["/**\n * March Agent SDK - Custom Errors\n * Port of Python march_agent/exceptions.py\n */\n\n/**\n * Base error class for March Agent SDK\n */\nexport class MarchAgentError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MarchAgentError'\n Error.captureStackTrace?.(this, this.constructor)\n }\n}\n\n/**\n * Error during agent registration with AI Inventory\n */\nexport class RegistrationError extends MarchAgentError {\n constructor(message: string) {\n super(message)\n this.name = 'RegistrationError'\n }\n}\n\n/**\n * Error during Kafka operations (produce/consume)\n */\nexport class KafkaError extends MarchAgentError {\n constructor(message: string) {\n super(message)\n this.name = 'KafkaError'\n }\n}\n\n/**\n * Error in SDK configuration\n */\nexport class ConfigurationError extends MarchAgentError {\n constructor(message: string) {\n super(message)\n this.name = 'ConfigurationError'\n }\n}\n\n/**\n * Error from API calls to backend services\n */\nexport class APIException extends MarchAgentError {\n statusCode?: number\n\n constructor(message: string, statusCode?: number) {\n super(message)\n this.name = 'APIException'\n this.statusCode = statusCode\n }\n}\n\n/**\n * Error during heartbeat operations\n */\nexport class HeartbeatError extends MarchAgentError {\n constructor(message: string) {\n super(message)\n this.name = 'HeartbeatError'\n }\n}\n\n/**\n * Error during gRPC connection/communication\n */\nexport class GatewayError extends MarchAgentError {\n constructor(message: string) {\n super(message)\n this.name = 'GatewayError'\n }\n}\n","/**\n * March Agent SDK - Checkpoint Client\n * Port of Python march_agent/checkpoint_client.py\n */\n\nimport { APIException } from './exceptions.js'\n\nexport interface CheckpointConfig {\n configurable: {\n thread_id: string\n checkpoint_ns?: string\n checkpoint_id?: string\n }\n}\n\nexport interface CheckpointData {\n v: number\n id: string\n ts: string\n channel_values: Record<string, unknown>\n channel_versions: Record<string, string>\n versions_seen: Record<string, Record<string, string>>\n pending_sends?: unknown[]\n}\n\nexport interface CheckpointMetadata {\n source: string\n step: number\n writes?: unknown\n parents?: Record<string, string>\n}\n\nexport interface CheckpointTuple {\n config: CheckpointConfig\n checkpoint: CheckpointData\n metadata: CheckpointMetadata\n parent_config?: CheckpointConfig\n pending_writes?: unknown[]\n}\n\nexport interface CheckpointListOptions {\n threadId?: string\n checkpointNs?: string\n before?: string\n limit?: number\n}\n\n/**\n * Async HTTP client for checkpoint-store API.\n * Used by LangGraph integration for persisting graph state.\n */\nexport class CheckpointClient {\n private readonly baseUrl: string\n\n constructor(baseUrl: string) {\n this.baseUrl = baseUrl.replace(/\\/$/, '')\n }\n\n /**\n * Store a checkpoint.\n */\n async put(\n config: CheckpointConfig,\n checkpoint: CheckpointData,\n metadata: CheckpointMetadata,\n newVersions: Record<string, unknown> = {}\n ): Promise<{ config: CheckpointConfig }> {\n const url = `${this.baseUrl}/checkpoints/`\n const payload = {\n config,\n checkpoint,\n metadata,\n new_versions: newVersions,\n }\n\n try {\n const response = await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to store checkpoint: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as { config: CheckpointConfig }\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to store checkpoint: ${error}`)\n }\n }\n\n /**\n * Get a checkpoint tuple.\n */\n async getTuple(\n threadId: string,\n checkpointNs: string = '',\n checkpointId?: string\n ): Promise<CheckpointTuple | null> {\n const url = new URL(`${this.baseUrl}/checkpoints/${threadId}`)\n url.searchParams.set('checkpoint_ns', checkpointNs)\n if (checkpointId) {\n url.searchParams.set('checkpoint_id', checkpointId)\n }\n\n try {\n const response = await fetch(url.toString())\n\n if (response.status === 404) {\n return null\n }\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to get checkpoint: ${response.status} - ${errorText}`, response.status)\n }\n\n const result = await response.json() as CheckpointTuple | null\n return result || null\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to get checkpoint: ${error}`)\n }\n }\n\n /**\n * List checkpoints.\n */\n async list(options: CheckpointListOptions = {}): Promise<CheckpointTuple[]> {\n const url = new URL(`${this.baseUrl}/checkpoints/`)\n\n if (options.threadId) url.searchParams.set('thread_id', options.threadId)\n if (options.checkpointNs !== undefined) url.searchParams.set('checkpoint_ns', options.checkpointNs)\n if (options.before) url.searchParams.set('before', options.before)\n if (options.limit) url.searchParams.set('limit', String(options.limit))\n\n try {\n const response = await fetch(url.toString())\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to list checkpoints: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as CheckpointTuple[]\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to list checkpoints: ${error}`)\n }\n }\n\n /**\n * Delete all checkpoints for a thread.\n */\n async deleteThread(threadId: string): Promise<{ thread_id: string; deleted: number }> {\n const url = `${this.baseUrl}/checkpoints/${threadId}`\n\n try {\n const response = await fetch(url, { method: 'DELETE' })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new APIException(`Failed to delete checkpoints: ${response.status} - ${errorText}`, response.status)\n }\n\n return await response.json() as { thread_id: string; deleted: number }\n } catch (error) {\n if (error instanceof APIException) throw error\n throw new APIException(`Failed to delete checkpoints: ${error}`)\n }\n }\n}\n","/**\n * March Agent SDK - LangGraph Extension\n * \n * HTTPCheckpointSaver for LangGraph that stores state via HTTP API.\n * \n * @packageDocumentation\n */\n\nimport type { MarchAgentApp } from '../app.js'\nimport { CheckpointClient } from '../checkpoint-client.js'\nimport type {\n CheckpointConfig,\n CheckpointData,\n CheckpointMetadata as APICheckpointMetadata,\n CheckpointTuple as APICheckpointTuple,\n} from '../checkpoint-client.js'\n\n// Type definitions for LangGraph (optional peer dependency)\n// These are compatible with @langchain/langgraph-checkpoint\ninterface RunnableConfig {\n configurable?: {\n thread_id?: string\n checkpoint_ns?: string\n checkpoint_id?: string\n }\n}\n\ninterface Checkpoint {\n v?: number\n id?: string\n ts?: string\n channel_values?: Record<string, unknown>\n channel_versions?: Record<string, string>\n versions_seen?: Record<string, Record<string, string>>\n pending_sends?: unknown[]\n}\n\ninterface CheckpointMetadata {\n source?: string\n step?: number\n writes?: unknown\n parents?: Record<string, string>\n}\n\ninterface CheckpointTuple {\n config: RunnableConfig\n checkpoint: Checkpoint\n metadata: CheckpointMetadata\n parent_config?: RunnableConfig\n pending_writes?: unknown[]\n}\n\ninterface PendingWrite {\n [key: string]: unknown\n}\n\n/**\n * HTTP-based checkpoint saver for LangGraph.\n * \n * Stores graph state via HTTP calls to the conversation-store checkpoint API,\n * enabling distributed checkpoint storage without direct database access.\n * \n * @example\n * ```typescript\n * import { MarchAgentApp } from 'march-ai-sdk'\n * import { HTTPCheckpointSaver } from 'march-ai-sdk/extensions/langgraph'\n * import { StateGraph } from '@langchain/langgraph'\n * \n * const app = new MarchAgentApp({\n * gatewayUrl: 'agent-gateway:8080',\n * apiKey: 'your-key',\n * })\n * \n * const checkpointer = new HTTPCheckpointSaver(app)\n * \n * const graph = new StateGraph(MyState)\n * // ... define graph ...\n * const compiled = graph.compile({ checkpointer })\n * \n * const config = { configurable: { thread_id: 'my-thread' } }\n * const result = await compiled.invoke({ messages: [...] }, config)\n * ```\n */\nexport class HTTPCheckpointSaver {\n private readonly client: CheckpointClient\n\n constructor(app: MarchAgentApp) {\n this.client = new CheckpointClient(app.gatewayClient.conversationStoreUrl)\n }\n\n /**\n * Get thread_id from config.\n */\n private getThreadId(config: RunnableConfig): string {\n const threadId = config.configurable?.thread_id\n if (!threadId) {\n throw new Error('Config must contain configurable.thread_id')\n }\n return threadId\n }\n\n /**\n * Get checkpoint_ns from config.\n */\n private getCheckpointNs(config: RunnableConfig): string {\n return config.configurable?.checkpoint_ns ?? ''\n }\n\n /**\n * Get checkpoint_id from config.\n */\n private getCheckpointId(config: RunnableConfig): string | undefined {\n return config.configurable?.checkpoint_id\n }\n\n /**\n * Generate a unique checkpoint ID.\n */\n private generateCheckpointId(): string {\n return new Date().toISOString()\n }\n\n /**\n * Fetch a checkpoint tuple asynchronously.\n */\n async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {\n const threadId = this.getThreadId(config)\n const checkpointNs = this.getCheckpointNs(config)\n const checkpointId = this.getCheckpointId(config)\n\n const result = await this.client.getTuple(threadId, checkpointNs, checkpointId)\n\n if (!result) {\n return undefined\n }\n\n return this.responseToTuple(result)\n }\n\n /**\n * List checkpoints asynchronously.\n */\n async *list(\n config: RunnableConfig | undefined,\n options?: {\n filter?: Record<string, unknown>\n before?: RunnableConfig\n limit?: number\n }\n ): AsyncGenerator<CheckpointTuple> {\n const threadId = config?.configurable?.thread_id\n const checkpointNs = config?.configurable?.checkpoint_ns\n const beforeId = options?.before?.configurable?.checkpoint_id\n\n const results = await this.client.list({\n threadId,\n checkpointNs,\n before: beforeId,\n limit: options?.limit,\n })\n\n for (const result of results) {\n const tuple = this.responseToTuple(result)\n if (tuple) {\n yield tuple\n }\n }\n }\n\n /**\n * Store a checkpoint asynchronously.\n */\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n newVersions?: Record<string, unknown>\n ): Promise<RunnableConfig> {\n const threadId = this.getThreadId(config)\n const checkpointNs = this.getCheckpointNs(config)\n\n let checkpointId = this.getCheckpointId(config)\n if (!checkpointId) {\n checkpointId = checkpoint.id ?? this.generateCheckpointId()\n }\n\n const apiConfig: CheckpointConfig = {\n configurable: {\n thread_id: threadId,\n checkpoint_ns: checkpointNs,\n checkpoint_id: checkpointId,\n },\n }\n\n const checkpointData = this.checkpointToApi(checkpoint)\n const metadataData = this.metadataToApi(metadata)\n\n const result = await this.client.put(\n apiConfig,\n checkpointData,\n metadataData,\n newVersions ?? {}\n )\n\n return result.config as RunnableConfig\n }\n\n /**\n * Store intermediate writes asynchronously.\n */\n async putWrites(\n _config: RunnableConfig,\n _writes: PendingWrite[],\n _taskId: string\n ): Promise<void> {\n // Stub - writes are not persisted separately\n // They are included in the checkpoint metadata\n }\n\n /**\n * Delete all checkpoints for a thread.\n */\n async deleteThread(threadId: string): Promise<void> {\n await this.client.deleteThread(threadId)\n }\n\n /**\n * Convert checkpoint to API format.\n */\n private checkpointToApi(checkpoint: Checkpoint): CheckpointData {\n return {\n v: checkpoint.v ?? 1,\n id: checkpoint.id ?? this.generateCheckpointId(),\n ts: checkpoint.ts ?? new Date().toISOString(),\n channel_values: this.serializeChannelValues(checkpoint.channel_values ?? {}),\n channel_versions: checkpoint.channel_versions ?? {},\n versions_seen: checkpoint.versions_seen ?? {},\n pending_sends: checkpoint.pending_sends ?? [],\n }\n }\n\n /**\n * Convert metadata to API format.\n */\n private metadataToApi(metadata: CheckpointMetadata): APICheckpointMetadata {\n return {\n source: metadata.source ?? 'input',\n step: metadata.step ?? -1,\n writes: metadata.writes,\n parents: metadata.parents ?? {},\n }\n }\n\n /**\n * Convert API response to CheckpointTuple.\n */\n private responseToTuple(response: APICheckpointTuple): CheckpointTuple {\n return {\n config: response.config as RunnableConfig,\n checkpoint: this.deserializeCheckpoint(response.checkpoint),\n metadata: response.metadata,\n parent_config: response.parent_config as RunnableConfig | undefined,\n pending_writes: response.pending_writes ?? [],\n }\n }\n\n /**\n * Serialize channel values for transmission.\n */\n private serializeChannelValues(values: Record<string, unknown>): Record<string, unknown> {\n return this.serializeValue(values) as Record<string, unknown>\n }\n\n /**\n * Serialize a value for JSON transmission.\n */\n private serializeValue(value: unknown, depth: number = 0): unknown {\n const MAX_DEPTH = 100\n if (depth > MAX_DEPTH) {\n return { __max_depth_exceeded__: true }\n }\n\n if (value === null || value === undefined) {\n return value\n }\n\n // Handle Buffer/Uint8Array\n if (Buffer.isBuffer(value) || value instanceof Uint8Array) {\n return { __bytes__: Buffer.from(value).toString('base64') }\n }\n\n // Handle arrays\n if (Array.isArray(value)) {\n return value.map(item => this.serializeValue(item, depth + 1))\n }\n\n // Handle objects\n if (typeof value === 'object') {\n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(value)) {\n result[key] = this.serializeValue(val, depth + 1)\n }\n return result\n }\n\n return value\n }\n\n /**\n * Deserialize checkpoint data.\n */\n private deserializeCheckpoint(data: CheckpointData): Checkpoint {\n return {\n ...data,\n channel_values: this.deserializeValue(data.channel_values) as Record<string, unknown>,\n }\n }\n\n /**\n * Deserialize a value.\n */\n private deserializeValue(value: unknown): unknown {\n if (value === null || value === undefined) {\n return value\n }\n\n if (typeof value === 'object' && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>\n\n // Decode base64 bytes\n if ('__bytes__' in obj && typeof obj.__bytes__ === 'string') {\n return Buffer.from(obj.__bytes__, 'base64')\n }\n\n // Recurse into object\n const result: Record<string, unknown> = {}\n for (const [key, val] of Object.entries(obj)) {\n result[key] = this.deserializeValue(val)\n }\n return result\n }\n\n if (Array.isArray(value)) {\n return value.map(item => this.deserializeValue(item))\n }\n\n return value\n }\n}\n\nexport type { RunnableConfig, Checkpoint, CheckpointMetadata, CheckpointTuple, PendingWrite }\n"]}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { M as MarchAgentApp } from '../app-C_umwZXh.js';
|
|
2
|
+
import 'zod';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* March Agent SDK - Vercel AI SDK Extension
|
|
6
|
+
*
|
|
7
|
+
* VercelAIMessageStore for persistent message history with Vercel AI SDK.
|
|
8
|
+
*
|
|
9
|
+
* @packageDocumentation
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
interface CoreMessage {
|
|
13
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
14
|
+
content: string | Array<{
|
|
15
|
+
type: string;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}>;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Persistent message store for Vercel AI SDK.
|
|
22
|
+
*
|
|
23
|
+
* Stores and retrieves AI SDK message history using the agent-state API.
|
|
24
|
+
* Messages are serialized as JSON for full fidelity.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* import { MarchAgentApp } from 'march-ai-sdk'
|
|
29
|
+
* import { VercelAIMessageStore } from 'march-ai-sdk/extensions/vercel-ai'
|
|
30
|
+
* import { streamText } from 'ai'
|
|
31
|
+
* import { openai } from '@ai-sdk/openai'
|
|
32
|
+
*
|
|
33
|
+
* const app = new MarchAgentApp({
|
|
34
|
+
* gatewayUrl: 'agent-gateway:8080',
|
|
35
|
+
* apiKey: 'your-key',
|
|
36
|
+
* })
|
|
37
|
+
*
|
|
38
|
+
* const store = new VercelAIMessageStore(app)
|
|
39
|
+
* const agent = app.registerMe({ ... })
|
|
40
|
+
*
|
|
41
|
+
* agent.onMessage(async (message, sender) => {
|
|
42
|
+
* // Load message history
|
|
43
|
+
* const history = await store.load(message.conversationId)
|
|
44
|
+
*
|
|
45
|
+
* // Add user message
|
|
46
|
+
* const messages: CoreMessage[] = [
|
|
47
|
+
* ...history,
|
|
48
|
+
* { role: 'user', content: message.content }
|
|
49
|
+
* ]
|
|
50
|
+
*
|
|
51
|
+
* // Stream response
|
|
52
|
+
* const streamer = agent.streamer(message)
|
|
53
|
+
*
|
|
54
|
+
* const result = await streamText({
|
|
55
|
+
* model: openai('gpt-4o'),
|
|
56
|
+
* messages,
|
|
57
|
+
* onChunk: ({ chunk }) => {
|
|
58
|
+
* if (chunk.type === 'text-delta') {
|
|
59
|
+
* streamer.stream(chunk.textDelta)
|
|
60
|
+
* }
|
|
61
|
+
* }
|
|
62
|
+
* })
|
|
63
|
+
*
|
|
64
|
+
* await streamer.finish()
|
|
65
|
+
*
|
|
66
|
+
* // Save updated history
|
|
67
|
+
* await store.save(message.conversationId, [
|
|
68
|
+
* ...messages,
|
|
69
|
+
* { role: 'assistant', content: result.text }
|
|
70
|
+
* ])
|
|
71
|
+
* })
|
|
72
|
+
*
|
|
73
|
+
* app.run()
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
declare class VercelAIMessageStore {
|
|
77
|
+
private static readonly NAMESPACE;
|
|
78
|
+
private readonly client;
|
|
79
|
+
constructor(app: MarchAgentApp);
|
|
80
|
+
/**
|
|
81
|
+
* Load message history for a conversation.
|
|
82
|
+
*
|
|
83
|
+
* @param conversationId - The conversation ID to load history for
|
|
84
|
+
* @returns Array of CoreMessage objects (empty array if no history)
|
|
85
|
+
*/
|
|
86
|
+
load(conversationId: string): Promise<CoreMessage[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Save message history for a conversation.
|
|
89
|
+
*
|
|
90
|
+
* @param conversationId - The conversation ID to save history for
|
|
91
|
+
* @param messages - Array of CoreMessage objects to save
|
|
92
|
+
*/
|
|
93
|
+
save(conversationId: string, messages: CoreMessage[]): Promise<void>;
|
|
94
|
+
/**
|
|
95
|
+
* Clear message history for a conversation.
|
|
96
|
+
*
|
|
97
|
+
* @param conversationId - The conversation ID to clear history for
|
|
98
|
+
*/
|
|
99
|
+
clear(conversationId: string): Promise<void>;
|
|
100
|
+
/**
|
|
101
|
+
* Append messages to existing history.
|
|
102
|
+
*
|
|
103
|
+
* @param conversationId - The conversation ID
|
|
104
|
+
* @param newMessages - Messages to append
|
|
105
|
+
*/
|
|
106
|
+
append(conversationId: string, newMessages: CoreMessage[]): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Get the last N messages from history.
|
|
109
|
+
*
|
|
110
|
+
* @param conversationId - The conversation ID
|
|
111
|
+
* @param count - Number of messages to retrieve
|
|
112
|
+
*/
|
|
113
|
+
getLastMessages(conversationId: string, count: number): Promise<CoreMessage[]>;
|
|
114
|
+
/**
|
|
115
|
+
* Validate that an object is a valid message.
|
|
116
|
+
*/
|
|
117
|
+
private isValidMessage;
|
|
118
|
+
/**
|
|
119
|
+
* Serialize a message for storage.
|
|
120
|
+
*/
|
|
121
|
+
private serializeMessage;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export { type CoreMessage, VercelAIMessageStore };
|