@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.
Files changed (55) hide show
  1. package/dist/browser/index.d.ts +146 -2
  2. package/dist/browser/index.d.ts.map +1 -1
  3. package/dist/browser/index.js +507 -22
  4. package/dist/browser/index.js.map +1 -1
  5. package/dist/cli.mjs +7 -7
  6. package/dist/cli.mjs.map +1 -1
  7. package/dist/frameworks/express.d.mts +1 -3
  8. package/dist/frameworks/express.d.mts.map +1 -1
  9. package/dist/frameworks/express.mjs +3 -3
  10. package/dist/frameworks/express.mjs.map +1 -1
  11. package/dist/frameworks/fastify.d.mts +1 -1
  12. package/dist/frameworks/fastify.mjs +1 -1
  13. package/dist/frameworks/hono.d.mts +1 -1
  14. package/dist/frameworks/hono.mjs +1 -1
  15. package/dist/frameworks/next.d.mts +2 -2
  16. package/dist/frameworks/next.mjs +1 -1
  17. package/dist/frameworks/react.d.mts +1 -1
  18. package/dist/frameworks/react.d.mts.map +1 -1
  19. package/dist/frameworks/trpc.d.mts +1 -1
  20. package/dist/frameworks/trpc.mjs +1 -1
  21. package/dist/{gerbil-DJygY0sJ.d.mts → gerbil-CbnV_cG5.d.mts} +9 -2
  22. package/dist/gerbil-CbnV_cG5.d.mts.map +1 -0
  23. package/dist/{gerbil-PzPtcdeM.mjs → gerbil-DODVGr-u.mjs} +1 -1
  24. package/dist/{gerbil-DzZ-L6n8.mjs → gerbil-jO9anIh_.mjs} +90 -3
  25. package/dist/gerbil-jO9anIh_.mjs.map +1 -0
  26. package/dist/index.d.mts +3 -3
  27. package/dist/index.d.mts.map +1 -1
  28. package/dist/index.mjs +2 -2
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/integrations/ai-sdk.d.mts +1 -1
  31. package/dist/integrations/ai-sdk.mjs +1 -1
  32. package/dist/integrations/langchain.d.mts +1 -1
  33. package/dist/integrations/langchain.mjs +1 -1
  34. package/dist/integrations/llamaindex.d.mts +1 -1
  35. package/dist/integrations/llamaindex.mjs +1 -1
  36. package/dist/integrations/mcp.d.mts +2 -2
  37. package/dist/integrations/mcp.mjs +4 -4
  38. package/dist/{mcp-D161vL_C.mjs → mcp-tavZtFY1.mjs} +3 -3
  39. package/dist/{mcp-D161vL_C.mjs.map → mcp-tavZtFY1.mjs.map} +1 -1
  40. package/dist/{one-liner-C-pRqDK2.mjs → one-liner-Ba58M_6j.mjs} +2 -2
  41. package/dist/{one-liner-C-pRqDK2.mjs.map → one-liner-Ba58M_6j.mjs.map} +1 -1
  42. package/dist/{repl-D9x3TnQc.mjs → repl-BGly-o_e.mjs} +3 -3
  43. package/dist/skills/index.d.mts +3 -3
  44. package/dist/skills/index.d.mts.map +1 -1
  45. package/dist/skills/index.mjs +3 -3
  46. package/dist/{skills-D14RwyUN.mjs → skills-BKxP2pex.mjs} +2 -2
  47. package/dist/{skills-D14RwyUN.mjs.map → skills-BKxP2pex.mjs.map} +1 -1
  48. package/dist/{types-evP8RShr.d.mts → types-6uG8lC7u.d.mts} +65 -2
  49. package/dist/types-6uG8lC7u.d.mts.map +1 -0
  50. package/docs/architecture/overview.md +2 -0
  51. package/docs/observability.md +230 -0
  52. package/package.json +5 -4
  53. package/dist/gerbil-DJygY0sJ.d.mts.map +0 -1
  54. package/dist/gerbil-DzZ-L6n8.mjs.map +0 -1
  55. package/dist/types-evP8RShr.d.mts.map +0 -1
