hoomanjs 1.41.1 → 1.42.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 (50) hide show
  1. package/README.md +1 -1
  2. package/dist/acp/acp-agent.js +21 -0
  3. package/dist/acp/acp-agent.js.map +1 -1
  4. package/dist/chat/app.js +10 -1
  5. package/dist/chat/app.js.map +1 -1
  6. package/dist/chat/components/BottomChrome.d.ts +4 -1
  7. package/dist/chat/components/BottomChrome.js +3 -2
  8. package/dist/chat/components/BottomChrome.js.map +1 -1
  9. package/dist/chat/components/DownloadPanel.d.ts +9 -0
  10. package/dist/chat/components/DownloadPanel.js +16 -0
  11. package/dist/chat/components/DownloadPanel.js.map +1 -0
  12. package/dist/cli.js +21 -23
  13. package/dist/cli.js.map +1 -1
  14. package/dist/configure/app.js +30 -2
  15. package/dist/configure/app.js.map +1 -1
  16. package/dist/core/config.d.ts +57 -0
  17. package/dist/core/config.js +25 -5
  18. package/dist/core/config.js.map +1 -1
  19. package/dist/core/mcp/manager.js.map +1 -1
  20. package/dist/core/models/download-progress.d.ts +65 -0
  21. package/dist/core/models/download-progress.js +154 -0
  22. package/dist/core/models/download-progress.js.map +1 -0
  23. package/dist/core/models/index.js +1 -0
  24. package/dist/core/models/index.js.map +1 -1
  25. package/dist/core/models/llama-cpp/gbnf-schema.d.ts +32 -0
  26. package/dist/core/models/llama-cpp/gbnf-schema.js +272 -0
  27. package/dist/core/models/llama-cpp/gbnf-schema.js.map +1 -0
  28. package/dist/core/models/llama-cpp/index.d.ts +8 -0
  29. package/dist/core/models/llama-cpp/index.js +37 -0
  30. package/dist/core/models/llama-cpp/index.js.map +1 -0
  31. package/dist/core/models/llama-cpp/resolve-model.d.ts +28 -0
  32. package/dist/core/models/llama-cpp/resolve-model.js +307 -0
  33. package/dist/core/models/llama-cpp/resolve-model.js.map +1 -0
  34. package/dist/core/models/llama-cpp/strands-llama-cpp.d.ts +40 -0
  35. package/dist/core/models/llama-cpp/strands-llama-cpp.js +422 -0
  36. package/dist/core/models/llama-cpp/strands-llama-cpp.js.map +1 -0
  37. package/dist/core/models/types.d.ts +115 -1
  38. package/dist/core/models/types.js +19 -0
  39. package/dist/core/models/types.js.map +1 -1
  40. package/dist/core/skills/built-in/hooman-config/SKILL.md +21 -5
  41. package/dist/core/skills/built-in/hooman-config/providers.md +2 -0
  42. package/dist/core/utils/logging.d.ts +29 -0
  43. package/dist/core/utils/logging.js +64 -0
  44. package/dist/core/utils/logging.js.map +1 -0
  45. package/dist/daemon/index.js +5 -0
  46. package/dist/daemon/index.js.map +1 -1
  47. package/dist/index.d.ts +2 -0
  48. package/dist/index.js +1 -0
  49. package/dist/index.js.map +1 -1
  50. package/package.json +4 -1
