hoomanjs 1.41.1 → 1.42.1

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 (54) hide show
  1. package/README.md +3 -3
  2. package/dist/acp/acp-agent.js +23 -2
  3. package/dist/acp/acp-agent.js.map +1 -1
  4. package/dist/chat/app.js +11 -2
  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 +37 -2
  15. package/dist/configure/app.js.map +1 -1
  16. package/dist/core/config.d.ts +60 -0
  17. package/dist/core/config.js +28 -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 +124 -1
  38. package/dist/core/models/types.js +32 -0
  39. package/dist/core/models/types.js.map +1 -1
  40. package/dist/core/skills/built-in/hooman-config/SKILL.md +26 -7
  41. package/dist/core/skills/built-in/hooman-config/providers.md +3 -0
  42. package/dist/core/utils/billing.d.ts +7 -1
  43. package/dist/core/utils/billing.js +21 -3
  44. package/dist/core/utils/billing.js.map +1 -1
  45. package/dist/core/utils/logging.d.ts +29 -0
  46. package/dist/core/utils/logging.js +64 -0
  47. package/dist/core/utils/logging.js.map +1 -0
  48. package/dist/core/utils/reasoning-effort.d.ts +1 -0
  49. package/dist/daemon/index.js +5 -0
  50. package/dist/daemon/index.js.map +1 -1
  51. package/dist/index.d.ts +2 -0
  52. package/dist/index.js +1 -0
  53. package/dist/index.js.map +1 -1
  54. 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.context, 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.context !== undefined
208
+ ? { contextSize: this.config.context }
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",
@@ -48,6 +49,12 @@ export type LlmOptions = {
48
49
  model: string;
49
50
  temperature?: number;
50
51
  maxTokens?: number;
52
+ /**
53
+ * Context size in tokens for this model. Only honored by the `llama-cpp`
54
+ * provider (overrides the provider-level `context`); other providers
55
+ * ignore it.
56
+ */
57
+ context?: number;
51
58
  };
52
59
  /**
53
60
  * Per-million-token USD prices for a model. `cache/m` is the cached-input
@@ -130,6 +137,33 @@ export type GroqProviderOptions = {
130
137
  */
131
138
  reasoning?: ReasoningOptions;
132
139
  };
140
+ export type LlamaCppProviderOptions = {
141
+ /**
142
+ * Hugging Face access token used when downloading GGUF weights from the Hub
143
+ * (gated/private repos). Falls back to the `HF_TOKEN` env var when unset.
144
+ */
145
+ hfToken?: string;
146
+ /**
147
+ * GPU backend forwarded to node-llama-cpp's `getLlama`. Defaults to
148
+ * `"auto"` when unset. Set `false` to force CPU-only inference.
149
+ */
150
+ gpu?: "auto" | "metal" | "cuda" | "vulkan" | false;
151
+ /**
152
+ * Context size in tokens for the llama.cpp context. Per-LLM
153
+ * `options.context` takes precedence; when both are omitted,
154
+ * node-llama-cpp adapts it to the model's training context and free memory.
155
+ */
156
+ context?: number;
157
+ /**
158
+ * Reasoning controls. Providing `reasoning` enables thinking: the chat
159
+ * template is configured to allow thought segments (Qwen `thoughts: "auto"`,
160
+ * Gemma 4 `reasoning: true`, gpt-oss/Harmony native reasoning-effort) and
161
+ * `effort` caps thought tokens via node-llama-cpp's thought budget
162
+ * (1024/2048/4096/8192, default `medium`). Omit `reasoning` to disable
163
+ * thinking (templates discourage thoughts, thought budget forced to 0).
164
+ */
165
+ reasoning?: ReasoningOptions;
166
+ };
133
167
  export type MinimaxProviderOptions = {
134
168
  apiKey?: string;
135
169
  baseURL?: string;
@@ -211,7 +245,7 @@ export type XaiProviderOptions = {
211
245
  */
212
246
  reasoning?: ReasoningOptions;
213
247
  };
214
- export type ProviderOptions = AnthropicProviderOptions | AzureProviderOptions | BedrockProviderOptions | GoogleProviderOptions | GroqProviderOptions | MinimaxProviderOptions | MoonshotProviderOptions | OllamaProviderOptions | OpenAIProviderOptions | OpenRouterProviderOptions | XaiProviderOptions;
248
+ export type ProviderOptions = AnthropicProviderOptions | AzureProviderOptions | BedrockProviderOptions | GoogleProviderOptions | GroqProviderOptions | LlamaCppProviderOptions | MinimaxProviderOptions | MoonshotProviderOptions | OllamaProviderOptions | OpenAIProviderOptions | OpenRouterProviderOptions | XaiProviderOptions;
215
249
  export declare const OpenAIApiSchema: z.ZodEnum<{
216
250
  chat: "chat";
217
251
  responses: "responses";
@@ -254,6 +288,7 @@ export declare const LlmOptionsSchema: z.ZodObject<{
254
288
  model: z.ZodString;
255
289
  temperature: z.ZodOptional<z.ZodNumber>;
256
290
  maxTokens: z.ZodOptional<z.ZodNumber>;
291
+ context: z.ZodOptional<z.ZodNumber>;
257
292
  }, z.core.$strict>;
258
293
  export declare const LlmBillingCostsSchema: z.ZodObject<{
259
294
  "input/m": z.ZodNumber;
@@ -387,6 +422,34 @@ export declare const GroqProviderOptionsSchema: z.ZodObject<{
387
422
  }>>;
388
423
  }, z.core.$strict>>;
389
424
  }, z.core.$strict>;
425
+ export declare const LlamaCppProviderOptionsSchema: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodObject<{
426
+ hfToken: z.ZodOptional<z.ZodString>;
427
+ gpu: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
428
+ auto: "auto";
429
+ metal: "metal";
430
+ cuda: "cuda";
431
+ vulkan: "vulkan";
432
+ }>, z.ZodLiteral<false>]>>;
433
+ context: z.ZodOptional<z.ZodNumber>;
434
+ reasoning: z.ZodOptional<z.ZodObject<{
435
+ effort: z.ZodOptional<z.ZodEnum<{
436
+ minimal: "minimal";
437
+ low: "low";
438
+ medium: "medium";
439
+ high: "high";
440
+ }>>;
441
+ summary: z.ZodOptional<z.ZodEnum<{
442
+ auto: "auto";
443
+ concise: "concise";
444
+ detailed: "detailed";
445
+ none: "none";
446
+ }>>;
447
+ display: z.ZodOptional<z.ZodEnum<{
448
+ summarized: "summarized";
449
+ omitted: "omitted";
450
+ }>>;
451
+ }, z.core.$strict>>;
452
+ }, z.core.$strict>>;
390
453
  export declare const MinimaxProviderOptionsSchema: z.ZodObject<{
391
454
  apiKey: z.ZodOptional<z.ZodString>;
392
455
  baseURL: z.ZodOptional<z.ZodString>;
@@ -646,6 +709,34 @@ export declare const ProviderOptionsSchemas: {
646
709
  }>>;
647
710
  }, z.core.$strict>>;
