@browserlessapi/inferlo 0.0.0-stage → 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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +130 -2
  3. package/dist/ai/index.d.ts +138 -0
  4. package/dist/ai/index.js +450 -0
  5. package/dist/ai/index.js.map +1 -0
  6. package/dist/ai/providers.d.ts +150 -0
  7. package/dist/ai/providers.js +294 -0
  8. package/dist/ai/providers.js.map +1 -0
  9. package/dist/app.d.ts +109 -0
  10. package/dist/app.js +419 -0
  11. package/dist/app.js.map +1 -0
  12. package/dist/auth.d.ts +29 -0
  13. package/dist/auth.js +61 -0
  14. package/dist/auth.js.map +1 -0
  15. package/dist/cli/main.d.ts +2 -0
  16. package/dist/cli/main.js +520 -0
  17. package/dist/cli/main.js.map +1 -0
  18. package/dist/client-ip.d.ts +7 -0
  19. package/dist/client-ip.js +27 -0
  20. package/dist/client-ip.js.map +1 -0
  21. package/dist/cron.d.ts +17 -0
  22. package/dist/cron.js +143 -0
  23. package/dist/cron.js.map +1 -0
  24. package/dist/db/memory.d.ts +2 -0
  25. package/dist/db/memory.js +128 -0
  26. package/dist/db/memory.js.map +1 -0
  27. package/dist/db/migrate.d.ts +87 -0
  28. package/dist/db/migrate.js +471 -0
  29. package/dist/db/migrate.js.map +1 -0
  30. package/dist/db/postgres.d.ts +37 -0
  31. package/dist/db/postgres.js +338 -0
  32. package/dist/db/postgres.js.map +1 -0
  33. package/dist/db/table.d.ts +117 -0
  34. package/dist/db/table.js +274 -0
  35. package/dist/db/table.js.map +1 -0
  36. package/dist/db/types.d.ts +36 -0
  37. package/dist/db/types.js +2 -0
  38. package/dist/db/types.js.map +1 -0
  39. package/dist/describe.d.ts +74 -0
  40. package/dist/describe.js +69 -0
  41. package/dist/describe.js.map +1 -0
  42. package/dist/env.d.ts +19 -0
  43. package/dist/env.js +72 -0
  44. package/dist/env.js.map +1 -0
  45. package/dist/errors.d.ts +40 -0
  46. package/dist/errors.js +99 -0
  47. package/dist/errors.js.map +1 -0
  48. package/dist/index.d.ts +31 -0
  49. package/dist/index.js +20 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/jobs.d.ts +177 -0
  52. package/dist/jobs.js +374 -0
  53. package/dist/jobs.js.map +1 -0
  54. package/dist/mcp.d.ts +22 -0
  55. package/dist/mcp.js +171 -0
  56. package/dist/mcp.js.map +1 -0
  57. package/dist/model.d.ts +36 -0
  58. package/dist/model.js +76 -0
  59. package/dist/model.js.map +1 -0
  60. package/dist/openapi.d.ts +6 -0
  61. package/dist/openapi.js +74 -0
  62. package/dist/openapi.js.map +1 -0
  63. package/dist/rate-limit.d.ts +45 -0
  64. package/dist/rate-limit.js +93 -0
  65. package/dist/rate-limit.js.map +1 -0
  66. package/dist/route.d.ts +131 -0
  67. package/dist/route.js +28 -0
  68. package/dist/route.js.map +1 -0
  69. package/dist/schema.d.ts +164 -0
  70. package/dist/schema.js +442 -0
  71. package/dist/schema.js.map +1 -0
  72. package/dist/serve.d.ts +11 -0
  73. package/dist/serve.js +86 -0
  74. package/dist/serve.js.map +1 -0
  75. package/dist/testing.d.ts +16 -0
  76. package/dist/testing.js +30 -0
  77. package/dist/testing.js.map +1 -0
  78. package/llms.txt +27 -0
  79. package/package.json +82 -4
  80. package/templates/app/AGENTS.md +55 -0
  81. package/templates/app/CLAUDE.md +1 -0
  82. package/templates/app/README.md +16 -0
  83. package/templates/app/_env.example +5 -0
  84. package/templates/app/_gitignore +3 -0
  85. package/templates/app/package.json.tpl +32 -0
  86. package/templates/app/src/app.ts +38 -0
  87. package/templates/app/src/models.ts +31 -0
  88. package/templates/app/src/routes/health.ts +3 -0
  89. package/templates/app/src/routes/notes.ts +56 -0
  90. package/templates/app/src/server.ts +26 -0
  91. package/templates/app/test/notes.test.ts +50 -0
  92. package/templates/app/tsconfig.json +17 -0
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Inferlo AI: one API for every model provider, with model aliases, automatic fallback,
3
+ * typed structured output, streaming, embeddings, usage tracking and budgets.
4
+ *
5
+ * ai: {
6
+ * providers: { anthropic: anthropic({ apiKey: env("ANTHROPIC_API_KEY") }) },
7
+ * models: { fast: ["anthropic:claude-haiku-4-5", "openai:gpt-5-mini"] },
8
+ * }
9
+ *
10
+ * const { object } = await ctx.ai.generate({ model: "fast", prompt, output: Triage })
11
+ */
12
+ import { InferloError, didYouMean } from "../errors.js";
13
+ import { toJSONSchema } from "../schema.js";
14
+ import { ProviderError, imageData } from "./providers.js";
15
+ export * from "./providers.js";
16
+ const toolRunners = new WeakMap();
17
+ /** ctx.ai for one request: the same AI, with tools that run as the request's user. Internal: used by createApp. */
18
+ export function bindTools(ai, runner, describe) {
19
+ const bound = { ...ai };
20
+ toolRunners.set(bound, { runner, describe });
21
+ bound.generate = (options) => ai.generate.call(bound, options);
22
+ return bound;
23
+ }
24
+ function buildMessages(o) {
25
+ const messages = [];
26
+ if (o.system)
27
+ messages.push({ role: "system", content: o.system });
28
+ if (o.messages)
29
+ messages.push(...o.messages.map((m) => ({ ...m })));
30
+ if (o.images !== undefined && o.prompt === undefined) {
31
+ throw new InferloError("IL5012", "images needs a prompt: they are sent with the prompt message.", {
32
+ fix: 'Pass prompt: "What is in this image?" with images, or put images on a user message: messages: [{ role: "user", content: "...", images: [...] }].',
33
+ });
34
+ }
35
+ if (o.prompt !== undefined)
36
+ messages.push({ role: "user", content: o.prompt, ...(o.images?.length ? { images: o.images } : {}) });
37
+ if (!messages.some((m) => m.role !== "system")) {
38
+ throw new InferloError("IL5007", "ai.generate() needs a prompt or messages.", { fix: 'Pass prompt: "..." or messages: [{ role: "user", content: "..." }].' });
39
+ }
40
+ messages.forEach(checkImages);
41
+ return messages;
42
+ }
43
+ const IMAGE_TYPES = ["image/png", "image/jpeg", "image/gif", "image/webp"];
44
+ const BASE64 = /^[A-Za-z0-9+/]+={0,2}$/;
45
+ /** Images must be on user messages, with an http(s) or data: URL, or base64 data of a supported type. Raises IL5012. */
46
+ function checkImages(message, index) {
47
+ if (message.images === undefined)
48
+ return;
49
+ const fail = (problem, fix) => {
50
+ throw new InferloError("IL5012", `Invalid image in message ${index}: ${problem}`, { fix });
51
+ };
52
+ const shape = 'Use { url: "https://..." } or { base64: "<base64 data>", mediaType: "image/png" }.';
53
+ if (!Array.isArray(message.images))
54
+ fail("images must be an array.", shape);
55
+ if (message.role !== "user" && message.images.length)
56
+ fail(`only user messages can have images, not ${message.role} messages.`, "Move the images to a user message.");
57
+ message.images.forEach((image, i) => {
58
+ const where = `images[${i}]`;
59
+ if (!image || typeof image !== "object")
60
+ return fail(`${where} is not an object.`, shape);
61
+ const value = image;
62
+ if ("url" in value) {
63
+ if (typeof value.url !== "string" || !/^(https?:\/\/|data:)/i.test(value.url))
64
+ return fail(`${where}.url must start with https://, http:// or data:.`, shape);
65
+ const data = imageData(value);
66
+ if (/^data:/i.test(value.url) && !data)
67
+ return fail(`${where}.url is a data: URL without base64 data.`, "Use data:image/png;base64,<data>, or { base64, mediaType }.");
68
+ if (data && !IMAGE_TYPES.includes(data.mediaType))
69
+ return fail(`${where} has media type "${data.mediaType}".`, `Supported types: ${IMAGE_TYPES.join(", ")}.`);
70
+ if (data && !BASE64.test(data.base64))
71
+ return fail(`${where}.url does not contain valid base64 data.`, "Encode the image bytes as base64, without line breaks.");
72
+ return;
73
+ }
74
+ if ("base64" in value) {
75
+ if (typeof value.base64 !== "string" || !value.base64 || !BASE64.test(value.base64))
76
+ return fail(`${where}.base64 is not valid base64 data.`, "Encode the image bytes as base64, without line breaks or a data: prefix.");
77
+ if (typeof value.mediaType !== "string" || !IMAGE_TYPES.includes(value.mediaType))
78
+ return fail(`${where}.mediaType must be one of ${IMAGE_TYPES.join(", ")}.`, 'Add mediaType: "image/png" (or the type of the image).');
79
+ return;
80
+ }
81
+ fail(`${where} has neither url nor base64.`, shape);
82
+ });
83
+ }
84
+ /** Pull a JSON value out of model text, tolerating ```json fences and leading prose. */
85
+ export function extractJson(text) {
86
+ const trimmed = text.trim();
87
+ const fenced = /```(?:json)?\s*([\s\S]*?)```/i.exec(trimmed);
88
+ const candidate = fenced ? fenced[1].trim() : trimmed;
89
+ try {
90
+ return JSON.parse(candidate);
91
+ }
92
+ catch {
93
+ const start = candidate.search(/[[{]/);
94
+ const end = Math.max(candidate.lastIndexOf("}"), candidate.lastIndexOf("]"));
95
+ if (start !== -1 && end > start)
96
+ return JSON.parse(candidate.slice(start, end + 1));
97
+ throw new SyntaxError("No JSON found in model output");
98
+ }
99
+ }
100
+ export function createAI(config) {
101
+ const providers = config?.providers ?? {};
102
+ const aliases = {};
103
+ for (const [alias, ids] of Object.entries(config?.models ?? {}))
104
+ aliases[alias] = Array.isArray(ids) ? ids : [ids];
105
+ const resolve = (requested) => {
106
+ const name = requested ?? config?.defaultModel ?? Object.keys(aliases)[0];
107
+ if (!Object.keys(providers).length) {
108
+ throw new InferloError("IL5001", "No AI providers are configured.", {
109
+ fix: 'Add createApp({ ai: { providers: { anthropic: anthropic({ apiKey: env("ANTHROPIC_API_KEY") }) }, models: { fast: "anthropic:claude-haiku-4-5" } } }).',
110
+ });
111
+ }
112
+ if (!name)
113
+ throw new InferloError("IL5001", "No model given and no default model configured.", { fix: 'Pass model: "provider:model" or set ai.defaultModel.' });
114
+ const ids = aliases[name] ?? [name];
115
+ return ids.map((id) => {
116
+ const colon = id.indexOf(":");
117
+ if (colon === -1) {
118
+ throw new InferloError("IL5001", `Unknown model or alias "${id}".${didYouMean(id, Object.keys(aliases))}`, {
119
+ fix: `Use an alias (${Object.keys(aliases).join(", ") || "none configured"}) or "provider:model", e.g. "anthropic:claude-haiku-4-5".`,
120
+ });
121
+ }
122
+ const providerName = id.slice(0, colon);
123
+ const provider = providers[providerName];
124
+ if (!provider) {
125
+ throw new InferloError("IL5001", `AI provider "${providerName}" is not configured.${didYouMean(providerName, Object.keys(providers))}`, {
126
+ fix: `Configured providers: ${Object.keys(providers).join(", ")}.`,
127
+ });
128
+ }
129
+ return { provider, providerName, model: id.slice(colon + 1), id };
130
+ });
131
+ };
132
+ const cost = (id, usage) => {
133
+ const price = config?.pricing?.[id];
134
+ if (!price)
135
+ return 0;
136
+ return (usage.inputTokens * price.input + usage.outputTokens * price.output) / 1_000_000;
137
+ };
138
+ const record = async (usage) => {
139
+ try {
140
+ await config?.onUsage?.(usage);
141
+ }
142
+ catch (error) {
143
+ console.error("[inferlo] ai.onUsage failed:", error);
144
+ }
145
+ };
146
+ const guard = async (forId, model) => {
147
+ if (!forId || !config?.allow)
148
+ return;
149
+ let allowed;
150
+ try {
151
+ allowed = await config.allow({ for: forId, model });
152
+ }
153
+ catch (error) {
154
+ if (error instanceof InferloError)
155
+ throw error;
156
+ allowed = false;
157
+ }
158
+ if (!allowed)
159
+ throw new InferloError("IL5004", "AI usage limit reached.", { status: 402, fix: "Add credits or raise this account's limit." });
160
+ };
161
+ /** Try each target in order, moving on only for retryable provider errors. */
162
+ const withFallback = async (targets, run) => {
163
+ const errors = [];
164
+ for (const target of targets) {
165
+ try {
166
+ return await run(target);
167
+ }
168
+ catch (error) {
169
+ if (error instanceof ProviderError && error.retryable) {
170
+ errors.push(`${target.id}: ${error.message}`);
171
+ continue;
172
+ }
173
+ throw error;
174
+ }
175
+ }
176
+ throw new InferloError("IL5003", `All models failed: ${targets.map((t) => t.id).join(", ")}.`, { status: 502, expose: false, details: errors });
177
+ };
178
+ const ai = {
179
+ aliases,
180
+ configured: Object.keys(providers).length > 0,
181
+ async generate(options) {
182
+ const requested = options.model ?? config?.defaultModel ?? Object.keys(aliases)[0] ?? "";
183
+ const targets = resolve(options.model);
184
+ const tooling = options.tools?.length ? toolRunners.get(this) : undefined;
185
+ if (options.tools?.length && !tooling) {
186
+ throw new InferloError("IL5009", "ai.generate({ tools }) only works inside a route handler.", {
187
+ fix: "Call ctx.ai.generate({ tools }) from a route handler, so each tool runs as the signed-in user with the route's auth and validation.",
188
+ });
189
+ }
190
+ const tools = new Map();
191
+ for (const route of options.tools ?? []) {
192
+ const spec = tooling.describe(route);
193
+ tools.set(spec.name, { route, spec });
194
+ }
195
+ const specs = tools.size ? [...tools.values()].map((t) => t.spec) : undefined;
196
+ const maxSteps = Math.max(1, options.maxSteps ?? 5);
197
+ await guard(options.for, requested);
198
+ const messages = buildMessages(options);
199
+ const schema = options.output;
200
+ const jsonSchema = schema ? toJSONSchema(schema) : undefined;
201
+ if (schema) {
202
+ const instruction = "Respond with only a JSON value that matches this JSON Schema. No prose, no code fences.\n" + JSON.stringify(jsonSchema);
203
+ const sys = messages.find((m) => m.role === "system");
204
+ if (sys)
205
+ sys.content += "\n\n" + instruction;
206
+ else
207
+ messages.unshift({ role: "system", content: instruction });
208
+ }
209
+ const started = Date.now();
210
+ // Once a tool has run, falling back to another model would run it again.
211
+ let toolsRan = false;
212
+ return withFallback(targets, async (target) => {
213
+ const total = { inputTokens: 0, outputTokens: 0 };
214
+ const steps = [];
215
+ const convo = messages.map((m) => ({ ...m }));
216
+ let repairsLeft = schema ? Math.max(0, options.repairAttempts ?? 1) : 0;
217
+ let toolRounds = 0;
218
+ let lastIssues = "";
219
+ const usageNow = () => ({ requested, model: target.id, ...total, cost: cost(target.id, total), for: options.for, kind: "generate", durationMs: Date.now() - started });
220
+ while (true) {
221
+ // Budgets are checked again before every model call that follows tool calls.
222
+ if (steps.at(-1)?.toolCalls.length)
223
+ await guard(options.for, requested);
224
+ let response;
225
+ try {
226
+ response = await target.provider.generate({
227
+ model: target.model,
228
+ messages: convo,
229
+ temperature: options.temperature,
230
+ maxTokens: options.maxTokens,
231
+ json: Boolean(schema),
232
+ jsonSchema,
233
+ tools: specs,
234
+ signal: options.signal,
235
+ });
236
+ }
237
+ catch (error) {
238
+ if (toolsRan && error instanceof ProviderError && error.retryable) {
239
+ if (steps.length)
240
+ await record(usageNow());
241
+ throw new InferloError("IL5006", error.message, { status: 502, expose: false, fix: "Tools already ran, so Inferlo does not retry on a fallback model. Retry the request.", cause: error });
242
+ }
243
+ throw error;
244
+ }
245
+ total.inputTokens += response.usage.inputTokens;
246
+ total.outputTokens += response.usage.outputTokens;
247
+ const step = { text: response.text, toolCalls: [], usage: response.usage };
248
+ steps.push(step);
249
+ if (specs && response.toolCalls?.length) {
250
+ if (++toolRounds >= maxSteps) {
251
+ await record(usageNow());
252
+ throw new InferloError("IL5010", `Model ${target.id} was still calling tools after ${maxSteps} steps.`, {
253
+ status: 502,
254
+ expose: false,
255
+ fix: "Raise maxSteps, give the model fewer and more specific tools, or say in the prompt when to stop.",
256
+ details: steps.map((s) => s.toolCalls.map((c) => c.name)),
257
+ });
258
+ }
259
+ convo.push({ role: "assistant", content: response.text, toolCalls: response.toolCalls });
260
+ for (const call of response.toolCalls) {
261
+ const tool = tools.get(call.name);
262
+ let result;
263
+ if (!tool) {
264
+ const text = `Unknown tool "${call.name}". Available tools: ${[...tools.keys()].join(", ")}.`;
265
+ result = { status: 404, output: text, text };
266
+ }
267
+ else if (typeof call.input !== "object" || call.input === null || Array.isArray(call.input)) {
268
+ const text = "Tool arguments must be a JSON object.";
269
+ result = { status: 422, output: text, text };
270
+ }
271
+ else {
272
+ toolsRan = true;
273
+ result = await tooling.runner(tool.route, call.input);
274
+ }
275
+ const isError = result.status >= 400;
276
+ step.toolCalls.push({ id: call.id, name: call.name, input: call.input, status: result.status, output: result.output, isError });
277
+ convo.push({ role: "tool", toolCallId: call.id, content: result.text, ...(isError ? { isError } : {}) });
278
+ }
279
+ continue;
280
+ }
281
+ if (!schema) {
282
+ const usage = usageNow();
283
+ await record(usage);
284
+ return { text: response.text, object: undefined, usage, steps };
285
+ }
286
+ let parsed;
287
+ let ok = false;
288
+ try {
289
+ parsed = extractJson(response.text);
290
+ const result = schema.safeParse(parsed);
291
+ if (result.ok) {
292
+ parsed = result.value;
293
+ ok = true;
294
+ }
295
+ else {
296
+ lastIssues = result.issues.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ");
297
+ }
298
+ }
299
+ catch {
300
+ lastIssues = "The response was not valid JSON.";
301
+ }
302
+ if (ok) {
303
+ const usage = usageNow();
304
+ await record(usage);
305
+ return { text: response.text, object: parsed, usage, steps };
306
+ }
307
+ if (repairsLeft-- <= 0) {
308
+ await record(usageNow());
309
+ break;
310
+ }
311
+ convo.push({ role: "assistant", content: response.text }, {
312
+ role: "user",
313
+ content: lastIssues === "The response was not valid JSON." ? `${lastIssues} Reply with only the JSON value.` : `That JSON does not match the schema: ${lastIssues}. Reply with corrected JSON only.`,
314
+ });
315
+ }
316
+ throw new InferloError("IL5002", `Model ${target.id} did not return output matching the schema. ${lastIssues}`, {
317
+ status: 502,
318
+ expose: false,
319
+ fix: "Simplify the output schema, add .describe() hints to fields, or use a stronger model.",
320
+ });
321
+ });
322
+ },
323
+ stream(options) {
324
+ const requested = options.model ?? config?.defaultModel ?? Object.keys(aliases)[0] ?? "";
325
+ let resolveText;
326
+ let rejectText;
327
+ let resolveUsage;
328
+ const textPromise = new Promise((res, rej) => ((resolveText = res), (rejectText = rej)));
329
+ const usagePromise = new Promise((res) => (resolveUsage = res));
330
+ textPromise.catch(() => { });
331
+ let consumed = false;
332
+ async function* run() {
333
+ if (consumed)
334
+ throw new InferloError("IL5008", "A stream can only be read once.", { fix: "Call ai.stream() again, or use await stream.text()." });
335
+ consumed = true;
336
+ const targets = resolve(options.model);
337
+ await guard(options.for, requested);
338
+ const messages = buildMessages(options);
339
+ const started = Date.now();
340
+ let full = "";
341
+ try {
342
+ for (let i = 0; i < targets.length; i++) {
343
+ const target = targets[i];
344
+ if (!target.provider.stream) {
345
+ throw new InferloError("IL5005", `Provider "${target.providerName}" does not support streaming.`);
346
+ }
347
+ let usage = { inputTokens: 0, outputTokens: 0 };
348
+ try {
349
+ for await (const part of target.provider.stream({ model: target.model, messages, temperature: options.temperature, maxTokens: options.maxTokens, signal: options.signal })) {
350
+ if (typeof part === "string") {
351
+ full += part;
352
+ yield part;
353
+ }
354
+ else
355
+ usage = part.usage;
356
+ }
357
+ }
358
+ catch (error) {
359
+ // Fall back only if nothing was sent yet.
360
+ if (error instanceof ProviderError && error.retryable && full === "" && i < targets.length - 1)
361
+ continue;
362
+ throw error;
363
+ }
364
+ const u = { requested, model: target.id, ...usage, cost: cost(target.id, usage), for: options.for, kind: "stream", durationMs: Date.now() - started };
365
+ await record(u);
366
+ resolveUsage(u);
367
+ resolveText(full);
368
+ return;
369
+ }
370
+ }
371
+ catch (error) {
372
+ rejectText(error);
373
+ throw error;
374
+ }
375
+ }
376
+ let iterator;
377
+ const start = () => (iterator ??= run());
378
+ return {
379
+ [Symbol.asyncIterator]: () => start(),
380
+ async text() {
381
+ if (!iterator)
382
+ for await (const _ of start())
383
+ void _;
384
+ return textPromise;
385
+ },
386
+ usage: () => usagePromise,
387
+ toResponse(init) {
388
+ const encoder = new TextEncoder();
389
+ const source = start();
390
+ const body = new ReadableStream({
391
+ async pull(controller) {
392
+ try {
393
+ const { value, done } = await source.next();
394
+ if (done) {
395
+ const usage = await usagePromise;
396
+ controller.enqueue(encoder.encode(`event: done\ndata: ${JSON.stringify({ usage })}\n\n`));
397
+ controller.close();
398
+ return;
399
+ }
400
+ controller.enqueue(encoder.encode(`event: text\ndata: ${JSON.stringify(value)}\n\n`));
401
+ }
402
+ catch (error) {
403
+ const code = error instanceof InferloError ? error.code : "IL9000";
404
+ controller.enqueue(encoder.encode(`event: error\ndata: ${JSON.stringify({ code })}\n\n`));
405
+ controller.close();
406
+ console.error("[inferlo] stream failed:", error);
407
+ }
408
+ },
409
+ cancel() {
410
+ void source.return(undefined);
411
+ },
412
+ });
413
+ return new Response(body, {
414
+ ...init,
415
+ headers: { "content-type": "text/event-stream; charset=utf-8", "cache-control": "no-cache", connection: "keep-alive", ...init?.headers },
416
+ });
417
+ },
418
+ };
419
+ },
420
+ async embed(options) {
421
+ const requested = options.model ?? "embed";
422
+ const targets = resolve(options.model ?? (aliases.embed ? "embed" : undefined));
423
+ await guard(options.for, requested);
424
+ const input = Array.isArray(options.input) ? options.input : [options.input];
425
+ const started = Date.now();
426
+ return withFallback(targets, async (target) => {
427
+ if (!target.provider.embed)
428
+ throw new InferloError("IL5005", `Provider "${target.providerName}" does not support embeddings.`);
429
+ const result = await target.provider.embed({ model: target.model, input, signal: options.signal });
430
+ const usage = { requested, model: target.id, ...result.usage, cost: cost(target.id, result.usage), for: options.for, kind: "embed", durationMs: Date.now() - started };
431
+ await record(usage);
432
+ return { embeddings: result.embeddings, usage };
433
+ });
434
+ },
435
+ };
436
+ return ai;
437
+ }
438
+ /** Cosine similarity of two vectors, for small in-memory searches. */
439
+ export function cosineSimilarity(a, b) {
440
+ let dot = 0;
441
+ let na = 0;
442
+ let nb = 0;
443
+ for (let i = 0; i < a.length; i++) {
444
+ dot += a[i] * b[i];
445
+ na += a[i] * a[i];
446
+ nb += b[i] * b[i];
447
+ }
448
+ return na && nb ? dot / Math.sqrt(na * nb) : 0;
449
+ }
450
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * AI providers. Each one turns a provider-neutral request into an HTTP call.
3
+ * openaiCompatible() covers OpenAI, DeepSeek, Qwen (DashScope), Groq, Together, OpenRouter,
4
+ * Ollama, vLLM, LM Studio and any other server that speaks the Chat Completions API.
5
+ */
6
+ import { InferloError } from "../errors.ts";
7
+ export interface Message {
8
+ role: "system" | "user" | "assistant" | "tool";
9
+ content: string;
10
+ /** Images the model should look at with this message (user messages only). */
11
+ images?: Image[];
12
+ /** Tools the model asked to call (assistant messages). */
13
+ toolCalls?: ToolCall[];
14
+ /** Which tool call this message answers (tool messages). */
15
+ toolCallId?: string;
16
+ /** The tool call failed (tool messages). */
17
+ isError?: boolean;
18
+ }
19
+ /** Image types every vision provider accepts. */
20
+ export type ImageMediaType = "image/png" | "image/jpeg" | "image/gif" | "image/webp";
21
+ /**
22
+ * An image for a vision model: a URL the provider downloads ({ url: "https://..." }, data: URLs too),
23
+ * or base64 data with its media type ({ base64, mediaType: "image/png" }).
24
+ */
25
+ export type Image = {
26
+ url: string;
27
+ } | {
28
+ base64: string;
29
+ mediaType: ImageMediaType;
30
+ };
31
+ /** Base64 data and media type of an image given as base64 or a data: URL, or null for a remote URL. */
32
+ export declare function imageData(image: Image): {
33
+ base64: string;
34
+ mediaType: string;
35
+ } | null;
36
+ /** A model's request to call a tool. */
37
+ export interface ToolCall {
38
+ id: string;
39
+ name: string;
40
+ /** Arguments as the model sent them (an object when they were valid JSON). */
41
+ input: unknown;
42
+ }
43
+ /** A tool offered to the model: its name, what it does, and a JSON Schema of its arguments. */
44
+ export interface ToolSpec {
45
+ name: string;
46
+ description: string;
47
+ inputSchema: Record<string, unknown>;
48
+ }
49
+ export interface ProviderRequest {
50
+ model: string;
51
+ messages: Message[];
52
+ temperature?: number;
53
+ maxTokens?: number;
54
+ /** Ask for a JSON object response (when the provider supports it). */
55
+ json?: boolean;
56
+ /** JSON Schema of the expected object, for providers with native structured output. */
57
+ jsonSchema?: Record<string, unknown>;
58
+ /** Tools the model may call. */
59
+ tools?: ToolSpec[];
60
+ signal?: AbortSignal;
61
+ }
62
+ export interface ProviderUsage {
63
+ inputTokens: number;
64
+ outputTokens: number;
65
+ }
66
+ export interface ProviderResponse {
67
+ text: string;
68
+ usage: ProviderUsage;
69
+ /** Tools the model wants to call before it answers. */
70
+ toolCalls?: ToolCall[];
71
+ }
72
+ export interface Provider {
73
+ readonly name: string;
74
+ generate(request: ProviderRequest): Promise<ProviderResponse>;
75
+ stream?(request: ProviderRequest): AsyncIterable<string | {
76
+ usage: ProviderUsage;
77
+ }>;
78
+ embed?(request: {
79
+ model: string;
80
+ input: string[];
81
+ signal?: AbortSignal;
82
+ }): Promise<{
83
+ embeddings: number[][];
84
+ usage: ProviderUsage;
85
+ }>;
86
+ }
87
+ /** Raised when a provider call fails. retryable errors move on to the next fallback model. */
88
+ export declare class ProviderError extends InferloError {
89
+ readonly retryable: boolean;
90
+ constructor(provider: string, status: number, body: string);
91
+ }
92
+ type FetchLike = typeof fetch;
93
+ /** Parse a server-sent events stream into data payloads. */
94
+ export declare function sseData(body: ReadableStream<Uint8Array>): AsyncIterable<string>;
95
+ export interface OpenAICompatibleOptions {
96
+ /** Name used in model ids ("openai:gpt-5-mini"). */
97
+ name?: string;
98
+ baseURL: string;
99
+ apiKey?: string;
100
+ headers?: Record<string, string>;
101
+ /** Send response_format json_schema for structured output (default true for OpenAI, false otherwise). */
102
+ nativeStructuredOutput?: boolean;
103
+ fetch?: FetchLike;
104
+ }
105
+ export declare function openaiCompatible(options: OpenAICompatibleOptions): Provider;
106
+ export declare function openai(options: {
107
+ apiKey: string;
108
+ baseURL?: string;
109
+ organization?: string;
110
+ fetch?: FetchLike;
111
+ }): Provider;
112
+ /** Local models through Ollama's OpenAI-compatible endpoint. */
113
+ export declare function ollama(options?: {
114
+ baseURL?: string;
115
+ fetch?: FetchLike;
116
+ }): Provider;
117
+ export declare function anthropic(options: {
118
+ apiKey: string;
119
+ baseURL?: string;
120
+ version?: string;
121
+ fetch?: FetchLike;
122
+ }): Provider;
123
+ /** Gemini through Google's OpenAI-compatible endpoint. */
124
+ export declare function gemini(options: {
125
+ apiKey: string;
126
+ fetch?: FetchLike;
127
+ }): Provider;
128
+ /** What a mockProvider returns: text, or tool calls (with optional text). */
129
+ export type MockReply = string | {
130
+ text?: string;
131
+ toolCalls?: {
132
+ id?: string;
133
+ name: string;
134
+ input?: unknown;
135
+ }[];
136
+ };
137
+ /**
138
+ * Deterministic provider for tests. respond receives the request and returns the text,
139
+ * or { toolCalls } to call tools (see request.tools and the "tool" messages for results).
140
+ *
141
+ * mockProvider({ respond: () => JSON.stringify({ priority: "urgent", summary: "Server down" }) })
142
+ * mockProvider({ respond: (r) => (r.messages.at(-1)!.role === "tool" ? "Done" : { toolCalls: [{ name: "createTicket", input: { title: "Hi" } }] }) })
143
+ */
144
+ export declare function mockProvider(options: {
145
+ name?: string;
146
+ respond: (request: ProviderRequest) => MockReply | Promise<MockReply>;
147
+ }): Provider & {
148
+ calls: ProviderRequest[];
149
+ };
150
+ export {};