@tryhamster/gerbil 1.0.0-rc.23 → 1.0.0-rc.25
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/dist/browser/index.d.ts +146 -2
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +507 -22
- package/dist/browser/index.js.map +1 -1
- package/dist/cli.mjs +7 -7
- package/dist/cli.mjs.map +1 -1
- package/dist/frameworks/express.d.mts +1 -3
- package/dist/frameworks/express.d.mts.map +1 -1
- package/dist/frameworks/express.mjs +3 -3
- package/dist/frameworks/express.mjs.map +1 -1
- package/dist/frameworks/fastify.d.mts +1 -1
- package/dist/frameworks/fastify.mjs +1 -1
- package/dist/frameworks/hono.d.mts +1 -1
- package/dist/frameworks/hono.mjs +1 -1
- package/dist/frameworks/next.d.mts +2 -2
- package/dist/frameworks/next.mjs +1 -1
- package/dist/frameworks/react.d.mts +1 -1
- package/dist/frameworks/react.d.mts.map +1 -1
- package/dist/frameworks/trpc.d.mts +1 -1
- package/dist/frameworks/trpc.mjs +1 -1
- package/dist/{gerbil-DJygY0sJ.d.mts → gerbil-CbnV_cG5.d.mts} +9 -2
- package/dist/gerbil-CbnV_cG5.d.mts.map +1 -0
- package/dist/{gerbil-PzPtcdeM.mjs → gerbil-DODVGr-u.mjs} +1 -1
- package/dist/{gerbil-DzZ-L6n8.mjs → gerbil-jO9anIh_.mjs} +90 -3
- package/dist/gerbil-jO9anIh_.mjs.map +1 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/dist/integrations/ai-sdk.d.mts +1 -1
- package/dist/integrations/ai-sdk.mjs +1 -1
- package/dist/integrations/langchain.d.mts +1 -1
- package/dist/integrations/langchain.mjs +1 -1
- package/dist/integrations/llamaindex.d.mts +1 -1
- package/dist/integrations/llamaindex.mjs +1 -1
- package/dist/integrations/mcp.d.mts +2 -2
- package/dist/integrations/mcp.mjs +4 -4
- package/dist/{mcp-D161vL_C.mjs → mcp-tavZtFY1.mjs} +3 -3
- package/dist/{mcp-D161vL_C.mjs.map → mcp-tavZtFY1.mjs.map} +1 -1
- package/dist/{one-liner-C-pRqDK2.mjs → one-liner-Ba58M_6j.mjs} +2 -2
- package/dist/{one-liner-C-pRqDK2.mjs.map → one-liner-Ba58M_6j.mjs.map} +1 -1
- package/dist/{repl-D9x3TnQc.mjs → repl-BGly-o_e.mjs} +3 -3
- package/dist/skills/index.d.mts +3 -3
- package/dist/skills/index.d.mts.map +1 -1
- package/dist/skills/index.mjs +3 -3
- package/dist/{skills-D14RwyUN.mjs → skills-BKxP2pex.mjs} +2 -2
- package/dist/{skills-D14RwyUN.mjs.map → skills-BKxP2pex.mjs.map} +1 -1
- package/dist/{types-evP8RShr.d.mts → types-6uG8lC7u.d.mts} +65 -2
- package/dist/types-6uG8lC7u.d.mts.map +1 -0
- package/docs/architecture/overview.md +2 -0
- package/docs/observability.md +230 -0
- package/package.json +5 -4
- package/dist/gerbil-DJygY0sJ.d.mts.map +0 -1
- package/dist/gerbil-DzZ-L6n8.mjs.map +0 -1
- package/dist/types-evP8RShr.d.mts.map +0 -1
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { d as GerbilConfig } from "../types-6uG8lC7u.mjs";
|
|
2
2
|
import { Request, Response, Router } from "express";
|
|
3
3
|
|
|
4
4
|
//#region src/frameworks/express.d.ts
|
|
5
5
|
|
|
6
6
|
interface GerbilExpressOptions extends Omit<GerbilConfig, "cache"> {
|
|
7
|
-
/** Rate limit (requests per minute) */
|
|
8
|
-
rateLimit?: number;
|
|
9
7
|
/** Enable caching */
|
|
10
8
|
cache?: boolean;
|
|
11
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.mts","names":[],"sources":["../../src/frameworks/express.ts"],"sourcesContent":[],"mappings":";;;;;UAsBiB,oBAAA,SAA6B,KAAK
|
|
1
|
+
{"version":3,"file":"express.d.mts","names":[],"sources":["../../src/frameworks/express.ts"],"sourcesContent":[],"mappings":";;;;;UAsBiB,oBAAA,SAA6B,KAAK;;;;;;;iBAQnC,MAAA,WAAgB,6BAgBE;;;;iBAqGlB,OAAA,WAAiB,6BAKZ,cAAc,aAAQ"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as __require } from "../chunk-CkXuGtQK.mjs";
|
|
2
|
-
import { t as Gerbil } from "../gerbil-
|
|
2
|
+
import { t as Gerbil } from "../gerbil-jO9anIh_.mjs";
|
|
3
3
|
import "../chrome-backend-CORwaIyC.mjs";
|
|
4
4
|
import "../utils-CZBZ8dgR.mjs";
|
|
5
5
|
|
|
@@ -8,7 +8,7 @@ import "../utils-CZBZ8dgR.mjs";
|
|
|
8
8
|
* Create Gerbil Express middleware
|
|
9
9
|
*/
|
|
10
10
|
function gerbil(options = {}) {
|
|
11
|
-
const { cache: _cache,
|
|
11
|
+
const { cache: _cache, ...gerbilOptions } = options;
|
|
12
12
|
const g = new Gerbil(gerbilOptions);
|
|
13
13
|
let loadPromise = null;
|
|
14
14
|
async function ensureLoaded() {
|
|
@@ -98,7 +98,7 @@ function gerbil(options = {}) {
|
|
|
98
98
|
* Simple handler for single endpoint
|
|
99
99
|
*/
|
|
100
100
|
function handler(options = {}) {
|
|
101
|
-
const { cache: _cache,
|
|
101
|
+
const { cache: _cache, ...gerbilOptions } = options;
|
|
102
102
|
const g = new Gerbil(gerbilOptions);
|
|
103
103
|
let loadPromise = null;
|
|
104
104
|
return async (req, res) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.mjs","names":["loadPromise: Promise<void> | null"],"sources":["../../src/frameworks/express.ts"],"sourcesContent":["/**\n * Gerbil Express Middleware\n *\n * @example\n * ```ts\n * import express from \"express\";\n * import { gerbil } from \"gerbil/express\";\n *\n * const app = express();\n * app.use(\"/ai\", gerbil());\n *\n * // POST /ai/generate\n * // POST /ai/stream\n * // POST /ai/json\n * // POST /ai/embed\n * ```\n */\n\nimport type { Request, Response, Router } from \"express\";\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GerbilConfig } from \"../core/types.js\";\n\nexport interface GerbilExpressOptions extends Omit<GerbilConfig, \"cache\"> {\n /**
|
|
1
|
+
{"version":3,"file":"express.mjs","names":["loadPromise: Promise<void> | null"],"sources":["../../src/frameworks/express.ts"],"sourcesContent":["/**\n * Gerbil Express Middleware\n *\n * @example\n * ```ts\n * import express from \"express\";\n * import { gerbil } from \"gerbil/express\";\n *\n * const app = express();\n * app.use(\"/ai\", gerbil());\n *\n * // POST /ai/generate\n * // POST /ai/stream\n * // POST /ai/json\n * // POST /ai/embed\n * ```\n */\n\nimport type { Request, Response, Router } from \"express\";\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GerbilConfig } from \"../core/types.js\";\n\nexport interface GerbilExpressOptions extends Omit<GerbilConfig, \"cache\"> {\n /** Enable caching */\n cache?: boolean;\n}\n\n/**\n * Create Gerbil Express middleware\n */\nexport function gerbil(options: GerbilExpressOptions = {}) {\n const { cache: _cache, ...gerbilOptions } = options;\n const g = new Gerbil(gerbilOptions);\n let loadPromise: Promise<void> | null = null;\n\n async function ensureLoaded() {\n if (!(g.isLoaded() || loadPromise)) {\n loadPromise = g.loadModel(options.model || \"qwen3-0.6b\");\n }\n if (loadPromise) {\n await loadPromise;\n loadPromise = null;\n }\n }\n\n // Return a router factory\n return function createRouter(): Router {\n // Dynamic import to avoid requiring express as a hard dependency\n const express = require(\"express\");\n const router = express.Router();\n\n router.use(express.json());\n\n // POST /generate\n router.post(\"/generate\", async (req: Request, res: Response) => {\n try {\n await ensureLoaded();\n const { prompt, ...opts } = req.body;\n const result = await g.generate(prompt, opts);\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // POST /stream\n router.post(\"/stream\", async (req: Request, res: Response) => {\n try {\n await ensureLoaded();\n const { prompt, ...opts } = req.body;\n\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n\n for await (const chunk of g.stream(prompt, opts)) {\n res.write(`data: ${JSON.stringify({ chunk })}\\n\\n`);\n }\n\n res.write(\"data: [DONE]\\n\\n\");\n res.end();\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // POST /json\n router.post(\"/json\", async (req: Request, res: Response) => {\n try {\n await ensureLoaded();\n const { prompt, schema, ...opts } = req.body;\n\n // Convert JSON schema to Zod (simplified)\n const { z } = await import(\"zod\");\n const zodSchema = z.any(); // Would need proper conversion\n\n const result = await g.json(prompt, { schema: zodSchema, ...opts });\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // POST /embed\n router.post(\"/embed\", async (req: Request, res: Response) => {\n try {\n await ensureLoaded();\n const { text, texts, ...opts } = req.body;\n\n if (texts) {\n const results = await g.embedBatch(texts, opts);\n res.json(results);\n } else {\n const result = await g.embed(text, opts);\n res.json(result);\n }\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // GET /info\n router.get(\"/info\", async (_req: Request, res: Response) => {\n try {\n await ensureLoaded();\n res.json(g.getInfo());\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n // GET /stats\n router.get(\"/stats\", async (_req: Request, res: Response) => {\n try {\n res.json(g.getStats());\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n });\n\n return router;\n };\n}\n\n/**\n * Simple handler for single endpoint\n */\nexport function handler(options: GerbilExpressOptions = {}) {\n const { cache: _cache, ...gerbilOptions } = options;\n const g = new Gerbil(gerbilOptions);\n let loadPromise: Promise<void> | null = null;\n\n return async (req: Request, res: Response) => {\n if (!(g.isLoaded() || loadPromise)) {\n loadPromise = g.loadModel(options.model || \"qwen3-0.6b\");\n }\n if (loadPromise) {\n await loadPromise;\n loadPromise = null;\n }\n\n try {\n const { prompt, ...opts } = req.body;\n const result = await g.generate(prompt, opts);\n res.json(result);\n } catch (error) {\n res.status(500).json({ error: String(error) });\n }\n };\n}\n\nexport default gerbil;\n"],"mappings":"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"}
|
package/dist/frameworks/hono.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as Gerbil } from "../gerbil-
|
|
1
|
+
import { d as GerbilConfig } from "../types-6uG8lC7u.mjs";
|
|
2
|
+
import { t as Gerbil } from "../gerbil-CbnV_cG5.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/frameworks/next.d.ts
|
|
5
5
|
|
package/dist/frameworks/next.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.d.mts","names":[],"sources":["../../src/frameworks/react.ts"],"sourcesContent":[],"mappings":";;;;AA+N2B,UA1MV,gBAAA,SAAyB,YA0Mf,CAAA;EAAc;EAEhC,QAAA,CAAA,EAAA,MAAA;EAAK;EAIE,WAAO,CAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"react.d.mts","names":[],"sources":["../../src/frameworks/react.ts"],"sourcesContent":[],"mappings":";;;;AA+N2B,UA1MV,gBAAA,SAAyB,YA0Mf,CAAA;EAAc;EAEhC,QAAA,CAAA,EAAA,MAAA;EAAK;EAIE,WAAO,CAAA,EAAA,OAAU;;KAxMrB,eAAA;;uCAE2B,oBAAoB,QAAQ;;qCAG9B,oBAAoB;;;;SAMhD;;;;UAMC;;;;;;;iBASM,SAAA,WAAmB,mBAAwB;;;;KAuJ/C,OAAA;;;;UAKK,cAAA,SAAuB;;oBAEpB;;;;KAMR,aAAA;YACA;;;qBAGS,KAAA,CAAM,cAAc;;SAEhC;;;iBAIO,OAAA,WAAiB,iBAAsB"}
|
package/dist/frameworks/trpc.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as SpeakResult, C as PreloadOptions, D as SessionStats, E as SearchResult, I as TranscribeOptions, L as TranscribeResult, M as StreamingTranscriptionSession, N as SystemInfo, O as SimilarityResult, T as STTModelConfig, _ as LoadSTTOptions, a as EmbedResult, d as GerbilConfig, g as LoadOptions, h as JsonOptions, i as EmbedOptions, j as StreamingTranscriptionOptions, k as SpeakOptions, l as GenerateOptions, t as AudioChunk, u as GenerateResult, v as LoadTTSOptions, y as ModelConfig, z as VoiceInfo } from "./types-6uG8lC7u.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/core/gerbil.d.ts
|
|
4
4
|
|
|
@@ -17,7 +17,10 @@ declare class Gerbil {
|
|
|
17
17
|
private processor;
|
|
18
18
|
private visionModel;
|
|
19
19
|
private isVisionModel;
|
|
20
|
+
private readonly queue;
|
|
21
|
+
private readonly telemetry;
|
|
20
22
|
constructor(config?: GerbilConfig);
|
|
23
|
+
private reportError;
|
|
21
24
|
static listModels(): ModelConfig[];
|
|
22
25
|
static getModel(modelId: string): ModelConfig | undefined;
|
|
23
26
|
/**
|
|
@@ -197,6 +200,10 @@ declare class Gerbil {
|
|
|
197
200
|
* ```
|
|
198
201
|
*/
|
|
199
202
|
generate(prompt: string, options?: GenerateOptions): Promise<GenerateResult>;
|
|
203
|
+
/**
|
|
204
|
+
* Internal generate implementation (called within queue)
|
|
205
|
+
*/
|
|
206
|
+
private generateInternal;
|
|
200
207
|
/**
|
|
201
208
|
* Stream text generation (simulated token-by-token)
|
|
202
209
|
*
|
|
@@ -546,4 +553,4 @@ declare class Gerbil {
|
|
|
546
553
|
}
|
|
547
554
|
//#endregion
|
|
548
555
|
export { Gerbil as t };
|
|
549
|
-
//# sourceMappingURL=gerbil-
|
|
556
|
+
//# sourceMappingURL=gerbil-CbnV_cG5.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gerbil-CbnV_cG5.d.mts","names":[],"sources":["../src/core/gerbil.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { existsSync } from "node:fs";
|
|
|
4
4
|
import os from "node:os";
|
|
5
5
|
import path from "node:path";
|
|
6
6
|
import { AutoModelForCausalLM, AutoModelForImageTextToText, AutoProcessor, AutoTokenizer, RawImage, TextStreamer, env, pipeline } from "@huggingface/transformers";
|
|
7
|
+
import PQueue from "p-queue";
|
|
7
8
|
|
|
8
9
|
//#region src/core/cache.ts
|
|
9
10
|
/**
|
|
@@ -475,6 +476,8 @@ var Gerbil = class {
|
|
|
475
476
|
processor = null;
|
|
476
477
|
visionModel = null;
|
|
477
478
|
isVisionModel = false;
|
|
479
|
+
queue;
|
|
480
|
+
telemetry;
|
|
478
481
|
constructor(config = {}) {
|
|
479
482
|
this.config = config;
|
|
480
483
|
this.stats = {
|
|
@@ -486,6 +489,17 @@ var Gerbil = class {
|
|
|
486
489
|
cacheHits: 0,
|
|
487
490
|
cacheMisses: 0
|
|
488
491
|
};
|
|
492
|
+
const concurrency = config.concurrency || {};
|
|
493
|
+
this.queue = new PQueue({
|
|
494
|
+
concurrency: concurrency.maxConcurrent ?? 1,
|
|
495
|
+
timeout: concurrency.timeout ?? 3e5
|
|
496
|
+
});
|
|
497
|
+
this.telemetry = config.telemetry || {};
|
|
498
|
+
}
|
|
499
|
+
reportError(error, context) {
|
|
500
|
+
try {
|
|
501
|
+
this.telemetry.onError?.(error, context);
|
|
502
|
+
} catch {}
|
|
489
503
|
}
|
|
490
504
|
static listModels() {
|
|
491
505
|
return Object.values(BUILTIN_MODELS);
|
|
@@ -512,6 +526,7 @@ var Gerbil = class {
|
|
|
512
526
|
* ```
|
|
513
527
|
*/
|
|
514
528
|
async loadModel(modelId = "qwen3-0.6b", options = {}) {
|
|
529
|
+
const loadStartTime = performance.now();
|
|
515
530
|
if (this.isLoaded()) await this.dispose();
|
|
516
531
|
await initNodeWebGPU();
|
|
517
532
|
const source = resolveModel(modelId);
|
|
@@ -592,6 +607,15 @@ var Gerbil = class {
|
|
|
592
607
|
this.modelConfig = config;
|
|
593
608
|
onProgress?.({ status: `Ready (${tfDevice.toUpperCase()})!` });
|
|
594
609
|
}
|
|
610
|
+
if (this.telemetry.onModelLoad) try {
|
|
611
|
+
this.telemetry.onModelLoad({
|
|
612
|
+
modelId,
|
|
613
|
+
loadTimeMs: performance.now() - loadStartTime,
|
|
614
|
+
fromCache: false,
|
|
615
|
+
device: this._deviceMode,
|
|
616
|
+
success: true
|
|
617
|
+
});
|
|
618
|
+
} catch {}
|
|
595
619
|
} catch (err) {
|
|
596
620
|
if (tfDevice !== fallbackDevice) {
|
|
597
621
|
onProgress?.({ status: `Using ${fallbackDevice.toUpperCase()}...` });
|
|
@@ -611,7 +635,32 @@ var Gerbil = class {
|
|
|
611
635
|
this.currentModel = modelId;
|
|
612
636
|
this.modelConfig = config;
|
|
613
637
|
onProgress?.({ status: `Ready (${fallbackDevice.toUpperCase()})!` });
|
|
614
|
-
|
|
638
|
+
if (this.telemetry.onModelLoad) try {
|
|
639
|
+
this.telemetry.onModelLoad({
|
|
640
|
+
modelId,
|
|
641
|
+
loadTimeMs: performance.now() - loadStartTime,
|
|
642
|
+
fromCache: false,
|
|
643
|
+
device: this._deviceMode,
|
|
644
|
+
success: true
|
|
645
|
+
});
|
|
646
|
+
} catch {}
|
|
647
|
+
} else {
|
|
648
|
+
this.reportError(err instanceof Error ? err : new Error(String(err)), {
|
|
649
|
+
operation: "load",
|
|
650
|
+
modelId
|
|
651
|
+
});
|
|
652
|
+
if (this.telemetry.onModelLoad) try {
|
|
653
|
+
this.telemetry.onModelLoad({
|
|
654
|
+
modelId,
|
|
655
|
+
loadTimeMs: performance.now() - loadStartTime,
|
|
656
|
+
fromCache: false,
|
|
657
|
+
device: this._deviceMode,
|
|
658
|
+
success: false,
|
|
659
|
+
error: err instanceof Error ? err.message : String(err)
|
|
660
|
+
});
|
|
661
|
+
} catch {}
|
|
662
|
+
throw err;
|
|
663
|
+
}
|
|
615
664
|
}
|
|
616
665
|
}
|
|
617
666
|
/**
|
|
@@ -992,6 +1041,40 @@ var Gerbil = class {
|
|
|
992
1041
|
* ```
|
|
993
1042
|
*/
|
|
994
1043
|
async generate(prompt, options = {}) {
|
|
1044
|
+
const queueStartTime = performance.now();
|
|
1045
|
+
try {
|
|
1046
|
+
return await this.queue.add(async () => {
|
|
1047
|
+
const queueWaitTime = performance.now() - queueStartTime;
|
|
1048
|
+
if (queueWaitTime > 100 && this.telemetry.onQueueWait) try {
|
|
1049
|
+
this.telemetry.onQueueWait(queueWaitTime);
|
|
1050
|
+
} catch {}
|
|
1051
|
+
const generatedResult = await this.generateInternal(prompt, options);
|
|
1052
|
+
if (this.telemetry.onGenerate) try {
|
|
1053
|
+
this.telemetry.onGenerate({
|
|
1054
|
+
modelId: this.currentModel || "unknown",
|
|
1055
|
+
result: generatedResult,
|
|
1056
|
+
cached: generatedResult.cached ?? false,
|
|
1057
|
+
queueTimeMs: queueWaitTime > 100 ? queueWaitTime : void 0
|
|
1058
|
+
});
|
|
1059
|
+
} catch {}
|
|
1060
|
+
return generatedResult;
|
|
1061
|
+
});
|
|
1062
|
+
} catch (error) {
|
|
1063
|
+
if (this.telemetry.onError) try {
|
|
1064
|
+
this.telemetry.onError(error instanceof Error ? error : new Error(String(error)), {
|
|
1065
|
+
method: "generate",
|
|
1066
|
+
modelId: this.currentModel || "unknown",
|
|
1067
|
+
prompt: prompt.slice(0, 100),
|
|
1068
|
+
queueWaitTime: performance.now() - queueStartTime
|
|
1069
|
+
});
|
|
1070
|
+
} catch {}
|
|
1071
|
+
throw error;
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
/**
|
|
1075
|
+
* Internal generate implementation (called within queue)
|
|
1076
|
+
*/
|
|
1077
|
+
async generateInternal(prompt, options = {}) {
|
|
995
1078
|
if (!this.isLoaded()) await this.loadModel(this.config.model || "qwen3-0.6b");
|
|
996
1079
|
const { images } = options;
|
|
997
1080
|
if (images?.length && this.isVisionModel && !this.chromeBackend) return this.generateWithVision(prompt, options);
|
|
@@ -1111,7 +1194,11 @@ var Gerbil = class {
|
|
|
1111
1194
|
getGlobalCache().set(cacheKey, result, cacheTtl);
|
|
1112
1195
|
}
|
|
1113
1196
|
return result;
|
|
1114
|
-
} catch (
|
|
1197
|
+
} catch (error) {
|
|
1198
|
+
this.reportError(error instanceof Error ? error : new Error(String(error)), {
|
|
1199
|
+
operation: "generate",
|
|
1200
|
+
modelId: this.currentModel || void 0
|
|
1201
|
+
});
|
|
1115
1202
|
return {
|
|
1116
1203
|
text: "",
|
|
1117
1204
|
tokensGenerated: 0,
|
|
@@ -1926,4 +2013,4 @@ The JSON must conform to this schema: ${JSON.stringify(zodToJsonSchema(schema))}
|
|
|
1926
2013
|
|
|
1927
2014
|
//#endregion
|
|
1928
2015
|
export { ResponseCache as a, getGlobalCache as c, resolveModel as i, BUILTIN_MODELS as n, clearGlobalCache as o, listBuiltinModels as r, configureGlobalCache as s, Gerbil as t };
|
|
1929
|
-
//# sourceMappingURL=gerbil-
|
|
2016
|
+
//# sourceMappingURL=gerbil-jO9anIh_.mjs.map
|