@mohanscodex/spectra-ai 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.
Files changed (62) hide show
  1. package/README.md +189 -0
  2. package/dist/__tests__/e2e.test.d.ts +2 -0
  3. package/dist/__tests__/e2e.test.d.ts.map +1 -0
  4. package/dist/__tests__/e2e.test.js +364 -0
  5. package/dist/__tests__/e2e.test.js.map +1 -0
  6. package/dist/__tests__/event-stream.test.d.ts +2 -0
  7. package/dist/__tests__/event-stream.test.d.ts.map +1 -0
  8. package/dist/__tests__/event-stream.test.js +87 -0
  9. package/dist/__tests__/event-stream.test.js.map +1 -0
  10. package/dist/__tests__/provider.test.d.ts +2 -0
  11. package/dist/__tests__/provider.test.d.ts.map +1 -0
  12. package/dist/__tests__/provider.test.js +40 -0
  13. package/dist/__tests__/provider.test.js.map +1 -0
  14. package/dist/event-stream.d.ts +19 -0
  15. package/dist/event-stream.d.ts.map +1 -0
  16. package/dist/event-stream.js +74 -0
  17. package/dist/event-stream.js.map +1 -0
  18. package/dist/index.d.ts +8 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +5 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/models.d.ts +6 -0
  23. package/dist/models.d.ts.map +1 -0
  24. package/dist/models.js +16480 -0
  25. package/dist/models.js.map +1 -0
  26. package/dist/providers/anthropic.d.ts +8 -0
  27. package/dist/providers/anthropic.d.ts.map +1 -0
  28. package/dist/providers/anthropic.js +279 -0
  29. package/dist/providers/anthropic.js.map +1 -0
  30. package/dist/providers/groq.d.ts +16 -0
  31. package/dist/providers/groq.d.ts.map +1 -0
  32. package/dist/providers/groq.js +196 -0
  33. package/dist/providers/groq.js.map +1 -0
  34. package/dist/providers/openai-completions.d.ts +17 -0
  35. package/dist/providers/openai-completions.d.ts.map +1 -0
  36. package/dist/providers/openai-completions.js +319 -0
  37. package/dist/providers/openai-completions.js.map +1 -0
  38. package/dist/providers/openai-responses.d.ts +12 -0
  39. package/dist/providers/openai-responses.d.ts.map +1 -0
  40. package/dist/providers/openai-responses.js +335 -0
  41. package/dist/providers/openai-responses.js.map +1 -0
  42. package/dist/providers/openrouter.d.ts +12 -0
  43. package/dist/providers/openrouter.d.ts.map +1 -0
  44. package/dist/providers/openrouter.js +42 -0
  45. package/dist/providers/openrouter.js.map +1 -0
  46. package/dist/providers/register-builtins.d.ts +2 -0
  47. package/dist/providers/register-builtins.d.ts.map +1 -0
  48. package/dist/providers/register-builtins.js +41 -0
  49. package/dist/providers/register-builtins.js.map +1 -0
  50. package/dist/providers/shared.d.ts +3 -0
  51. package/dist/providers/shared.d.ts.map +1 -0
  52. package/dist/providers/shared.js +12 -0
  53. package/dist/providers/shared.js.map +1 -0
  54. package/dist/registry.d.ts +19 -0
  55. package/dist/registry.d.ts.map +1 -0
  56. package/dist/registry.js +28 -0
  57. package/dist/registry.js.map +1 -0
  58. package/dist/types.d.ts +164 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +33 -0