@@ -0,0 +1,422 @@
1
+ import { ContextWindowOverflowError, Model, ModelError, } from "@strands-agents/sdk";
2
+ import { ModelContentBlockDeltaEvent, ModelContentBlockStartEvent, ModelContentBlockStopEvent, ModelMessageStartEvent, ModelMessageStopEvent, ModelMetadataEvent, } from "@strands-agents/sdk";
3
+ import { jsonSchemaToGbnf, pruneOptionalNulls } from "./gbnf-schema.js";
4
+ import { resolveModelFile } from "./resolve-model.js";
5
+ /**
6
+ * Loaded llama.cpp runtimes are expensive (weights in RAM/VRAM), so share them
7
+ * process-wide keyed by resolved GGUF path. Contexts stay per Strands model
8
+ * instance so concurrent agents (e.g. subagents) get independent sequences.
9
+ */
10
+ const llamaRuntimePromises = new Map();
11
+ const loadedModelPromises = new Map();
12
+ function extractSystemText(system) {
13
+ if (system === undefined) {
14
+ return undefined;
15
+ }
16
+ if (typeof system === "string") {
17
+ return system;
18
+ }
19
+ const parts = [];
20
+ for (const block of system) {
21
+ if (block.type === "textBlock") {
22
+ parts.push(block.text);
23
+ }
24
+ }
25
+ const joined = parts.join("\n").trim();
26
+ return joined.length > 0 ? joined : undefined;
27
+ }
28
+ function contentBlockToText(block) {
29
+ if (block.type === "textBlock") {
30
+ return block.text;
31
+ }
32
+ if (block.type === "imageBlock") {
33
+ return "(llama.cpp: image content is not supported by this provider)";
34
+ }
35
+ if (block.type === "videoBlock" || block.type === "documentBlock") {
36
+ return `(llama.cpp: ${block.type} content is not supported by this provider)`;
37
+ }
38
+ return undefined;
39
+ }
40
+ function toolResultToText(block) {
41
+ const parts = [];
42
+ for (const c of block.content) {
43
+ if (c.type === "textBlock") {
44
+ parts.push(c.text);
45
+ }
46
+ else if (c.type === "jsonBlock") {
47
+ parts.push(JSON.stringify(c.json));
48
+ }
49
+ else if (c.type === "imageBlock") {
50
+ parts.push("(llama.cpp: image tool results are not supported)");
51
+ }
52
+ }
53
+ const joined = parts.join("\n");
54
+ if (joined.length > 0) {
55
+ return joined;
56
+ }
57
+ return block.status === "error" ? "(tool error)" : "";
58
+ }
59
+ /**
60
+ * Convert Strands conversation history to node-llama-cpp `ChatHistoryItem[]`.
61
+ * Tool calls are paired with their results (`ChatModelFunctionCall` requires
62
+ * both) by `toolUseId`: the toolUse blocks live on assistant messages and the
63
+ * matching toolResult blocks on the following user message, so results are
64
+ * folded back into the preceding model response.
65
+ */
66
+ function strandsMessagesToHistory(messages, systemText) {
67
+ const history = [];
68
+ if (systemText) {
69
+ history.push({ type: "system", text: systemText });
70
+ }
71
+ const pendingToolUses = new Map();
72
+ const lastModelResponse = () => {
73
+ const last = history.at(-1);
74
+ if (last?.type === "model") {
75
+ return last;
76
+ }
77
+ const created = { type: "model", response: [] };
78
+ history.push(created);
79
+ return created;
80
+ };
81
+ const pushUserText = (text) => {
82
+ const last = history.at(-1);
83
+ if (last?.type === "user") {
84
+ last.text = last.text.length > 0 ? `${last.text}\n${text}` : text;
85
+ }
86
+ else {
87
+ history.push({ type: "user", text });
88
+ }
89
+ };
90
+ for (const msg of messages) {
91
+ for (const block of msg.content) {
92
+ if (msg.role === "assistant") {
93
+ if (block.type === "toolUseBlock") {
94
+ const b = block;
95
+ pendingToolUses.set(b.toolUseId, b);
96
+ continue;
97
+ }
98
+ if (block.type === "reasoningBlock") {
99
+ // Prior turns' chain of thought is not replayed into the context.
100
+ continue;
101
+ }
102
+ const text = contentBlockToText(block);
103
+ if (text !== undefined && text.length > 0) {
104
+ lastModelResponse().response.push(text);
105
+ }
106
+ continue;
107
+ }
108
+ // user role
109
+ if (block.type === "toolResultBlock") {
110
+ const b = block;
111
+ const use = pendingToolUses.get(b.toolUseId);
112
+ pendingToolUses.delete(b.toolUseId);
113
+ const call = {
114
+ type: "functionCall",
115
+ name: use?.name ?? b.toolUseId,
116
+ params: use?.input ?? {},
117
+ result: toolResultToText(b),
118
+ };
119
+ const model = lastModelResponse();
120
+ if (model.response.filter((item) => typeof item !== "string").length === 0) {
121
+ call.startsNewChunk = true;
122
+ }
123
+ model.response.push(call);
124
+ continue;
125
+ }
126
+ const text = contentBlockToText(block);
127
+ if (text !== undefined && text.length > 0) {
128
+ pushUserText(text);
129
+ }
130
+ }
131
+ }
132
+ return history;
133
+ }
134
+ /**
135
+ * Convert Strands tool specs to node-llama-cpp function definitions. Tool
136
+ * inputSchemas are standard JSON Schema (Strands emits them via
137
+ * `z.toJSONSchema`), while node-llama-cpp only accepts its GBNF subset —
138
+ * passing e.g. `anyOf` through unconverted fails generation with
139
+ * `Unknown immutable type undefined`. See `gbnf-schema.ts`.
140
+ */
141
+ function strandsToolsToFunctions(toolSpecs) {
142
+ if (!toolSpecs?.length) {
143
+ return undefined;
144
+ }
145
+ const functions = {};
146
+ for (const spec of toolSpecs) {
147
+ functions[spec.name] = {
148
+ ...(spec.description ? { description: spec.description } : {}),
149
+ ...(spec.inputSchema
150
+ ? { params: jsonSchemaToGbnf(spec.inputSchema) }
151
+ : {}),
152
+ };
153
+ }
154
+ return functions;
155
+ }
156
+ /** Strands {@link Model} backed by in-process llama.cpp via `node-llama-cpp`. */
157
+ export class StrandsLlamaCppModel extends Model {
158
+ config;
159
+ chatPromise;
160
+ context;
161
+ constructor(config) {
162
+ super();
163
+ this.config = { ...config };
164
+ }
165
+ updateConfig(modelConfig) {
166
+ const chatKey = (c) => JSON.stringify([c.modelId, c.gpu, c.contextSize, c.reasoning ?? null]);
167
+ const before = chatKey(this.config);
168
+ this.config = { ...this.config, ...modelConfig };
169
+ if (chatKey(this.config) !== before) {
170
+ // The chat wrapper bakes in reasoning settings and the context bakes in
171
+ // its size, so drop the lazily-built chat/context and rebuild on the
172
+ // next stream call (loaded weights are cached process-wide).
173
+ this.chatPromise = undefined;
174
+ this.context = undefined;
175
+ }
176
+ }
177
+ getConfig() {
178
+ return { ...this.config };
179
+ }
180
+ getChat() {
181
+ this.chatPromise ??= this.initChat();
182
+ return this.chatPromise;
183
+ }
184
+ async initChat() {
185
+ const modelId = this.config.modelId;
186
+ if (!modelId) {
187
+ throw new ModelError("llama.cpp model is not configured");
188
+ }
189
+ const { getLlama, LlamaChat, LlamaLogLevel, resolveChatWrapper } = await import("node-llama-cpp");
190
+ const modelPath = await resolveModelFile(modelId, this.config.hfToken);
191
+ const gpu = this.config.gpu ?? "auto";
192
+ const runtimeKey = JSON.stringify(gpu);
193
+ let llamaPromise = llamaRuntimePromises.get(runtimeKey);
194
+ if (!llamaPromise) {
195
+ // Keep llama.cpp's native logging out of the TUI transcript.
196
+ llamaPromise = getLlama({ gpu, logLevel: LlamaLogLevel.error });
197
+ llamaRuntimePromises.set(runtimeKey, llamaPromise);
198
+ }
199
+ const llama = await llamaPromise;
200
+ let modelPromise = loadedModelPromises.get(modelPath);
201
+ if (!modelPromise) {
202
+ modelPromise = llama.loadModel({ modelPath });
203
+ loadedModelPromises.set(modelPath, modelPromise);
204
+ }
205
+ const model = await modelPromise;
206
+ this.context = await model.createContext({
207
+ ...(this.config.contextSize !== undefined
208
+ ? { contextSize: this.config.contextSize }
209
+ : {}),
210
+ });
211
+ // Reasoning on/off lives in the chat template, so resolve the wrapper
212
+ // explicitly (same auto-detection LlamaChat would do) with per-wrapper
213
+ // thinking settings derived from the shared `reasoning` option.
214
+ const reasoningEnabled = this.config.reasoning !== undefined;
215
+ const effort = this.config.reasoning?.effort;
216
+ const harmonyEffort = effort === "high" || effort === "medium" ? effort : "low";
217
+ const chatWrapper = resolveChatWrapper(model, {
218
+ customWrapperSettings: {
219
+ qwen: { thoughts: reasoningEnabled ? "auto" : "discourage" },
220
+ gemma4: { reasoning: reasoningEnabled },
221
+ harmony: {
222
+ reasoningEffort: reasoningEnabled ? harmonyEffort : "low",
223
+ },
224
+ },
225
+ });
226
+ return new LlamaChat({
227
+ contextSequence: this.context.getSequence(),
228
+ chatWrapper,
229
+ });
230
+ }
231
+ async *stream(messages, options) {
232
+ let chat;
233
+ try {
234
+ chat = await this.getChat();
235
+ }
236
+ catch (e) {
237
+ // Let a failed init (bad model spec, download failure) be retried.
238
+ this.chatPromise = undefined;
239
+ if (e instanceof ModelError) {
240
+ throw e;
241
+ }
242
+ const msg = e instanceof Error ? e.message : String(e);
243
+ throw new ModelError(`llama.cpp initialization failed: ${msg}`, {
244
+ cause: e,
245
+ });
246
+ }
247
+ const systemText = extractSystemText(options?.systemPrompt);
248
+ const history = strandsMessagesToHistory(messages, systemText);
249
+ if (history.at(-1)?.type === "user") {
250
+ history.push({ type: "model", response: [] });
251
+ }
252
+ const functions = strandsToolsToFunctions(options?.toolSpecs);
253
+ const originalSchemas = new Map((options?.toolSpecs ?? []).map((spec) => [spec.name, spec.inputSchema]));
254
+ yield new ModelMessageStartEvent({
255
+ type: "modelMessageStartEvent",
256
+ role: "assistant",
257
+ });
258
+ const queue = [];
259
+ let wake;
260
+ const push = (event) => {
261
+ queue.push(event);
262
+ wake?.();
263
+ };
264
+ let textBlockOpen = false;
265
+ let reasoningBlockOpen = false;
266
+ const closeOpenBlocks = () => {
267
+ if (reasoningBlockOpen) {
268
+ push(new ModelContentBlockStopEvent({
269
+ type: "modelContentBlockStopEvent",
270
+ }));
271
+ reasoningBlockOpen = false;
272
+ }
273
+ if (textBlockOpen) {
274
+ push(new ModelContentBlockStopEvent({
275
+ type: "modelContentBlockStopEvent",
276
+ }));
277
+ textBlockOpen = false;
278
+ }
279
+ };
280
+ const meterBefore = {
281
+ input: chat.sequence.tokenMeter.usedInputTokens,
282
+ output: chat.sequence.tokenMeter.usedOutputTokens,
283
+ };
284
+ // Budget 0 closes any thought segment as soon as it opens, covering models
285
+ // whose template ignores the wrapper's discourage setting (e.g. DeepSeek
286
+ // R1 distills that always think).
287
+ const thoughtBudget = this.config.reasoning === undefined ? 0 : this.config.thoughtBudgetTokens;
288
+ let done = false;
289
+ let failure;
290
+ const generation = chat
291
+ .generateResponse(history, {
292
+ ...(functions ? { functions } : {}),
293
+ ...(this.config.maxTokens !== undefined
294
+ ? { maxTokens: this.config.maxTokens }
295
+ : {}),
296
+ ...(this.config.temperature !== undefined
297
+ ? { temperature: this.config.temperature }
298
+ : {}),
299
+ ...(this.config.topP !== undefined ? { topP: this.config.topP } : {}),
300
+ ...(thoughtBudget !== undefined
301
+ ? { budgets: { thoughtTokens: thoughtBudget } }
302
+ : {}),
303
+ onResponseChunk: (chunk) => {
304
+ if (chunk.type === "segment") {
305
+ if (chunk.segmentType !== "thought" || chunk.text.length === 0) {
306
+ return;
307
+ }
308
+ if (textBlockOpen) {
309
+ push(new ModelContentBlockStopEvent({
310
+ type: "modelContentBlockStopEvent",
311
+ }));
312
+ textBlockOpen = false;
313
+ }
314
+ if (!reasoningBlockOpen) {
315
+ push(new ModelContentBlockStartEvent({
316
+ type: "modelContentBlockStartEvent",
317
+ }));
318
+ reasoningBlockOpen = true;
319
+ }
320
+ push(new ModelContentBlockDeltaEvent({
321
+ type: "modelContentBlockDeltaEvent",
322
+ delta: { type: "reasoningContentDelta", text: chunk.text },
323
+ }));
324
+ return;
325
+ }
326
+ if (chunk.text.length === 0) {
327
+ return;
328
+ }
329
+ if (reasoningBlockOpen) {
330
+ push(new ModelContentBlockStopEvent({
331
+ type: "modelContentBlockStopEvent",
332
+ }));
333
+ reasoningBlockOpen = false;
334
+ }
335
+ if (!textBlockOpen) {
336
+ push(new ModelContentBlockStartEvent({
337
+ type: "modelContentBlockStartEvent",
338
+ }));
339
+ textBlockOpen = true;
340
+ }
341
+ push(new ModelContentBlockDeltaEvent({
342
+ type: "modelContentBlockDeltaEvent",
343
+ delta: { type: "textDelta", text: chunk.text },
344
+ }));
345
+ },
346
+ })
347
+ .then((res) => {
348
+ closeOpenBlocks();
349
+ const functionCalls = res.functionCalls ?? [];
350
+ let toolIndex = 0;
351
+ for (const call of functionCalls) {
352
+ const name = call.functionName;
353
+ const toolUseId = functionCalls.length > 1 ? `${name}_${toolIndex}` : name;
354
+ toolIndex += 1;
355
+ // Drop the `null` markers the GBNF grammar uses for optional keys
356
+ // (see gbnf-schema.ts) so tools receive clean params.
357
+ const params = pruneOptionalNulls(call.params ?? {}, originalSchemas.get(name));
358
+ push(new ModelContentBlockStartEvent({
359
+ type: "modelContentBlockStartEvent",
360
+ start: { type: "toolUseStart", name, toolUseId },
361
+ }));
362
+ push(new ModelContentBlockDeltaEvent({
363
+ type: "modelContentBlockDeltaEvent",
364
+ delta: {
365
+ type: "toolUseInputDelta",
366
+ input: JSON.stringify(params ?? {}),
367
+ },
368
+ }));
369
+ push(new ModelContentBlockStopEvent({
370
+ type: "modelContentBlockStopEvent",
371
+ }));
372
+ }
373
+ const stopReason = functionCalls.length > 0
374
+ ? "toolUse"
375
+ : res.metadata.stopReason === "maxTokens"
376
+ ? "maxTokens"
377
+ : "endTurn";
378
+ push(new ModelMessageStopEvent({
379
+ type: "modelMessageStopEvent",
380
+ stopReason,
381
+ }));
382
+ const inputTokens = chat.sequence.tokenMeter.usedInputTokens - meterBefore.input;
383
+ const outputTokens = chat.sequence.tokenMeter.usedOutputTokens - meterBefore.output;
384
+ push(new ModelMetadataEvent({
385
+ type: "modelMetadataEvent",
386
+ usage: {
387
+ inputTokens,
388
+ outputTokens,
389
+ totalTokens: inputTokens + outputTokens,
390
+ },
391
+ }));
392
+ })
393
+ .catch((e) => {
394
+ failure = e;
395
+ })
396
+ .finally(() => {
397
+ done = true;
398
+ wake?.();
399
+ });
400
+ while (!done || queue.length > 0) {
401
+ if (queue.length > 0) {
402
+ yield queue.shift();
403
+ continue;
404
+ }
405
+ await new Promise((resolve) => {
406
+ wake = resolve;
407
+ });
408
+ wake = undefined;
409
+ }
410
+ await generation;
411
+ if (failure !== undefined) {
412
+ const msg = failure instanceof Error ? failure.message : String(failure);
413
+ if (msg.toLowerCase().includes("context size")) {
414
+ throw new ContextWindowOverflowError(msg);
415
+ }
416
+ throw new ModelError(`llama.cpp generation error: ${msg}`, {
417
+ cause: failure,
418
+ });
419
+ }
420
+ }
421
+ }
422
+ //# sourceMappingURL=strands-llama-cpp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strands-llama-cpp.js","sourceRoot":"","sources":["../../../../src/core/models/llama-cpp/strands-llama-cpp.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export declare enum LlmProvider {
5
5
  Bedrock = "bedrock",