648
711
  }, z.core.$strict>;
712
+ readonly "llama-cpp": z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodObject<{
713
+ hfToken: z.ZodOptional<z.ZodString>;
714
+ gpu: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
715
+ auto: "auto";
716
+ metal: "metal";
717
+ cuda: "cuda";
718
+ vulkan: "vulkan";
719
+ }>, z.ZodLiteral<false>]>>;
720
+ context: z.ZodOptional<z.ZodNumber>;
721
+ reasoning: z.ZodOptional<z.ZodObject<{
722
+ effort: z.ZodOptional<z.ZodEnum<{
723
+ minimal: "minimal";
724
+ low: "low";
725
+ medium: "medium";
726
+ high: "high";
727
+ }>>;
728
+ summary: z.ZodOptional<z.ZodEnum<{
729
+ auto: "auto";
730
+ concise: "concise";
731
+ detailed: "detailed";
732
+ none: "none";
733
+ }>>;
734
+ display: z.ZodOptional<z.ZodEnum<{
735
+ summarized: "summarized";
736
+ omitted: "omitted";
737
+ }>>;
738
+ }, z.core.$strict>>;
739
+ }, z.core.$strict>>;
649
740
  readonly minimax: z.ZodObject<{
650
741
  apiKey: z.ZodOptional<z.ZodString>;
651
742
  baseURL: z.ZodOptional<z.ZodString>;
@@ -920,6 +1011,37 @@ export declare const NamedProviderConfigSchema: z.ZodDiscriminatedUnion<[z.ZodOb
920
1011
  }>>;
921
1012
  }, z.core.$strict>>;
922
1013
  }, z.core.$strict>;
1014
+ }, z.core.$strict>, z.ZodObject<{
1015
+ name: z.ZodString;
1016
+ provider: z.ZodLiteral<LlmProvider.LlamaCpp>;
1017
+ options: z.ZodPipe<z.ZodTransform<unknown, unknown>, z.ZodObject<{
1018
+ hfToken: z.ZodOptional<z.ZodString>;
1019
+ gpu: z.ZodOptional<z.ZodUnion<readonly [z.ZodEnum<{
1020
+ auto: "auto";
1021
+ metal: "metal";
1022
+ cuda: "cuda";
1023
+ vulkan: "vulkan";
1024
+ }>, z.ZodLiteral<false>]>>;
1025
+ context: z.ZodOptional<z.ZodNumber>;
1026
+ reasoning: z.ZodOptional<z.ZodObject<{
1027
+ effort: z.ZodOptional<z.ZodEnum<{
1028
+ minimal: "minimal";
1029
+ low: "low";
1030
+ medium: "medium";
1031
+ high: "high";
1032
+ }>>;
1033
+ summary: z.ZodOptional<z.ZodEnum<{
1034
+ auto: "auto";
1035
+ concise: "concise";
1036
+ detailed: "detailed";
1037
+ none: "none";
1038
+ }>>;
1039
+ display: z.ZodOptional<z.ZodEnum<{
1040
+ summarized: "summarized";
1041
+ omitted: "omitted";
1042
+ }>>;
1043
+ }, z.core.$strict>>;
1044
+ }, z.core.$strict>>;
923
1045
  }, z.core.$strict>, z.ZodObject<{
924
1046
  name: z.ZodString;
925
1047
  provider: z.ZodLiteral<LlmProvider.Minimax>;
@@ -1086,6 +1208,7 @@ export declare const NamedLlmConfigSchema: z.ZodObject<{
1086
1208
  model: z.ZodString;
1087
1209
  temperature: z.ZodOptional<z.ZodNumber>;
1088
1210
  maxTokens: z.ZodOptional<z.ZodNumber>;
1211
+ context: z.ZodOptional<z.ZodNumber>;
1089
1212
  }, z.core.$strict>;
1090
1213
  billing: z.ZodOptional<z.ZodNullable<z.ZodObject<{
1091
1214
  name: z.ZodString;