@@ -1,11 +1,9 @@
1
- import { c as GerbilConfig } from "../types-evP8RShr.mjs";
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;;;;;;;;;iBAWnC,MAAA,WAAgB,6BAgBE;;;;iBAqGlB,OAAA,WAAiB,6BAKZ,cAAc,aAAQ"}
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-DzZ-L6n8.mjs";
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, rateLimit: _rateLimit, ...gerbilOptions } = options;
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, rateLimit: _rateLimit, ...gerbilOptions } = options;
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 /** Rate limit (requests per minute) */\n rateLimit?: number;\n\n /** Enable caching */\n cache?: boolean;\n}\n\n/**\n * Create Gerbil Express middleware\n */\nexport function gerbil(options: GerbilExpressOptions = {}) {\n const { cache: _cache, rateLimit: _rateLimit, ...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, rateLimit: _rateLimit, ...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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"}
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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"}
@@ -1,4 +1,4 @@
1
- import { c as GerbilConfig } from "../types-evP8RShr.mjs";
1
+ import { d as GerbilConfig } from "../types-6uG8lC7u.mjs";
2
2
 
3
3
  //#region src/frameworks/fastify.d.ts
4
4
 
@@ -1,4 +1,4 @@
1
- import { t as Gerbil } from "../gerbil-DzZ-L6n8.mjs";
1
+ import { t as Gerbil } from "../gerbil-jO9anIh_.mjs";
2
2
  import "../chrome-backend-CORwaIyC.mjs";
3
3
  import "../utils-CZBZ8dgR.mjs";
4
4
 
@@ -1,4 +1,4 @@
1
- import { c as GerbilConfig } from "../types-evP8RShr.mjs";
1
+ import { d as GerbilConfig } from "../types-6uG8lC7u.mjs";
2
2
  import * as hono0 from "hono";
3
3
  import * as hono_types0 from "hono/types";
4
4
 
@@ -1,4 +1,4 @@
1
- import { t as Gerbil } from "../gerbil-DzZ-L6n8.mjs";
1
+ import { t as Gerbil } from "../gerbil-jO9anIh_.mjs";
2
2
  import "../chrome-backend-CORwaIyC.mjs";
3
3
  import "../utils-CZBZ8dgR.mjs";
4
4
 
@@ -1,5 +1,5 @@
1
- import { c as GerbilConfig } from "../types-evP8RShr.mjs";
2
- import { t as Gerbil } from "../gerbil-DJygY0sJ.mjs";
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
 
@@ -1,4 +1,4 @@
1
- import { t as Gerbil } from "../gerbil-DzZ-L6n8.mjs";
1
+ import { t as Gerbil } from "../gerbil-jO9anIh_.mjs";
2
2
  import "../chrome-backend-CORwaIyC.mjs";
3
3
  import "../utils-CZBZ8dgR.mjs";
4
4
 
@@ -1,4 +1,4 @@
1
- import { c as GerbilConfig, o as GenerateOptions, s as GenerateResult } from "../types-evP8RShr.mjs";
1
+ import { d as GerbilConfig, l as GenerateOptions, u as GenerateResult } from "../types-6uG8lC7u.mjs";
2
2
 
3
3
  //#region src/frameworks/react.d.ts
4
4
 
@@ -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,OAAA;;KAxMX,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"}
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"}
@@ -1,4 +1,4 @@
1
- import { c as GerbilConfig } from "../types-evP8RShr.mjs";
1
+ import { d as GerbilConfig } from "../types-6uG8lC7u.mjs";
2
2
 
3
3
  //#region src/frameworks/trpc.d.ts
4
4
 
@@ -1,4 +1,4 @@
1
- import { t as Gerbil } from "../gerbil-DzZ-L6n8.mjs";
1
+ import { t as Gerbil } from "../gerbil-jO9anIh_.mjs";
2
2
  import "../chrome-backend-CORwaIyC.mjs";
3
3
  import "../utils-CZBZ8dgR.mjs";
4
4
  import { z } from "zod";
@@ -1,4 +1,4 @@
1
- import { C as SessionStats, D as StreamingTranscriptionOptions, E as SpeakResult, M as TranscribeResult, O as StreamingTranscriptionSession, P as VoiceInfo, S as SearchResult, T as SpeakOptions, c as GerbilConfig, f as JsonOptions, g as ModelConfig, h as LoadTTSOptions, i as EmbedResult, j as TranscribeOptions, k as SystemInfo, m as LoadSTTOptions, o as GenerateOptions, p as LoadOptions, r as EmbedOptions, s as GenerateResult, t as AudioChunk, w as SimilarityResult, x as STTModelConfig, y as PreloadOptions } from "./types-evP8RShr.mjs";
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-DJygY0sJ.d.mts.map
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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"}
@@ -1,4 +1,4 @@
1
- import { t as Gerbil } from "./gerbil-DzZ-L6n8.mjs";
1
+ import { t as Gerbil } from "./gerbil-jO9anIh_.mjs";
2
2
  import "./chrome-backend-CORwaIyC.mjs";
3
3
  import "./utils-CZBZ8dgR.mjs";
4
4
 
@@ -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
- } else throw err;
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 (_error) {
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-DzZ-L6n8.mjs.map
2016
+ //# sourceMappingURL=gerbil-jO9anIh_.mjs.map