6
6
  Google = "google",
7
7
  Groq = "groq",
8
+ LlamaCpp = "llama-cpp",
8
9
  Minimax = "minimax",
9
10
  Moonshot = "moonshot",
10
11
  Ollama = "ollama",
@@ -130,6 +131,32 @@ export type GroqProviderOptions = {
130
131
  */
131
132
  reasoning?: ReasoningOptions;
132
133
  };
134
+ export type LlamaCppProviderOptions = {
135
+ /**
136
+ * Hugging Face access token used when downloading GGUF weights from the Hub
137
+ * (gated/private repos). Falls back to the `HF_TOKEN` env var when unset.
138
+ */
139
+ hfToken?: string;
140
+ /**
141
+ * GPU backend forwarded to node-llama-cpp's `getLlama` (default `"auto"`).
142
+ * Set `false` to force CPU-only inference.
143
+ */
144
+ gpu?: "auto" | "metal" | "cuda" | "vulkan" | false;
145
+ /**
146
+ * Context size in tokens for the llama.cpp context. When omitted,
147
+ * node-llama-cpp adapts it to the model's training context and free memory.
148
+ */
149
+ contextSize?: number;
150
+ /**
151
+ * Reasoning controls. Providing `reasoning` enables thinking: the chat
152
+ * template is configured to allow thought segments (Qwen `thoughts: "auto"`,
153
+ * Gemma 4 `reasoning: true`, gpt-oss/Harmony native reasoning-effort) and
154
+ * `effort` caps thought tokens via node-llama-cpp's thought budget
155
+ * (1024/2048/4096/8192, default `medium`). Omit `reasoning` to disable
156
+ * thinking (templates discourage thoughts, thought budget forced to 0).
157
+ */
158
+ reasoning?: ReasoningOptions;
159
+ };
133
160
  export type MinimaxProviderOptions = {
134
161
  apiKey?: string;
135
162
  baseURL?: string;
@@ -211,7 +238,7 @@ export type XaiProviderOptions = {
211
238
  */
212
239
  reasoning?: ReasoningOptions;
213
240
  };
214
- export type ProviderOptions = AnthropicProviderOptions | AzureProviderOptions | BedrockProviderOptions | GoogleProviderOptions | GroqProviderOptions | MinimaxProviderOptions | MoonshotProviderOptions | OllamaProviderOptions | OpenAIProviderOptions | OpenRouterProviderOptions | XaiProviderOptions;
241
+ export type ProviderOptions = AnthropicProviderOptions | AzureProviderOptions | BedrockProviderOptions | GoogleProviderOptions | GroqProviderOptions | LlamaCppProviderOptions | MinimaxProviderOptions | MoonshotProviderOptions | OllamaProviderOptions | OpenAIProviderOptions | OpenRouterProviderOptions | XaiProviderOptions;
215
242
  export declare const OpenAIApiSchema: z.ZodEnum<{
216
243
  chat: "chat";
217
244
  responses: "responses";
@@ -387,6 +414,34 @@ export declare const GroqProviderOptionsSchema: z.ZodObject<{
387
414
  }>>;
388
415
  }, z.core.$strict>>;
389
416
  }, z.core.$strict>;
