@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.
Files changed (103) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +253 -0
  3. package/bin/cli.js +2 -0
  4. package/dist/auto-update-BbNHbSU1.mjs +3 -0
  5. package/dist/browser/index.d.mts +262 -0
  6. package/dist/browser/index.d.mts.map +1 -0
  7. package/dist/browser/index.mjs +755 -0
  8. package/dist/browser/index.mjs.map +1 -0
  9. package/dist/chrome-backend-C5Un08O4.mjs +771 -0
  10. package/dist/chrome-backend-C5Un08O4.mjs.map +1 -0
  11. package/dist/chrome-backend-CtwPENIW.mjs +3 -0
  12. package/dist/chunk-Ct1HF2bE.mjs +7 -0
  13. package/dist/cli.d.mts +1 -0
  14. package/dist/cli.mjs +7078 -0
  15. package/dist/cli.mjs.map +1 -0
  16. package/dist/frameworks/express.d.mts +22 -0
  17. package/dist/frameworks/express.d.mts.map +1 -0
  18. package/dist/frameworks/express.mjs +123 -0
  19. package/dist/frameworks/express.mjs.map +1 -0
  20. package/dist/frameworks/fastify.d.mts +11 -0
  21. package/dist/frameworks/fastify.d.mts.map +1 -0
  22. package/dist/frameworks/fastify.mjs +73 -0
  23. package/dist/frameworks/fastify.mjs.map +1 -0
  24. package/dist/frameworks/hono.d.mts +14 -0
  25. package/dist/frameworks/hono.d.mts.map +1 -0
  26. package/dist/frameworks/hono.mjs +82 -0
  27. package/dist/frameworks/hono.mjs.map +1 -0
  28. package/dist/frameworks/next.d.mts +31 -0
  29. package/dist/frameworks/next.d.mts.map +1 -0
  30. package/dist/frameworks/next.mjs +116 -0
  31. package/dist/frameworks/next.mjs.map +1 -0
  32. package/dist/frameworks/react.d.mts +56 -0
  33. package/dist/frameworks/react.d.mts.map +1 -0
  34. package/dist/frameworks/react.mjs +172 -0
  35. package/dist/frameworks/react.mjs.map +1 -0
  36. package/dist/frameworks/trpc.d.mts +12 -0
  37. package/dist/frameworks/trpc.d.mts.map +1 -0
  38. package/dist/frameworks/trpc.mjs +80 -0
  39. package/dist/frameworks/trpc.mjs.map +1 -0
  40. package/dist/gerbil-BfnsFWRE.mjs +644 -0
  41. package/dist/gerbil-BfnsFWRE.mjs.map +1 -0
  42. package/dist/gerbil-BjW-z7Fq.mjs +5 -0
  43. package/dist/gerbil-DZ1k3ChC.d.mts +138 -0
  44. package/dist/gerbil-DZ1k3ChC.d.mts.map +1 -0
  45. package/dist/index.d.mts +223 -0
  46. package/dist/index.d.mts.map +1 -0
  47. package/dist/index.mjs +13 -0
  48. package/dist/index.mjs.map +1 -0
  49. package/dist/integrations/ai-sdk.d.mts +78 -0
  50. package/dist/integrations/ai-sdk.d.mts.map +1 -0
  51. package/dist/integrations/ai-sdk.mjs +199 -0
  52. package/dist/integrations/ai-sdk.mjs.map +1 -0
  53. package/dist/integrations/langchain.d.mts +41 -0
  54. package/dist/integrations/langchain.d.mts.map +1 -0
  55. package/dist/integrations/langchain.mjs +93 -0
  56. package/dist/integrations/langchain.mjs.map +1 -0
  57. package/dist/integrations/llamaindex.d.mts +45 -0
  58. package/dist/integrations/llamaindex.d.mts.map +1 -0
  59. package/dist/integrations/llamaindex.mjs +86 -0
  60. package/dist/integrations/llamaindex.mjs.map +1 -0
  61. package/dist/integrations/mcp-client.d.mts +206 -0
  62. package/dist/integrations/mcp-client.d.mts.map +1 -0
  63. package/dist/integrations/mcp-client.mjs +507 -0
  64. package/dist/integrations/mcp-client.mjs.map +1 -0
  65. package/dist/integrations/mcp.d.mts +177 -0
  66. package/dist/integrations/mcp.d.mts.map +1 -0
  67. package/dist/integrations/mcp.mjs +8 -0
  68. package/dist/mcp-R8kRLIKb.mjs +348 -0
  69. package/dist/mcp-R8kRLIKb.mjs.map +1 -0
  70. package/dist/models-DKULvhOr.mjs +136 -0
  71. package/dist/models-DKULvhOr.mjs.map +1 -0
  72. package/dist/models-De2-_GmQ.d.mts +22 -0
  73. package/dist/models-De2-_GmQ.d.mts.map +1 -0
  74. package/dist/one-liner-BUQR0nqq.mjs +98 -0
  75. package/dist/one-liner-BUQR0nqq.mjs.map +1 -0
  76. package/dist/skills/index.d.mts +390 -0
  77. package/dist/skills/index.d.mts.map +1 -0
  78. package/dist/skills/index.mjs +7 -0
  79. package/dist/skills-D3CEpgDc.mjs +630 -0
  80. package/dist/skills-D3CEpgDc.mjs.map +1 -0
  81. package/dist/tools-BsiEE6f2.mjs +567 -0
  82. package/dist/tools-BsiEE6f2.mjs.map +1 -0
  83. package/dist/types-BS1N92Jt.d.mts +183 -0
  84. package/dist/types-BS1N92Jt.d.mts.map +1 -0
  85. package/dist/utils-7vXqtq2Q.mjs +63 -0
  86. package/dist/utils-7vXqtq2Q.mjs.map +1 -0
  87. package/docs/ai-sdk.md +80 -0
  88. package/docs/architecture/README.md +84 -0
  89. package/docs/architecture/caching.md +227 -0
  90. package/docs/architecture/inference.md +176 -0
  91. package/docs/architecture/overview.md +179 -0
  92. package/docs/architecture/streaming.md +261 -0
  93. package/docs/architecture/webgpu.md +213 -0
  94. package/docs/browser.md +328 -0
  95. package/docs/cli.md +155 -0
  96. package/docs/frameworks.md +90 -0
  97. package/docs/mcp-client.md +224 -0
  98. package/docs/mcp.md +109 -0
  99. package/docs/memory.md +229 -0
  100. package/docs/repl.md +473 -0
  101. package/docs/skills.md +261 -0
  102. package/docs/tools.md +304 -0
  103. package/package.json +207 -0
