@tryhamster/gerbil 1.0.0-rc.11 → 1.0.0-rc.13

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 (64) hide show
  1. package/README.md +52 -1
  2. package/dist/browser/index.d.ts +159 -1
  3. package/dist/browser/index.d.ts.map +1 -1
  4. package/dist/browser/index.js +473 -6
  5. package/dist/browser/index.js.map +1 -1
  6. package/dist/cli.mjs +7 -7
  7. package/dist/cli.mjs.map +1 -1
  8. package/dist/frameworks/express.d.mts +1 -1
  9. package/dist/frameworks/express.mjs +2 -1
  10. package/dist/frameworks/express.mjs.map +1 -1
  11. package/dist/frameworks/fastify.d.mts +1 -1
  12. package/dist/frameworks/fastify.mjs +2 -1
  13. package/dist/frameworks/fastify.mjs.map +1 -1
  14. package/dist/frameworks/hono.d.mts +1 -1
  15. package/dist/frameworks/hono.mjs +2 -1
  16. package/dist/frameworks/hono.mjs.map +1 -1
  17. package/dist/frameworks/next.d.mts +2 -2
  18. package/dist/frameworks/next.mjs +2 -1
  19. package/dist/frameworks/next.mjs.map +1 -1
  20. package/dist/frameworks/react.d.mts +1 -1
  21. package/dist/frameworks/trpc.d.mts +1 -1
  22. package/dist/frameworks/trpc.mjs +2 -1
  23. package/dist/frameworks/trpc.mjs.map +1 -1
  24. package/dist/{gerbil-DoDGHe6Z.mjs → gerbil-BZklpDhM.mjs} +289 -1
  25. package/dist/gerbil-BZklpDhM.mjs.map +1 -0
  26. package/dist/gerbil-CAMb_nrK.mjs +5 -0
  27. package/dist/{gerbil-qOTe1nl2.d.mts → gerbil-DJygY0sJ.d.mts} +120 -2
  28. package/dist/gerbil-DJygY0sJ.d.mts.map +1 -0
  29. package/dist/index.d.mts +3 -3
  30. package/dist/index.d.mts.map +1 -1
  31. package/dist/index.mjs +2 -2
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/integrations/ai-sdk.d.mts +72 -3
  34. package/dist/integrations/ai-sdk.d.mts.map +1 -1
  35. package/dist/integrations/ai-sdk.mjs +106 -3
  36. package/dist/integrations/ai-sdk.mjs.map +1 -1
  37. package/dist/integrations/langchain.d.mts +1 -1
  38. package/dist/integrations/langchain.mjs +2 -1
  39. package/dist/integrations/langchain.mjs.map +1 -1
  40. package/dist/integrations/llamaindex.d.mts +1 -1
  41. package/dist/integrations/llamaindex.mjs +2 -1
  42. package/dist/integrations/llamaindex.mjs.map +1 -1
  43. package/dist/integrations/mcp.d.mts +2 -2
  44. package/dist/integrations/mcp.mjs +5 -4
  45. package/dist/{mcp-kzDDWIoS.mjs → mcp-ZCC5OR7B.mjs} +3 -3
  46. package/dist/{mcp-kzDDWIoS.mjs.map → mcp-ZCC5OR7B.mjs.map} +1 -1
  47. package/dist/{one-liner-DxnNs_JK.mjs → one-liner-mH5SKPvT.mjs} +2 -2
  48. package/dist/{one-liner-DxnNs_JK.mjs.map → one-liner-mH5SKPvT.mjs.map} +1 -1
  49. package/dist/{repl-DGUw4fCc.mjs → repl-CSM1IBP1.mjs} +3 -3
  50. package/dist/skills/index.d.mts +3 -3
  51. package/dist/skills/index.d.mts.map +1 -1
  52. package/dist/skills/index.mjs +4 -3
  53. package/dist/{skills-DulrOPeP.mjs → skills-CPB_9YfF.mjs} +2 -2
  54. package/dist/{skills-DulrOPeP.mjs.map → skills-CPB_9YfF.mjs.map} +1 -1
  55. package/dist/{types-CiTc7ez3.d.mts → types-evP8RShr.d.mts} +26 -2
  56. package/dist/types-evP8RShr.d.mts.map +1 -0
  57. package/docs/ai-sdk.md +56 -1
  58. package/docs/browser.md +103 -0
  59. package/docs/embeddings.md +311 -0
  60. package/package.json +1 -1
  61. package/dist/gerbil-DJGqq7BX.mjs +0 -4
  62. package/dist/gerbil-DoDGHe6Z.mjs.map +0 -1
  63. package/dist/gerbil-qOTe1nl2.d.mts.map +0 -1
  64. package/dist/types-CiTc7ez3.d.mts.map +0 -1
@@ -1,4 +1,4 @@
1
- import { c as GerbilConfig } from "../types-CiTc7ez3.mjs";
1
+ import { c as GerbilConfig } from "../types-evP8RShr.mjs";
2
2
  import { Request, Response, Router } from "express";
3
3
 
4
4
  //#region src/frameworks/express.d.ts
@@ -1,5 +1,6 @@
1
1
  import { t as __require } from "../chunk-CkXuGtQK.mjs";
2
- import { t as Gerbil } from "../gerbil-DoDGHe6Z.mjs";
2
+ import { t as Gerbil } from "../gerbil-BZklpDhM.mjs";
3
+ import "../chrome-backend-CORwaIyC.mjs";
3
4
  import "../utils-CZBZ8dgR.mjs";
4
5
 
5
6
  //#region src/frameworks/express.ts