417
+ export declare const LlamaCppProviderOptionsSchema: z.ZodObject<{
418
+ hfToken: z.ZodOptional<z.ZodString>;
419
+ gpu: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
420
+ auto: "auto";
421
+ metal: "metal";
422
+ cuda: "cuda";
423
+ vulkan: "vulkan";
424
+ }>, z.ZodLiteral<false>]>>;
425
+ contextSize: z.ZodOptional<z.ZodNumber>;
426
+ reasoning: z.ZodOptional<z.ZodObject<{
427
+ effort: z.ZodOptional<z.ZodEnum<{
428
+ minimal: "minimal";
429
+ low: "low";
430
+ medium: "medium";
431
+ high: "high";
432
+ }>>;
433
+ summary: z.ZodOptional<z.ZodEnum<{
434
+ auto: "auto";
435
+ concise: "concise";
436
+ detailed: "detailed";
437
+ none: "none";
438
+ }>>;
439
+ display: z.ZodOptional<z.ZodEnum<{
440
+ summarized: "summarized";
441
+ omitted: "omitted";
442
+ }>>;
443
+ }, z.core.$strict>>;
444
+ }, z.core.$strict>;
390
445
  export declare const MinimaxProviderOptionsSchema: z.ZodObject<{
391
446
  apiKey: z.ZodOptional<z.ZodString>;
392
447
  baseURL: z.ZodOptional<z.ZodString>;
@@ -646,6 +701,34 @@ export declare const ProviderOptionsSchemas: {
646
701
  }>>;
647
702
  }, z.core.$strict>>;