@@ -0,0 +1,172 @@
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+
3
+ //#region src/frameworks/react.ts
4
+ /**
5
+ * Gerbil React Hooks
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * import { useGerbil } from "gerbil/react";
10
+ *
11
+ * function Chat() {
12
+ * const { generate, isLoading, error } = useGerbil();
13
+ *
14
+ * const handleSubmit = async (prompt: string) => {
15
+ * const result = await generate(prompt);
16
+ * console.log(result.text);
17
+ * };
18
+ * }
19
+ * ```
20
+ */
21
+ /**
22
+ * React hook for Gerbil
23
+ */
24
+ function useGerbil(options = {}) {
25
+ const { endpoint = "/api/gerbil" } = options;
26
+ const [isLoading, setIsLoading] = useState(false);
27
+ const [error, setError] = useState(null);
28
+ const [isConnected, setIsConnected] = useState(false);
29
+ const [result, setResult] = useState(null);
30
+ const abortControllerRef = useRef(null);
31
+ useEffect(() => {
32
+ async function checkConnection() {
33
+ try {
34
+ setIsConnected((await fetch(`${endpoint}/info`)).ok);
35
+ } catch {
36
+ setIsConnected(false);
37
+ }
38
+ }
39
+ checkConnection();
40
+ }, [endpoint]);
41
+ return {
42
+ generate: useCallback(async (prompt, generateOptions = {}) => {
43
+ setIsLoading(true);
44
+ setError(null);
45
+ abortControllerRef.current = new AbortController();
46
+ try {
47
+ const res = await fetch(`${endpoint}/generate`, {
48
+ method: "POST",
49
+ headers: { "Content-Type": "application/json" },
50
+ body: JSON.stringify({
51
+ prompt,
52
+ ...generateOptions
53
+ }),
54
+ signal: abortControllerRef.current.signal
55
+ });
56
+ if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);
57
+ const data = await res.json();
58
+ setResult(data);
59
+ return data;
60
+ } catch (err) {
61
+ const error$1 = err instanceof Error ? err : new Error(String(err));
62
+ setError(error$1);
63
+ throw error$1;
64
+ } finally {
65
+ setIsLoading(false);
66
+ abortControllerRef.current = null;
67
+ }
68
+ }, [endpoint]),
69
+ stream: useCallback(async function* (prompt, generateOptions = {}) {
70
+ setIsLoading(true);
71
+ setError(null);
72
+ abortControllerRef.current = new AbortController();
73
+ try {
74
+ const res = await fetch(`${endpoint}/stream`, {
75
+ method: "POST",
76
+ headers: { "Content-Type": "application/json" },
77
+ body: JSON.stringify({
78
+ prompt,
79
+ stream: true,
80
+ ...generateOptions
81
+ }),
82
+ signal: abortControllerRef.current.signal
83
+ });
84
+ if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);
85
+ const reader = res.body?.getReader();
86
+ if (!reader) throw new Error("No response body");
87
+ const decoder = new TextDecoder();
88
+ let buffer = "";
89
+ while (true) {
90
+ const { done, value } = await reader.read();
91
+ if (done) break;
92
+ buffer += decoder.decode(value, { stream: true });
93
+ const lines = buffer.split("\n");
94
+ buffer = lines.pop() || "";
95
+ for (const line of lines) if (line.startsWith("data: ")) {
96
+ const data = line.slice(6);
97
+ if (data === "[DONE]") continue;
98
+ try {
99
+ const parsed = JSON.parse(data);
100
+ if (parsed.chunk) yield parsed.chunk;
101
+ } catch {}
102
+ }
103
+ }
104
+ } catch (err) {
105
+ const error$1 = err instanceof Error ? err : new Error(String(err));
106
+ setError(error$1);
107
+ throw error$1;
108
+ } finally {
109
+ setIsLoading(false);
110
+ abortControllerRef.current = null;
111
+ }
112
+ }, [endpoint]),
113
+ isLoading,
114
+ error,
115
+ isConnected,
116
+ result,
117
+ reset: useCallback(() => {
118
+ if (abortControllerRef.current) {
119
+ abortControllerRef.current.abort();
120
+ abortControllerRef.current = null;
121
+ }
122
+ setIsLoading(false);
123
+ setError(null);
124
+ setResult(null);
125
+ }, [])
126
+ };
127
+ }
128
+ function useChat(options = {}) {
129
+ const { initialMessages = [], system } = options;
130
+ const { generate, isLoading, error, reset: resetGerbil } = useGerbil(options);
131
+ const [messages, setMessages] = useState(initialMessages);
132
+ const [input, setInput] = useState("");
133
+ return {
134
+ messages,
135
+ input,
136
+ setInput,
137
+ handleSubmit: useCallback(async (e) => {
138
+ e?.preventDefault();
139
+ if (!input.trim() || isLoading) return;
140
+ const userMessage = {
141
+ role: "user",
142
+ content: input
143
+ };
144
+ setMessages((prev) => [...prev, userMessage]);
145
+ setInput("");
146
+ try {
147
+ const assistantMessage = {
148
+ role: "assistant",
149
+ content: (await generate(input, { system })).text
150
+ };
151
+ setMessages((prev) => [...prev, assistantMessage]);
152
+ } catch {}
153
+ }, [
154
+ input,
155
+ isLoading,
156
+ generate,
157
+ system
158
+ ]),
159
+ isLoading,
160
+ error,
161
+ reset: useCallback(() => {
162
+ setMessages(initialMessages);
163
+ setInput("");
164
+ resetGerbil();
165
+ }, [initialMessages, resetGerbil])
166
+ };
167
+ }
168
+ var react_default = useGerbil;
169
+
170
+ //#endregion
171
+ export { react_default as default, useChat, useGerbil };
172
+ //# sourceMappingURL=react.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.mjs","names":["error","userMessage: Message","assistantMessage: Message"],"sources":["../../src/frameworks/react.ts"],"sourcesContent":["/**\n * Gerbil React Hooks\n *\n * @example\n * ```tsx\n * import { useGerbil } from \"gerbil/react\";\n *\n * function Chat() {\n * const { generate, isLoading, error } = useGerbil();\n *\n * const handleSubmit = async (prompt: string) => {\n * const result = await generate(prompt);\n * console.log(result.text);\n * };\n * }\n * ```\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { GenerateOptions, GenerateResult, GerbilConfig } from \"../core/types.js\";\n\nexport interface UseGerbilOptions extends GerbilConfig {\n /** API endpoint (default: \"/api/gerbil\") */\n endpoint?: string;\n\n /** Auto-connect on mount */\n autoConnect?: boolean;\n}\n\nexport type UseGerbilReturn = {\n /** Generate text */\n generate: (prompt: string, options?: GenerateOptions) => Promise<GenerateResult>;\n\n /** Stream text generation */\n stream: (prompt: string, options?: GenerateOptions) => AsyncGenerator<string, void, unknown>;\n\n /** Current loading state */\n isLoading: boolean;\n\n /** Current error */\n error: Error | null;\n\n /** Whether connected to API */\n isConnected: boolean;\n\n /** Last result */\n result: GenerateResult | null;\n\n /** Reset state */\n reset: () => void;\n};\n\n/**\n * React hook for Gerbil\n */\nexport function useGerbil(options: UseGerbilOptions = {}): UseGerbilReturn {\n const { endpoint = \"/api/gerbil\" } = options;\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [result, setResult] = useState<GenerateResult | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Check connection on mount\n useEffect(() => {\n async function checkConnection() {\n try {\n const res = await fetch(`${endpoint}/info`);\n setIsConnected(res.ok);\n } catch {\n setIsConnected(false);\n }\n }\n checkConnection();\n }, [endpoint]);\n\n const generate = useCallback(\n async (prompt: string, generateOptions: GenerateOptions = {}): Promise<GenerateResult> => {\n setIsLoading(true);\n setError(null);\n\n abortControllerRef.current = new AbortController();\n\n try {\n const res = await fetch(`${endpoint}/generate`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ prompt, ...generateOptions }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n }\n\n const data = await res.json();\n setResult(data);\n return data;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [endpoint],\n );\n\n const stream = useCallback(\n async function* (\n prompt: string,\n generateOptions: GenerateOptions = {},\n ): AsyncGenerator<string, void, unknown> {\n setIsLoading(true);\n setError(null);\n\n abortControllerRef.current = new AbortController();\n\n try {\n const res = await fetch(`${endpoint}/stream`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ prompt, stream: true, ...generateOptions }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n }\n\n const reader = res.body?.getReader();\n if (!reader) {\n throw new Error(\"No response body\");\n }\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n if (data === \"[DONE]\") {\n continue;\n }\n\n try {\n const parsed = JSON.parse(data);\n if (parsed.chunk) {\n yield parsed.chunk;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n abortControllerRef.current = null;\n }\n },\n [endpoint],\n );\n\n const reset = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n setIsLoading(false);\n setError(null);\n setResult(null);\n }, []);\n\n return {\n generate,\n stream,\n isLoading,\n error,\n isConnected,\n result,\n reset,\n };\n}\n\n/**\n * Hook for chat-style interactions\n */\nexport type Message = {\n role: \"user\" | \"assistant\";\n content: string;\n};\n\nexport interface UseChatOptions extends UseGerbilOptions {\n /** Initial messages */\n initialMessages?: Message[];\n\n /** System prompt */\n system?: string;\n}\n\nexport type UseChatReturn = {\n messages: Message[];\n input: string;\n setInput: (input: string) => void;\n handleSubmit: (e?: React.FormEvent) => Promise<void>;\n isLoading: boolean;\n error: Error | null;\n reset: () => void;\n};\n\nexport function useChat(options: UseChatOptions = {}): UseChatReturn {\n const { initialMessages = [], system } = options;\n const { generate, isLoading, error, reset: resetGerbil } = useGerbil(options);\n\n const [messages, setMessages] = useState<Message[]>(initialMessages);\n const [input, setInput] = useState(\"\");\n\n const handleSubmit = useCallback(\n async (e?: React.FormEvent) => {\n e?.preventDefault();\n if (!input.trim() || isLoading) {\n return;\n }\n\n const userMessage: Message = { role: \"user\", content: input };\n setMessages((prev) => [...prev, userMessage]);\n setInput(\"\");\n\n try {\n const result = await generate(input, { system });\n const assistantMessage: Message = {\n role: \"assistant\",\n content: result.text,\n };\n setMessages((prev) => [...prev, assistantMessage]);\n } catch {\n // Error handled by useGerbil\n }\n },\n [input, isLoading, generate, system],\n );\n\n const reset = useCallback(() => {\n setMessages(initialMessages);\n setInput(\"\");\n resetGerbil();\n }, [initialMessages, resetGerbil]);\n\n return {\n messages,\n input,\n setInput,\n handleSubmit,\n isLoading,\n error,\n reset,\n };\n}\n\nexport default useGerbil;\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { s as GerbilConfig } from "../types-BS1N92Jt.mjs";
2
+
3
+ //#region src/frameworks/trpc.d.ts
4
+
5
+ interface GerbilTRPCOptions extends GerbilConfig {}
6
+ /**
7
+ * Create a Gerbil tRPC router
8
+ */
9
+ declare function gerbilRouter(t: any, options?: GerbilTRPCOptions): any;
10
+ //#endregion
11
+ export { GerbilTRPCOptions, gerbilRouter as default, gerbilRouter };
12
+ //# sourceMappingURL=trpc.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trpc.d.mts","names":[],"sources":["../../src/frameworks/trpc.ts"],"sourcesContent":[],"mappings":";;;;UAoBiB,iBAAA,SAA0B;;;;iBAK3B,YAAA,mBAA8B"}
@@ -0,0 +1,80 @@
1
+ import "../models-DKULvhOr.mjs";
2
+ import "../utils-7vXqtq2Q.mjs";
3
+ import { t as Gerbil } from "../gerbil-BfnsFWRE.mjs";
4
+ import { z } from "zod";
5
+
6
+ //#region src/frameworks/trpc.ts
7
+ /**
8
+ * Gerbil tRPC Router
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { initTRPC } from "@trpc/server";
13
+ * import { gerbilRouter } from "gerbil/trpc";
14
+ *
15
+ * const t = initTRPC.create();
16
+ *
17
+ * const appRouter = t.router({
18
+ * ai: gerbilRouter(t, { model: "qwen3-0.6b" }),
19
+ * });
20
+ * ```
21
+ */
22
+ /**
23
+ * Create a Gerbil tRPC router
24
+ */
25
+ function gerbilRouter(t, options = {}) {
26
+ const g = new Gerbil(options);
27
+ let loadPromise = null;
28
+ async function ensureLoaded() {
29
+ if (!(g.isLoaded() || loadPromise)) loadPromise = g.loadModel(options.model || "qwen3-0.6b");
30
+ if (loadPromise) {
31
+ await loadPromise;
32
+ loadPromise = null;
33
+ }
34
+ }
35
+ return t.router({
36
+ generate: t.procedure.input(z.object({
37
+ prompt: z.string(),
38
+ maxTokens: z.number().optional(),
39
+ temperature: z.number().optional(),
40
+ topP: z.number().optional(),
41
+ topK: z.number().optional(),
42
+ system: z.string().optional(),
43
+ thinking: z.boolean().optional()
44
+ })).mutation(async ({ input }) => {
45
+ await ensureLoaded();
46
+ const { prompt, ...opts } = input;
47
+ return g.generate(prompt, opts);
48
+ }),
49
+ stream: t.procedure.input(z.object({
50
+ prompt: z.string(),
51
+ maxTokens: z.number().optional(),
52
+ temperature: z.number().optional(),
53
+ system: z.string().optional(),
54
+ thinking: z.boolean().optional()
55
+ })).subscription(async function* ({ input }) {
56
+ await ensureLoaded();
57
+ const { prompt, ...opts } = input;
58
+ for await (const chunk of g.stream(prompt, opts)) yield chunk;
59
+ }),
60
+ embed: t.procedure.input(z.object({
61
+ text: z.string().optional(),
62
+ texts: z.array(z.string()).optional()
63
+ })).mutation(async ({ input }) => {
64
+ await ensureLoaded();
65
+ if (input.texts) return g.embedBatch(input.texts);
66
+ return g.embed(input.text);
67
+ }),
68
+ info: t.procedure.query(async () => {
69
+ await ensureLoaded();
70
+ return g.getInfo();
71
+ }),
72
+ stats: t.procedure.query(() => g.getStats()),
73
+ models: t.procedure.query(() => Gerbil.listModels())
74
+ });
75
+ }
76
+ var trpc_default = gerbilRouter;
77
+
78
+ //#endregion
79
+ export { trpc_default as default, gerbilRouter };
80
+ //# sourceMappingURL=trpc.mjs.map
@@ -0,0 +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"}