@@ -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 /** 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,4 +1,4 @@
1
- import { c as GerbilConfig } from "../types-CiTc7ez3.mjs";
1
+ import { c as GerbilConfig } from "../types-evP8RShr.mjs";
2
2
 
3
3
  //#region src/frameworks/fastify.d.ts
4
4
 
@@ -1,4 +1,5 @@
1
- import { t as Gerbil } from "../gerbil-DoDGHe6Z.mjs";
1
+ import { t as Gerbil } from "../gerbil-BZklpDhM.mjs";
2
+ import "../chrome-backend-CORwaIyC.mjs";
2
3
  import "../utils-CZBZ8dgR.mjs";
3
4
 
4
5
  //#region src/frameworks/fastify.ts
@@ -1 +1 @@
1
- {"version":3,"file":"fastify.mjs","names":["loadPromise: Promise<void> | null"],"sources":["../../src/frameworks/fastify.ts"],"sourcesContent":["/**\n * Gerbil Fastify Plugin\n *\n * @example\n * ```ts\n * import Fastify from \"fastify\";\n * import { gerbilPlugin } from \"gerbil/fastify\";\n *\n * const app = Fastify();\n * app.register(gerbilPlugin, { prefix: \"/ai\" });\n * ```\n */\n\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GerbilConfig } from \"../core/types.js\";\n\nexport interface GerbilFastifyOptions extends GerbilConfig {\n prefix?: string;\n}\n\nexport async function gerbilPlugin(fastify: any, options: GerbilFastifyOptions = {}) {\n const { prefix = \"/ai\", ...gerbilConfig } = options;\n const g = new Gerbil(gerbilConfig);\n let loadPromise: Promise<void> | null = null;\n\n async function ensureLoaded() {\n if (!(g.isLoaded() || loadPromise)) {\n loadPromise = g.loadModel(gerbilConfig.model || \"qwen3-0.6b\");\n }\n if (loadPromise) {\n await loadPromise;\n loadPromise = null;\n }\n }\n\n // Decorate fastify with gerbil instance\n fastify.decorate(\"gerbil\", g);\n\n // POST /generate\n fastify.post(`${prefix}/generate`, async (request: any, _reply: any) => {\n await ensureLoaded();\n const { prompt, ...opts } = request.body;\n const result = await g.generate(prompt, opts);\n return result;\n });\n\n // POST /stream\n fastify.post(`${prefix}/stream`, async (request: any, reply: any) => {\n await ensureLoaded();\n const { prompt, ...opts } = request.body;\n\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n for await (const chunk of g.stream(prompt, opts)) {\n reply.raw.write(`data: ${JSON.stringify({ chunk })}\\n\\n`);\n }\n\n reply.raw.write(\"data: [DONE]\\n\\n\");\n reply.raw.end();\n });\n\n // POST /json\n fastify.post(`${prefix}/json`, async (request: any, _reply: any) => {\n await ensureLoaded();\n const { prompt, schema, ...opts } = request.body;\n const { z } = await import(\"zod\");\n const zodSchema = z.any();\n const result = await g.json(prompt, { schema: zodSchema, ...opts });\n return result;\n });\n\n // POST /embed\n fastify.post(`${prefix}/embed`, async (request: any, _reply: any) => {\n await ensureLoaded();\n const { text, texts, ...opts } = request.body;\n if (texts) {\n return g.embedBatch(texts, opts);\n }\n return g.embed(text, opts);\n });\n\n // GET /info\n fastify.get(`${prefix}/info`, async (_request: any, _reply: any) => {\n await ensureLoaded();\n return g.getInfo();\n });\n\n // GET /stats\n fastify.get(`${prefix}/stats`, async (_request: any, _reply: any) => g.getStats());\n}\n\nexport default gerbilPlugin;\n"],"mappings":";;;;;;;;;;;;;;;;AAoBA,eAAsB,aAAa,SAAc,UAAgC,EAAE,EAAE;CACnF,MAAM,EAAE,SAAS,OAAO,GAAG,iBAAiB;CAC5C,MAAM,IAAI,IAAI,OAAO,aAAa;CAClC,IAAIA,cAAoC;CAExC,eAAe,eAAe;AAC5B,MAAI,EAAE,EAAE,UAAU,IAAI,aACpB,eAAc,EAAE,UAAU,aAAa,SAAS,aAAa;AAE/D,MAAI,aAAa;AACf,SAAM;AACN,iBAAc;;;AAKlB,SAAQ,SAAS,UAAU,EAAE;AAG7B,SAAQ,KAAK,GAAG,OAAO,YAAY,OAAO,SAAc,WAAgB;AACtE,QAAM,cAAc;EACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,QAAQ;AAEpC,SADe,MAAM,EAAE,SAAS,QAAQ,KAAK;GAE7C;AAGF,SAAQ,KAAK,GAAG,OAAO,UAAU,OAAO,SAAc,UAAe;AACnE,QAAM,cAAc;EACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,QAAQ;AAEpC,QAAM,IAAI,UAAU,KAAK;GACvB,gBAAgB;GAChB,iBAAiB;GACjB,YAAY;GACb,CAAC;AAEF,aAAW,MAAM,SAAS,EAAE,OAAO,QAAQ,KAAK,CAC9C,OAAM,IAAI,MAAM,SAAS,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC,MAAM;AAG3D,QAAM,IAAI,MAAM,mBAAmB;AACnC,QAAM,IAAI,KAAK;GACf;AAGF,SAAQ,KAAK,GAAG,OAAO,QAAQ,OAAO,SAAc,WAAgB;AAClE,QAAM,cAAc;EACpB,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS,QAAQ;EAC5C,MAAM,EAAE,MAAM,MAAM,OAAO;EAC3B,MAAM,YAAY,EAAE,KAAK;AAEzB,SADe,MAAM,EAAE,KAAK,QAAQ;GAAE,QAAQ;GAAW,GAAG;GAAM,CAAC;GAEnE;AAGF,SAAQ,KAAK,GAAG,OAAO,SAAS,OAAO,SAAc,WAAgB;AACnE,QAAM,cAAc;EACpB,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS,QAAQ;AACzC,MAAI,MACF,QAAO,EAAE,WAAW,OAAO,KAAK;AAElC,SAAO,EAAE,MAAM,MAAM,KAAK;GAC1B;AAGF,SAAQ,IAAI,GAAG,OAAO,QAAQ,OAAO,UAAe,WAAgB;AAClE,QAAM,cAAc;AACpB,SAAO,EAAE,SAAS;GAClB;AAGF,SAAQ,IAAI,GAAG,OAAO,SAAS,OAAO,UAAe,WAAgB,EAAE,UAAU,CAAC;;AAGpF,sBAAe"}
1
+ {"version":3,"file":"fastify.mjs","names":["loadPromise: Promise<void> | null"],"sources":["../../src/frameworks/fastify.ts"],"sourcesContent":["/**\n * Gerbil Fastify Plugin\n *\n * @example\n * ```ts\n * import Fastify from \"fastify\";\n * import { gerbilPlugin } from \"gerbil/fastify\";\n *\n * const app = Fastify();\n * app.register(gerbilPlugin, { prefix: \"/ai\" });\n * ```\n */\n\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GerbilConfig } from \"../core/types.js\";\n\nexport interface GerbilFastifyOptions extends GerbilConfig {\n prefix?: string;\n}\n\nexport async function gerbilPlugin(fastify: any, options: GerbilFastifyOptions = {}) {\n const { prefix = \"/ai\", ...gerbilConfig } = options;\n const g = new Gerbil(gerbilConfig);\n let loadPromise: Promise<void> | null = null;\n\n async function ensureLoaded() {\n if (!(g.isLoaded() || loadPromise)) {\n loadPromise = g.loadModel(gerbilConfig.model || \"qwen3-0.6b\");\n }\n if (loadPromise) {\n await loadPromise;\n loadPromise = null;\n }\n }\n\n // Decorate fastify with gerbil instance\n fastify.decorate(\"gerbil\", g);\n\n // POST /generate\n fastify.post(`${prefix}/generate`, async (request: any, _reply: any) => {\n await ensureLoaded();\n const { prompt, ...opts } = request.body;\n const result = await g.generate(prompt, opts);\n return result;\n });\n\n // POST /stream\n fastify.post(`${prefix}/stream`, async (request: any, reply: any) => {\n await ensureLoaded();\n const { prompt, ...opts } = request.body;\n\n reply.raw.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n for await (const chunk of g.stream(prompt, opts)) {\n reply.raw.write(`data: ${JSON.stringify({ chunk })}\\n\\n`);\n }\n\n reply.raw.write(\"data: [DONE]\\n\\n\");\n reply.raw.end();\n });\n\n // POST /json\n fastify.post(`${prefix}/json`, async (request: any, _reply: any) => {\n await ensureLoaded();\n const { prompt, schema, ...opts } = request.body;\n const { z } = await import(\"zod\");\n const zodSchema = z.any();\n const result = await g.json(prompt, { schema: zodSchema, ...opts });\n return result;\n });\n\n // POST /embed\n fastify.post(`${prefix}/embed`, async (request: any, _reply: any) => {\n await ensureLoaded();\n const { text, texts, ...opts } = request.body;\n if (texts) {\n return g.embedBatch(texts, opts);\n }\n return g.embed(text, opts);\n });\n\n // GET /info\n fastify.get(`${prefix}/info`, async (_request: any, _reply: any) => {\n await ensureLoaded();\n return g.getInfo();\n });\n\n // GET /stats\n fastify.get(`${prefix}/stats`, async (_request: any, _reply: any) => g.getStats());\n}\n\nexport default gerbilPlugin;\n"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,eAAsB,aAAa,SAAc,UAAgC,EAAE,EAAE;CACnF,MAAM,EAAE,SAAS,OAAO,GAAG,iBAAiB;CAC5C,MAAM,IAAI,IAAI,OAAO,aAAa;CAClC,IAAIA,cAAoC;CAExC,eAAe,eAAe;AAC5B,MAAI,EAAE,EAAE,UAAU,IAAI,aACpB,eAAc,EAAE,UAAU,aAAa,SAAS,aAAa;AAE/D,MAAI,aAAa;AACf,SAAM;AACN,iBAAc;;;AAKlB,SAAQ,SAAS,UAAU,EAAE;AAG7B,SAAQ,KAAK,GAAG,OAAO,YAAY,OAAO,SAAc,WAAgB;AACtE,QAAM,cAAc;EACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,QAAQ;AAEpC,SADe,MAAM,EAAE,SAAS,QAAQ,KAAK;GAE7C;AAGF,SAAQ,KAAK,GAAG,OAAO,UAAU,OAAO,SAAc,UAAe;AACnE,QAAM,cAAc;EACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,QAAQ;AAEpC,QAAM,IAAI,UAAU,KAAK;GACvB,gBAAgB;GAChB,iBAAiB;GACjB,YAAY;GACb,CAAC;AAEF,aAAW,MAAM,SAAS,EAAE,OAAO,QAAQ,KAAK,CAC9C,OAAM,IAAI,MAAM,SAAS,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC,MAAM;AAG3D,QAAM,IAAI,MAAM,mBAAmB;AACnC,QAAM,IAAI,KAAK;GACf;AAGF,SAAQ,KAAK,GAAG,OAAO,QAAQ,OAAO,SAAc,WAAgB;AAClE,QAAM,cAAc;EACpB,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS,QAAQ;EAC5C,MAAM,EAAE,MAAM,MAAM,OAAO;EAC3B,MAAM,YAAY,EAAE,KAAK;AAEzB,SADe,MAAM,EAAE,KAAK,QAAQ;GAAE,QAAQ;GAAW,GAAG;GAAM,CAAC;GAEnE;AAGF,SAAQ,KAAK,GAAG,OAAO,SAAS,OAAO,SAAc,WAAgB;AACnE,QAAM,cAAc;EACpB,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS,QAAQ;AACzC,MAAI,MACF,QAAO,EAAE,WAAW,OAAO,KAAK;AAElC,SAAO,EAAE,MAAM,MAAM,KAAK;GAC1B;AAGF,SAAQ,IAAI,GAAG,OAAO,QAAQ,OAAO,UAAe,WAAgB;AAClE,QAAM,cAAc;AACpB,SAAO,EAAE,SAAS;GAClB;AAGF,SAAQ,IAAI,GAAG,OAAO,SAAS,OAAO,UAAe,WAAgB,EAAE,UAAU,CAAC;;AAGpF,sBAAe"}
@@ -1,4 +1,4 @@
1
- import { c as GerbilConfig } from "../types-CiTc7ez3.mjs";
1
+ import { c as GerbilConfig } from "../types-evP8RShr.mjs";
2
2
  import * as hono0 from "hono";
3
3
  import * as hono_types0 from "hono/types";
4
4
 
@@ -1,4 +1,5 @@
1
- import { t as Gerbil } from "../gerbil-DoDGHe6Z.mjs";
1
+ import { t as Gerbil } from "../gerbil-BZklpDhM.mjs";
2
+ import "../chrome-backend-CORwaIyC.mjs";
2
3
  import "../utils-CZBZ8dgR.mjs";
3
4
 
4
5
  //#region src/frameworks/hono.ts
@@ -1 +1 @@
1
- {"version":3,"file":"hono.mjs","names":["loadPromise: Promise<void> | null"],"sources":["../../src/frameworks/hono.ts"],"sourcesContent":["/**\n * Gerbil Hono Middleware\n *\n * @example\n * ```ts\n * import { Hono } from \"hono\";\n * import { gerbil } from \"gerbil/hono\";\n *\n * const app = new Hono();\n * app.route(\"/ai\", gerbil({ model: \"qwen3-0.6b\" }));\n * ```\n */\n\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GerbilConfig } from \"../core/types.js\";\n\nexport interface GerbilHonoOptions extends GerbilConfig {}\n\n/**\n * Create Gerbil Hono routes\n */\nexport function gerbil(options: GerbilHonoOptions = {}) {\n const g = new Gerbil(options);\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 // Dynamic import Hono\n return async function createApp() {\n const { Hono } = await import(\"hono\");\n const { streamSSE } = await import(\"hono/streaming\");\n\n const app = new Hono();\n\n // POST /generate\n app.post(\"/generate\", async (c) => {\n await ensureLoaded();\n const { prompt, ...opts } = await c.req.json();\n const result = await g.generate(prompt, opts);\n return c.json(result);\n });\n\n // POST /stream\n app.post(\"/stream\", async (c) => {\n await ensureLoaded();\n const { prompt, ...opts } = await c.req.json();\n\n return streamSSE(c, async (stream) => {\n for await (const chunk of g.stream(prompt, opts)) {\n await stream.writeSSE({ data: JSON.stringify({ chunk }) });\n }\n await stream.writeSSE({ data: \"[DONE]\" });\n });\n });\n\n // POST /json\n app.post(\"/json\", async (c) => {\n await ensureLoaded();\n const { prompt, schema, ...opts } = await c.req.json();\n const { z } = await import(\"zod\");\n const zodSchema = z.any();\n const result = await g.json(prompt, { schema: zodSchema, ...opts });\n return c.json(result);\n });\n\n // POST /embed\n app.post(\"/embed\", async (c) => {\n await ensureLoaded();\n const { text, texts, ...opts } = await c.req.json();\n if (texts) {\n const results = await g.embedBatch(texts, opts);\n return c.json(results);\n }\n const result = await g.embed(text, opts);\n return c.json(result);\n });\n\n // GET /info\n app.get(\"/info\", async (c) => {\n await ensureLoaded();\n return c.json(g.getInfo());\n });\n\n // GET /stats\n app.get(\"/stats\", (c) => c.json(g.getStats()));\n\n return app;\n };\n}\n\nexport default gerbil;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,OAAO,UAA6B,EAAE,EAAE;CACtD,MAAM,IAAI,IAAI,OAAO,QAAQ;CAC7B,IAAIA,cAAoC;CAExC,eAAe,eAAe;AAC5B,MAAI,EAAE,EAAE,UAAU,IAAI,aACpB,eAAc,EAAE,UAAU,QAAQ,SAAS,aAAa;AAE1D,MAAI,aAAa;AACf,SAAM;AACN,iBAAc;;;AAKlB,QAAO,eAAe,YAAY;EAChC,MAAM,EAAE,SAAS,MAAM,OAAO;EAC9B,MAAM,EAAE,cAAc,MAAM,OAAO;EAEnC,MAAM,MAAM,IAAI,MAAM;AAGtB,MAAI,KAAK,aAAa,OAAO,MAAM;AACjC,SAAM,cAAc;GACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE,IAAI,MAAM;GAC9C,MAAM,SAAS,MAAM,EAAE,SAAS,QAAQ,KAAK;AAC7C,UAAO,EAAE,KAAK,OAAO;IACrB;AAGF,MAAI,KAAK,WAAW,OAAO,MAAM;AAC/B,SAAM,cAAc;GACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE,IAAI,MAAM;AAE9C,UAAO,UAAU,GAAG,OAAO,WAAW;AACpC,eAAW,MAAM,SAAS,EAAE,OAAO,QAAQ,KAAK,CAC9C,OAAM,OAAO,SAAS,EAAE,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;AAE5D,UAAM,OAAO,SAAS,EAAE,MAAM,UAAU,CAAC;KACzC;IACF;AAGF,MAAI,KAAK,SAAS,OAAO,MAAM;AAC7B,SAAM,cAAc;GACpB,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS,MAAM,EAAE,IAAI,MAAM;GACtD,MAAM,EAAE,MAAM,MAAM,OAAO;GAC3B,MAAM,YAAY,EAAE,KAAK;GACzB,MAAM,SAAS,MAAM,EAAE,KAAK,QAAQ;IAAE,QAAQ;IAAW,GAAG;IAAM,CAAC;AACnE,UAAO,EAAE,KAAK,OAAO;IACrB;AAGF,MAAI,KAAK,UAAU,OAAO,MAAM;AAC9B,SAAM,cAAc;GACpB,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS,MAAM,EAAE,IAAI,MAAM;AACnD,OAAI,OAAO;IACT,MAAM,UAAU,MAAM,EAAE,WAAW,OAAO,KAAK;AAC/C,WAAO,EAAE,KAAK,QAAQ;;GAExB,MAAM,SAAS,MAAM,EAAE,MAAM,MAAM,KAAK;AACxC,UAAO,EAAE,KAAK,OAAO;IACrB;AAGF,MAAI,IAAI,SAAS,OAAO,MAAM;AAC5B,SAAM,cAAc;AACpB,UAAO,EAAE,KAAK,EAAE,SAAS,CAAC;IAC1B;AAGF,MAAI,IAAI,WAAW,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAE9C,SAAO;;;AAIX,mBAAe"}
1
+ {"version":3,"file":"hono.mjs","names":["loadPromise: Promise<void> | null"],"sources":["../../src/frameworks/hono.ts"],"sourcesContent":["/**\n * Gerbil Hono Middleware\n *\n * @example\n * ```ts\n * import { Hono } from \"hono\";\n * import { gerbil } from \"gerbil/hono\";\n *\n * const app = new Hono();\n * app.route(\"/ai\", gerbil({ model: \"qwen3-0.6b\" }));\n * ```\n */\n\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GerbilConfig } from \"../core/types.js\";\n\nexport interface GerbilHonoOptions extends GerbilConfig {}\n\n/**\n * Create Gerbil Hono routes\n */\nexport function gerbil(options: GerbilHonoOptions = {}) {\n const g = new Gerbil(options);\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 // Dynamic import Hono\n return async function createApp() {\n const { Hono } = await import(\"hono\");\n const { streamSSE } = await import(\"hono/streaming\");\n\n const app = new Hono();\n\n // POST /generate\n app.post(\"/generate\", async (c) => {\n await ensureLoaded();\n const { prompt, ...opts } = await c.req.json();\n const result = await g.generate(prompt, opts);\n return c.json(result);\n });\n\n // POST /stream\n app.post(\"/stream\", async (c) => {\n await ensureLoaded();\n const { prompt, ...opts } = await c.req.json();\n\n return streamSSE(c, async (stream) => {\n for await (const chunk of g.stream(prompt, opts)) {\n await stream.writeSSE({ data: JSON.stringify({ chunk }) });\n }\n await stream.writeSSE({ data: \"[DONE]\" });\n });\n });\n\n // POST /json\n app.post(\"/json\", async (c) => {\n await ensureLoaded();\n const { prompt, schema, ...opts } = await c.req.json();\n const { z } = await import(\"zod\");\n const zodSchema = z.any();\n const result = await g.json(prompt, { schema: zodSchema, ...opts });\n return c.json(result);\n });\n\n // POST /embed\n app.post(\"/embed\", async (c) => {\n await ensureLoaded();\n const { text, texts, ...opts } = await c.req.json();\n if (texts) {\n const results = await g.embedBatch(texts, opts);\n return c.json(results);\n }\n const result = await g.embed(text, opts);\n return c.json(result);\n });\n\n // GET /info\n app.get(\"/info\", async (c) => {\n await ensureLoaded();\n return c.json(g.getInfo());\n });\n\n // GET /stats\n app.get(\"/stats\", (c) => c.json(g.getStats()));\n\n return app;\n };\n}\n\nexport default gerbil;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,OAAO,UAA6B,EAAE,EAAE;CACtD,MAAM,IAAI,IAAI,OAAO,QAAQ;CAC7B,IAAIA,cAAoC;CAExC,eAAe,eAAe;AAC5B,MAAI,EAAE,EAAE,UAAU,IAAI,aACpB,eAAc,EAAE,UAAU,QAAQ,SAAS,aAAa;AAE1D,MAAI,aAAa;AACf,SAAM;AACN,iBAAc;;;AAKlB,QAAO,eAAe,YAAY;EAChC,MAAM,EAAE,SAAS,MAAM,OAAO;EAC9B,MAAM,EAAE,cAAc,MAAM,OAAO;EAEnC,MAAM,MAAM,IAAI,MAAM;AAGtB,MAAI,KAAK,aAAa,OAAO,MAAM;AACjC,SAAM,cAAc;GACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE,IAAI,MAAM;GAC9C,MAAM,SAAS,MAAM,EAAE,SAAS,QAAQ,KAAK;AAC7C,UAAO,EAAE,KAAK,OAAO;IACrB;AAGF,MAAI,KAAK,WAAW,OAAO,MAAM;AAC/B,SAAM,cAAc;GACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,MAAM,EAAE,IAAI,MAAM;AAE9C,UAAO,UAAU,GAAG,OAAO,WAAW;AACpC,eAAW,MAAM,SAAS,EAAE,OAAO,QAAQ,KAAK,CAC9C,OAAM,OAAO,SAAS,EAAE,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;AAE5D,UAAM,OAAO,SAAS,EAAE,MAAM,UAAU,CAAC;KACzC;IACF;AAGF,MAAI,KAAK,SAAS,OAAO,MAAM;AAC7B,SAAM,cAAc;GACpB,MAAM,EAAE,QAAQ,QAAQ,GAAG,SAAS,MAAM,EAAE,IAAI,MAAM;GACtD,MAAM,EAAE,MAAM,MAAM,OAAO;GAC3B,MAAM,YAAY,EAAE,KAAK;GACzB,MAAM,SAAS,MAAM,EAAE,KAAK,QAAQ;IAAE,QAAQ;IAAW,GAAG;IAAM,CAAC;AACnE,UAAO,EAAE,KAAK,OAAO;IACrB;AAGF,MAAI,KAAK,UAAU,OAAO,MAAM;AAC9B,SAAM,cAAc;GACpB,MAAM,EAAE,MAAM,OAAO,GAAG,SAAS,MAAM,EAAE,IAAI,MAAM;AACnD,OAAI,OAAO;IACT,MAAM,UAAU,MAAM,EAAE,WAAW,OAAO,KAAK;AAC/C,WAAO,EAAE,KAAK,QAAQ;;GAExB,MAAM,SAAS,MAAM,EAAE,MAAM,MAAM,KAAK;AACxC,UAAO,EAAE,KAAK,OAAO;IACrB;AAGF,MAAI,IAAI,SAAS,OAAO,MAAM;AAC5B,SAAM,cAAc;AACpB,UAAO,EAAE,KAAK,EAAE,SAAS,CAAC;IAC1B;AAGF,MAAI,IAAI,WAAW,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;AAE9C,SAAO;;;AAIX,mBAAe"}
@@ -1,5 +1,5 @@
1
- import { c as GerbilConfig } from "../types-CiTc7ez3.mjs";
2
- import { t as Gerbil } from "../gerbil-qOTe1nl2.mjs";
1
+ import { c as GerbilConfig } from "../types-evP8RShr.mjs";
2
+ import { t as Gerbil } from "../gerbil-DJygY0sJ.mjs";
3
3
 
4
4
  //#region src/frameworks/next.d.ts
5
5
 
@@ -1,4 +1,5 @@
1
- import { t as Gerbil } from "../gerbil-DoDGHe6Z.mjs";
1
+ import { t as Gerbil } from "../gerbil-BZklpDhM.mjs";
2
+ import "../chrome-backend-CORwaIyC.mjs";
2
3
  import "../utils-CZBZ8dgR.mjs";
3
4
 
4
5
  //#region src/frameworks/next.ts
@@ -1 +1 @@
1
- {"version":3,"file":"next.mjs","names":["instance: Gerbil | null","loadPromise: Promise<void> | null"],"sources":["../../src/frameworks/next.ts"],"sourcesContent":["/**\n * Gerbil Next.js Integration\n *\n * @example\n * ```ts\n * // app/api/chat/route.ts\n * import { gerbil } from \"gerbil/next\";\n *\n * export const POST = gerbil.handler({\n * model: \"qwen3-0.6b\",\n * });\n * ```\n */\n\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GerbilConfig } from \"../core/types.js\";\n\nexport interface GerbilNextOptions extends GerbilConfig {\n /** Preload model on startup */\n preload?: boolean;\n}\n\n// Singleton instance for Next.js (persists across requests in dev)\nlet instance: Gerbil | null = null;\nlet loadPromise: Promise<void> | null = null;\n\nasync function getInstance(options: GerbilNextOptions): Promise<Gerbil> {\n if (!instance) {\n instance = new Gerbil(options);\n }\n\n if (!(instance.isLoaded() || loadPromise)) {\n loadPromise = instance.loadModel(options.model || \"qwen3-0.6b\");\n }\n\n if (loadPromise) {\n await loadPromise;\n loadPromise = null;\n }\n\n return instance;\n}\n\n/**\n * Create a Next.js API route handler\n */\nexport function handler(options: GerbilNextOptions = {}) {\n return async function POST(req: Request): Promise<Response> {\n try {\n const g = await getInstance(options);\n const body = await req.json();\n const { prompt, stream: isStreaming, ...opts } = body;\n\n if (isStreaming) {\n // Streaming response\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of g.stream(prompt, opts)) {\n controller.enqueue(encoder.encode(`data: ${JSON.stringify({ chunk })}\\n\\n`));\n }\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return new Response(readable, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n }\n // Non-streaming response\n const result = await g.generate(prompt, opts);\n return Response.json(result);\n } catch (error) {\n return Response.json({ error: String(error) }, { status: 500 });\n }\n };\n}\n\n/**\n * Create handlers for all endpoints\n */\nexport function createHandlers(options: GerbilNextOptions = {}) {\n return {\n generate: handler(options),\n\n async json(req: Request): Promise<Response> {\n try {\n const g = await getInstance(options);\n const body = await req.json();\n const { prompt, schema, ...opts } = body;\n\n const { z } = await import(\"zod\");\n const zodSchema = z.any();\n\n const result = await g.json(prompt, { schema: zodSchema, ...opts });\n return Response.json(result);\n } catch (error) {\n return Response.json({ error: String(error) }, { status: 500 });\n }\n },\n\n async embed(req: Request): Promise<Response> {\n try {\n const g = await getInstance(options);\n const body = await req.json();\n const { text, texts, ...opts } = body;\n\n if (texts) {\n const results = await g.embedBatch(texts, opts);\n return Response.json(results);\n }\n const result = await g.embed(text, opts);\n return Response.json(result);\n } catch (error) {\n return Response.json({ error: String(error) }, { status: 500 });\n }\n },\n\n async info(_req: Request): Promise<Response> {\n try {\n const g = await getInstance(options);\n return Response.json(g.getInfo());\n } catch (error) {\n return Response.json({ error: String(error) }, { status: 500 });\n }\n },\n };\n}\n\nexport const gerbil = {\n handler,\n createHandlers,\n getInstance,\n};\n\nexport default gerbil;\n"],"mappings":";;;;;;;;;;;;;;;;;AAuBA,IAAIA,WAA0B;AAC9B,IAAIC,cAAoC;AAExC,eAAe,YAAY,SAA6C;AACtE,KAAI,CAAC,SACH,YAAW,IAAI,OAAO,QAAQ;AAGhC,KAAI,EAAE,SAAS,UAAU,IAAI,aAC3B,eAAc,SAAS,UAAU,QAAQ,SAAS,aAAa;AAGjE,KAAI,aAAa;AACf,QAAM;AACN,gBAAc;;AAGhB,QAAO;;;;;AAMT,SAAgB,QAAQ,UAA6B,EAAE,EAAE;AACvD,QAAO,eAAe,KAAK,KAAiC;AAC1D,MAAI;GACF,MAAM,IAAI,MAAM,YAAY,QAAQ;GAEpC,MAAM,EAAE,QAAQ,QAAQ,aAAa,GAAG,SAD3B,MAAM,IAAI,MAAM;AAG7B,OAAI,aAAa;IAEf,MAAM,UAAU,IAAI,aAAa;IACjC,MAAM,WAAW,IAAI,eAAe,EAClC,MAAM,MAAM,YAAY;AACtB,SAAI;AACF,iBAAW,MAAM,SAAS,EAAE,OAAO,QAAQ,KAAK,CAC9C,YAAW,QAAQ,QAAQ,OAAO,SAAS,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;AAE9E,iBAAW,QAAQ,QAAQ,OAAO,mBAAmB,CAAC;AACtD,iBAAW,OAAO;cACX,OAAO;AACd,iBAAW,MAAM,MAAM;;OAG5B,CAAC;AAEF,WAAO,IAAI,SAAS,UAAU,EAC5B,SAAS;KACP,gBAAgB;KAChB,iBAAiB;KACjB,YAAY;KACb,EACF,CAAC;;GAGJ,MAAM,SAAS,MAAM,EAAE,SAAS,QAAQ,KAAK;AAC7C,UAAO,SAAS,KAAK,OAAO;WACrB,OAAO;AACd,UAAO,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,EAAE,QAAQ,KAAK,CAAC;;;;;;;AAQrE,SAAgB,eAAe,UAA6B,EAAE,EAAE;AAC9D,QAAO;EACL,UAAU,QAAQ,QAAQ;EAE1B,MAAM,KAAK,KAAiC;AAC1C,OAAI;IACF,MAAM,IAAI,MAAM,YAAY,QAAQ;IAEpC,MAAM,EAAE,QAAQ,QAAQ,GAAG,SADd,MAAM,IAAI,MAAM;IAG7B,MAAM,EAAE,MAAM,MAAM,OAAO;IAC3B,MAAM,YAAY,EAAE,KAAK;IAEzB,MAAM,SAAS,MAAM,EAAE,KAAK,QAAQ;KAAE,QAAQ;KAAW,GAAG;KAAM,CAAC;AACnE,WAAO,SAAS,KAAK,OAAO;YACrB,OAAO;AACd,WAAO,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,EAAE,QAAQ,KAAK,CAAC;;;EAInE,MAAM,MAAM,KAAiC;AAC3C,OAAI;IACF,MAAM,IAAI,MAAM,YAAY,QAAQ;IAEpC,MAAM,EAAE,MAAM,OAAO,GAAG,SADX,MAAM,IAAI,MAAM;AAG7B,QAAI,OAAO;KACT,MAAM,UAAU,MAAM,EAAE,WAAW,OAAO,KAAK;AAC/C,YAAO,SAAS,KAAK,QAAQ;;IAE/B,MAAM,SAAS,MAAM,EAAE,MAAM,MAAM,KAAK;AACxC,WAAO,SAAS,KAAK,OAAO;YACrB,OAAO;AACd,WAAO,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,EAAE,QAAQ,KAAK,CAAC;;;EAInE,MAAM,KAAK,MAAkC;AAC3C,OAAI;IACF,MAAM,IAAI,MAAM,YAAY,QAAQ;AACpC,WAAO,SAAS,KAAK,EAAE,SAAS,CAAC;YAC1B,OAAO;AACd,WAAO,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,EAAE,QAAQ,KAAK,CAAC;;;EAGpE;;AAGH,MAAa,SAAS;CACpB;CACA;CACA;CACD;AAED,mBAAe"}
1
+ {"version":3,"file":"next.mjs","names":["instance: Gerbil | null","loadPromise: Promise<void> | null"],"sources":["../../src/frameworks/next.ts"],"sourcesContent":["/**\n * Gerbil Next.js Integration\n *\n * @example\n * ```ts\n * // app/api/chat/route.ts\n * import { gerbil } from \"gerbil/next\";\n *\n * export const POST = gerbil.handler({\n * model: \"qwen3-0.6b\",\n * });\n * ```\n */\n\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GerbilConfig } from \"../core/types.js\";\n\nexport interface GerbilNextOptions extends GerbilConfig {\n /** Preload model on startup */\n preload?: boolean;\n}\n\n// Singleton instance for Next.js (persists across requests in dev)\nlet instance: Gerbil | null = null;\nlet loadPromise: Promise<void> | null = null;\n\nasync function getInstance(options: GerbilNextOptions): Promise<Gerbil> {\n if (!instance) {\n instance = new Gerbil(options);\n }\n\n if (!(instance.isLoaded() || loadPromise)) {\n loadPromise = instance.loadModel(options.model || \"qwen3-0.6b\");\n }\n\n if (loadPromise) {\n await loadPromise;\n loadPromise = null;\n }\n\n return instance;\n}\n\n/**\n * Create a Next.js API route handler\n */\nexport function handler(options: GerbilNextOptions = {}) {\n return async function POST(req: Request): Promise<Response> {\n try {\n const g = await getInstance(options);\n const body = await req.json();\n const { prompt, stream: isStreaming, ...opts } = body;\n\n if (isStreaming) {\n // Streaming response\n const encoder = new TextEncoder();\n const readable = new ReadableStream({\n async start(controller) {\n try {\n for await (const chunk of g.stream(prompt, opts)) {\n controller.enqueue(encoder.encode(`data: ${JSON.stringify({ chunk })}\\n\\n`));\n }\n controller.enqueue(encoder.encode(\"data: [DONE]\\n\\n\"));\n controller.close();\n } catch (error) {\n controller.error(error);\n }\n },\n });\n\n return new Response(readable, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n }\n // Non-streaming response\n const result = await g.generate(prompt, opts);\n return Response.json(result);\n } catch (error) {\n return Response.json({ error: String(error) }, { status: 500 });\n }\n };\n}\n\n/**\n * Create handlers for all endpoints\n */\nexport function createHandlers(options: GerbilNextOptions = {}) {\n return {\n generate: handler(options),\n\n async json(req: Request): Promise<Response> {\n try {\n const g = await getInstance(options);\n const body = await req.json();\n const { prompt, schema, ...opts } = body;\n\n const { z } = await import(\"zod\");\n const zodSchema = z.any();\n\n const result = await g.json(prompt, { schema: zodSchema, ...opts });\n return Response.json(result);\n } catch (error) {\n return Response.json({ error: String(error) }, { status: 500 });\n }\n },\n\n async embed(req: Request): Promise<Response> {\n try {\n const g = await getInstance(options);\n const body = await req.json();\n const { text, texts, ...opts } = body;\n\n if (texts) {\n const results = await g.embedBatch(texts, opts);\n return Response.json(results);\n }\n const result = await g.embed(text, opts);\n return Response.json(result);\n } catch (error) {\n return Response.json({ error: String(error) }, { status: 500 });\n }\n },\n\n async info(_req: Request): Promise<Response> {\n try {\n const g = await getInstance(options);\n return Response.json(g.getInfo());\n } catch (error) {\n return Response.json({ error: String(error) }, { status: 500 });\n }\n },\n };\n}\n\nexport const gerbil = {\n handler,\n createHandlers,\n getInstance,\n};\n\nexport default gerbil;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAuBA,IAAIA,WAA0B;AAC9B,IAAIC,cAAoC;AAExC,eAAe,YAAY,SAA6C;AACtE,KAAI,CAAC,SACH,YAAW,IAAI,OAAO,QAAQ;AAGhC,KAAI,EAAE,SAAS,UAAU,IAAI,aAC3B,eAAc,SAAS,UAAU,QAAQ,SAAS,aAAa;AAGjE,KAAI,aAAa;AACf,QAAM;AACN,gBAAc;;AAGhB,QAAO;;;;;AAMT,SAAgB,QAAQ,UAA6B,EAAE,EAAE;AACvD,QAAO,eAAe,KAAK,KAAiC;AAC1D,MAAI;GACF,MAAM,IAAI,MAAM,YAAY,QAAQ;GAEpC,MAAM,EAAE,QAAQ,QAAQ,aAAa,GAAG,SAD3B,MAAM,IAAI,MAAM;AAG7B,OAAI,aAAa;IAEf,MAAM,UAAU,IAAI,aAAa;IACjC,MAAM,WAAW,IAAI,eAAe,EAClC,MAAM,MAAM,YAAY;AACtB,SAAI;AACF,iBAAW,MAAM,SAAS,EAAE,OAAO,QAAQ,KAAK,CAC9C,YAAW,QAAQ,QAAQ,OAAO,SAAS,KAAK,UAAU,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;AAE9E,iBAAW,QAAQ,QAAQ,OAAO,mBAAmB,CAAC;AACtD,iBAAW,OAAO;cACX,OAAO;AACd,iBAAW,MAAM,MAAM;;OAG5B,CAAC;AAEF,WAAO,IAAI,SAAS,UAAU,EAC5B,SAAS;KACP,gBAAgB;KAChB,iBAAiB;KACjB,YAAY;KACb,EACF,CAAC;;GAGJ,MAAM,SAAS,MAAM,EAAE,SAAS,QAAQ,KAAK;AAC7C,UAAO,SAAS,KAAK,OAAO;WACrB,OAAO;AACd,UAAO,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,EAAE,QAAQ,KAAK,CAAC;;;;;;;AAQrE,SAAgB,eAAe,UAA6B,EAAE,EAAE;AAC9D,QAAO;EACL,UAAU,QAAQ,QAAQ;EAE1B,MAAM,KAAK,KAAiC;AAC1C,OAAI;IACF,MAAM,IAAI,MAAM,YAAY,QAAQ;IAEpC,MAAM,EAAE,QAAQ,QAAQ,GAAG,SADd,MAAM,IAAI,MAAM;IAG7B,MAAM,EAAE,MAAM,MAAM,OAAO;IAC3B,MAAM,YAAY,EAAE,KAAK;IAEzB,MAAM,SAAS,MAAM,EAAE,KAAK,QAAQ;KAAE,QAAQ;KAAW,GAAG;KAAM,CAAC;AACnE,WAAO,SAAS,KAAK,OAAO;YACrB,OAAO;AACd,WAAO,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,EAAE,QAAQ,KAAK,CAAC;;;EAInE,MAAM,MAAM,KAAiC;AAC3C,OAAI;IACF,MAAM,IAAI,MAAM,YAAY,QAAQ;IAEpC,MAAM,EAAE,MAAM,OAAO,GAAG,SADX,MAAM,IAAI,MAAM;AAG7B,QAAI,OAAO;KACT,MAAM,UAAU,MAAM,EAAE,WAAW,OAAO,KAAK;AAC/C,YAAO,SAAS,KAAK,QAAQ;;IAE/B,MAAM,SAAS,MAAM,EAAE,MAAM,MAAM,KAAK;AACxC,WAAO,SAAS,KAAK,OAAO;YACrB,OAAO;AACd,WAAO,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,EAAE,QAAQ,KAAK,CAAC;;;EAInE,MAAM,KAAK,MAAkC;AAC3C,OAAI;IACF,MAAM,IAAI,MAAM,YAAY,QAAQ;AACpC,WAAO,SAAS,KAAK,EAAE,SAAS,CAAC;YAC1B,OAAO;AACd,WAAO,SAAS,KAAK,EAAE,OAAO,OAAO,MAAM,EAAE,EAAE,EAAE,QAAQ,KAAK,CAAC;;;EAGpE;;AAGH,MAAa,SAAS;CACpB;CACA;CACA;CACD;AAED,mBAAe"}
@@ -1,4 +1,4 @@
1
- import { c as GerbilConfig, o as GenerateOptions, s as GenerateResult } from "../types-CiTc7ez3.mjs";
1
+ import { c as GerbilConfig, o as GenerateOptions, s as GenerateResult } from "../types-evP8RShr.mjs";
2
2
 
3
3
  //#region src/frameworks/react.d.ts
4
4
 
@@ -1,4 +1,4 @@
1
- import { c as GerbilConfig } from "../types-CiTc7ez3.mjs";
1
+ import { c as GerbilConfig } from "../types-evP8RShr.mjs";
2
2
 
3
3
  //#region src/frameworks/trpc.d.ts
4
4
 
@@ -1,4 +1,5 @@
1
- import { t as Gerbil } from "../gerbil-DoDGHe6Z.mjs";
1
+ import { t as Gerbil } from "../gerbil-BZklpDhM.mjs";
2
+ import "../chrome-backend-CORwaIyC.mjs";
2
3
  import "../utils-CZBZ8dgR.mjs";
3
4
  import { z } from "zod";
4
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"trpc.mjs","names":["loadPromise: Promise<void> | null"],"sources":["../../src/frameworks/trpc.ts"],"sourcesContent":["/**\n * Gerbil tRPC Router\n *\n * @example\n * ```ts\n * import { initTRPC } from \"@trpc/server\";\n * import { gerbilRouter } from \"gerbil/trpc\";\n *\n * const t = initTRPC.create();\n *\n * const appRouter = t.router({\n * ai: gerbilRouter(t, { model: \"qwen3-0.6b\" }),\n * });\n * ```\n */\n\nimport { z } from \"zod\";\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GerbilConfig } from \"../core/types.js\";\n\nexport interface GerbilTRPCOptions extends GerbilConfig {}\n\n/**\n * Create a Gerbil tRPC router\n */\nexport function gerbilRouter(t: any, options: GerbilTRPCOptions = {}) {\n const g = new Gerbil(options);\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 t.router({\n generate: t.procedure\n .input(\n z.object({\n prompt: z.string(),\n maxTokens: z.number().optional(),\n temperature: z.number().optional(),\n topP: z.number().optional(),\n topK: z.number().optional(),\n system: z.string().optional(),\n thinking: z.boolean().optional(),\n }),\n )\n .mutation(async ({ input }: { input: any }) => {\n await ensureLoaded();\n const { prompt, ...opts } = input;\n return g.generate(prompt, opts);\n }),\n\n stream: t.procedure\n .input(\n z.object({\n prompt: z.string(),\n maxTokens: z.number().optional(),\n temperature: z.number().optional(),\n system: z.string().optional(),\n thinking: z.boolean().optional(),\n }),\n )\n .subscription(async function* ({ input }: { input: any }) {\n await ensureLoaded();\n const { prompt, ...opts } = input;\n for await (const chunk of g.stream(prompt, opts)) {\n yield chunk;\n }\n }),\n\n embed: t.procedure\n .input(\n z.object({\n text: z.string().optional(),\n texts: z.array(z.string()).optional(),\n }),\n )\n .mutation(async ({ input }: { input: any }) => {\n await ensureLoaded();\n if (input.texts) {\n return g.embedBatch(input.texts);\n }\n return g.embed(input.text);\n }),\n\n info: t.procedure.query(async () => {\n await ensureLoaded();\n return g.getInfo();\n }),\n\n stats: t.procedure.query(() => g.getStats()),\n\n models: t.procedure.query(() => Gerbil.listModels()),\n });\n}\n\nexport default gerbilRouter;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,aAAa,GAAQ,UAA6B,EAAE,EAAE;CACpE,MAAM,IAAI,IAAI,OAAO,QAAQ;CAC7B,IAAIA,cAAoC;CAExC,eAAe,eAAe;AAC5B,MAAI,EAAE,EAAE,UAAU,IAAI,aACpB,eAAc,EAAE,UAAU,QAAQ,SAAS,aAAa;AAE1D,MAAI,aAAa;AACf,SAAM;AACN,iBAAc;;;AAIlB,QAAO,EAAE,OAAO;EACd,UAAU,EAAE,UACT,MACC,EAAE,OAAO;GACP,QAAQ,EAAE,QAAQ;GAClB,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,UAAU,EAAE,SAAS,CAAC,UAAU;GACjC,CAAC,CACH,CACA,SAAS,OAAO,EAAE,YAA4B;AAC7C,SAAM,cAAc;GACpB,MAAM,EAAE,QAAQ,GAAG,SAAS;AAC5B,UAAO,EAAE,SAAS,QAAQ,KAAK;IAC/B;EAEJ,QAAQ,EAAE,UACP,MACC,EAAE,OAAO;GACP,QAAQ,EAAE,QAAQ;GAClB,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,UAAU,EAAE,SAAS,CAAC,UAAU;GACjC,CAAC,CACH,CACA,aAAa,iBAAiB,EAAE,SAAyB;AACxD,SAAM,cAAc;GACpB,MAAM,EAAE,QAAQ,GAAG,SAAS;AAC5B,cAAW,MAAM,SAAS,EAAE,OAAO,QAAQ,KAAK,CAC9C,OAAM;IAER;EAEJ,OAAO,EAAE,UACN,MACC,EAAE,OAAO;GACP,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;GACtC,CAAC,CACH,CACA,SAAS,OAAO,EAAE,YAA4B;AAC7C,SAAM,cAAc;AACpB,OAAI,MAAM,MACR,QAAO,EAAE,WAAW,MAAM,MAAM;AAElC,UAAO,EAAE,MAAM,MAAM,KAAK;IAC1B;EAEJ,MAAM,EAAE,UAAU,MAAM,YAAY;AAClC,SAAM,cAAc;AACpB,UAAO,EAAE,SAAS;IAClB;EAEF,OAAO,EAAE,UAAU,YAAY,EAAE,UAAU,CAAC;EAE5C,QAAQ,EAAE,UAAU,YAAY,OAAO,YAAY,CAAC;EACrD,CAAC;;AAGJ,mBAAe"}
1
+ {"version":3,"file":"trpc.mjs","names":["loadPromise: Promise<void> | null"],"sources":["../../src/frameworks/trpc.ts"],"sourcesContent":["/**\n * Gerbil tRPC Router\n *\n * @example\n * ```ts\n * import { initTRPC } from \"@trpc/server\";\n * import { gerbilRouter } from \"gerbil/trpc\";\n *\n * const t = initTRPC.create();\n *\n * const appRouter = t.router({\n * ai: gerbilRouter(t, { model: \"qwen3-0.6b\" }),\n * });\n * ```\n */\n\nimport { z } from \"zod\";\nimport { Gerbil } from \"../core/gerbil.js\";\nimport type { GerbilConfig } from \"../core/types.js\";\n\nexport interface GerbilTRPCOptions extends GerbilConfig {}\n\n/**\n * Create a Gerbil tRPC router\n */\nexport function gerbilRouter(t: any, options: GerbilTRPCOptions = {}) {\n const g = new Gerbil(options);\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 t.router({\n generate: t.procedure\n .input(\n z.object({\n prompt: z.string(),\n maxTokens: z.number().optional(),\n temperature: z.number().optional(),\n topP: z.number().optional(),\n topK: z.number().optional(),\n system: z.string().optional(),\n thinking: z.boolean().optional(),\n }),\n )\n .mutation(async ({ input }: { input: any }) => {\n await ensureLoaded();\n const { prompt, ...opts } = input;\n return g.generate(prompt, opts);\n }),\n\n stream: t.procedure\n .input(\n z.object({\n prompt: z.string(),\n maxTokens: z.number().optional(),\n temperature: z.number().optional(),\n system: z.string().optional(),\n thinking: z.boolean().optional(),\n }),\n )\n .subscription(async function* ({ input }: { input: any }) {\n await ensureLoaded();\n const { prompt, ...opts } = input;\n for await (const chunk of g.stream(prompt, opts)) {\n yield chunk;\n }\n }),\n\n embed: t.procedure\n .input(\n z.object({\n text: z.string().optional(),\n texts: z.array(z.string()).optional(),\n }),\n )\n .mutation(async ({ input }: { input: any }) => {\n await ensureLoaded();\n if (input.texts) {\n return g.embedBatch(input.texts);\n }\n return g.embed(input.text);\n }),\n\n info: t.procedure.query(async () => {\n await ensureLoaded();\n return g.getInfo();\n }),\n\n stats: t.procedure.query(() => g.getStats()),\n\n models: t.procedure.query(() => Gerbil.listModels()),\n });\n}\n\nexport default gerbilRouter;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBA,SAAgB,aAAa,GAAQ,UAA6B,EAAE,EAAE;CACpE,MAAM,IAAI,IAAI,OAAO,QAAQ;CAC7B,IAAIA,cAAoC;CAExC,eAAe,eAAe;AAC5B,MAAI,EAAE,EAAE,UAAU,IAAI,aACpB,eAAc,EAAE,UAAU,QAAQ,SAAS,aAAa;AAE1D,MAAI,aAAa;AACf,SAAM;AACN,iBAAc;;;AAIlB,QAAO,EAAE,OAAO;EACd,UAAU,EAAE,UACT,MACC,EAAE,OAAO;GACP,QAAQ,EAAE,QAAQ;GAClB,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,UAAU,EAAE,SAAS,CAAC,UAAU;GACjC,CAAC,CACH,CACA,SAAS,OAAO,EAAE,YAA4B;AAC7C,SAAM,cAAc;GACpB,MAAM,EAAE,QAAQ,GAAG,SAAS;AAC5B,UAAO,EAAE,SAAS,QAAQ,KAAK;IAC/B;EAEJ,QAAQ,EAAE,UACP,MACC,EAAE,OAAO;GACP,QAAQ,EAAE,QAAQ;GAClB,WAAW,EAAE,QAAQ,CAAC,UAAU;GAChC,aAAa,EAAE,QAAQ,CAAC,UAAU;GAClC,QAAQ,EAAE,QAAQ,CAAC,UAAU;GAC7B,UAAU,EAAE,SAAS,CAAC,UAAU;GACjC,CAAC,CACH,CACA,aAAa,iBAAiB,EAAE,SAAyB;AACxD,SAAM,cAAc;GACpB,MAAM,EAAE,QAAQ,GAAG,SAAS;AAC5B,cAAW,MAAM,SAAS,EAAE,OAAO,QAAQ,KAAK,CAC9C,OAAM;IAER;EAEJ,OAAO,EAAE,UACN,MACC,EAAE,OAAO;GACP,MAAM,EAAE,QAAQ,CAAC,UAAU;GAC3B,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;GACtC,CAAC,CACH,CACA,SAAS,OAAO,EAAE,YAA4B;AAC7C,SAAM,cAAc;AACpB,OAAI,MAAM,MACR,QAAO,EAAE,WAAW,MAAM,MAAM;AAElC,UAAO,EAAE,MAAM,MAAM,KAAK;IAC1B;EAEJ,MAAM,EAAE,UAAU,MAAM,YAAY;AAClC,SAAM,cAAc;AACpB,UAAO,EAAE,SAAS;IAClB;EAEF,OAAO,EAAE,UAAU,YAAY,EAAE,UAAU,CAAC;EAE5C,QAAQ,EAAE,UAAU,YAAY,OAAO,YAAY,CAAC;EACrD,CAAC;;AAGJ,mBAAe"}
@@ -1,4 +1,8 @@
1
+ import { n as getChromeCachedModels } from "./chrome-backend-CORwaIyC.mjs";
1
2
  import { n as zodToJsonSchema, t as extractJson } from "./utils-CZBZ8dgR.mjs";
3
+ import { existsSync } from "node:fs";
4
+ import os from "node:os";
5
+ import path from "node:path";
2
6
  import { AutoModelForCausalLM, AutoModelForImageTextToText, AutoProcessor, AutoTokenizer, RawImage, TextStreamer, env, pipeline } from "@huggingface/transformers";
3
7
 
4
8
  //#region src/core/cache.ts
@@ -724,6 +728,208 @@ var Gerbil = class {
724
728
  getGlobalCache().clear();
725
729
  }
726
730
  /**
731
+ * Check if a model is cached (downloaded) without loading it
732
+ *
733
+ * @example
734
+ * ```ts
735
+ * if (await g.isModelCached("qwen3-0.6b")) {
736
+ * console.log("Model ready, will load instantly");
737
+ * } else {
738
+ * console.log("Model needs to download (~400MB)");
739
+ * }
740
+ * ```
741
+ */
742
+ async isModelCached(modelId) {
743
+ const source = resolveModel(modelId);
744
+ if (getChromeCachedModels().some((m) => m.modelId === source.path)) return true;
745
+ const cacheDir = env.cacheDir || path.join(os.homedir(), ".cache", "huggingface", "hub");
746
+ const modelDir = path.join(cacheDir, `models--${source.path.replace(/\//g, "--")}`);
747
+ try {
748
+ return existsSync(modelDir);
749
+ } catch {
750
+ return false;
751
+ }
752
+ }
753
+ /**
754
+ * Preload a model (download without initializing for inference)
755
+ *
756
+ * Use this to download models ahead of time, e.g., during app startup,
757
+ * so users don't wait when they first use AI.
758
+ *
759
+ * @example
760
+ * ```ts
761
+ * // Preload for later (download only, free memory)
762
+ * await g.preloadModel("qwen3-0.6b", {
763
+ * onProgress: (p) => console.log(p.status, p.progress),
764
+ * });
765
+ *
766
+ * // Preload and keep in memory for instant use
767
+ * await g.preloadModel("qwen3-0.6b", { keepLoaded: true });
768
+ * await g.generate("Hello"); // Instant, no loading needed
769
+ * ```
770
+ */
771
+ async preloadModel(modelId, options = {}) {
772
+ const source = resolveModel(modelId);
773
+ const { onProgress, keepLoaded = false } = options;
774
+ if (keepLoaded && this.isLoaded() && this.currentModel === modelId) {
775
+ onProgress?.({ status: "Model already loaded" });
776
+ return;
777
+ }
778
+ if (!keepLoaded && await this.isModelCached(modelId)) {
779
+ onProgress?.({ status: "Model already cached" });
780
+ return;
781
+ }
782
+ if (keepLoaded) {
783
+ await this.loadModel(modelId, { onProgress });
784
+ return;
785
+ }
786
+ onProgress?.({ status: `Preloading ${modelId}...` });
787
+ await (await AutoModelForCausalLM.from_pretrained(source.path, {
788
+ dtype: "q4f16",
789
+ device: "cpu",
790
+ progress_callback: (progress) => {
791
+ if (progress.status === "progress" && progress.file) onProgress?.({
792
+ status: `Downloading ${progress.file}`,
793
+ progress: Math.round(progress.progress || 0),
794
+ file: progress.file
795
+ });
796
+ }
797
+ })).dispose();
798
+ onProgress?.({ status: "Preload complete" });
799
+ }
800
+ /**
801
+ * Check if a TTS model is cached
802
+ */
803
+ async isTTSCached(modelId = "kokoro-82m") {
804
+ const repo = this.resolveTTSRepo(modelId);
805
+ const cacheDir = env.cacheDir || path.join(os.homedir(), ".cache", "huggingface", "hub");
806
+ const modelDir = path.join(cacheDir, `models--${repo.replace(/\//g, "--")}`);
807
+ try {
808
+ return existsSync(modelDir);
809
+ } catch {
810
+ return false;
811
+ }
812
+ }
813
+ /**
814
+ * Preload a TTS model
815
+ *
816
+ * @param modelId - TTS model to preload (default: "kokoro-82m")
817
+ * @param options.keepLoaded - Keep model in memory for instant use (default: false)
818
+ */
819
+ async preloadTTS(modelId = "kokoro-82m", options = {}) {
820
+ const { onProgress, keepLoaded = false } = options;
821
+ if (keepLoaded && this.isTTSLoaded()) {
822
+ onProgress?.({ status: "TTS model already loaded" });
823
+ return;
824
+ }
825
+ if (!keepLoaded && await this.isTTSCached(modelId)) {
826
+ onProgress?.({ status: "TTS model already cached" });
827
+ return;
828
+ }
829
+ await this.loadTTS({
830
+ model: modelId,
831
+ onProgress
832
+ });
833
+ if (!keepLoaded && this.tts) {
834
+ await this.tts.dispose();
835
+ this.tts = null;
836
+ }
837
+ }
838
+ /**
839
+ * Check if an STT model is cached
840
+ */
841
+ async isSTTCached(modelId = "whisper-tiny.en") {
842
+ const repo = this.resolveSTTRepo(modelId);
843
+ const cacheDir = env.cacheDir || path.join(os.homedir(), ".cache", "huggingface", "hub");
844
+ const modelDir = path.join(cacheDir, `models--${repo.replace(/\//g, "--")}`);
845
+ try {
846
+ return existsSync(modelDir);
847
+ } catch {
848
+ return false;
849
+ }
850
+ }
851
+ /**
852
+ * Preload an STT model
853
+ *
854
+ * @param modelId - STT model to preload (default: "whisper-tiny.en")
855
+ * @param options.keepLoaded - Keep model in memory for instant use (default: false)
856
+ */
857
+ async preloadSTT(modelId = "whisper-tiny.en", options = {}) {
858
+ const { onProgress, keepLoaded = false } = options;
859
+ if (keepLoaded && this.isSTTLoaded()) {
860
+ onProgress?.({ status: "STT model already loaded" });
861
+ return;
862
+ }
863
+ if (!keepLoaded && await this.isSTTCached(modelId)) {
864
+ onProgress?.({ status: "STT model already cached" });
865
+ return;
866
+ }
867
+ await this.loadSTT(modelId, { onProgress });
868
+ if (!keepLoaded && this.stt) {
869
+ this.stt.dispose();
870
+ this.stt = null;
871
+ }
872
+ }
873
+ /**
874
+ * Check if an embedding model is cached
875
+ */
876
+ async isEmbeddingCached(modelId = "Xenova/all-MiniLM-L6-v2") {
877
+ const cacheDir = env.cacheDir || path.join(os.homedir(), ".cache", "huggingface", "hub");
878
+ const modelDir = path.join(cacheDir, `models--${modelId.replace(/\//g, "--")}`);
879
+ try {
880
+ return existsSync(modelDir);
881
+ } catch {
882
+ return false;
883
+ }
884
+ }
885
+ /**
886
+ * Preload an embedding model
887
+ *
888
+ * @param modelId - Embedding model to preload (default: "Xenova/all-MiniLM-L6-v2")
889
+ * @param options.keepLoaded - Keep model in memory for instant use (default: false)
890
+ */
891
+ async preloadEmbedding(modelId = "Xenova/all-MiniLM-L6-v2", options = {}) {
892
+ const { onProgress, keepLoaded = false } = options;
893
+ if (keepLoaded && this.embedder) {
894
+ onProgress?.({ status: "Embedding model already loaded" });
895
+ return;
896
+ }
897
+ if (!keepLoaded && await this.isEmbeddingCached(modelId)) {
898
+ onProgress?.({ status: "Embedding model already cached" });
899
+ return;
900
+ }
901
+ onProgress?.({ status: `Preloading ${modelId}...` });
902
+ const embedder = await pipeline$1("feature-extraction", modelId, { progress_callback: (progress) => {
903
+ if (progress.status === "progress" && progress.file) onProgress?.({
904
+ status: `Downloading ${progress.file}`,
905
+ progress: Math.round(progress.progress || 0),
906
+ file: progress.file
907
+ });
908
+ } });
909
+ if (keepLoaded) this.embedder = embedder;
910
+ else await embedder.dispose();
911
+ onProgress?.({ status: "Preload complete" });
912
+ }
913
+ /** Helper to resolve TTS repo from model ID */
914
+ resolveTTSRepo(modelId) {
915
+ return {
916
+ "kokoro-82m": "onnx-community/Kokoro-82M-v1.0-ONNX",
917
+ "supertonic-66m": "nicksimmons/supertonic-66m-onnx"
918
+ }[modelId] || modelId;
919
+ }
920
+ /** Helper to resolve STT repo from model ID */
921
+ resolveSTTRepo(modelId) {
922
+ return {
923
+ "whisper-tiny": "onnx-community/whisper-tiny",
924
+ "whisper-tiny.en": "onnx-community/whisper-tiny.en",
925
+ "whisper-base": "onnx-community/whisper-base",
926
+ "whisper-base.en": "onnx-community/whisper-base.en",
927
+ "whisper-small": "onnx-community/whisper-small",
928
+ "whisper-small.en": "onnx-community/whisper-small.en",
929
+ "whisper-large-v3-turbo": "onnx-community/whisper-large-v3-turbo"
930
+ }[modelId] || modelId;
931
+ }
932
+ /**
727
933
  * Get Chrome backend status (if using WebGPU via Chrome)
728
934
  */
729
935
  getChromeStatus() {
@@ -1156,6 +1362,88 @@ The JSON must conform to this schema: ${JSON.stringify(zodToJsonSchema(schema))}
1156
1362
  return results;
1157
1363
  }
1158
1364
  /**
1365
+ * Compute cosine similarity between two vectors
1366
+ *
1367
+ * @example
1368
+ * ```ts
1369
+ * const sim = g.cosineSimilarity([1, 0, 0], [1, 0, 0]); // 1.0
1370
+ * const sim2 = g.cosineSimilarity([1, 0, 0], [0, 1, 0]); // 0.0
1371
+ * ```
1372
+ */
1373
+ cosineSimilarity(a, b) {
1374
+ if (a.length !== b.length) throw new Error(`Vector dimensions must match: ${a.length} vs ${b.length}`);
1375
+ let dotProduct = 0;
1376
+ let normA = 0;
1377
+ let normB = 0;
1378
+ for (let i = 0; i < a.length; i++) {
1379
+ dotProduct += a[i] * b[i];
1380
+ normA += a[i] * a[i];
1381
+ normB += b[i] * b[i];
1382
+ }
1383
+ const magnitude = Math.sqrt(normA) * Math.sqrt(normB);
1384
+ if (magnitude === 0) return 0;
1385
+ return dotProduct / magnitude;
1386
+ }
1387
+ /**
1388
+ * Compare similarity between two texts
1389
+ *
1390
+ * @example
1391
+ * ```ts
1392
+ * const result = await g.similarity("Hello world", "Hi there");
1393
+ * console.log(result.score); // 0.85
1394
+ * ```
1395
+ */
1396
+ async similarity(textA, textB, options = {}) {
1397
+ const startTime = performance.now();
1398
+ const [embedA, embedB] = await Promise.all([this.embed(textA, options), this.embed(textB, options)]);
1399
+ return {
1400
+ score: this.cosineSimilarity(embedA.vector, embedB.vector),
1401
+ textA,
1402
+ textB,
1403
+ totalTime: performance.now() - startTime
1404
+ };
1405
+ }
1406
+ /**
1407
+ * Semantic search - find most similar texts from a corpus
1408
+ *
1409
+ * @example
1410
+ * ```ts
1411
+ * const results = await g.search("capital of France", [
1412
+ * "Paris is beautiful",
1413
+ * "London is in England",
1414
+ * "Dogs are pets"
1415
+ * ]);
1416
+ * // [{ text: "Paris is beautiful", score: 0.89, index: 0 }, ...]
1417
+ * ```
1418
+ */
1419
+ async search(query, corpus, options = {}) {
1420
+ const { topK = corpus.length, ...embedOptions } = options;
1421
+ const queryEmbedding = await this.embed(query, embedOptions);
1422
+ return (await this.embedBatch(corpus, embedOptions)).map((doc, index) => ({
1423
+ text: doc.text,
1424
+ score: this.cosineSimilarity(queryEmbedding.vector, doc.vector),
1425
+ index
1426
+ })).sort((a, b) => b.score - a.score).slice(0, topK);
1427
+ }
1428
+ /**
1429
+ * Find the nearest text to an embedding vector
1430
+ *
1431
+ * @example
1432
+ * ```ts
1433
+ * const embedding = (await g.embed("dog")).vector;
1434
+ * const match = await g.findNearest(embedding, ["cat", "car", "tree"]);
1435
+ * // { text: "cat", score: 0.85, index: 0 }
1436
+ * ```
1437
+ */
1438
+ async findNearest(embedding, candidates, options = {}) {
1439
+ const { topK = candidates.length, ...embedOptions } = options;
1440
+ return (await this.embedBatch(candidates, embedOptions)).map((doc, index) => ({
1441
+ text: doc.text,
1442
+ score: this.cosineSimilarity(embedding, doc.vector),
1443
+ index
1444
+ })).sort((a, b) => b.score - a.score).slice(0, topK);
1445
+ }
1446
+ /**
1159
1447
  * Get session stats
1160
1448
  */
1161
1449
  getStats() {
@@ -1628,4 +1916,4 @@ The JSON must conform to this schema: ${JSON.stringify(zodToJsonSchema(schema))}
1628
1916
 
1629
1917
  //#endregion
1630
1918
  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 };
1631
- //# sourceMappingURL=gerbil-DoDGHe6Z.mjs.map
1919
+ //# sourceMappingURL=gerbil-BZklpDhM.mjs.map