648
703
  }, z.core.$strict>;
704
+ readonly "llama-cpp": z.ZodObject<{
705
+ hfToken: z.ZodOptional<z.ZodString>;
706
+ gpu: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
707
+ auto: "auto";
708
+ metal: "metal";
709
+ cuda: "cuda";
710
+ vulkan: "vulkan";
711
+ }>, z.ZodLiteral<false>]>>;
712
+ contextSize: z.ZodOptional<z.ZodNumber>;
713
+ reasoning: z.ZodOptional<z.ZodObject<{
714
+ effort: z.ZodOptional<z.ZodEnum<{
715
+ minimal: "minimal";
716
+ low: "low";
717
+ medium: "medium";
718
+ high: "high";
719
+ }>>;
720
+ summary: z.ZodOptional<z.ZodEnum<{
721
+ auto: "auto";
722
+ concise: "concise";
723
+ detailed: "detailed";
724
+ none: "none";
725
+ }>>;
726
+ display: z.ZodOptional<z.ZodEnum<{
727
+ summarized: "summarized";
728
+ omitted: "omitted";
729
+ }>>;
730
+ }, z.core.$strict>>;
731
+ }, z.core.$strict>;
649
732
  readonly minimax: z.ZodObject<{
650
733
  apiKey: z.ZodOptional<z.ZodString>;
651
734
  baseURL: z.ZodOptional<z.ZodString>;
@@ -920,6 +1003,37 @@ export declare const NamedProviderConfigSchema: z.ZodDiscriminatedUnion<[z.ZodOb
920
1003
  }>>;
921
1004
  }, z.core.$strict>>;
