@tryhamster/gerbil 1.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +23 -0
- package/README.md +253 -0
- package/bin/cli.js +2 -0
- package/dist/auto-update-BbNHbSU1.mjs +3 -0
- package/dist/browser/index.d.mts +262 -0
- package/dist/browser/index.d.mts.map +1 -0
- package/dist/browser/index.mjs +755 -0
- package/dist/browser/index.mjs.map +1 -0
- package/dist/chrome-backend-C5Un08O4.mjs +771 -0
- package/dist/chrome-backend-C5Un08O4.mjs.map +1 -0
- package/dist/chrome-backend-CtwPENIW.mjs +3 -0
- package/dist/chunk-Ct1HF2bE.mjs +7 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +7078 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/frameworks/express.d.mts +22 -0
- package/dist/frameworks/express.d.mts.map +1 -0
- package/dist/frameworks/express.mjs +123 -0
- package/dist/frameworks/express.mjs.map +1 -0
- package/dist/frameworks/fastify.d.mts +11 -0
- package/dist/frameworks/fastify.d.mts.map +1 -0
- package/dist/frameworks/fastify.mjs +73 -0
- package/dist/frameworks/fastify.mjs.map +1 -0
- package/dist/frameworks/hono.d.mts +14 -0
- package/dist/frameworks/hono.d.mts.map +1 -0
- package/dist/frameworks/hono.mjs +82 -0
- package/dist/frameworks/hono.mjs.map +1 -0
- package/dist/frameworks/next.d.mts +31 -0
- package/dist/frameworks/next.d.mts.map +1 -0
- package/dist/frameworks/next.mjs +116 -0
- package/dist/frameworks/next.mjs.map +1 -0
- package/dist/frameworks/react.d.mts +56 -0
- package/dist/frameworks/react.d.mts.map +1 -0
- package/dist/frameworks/react.mjs +172 -0
- package/dist/frameworks/react.mjs.map +1 -0
- package/dist/frameworks/trpc.d.mts +12 -0
- package/dist/frameworks/trpc.d.mts.map +1 -0
- package/dist/frameworks/trpc.mjs +80 -0
- package/dist/frameworks/trpc.mjs.map +1 -0
- package/dist/gerbil-BfnsFWRE.mjs +644 -0
- package/dist/gerbil-BfnsFWRE.mjs.map +1 -0
- package/dist/gerbil-BjW-z7Fq.mjs +5 -0
- package/dist/gerbil-DZ1k3ChC.d.mts +138 -0
- package/dist/gerbil-DZ1k3ChC.d.mts.map +1 -0
- package/dist/index.d.mts +223 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +13 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integrations/ai-sdk.d.mts +78 -0
- package/dist/integrations/ai-sdk.d.mts.map +1 -0
- package/dist/integrations/ai-sdk.mjs +199 -0
- package/dist/integrations/ai-sdk.mjs.map +1 -0
- package/dist/integrations/langchain.d.mts +41 -0
- package/dist/integrations/langchain.d.mts.map +1 -0
- package/dist/integrations/langchain.mjs +93 -0
- package/dist/integrations/langchain.mjs.map +1 -0
- package/dist/integrations/llamaindex.d.mts +45 -0
- package/dist/integrations/llamaindex.d.mts.map +1 -0
- package/dist/integrations/llamaindex.mjs +86 -0
- package/dist/integrations/llamaindex.mjs.map +1 -0
- package/dist/integrations/mcp-client.d.mts +206 -0
- package/dist/integrations/mcp-client.d.mts.map +1 -0
- package/dist/integrations/mcp-client.mjs +507 -0
- package/dist/integrations/mcp-client.mjs.map +1 -0
- package/dist/integrations/mcp.d.mts +177 -0
- package/dist/integrations/mcp.d.mts.map +1 -0
- package/dist/integrations/mcp.mjs +8 -0
- package/dist/mcp-R8kRLIKb.mjs +348 -0
- package/dist/mcp-R8kRLIKb.mjs.map +1 -0
- package/dist/models-DKULvhOr.mjs +136 -0
- package/dist/models-DKULvhOr.mjs.map +1 -0
- package/dist/models-De2-_GmQ.d.mts +22 -0
- package/dist/models-De2-_GmQ.d.mts.map +1 -0
- package/dist/one-liner-BUQR0nqq.mjs +98 -0
- package/dist/one-liner-BUQR0nqq.mjs.map +1 -0
- package/dist/skills/index.d.mts +390 -0
- package/dist/skills/index.d.mts.map +1 -0
- package/dist/skills/index.mjs +7 -0
- package/dist/skills-D3CEpgDc.mjs +630 -0
- package/dist/skills-D3CEpgDc.mjs.map +1 -0
- package/dist/tools-BsiEE6f2.mjs +567 -0
- package/dist/tools-BsiEE6f2.mjs.map +1 -0
- package/dist/types-BS1N92Jt.d.mts +183 -0
- package/dist/types-BS1N92Jt.d.mts.map +1 -0
- package/dist/utils-7vXqtq2Q.mjs +63 -0
- package/dist/utils-7vXqtq2Q.mjs.map +1 -0
- package/docs/ai-sdk.md +80 -0
- package/docs/architecture/README.md +84 -0
- package/docs/architecture/caching.md +227 -0
- package/docs/architecture/inference.md +176 -0
- package/docs/architecture/overview.md +179 -0
- package/docs/architecture/streaming.md +261 -0
- package/docs/architecture/webgpu.md +213 -0
- package/docs/browser.md +328 -0
- package/docs/cli.md +155 -0
- package/docs/frameworks.md +90 -0
- package/docs/mcp-client.md +224 -0
- package/docs/mcp.md +109 -0
- package/docs/memory.md +229 -0
- package/docs/repl.md +473 -0
- package/docs/skills.md +261 -0
- package/docs/tools.md +304 -0
- package/package.json +207 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { s as GerbilConfig } from "../types-BS1N92Jt.mjs";
|
|
2
|
+
import { Request, Response, Router } from "express";
|
|
3
|
+
|
|
4
|
+
//#region src/frameworks/express.d.ts
|
|
5
|
+
|
|
6
|
+
interface GerbilExpressOptions extends Omit<GerbilConfig, "cache"> {
|
|
7
|
+
/** Rate limit (requests per minute) */
|
|
8
|
+
rateLimit?: number;
|
|
9
|
+
/** Enable caching */
|
|
10
|
+
cache?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create Gerbil Express middleware
|
|
14
|
+
*/
|
|
15
|
+
declare function gerbil(options?: GerbilExpressOptions): () => Router;
|
|
16
|
+
/**
|
|
17
|
+
* Simple handler for single endpoint
|
|
18
|
+
*/
|
|
19
|
+
declare function handler(options?: GerbilExpressOptions): (req: Request, res: Response) => Promise<void>;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { GerbilExpressOptions, gerbil as default, gerbil, handler };
|
|
22
|
+
//# sourceMappingURL=express.d.mts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { t as __require } from "../chunk-Ct1HF2bE.mjs";
|
|
2
|
+
import "../models-DKULvhOr.mjs";
|
|
3
|
+
import "../utils-7vXqtq2Q.mjs";
|
|
4
|
+
import { t as Gerbil } from "../gerbil-BfnsFWRE.mjs";
|
|
5
|
+
|
|
6
|
+
//#region src/frameworks/express.ts
|
|
7
|
+
/**
|
|
8
|
+
* Create Gerbil Express middleware
|
|
9
|
+
*/
|
|
10
|
+
function gerbil(options = {}) {
|
|
11
|
+
const { cache: _cache, rateLimit: _rateLimit, ...gerbilOptions } = options;
|
|
12
|
+
const g = new Gerbil(gerbilOptions);
|
|
13
|
+
let loadPromise = null;
|
|
14
|
+
async function ensureLoaded() {
|
|
15
|
+
if (!(g.isLoaded() || loadPromise)) loadPromise = g.loadModel(options.model || "qwen3-0.6b");
|
|
16
|
+
if (loadPromise) {
|
|
17
|
+
await loadPromise;
|
|
18
|
+
loadPromise = null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return function createRouter() {
|
|
22
|
+
const express = __require("express");
|
|
23
|
+
const router = express.Router();
|
|
24
|
+
router.use(express.json());
|
|
25
|
+
router.post("/generate", async (req, res) => {
|
|
26
|
+
try {
|
|
27
|
+
await ensureLoaded();
|
|
28
|
+
const { prompt, ...opts } = req.body;
|
|
29
|
+
const result = await g.generate(prompt, opts);
|
|
30
|
+
res.json(result);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
res.status(500).json({ error: String(error) });
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
router.post("/stream", async (req, res) => {
|
|
36
|
+
try {
|
|
37
|
+
await ensureLoaded();
|
|
38
|
+
const { prompt, ...opts } = req.body;
|
|
39
|
+
res.setHeader("Content-Type", "text/event-stream");
|
|
40
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
41
|
+
res.setHeader("Connection", "keep-alive");
|
|
42
|
+
for await (const chunk of g.stream(prompt, opts)) res.write(`data: ${JSON.stringify({ chunk })}\n\n`);
|
|
43
|
+
res.write("data: [DONE]\n\n");
|
|
44
|
+
res.end();
|
|
45
|
+
} catch (error) {
|
|
46
|
+
res.status(500).json({ error: String(error) });
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
router.post("/json", async (req, res) => {
|
|
50
|
+
try {
|
|
51
|
+
await ensureLoaded();
|
|
52
|
+
const { prompt, schema, ...opts } = req.body;
|
|
53
|
+
const { z } = await import("zod");
|
|
54
|
+
const zodSchema = z.any();
|
|
55
|
+
const result = await g.json(prompt, {
|
|
56
|
+
schema: zodSchema,
|
|
57
|
+
...opts
|
|
58
|
+
});
|
|
59
|
+
res.json(result);
|
|
60
|
+
} catch (error) {
|
|
61
|
+
res.status(500).json({ error: String(error) });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
router.post("/embed", async (req, res) => {
|
|
65
|
+
try {
|
|
66
|
+
await ensureLoaded();
|
|
67
|
+
const { text, texts, ...opts } = req.body;
|
|
68
|
+
if (texts) {
|
|
69
|
+
const results = await g.embedBatch(texts, opts);
|
|
70
|
+
res.json(results);
|
|
71
|
+
} else {
|
|
72
|
+
const result = await g.embed(text, opts);
|
|
73
|
+
res.json(result);
|
|
74
|
+
}
|
|
75
|
+
} catch (error) {
|
|
76
|
+
res.status(500).json({ error: String(error) });
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
router.get("/info", async (_req, res) => {
|
|
80
|
+
try {
|
|
81
|
+
await ensureLoaded();
|
|
82
|
+
res.json(g.getInfo());
|
|
83
|
+
} catch (error) {
|
|
84
|
+
res.status(500).json({ error: String(error) });
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
router.get("/stats", async (_req, res) => {
|
|
88
|
+
try {
|
|
89
|
+
res.json(g.getStats());
|
|
90
|
+
} catch (error) {
|
|
91
|
+
res.status(500).json({ error: String(error) });
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return router;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Simple handler for single endpoint
|
|
99
|
+
*/
|
|
100
|
+
function handler(options = {}) {
|
|
101
|
+
const { cache: _cache, rateLimit: _rateLimit, ...gerbilOptions } = options;
|
|
102
|
+
const g = new Gerbil(gerbilOptions);
|
|
103
|
+
let loadPromise = null;
|
|
104
|
+
return async (req, res) => {
|
|
105
|
+
if (!(g.isLoaded() || loadPromise)) loadPromise = g.loadModel(options.model || "qwen3-0.6b");
|
|
106
|
+
if (loadPromise) {
|
|
107
|
+
await loadPromise;
|
|
108
|
+
loadPromise = null;
|
|
109
|
+
}
|
|
110
|
+
try {
|
|
111
|
+
const { prompt, ...opts } = req.body;
|
|
112
|
+
const result = await g.generate(prompt, opts);
|
|
113
|
+
res.json(result);
|
|
114
|
+
} catch (error) {
|
|
115
|
+
res.status(500).json({ error: String(error) });
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
var express_default = gerbil;
|
|
120
|
+
|
|
121
|
+
//#endregion
|
|
122
|
+
export { express_default as default, gerbil, handler };
|
|
123
|
+
//# sourceMappingURL=express.mjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { s as GerbilConfig } from "../types-BS1N92Jt.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/frameworks/fastify.d.ts
|
|
4
|
+
|
|
5
|
+
interface GerbilFastifyOptions extends GerbilConfig {
|
|
6
|
+
prefix?: string;
|
|
7
|
+
}
|
|
8
|
+
declare function gerbilPlugin(fastify: any, options?: GerbilFastifyOptions): Promise<void>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { GerbilFastifyOptions, gerbilPlugin as default, gerbilPlugin };
|
|
11
|
+
//# sourceMappingURL=fastify.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.d.mts","names":[],"sources":["../../src/frameworks/fastify.ts"],"sourcesContent":[],"mappings":";;;;UAgBiB,oBAAA,SAA6B;;;iBAIxB,YAAA,yBAAoC,uBAAyB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import "../models-DKULvhOr.mjs";
|
|
2
|
+
import "../utils-7vXqtq2Q.mjs";
|
|
3
|
+
import { t as Gerbil } from "../gerbil-BfnsFWRE.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/frameworks/fastify.ts
|
|
6
|
+
/**
|
|
7
|
+
* Gerbil Fastify Plugin
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import Fastify from "fastify";
|
|
12
|
+
* import { gerbilPlugin } from "gerbil/fastify";
|
|
13
|
+
*
|
|
14
|
+
* const app = Fastify();
|
|
15
|
+
* app.register(gerbilPlugin, { prefix: "/ai" });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
async function gerbilPlugin(fastify, options = {}) {
|
|
19
|
+
const { prefix = "/ai", ...gerbilConfig } = options;
|
|
20
|
+
const g = new Gerbil(gerbilConfig);
|
|
21
|
+
let loadPromise = null;
|
|
22
|
+
async function ensureLoaded() {
|
|
23
|
+
if (!(g.isLoaded() || loadPromise)) loadPromise = g.loadModel(gerbilConfig.model || "qwen3-0.6b");
|
|
24
|
+
if (loadPromise) {
|
|
25
|
+
await loadPromise;
|
|
26
|
+
loadPromise = null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
fastify.decorate("gerbil", g);
|
|
30
|
+
fastify.post(`${prefix}/generate`, async (request, _reply) => {
|
|
31
|
+
await ensureLoaded();
|
|
32
|
+
const { prompt, ...opts } = request.body;
|
|
33
|
+
return await g.generate(prompt, opts);
|
|
34
|
+
});
|
|
35
|
+
fastify.post(`${prefix}/stream`, async (request, reply) => {
|
|
36
|
+
await ensureLoaded();
|
|
37
|
+
const { prompt, ...opts } = request.body;
|
|
38
|
+
reply.raw.writeHead(200, {
|
|
39
|
+
"Content-Type": "text/event-stream",
|
|
40
|
+
"Cache-Control": "no-cache",
|
|
41
|
+
Connection: "keep-alive"
|
|
42
|
+
});
|
|
43
|
+
for await (const chunk of g.stream(prompt, opts)) reply.raw.write(`data: ${JSON.stringify({ chunk })}\n\n`);
|
|
44
|
+
reply.raw.write("data: [DONE]\n\n");
|
|
45
|
+
reply.raw.end();
|
|
46
|
+
});
|
|
47
|
+
fastify.post(`${prefix}/json`, async (request, _reply) => {
|
|
48
|
+
await ensureLoaded();
|
|
49
|
+
const { prompt, schema, ...opts } = request.body;
|
|
50
|
+
const { z } = await import("zod");
|
|
51
|
+
const zodSchema = z.any();
|
|
52
|
+
return await g.json(prompt, {
|
|
53
|
+
schema: zodSchema,
|
|
54
|
+
...opts
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
fastify.post(`${prefix}/embed`, async (request, _reply) => {
|
|
58
|
+
await ensureLoaded();
|
|
59
|
+
const { text, texts, ...opts } = request.body;
|
|
60
|
+
if (texts) return g.embedBatch(texts, opts);
|
|
61
|
+
return g.embed(text, opts);
|
|
62
|
+
});
|
|
63
|
+
fastify.get(`${prefix}/info`, async (_request, _reply) => {
|
|
64
|
+
await ensureLoaded();
|
|
65
|
+
return g.getInfo();
|
|
66
|
+
});
|
|
67
|
+
fastify.get(`${prefix}/stats`, async (_request, _reply) => g.getStats());
|
|
68
|
+
}
|
|
69
|
+
var fastify_default = gerbilPlugin;
|
|
70
|
+
|
|
71
|
+
//#endregion
|
|
72
|
+
export { fastify_default as default, gerbilPlugin };
|
|
73
|
+
//# sourceMappingURL=fastify.mjs.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { s as GerbilConfig } from "../types-BS1N92Jt.mjs";
|
|
2
|
+
import * as hono0 from "hono";
|
|
3
|
+
import * as hono_types0 from "hono/types";
|
|
4
|
+
|
|
5
|
+
//#region src/frameworks/hono.d.ts
|
|
6
|
+
|
|
7
|
+
interface GerbilHonoOptions extends GerbilConfig {}
|
|
8
|
+
/**
|
|
9
|
+
* Create Gerbil Hono routes
|
|
10
|
+
*/
|
|
11
|
+
declare function gerbil(options?: GerbilHonoOptions): () => Promise<hono0.Hono<hono_types0.BlankEnv, hono_types0.BlankSchema, "/">>;
|
|
12
|
+
//#endregion
|
|
13
|
+
export { GerbilHonoOptions, gerbil as default, gerbil };
|
|
14
|
+
//# sourceMappingURL=hono.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.d.mts","names":[],"sources":["../../src/frameworks/hono.ts"],"sourcesContent":[],"mappings":";;;;;;UAgBiB,iBAAA,SAA0B;;;;iBAK3B,MAAA,WAAgB,0BAAsB,QAAA,KAAA,CAAA,KAAA,WAAA,CAAA,QAAA,EAAA,WAAA,CAAA,WAAA"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import "../models-DKULvhOr.mjs";
|
|
2
|
+
import "../utils-7vXqtq2Q.mjs";
|
|
3
|
+
import { t as Gerbil } from "../gerbil-BfnsFWRE.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/frameworks/hono.ts
|
|
6
|
+
/**
|
|
7
|
+
* Gerbil Hono Middleware
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Hono } from "hono";
|
|
12
|
+
* import { gerbil } from "gerbil/hono";
|
|
13
|
+
*
|
|
14
|
+
* const app = new Hono();
|
|
15
|
+
* app.route("/ai", gerbil({ model: "qwen3-0.6b" }));
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* Create Gerbil Hono routes
|
|
20
|
+
*/
|
|
21
|
+
function gerbil(options = {}) {
|
|
22
|
+
const g = new Gerbil(options);
|
|
23
|
+
let loadPromise = null;
|
|
24
|
+
async function ensureLoaded() {
|
|
25
|
+
if (!(g.isLoaded() || loadPromise)) loadPromise = g.loadModel(options.model || "qwen3-0.6b");
|
|
26
|
+
if (loadPromise) {
|
|
27
|
+
await loadPromise;
|
|
28
|
+
loadPromise = null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return async function createApp() {
|
|
32
|
+
const { Hono } = await import("hono");
|
|
33
|
+
const { streamSSE } = await import("hono/streaming");
|
|
34
|
+
const app = new Hono();
|
|
35
|
+
app.post("/generate", async (c) => {
|
|
36
|
+
await ensureLoaded();
|
|
37
|
+
const { prompt, ...opts } = await c.req.json();
|
|
38
|
+
const result = await g.generate(prompt, opts);
|
|
39
|
+
return c.json(result);
|
|
40
|
+
});
|
|
41
|
+
app.post("/stream", async (c) => {
|
|
42
|
+
await ensureLoaded();
|
|
43
|
+
const { prompt, ...opts } = await c.req.json();
|
|
44
|
+
return streamSSE(c, async (stream) => {
|
|
45
|
+
for await (const chunk of g.stream(prompt, opts)) await stream.writeSSE({ data: JSON.stringify({ chunk }) });
|
|
46
|
+
await stream.writeSSE({ data: "[DONE]" });
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
app.post("/json", async (c) => {
|
|
50
|
+
await ensureLoaded();
|
|
51
|
+
const { prompt, schema, ...opts } = await c.req.json();
|
|
52
|
+
const { z } = await import("zod");
|
|
53
|
+
const zodSchema = z.any();
|
|
54
|
+
const result = await g.json(prompt, {
|
|
55
|
+
schema: zodSchema,
|
|
56
|
+
...opts
|
|
57
|
+
});
|
|
58
|
+
return c.json(result);
|
|
59
|
+
});
|
|
60
|
+
app.post("/embed", async (c) => {
|
|
61
|
+
await ensureLoaded();
|
|
62
|
+
const { text, texts, ...opts } = await c.req.json();
|
|
63
|
+
if (texts) {
|
|
64
|
+
const results = await g.embedBatch(texts, opts);
|
|
65
|
+
return c.json(results);
|
|
66
|
+
}
|
|
67
|
+
const result = await g.embed(text, opts);
|
|
68
|
+
return c.json(result);
|
|
69
|
+
});
|
|
70
|
+
app.get("/info", async (c) => {
|
|
71
|
+
await ensureLoaded();
|
|
72
|
+
return c.json(g.getInfo());
|
|
73
|
+
});
|
|
74
|
+
app.get("/stats", (c) => c.json(g.getStats()));
|
|
75
|
+
return app;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
var hono_default = gerbil;
|
|
79
|
+
|
|
80
|
+
//#endregion
|
|
81
|
+
export { hono_default as default, gerbil };
|
|
82
|
+
//# sourceMappingURL=hono.mjs.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { s as GerbilConfig } from "../types-BS1N92Jt.mjs";
|
|
2
|
+
import { t as Gerbil } from "../gerbil-DZ1k3ChC.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/frameworks/next.d.ts
|
|
5
|
+
|
|
6
|
+
interface GerbilNextOptions extends GerbilConfig {
|
|
7
|
+
/** Preload model on startup */
|
|
8
|
+
preload?: boolean;
|
|
9
|
+
}
|
|
10
|
+
declare function getInstance(options: GerbilNextOptions): Promise<Gerbil>;
|
|
11
|
+
/**
|
|
12
|
+
* Create a Next.js API route handler
|
|
13
|
+
*/
|
|
14
|
+
declare function handler(options?: GerbilNextOptions): (req: Request) => Promise<Response>;
|
|
15
|
+
/**
|
|
16
|
+
* Create handlers for all endpoints
|
|
17
|
+
*/
|
|
18
|
+
declare function createHandlers(options?: GerbilNextOptions): {
|
|
19
|
+
generate: (req: Request) => Promise<Response>;
|
|
20
|
+
json(req: Request): Promise<Response>;
|
|
21
|
+
embed(req: Request): Promise<Response>;
|
|
22
|
+
info(_req: Request): Promise<Response>;
|
|
23
|
+
};
|
|
24
|
+
declare const gerbil: {
|
|
25
|
+
handler: typeof handler;
|
|
26
|
+
createHandlers: typeof createHandlers;
|
|
27
|
+
getInstance: typeof getInstance;
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { GerbilNextOptions, createHandlers, gerbil as default, gerbil, handler };
|
|
31
|
+
//# sourceMappingURL=next.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"next.d.mts","names":[],"sources":["../../src/frameworks/next.ts"],"sourcesContent":[],"mappings":";;;;;AA+CmD,UA9BlC,iBAAA,SAA0B,YA8BQ,CAAA;EA2CnC;EAAwB,OAAA,CAAA,EAAA,OAAA;;iBAhEzB,WAAA,CAqBqC,OAAA,EArBhB,iBAqBgB,CAAA,EArBI,OAqBJ,CArBY,MAqBZ,CAAA;;;;AA+CtB,iBAhDd,OAAA,CAgDc,OAAA,CAAA,EAhDG,iBAgDH,CAAA,EAAA,CAAA,GAAA,EA/CI,OA+CJ,EAAA,GA/Cc,OA+Cd,CA/CsB,QA+CtB,CAAA;;;;AAiCT,iBArCL,cAAA,CAqCK,OAAA,CAAA,EArCmB,iBAqCnB,CAAA,EAAA;EAAkB,QAAA,EAAA,CAAA,GAAA,EAhFL,OAgFK,EAAA,GAhFK,OAgFL,CAhFa,QAgFb,CAAA;EAAR,IAAA,CAAA,GAAA,EAjCX,OAiCW,CAAA,EAjCD,OAiCC,CAjCO,QAiCP,CAAA;EAAO,KAAA,CAAA,GAAA,EAjBjB,OAiBiB,CAAA,EAjBP,OAiBO,CAjBC,QAiBD,CAAA;EAWzB,IAAA,CAAA,IAIZ,EAfoB,OAepB,CAAA,EAf8B,OAe9B,CAfsC,QAetC,CAAA;;cAJY"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import "../models-DKULvhOr.mjs";
|
|
2
|
+
import "../utils-7vXqtq2Q.mjs";
|
|
3
|
+
import { t as Gerbil } from "../gerbil-BfnsFWRE.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/frameworks/next.ts
|
|
6
|
+
/**
|
|
7
|
+
* Gerbil Next.js Integration
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* // app/api/chat/route.ts
|
|
12
|
+
* import { gerbil } from "gerbil/next";
|
|
13
|
+
*
|
|
14
|
+
* export const POST = gerbil.handler({
|
|
15
|
+
* model: "qwen3-0.6b",
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
let instance = null;
|
|
20
|
+
let loadPromise = null;
|
|
21
|
+
async function getInstance(options) {
|
|
22
|
+
if (!instance) instance = new Gerbil(options);
|
|
23
|
+
if (!(instance.isLoaded() || loadPromise)) loadPromise = instance.loadModel(options.model || "qwen3-0.6b");
|
|
24
|
+
if (loadPromise) {
|
|
25
|
+
await loadPromise;
|
|
26
|
+
loadPromise = null;
|
|
27
|
+
}
|
|
28
|
+
return instance;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a Next.js API route handler
|
|
32
|
+
*/
|
|
33
|
+
function handler(options = {}) {
|
|
34
|
+
return async function POST(req) {
|
|
35
|
+
try {
|
|
36
|
+
const g = await getInstance(options);
|
|
37
|
+
const { prompt, stream: isStreaming, ...opts } = await req.json();
|
|
38
|
+
if (isStreaming) {
|
|
39
|
+
const encoder = new TextEncoder();
|
|
40
|
+
const readable = new ReadableStream({ async start(controller) {
|
|
41
|
+
try {
|
|
42
|
+
for await (const chunk of g.stream(prompt, opts)) controller.enqueue(encoder.encode(`data: ${JSON.stringify({ chunk })}\n\n`));
|
|
43
|
+
controller.enqueue(encoder.encode("data: [DONE]\n\n"));
|
|
44
|
+
controller.close();
|
|
45
|
+
} catch (error) {
|
|
46
|
+
controller.error(error);
|
|
47
|
+
}
|
|
48
|
+
} });
|
|
49
|
+
return new Response(readable, { headers: {
|
|
50
|
+
"Content-Type": "text/event-stream",
|
|
51
|
+
"Cache-Control": "no-cache",
|
|
52
|
+
Connection: "keep-alive"
|
|
53
|
+
} });
|
|
54
|
+
}
|
|
55
|
+
const result = await g.generate(prompt, opts);
|
|
56
|
+
return Response.json(result);
|
|
57
|
+
} catch (error) {
|
|
58
|
+
return Response.json({ error: String(error) }, { status: 500 });
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Create handlers for all endpoints
|
|
64
|
+
*/
|
|
65
|
+
function createHandlers(options = {}) {
|
|
66
|
+
return {
|
|
67
|
+
generate: handler(options),
|
|
68
|
+
async json(req) {
|
|
69
|
+
try {
|
|
70
|
+
const g = await getInstance(options);
|
|
71
|
+
const { prompt, schema, ...opts } = await req.json();
|
|
72
|
+
const { z } = await import("zod");
|
|
73
|
+
const zodSchema = z.any();
|
|
74
|
+
const result = await g.json(prompt, {
|
|
75
|
+
schema: zodSchema,
|
|
76
|
+
...opts
|
|
77
|
+
});
|
|
78
|
+
return Response.json(result);
|
|
79
|
+
} catch (error) {
|
|
80
|
+
return Response.json({ error: String(error) }, { status: 500 });
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
async embed(req) {
|
|
84
|
+
try {
|
|
85
|
+
const g = await getInstance(options);
|
|
86
|
+
const { text, texts, ...opts } = await req.json();
|
|
87
|
+
if (texts) {
|
|
88
|
+
const results = await g.embedBatch(texts, opts);
|
|
89
|
+
return Response.json(results);
|
|
90
|
+
}
|
|
91
|
+
const result = await g.embed(text, opts);
|
|
92
|
+
return Response.json(result);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
return Response.json({ error: String(error) }, { status: 500 });
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
async info(_req) {
|
|
98
|
+
try {
|
|
99
|
+
const g = await getInstance(options);
|
|
100
|
+
return Response.json(g.getInfo());
|
|
101
|
+
} catch (error) {
|
|
102
|
+
return Response.json({ error: String(error) }, { status: 500 });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const gerbil = {
|
|
108
|
+
handler,
|
|
109
|
+
createHandlers,
|
|
110
|
+
getInstance
|
|
111
|
+
};
|
|
112
|
+
var next_default = gerbil;
|
|
113
|
+
|
|
114
|
+
//#endregion
|
|
115
|
+
export { createHandlers, next_default as default, gerbil, handler };
|
|
116
|
+
//# sourceMappingURL=next.mjs.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { a as GenerateOptions, o as GenerateResult, s as GerbilConfig } from "../types-BS1N92Jt.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/frameworks/react.d.ts
|
|
4
|
+
|
|
5
|
+
interface UseGerbilOptions extends GerbilConfig {
|
|
6
|
+
/** API endpoint (default: "/api/gerbil") */
|
|
7
|
+
endpoint?: string;
|
|
8
|
+
/** Auto-connect on mount */
|
|
9
|
+
autoConnect?: boolean;
|
|
10
|
+
}
|
|
11
|
+
type UseGerbilReturn = {
|
|
12
|
+
/** Generate text */
|
|
13
|
+
generate: (prompt: string, options?: GenerateOptions) => Promise<GenerateResult>;
|
|
14
|
+
/** Stream text generation */
|
|
15
|
+
stream: (prompt: string, options?: GenerateOptions) => AsyncGenerator<string, void, unknown>;
|
|
16
|
+
/** Current loading state */
|
|
17
|
+
isLoading: boolean;
|
|
18
|
+
/** Current error */
|
|
19
|
+
error: Error | null;
|
|
20
|
+
/** Whether connected to API */
|
|
21
|
+
isConnected: boolean;
|
|
22
|
+
/** Last result */
|
|
23
|
+
result: GenerateResult | null;
|
|
24
|
+
/** Reset state */
|
|
25
|
+
reset: () => void;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* React hook for Gerbil
|
|
29
|
+
*/
|
|
30
|
+
declare function useGerbil(options?: UseGerbilOptions): UseGerbilReturn;
|
|
31
|
+
/**
|
|
32
|
+
* Hook for chat-style interactions
|
|
33
|
+
*/
|
|
34
|
+
type Message = {
|
|
35
|
+
role: "user" | "assistant";
|
|
36
|
+
content: string;
|
|
37
|
+
};
|
|
38
|
+
interface UseChatOptions extends UseGerbilOptions {
|
|
39
|
+
/** Initial messages */
|
|
40
|
+
initialMessages?: Message[];
|
|
41
|
+
/** System prompt */
|
|
42
|
+
system?: string;
|
|
43
|
+
}
|
|
44
|
+
type UseChatReturn = {
|
|
45
|
+
messages: Message[];
|
|
46
|
+
input: string;
|
|
47
|
+
setInput: (input: string) => void;
|
|
48
|
+
handleSubmit: (e?: React.FormEvent) => Promise<void>;
|
|
49
|
+
isLoading: boolean;
|
|
50
|
+
error: Error | null;
|
|
51
|
+
reset: () => void;
|
|
52
|
+
};
|
|
53
|
+
declare function useChat(options?: UseChatOptions): UseChatReturn;
|
|
54
|
+
//#endregion
|
|
55
|
+
export { Message, UseChatOptions, UseChatReturn, UseGerbilOptions, UseGerbilReturn, useGerbil as default, useGerbil, useChat };
|
|
56
|
+
//# sourceMappingURL=react.d.mts.map
|
|
@@ -0,0 +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"}
|