@agentskit/adapters 0.4.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Emerson Braun
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.cjs ADDED
@@ -0,0 +1,487 @@
1
+ 'use strict';
2
+
3
+ // src/createAdapter.ts
4
+ function createAdapter(config) {
5
+ return {
6
+ createSource: (request) => ({
7
+ stream: async function* () {
8
+ try {
9
+ const result = await config.send(request);
10
+ const stream = result instanceof Response ? result.body : result;
11
+ yield* config.parse(stream);
12
+ } catch (err) {
13
+ yield {
14
+ type: "error",
15
+ content: err instanceof Error ? err.message : String(err)
16
+ };
17
+ }
18
+ },
19
+ abort: () => {
20
+ config.abort?.();
21
+ }
22
+ })
23
+ };
24
+ }
25
+
26
+ // src/generic.ts
27
+ function generic(config) {
28
+ return {
29
+ createSource: (request) => {
30
+ let reader = null;
31
+ const decoder = new TextDecoder();
32
+ return {
33
+ stream: async function* () {
34
+ try {
35
+ const stream = await config.send(request);
36
+ reader = stream.getReader();
37
+ while (true) {
38
+ const { done, value } = await reader.read();
39
+ if (done) break;
40
+ const text = decoder.decode(value, { stream: true });
41
+ yield { type: "text", content: text };
42
+ }
43
+ yield { type: "done" };
44
+ } catch (err) {
45
+ yield {
46
+ type: "error",
47
+ content: err instanceof Error ? err.message : String(err)
48
+ };
49
+ } finally {
50
+ reader?.releaseLock();
51
+ }
52
+ },
53
+ abort: () => {
54
+ void reader?.cancel();
55
+ }
56
+ };
57
+ }
58
+ };
59
+ }
60
+
61
+ // src/utils.ts
62
+ function toProviderMessages(messages) {
63
+ return messages.map((message) => ({
64
+ role: message.role,
65
+ content: message.content
66
+ }));
67
+ }
68
+ async function* readSSELines(stream) {
69
+ const reader = stream.getReader();
70
+ const decoder = new TextDecoder();
71
+ let buffer = "";
72
+ try {
73
+ while (true) {
74
+ const { done, value } = await reader.read();
75
+ if (done) break;
76
+ buffer += decoder.decode(value, { stream: true });
77
+ const lines = buffer.split("\n");
78
+ buffer = lines.pop() ?? "";
79
+ for (const line of lines) {
80
+ if (!line.startsWith("data: ")) continue;
81
+ const data = line.slice(6).trim();
82
+ if (data) yield data;
83
+ }
84
+ }
85
+ } finally {
86
+ reader.releaseLock();
87
+ }
88
+ }
89
+ async function* readNDJSONLines(stream) {
90
+ const reader = stream.getReader();
91
+ const decoder = new TextDecoder();
92
+ let buffer = "";
93
+ try {
94
+ while (true) {
95
+ const { done, value } = await reader.read();
96
+ if (done) break;
97
+ buffer += decoder.decode(value, { stream: true });
98
+ const lines = buffer.split("\n");
99
+ buffer = lines.pop() ?? "";
100
+ for (const line of lines) {
101
+ const trimmed = line.trim();
102
+ if (trimmed) yield trimmed;
103
+ }
104
+ }
105
+ } finally {
106
+ reader.releaseLock();
107
+ }
108
+ }
109
+ async function* parseOpenAIStream(stream) {
110
+ for await (const data of readSSELines(stream)) {
111
+ if (data === "[DONE]") {
112
+ yield { type: "done" };
113
+ return;
114
+ }
115
+ try {
116
+ const event = JSON.parse(data);
117
+ const delta = event.choices?.[0]?.delta;
118
+ if (typeof delta?.content === "string") {
119
+ yield { type: "text", content: delta.content };
120
+ } else if (Array.isArray(delta?.tool_calls)) {
121
+ for (const toolCall of delta.tool_calls) {
122
+ if (toolCall?.function?.name) {
123
+ yield {
124
+ type: "tool_call",
125
+ toolCall: {
126
+ id: toolCall.id ?? `${toolCall.function.name}-${Date.now()}`,
127
+ name: toolCall.function.name,
128
+ args: toolCall.function.arguments ?? "{}"
129
+ }
130
+ };
131
+ }
132
+ }
133
+ }
134
+ } catch {
135
+ }
136
+ }
137
+ yield { type: "done" };
138
+ }
139
+ async function* parseAnthropicStream(stream) {
140
+ for await (const data of readSSELines(stream)) {
141
+ if (data === "[DONE]") continue;
142
+ try {
143
+ const event = JSON.parse(data);
144
+ if (event.type === "content_block_delta" && event.delta?.text) {
145
+ yield { type: "text", content: event.delta.text };
146
+ } else if (event.type === "content_block_start" && event.content_block?.type === "tool_use") {
147
+ yield {
148
+ type: "tool_call",
149
+ toolCall: {
150
+ id: event.content_block.id,
151
+ name: event.content_block.name,
152
+ args: JSON.stringify(event.content_block.input ?? {})
153
+ }
154
+ };
155
+ } else if (event.type === "message_stop") {
156
+ yield { type: "done" };
157
+ return;
158
+ }
159
+ } catch {
160
+ }
161
+ }
162
+ yield { type: "done" };
163
+ }
164
+ async function* parseGeminiStream(stream) {
165
+ for await (const data of readSSELines(stream)) {
166
+ try {
167
+ const event = JSON.parse(data);
168
+ const text = event.candidates?.[0]?.content?.parts?.map((part) => part.text ?? "").join("");
169
+ if (text) yield { type: "text", content: text };
170
+ } catch {
171
+ }
172
+ }
173
+ yield { type: "done" };
174
+ }
175
+ async function* parseOllamaStream(stream) {
176
+ for await (const data of readNDJSONLines(stream)) {
177
+ try {
178
+ const event = JSON.parse(data);
179
+ if (event.message?.content) {
180
+ yield { type: "text", content: event.message.content };
181
+ }
182
+ if (event.done) {
183
+ yield { type: "done" };
184
+ return;
185
+ }
186
+ } catch {
187
+ }
188
+ }
189
+ yield { type: "done" };
190
+ }
191
+ function createStreamSource(doFetch, parse, errorLabel) {
192
+ let abortController = new AbortController();
193
+ return {
194
+ stream: async function* () {
195
+ try {
196
+ const response = await doFetch(abortController.signal);
197
+ if (!response.ok || !response.body) {
198
+ yield { type: "error", content: `${errorLabel} error: ${response.status}` };
199
+ return;
200
+ }
201
+ yield* parse(response.body);
202
+ } catch (err) {
203
+ if (err instanceof DOMException && err.name === "AbortError") return;
204
+ yield {
205
+ type: "error",
206
+ content: err instanceof Error ? err.message : String(err)
207
+ };
208
+ }
209
+ },
210
+ abort: () => {
211
+ abortController?.abort();
212
+ abortController = null;
213
+ }
214
+ };
215
+ }
216
+
217
+ // src/anthropic.ts
218
+ function anthropic(config) {
219
+ const { apiKey, model, baseUrl = "https://api.anthropic.com", maxTokens = 4096 } = config;
220
+ return {
221
+ createSource: (request) => {
222
+ const body = {
223
+ model,
224
+ max_tokens: request.context?.maxTokens ?? maxTokens,
225
+ messages: request.messages.filter((message) => message.role !== "system").map((message) => ({ role: message.role, content: message.content })),
226
+ system: request.messages.find((message) => message.role === "system")?.content,
227
+ tools: request.context?.tools?.map((tool) => ({
228
+ name: tool.name,
229
+ description: tool.description,
230
+ input_schema: tool.schema
231
+ })),
232
+ stream: true
233
+ };
234
+ return createStreamSource(
235
+ (signal) => fetch(`${baseUrl}/v1/messages`, {
236
+ method: "POST",
237
+ headers: {
238
+ "Content-Type": "application/json",
239
+ "x-api-key": apiKey,
240
+ "anthropic-version": "2023-06-01"
241
+ },
242
+ body: JSON.stringify(body),
243
+ signal
244
+ }),
245
+ parseAnthropicStream,
246
+ "Anthropic API"
247
+ );
248
+ }
249
+ };
250
+ }
251
+
252
+ // src/openai.ts
253
+ function openai(config) {
254
+ const { apiKey, model, baseUrl = "https://api.openai.com" } = config;
255
+ return {
256
+ createSource: (request) => {
257
+ const body = {
258
+ model,
259
+ messages: toProviderMessages(request.messages),
260
+ tools: request.context?.tools?.map((tool) => ({
261
+ type: "function",
262
+ function: {
263
+ name: tool.name,
264
+ description: tool.description,
265
+ parameters: tool.schema
266
+ }
267
+ })),
268
+ temperature: request.context?.temperature,
269
+ max_tokens: request.context?.maxTokens,
270
+ stream: true
271
+ };
272
+ return createStreamSource(
273
+ (signal) => fetch(`${baseUrl}/v1/chat/completions`, {
274
+ method: "POST",
275
+ headers: {
276
+ "Content-Type": "application/json",
277
+ "Authorization": `Bearer ${apiKey}`
278
+ },
279
+ body: JSON.stringify(body),
280
+ signal
281
+ }),
282
+ parseOpenAIStream,
283
+ "OpenAI API"
284
+ );
285
+ }
286
+ };
287
+ }
288
+
289
+ // src/gemini.ts
290
+ function gemini(config) {
291
+ const { apiKey, model, baseUrl = "https://generativelanguage.googleapis.com" } = config;
292
+ return {
293
+ createSource: (request) => {
294
+ const body = {
295
+ contents: request.messages.filter((message) => message.role !== "system").map((message) => ({
296
+ role: message.role === "assistant" ? "model" : "user",
297
+ parts: [{ text: message.content }]
298
+ })),
299
+ systemInstruction: request.messages.find((message) => message.role === "system") ? {
300
+ role: "system",
301
+ parts: [{ text: request.messages.find((message) => message.role === "system").content }]
302
+ } : void 0
303
+ };
304
+ return createStreamSource(
305
+ (signal) => fetch(
306
+ `${baseUrl}/v1beta/models/${model}:streamGenerateContent?alt=sse&key=${apiKey}`,
307
+ {
308
+ method: "POST",
309
+ headers: { "Content-Type": "application/json" },
310
+ body: JSON.stringify(body),
311
+ signal
312
+ }
313
+ ),
314
+ parseGeminiStream,
315
+ "Gemini API"
316
+ );
317
+ }
318
+ };
319
+ }
320
+
321
+ // src/openai-compatible.ts
322
+ function createOpenAICompatibleAdapter(defaultBaseUrl) {
323
+ return function openAICompatibleAdapter(config) {
324
+ return openai({
325
+ ...config,
326
+ baseUrl: config.baseUrl ?? defaultBaseUrl
327
+ });
328
+ };
329
+ }
330
+
331
+ // src/grok.ts
332
+ var grok = createOpenAICompatibleAdapter("https://api.x.ai");
333
+
334
+ // src/ollama.ts
335
+ function ollama(config) {
336
+ const { model, baseUrl = "http://localhost:11434" } = config;
337
+ return {
338
+ createSource: (request) => {
339
+ const body = {
340
+ model,
341
+ stream: true,
342
+ messages: request.messages.map((message) => ({
343
+ role: message.role,
344
+ content: message.content
345
+ }))
346
+ };
347
+ return createStreamSource(
348
+ (signal) => fetch(`${baseUrl}/api/chat`, {
349
+ method: "POST",
350
+ headers: { "Content-Type": "application/json" },
351
+ body: JSON.stringify(body),
352
+ signal
353
+ }),
354
+ parseOllamaStream,
355
+ "Ollama API"
356
+ );
357
+ }
358
+ };
359
+ }
360
+
361
+ // src/deepseek.ts
362
+ var deepseek = createOpenAICompatibleAdapter("https://api.deepseek.com");
363
+
364
+ // src/kimi.ts
365
+ var kimi = createOpenAICompatibleAdapter("https://api.moonshot.ai");
366
+
367
+ // src/langchain.ts
368
+ function asText(value) {
369
+ if (typeof value === "string") return value;
370
+ if (value && typeof value === "object" && "content" in value) {
371
+ const content = value.content;
372
+ if (typeof content === "string") return content;
373
+ }
374
+ return "";
375
+ }
376
+ function langchain(config) {
377
+ const { runnable, mode = "stream" } = config;
378
+ return {
379
+ createSource: (request) => ({
380
+ stream: async function* () {
381
+ try {
382
+ if (mode === "events" && runnable.streamEvents) {
383
+ const events = await runnable.streamEvents(
384
+ { messages: request.messages },
385
+ { version: "v2" }
386
+ );
387
+ for await (const event of events) {
388
+ const eventName = String(event.event ?? "");
389
+ if (eventName.endsWith("_stream")) {
390
+ const chunk = asText(event.data);
391
+ if (chunk) yield { type: "text", content: chunk };
392
+ } else if (eventName.endsWith("_start") && event.name) {
393
+ yield {
394
+ type: "tool_call",
395
+ toolCall: {
396
+ id: String(event.run_id ?? `${event.name}-${Date.now()}`),
397
+ name: String(event.name),
398
+ args: JSON.stringify(event.data ?? {})
399
+ }
400
+ };
401
+ } else if (eventName.endsWith("_end")) {
402
+ continue;
403
+ }
404
+ }
405
+ } else if (runnable.stream) {
406
+ const stream = await runnable.stream({ messages: request.messages });
407
+ for await (const value of stream) {
408
+ const chunk = asText(value);
409
+ if (chunk) yield { type: "text", content: chunk };
410
+ }
411
+ } else {
412
+ yield { type: "error", content: "Runnable does not implement stream() or streamEvents()" };
413
+ return;
414
+ }
415
+ yield { type: "done" };
416
+ } catch (error) {
417
+ yield {
418
+ type: "error",
419
+ content: error instanceof Error ? error.message : String(error)
420
+ };
421
+ }
422
+ },
423
+ abort: () => {
424
+ }
425
+ })
426
+ };
427
+ }
428
+ function langgraph(config) {
429
+ return langchain({
430
+ runnable: config.graph,
431
+ mode: "events"
432
+ });
433
+ }
434
+
435
+ // src/vercel-ai.ts
436
+ async function* parseVercelStream(stream) {
437
+ const reader = stream.getReader();
438
+ const decoder = new TextDecoder();
439
+ try {
440
+ while (true) {
441
+ const { done, value } = await reader.read();
442
+ if (done) break;
443
+ const text = decoder.decode(value, { stream: true });
444
+ if (text) yield { type: "text", content: text };
445
+ }
446
+ } finally {
447
+ reader.releaseLock();
448
+ }
449
+ yield { type: "done" };
450
+ }
451
+ function vercelAI(config) {
452
+ const { api, headers = {} } = config;
453
+ return {
454
+ createSource: (request) => {
455
+ const body = {
456
+ messages: request.messages.map((message) => ({ role: message.role, content: message.content })),
457
+ tools: request.context?.tools,
458
+ systemPrompt: request.context?.systemPrompt
459
+ };
460
+ return createStreamSource(
461
+ (signal) => fetch(api, {
462
+ method: "POST",
463
+ headers: { "Content-Type": "application/json", ...headers },
464
+ body: JSON.stringify(body),
465
+ signal
466
+ }),
467
+ parseVercelStream,
468
+ "API"
469
+ );
470
+ }
471
+ };
472
+ }
473
+
474
+ exports.anthropic = anthropic;
475
+ exports.createAdapter = createAdapter;
476
+ exports.deepseek = deepseek;
477
+ exports.gemini = gemini;
478
+ exports.generic = generic;
479
+ exports.grok = grok;
480
+ exports.kimi = kimi;
481
+ exports.langchain = langchain;
482
+ exports.langgraph = langgraph;
483
+ exports.ollama = ollama;
484
+ exports.openai = openai;
485
+ exports.vercelAI = vercelAI;
486
+ //# sourceMappingURL=index.cjs.map
487
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/createAdapter.ts","../src/generic.ts","../src/utils.ts","../src/anthropic.ts","../src/openai.ts","../src/gemini.ts","../src/openai-compatible.ts","../src/grok.ts","../src/ollama.ts","../src/deepseek.ts","../src/kimi.ts","../src/langchain.ts","../src/vercel-ai.ts"],"names":[],"mappings":";;;AAGO,SAAS,cAAc,MAAA,EAA6C;AACzE,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,OAAA,MAA2C;AAAA,MACxD,QAAQ,mBAAuD;AAC7D,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACxC,UAAA,MAAM,MAAA,GAAS,MAAA,YAAkB,QAAA,GAC7B,MAAA,CAAO,IAAA,GACP,MAAA;AACJ,UAAA,OAAO,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,QAC5B,SAAS,GAAA,EAAK;AACZ,UAAA,MAAM;AAAA,YACJ,IAAA,EAAM,OAAA;AAAA,YACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,WAC1D;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,OAAO,MAAM;AACX,QAAA,MAAA,CAAO,KAAA,IAAQ;AAAA,MACjB;AAAA,KACF;AAAA,GACF;AACF;;;ACtBO,SAAS,QAAQ,MAAA,EAA8C;AACpE,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,OAAA,KAA0C;AACvD,MAAA,IAAI,MAAA,GAAyD,IAAA;AAC7D,MAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAEhC,MAAA,OAAO;AAAA,QACL,QAAQ,mBAAuD;AAC7D,UAAA,IAAI;AACF,YAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACxC,YAAA,MAAA,GAAS,OAAO,SAAA,EAAU;AAE1B,YAAA,OAAO,IAAA,EAAM;AACX,cAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,cAAA,IAAI,IAAA,EAAM;AACV,cAAA,MAAM,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AACnD,cAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAK;AAAA,YACtC;AAEA,YAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,UACvB,SAAS,GAAA,EAAK;AACZ,YAAA,MAAM;AAAA,cACJ,IAAA,EAAM,OAAA;AAAA,cACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,aAC1D;AAAA,UACF,CAAA,SAAE;AACA,YAAA,MAAA,EAAQ,WAAA,EAAY;AAAA,UACtB;AAAA,QACF,CAAA;AAAA,QACA,OAAO,MAAM;AACX,UAAA,KAAK,QAAQ,MAAA,EAAO;AAAA,QACtB;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;;;ACpCO,SAAS,mBAAmB,QAAA,EAAqB;AACtD,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,OAAA,MAAY;AAAA,IAC9B,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,SAAS,OAAA,CAAQ;AAAA,GACnB,CAAE,CAAA;AACJ;AAEA,gBAAuB,aAAa,MAAA,EAAuD;AACzF,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AAEV,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAChC,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAChC,QAAA,IAAI,MAAM,MAAM,IAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAEA,gBAAuB,gBAAgB,MAAA,EAAuD;AAC5F,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AAEV,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,QAAA,IAAI,SAAS,MAAM,OAAA;AAAA,MACrB;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAEA,gBAAuB,kBAAkB,MAAA,EAA4D;AACnG,EAAA,WAAA,MAAiB,IAAA,IAAQ,YAAA,CAAa,MAAM,CAAA,EAAG;AAC7C,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA,EAAG,KAAA;AAElC,MAAA,IAAI,OAAO,KAAA,EAAO,OAAA,KAAY,QAAA,EAAU;AACtC,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,MAC/C,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,UAAU,CAAA,EAAG;AAC3C,QAAA,KAAA,MAAW,QAAA,IAAY,MAAM,UAAA,EAAY;AACvC,UAAA,IAAI,QAAA,EAAU,UAAU,IAAA,EAAM;AAC5B,YAAA,MAAM;AAAA,cACJ,IAAA,EAAM,WAAA;AAAA,cACN,QAAA,EAAU;AAAA,gBACR,EAAA,EAAI,QAAA,CAAS,EAAA,IAAM,CAAA,EAAG,QAAA,CAAS,SAAS,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,gBAC1D,IAAA,EAAM,SAAS,QAAA,CAAS,IAAA;AAAA,gBACxB,IAAA,EAAM,QAAA,CAAS,QAAA,CAAS,SAAA,IAAa;AAAA;AACvC,aACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACvB;AAEA,gBAAuB,qBAAqB,MAAA,EAA4D;AACtG,EAAA,WAAA,MAAiB,IAAA,IAAQ,YAAA,CAAa,MAAM,CAAA,EAAG;AAC7C,IAAA,IAAI,SAAS,QAAA,EAAU;AAEvB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,qBAAA,IAAyB,KAAA,CAAM,OAAO,IAAA,EAAM;AAC7D,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,MAAM,IAAA,EAAK;AAAA,MAClD,WAAW,KAAA,CAAM,IAAA,KAAS,yBAAyB,KAAA,CAAM,aAAA,EAAe,SAAS,UAAA,EAAY;AAC3F,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,WAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,EAAA,EAAI,MAAM,aAAA,CAAc,EAAA;AAAA,YACxB,IAAA,EAAM,MAAM,aAAA,CAAc,IAAA;AAAA,YAC1B,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,aAAA,CAAc,KAAA,IAAS,EAAE;AAAA;AACtD,SACF;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,cAAA,EAAgB;AACxC,QAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACrB,QAAA;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACvB;AAEA,gBAAuB,kBAAkB,MAAA,EAA4D;AACnG,EAAA,WAAA,MAAiB,IAAA,IAAQ,YAAA,CAAa,MAAM,CAAA,EAAG;AAC7C,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,GAAa,CAAC,GAAG,OAAA,EAAS,KAAA,EACzC,GAAA,CAAI,CAAC,SAA4B,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA,CACjD,KAAK,EAAE,CAAA;AACV,MAAA,IAAI,MAAM,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,IAAA,EAAK;AAAA,IAChD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACvB;AAEA,gBAAuB,kBAAkB,MAAA,EAA4D;AACnG,EAAA,WAAA,MAAiB,IAAA,IAAQ,eAAA,CAAgB,MAAM,CAAA,EAAG;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,QAAQ,OAAA,EAAQ;AAAA,MACvD;AACA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACrB,QAAA;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACvB;AAEO,SAAS,kBAAA,CACd,OAAA,EACA,KAAA,EACA,UAAA,EACc;AACd,EAAA,IAAI,eAAA,GAA0C,IAAI,eAAA,EAAgB;AAElE,EAAA,OAAO;AAAA,IACL,QAAQ,mBAAuD;AAC7D,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,eAAA,CAAiB,MAAM,CAAA;AAEtD,QAAA,IAAI,CAAC,QAAA,CAAS,EAAA,IAAM,CAAC,SAAS,IAAA,EAAM;AAClC,UAAA,MAAM,EAAE,MAAM,OAAA,EAAS,OAAA,EAAS,GAAG,UAAU,CAAA,QAAA,EAAW,QAAA,CAAS,MAAM,CAAA,CAAA,EAAG;AAC1E,UAAA;AAAA,QACF;AAEA,QAAA,OAAO,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,MAC5B,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AAC9D,QAAA,MAAM;AAAA,UACJ,IAAA,EAAM,OAAA;AAAA,UACN,SAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SAC1D;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,eAAA,EAAiB,KAAA,EAAM;AACvB,MAAA,eAAA,GAAkB,IAAA;AAAA,IACpB;AAAA,GACF;AACF;;;AClLO,SAAS,UAAU,MAAA,EAAyC;AACjE,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAU,2BAAA,EAA6B,SAAA,GAAY,MAAK,GAAI,MAAA;AAEnF,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,OAAA,KAA0C;AACvD,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,KAAA;AAAA,QACA,UAAA,EAAY,OAAA,CAAQ,OAAA,EAAS,SAAA,IAAa,SAAA;AAAA,QAC1C,UAAU,OAAA,CAAQ,QAAA,CACf,OAAO,CAAA,OAAA,KAAW,OAAA,CAAQ,SAAS,QAAQ,CAAA,CAC3C,GAAA,CAAI,CAAA,OAAA,MAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAM,OAAA,EAAS,OAAA,CAAQ,SAAQ,CAAE,CAAA;AAAA,QACpE,MAAA,EAAQ,QAAQ,QAAA,CAAS,IAAA,CAAK,aAAW,OAAA,CAAQ,IAAA,KAAS,QAAQ,CAAA,EAAG,OAAA;AAAA,QACrE,KAAA,EAAO,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,IAAI,CAAA,IAAA,MAAS;AAAA,UAC1C,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,cAAc,IAAA,CAAK;AAAA,SACrB,CAAE,CAAA;AAAA,QACF,MAAA,EAAQ;AAAA,OACV;AAEA,MAAA,OAAO,kBAAA;AAAA,QACL,CAAC,MAAA,KAAW,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,YAAA,CAAA,EAAgB;AAAA,UAC1C,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,WAAA,EAAa,MAAA;AAAA,YACb,mBAAA,EAAqB;AAAA,WACvB;AAAA,UACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzB;AAAA,SACD,CAAA;AAAA,QACD,oBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;;;ACrCO,SAAS,OAAO,MAAA,EAAsC;AAC3D,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,GAAU,0BAAyB,GAAI,MAAA;AAE9D,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,OAAA,KAA0C;AACvD,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,KAAA;AAAA,QACA,QAAA,EAAU,kBAAA,CAAmB,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAC7C,KAAA,EAAO,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,IAAI,CAAA,IAAA,MAAS;AAAA,UAC1C,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,aAAa,IAAA,CAAK,WAAA;AAAA,YAClB,YAAY,IAAA,CAAK;AAAA;AACnB,SACF,CAAE,CAAA;AAAA,QACF,WAAA,EAAa,QAAQ,OAAA,EAAS,WAAA;AAAA,QAC9B,UAAA,EAAY,QAAQ,OAAA,EAAS,SAAA;AAAA,QAC7B,MAAA,EAAQ;AAAA,OACV;AAEA,MAAA,OAAO,kBAAA;AAAA,QACL,CAAC,MAAA,KAAW,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,oBAAA,CAAA,EAAwB;AAAA,UAClD,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,eAAA,EAAiB,UAAU,MAAM,CAAA;AAAA,WACnC;AAAA,UACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzB;AAAA,SACD,CAAA;AAAA,QACD,iBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;;;ACpCO,SAAS,OAAO,MAAA,EAAsC;AAC3D,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,GAAU,6CAA4C,GAAI,MAAA;AAEjF,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,OAAA,KAA0C;AACvD,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,QAAA,EAAU,OAAA,CAAQ,QAAA,CACf,MAAA,CAAO,CAAA,OAAA,KAAW,QAAQ,IAAA,KAAS,QAAQ,CAAA,CAC3C,GAAA,CAAI,CAAA,OAAA,MAAY;AAAA,UACf,IAAA,EAAM,OAAA,CAAQ,IAAA,KAAS,WAAA,GAAc,OAAA,GAAU,MAAA;AAAA,UAC/C,OAAO,CAAC,EAAE,IAAA,EAAM,OAAA,CAAQ,SAAS;AAAA,SACnC,CAAE,CAAA;AAAA,QACJ,iBAAA,EAAmB,QAAQ,QAAA,CAAS,IAAA,CAAK,aAAW,OAAA,CAAQ,IAAA,KAAS,QAAQ,CAAA,GACzE;AAAA,UACE,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,CAAC,EAAE,IAAA,EAAM,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAA,OAAA,KAAW,OAAA,CAAQ,IAAA,KAAS,QAAQ,CAAA,CAAG,SAAS;AAAA,SACxF,GACA;AAAA,OACN;AAEA,MAAA,OAAO,kBAAA;AAAA,QACL,CAAC,MAAA,KAAW,KAAA;AAAA,UACV,CAAA,EAAG,OAAO,CAAA,eAAA,EAAkB,KAAK,sCAAsC,MAAM,CAAA,CAAA;AAAA,UAC7E;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,YACzB;AAAA;AACF,SACF;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;;;ACvCO,SAAS,8BAA8B,cAAA,EAAwB;AACpE,EAAA,OAAO,SAAS,wBAAwB,MAAA,EAAgD;AACtF,IAAA,OAAO,MAAA,CAAO;AAAA,MACZ,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC5B,CAAA;AAAA,EACH,CAAA;AACF;;;ACRO,IAAM,IAAA,GAAO,8BAA8B,kBAAkB;;;ACI7D,SAAS,OAAO,MAAA,EAAsC;AAC3D,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,GAAU,wBAAA,EAAyB,GAAI,MAAA;AAEtD,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,OAAA,KAA0C;AACvD,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,KAAA;AAAA,QACA,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,MAAY;AAAA,UACzC,MAAM,OAAA,CAAQ,IAAA;AAAA,UACd,SAAS,OAAA,CAAQ;AAAA,SACnB,CAAE;AAAA,OACJ;AAEA,MAAA,OAAO,kBAAA;AAAA,QACL,CAAC,MAAA,KAAW,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,SAAA,CAAA,EAAa;AAAA,UACvC,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,UAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzB;AAAA,SACD,CAAA;AAAA,QACD,iBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;;;AC9BO,IAAM,QAAA,GAAW,8BAA8B,0BAA0B;;;ACAzE,IAAM,IAAA,GAAO,8BAA8B,yBAAyB;;;ACQ3E,SAAS,OAAO,KAAA,EAAwB;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,aAAa,KAAA,EAAO;AAC5D,IAAA,MAAM,UAAW,KAAA,CAAgC,OAAA;AACjD,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,EAAU,OAAO,OAAA;AAAA,EAC1C;AACA,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,UAAU,MAAA,EAAyC;AACjE,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,GAAO,QAAA,EAAS,GAAI,MAAA;AAEtC,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,OAAA,MAA2C;AAAA,MACxD,QAAQ,mBAAuD;AAC7D,QAAA,IAAI;AACF,UAAA,IAAI,IAAA,KAAS,QAAA,IAAY,QAAA,CAAS,YAAA,EAAc;AAC9C,YAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,YAAA;AAAA,cAC5B,EAAE,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAS;AAAA,cAC7B,EAAE,SAAS,IAAA;AAAK,aAClB;AAEA,YAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,cAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA;AAC1C,cAAA,IAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AACjC,gBAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,gBAAA,IAAI,OAAO,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,KAAA,EAAM;AAAA,cAClD,WAAW,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,IAAK,MAAM,IAAA,EAAM;AACrD,gBAAA,MAAM;AAAA,kBACJ,IAAA,EAAM,WAAA;AAAA,kBACN,QAAA,EAAU;AAAA,oBACR,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,CAAA;AAAA,oBACxD,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAAA,oBACvB,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,IAAQ,EAAE;AAAA;AACvC,iBACF;AAAA,cACF,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AACrC,gBAAA;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,YAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,EAAE,QAAA,EAAU,OAAA,CAAQ,UAAU,CAAA;AACnE,YAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,cAAA,MAAM,KAAA,GAAQ,OAAO,KAAK,CAAA;AAC1B,cAAA,IAAI,OAAO,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,KAAA,EAAM;AAAA,YAClD;AAAA,UACF,CAAA,MAAO;AACL,YAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,wDAAA,EAAyD;AACzF,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AAAA,QACvB,SAAS,KAAA,EAAO;AACd,UAAA,MAAM;AAAA,YACJ,IAAA,EAAM,OAAA;AAAA,YACN,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,WAChE;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,OAAO,MAAM;AAAA,MAAC;AAAA,KAChB;AAAA,GACF;AACF;AAMO,SAAS,UAAU,MAAA,EAAyC;AACjE,EAAA,OAAO,SAAA,CAAU;AAAA,IACf,UAAU,MAAA,CAAO,KAAA;AAAA,IACjB,IAAA,EAAM;AAAA,GACP,CAAA;AACH;;;AC7EA,gBAAgB,kBAAkB,MAAA,EAA4D;AAC5F,EAAA,MAAM,MAAA,GAAS,OAAO,SAAA,EAAU;AAChC,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAEhC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AACV,MAAA,MAAM,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AACnD,MAAA,IAAI,MAAM,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,IAAA,EAAK;AAAA,IAChD;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AAEA,EAAA,MAAM,EAAE,MAAM,MAAA,EAAO;AACvB;AAEO,SAAS,SAAS,MAAA,EAAwC;AAC/D,EAAA,MAAM,EAAE,GAAA,EAAK,OAAA,GAAU,IAAG,GAAI,MAAA;AAE9B,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAC,OAAA,KAA0C;AACvD,MAAA,MAAM,IAAA,GAAO;AAAA,QACX,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,MAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,CAAE,CAAA;AAAA,QAC5F,KAAA,EAAO,QAAQ,OAAA,EAAS,KAAA;AAAA,QACxB,YAAA,EAAc,QAAQ,OAAA,EAAS;AAAA,OACjC;AAEA,MAAA,OAAO,kBAAA;AAAA,QACL,CAAC,MAAA,KAAW,KAAA,CAAM,GAAA,EAAK;AAAA,UACrB,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,OAAA,EAAQ;AAAA,UAC1D,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,UACzB;AAAA,SACD,CAAA;AAAA,QACD,iBAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF","file":"index.cjs","sourcesContent":["import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\nimport type { CreateAdapterConfig } from './types'\n\nexport function createAdapter(config: CreateAdapterConfig): AdapterFactory {\n return {\n createSource: (request: AdapterRequest): StreamSource => ({\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n try {\n const result = await config.send(request)\n const stream = result instanceof Response\n ? result.body!\n : result\n yield* config.parse(stream)\n } catch (err) {\n yield {\n type: 'error',\n content: err instanceof Error ? err.message : String(err),\n }\n }\n },\n abort: () => {\n config.abort?.()\n },\n }),\n }\n}\n","import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\nimport type { GenericAdapterConfig } from './types'\n\nexport function generic(config: GenericAdapterConfig): AdapterFactory {\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n let reader: ReadableStreamDefaultReader<Uint8Array> | null = null\n const decoder = new TextDecoder()\n\n return {\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n try {\n const stream = await config.send(request)\n reader = stream.getReader()\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n const text = decoder.decode(value, { stream: true })\n yield { type: 'text', content: text }\n }\n\n yield { type: 'done' }\n } catch (err) {\n yield {\n type: 'error',\n content: err instanceof Error ? err.message : String(err),\n }\n } finally {\n reader?.releaseLock()\n }\n },\n abort: () => {\n void reader?.cancel()\n },\n }\n },\n }\n}\n","import type { AdapterRequest, Message, StreamChunk, StreamSource } from '@agentskit/core'\n\nexport function toProviderMessages(messages: Message[]) {\n return messages.map(message => ({\n role: message.role,\n content: message.content,\n }))\n}\n\nexport async function* readSSELines(stream: ReadableStream): AsyncIterableIterator<string> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data) yield data\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nexport async function* readNDJSONLines(stream: ReadableStream): AsyncIterableIterator<string> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed) yield trimmed\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nexport async function* parseOpenAIStream(stream: ReadableStream): AsyncIterableIterator<StreamChunk> {\n for await (const data of readSSELines(stream)) {\n if (data === '[DONE]') {\n yield { type: 'done' }\n return\n }\n\n try {\n const event = JSON.parse(data)\n const delta = event.choices?.[0]?.delta\n\n if (typeof delta?.content === 'string') {\n yield { type: 'text', content: delta.content }\n } else if (Array.isArray(delta?.tool_calls)) {\n for (const toolCall of delta.tool_calls) {\n if (toolCall?.function?.name) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: toolCall.id ?? `${toolCall.function.name}-${Date.now()}`,\n name: toolCall.function.name,\n args: toolCall.function.arguments ?? '{}',\n },\n }\n }\n }\n }\n } catch {\n // Ignore malformed events.\n }\n }\n\n yield { type: 'done' }\n}\n\nexport async function* parseAnthropicStream(stream: ReadableStream): AsyncIterableIterator<StreamChunk> {\n for await (const data of readSSELines(stream)) {\n if (data === '[DONE]') continue\n\n try {\n const event = JSON.parse(data)\n if (event.type === 'content_block_delta' && event.delta?.text) {\n yield { type: 'text', content: event.delta.text }\n } else if (event.type === 'content_block_start' && event.content_block?.type === 'tool_use') {\n yield {\n type: 'tool_call',\n toolCall: {\n id: event.content_block.id,\n name: event.content_block.name,\n args: JSON.stringify(event.content_block.input ?? {}),\n },\n }\n } else if (event.type === 'message_stop') {\n yield { type: 'done' }\n return\n }\n } catch {\n // Ignore malformed events.\n }\n }\n\n yield { type: 'done' }\n}\n\nexport async function* parseGeminiStream(stream: ReadableStream): AsyncIterableIterator<StreamChunk> {\n for await (const data of readSSELines(stream)) {\n try {\n const event = JSON.parse(data)\n const text = event.candidates?.[0]?.content?.parts\n ?.map((part: { text?: string }) => part.text ?? '')\n .join('')\n if (text) yield { type: 'text', content: text }\n } catch {\n // Ignore malformed events.\n }\n }\n\n yield { type: 'done' }\n}\n\nexport async function* parseOllamaStream(stream: ReadableStream): AsyncIterableIterator<StreamChunk> {\n for await (const data of readNDJSONLines(stream)) {\n try {\n const event = JSON.parse(data)\n if (event.message?.content) {\n yield { type: 'text', content: event.message.content }\n }\n if (event.done) {\n yield { type: 'done' }\n return\n }\n } catch {\n // Ignore malformed events.\n }\n }\n\n yield { type: 'done' }\n}\n\nexport function createStreamSource(\n doFetch: (signal: AbortSignal) => Promise<Response>,\n parse: (stream: ReadableStream) => AsyncIterableIterator<StreamChunk>,\n errorLabel: string,\n): StreamSource {\n let abortController: AbortController | null = new AbortController()\n\n return {\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n try {\n const response = await doFetch(abortController!.signal)\n\n if (!response.ok || !response.body) {\n yield { type: 'error', content: `${errorLabel} error: ${response.status}` }\n return\n }\n\n yield* parse(response.body)\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return\n yield {\n type: 'error',\n content: err instanceof Error ? err.message : String(err),\n }\n }\n },\n abort: () => {\n abortController?.abort()\n abortController = null\n },\n }\n}\n","import type { AdapterFactory, AdapterRequest, StreamSource } from '@agentskit/core'\nimport { createStreamSource, parseAnthropicStream } from './utils'\n\nexport interface AnthropicConfig {\n apiKey: string\n model: string\n baseUrl?: string\n maxTokens?: number\n}\n\nexport function anthropic(config: AnthropicConfig): AdapterFactory {\n const { apiKey, model, baseUrl = 'https://api.anthropic.com', maxTokens = 4096 } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const body = {\n model,\n max_tokens: request.context?.maxTokens ?? maxTokens,\n messages: request.messages\n .filter(message => message.role !== 'system')\n .map(message => ({ role: message.role, content: message.content })),\n system: request.messages.find(message => message.role === 'system')?.content,\n tools: request.context?.tools?.map(tool => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.schema,\n })),\n stream: true,\n }\n\n return createStreamSource(\n (signal) => fetch(`${baseUrl}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify(body),\n signal,\n }),\n parseAnthropicStream,\n 'Anthropic API',\n )\n },\n }\n}\n","import type { AdapterFactory, AdapterRequest, StreamSource } from '@agentskit/core'\nimport { createStreamSource, parseOpenAIStream, toProviderMessages } from './utils'\n\nexport interface OpenAIConfig {\n apiKey: string\n model: string\n baseUrl?: string\n}\n\nexport function openai(config: OpenAIConfig): AdapterFactory {\n const { apiKey, model, baseUrl = 'https://api.openai.com' } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const body = {\n model,\n messages: toProviderMessages(request.messages),\n tools: request.context?.tools?.map(tool => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.schema,\n },\n })),\n temperature: request.context?.temperature,\n max_tokens: request.context?.maxTokens,\n stream: true,\n }\n\n return createStreamSource(\n (signal) => fetch(`${baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n signal,\n }),\n parseOpenAIStream,\n 'OpenAI API',\n )\n },\n }\n}\n","import type { AdapterFactory, AdapterRequest, StreamSource } from '@agentskit/core'\nimport { createStreamSource, parseGeminiStream } from './utils'\n\nexport interface GeminiConfig {\n apiKey: string\n model: string\n baseUrl?: string\n}\n\nexport function gemini(config: GeminiConfig): AdapterFactory {\n const { apiKey, model, baseUrl = 'https://generativelanguage.googleapis.com' } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const body = {\n contents: request.messages\n .filter(message => message.role !== 'system')\n .map(message => ({\n role: message.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: message.content }],\n })),\n systemInstruction: request.messages.find(message => message.role === 'system')\n ? {\n role: 'system',\n parts: [{ text: request.messages.find(message => message.role === 'system')!.content }],\n }\n : undefined,\n }\n\n return createStreamSource(\n (signal) => fetch(\n `${baseUrl}/v1beta/models/${model}:streamGenerateContent?alt=sse&key=${apiKey}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal,\n },\n ),\n parseGeminiStream,\n 'Gemini API',\n )\n },\n }\n}\n","import type { AdapterFactory } from '@agentskit/core'\nimport { openai, type OpenAIConfig } from './openai'\n\nexport interface OpenAICompatibleConfig extends OpenAIConfig {}\n\nexport function createOpenAICompatibleAdapter(defaultBaseUrl: string) {\n return function openAICompatibleAdapter(config: OpenAICompatibleConfig): AdapterFactory {\n return openai({\n ...config,\n baseUrl: config.baseUrl ?? defaultBaseUrl,\n })\n }\n}\n","import { createOpenAICompatibleAdapter, type OpenAICompatibleConfig } from './openai-compatible'\n\nexport interface GrokConfig extends OpenAICompatibleConfig {}\n\nexport const grok = createOpenAICompatibleAdapter('https://api.x.ai')\n","import type { AdapterFactory, AdapterRequest, StreamSource } from '@agentskit/core'\nimport { createStreamSource, parseOllamaStream } from './utils'\n\nexport interface OllamaConfig {\n model: string\n baseUrl?: string\n}\n\nexport function ollama(config: OllamaConfig): AdapterFactory {\n const { model, baseUrl = 'http://localhost:11434' } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const body = {\n model,\n stream: true,\n messages: request.messages.map(message => ({\n role: message.role,\n content: message.content,\n })),\n }\n\n return createStreamSource(\n (signal) => fetch(`${baseUrl}/api/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal,\n }),\n parseOllamaStream,\n 'Ollama API',\n )\n },\n }\n}\n","import { createOpenAICompatibleAdapter, type OpenAICompatibleConfig } from './openai-compatible'\n\nexport interface DeepSeekConfig extends OpenAICompatibleConfig {}\n\nexport const deepseek = createOpenAICompatibleAdapter('https://api.deepseek.com')\n","import { createOpenAICompatibleAdapter, type OpenAICompatibleConfig } from './openai-compatible'\n\nexport interface KimiConfig extends OpenAICompatibleConfig {}\n\nexport const kimi = createOpenAICompatibleAdapter('https://api.moonshot.ai')\n","import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\n\ntype LangChainRunnable = {\n stream?: (input: unknown, config?: Record<string, unknown>) => AsyncIterable<unknown> | Promise<AsyncIterable<unknown>>\n streamEvents?: (input: unknown, config?: Record<string, unknown>) => AsyncIterable<Record<string, unknown>> | Promise<AsyncIterable<Record<string, unknown>>>\n}\n\nexport interface LangChainConfig {\n runnable: LangChainRunnable\n mode?: 'stream' | 'events'\n}\n\nfunction asText(value: unknown): string {\n if (typeof value === 'string') return value\n if (value && typeof value === 'object' && 'content' in value) {\n const content = (value as { content?: unknown }).content\n if (typeof content === 'string') return content\n }\n return ''\n}\n\nexport function langchain(config: LangChainConfig): AdapterFactory {\n const { runnable, mode = 'stream' } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => ({\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n try {\n if (mode === 'events' && runnable.streamEvents) {\n const events = await runnable.streamEvents(\n { messages: request.messages },\n { version: 'v2' }\n )\n\n for await (const event of events) {\n const eventName = String(event.event ?? '')\n if (eventName.endsWith('_stream')) {\n const chunk = asText(event.data)\n if (chunk) yield { type: 'text', content: chunk }\n } else if (eventName.endsWith('_start') && event.name) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: String(event.run_id ?? `${event.name}-${Date.now()}`),\n name: String(event.name),\n args: JSON.stringify(event.data ?? {}),\n },\n }\n } else if (eventName.endsWith('_end')) {\n continue\n }\n }\n } else if (runnable.stream) {\n const stream = await runnable.stream({ messages: request.messages })\n for await (const value of stream) {\n const chunk = asText(value)\n if (chunk) yield { type: 'text', content: chunk }\n }\n } else {\n yield { type: 'error', content: 'Runnable does not implement stream() or streamEvents()' }\n return\n }\n\n yield { type: 'done' }\n } catch (error) {\n yield {\n type: 'error',\n content: error instanceof Error ? error.message : String(error),\n }\n }\n },\n abort: () => {},\n }),\n }\n}\n\nexport interface LangGraphConfig {\n graph: LangChainRunnable\n}\n\nexport function langgraph(config: LangGraphConfig): AdapterFactory {\n return langchain({\n runnable: config.graph,\n mode: 'events',\n })\n}\n","import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\nimport { createStreamSource } from './utils'\n\nexport interface VercelAIConfig {\n api: string\n headers?: Record<string, string>\n}\n\nasync function* parseVercelStream(stream: ReadableStream): AsyncIterableIterator<StreamChunk> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n const text = decoder.decode(value, { stream: true })\n if (text) yield { type: 'text', content: text }\n }\n } finally {\n reader.releaseLock()\n }\n\n yield { type: 'done' }\n}\n\nexport function vercelAI(config: VercelAIConfig): AdapterFactory {\n const { api, headers = {} } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const body = {\n messages: request.messages.map(message => ({ role: message.role, content: message.content })),\n tools: request.context?.tools,\n systemPrompt: request.context?.systemPrompt,\n }\n\n return createStreamSource(\n (signal) => fetch(api, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(body),\n signal,\n }),\n parseVercelStream,\n 'API',\n )\n },\n }\n}\n"]}
@@ -0,0 +1,80 @@
1
+ import * as _agentskit_core from '@agentskit/core';
2
+ import { AdapterRequest, StreamChunk, AdapterFactory } from '@agentskit/core';
3
+
4
+ interface CreateAdapterConfig {
5
+ send: (request: AdapterRequest) => Promise<ReadableStream | Response>;
6
+ parse: (stream: ReadableStream) => AsyncIterableIterator<StreamChunk>;
7
+ abort?: () => void;
8
+ }
9
+ interface GenericAdapterConfig {
10
+ send: (request: AdapterRequest) => Promise<ReadableStream>;
11
+ }
12
+
13
+ declare function createAdapter(config: CreateAdapterConfig): AdapterFactory;
14
+
15
+ declare function generic(config: GenericAdapterConfig): AdapterFactory;
16
+
17
+ interface AnthropicConfig {
18
+ apiKey: string;
19
+ model: string;
20
+ baseUrl?: string;
21
+ maxTokens?: number;
22
+ }
23
+ declare function anthropic(config: AnthropicConfig): AdapterFactory;
24
+
25
+ interface OpenAIConfig {
26
+ apiKey: string;
27
+ model: string;
28
+ baseUrl?: string;
29
+ }
30
+ declare function openai(config: OpenAIConfig): AdapterFactory;
31
+
32
+ interface GeminiConfig {
33
+ apiKey: string;
34
+ model: string;
35
+ baseUrl?: string;
36
+ }
37
+ declare function gemini(config: GeminiConfig): AdapterFactory;
38
+
39
+ interface OpenAICompatibleConfig extends OpenAIConfig {
40
+ }
41
+
42
+ interface GrokConfig extends OpenAICompatibleConfig {
43
+ }
44
+ declare const grok: (config: OpenAICompatibleConfig) => _agentskit_core.AdapterFactory;
45
+
46
+ interface OllamaConfig {
47
+ model: string;
48
+ baseUrl?: string;
49
+ }
50
+ declare function ollama(config: OllamaConfig): AdapterFactory;
51
+
52
+ interface DeepSeekConfig extends OpenAICompatibleConfig {
53
+ }
54
+ declare const deepseek: (config: OpenAICompatibleConfig) => _agentskit_core.AdapterFactory;
55
+
56
+ interface KimiConfig extends OpenAICompatibleConfig {
57
+ }
58
+ declare const kimi: (config: OpenAICompatibleConfig) => _agentskit_core.AdapterFactory;
59
+
60
+ type LangChainRunnable = {
61
+ stream?: (input: unknown, config?: Record<string, unknown>) => AsyncIterable<unknown> | Promise<AsyncIterable<unknown>>;
62
+ streamEvents?: (input: unknown, config?: Record<string, unknown>) => AsyncIterable<Record<string, unknown>> | Promise<AsyncIterable<Record<string, unknown>>>;
63
+ };
64
+ interface LangChainConfig {
65
+ runnable: LangChainRunnable;
66
+ mode?: 'stream' | 'events';
67
+ }
68
+ declare function langchain(config: LangChainConfig): AdapterFactory;
69
+ interface LangGraphConfig {
70
+ graph: LangChainRunnable;
71
+ }
72
+ declare function langgraph(config: LangGraphConfig): AdapterFactory;
73
+
74
+ interface VercelAIConfig {
75
+ api: string;
76
+ headers?: Record<string, string>;
77
+ }
78
+ declare function vercelAI(config: VercelAIConfig): AdapterFactory;
79
+
80
+ export { type AnthropicConfig, type CreateAdapterConfig, type DeepSeekConfig, type GeminiConfig, type GenericAdapterConfig, type GrokConfig, type KimiConfig, type LangChainConfig, type LangGraphConfig, type OllamaConfig, type OpenAIConfig, type VercelAIConfig, anthropic, createAdapter, deepseek, gemini, generic, grok, kimi, langchain, langgraph, ollama, openai, vercelAI };
@@ -0,0 +1,80 @@
1
+ import * as _agentskit_core from '@agentskit/core';
2
+ import { AdapterRequest, StreamChunk, AdapterFactory } from '@agentskit/core';
3
+
4
+ interface CreateAdapterConfig {
5
+ send: (request: AdapterRequest) => Promise<ReadableStream | Response>;
6
+ parse: (stream: ReadableStream) => AsyncIterableIterator<StreamChunk>;
7
+ abort?: () => void;
8
+ }
9
+ interface GenericAdapterConfig {
10
+ send: (request: AdapterRequest) => Promise<ReadableStream>;
11
+ }
12
+
13
+ declare function createAdapter(config: CreateAdapterConfig): AdapterFactory;
14
+
15
+ declare function generic(config: GenericAdapterConfig): AdapterFactory;
16
+
17
+ interface AnthropicConfig {
18
+ apiKey: string;
19
+ model: string;
20
+ baseUrl?: string;
21
+ maxTokens?: number;
22
+ }
23
+ declare function anthropic(config: AnthropicConfig): AdapterFactory;
24
+
25
+ interface OpenAIConfig {
26
+ apiKey: string;
27
+ model: string;
28
+ baseUrl?: string;
29
+ }
30
+ declare function openai(config: OpenAIConfig): AdapterFactory;
31
+
32
+ interface GeminiConfig {
33
+ apiKey: string;
34
+ model: string;
35
+ baseUrl?: string;
36
+ }
37
+ declare function gemini(config: GeminiConfig): AdapterFactory;
38
+
39
+ interface OpenAICompatibleConfig extends OpenAIConfig {
40
+ }
41
+
42
+ interface GrokConfig extends OpenAICompatibleConfig {
43
+ }
44
+ declare const grok: (config: OpenAICompatibleConfig) => _agentskit_core.AdapterFactory;
45
+
46
+ interface OllamaConfig {
47
+ model: string;
48
+ baseUrl?: string;
49
+ }
50
+ declare function ollama(config: OllamaConfig): AdapterFactory;
51
+
52
+ interface DeepSeekConfig extends OpenAICompatibleConfig {
53
+ }
54
+ declare const deepseek: (config: OpenAICompatibleConfig) => _agentskit_core.AdapterFactory;
55
+
56
+ interface KimiConfig extends OpenAICompatibleConfig {
57
+ }
58
+ declare const kimi: (config: OpenAICompatibleConfig) => _agentskit_core.AdapterFactory;
59
+
60
+ type LangChainRunnable = {
61
+ stream?: (input: unknown, config?: Record<string, unknown>) => AsyncIterable<unknown> | Promise<AsyncIterable<unknown>>;
62
+ streamEvents?: (input: unknown, config?: Record<string, unknown>) => AsyncIterable<Record<string, unknown>> | Promise<AsyncIterable<Record<string, unknown>>>;
63
+ };
64
+ interface LangChainConfig {
65
+ runnable: LangChainRunnable;
66
+ mode?: 'stream' | 'events';
67
+ }
68
+ declare function langchain(config: LangChainConfig): AdapterFactory;
69
+ interface LangGraphConfig {
70
+ graph: LangChainRunnable;
71
+ }
72
+ declare function langgraph(config: LangGraphConfig): AdapterFactory;
73
+
74
+ interface VercelAIConfig {
75
+ api: string;
76
+ headers?: Record<string, string>;
77
+ }
78
+ declare function vercelAI(config: VercelAIConfig): AdapterFactory;
79
+
80
+ export { type AnthropicConfig, type CreateAdapterConfig, type DeepSeekConfig, type GeminiConfig, type GenericAdapterConfig, type GrokConfig, type KimiConfig, type LangChainConfig, type LangGraphConfig, type OllamaConfig, type OpenAIConfig, type VercelAIConfig, anthropic, createAdapter, deepseek, gemini, generic, grok, kimi, langchain, langgraph, ollama, openai, vercelAI };
package/dist/index.js ADDED
@@ -0,0 +1,474 @@
1
+ // src/createAdapter.ts
2
+ function createAdapter(config) {
3
+ return {
4
+ createSource: (request) => ({
5
+ stream: async function* () {
6
+ try {
7
+ const result = await config.send(request);
8
+ const stream = result instanceof Response ? result.body : result;
9
+ yield* config.parse(stream);
10
+ } catch (err) {
11
+ yield {
12
+ type: "error",
13
+ content: err instanceof Error ? err.message : String(err)
14
+ };
15
+ }
16
+ },
17
+ abort: () => {
18
+ config.abort?.();
19
+ }
20
+ })
21
+ };
22
+ }
23
+
24
+ // src/generic.ts
25
+ function generic(config) {
26
+ return {
27
+ createSource: (request) => {
28
+ let reader = null;
29
+ const decoder = new TextDecoder();
30
+ return {
31
+ stream: async function* () {
32
+ try {
33
+ const stream = await config.send(request);
34
+ reader = stream.getReader();
35
+ while (true) {
36
+ const { done, value } = await reader.read();
37
+ if (done) break;
38
+ const text = decoder.decode(value, { stream: true });
39
+ yield { type: "text", content: text };
40
+ }
41
+ yield { type: "done" };
42
+ } catch (err) {
43
+ yield {
44
+ type: "error",
45
+ content: err instanceof Error ? err.message : String(err)
46
+ };
47
+ } finally {
48
+ reader?.releaseLock();
49
+ }
50
+ },
51
+ abort: () => {
52
+ void reader?.cancel();
53
+ }
54
+ };
55
+ }
56
+ };
57
+ }
58
+
59
+ // src/utils.ts
60
+ function toProviderMessages(messages) {
61
+ return messages.map((message) => ({
62
+ role: message.role,
63
+ content: message.content
64
+ }));
65
+ }
66
+ async function* readSSELines(stream) {
67
+ const reader = stream.getReader();
68
+ const decoder = new TextDecoder();
69
+ let buffer = "";
70
+ try {
71
+ while (true) {
72
+ const { done, value } = await reader.read();
73
+ if (done) break;
74
+ buffer += decoder.decode(value, { stream: true });
75
+ const lines = buffer.split("\n");
76
+ buffer = lines.pop() ?? "";
77
+ for (const line of lines) {
78
+ if (!line.startsWith("data: ")) continue;
79
+ const data = line.slice(6).trim();
80
+ if (data) yield data;
81
+ }
82
+ }
83
+ } finally {
84
+ reader.releaseLock();
85
+ }
86
+ }
87
+ async function* readNDJSONLines(stream) {
88
+ const reader = stream.getReader();
89
+ const decoder = new TextDecoder();
90
+ let buffer = "";
91
+ try {
92
+ while (true) {
93
+ const { done, value } = await reader.read();
94
+ if (done) break;
95
+ buffer += decoder.decode(value, { stream: true });
96
+ const lines = buffer.split("\n");
97
+ buffer = lines.pop() ?? "";
98
+ for (const line of lines) {
99
+ const trimmed = line.trim();
100
+ if (trimmed) yield trimmed;
101
+ }
102
+ }
103
+ } finally {
104
+ reader.releaseLock();
105
+ }
106
+ }
107
+ async function* parseOpenAIStream(stream) {
108
+ for await (const data of readSSELines(stream)) {
109
+ if (data === "[DONE]") {
110
+ yield { type: "done" };
111
+ return;
112
+ }
113
+ try {
114
+ const event = JSON.parse(data);
115
+ const delta = event.choices?.[0]?.delta;
116
+ if (typeof delta?.content === "string") {
117
+ yield { type: "text", content: delta.content };
118
+ } else if (Array.isArray(delta?.tool_calls)) {
119
+ for (const toolCall of delta.tool_calls) {
120
+ if (toolCall?.function?.name) {
121
+ yield {
122
+ type: "tool_call",
123
+ toolCall: {
124
+ id: toolCall.id ?? `${toolCall.function.name}-${Date.now()}`,
125
+ name: toolCall.function.name,
126
+ args: toolCall.function.arguments ?? "{}"
127
+ }
128
+ };
129
+ }
130
+ }
131
+ }
132
+ } catch {
133
+ }
134
+ }
135
+ yield { type: "done" };
136
+ }
137
+ async function* parseAnthropicStream(stream) {
138
+ for await (const data of readSSELines(stream)) {
139
+ if (data === "[DONE]") continue;
140
+ try {
141
+ const event = JSON.parse(data);
142
+ if (event.type === "content_block_delta" && event.delta?.text) {
143
+ yield { type: "text", content: event.delta.text };
144
+ } else if (event.type === "content_block_start" && event.content_block?.type === "tool_use") {
145
+ yield {
146
+ type: "tool_call",
147
+ toolCall: {
148
+ id: event.content_block.id,
149
+ name: event.content_block.name,
150
+ args: JSON.stringify(event.content_block.input ?? {})
151
+ }
152
+ };
153
+ } else if (event.type === "message_stop") {
154
+ yield { type: "done" };
155
+ return;
156
+ }
157
+ } catch {
158
+ }
159
+ }
160
+ yield { type: "done" };
161
+ }
162
+ async function* parseGeminiStream(stream) {
163
+ for await (const data of readSSELines(stream)) {
164
+ try {
165
+ const event = JSON.parse(data);
166
+ const text = event.candidates?.[0]?.content?.parts?.map((part) => part.text ?? "").join("");
167
+ if (text) yield { type: "text", content: text };
168
+ } catch {
169
+ }
170
+ }
171
+ yield { type: "done" };
172
+ }
173
+ async function* parseOllamaStream(stream) {
174
+ for await (const data of readNDJSONLines(stream)) {
175
+ try {
176
+ const event = JSON.parse(data);
177
+ if (event.message?.content) {
178
+ yield { type: "text", content: event.message.content };
179
+ }
180
+ if (event.done) {
181
+ yield { type: "done" };
182
+ return;
183
+ }
184
+ } catch {
185
+ }
186
+ }
187
+ yield { type: "done" };
188
+ }
189
+ function createStreamSource(doFetch, parse, errorLabel) {
190
+ let abortController = new AbortController();
191
+ return {
192
+ stream: async function* () {
193
+ try {
194
+ const response = await doFetch(abortController.signal);
195
+ if (!response.ok || !response.body) {
196
+ yield { type: "error", content: `${errorLabel} error: ${response.status}` };
197
+ return;
198
+ }
199
+ yield* parse(response.body);
200
+ } catch (err) {
201
+ if (err instanceof DOMException && err.name === "AbortError") return;
202
+ yield {
203
+ type: "error",
204
+ content: err instanceof Error ? err.message : String(err)
205
+ };
206
+ }
207
+ },
208
+ abort: () => {
209
+ abortController?.abort();
210
+ abortController = null;
211
+ }
212
+ };
213
+ }
214
+
215
+ // src/anthropic.ts
216
+ function anthropic(config) {
217
+ const { apiKey, model, baseUrl = "https://api.anthropic.com", maxTokens = 4096 } = config;
218
+ return {
219
+ createSource: (request) => {
220
+ const body = {
221
+ model,
222
+ max_tokens: request.context?.maxTokens ?? maxTokens,
223
+ messages: request.messages.filter((message) => message.role !== "system").map((message) => ({ role: message.role, content: message.content })),
224
+ system: request.messages.find((message) => message.role === "system")?.content,
225
+ tools: request.context?.tools?.map((tool) => ({
226
+ name: tool.name,
227
+ description: tool.description,
228
+ input_schema: tool.schema
229
+ })),
230
+ stream: true
231
+ };
232
+ return createStreamSource(
233
+ (signal) => fetch(`${baseUrl}/v1/messages`, {
234
+ method: "POST",
235
+ headers: {
236
+ "Content-Type": "application/json",
237
+ "x-api-key": apiKey,
238
+ "anthropic-version": "2023-06-01"
239
+ },
240
+ body: JSON.stringify(body),
241
+ signal
242
+ }),
243
+ parseAnthropicStream,
244
+ "Anthropic API"
245
+ );
246
+ }
247
+ };
248
+ }
249
+
250
+ // src/openai.ts
251
+ function openai(config) {
252
+ const { apiKey, model, baseUrl = "https://api.openai.com" } = config;
253
+ return {
254
+ createSource: (request) => {
255
+ const body = {
256
+ model,
257
+ messages: toProviderMessages(request.messages),
258
+ tools: request.context?.tools?.map((tool) => ({
259
+ type: "function",
260
+ function: {
261
+ name: tool.name,
262
+ description: tool.description,
263
+ parameters: tool.schema
264
+ }
265
+ })),
266
+ temperature: request.context?.temperature,
267
+ max_tokens: request.context?.maxTokens,
268
+ stream: true
269
+ };
270
+ return createStreamSource(
271
+ (signal) => fetch(`${baseUrl}/v1/chat/completions`, {
272
+ method: "POST",
273
+ headers: {
274
+ "Content-Type": "application/json",
275
+ "Authorization": `Bearer ${apiKey}`
276
+ },
277
+ body: JSON.stringify(body),
278
+ signal
279
+ }),
280
+ parseOpenAIStream,
281
+ "OpenAI API"
282
+ );
283
+ }
284
+ };
285
+ }
286
+
287
+ // src/gemini.ts
288
+ function gemini(config) {
289
+ const { apiKey, model, baseUrl = "https://generativelanguage.googleapis.com" } = config;
290
+ return {
291
+ createSource: (request) => {
292
+ const body = {
293
+ contents: request.messages.filter((message) => message.role !== "system").map((message) => ({
294
+ role: message.role === "assistant" ? "model" : "user",
295
+ parts: [{ text: message.content }]
296
+ })),
297
+ systemInstruction: request.messages.find((message) => message.role === "system") ? {
298
+ role: "system",
299
+ parts: [{ text: request.messages.find((message) => message.role === "system").content }]
300
+ } : void 0
301
+ };
302
+ return createStreamSource(
303
+ (signal) => fetch(
304
+ `${baseUrl}/v1beta/models/${model}:streamGenerateContent?alt=sse&key=${apiKey}`,
305
+ {
306
+ method: "POST",
307
+ headers: { "Content-Type": "application/json" },
308
+ body: JSON.stringify(body),
309
+ signal
310
+ }
311
+ ),
312
+ parseGeminiStream,
313
+ "Gemini API"
314
+ );
315
+ }
316
+ };
317
+ }
318
+
319
+ // src/openai-compatible.ts
320
+ function createOpenAICompatibleAdapter(defaultBaseUrl) {
321
+ return function openAICompatibleAdapter(config) {
322
+ return openai({
323
+ ...config,
324
+ baseUrl: config.baseUrl ?? defaultBaseUrl
325
+ });
326
+ };
327
+ }
328
+
329
+ // src/grok.ts
330
+ var grok = createOpenAICompatibleAdapter("https://api.x.ai");
331
+
332
+ // src/ollama.ts
333
+ function ollama(config) {
334
+ const { model, baseUrl = "http://localhost:11434" } = config;
335
+ return {
336
+ createSource: (request) => {
337
+ const body = {
338
+ model,
339
+ stream: true,
340
+ messages: request.messages.map((message) => ({
341
+ role: message.role,
342
+ content: message.content
343
+ }))
344
+ };
345
+ return createStreamSource(
346
+ (signal) => fetch(`${baseUrl}/api/chat`, {
347
+ method: "POST",
348
+ headers: { "Content-Type": "application/json" },
349
+ body: JSON.stringify(body),
350
+ signal
351
+ }),
352
+ parseOllamaStream,
353
+ "Ollama API"
354
+ );
355
+ }
356
+ };
357
+ }
358
+
359
+ // src/deepseek.ts
360
+ var deepseek = createOpenAICompatibleAdapter("https://api.deepseek.com");
361
+
362
+ // src/kimi.ts
363
+ var kimi = createOpenAICompatibleAdapter("https://api.moonshot.ai");
364
+
365
+ // src/langchain.ts
366
+ function asText(value) {
367
+ if (typeof value === "string") return value;
368
+ if (value && typeof value === "object" && "content" in value) {
369
+ const content = value.content;
370
+ if (typeof content === "string") return content;
371
+ }
372
+ return "";
373
+ }
374
+ function langchain(config) {
375
+ const { runnable, mode = "stream" } = config;
376
+ return {
377
+ createSource: (request) => ({
378
+ stream: async function* () {
379
+ try {
380
+ if (mode === "events" && runnable.streamEvents) {
381
+ const events = await runnable.streamEvents(
382
+ { messages: request.messages },
383
+ { version: "v2" }
384
+ );
385
+ for await (const event of events) {
386
+ const eventName = String(event.event ?? "");
387
+ if (eventName.endsWith("_stream")) {
388
+ const chunk = asText(event.data);
389
+ if (chunk) yield { type: "text", content: chunk };
390
+ } else if (eventName.endsWith("_start") && event.name) {
391
+ yield {
392
+ type: "tool_call",
393
+ toolCall: {
394
+ id: String(event.run_id ?? `${event.name}-${Date.now()}`),
395
+ name: String(event.name),
396
+ args: JSON.stringify(event.data ?? {})
397
+ }
398
+ };
399
+ } else if (eventName.endsWith("_end")) {
400
+ continue;
401
+ }
402
+ }
403
+ } else if (runnable.stream) {
404
+ const stream = await runnable.stream({ messages: request.messages });
405
+ for await (const value of stream) {
406
+ const chunk = asText(value);
407
+ if (chunk) yield { type: "text", content: chunk };
408
+ }
409
+ } else {
410
+ yield { type: "error", content: "Runnable does not implement stream() or streamEvents()" };
411
+ return;
412
+ }
413
+ yield { type: "done" };
414
+ } catch (error) {
415
+ yield {
416
+ type: "error",
417
+ content: error instanceof Error ? error.message : String(error)
418
+ };
419
+ }
420
+ },
421
+ abort: () => {
422
+ }
423
+ })
424
+ };
425
+ }
426
+ function langgraph(config) {
427
+ return langchain({
428
+ runnable: config.graph,
429
+ mode: "events"
430
+ });
431
+ }
432
+
433
+ // src/vercel-ai.ts
434
+ async function* parseVercelStream(stream) {
435
+ const reader = stream.getReader();
436
+ const decoder = new TextDecoder();
437
+ try {
438
+ while (true) {
439
+ const { done, value } = await reader.read();
440
+ if (done) break;
441
+ const text = decoder.decode(value, { stream: true });
442
+ if (text) yield { type: "text", content: text };
443
+ }
444
+ } finally {
445
+ reader.releaseLock();
446
+ }
447
+ yield { type: "done" };
448
+ }
449
+ function vercelAI(config) {
450
+ const { api, headers = {} } = config;
451
+ return {
452
+ createSource: (request) => {
453
+ const body = {
454
+ messages: request.messages.map((message) => ({ role: message.role, content: message.content })),
455
+ tools: request.context?.tools,
456
+ systemPrompt: request.context?.systemPrompt
457
+ };
458
+ return createStreamSource(
459
+ (signal) => fetch(api, {
460
+ method: "POST",
461
+ headers: { "Content-Type": "application/json", ...headers },
462
+ body: JSON.stringify(body),
463
+ signal
464
+ }),
465
+ parseVercelStream,
466
+ "API"
467
+ );
468
+ }
469
+ };
470
+ }
471
+
472
+ export { anthropic, createAdapter, deepseek, gemini, generic, grok, kimi, langchain, langgraph, ollama, openai, vercelAI };
473
+ //# sourceMappingURL=index.js.map
474
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/createAdapter.ts","../src/generic.ts","../src/utils.ts","../src/anthropic.ts","../src/openai.ts","../src/gemini.ts","../src/openai-compatible.ts","../src/grok.ts","../src/ollama.ts","../src/deepseek.ts","../src/kimi.ts","../src/langchain.ts","../src/vercel-ai.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\nimport type { CreateAdapterConfig } from './types'\n\nexport function createAdapter(config: CreateAdapterConfig): AdapterFactory {\n return {\n createSource: (request: AdapterRequest): StreamSource => ({\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n try {\n const result = await config.send(request)\n const stream = result instanceof Response\n ? result.body!\n : result\n yield* config.parse(stream)\n } catch (err) {\n yield {\n type: 'error',\n content: err instanceof Error ? err.message : String(err),\n }\n }\n },\n abort: () => {\n config.abort?.()\n },\n }),\n }\n}\n","import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\nimport type { GenericAdapterConfig } from './types'\n\nexport function generic(config: GenericAdapterConfig): AdapterFactory {\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n let reader: ReadableStreamDefaultReader<Uint8Array> | null = null\n const decoder = new TextDecoder()\n\n return {\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n try {\n const stream = await config.send(request)\n reader = stream.getReader()\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n const text = decoder.decode(value, { stream: true })\n yield { type: 'text', content: text }\n }\n\n yield { type: 'done' }\n } catch (err) {\n yield {\n type: 'error',\n content: err instanceof Error ? err.message : String(err),\n }\n } finally {\n reader?.releaseLock()\n }\n },\n abort: () => {\n void reader?.cancel()\n },\n }\n },\n }\n}\n","import type { AdapterRequest, Message, StreamChunk, StreamSource } from '@agentskit/core'\n\nexport function toProviderMessages(messages: Message[]) {\n return messages.map(message => ({\n role: message.role,\n content: message.content,\n }))\n}\n\nexport async function* readSSELines(stream: ReadableStream): AsyncIterableIterator<string> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data) yield data\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nexport async function* readNDJSONLines(stream: ReadableStream): AsyncIterableIterator<string> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (trimmed) yield trimmed\n }\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nexport async function* parseOpenAIStream(stream: ReadableStream): AsyncIterableIterator<StreamChunk> {\n for await (const data of readSSELines(stream)) {\n if (data === '[DONE]') {\n yield { type: 'done' }\n return\n }\n\n try {\n const event = JSON.parse(data)\n const delta = event.choices?.[0]?.delta\n\n if (typeof delta?.content === 'string') {\n yield { type: 'text', content: delta.content }\n } else if (Array.isArray(delta?.tool_calls)) {\n for (const toolCall of delta.tool_calls) {\n if (toolCall?.function?.name) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: toolCall.id ?? `${toolCall.function.name}-${Date.now()}`,\n name: toolCall.function.name,\n args: toolCall.function.arguments ?? '{}',\n },\n }\n }\n }\n }\n } catch {\n // Ignore malformed events.\n }\n }\n\n yield { type: 'done' }\n}\n\nexport async function* parseAnthropicStream(stream: ReadableStream): AsyncIterableIterator<StreamChunk> {\n for await (const data of readSSELines(stream)) {\n if (data === '[DONE]') continue\n\n try {\n const event = JSON.parse(data)\n if (event.type === 'content_block_delta' && event.delta?.text) {\n yield { type: 'text', content: event.delta.text }\n } else if (event.type === 'content_block_start' && event.content_block?.type === 'tool_use') {\n yield {\n type: 'tool_call',\n toolCall: {\n id: event.content_block.id,\n name: event.content_block.name,\n args: JSON.stringify(event.content_block.input ?? {}),\n },\n }\n } else if (event.type === 'message_stop') {\n yield { type: 'done' }\n return\n }\n } catch {\n // Ignore malformed events.\n }\n }\n\n yield { type: 'done' }\n}\n\nexport async function* parseGeminiStream(stream: ReadableStream): AsyncIterableIterator<StreamChunk> {\n for await (const data of readSSELines(stream)) {\n try {\n const event = JSON.parse(data)\n const text = event.candidates?.[0]?.content?.parts\n ?.map((part: { text?: string }) => part.text ?? '')\n .join('')\n if (text) yield { type: 'text', content: text }\n } catch {\n // Ignore malformed events.\n }\n }\n\n yield { type: 'done' }\n}\n\nexport async function* parseOllamaStream(stream: ReadableStream): AsyncIterableIterator<StreamChunk> {\n for await (const data of readNDJSONLines(stream)) {\n try {\n const event = JSON.parse(data)\n if (event.message?.content) {\n yield { type: 'text', content: event.message.content }\n }\n if (event.done) {\n yield { type: 'done' }\n return\n }\n } catch {\n // Ignore malformed events.\n }\n }\n\n yield { type: 'done' }\n}\n\nexport function createStreamSource(\n doFetch: (signal: AbortSignal) => Promise<Response>,\n parse: (stream: ReadableStream) => AsyncIterableIterator<StreamChunk>,\n errorLabel: string,\n): StreamSource {\n let abortController: AbortController | null = new AbortController()\n\n return {\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n try {\n const response = await doFetch(abortController!.signal)\n\n if (!response.ok || !response.body) {\n yield { type: 'error', content: `${errorLabel} error: ${response.status}` }\n return\n }\n\n yield* parse(response.body)\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return\n yield {\n type: 'error',\n content: err instanceof Error ? err.message : String(err),\n }\n }\n },\n abort: () => {\n abortController?.abort()\n abortController = null\n },\n }\n}\n","import type { AdapterFactory, AdapterRequest, StreamSource } from '@agentskit/core'\nimport { createStreamSource, parseAnthropicStream } from './utils'\n\nexport interface AnthropicConfig {\n apiKey: string\n model: string\n baseUrl?: string\n maxTokens?: number\n}\n\nexport function anthropic(config: AnthropicConfig): AdapterFactory {\n const { apiKey, model, baseUrl = 'https://api.anthropic.com', maxTokens = 4096 } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const body = {\n model,\n max_tokens: request.context?.maxTokens ?? maxTokens,\n messages: request.messages\n .filter(message => message.role !== 'system')\n .map(message => ({ role: message.role, content: message.content })),\n system: request.messages.find(message => message.role === 'system')?.content,\n tools: request.context?.tools?.map(tool => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.schema,\n })),\n stream: true,\n }\n\n return createStreamSource(\n (signal) => fetch(`${baseUrl}/v1/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify(body),\n signal,\n }),\n parseAnthropicStream,\n 'Anthropic API',\n )\n },\n }\n}\n","import type { AdapterFactory, AdapterRequest, StreamSource } from '@agentskit/core'\nimport { createStreamSource, parseOpenAIStream, toProviderMessages } from './utils'\n\nexport interface OpenAIConfig {\n apiKey: string\n model: string\n baseUrl?: string\n}\n\nexport function openai(config: OpenAIConfig): AdapterFactory {\n const { apiKey, model, baseUrl = 'https://api.openai.com' } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const body = {\n model,\n messages: toProviderMessages(request.messages),\n tools: request.context?.tools?.map(tool => ({\n type: 'function',\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.schema,\n },\n })),\n temperature: request.context?.temperature,\n max_tokens: request.context?.maxTokens,\n stream: true,\n }\n\n return createStreamSource(\n (signal) => fetch(`${baseUrl}/v1/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify(body),\n signal,\n }),\n parseOpenAIStream,\n 'OpenAI API',\n )\n },\n }\n}\n","import type { AdapterFactory, AdapterRequest, StreamSource } from '@agentskit/core'\nimport { createStreamSource, parseGeminiStream } from './utils'\n\nexport interface GeminiConfig {\n apiKey: string\n model: string\n baseUrl?: string\n}\n\nexport function gemini(config: GeminiConfig): AdapterFactory {\n const { apiKey, model, baseUrl = 'https://generativelanguage.googleapis.com' } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const body = {\n contents: request.messages\n .filter(message => message.role !== 'system')\n .map(message => ({\n role: message.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: message.content }],\n })),\n systemInstruction: request.messages.find(message => message.role === 'system')\n ? {\n role: 'system',\n parts: [{ text: request.messages.find(message => message.role === 'system')!.content }],\n }\n : undefined,\n }\n\n return createStreamSource(\n (signal) => fetch(\n `${baseUrl}/v1beta/models/${model}:streamGenerateContent?alt=sse&key=${apiKey}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal,\n },\n ),\n parseGeminiStream,\n 'Gemini API',\n )\n },\n }\n}\n","import type { AdapterFactory } from '@agentskit/core'\nimport { openai, type OpenAIConfig } from './openai'\n\nexport interface OpenAICompatibleConfig extends OpenAIConfig {}\n\nexport function createOpenAICompatibleAdapter(defaultBaseUrl: string) {\n return function openAICompatibleAdapter(config: OpenAICompatibleConfig): AdapterFactory {\n return openai({\n ...config,\n baseUrl: config.baseUrl ?? defaultBaseUrl,\n })\n }\n}\n","import { createOpenAICompatibleAdapter, type OpenAICompatibleConfig } from './openai-compatible'\n\nexport interface GrokConfig extends OpenAICompatibleConfig {}\n\nexport const grok = createOpenAICompatibleAdapter('https://api.x.ai')\n","import type { AdapterFactory, AdapterRequest, StreamSource } from '@agentskit/core'\nimport { createStreamSource, parseOllamaStream } from './utils'\n\nexport interface OllamaConfig {\n model: string\n baseUrl?: string\n}\n\nexport function ollama(config: OllamaConfig): AdapterFactory {\n const { model, baseUrl = 'http://localhost:11434' } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const body = {\n model,\n stream: true,\n messages: request.messages.map(message => ({\n role: message.role,\n content: message.content,\n })),\n }\n\n return createStreamSource(\n (signal) => fetch(`${baseUrl}/api/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal,\n }),\n parseOllamaStream,\n 'Ollama API',\n )\n },\n }\n}\n","import { createOpenAICompatibleAdapter, type OpenAICompatibleConfig } from './openai-compatible'\n\nexport interface DeepSeekConfig extends OpenAICompatibleConfig {}\n\nexport const deepseek = createOpenAICompatibleAdapter('https://api.deepseek.com')\n","import { createOpenAICompatibleAdapter, type OpenAICompatibleConfig } from './openai-compatible'\n\nexport interface KimiConfig extends OpenAICompatibleConfig {}\n\nexport const kimi = createOpenAICompatibleAdapter('https://api.moonshot.ai')\n","import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\n\ntype LangChainRunnable = {\n stream?: (input: unknown, config?: Record<string, unknown>) => AsyncIterable<unknown> | Promise<AsyncIterable<unknown>>\n streamEvents?: (input: unknown, config?: Record<string, unknown>) => AsyncIterable<Record<string, unknown>> | Promise<AsyncIterable<Record<string, unknown>>>\n}\n\nexport interface LangChainConfig {\n runnable: LangChainRunnable\n mode?: 'stream' | 'events'\n}\n\nfunction asText(value: unknown): string {\n if (typeof value === 'string') return value\n if (value && typeof value === 'object' && 'content' in value) {\n const content = (value as { content?: unknown }).content\n if (typeof content === 'string') return content\n }\n return ''\n}\n\nexport function langchain(config: LangChainConfig): AdapterFactory {\n const { runnable, mode = 'stream' } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => ({\n stream: async function* (): AsyncIterableIterator<StreamChunk> {\n try {\n if (mode === 'events' && runnable.streamEvents) {\n const events = await runnable.streamEvents(\n { messages: request.messages },\n { version: 'v2' }\n )\n\n for await (const event of events) {\n const eventName = String(event.event ?? '')\n if (eventName.endsWith('_stream')) {\n const chunk = asText(event.data)\n if (chunk) yield { type: 'text', content: chunk }\n } else if (eventName.endsWith('_start') && event.name) {\n yield {\n type: 'tool_call',\n toolCall: {\n id: String(event.run_id ?? `${event.name}-${Date.now()}`),\n name: String(event.name),\n args: JSON.stringify(event.data ?? {}),\n },\n }\n } else if (eventName.endsWith('_end')) {\n continue\n }\n }\n } else if (runnable.stream) {\n const stream = await runnable.stream({ messages: request.messages })\n for await (const value of stream) {\n const chunk = asText(value)\n if (chunk) yield { type: 'text', content: chunk }\n }\n } else {\n yield { type: 'error', content: 'Runnable does not implement stream() or streamEvents()' }\n return\n }\n\n yield { type: 'done' }\n } catch (error) {\n yield {\n type: 'error',\n content: error instanceof Error ? error.message : String(error),\n }\n }\n },\n abort: () => {},\n }),\n }\n}\n\nexport interface LangGraphConfig {\n graph: LangChainRunnable\n}\n\nexport function langgraph(config: LangGraphConfig): AdapterFactory {\n return langchain({\n runnable: config.graph,\n mode: 'events',\n })\n}\n","import type { AdapterFactory, AdapterRequest, StreamChunk, StreamSource } from '@agentskit/core'\nimport { createStreamSource } from './utils'\n\nexport interface VercelAIConfig {\n api: string\n headers?: Record<string, string>\n}\n\nasync function* parseVercelStream(stream: ReadableStream): AsyncIterableIterator<StreamChunk> {\n const reader = stream.getReader()\n const decoder = new TextDecoder()\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n const text = decoder.decode(value, { stream: true })\n if (text) yield { type: 'text', content: text }\n }\n } finally {\n reader.releaseLock()\n }\n\n yield { type: 'done' }\n}\n\nexport function vercelAI(config: VercelAIConfig): AdapterFactory {\n const { api, headers = {} } = config\n\n return {\n createSource: (request: AdapterRequest): StreamSource => {\n const body = {\n messages: request.messages.map(message => ({ role: message.role, content: message.content })),\n tools: request.context?.tools,\n systemPrompt: request.context?.systemPrompt,\n }\n\n return createStreamSource(\n (signal) => fetch(api, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify(body),\n signal,\n }),\n parseVercelStream,\n 'API',\n )\n },\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@agentskit/adapters",
3
+ "version": "0.4.0",
4
+ "description": "Provider adapters for AgentsKit.",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "dependencies": {
20
+ "@agentskit/core": "0.4.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^24.0.0",
24
+ "tsup": "^8.5.0",
25
+ "typescript": "^5.9.2",
26
+ "vitest": "^4.1.2"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "test": "vitest run",
34
+ "lint": "tsc --noEmit",
35
+ "dev": "tsup --watch"
36
+ }
37
+ }