922
1005
  }, z.core.$strict>;
1006
+ }, z.core.$strict>, z.ZodObject<{
1007
+ name: z.ZodString;
1008
+ provider: z.ZodLiteral<LlmProvider.LlamaCpp>;
1009
+ options: z.ZodObject<{
1010
+ hfToken: z.ZodOptional<z.ZodString>;
1011
+ gpu: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
1012
+ auto: "auto";
1013
+ metal: "metal";
1014
+ cuda: "cuda";
1015
+ vulkan: "vulkan";
1016
+ }>, z.ZodLiteral<false>]>>;
1017
+ contextSize: z.ZodOptional<z.ZodNumber>;
1018
+ reasoning: z.ZodOptional<z.ZodObject<{
1019
+ effort: z.ZodOptional<z.ZodEnum<{
1020
+ minimal: "minimal";
1021
+ low: "low";
1022
+ medium: "medium";
1023
+ high: "high";
1024
+ }>>;
1025
+ summary: z.ZodOptional<z.ZodEnum<{
1026
+ auto: "auto";
1027
+ concise: "concise";
1028
+ detailed: "detailed";
1029
+ none: "none";
1030
+ }>>;
1031
+ display: z.ZodOptional<z.ZodEnum<{
1032
+ summarized: "summarized";
1033
+ omitted: "omitted";
1034
+ }>>;
1035
+ }, z.core.$strict>>;
1036
+ }, z.core.$strict>;
923
1037
  }, z.core.$strict>, z.ZodObject<{
924
1038
  name: z.ZodString;
925
1039
  provider: z.ZodLiteral<LlmProvider.Minimax>;
@@ -6,6 +6,7 @@ export var LlmProvider;
6
6
  LlmProvider["Bedrock"] = "bedrock";
7
7
  LlmProvider["Google"] = "google";
8
8
  LlmProvider["Groq"] = "groq";
9
+ LlmProvider["LlamaCpp"] = "llama-cpp";
9
10
  LlmProvider["Minimax"] = "minimax";
10
11
  LlmProvider["Moonshot"] = "moonshot";
11
12
  LlmProvider["Ollama"] = "ollama";
@@ -121,6 +122,16 @@ export const GroqProviderOptionsSchema = z
121
122
  reasoning: ReasoningOptionsSchema.optional(),
122
123
  })