@@ -0,0 +1,335 @@
1
+ import OpenAI from "openai";
2
+ import { AssistantMessageEventStream } from "../event-stream.js";
3
+ import { sanitizeSurrogates, parseStreamingJson } from "./shared.js";
4
+ function getEnvApiKey(provider) {
5
+ const keys = {
6
+ openai: process.env.OPENAI_API_KEY,
7
+ openaiCodex: process.env.OPENAI_API_KEY,
8
+ };
9
+ return keys[provider];
10
+ }
11
+ export function createOpenAIResponsesProvider() {
12
+ return {
13
+ name: "openai-responses",
14
+ listModels: () => import("../models.js").then((m) => m.getProviderModels("openai")),
15
+ stream(model, context, options) {
16
+ const stream = new AssistantMessageEventStream();
17
+ const run = async () => {
18
+ const output = {
19
+ role: "assistant",
20
+ content: [],
21
+ provider: model.provider,
22
+ model: model.id,
23
+ responseId: undefined,
24
+ usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0 },
25
+ stopReason: "stop",
26
+ timestamp: Date.now(),
27
+ };
28
+ try {
29
+ const apiKey = options?.apiKey ?? getEnvApiKey(model.provider);
30
+ if (!apiKey) {
31
+ output.stopReason = "error";
32
+ output.errorMessage = `No API key for provider: ${model.provider}`;
33
+ stream.push({ type: "start", partial: output });
34
+ stream.push({ type: "error", reason: "error", error: output });
35
+ stream.end();
36
+ return;
37
+ }
38
+ const client = new OpenAI({
39
+ apiKey,
40
+ baseURL: model.baseUrl,
41
+ dangerouslyAllowBrowser: true,
42
+ });
43
+ const messages = convertResponsesMessages(model, context);
44
+ const params = {
45
+ model: model.id,
46
+ input: messages,
47
+ stream: true,
48
+ };
49
+ if (options?.maxTokens) {
50
+ params.max_output_tokens = options.maxTokens;
51
+ }
52
+ if (options?.temperature !== undefined) {
53
+ params.temperature = options.temperature;
54
+ }
55
+ if (model.reasoning && (options?.reasoningEffort || options?.reasoningSummary)) {
56
+ params.reasoning = {
57
+ effort: options.reasoningEffort || "medium",
58
+ summary: options.reasoningSummary || "auto",
59
+ };
60
+ params.include = ["reasoning.encrypted_content"];
61
+ }
62
+ if (context.tools) {
63
+ params.tools = context.tools.map((tool) => ({
64
+ type: "function",
65
+ name: tool.name,
66
+ description: tool.description,
67
+ parameters: tool.parameters,
68
+ strict: false,
69
+ }));
70
+ }
71
+ const openaiStream = await client.responses.create(params, { signal: options?.signal });
72
+ stream.push({ type: "start", partial: output });
73
+ let currentItemType = null;
74
+ let currentBlock = null;
75
+ const blocks = output.content;
76
+ const blockIndex = () => blocks.length - 1;
77
+ for await (const event of openaiStream) {
78
+ if (isResponseCreatedEvent(event)) {
79
+ output.responseId = event.response?.id;
80
+ }
81
+ else if (isResponseOutputItemAddedEvent(event)) {
82
+ const item = event.item;
83
+ currentItemType = item.type;
84
+ if (item.type === "reasoning") {
85
+ currentBlock = { type: "thinking", thinking: "" };
86
+ output.content.push(currentBlock);
87
+ stream.push({ type: "thinking_start", contentIndex: blockIndex(), partial: output });
88
+ }
89
+ else if (item.type === "message") {
90
+ currentBlock = { type: "text", text: "" };
91
+ output.content.push(currentBlock);
92
+ stream.push({ type: "text_start", contentIndex: blockIndex(), partial: output });
93
+ }
94
+ else if (item.type === "function_call") {
95
+ currentBlock = {
96
+ type: "toolCall",
97
+ id: `${item.call_id || ""}|${item.id || ""}`,
98
+ name: item.name || "",
99
+ arguments: {},
100
+ partialJson: item.arguments || "",
101
+ };
102
+ output.content.push(currentBlock);
103
+ stream.push({ type: "toolcall_start", contentIndex: blockIndex(), partial: output });
104
+ }
105
+ }
106
+ else if (isResponseReasoningTextDeltaEvent(event)) {
107
+ if (currentItemType === "reasoning" && currentBlock?.type === "thinking") {
108
+ currentBlock.thinking += event.delta;
109
+ stream.push({
110
+ type: "thinking_delta",
111
+ contentIndex: blockIndex(),
112
+ delta: event.delta,
113
+ partial: output,
114
+ });
115
+ }
116
+ }
117
+ else if (isResponseTextDeltaEvent(event)) {
118
+ if (currentItemType === "message" && currentBlock?.type === "text") {
119
+ currentBlock.text += event.delta;
120
+ stream.push({
121
+ type: "text_delta",
122
+ contentIndex: blockIndex(),
123
+ delta: event.delta,
124
+ partial: output,
125
+ });
126
+ }
127
+ }
128
+ else if (isResponseFunctionCallArgumentsDeltaEvent(event)) {
129
+ if (currentItemType === "function_call" && currentBlock?.type === "toolCall") {
130
+ currentBlock.partialJson += event.delta;
131
+ currentBlock.arguments = parseStreamingJson(currentBlock.partialJson);
132
+ stream.push({
133
+ type: "toolcall_delta",
134
+ contentIndex: blockIndex(),
135
+ delta: event.delta,
136
+ partial: output,
137
+ });
138
+ }
139
+ }
140
+ else if (isResponseFunctionCallArgumentsDoneEvent(event)) {
141
+ if (currentItemType === "function_call" && currentBlock?.type === "toolCall") {
142
+ currentBlock.partialJson = event.arguments;
143
+ currentBlock.arguments = parseStreamingJson(event.arguments);
144
+ }
145
+ }
146
+ else if (isResponseOutputItemDoneEvent(event)) {
147
+ const item = event.item;
148
+ if (item.type === "reasoning" && currentBlock?.type === "thinking") {
149
+ const summary = item.summary;
150
+ currentBlock.thinking = summary?.map((s) => s.text).join("\n\n") || "";
151
+ stream.push({
152
+ type: "thinking_end",
153
+ contentIndex: blockIndex(),
154
+ content: currentBlock.thinking,
155
+ partial: output,
156
+ });
157
+ currentBlock = null;
158
+ currentItemType = null;
159
+ }
160
+ else if (item.type === "message" && currentBlock?.type === "text") {
161
+ stream.push({
162
+ type: "text_end",
163
+ contentIndex: blockIndex(),
164
+ content: currentBlock.text,
165
+ partial: output,
166
+ });
167
+ currentBlock = null;
168
+ currentItemType = null;
169
+ }
170
+ else if (item.type === "function_call") {
171
+ const toolCall = {
172
+ type: "toolCall",
173
+ id: `${item.call_id || ""}|${item.id || ""}`,
174
+ name: item.name || "",
175
+ arguments: parseStreamingJson(item.arguments || "{}"),
176
+ };
177
+ currentBlock = null;
178
+ currentItemType = null;
179
+ stream.push({ type: "toolcall_end", contentIndex: blockIndex(), toolCall, partial: output });
180
+ }
181
+ }
182
+ else if (isResponseCompletedEvent(event)) {
183
+ const response = event.response;
184
+ if (response?.id) {
185
+ output.responseId = response.id;
186
+ }
187
+ if (response?.usage) {
188
+ const cachedTokens = response.usage.input_tokens_details?.cached_tokens || 0;
189
+ output.usage = {
190
+ input: (response.usage.input_tokens || 0) - cachedTokens,
191
+ output: response.usage.output_tokens || 0,
192
+ cacheRead: cachedTokens,
193
+ cacheWrite: 0,
194
+ totalTokens: response.usage.total_tokens || 0,
195
+ };
196
+ }
197
+ output.stopReason = mapStopReason(response?.status);
198
+ if (output.content.some((b) => b.type === "toolCall") && output.stopReason === "stop") {
199
+ output.stopReason = "toolUse";
200
+ }
201
+ }
202
+ else if (isResponseFailedEvent(event)) {
203
+ throw new Error(event.response?.error?.message || "Response failed");
204
+ }
205
+ else if (isResponseErrorEvent(event)) {
206
+ throw new Error(event.message || "Unknown error");
207
+ }
208
+ }
209
+ if (options?.signal?.aborted) {
210
+ throw new Error("Request was aborted");
211
+ }
212
+ stream.push({ type: "done", reason: output.stopReason, message: output });
213
+ stream.end();
214
+ }
215
+ catch (error) {
216
+ output.stopReason = options?.signal?.aborted ? "aborted" : "error";
217
+ output.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);
218
+ stream.push({ type: "error", reason: output.stopReason, error: output });
219
+ stream.end();
220
+ }
221
+ };
222
+ run();
223
+ return stream;
224
+ },
225
+ };
226
+ }
227
+ function isResponseCreatedEvent(e) {
228
+ return e.type === "response.created";
229
+ }
230
+ function isResponseOutputItemAddedEvent(e) {
231
+ return e.type === "response.output_item.added";
232
+ }
233
+ function isResponseReasoningTextDeltaEvent(e) {
234
+ return e.type === "response.reasoning_text.delta";
235
+ }
236
+ function isResponseTextDeltaEvent(e) {
237
+ return e.type === "response.output_text.delta";
238
+ }
239
+ function isResponseFunctionCallArgumentsDeltaEvent(e) {
240
+ return e.type === "response.function_call_arguments.delta";
241
+ }
242
+ function isResponseFunctionCallArgumentsDoneEvent(e) {
243
+ return e.type === "response.function_call_arguments.done";
244
+ }
245
+ function isResponseOutputItemDoneEvent(e) {
246
+ return e.type === "response.output_item.done";
247
+ }
248
+ function isResponseCompletedEvent(e) {
249
+ return e.type === "response.completed";
250
+ }
251
+ function isResponseFailedEvent(e) {
252
+ return e.type === "response.failed";
253
+ }
254
+ function isResponseErrorEvent(e) {
255
+ return e.type === "error";
256
+ }
257
+ function convertResponsesMessages(model, context) {
258
+ const messages = [];
259
+ if (context.systemPrompt) {
260
+ messages.push({
261
+ role: model.reasoning ? "developer" : "system",
262
+ content: sanitizeSurrogates(context.systemPrompt),
263
+ });
264
+ }
265
+ for (const msg of context.messages) {
266
+ if (msg.role === "user") {
267
+ if (typeof msg.content === "string") {
268
+ messages.push({
269
+ role: "user",
270
+ content: [{ type: "input_text", text: sanitizeSurrogates(msg.content) }],
271
+ });
272
+ }
273
+ else {
274
+ const content = msg.content.map((item) => {
275
+ if (item.type === "text") {
276
+ return { type: "input_text", text: sanitizeSurrogates(item.text) };
277
+ }
278
+ return {
279
+ type: "input_image",
280
+ image_url: `data:${item.mimeType};base64,${item.data}`,
281
+ };
282
+ });
283
+ messages.push({ role: "user", content });
284
+ }
285
+ }
286
+ else if (msg.role === "assistant") {
287
+ for (const block of msg.content) {
288
+ if (block.type === "text") {
289
+ messages.push({
290
+ type: "message",
291
+ role: "assistant",
292
+ content: [{ type: "output_text", text: sanitizeSurrogates(block.text) }],
293
+ });
294
+ }
295
+ else if (block.type === "toolCall") {
296
+ const tc = block;
297
+ messages.push({
298
+ type: "function_call",
299
+ call_id: tc.id.split("|")[0] || tc.id,
300
+ name: tc.name,
301
+ arguments: JSON.stringify(tc.arguments),
302
+ });
303
+ }
304
+ }
305
+ }
306
+ else if (msg.role === "toolResult") {
307
+ const textResult = msg.content
308
+ .filter((c) => c.type === "text")
309
+ .map((c) => c.text)
310
+ .join("\n");
311
+ messages.push({
312
+ type: "function_call_output",
313
+ call_id: msg.toolCallId.split("|")[0] || msg.toolCallId,
314
+ output: sanitizeSurrogates(textResult || "(no result)"),
315
+ });
316
+ }
317
+ }
318
+ return messages;
319
+ }
320
+ function mapStopReason(status) {
321
+ if (!status)
322
+ return "stop";
323
+ switch (status) {
324
+ case "completed":
325
+ return "stop";
326
+ case "incomplete":
327
+ return "length";
328
+ case "failed":
329
+ case "cancelled":
330
+ return "error";
331
+ default:
332
+ return "stop";
333
+ }
334
+ }
335
+ //# sourceMappingURL=openai-responses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses.js","sourceRoot":"","sources":["../../src/providers/openai-responses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Model, Context } from "../types.js";
2
+ import { AssistantMessageEventStream } from "../event-stream.js";
3
+ import { type OpenAICompletionsOptions } from "./openai-completions.js";
4
+ export declare function createOpenRouterProvider(): {
5
+ name: "openrouter";
6
+ listModels: () => Promise<{
7
+ id: string;
8
+ name: string;
9
+ }[]>;
10
+ stream(model: Model, context: Context, options?: OpenAICompletionsOptions): AssistantMessageEventStream;
11
+ };
12
+ //# sourceMappingURL=openrouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,yBAAyB,CAAC;AAuBjC,wBAAgB,wBAAwB;;;;;;kBAUtB,KAAK,WAAW,OAAO,YAAY,wBAAwB,GAAG,2BAA2B;EAQ1G"}
@@ -0,0 +1,42 @@
1
+ import { createOpenAICompletionsProvider, } from "./openai-completions.js";
2
+ const OPENROUTER_BASE_URL = "https://openrouter.ai/api/v1";
3
+ async function fetchLiveModels() {
4
+ try {
5
+ const res = await fetch(`${OPENROUTER_BASE_URL}/models`, {
6
+ signal: AbortSignal.timeout(5000),
7
+ });
8
+ const json = await res.json();
9
+ const list = json.data || [];
10
+ return list
11
+ .filter((m) => m.supported_parameters?.includes("tools"))
12
+ .map((m) => ({
13
+ id: m.id,
14
+ name: m.name || m.id,
15
+ }))
16
+ .sort((a, b) => a.name.localeCompare(b.name));
17
+ }
18
+ catch {
19
+ return [];
20
+ }
21
+ }
22
+ export function createOpenRouterProvider() {
23
+ const openaiProvider = createOpenAICompletionsProvider();
24
+ return {
25
+ name: "openrouter",
26
+ listModels: async () => {
27
+ const live = await fetchLiveModels();
28
+ if (live.length > 0)
29
+ return live.map((m) => ({ id: m.id, name: m.name }));
30
+ const { getProviderModels } = await import("../models.js");
31
+ return getProviderModels("openrouter").map((m) => ({ id: m.id, name: m.name }));
32
+ },
33
+ stream(model, context, options) {
34
+ const modelWithDefaults = {
35
+ ...model,
36
+ baseUrl: model.baseUrl || OPENROUTER_BASE_URL,
37
+ };
38
+ return openaiProvider.stream(modelWithDefaults, context, options);
39
+ },
40
+ };
41
+ }
42
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,+BAA+B,GAEhC,MAAM,yBAAyB,CAAC;AAEjC,MAAM,mBAAmB,GAAG,8BAA8B,CAAC;AAE3D,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,mBAAmB,SAAS,EAAE;YACvD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,OAAO,IAAI;aACR,MAAM,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAE,CAAC,CAAC,oBAAiC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;aAC/F,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC;YACpC,EAAE,EAAE,CAAC,CAAC,EAAY;YAClB,IAAI,EAAG,CAAC,CAAC,IAAe,IAAK,CAAC,CAAC,EAAa;SAC7C,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAmB,EAAE,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,MAAM,cAAc,GAAG,+BAA+B,EAAE,CAAC;IACzD,OAAO;QACL,IAAI,EAAE,YAAqB;QAC3B,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC1E,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YAC3D,OAAO,iBAAiB,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,CAAC,KAAY,EAAE,OAAgB,EAAE,OAAkC;YACvE,MAAM,iBAAiB,GAAG;gBACxB,GAAG,KAAK;gBACR,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,mBAAmB;aAC9C,CAAC;YACF,OAAO,cAAc,CAAC,MAAM,CAAC,iBAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpE,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function initProviders(): void;
2
+ //# sourceMappingURL=register-builtins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-builtins.d.ts","sourceRoot":"","sources":["../../src/providers/register-builtins.ts"],"names":[],"mappings":"AAqBA,wBAAgB,aAAa,IAAI,IAAI,CAuBpC"}
@@ -0,0 +1,41 @@
1
+ import { registerProvider } from "../registry.js";
2
+ import { createAnthropicProvider } from "./anthropic.js";
3
+ import { createOpenAICompletionsProvider } from "./openai-completions.js";
4
+ import { createOpenAIResponsesProvider } from "./openai-responses.js";
5
+ import { createGroqProvider } from "./groq.js";
6
+ import { createOpenRouterProvider } from "./openrouter.js";
7
+ function wrapOpenAIProvider(name, baseUrl) {
8
+ const inner = createOpenAICompletionsProvider();
9
+ return {
10
+ name,
11
+ listModels: () => import("../models.js").then((m) => m.getProviderModels(name)),
12
+ stream(model, context, options) {
13
+ return inner.stream({ ...model, baseUrl: model.baseUrl || baseUrl }, context, options);
14
+ },
15
+ };
16
+ }
17
+ export function initProviders() {
18
+ registerProvider(createAnthropicProvider());
19
+ registerProvider(createOpenAICompletionsProvider());
20
+ registerProvider(createOpenAIResponsesProvider());
21
+ registerProvider(createGroqProvider());
22
+ registerProvider(createOpenRouterProvider());
23
+ registerProvider(wrapOpenAIProvider("xai", "https://api.x.ai/v1"));
24
+ registerProvider(wrapOpenAIProvider("deepseek", "https://api.deepseek.com/v1"));
25
+ registerProvider(wrapOpenAIProvider("mistral", "https://api.mistral.ai/v1"));
26
+ registerProvider(wrapOpenAIProvider("cerebras", "https://api.cerebras.ai/v1"));
27
+ registerProvider(wrapOpenAIProvider("google", "https://generativelanguage.googleapis.com/v1beta/openai"));
28
+ registerProvider(wrapOpenAIProvider("fireworks-ai", "https://api.fireworks.ai/inference/v1"));
29
+ registerProvider(wrapOpenAIProvider("togetherai", "https://api.together.xyz/v1"));
30
+ registerProvider(wrapOpenAIProvider("perplexity", "https://api.perplexity.ai"));
31
+ registerProvider(wrapOpenAIProvider("cohere", "https://api.cohere.com/v1"));
32
+ registerProvider(wrapOpenAIProvider("novita-ai", "https://api.novita.ai/v3/openai"));
33
+ registerProvider(wrapOpenAIProvider("moonshotai", "https://api.moonshot.cn/v1"));
34
+ registerProvider(wrapOpenAIProvider("chutes", "https://api.chutes.ai/v1"));
35
+ registerProvider(wrapOpenAIProvider("minimax", "https://api.minimax.chat/v1"));
36
+ registerProvider(wrapOpenAIProvider("huggingface", "https://api-inference.huggingface.co/v1"));
37
+ registerProvider(wrapOpenAIProvider("nvidia", "https://integrate.api.nvidia.com/v1"));
38
+ registerProvider(wrapOpenAIProvider("zai", "https://api.z.ai/v1"));
39
+ }
40
+ initProviders();
41
+ //# sourceMappingURL=register-builtins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-builtins.js","sourceRoot":"","sources":["../../src/providers/register-builtins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,+BAA+B,EAAiC,MAAM,yBAAyB,CAAC;AACzG,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAK3D,SAAS,kBAAkB,CAAC,IAAY,EAAE,OAAe;IACvD,MAAM,KAAK,GAAG,+BAA+B,EAAE,CAAC;IAChD,OAAO;QACL,IAAI;QACJ,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC/E,MAAM,CAAC,KAAY,EAAE,OAAgB,EAAE,OAAkC;YACvE,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACzF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,gBAAgB,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC5C,gBAAgB,CAAC,+BAA+B,EAAE,CAAC,CAAC;IACpD,gBAAgB,CAAC,6BAA6B,EAAE,CAAC,CAAC;IAClD,gBAAgB,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACvC,gBAAgB,CAAC,wBAAwB,EAAE,CAAC,CAAC;IAE7C,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC;IACnE,gBAAgB,CAAC,kBAAkB,CAAC,UAAU,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAChF,gBAAgB,CAAC,kBAAkB,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAC7E,gBAAgB,CAAC,kBAAkB,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC,CAAC;IAC/E,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,yDAAyD,CAAC,CAAC,CAAC;IAC1G,gBAAgB,CAAC,kBAAkB,CAAC,cAAc,EAAE,uCAAuC,CAAC,CAAC,CAAC;IAC9F,gBAAgB,CAAC,kBAAkB,CAAC,YAAY,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAClF,gBAAgB,CAAC,kBAAkB,CAAC,YAAY,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAChF,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAC,CAAC;IAC5E,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,EAAE,iCAAiC,CAAC,CAAC,CAAC;IACrF,gBAAgB,CAAC,kBAAkB,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC,CAAC;IACjF,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC,CAAC;IAC3E,gBAAgB,CAAC,kBAAkB,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAC/E,gBAAgB,CAAC,kBAAkB,CAAC,aAAa,EAAE,yCAAyC,CAAC,CAAC,CAAC;IAC/F,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,qCAAqC,CAAC,CAAC,CAAC;IACtF,gBAAgB,CAAC,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,aAAa,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function sanitizeSurrogates(text: string): string;
2
+ export declare function parseStreamingJson(json: string): Record<string, unknown>;
3
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/providers/shared.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMxE"}
@@ -0,0 +1,12 @@
1
+ export function sanitizeSurrogates(text) {
2
+ return text;
3
+ }
4
+ export function parseStreamingJson(json) {
5
+ try {
6
+ return JSON.parse(json);
7
+ }
8
+ catch {
9
+ return {};
10
+ }
11
+ }
12
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/providers/shared.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Context, Model, StreamOptions } from "./types.js";
2
+ import { AssistantMessageEventStream } from "./event-stream.js";
3
+ export type StreamFunction = (model: Model, context: Context, options?: StreamOptions) => AssistantMessageEventStream;
4
+ export interface ModelInfo {
5
+ id: string;
6
+ name: string;
7
+ }
8
+ export interface Provider {
9
+ name: string;
10
+ stream: StreamFunction;
11
+ listModels?: () => ModelInfo[] | Promise<ModelInfo[]>;
12
+ }
13
+ export declare function registerProvider(provider: Provider): void;
14
+ export declare function getProvider(name: string): Provider | undefined;
15
+ export declare function listProviders(): string[];
16
+ export declare function getModels(providerName: string): Promise<ModelInfo[]>;
17
+ export declare function stream(model: Model, context: Context, options?: StreamOptions): AssistantMessageEventStream;
18
+ export declare function complete(model: Model, context: Context, options?: StreamOptions): Promise<import("./types.js").AssistantMessage>;
19
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG,CAC3B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,aAAa,KACpB,2BAA2B,CAAC;AAEjC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,SAAS,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CACvD;AAID,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAEzD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAE9D;AAED,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED,wBAAsB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAI1E;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,aAAa,GACtB,2BAA2B,CAM7B;AAED,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,CAAC,CAGhD"}
@@ -0,0 +1,28 @@
1
+ const providers = new Map();
2
+ export function registerProvider(provider) {
3
+ providers.set(provider.name, provider);
4
+ }
5
+ export function getProvider(name) {
6
+ return providers.get(name);
7
+ }
8
+ export function listProviders() {
9
+ return Array.from(providers.keys());
10
+ }
11
+ export async function getModels(providerName) {
12
+ const provider = providers.get(providerName);
13
+ if (!provider?.listModels)
14
+ return [];
15
+ return provider.listModels();
16
+ }
17
+ export function stream(model, context, options) {
18
+ const provider = providers.get(model.provider);
19
+ if (!provider) {
20
+ throw new Error(`No provider registered for: ${model.provider}. Available: ${listProviders().join(", ")}`);
21
+ }
22
+ return provider.stream(model, context, options);
23
+ }
24
+ export async function complete(model, context, options) {
25
+ const s = stream(model, context, options);
26
+ return s.result();
27
+ }
28
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAoBA,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;AAE9C,MAAM,UAAU,gBAAgB,CAAC,QAAkB;IACjD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,YAAoB;IAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,UAAU;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO,QAAQ,CAAC,UAAU,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,KAAY,EACZ,OAAgB,EAChB,OAAuB;IAEvB,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,CAAC,QAAQ,gBAAgB,aAAa,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7G,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAAY,EACZ,OAAgB,EAChB,OAAuB;IAEvB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AACpB,CAAC"}