123
124
  .strict();
125
+ export const LlamaCppProviderOptionsSchema = z
126
+ .object({
127
+ hfToken: NonEmptyStringSchema.optional(),
128
+ gpu: z
129
+ .union([z.enum(["auto", "metal", "cuda", "vulkan"]), z.literal(false)])
130
+ .optional(),
131
+ contextSize: z.number().int().positive().optional(),
132
+ reasoning: ReasoningOptionsSchema.optional(),
133
+ })
134
+ .strict();
124
135
  export const MinimaxProviderOptionsSchema = z
125
136
  .object({
126
137
  apiKey: NonEmptyStringSchema.optional(),
@@ -174,6 +185,7 @@ export const ProviderOptionsSchemas = {
174
185
  [LlmProvider.Bedrock]: BedrockProviderOptionsSchema,
175
186
  [LlmProvider.Google]: GoogleProviderOptionsSchema,
176
187
  [LlmProvider.Groq]: GroqProviderOptionsSchema,
188
+ [LlmProvider.LlamaCpp]: LlamaCppProviderOptionsSchema,
177
189
  [LlmProvider.Minimax]: MinimaxProviderOptionsSchema,
178
190
  [LlmProvider.Moonshot]: MoonshotProviderOptionsSchema,
179
191
  [LlmProvider.Ollama]: OllamaProviderOptionsSchema,
@@ -217,6 +229,13 @@ export const NamedProviderConfigSchema = z.discriminatedUnion("provider", [
217
229
  options: GroqProviderOptionsSchema,
218
230
  })
219
231
  .strict(),
232
+ z
233
+ .object({
234
+ name: NonEmptyStringSchema,
235
+ provider: z.literal(LlmProvider.LlamaCpp),
236
+ options: LlamaCppProviderOptionsSchema,
237
+ })
238
+ .strict(),
220
239
  z
221
240
  .object({
222
241
  name: NonEmptyStringSchema,