@ax-llm/ax 21.0.3 → 21.0.5

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/index.d.cts CHANGED
@@ -2427,6 +2427,7 @@ declare class AxBaseAI<TModel, TEmbedModel, TChatRequest, TEmbedRequest, TChatRe
2427
2427
  private calculatePercentile;
2428
2428
  private updateLatencyMetrics;
2429
2429
  private updateErrorMetrics;
2430
+ private recordEstimatedCost;
2430
2431
  private recordTokenUsage;
2431
2432
  private calculateRequestSize;
2432
2433
  private calculateResponseSize;
@@ -2535,6 +2536,9 @@ type AxModelInfo = {
2535
2536
  maxTokens?: number;
2536
2537
  isExpensive?: boolean;
2537
2538
  contextWindow?: number;
2539
+ isDeprecated?: boolean;
2540
+ /** ISO date (YYYY-MM-DD) the upstream provider will stop serving this model. */
2541
+ deprecatedOn?: string;
2538
2542
  };
2539
2543
  type AxTokenUsage = {
2540
2544
  promptTokens: number;
@@ -2755,6 +2759,10 @@ type AxCitation = {
2755
2759
  license?: string;
2756
2760
  publicationDate?: string;
2757
2761
  snippet?: string;
2762
+ /** File Search multimodal (Gemini, May 2026): media chunk id. */
2763
+ mediaId?: string;
2764
+ /** File Search multimodal (Gemini, May 2026): page numbers cited within the source. */
2765
+ pageNumbers?: number[];
2758
2766
  };
2759
2767
  type AxModelUsage = {
2760
2768
  ai: string;
@@ -4305,9 +4313,9 @@ declare class AxSignature<_TInput extends Record<string, any> = Record<string, a
4305
4313
  declare const promptTemplates: {
4306
4314
  readonly 'dsp/dspy.md': "<identity>\n{{ identityText }}\n</identity>{{ if hasFunctions }}\n\n<available_functions>\n**Available Functions**: You can call the following functions to complete the task:\n\n{{ functionsList }}\n\n## Function Call Instructions\n- Complete the task, using the functions defined earlier in this prompt.\n- Output fields should only be generated after all functions have been called.\n- Use the function results to generate the output fields.\n</available_functions>{{ /if }}\n\n<input_fields>\n{{ inputFieldsSection }}\n</input_fields>{{ if hasOutputFields }}\n\n<output_fields>\n{{ outputFieldsSection }}\n</output_fields>{{ /if }}\n{{ if hasTaskDefinition }}\n\n<task_definition>\n{{ taskDefinitionText }}\n</task_definition>{{ /if }}\n\n<formatting_rules>\n{{ if hasStructuredOutputFunction }}\nReturn the complete output by calling `{{ structuredOutputFunctionName }}`.\n{{ else }}{{ if hasComplexFields }}\nReturn valid JSON matching <output_fields>.\n{{ else }}\nReturn one `field name: value` pair per line for the required output fields only.\n{{ /if }}{{ /if }}Above rules override later instructions.\n\n</formatting_rules>\n{{ if hasExampleDemonstrations }}\n\n## Example Demonstrations\nThe following User/Assistant turns are examples only until --- END OF EXAMPLES ---, not context for the current task.\n{{ /if }}\n";
4307
4315
  readonly 'dsp/example-separator.md': "--- END OF EXAMPLES ---\nThe examples above were for training purposes only. Please ignore any specific entities or facts mentioned in them.\n\nREAL USER QUERY:\n";
4308
- readonly 'rlm/distiller.md': "## Distiller\n\nYou (`distiller`) read the available context and forward an actionable request to the downstream **executor** stage (which has the tools shell, file system, agent functions, etc.). You do not execute the task yourself.\n\nCall `final(request, evidence)` to forward. Expand the user's original task with facts from context so the request is clear and complete; put exact inputs (paths, ids, selected records, constraints) in `evidence`, or `{}` if context has nothing to narrow. Resolve follow-ups against prior conversation. Never refuse with \"I have no tools\" — forwarding *is* the response. Use `askClarification` only when genuinely blocked by ambiguity.\n\nThe JS runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\n\n### Context Fields\n\nContext fields are available as globals (in the REPL) on the `inputs` object:\n{{ contextVarList }}\n\n### Available Functions\n\n{{ primitivesList }}\n{{ if memoriesMode }}\n\n### Memories\n\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded. Scan it before deciding what to do. If you need more, call `await recall(['…', '…'])` — matched memories are appended to `inputs.memories` for the next turn (and forwarded to the executor).\n{{ /if }}\n\n### How to Work\n\n- **Skip exploration when context has nothing to narrow** (direct action request, or schema is already known) — forward on turn 1 with `final(request, {})`.\n- **When narrowing**: probe shape, narrow with JS, extract. Don't dump raw data. Don't repeat probes already in the Action Log.\n- **Use JS** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret a narrowed slice — never pass raw `inputs.*` to it.\n- `console.log` to inspect; capture awaited results into variables (return values aren't auto-visible). Multiple `console.log`s per turn is fine.\n\n```js\nconst narrowed = inputs.emails\n .filter(e => e.subject.toLowerCase().includes('refund'))\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\n\nconst interpretation = await llmQuery([{\n query: 'Classify each as billing_dispute | unauthorized_charge | other. JSON list.',\n context: { emails: narrowed }\n}]);\nconsole.log(interpretation);\n```\n\n### Output Contract\n\nThe `Javascript Code` field value must be runnable JavaScript only. Do not put prose or plain labels like `task:` / `evidence:` inside the value. Never combine `console.log` with `final()` or `askClarification()` in the same turn.\n\nValid completion turns:\n\n```js\nawait final(\"Use the matched emails to answer the user's question\", { matchedEmails });\n```\n\n```js\n// Passthrough — user asked for an action and there's nothing in context to narrow.\nawait final(\"Run the shell command `ls -la` and return its output verbatim\", {});\n```\n\n```js\nawait askClarification(\"Which context should I inspect?\");\n```\n\n## JavaScript Runtime Usage Instructions\n{{ runtimeUsageInstructions }}\n";
4309
- readonly 'rlm/executor.md': "## Executor\n\nYou (`executor`) are the task-execution stage in a two-stage pipeline. Your ONLY job is to write JavaScript code that runs in the JS runtime (REPL) to complete tasks using the tools available to you. A separate (`responder`) agent downstream synthesizes the final answer.\n\nThe JS runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\n\n### Executor Request & Distilled Context\n\nThe prior distiller stage produced two extra inputs:\n\n- `inputs.executorRequest` — an expanded request describing what this stage should complete.\n- `inputs.distilledContext` — pre-distilled evidence the distiller selected for this task.\n\nRead `executorRequest`, then read `distilledContext` for the evidence selected by the distiller. Raw context fields are not available in this stage. If the request needs information or effects that your available functions can provide, use those functions. If the distilled evidence is sufficient, finish directly with `final(...)`. Call `askClarification(...)` only when the missing information cannot be obtained programmatically.\n\n### Available Functions\n\n{{ primitivesList }}\n\n{{ functionsList }}\n{{ if discoveryMode }}\n\n{{ if hasModules }}\n### Available Modules\n{{ modulesList }}\n{{ /if }}\n{{ if hasDiscoveredDocs }}\n### Discovered Tool Docs\n\nThese were fetched this run — use them directly. Only re-run discovery for modules/functions not listed here.\n\n{{ discoveredDocsMarkdown }}\n{{ /if }}\n{{ /if }}\n{{ if hasSkills }}\n### Loaded Skills\n\nThese skill guides were loaded via `consult(...)` — apply them directly. Call `consult([...])` to load additional skills as needed.\n\n{{ skillsMarkdown }}\n{{ /if }}\n{{ if memoriesMode }}\n\n### Memories\n\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded (including any the distiller forwarded). Scan it before deciding what to do. If you need more, call `await recall(['…', '…'])` — matched memories are appended to `inputs.memories` for the next turn.\n{{ /if }}\n\n### How to Work\n\n- Start from `inputs.executorRequest`, `inputs.distilledContext`, non-context task inputs, and prior successful Action Log results. Don't repeat probes already in the Action Log.\n- **Use JS** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret narrowed text — never pass raw `inputs.*` to it.\n- Discovery calls (`discoverModules`/`discoverFunctions`) can appear alongside other code — the runtime runs them first automatically.\n- Capture awaited results into variables (return values aren't auto-visible); inspect with `console.log(result)` or finish with `await final(\"...\", { result })`. Multiple `console.log`s per turn is fine.\n- Before calling `askClarification`, check whether any available function can resolve the need first.\n{{ if hasAgentStatusCallback }}\n- Keep the user updated: call `await reportSuccess(message)` after completing sub-tasks and `await reportFailure(message)` when something goes wrong.\n{{ /if }}\n\n```js\nconst narrowed = inputs.emails\n .filter(e => e.subject.toLowerCase().includes('refund'))\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\n\nconst plan = await llmQuery([{\n query: 'Determine which messages require a refund response and draft a compact action plan.',\n context: { emails: narrowed }\n}]);\nconsole.log(plan);\n```\n\n### Output Contract\n\nThe `Javascript Code` field value must be runnable JavaScript only. Do not put prose or plain labels like `task:` / `evidence:` inside the value. Never combine `console.log` with `final()` or `askClarification()` in the same turn.\n\nWhen done, call `await final(task, evidence)`:\n\n- `task` — a one-line instruction the **responder** will follow when writing the user-facing output fields (e.g. \"Answer the user's question using the matched emails\").\n- `evidence` — the curated data the responder will read to follow `task`. Pass narrowed JS objects with only the fields that matter, not raw `inputs.*`. Use plain keys (`{ matchedEmails: [...] }`) — don't wrap under the output field name.\n\nDo not pre-format the answer; the responder writes the output fields.\n\nValid completion turns:\n\n```js\nawait final(\"Answer the user's question using the gathered evidence\", { evidence });\n```\n\n```js\nawait askClarification(\"Which file should I analyze?\");\n```\n\n## JavaScript Runtime Usage Instructions\n{{ runtimeUsageInstructions }}\n";
4310
- readonly 'rlm/responder.md': "## Answer Synthesis Agent\n\nYou synthesize the final answer from the evidence the actor gathered. You do not run code, call tools, or invoke agents — you read input fields and write the output fields.\n\n### Reading the actor's payload\n\n`Context Data` has two keys:\n\n- `task` — a one-line instruction telling you what to write into the output fields.\n- `evidence` — the data the actor curated for you to follow that instruction.\n\n### Rules\n\n1. Follow `Context Data.task` using `Context Data.evidence` and any other input fields provided.\n2. When emitting a JSON output field, write the value flat — do **not** wrap it under a key matching the field's title. The field is already named.\n3. If `evidence` lacks sufficient information, give the best possible answer from what's available across all input fields.\n\n### Context variables that were analyzed (metadata only)\n{{ contextVarSummary }}\n{{ if hasAgentIdentity }}\n\n### Agent Identity\n\nUser-facing identity:\n{{ agentIdentityText }}\n{{ /if }}\n";
4316
+ readonly 'rlm/distiller.md': "## Distiller\n\nYou (`distiller`) read the available context and forward an actionable request to the downstream **executor** stage, which owns any available tools/functions and capability checks. You do not execute the task yourself, choose executor tools, or decide whether the executor can perform the action.\n\nCall `final(request, evidence)` to forward. Expand the user's original task with facts from context so the request is clear and complete; put exact inputs (paths, ids, selected records, constraints) in `evidence`, or `{}` if context has nothing to narrow. Resolve follow-ups against prior conversation. Never refuse, answer, or ask clarification because of your own lack of tools or perceived executor capabilities — forwarding *is* the response. Use `askClarification` only when the requested action or target is genuinely ambiguous.\n\nThe JS runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\n\n### Context Fields\n\nContext fields are available as globals (in the REPL) on the `inputs` object:\n{{ contextVarList }}\n\n### Available Functions\n\n{{ primitivesList }}\n{{ if memoriesMode }}\n\n### Memories\n\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded. Scan it before deciding what to do. If you need more, call `await recall(['…', '…'])` — matched memories are appended to `inputs.memories` for the next turn (and forwarded to the executor).\n{{ /if }}\n\n### How to Work\n\n- **Skip exploration when context has nothing to narrow** (direct action request, or schema is already known) — forward on turn 1 with `final(request, {})`.\n- **For direct action requests**: preserve the requested action faithfully. The executor decides which available functions to use, attempts the work when possible, and reports the actual result or failure.\n- **When narrowing**: probe shape, narrow with JS, extract. Don't dump raw data. Don't repeat probes already in the Action Log.\n- **Use JS** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret a narrowed slice — never pass raw `inputs.*` to it.\n- `console.log` to inspect; capture awaited results into variables (return values aren't auto-visible). Multiple `console.log`s per turn is fine.\n\n```js\nconst narrowed = inputs.emails\n .filter(e => e.subject.toLowerCase().includes('refund'))\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\n\nconst interpretation = await llmQuery([{\n query: 'Classify each as billing_dispute | unauthorized_charge | other. JSON list.',\n context: { emails: narrowed }\n}]);\nconsole.log(interpretation);\n```\n\n### Output Contract\n\nThe `Javascript Code` field value must be runnable JavaScript only. Do not put prose or plain labels like `task:` / `evidence:` inside the value. Never combine `console.log` with `final()` or `askClarification()` in the same turn.\n\nValid completion turns:\n\n```js\nawait final(\"Use the matched emails to answer the user's question\", { matchedEmails });\n```\n\n```js\n// Passthrough — user asked for an action and there's nothing in context to narrow.\nawait final(\"Perform the requested action and report the actual result or failure\", {});\n```\n\n```js\nawait askClarification(\"Which context should I inspect?\");\n```\n\n## JavaScript Runtime Usage Instructions\n{{ runtimeUsageInstructions }}\n";
4317
+ readonly 'rlm/executor.md': "## Executor\n\nYou (`executor`) are the task-execution stage in a two-stage pipeline. Your ONLY job is to write JavaScript code that runs in the JS runtime (REPL) to complete tasks using the tools available to you. A separate (`responder`) agent downstream synthesizes the final answer.\n\nThe JS runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\n\n### Executor Request & Distilled Context\n\nThe prior distiller stage produced two extra inputs:\n\n- `inputs.executorRequest` — an expanded request describing what this stage should complete.\n- `inputs.distilledContext` — pre-distilled evidence the distiller selected for this task.\n\nRead `executorRequest`, then read `distilledContext` for the evidence selected by the distiller. Raw context fields are not available in this stage. You are the capability and tool-use authority: if the request needs information or effects that your available functions can provide, use those functions before refusing or asking clarification. If the distilled evidence is sufficient, finish directly with `final(...)`. Call `askClarification(...)` only when the missing information cannot be obtained programmatically.\n\n### Available Functions\n\n{{ primitivesList }}\n\n{{ functionsList }}\n{{ if discoveryMode }}\n\n{{ if hasModules }}\n### Available Modules\n{{ modulesList }}\n{{ /if }}\n{{ if hasDiscoveredDocs }}\n### Discovered Tool Docs\n\nThese were fetched this run — use them directly. Only re-run discovery for modules/functions not listed here.\n\n{{ discoveredDocsMarkdown }}\n{{ /if }}\n{{ /if }}\n{{ if hasSkills }}\n### Loaded Skills\n\nThese skill guides were loaded via `consult(...)` — apply them directly. Call `consult([...])` to load additional skills as needed.\n\n{{ skillsMarkdown }}\n{{ /if }}\n{{ if memoriesMode }}\n\n### Memories\n\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded (including any the distiller forwarded). Scan it before deciding what to do. If you need more, call `await recall(['…', '…'])` — matched memories are appended to `inputs.memories` for the next turn.\n{{ /if }}\n\n### How to Work\n\n- Start from `inputs.executorRequest`, `inputs.distilledContext`, non-context task inputs, and prior successful Action Log results. Don't repeat probes already in the Action Log.\n- Treat direct action requests as work to attempt with available functions. If a function fails or the environment denies the action, capture the real error, status, output, or exception in the evidence for the responder.\n- **Use JS** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret narrowed text — never pass raw `inputs.*` to it.\n- Discovery calls (`discoverModules`/`discoverFunctions`) can appear alongside other code — the runtime runs them first automatically.\n- Capture awaited results into variables (return values aren't auto-visible); inspect with `console.log(result)` or finish with `await final(\"...\", { result })`. Multiple `console.log`s per turn is fine.\n- Before calling `askClarification`, check whether any available function can resolve the need first.\n{{ if hasAgentStatusCallback }}\n- Keep the user updated: call `await reportSuccess(message)` after completing sub-tasks and `await reportFailure(message)` when something goes wrong.\n{{ /if }}\n\n```js\nconst narrowed = inputs.emails\n .filter(e => e.subject.toLowerCase().includes('refund'))\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\n\nconst plan = await llmQuery([{\n query: 'Determine which messages require a refund response and draft a compact action plan.',\n context: { emails: narrowed }\n}]);\nconsole.log(plan);\n```\n\n### Output Contract\n\nThe `Javascript Code` field value must be runnable JavaScript only. Do not put prose or plain labels like `task:` / `evidence:` inside the value. Never combine `console.log` with `final()` or `askClarification()` in the same turn.\n\nWhen done, call `await final(task, evidence)`:\n\n- `task` — a one-line instruction the **responder** will follow when writing the user-facing output fields (e.g. \"Answer the user's question using the matched emails\").\n- `evidence` — the curated data the responder will read to follow `task`. Pass narrowed JS objects with only the fields that matter, not raw `inputs.*`. Use plain keys (`{ matchedEmails: [...] }`) — don't wrap under the output field name.\n\nDo not pre-format the answer; the responder writes the output fields.\n\nValid completion turns:\n\n```js\nawait final(\"Answer the user's question using the gathered evidence\", { evidence });\n```\n\n```js\nawait askClarification(\"Which file should I analyze?\");\n```\n\n## JavaScript Runtime Usage Instructions\n{{ runtimeUsageInstructions }}\n";
4318
+ readonly 'rlm/responder.md': "## Answer Synthesis Agent\n\nYou synthesize the final answer from the evidence the actor gathered. You do not run code, call tools, or invoke agents — you read input fields and write the output fields.\n\n### Reading the actor's payload\n\n`Context Data` has two keys:\n\n- `task` — a one-line instruction telling you what to write into the output fields.\n- `evidence` — the data the actor curated for you to follow that instruction.\n\n### Rules\n\n1. Follow `Context Data.task` using `Context Data.evidence` and any other input fields provided.\n2. When emitting a JSON output field, write the value flat — do **not** wrap it under a key matching the field's title. The field is already named.\n3. If `evidence` lacks sufficient information, give the best possible answer from what's available across all input fields.\n4. Do not contradict actor evidence. If evidence contains a tool result, failure, status, output, or exception, report that result rather than inventing a capability limit.\n\n### Context variables that were analyzed (metadata only)\n{{ contextVarSummary }}\n{{ if hasAgentIdentity }}\n\n### Agent Identity\n\nUser-facing identity:\n{{ agentIdentityText }}\n{{ /if }}\n";
4311
4319
  };
4312
4320
  type TemplateId = keyof typeof promptTemplates;
4313
4321
 
@@ -5709,6 +5717,10 @@ type AxAIAnthropicThinkingWire = {
5709
5717
  type AxAIAnthropicEffortLevel = 'low' | 'medium' | 'high' | 'max';
5710
5718
  type AxAIAnthropicOutputConfig = {
5711
5719
  effort?: AxAIAnthropicEffortLevel;
5720
+ format?: {
5721
+ type: 'json_schema';
5722
+ schema: object;
5723
+ };
5712
5724
  };
5713
5725
  type AxAIAnthropicEffortLevelMapping = {
5714
5726
  minimal?: AxAIAnthropicEffortLevel;
@@ -5771,7 +5783,7 @@ type AxAIAnthropicChatRequest = {
5771
5783
  media_type: string;
5772
5784
  data: string;
5773
5785
  };
5774
- } & AxAIAnthropicChatRequestCacheParam) | {
5786
+ } & AxAIAnthropicChatRequestCacheParam) | ({
5775
5787
  type: 'tool_result';
5776
5788
  is_error?: boolean;
5777
5789
  tool_use_id: string;
@@ -5786,7 +5798,7 @@ type AxAIAnthropicChatRequest = {
5786
5798
  data: string;
5787
5799
  };
5788
5800
  } & AxAIAnthropicChatRequestCacheParam))[];
5789
- })[];
5801
+ } & AxAIAnthropicChatRequestCacheParam))[];
5790
5802
  } | {
5791
5803
  role: 'assistant';
5792
5804
  content: string | (({
@@ -5826,10 +5838,6 @@ type AxAIAnthropicChatRequest = {
5826
5838
  top_k?: number;
5827
5839
  thinking?: AxAIAnthropicThinkingWire;
5828
5840
  output_config?: AxAIAnthropicOutputConfig;
5829
- output_format?: {
5830
- type: 'json_schema';
5831
- schema: object;
5832
- };
5833
5841
  metadata?: {
5834
5842
  user_id: string;
5835
5843
  };
@@ -6003,8 +6011,11 @@ declare enum AxAIOpenAIModel {
6003
6011
  GPT4OMini = "gpt-4o-mini",
6004
6012
  GPTAudio = "gpt-audio",
6005
6013
  GPTAudioMini = "gpt-audio-mini",
6014
+ GPTAudio15 = "gpt-audio-1.5",
6015
+ GPTRealtime15 = "gpt-realtime-1.5",
6006
6016
  GPTRealtime2 = "gpt-realtime-2",
6007
6017
  GPTRealtimeWhisper = "gpt-realtime-whisper",
6018
+ GPTRealtimeTranslate = "gpt-realtime-translate",
6008
6019
  GPT4ChatGPT4O = "chatgpt-4o-latest",
6009
6020
  GPT4Turbo = "gpt-4-turbo",
6010
6021
  GPT35Turbo = "gpt-3.5-turbo",
@@ -6031,6 +6042,8 @@ declare enum AxAIOpenAIModel {
6031
6042
  GPT54 = "gpt-5.4",
6032
6043
  GPT54Mini = "gpt-5.4-mini",
6033
6044
  GPT54Nano = "gpt-5.4-nano",
6045
+ GPT55 = "gpt-5.5",
6046
+ GPT55Pro = "gpt-5.5-pro",
6034
6047
  O1 = "o1",
6035
6048
  O1Mini = "o1-mini",
6036
6049
  O3 = "o3",
@@ -6063,7 +6076,7 @@ type AxAIOpenAIConfig<TModel, TEmbedModel> = Omit<AxModelConfig, 'topK'> & {
6063
6076
  logprobs?: number;
6064
6077
  echo?: boolean;
6065
6078
  dimensions?: number;
6066
- reasoningEffort?: 'minimal' | 'low' | 'medium' | 'high';
6079
+ reasoningEffort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
6067
6080
  store?: boolean;
6068
6081
  serviceTier?: 'auto' | 'default' | 'flex';
6069
6082
  webSearchOptions?: {
@@ -6111,7 +6124,7 @@ interface AxAIOpenAIResponseDelta<T> {
6111
6124
  }
6112
6125
  type AxAIOpenAIChatRequest<TModel> = {
6113
6126
  model: TModel;
6114
- reasoning_effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high';
6127
+ reasoning_effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
6115
6128
  store?: boolean;
6116
6129
  modalities?: readonly ('text' | 'audio')[];
6117
6130
  audio?: {
@@ -6946,6 +6959,10 @@ declare enum AxAIGoogleGeminiModel {
6946
6959
  Gemini3Flash = "gemini-3-flash-preview",
6947
6960
  Gemini3Pro = "gemini-3.1-pro-preview",
6948
6961
  Gemini3ProImage = "gemini-3-pro-image-preview",
6962
+ Gemini31FlashImage = "gemini-3.1-flash-image-preview",
6963
+ Gemini31FlashTTS = "gemini-3.1-flash-tts-preview",
6964
+ NanoBanana2 = "nano-banana-2",
6965
+ GeminiRoboticsER16 = "gemini-robotics-er-1.6-preview",
6949
6966
  Gemini25Pro = "gemini-2.5-pro",
6950
6967
  Gemini25Flash = "gemini-2.5-flash",
6951
6968
  Gemini25FlashNativeAudio = "gemini-2.5-flash-native-audio-preview-12-2025",
@@ -6967,7 +6984,6 @@ declare enum AxAIGoogleGeminiEmbedModel {
6967
6984
  GeminiEmbedding001 = "gemini-embedding-001",
6968
6985
  GeminiEmbedding = "gemini-embedding-exp",
6969
6986
  TextEmbeddingLarge = "text-embedding-large-exp-03-07",
6970
- TextEmbedding004 = "text-embedding-004",
6971
6987
  TextEmbedding005 = "text-embedding-005"
6972
6988
  }
6973
6989
  declare enum AxAIGoogleGeminiSafetyCategory {
@@ -7123,6 +7139,14 @@ type AxAIGoogleGeminiChatResponse = {
7123
7139
  title?: string;
7124
7140
  uri?: string;
7125
7141
  };
7142
+ retrievedContext?: {
7143
+ title?: string;
7144
+ uri?: string;
7145
+ /** File Search multimodal (May 2026): id of the file/media chunk. */
7146
+ media_id?: string;
7147
+ /** File Search multimodal (May 2026): page numbers cited within the source. */
7148
+ page_numbers?: number[];
7149
+ };
7126
7150
  }[];
7127
7151
  googleMapsWidgetContextToken?: string;
7128
7152
  };
@@ -7527,6 +7551,8 @@ declare enum AxAIOpenAIResponsesModel {
7527
7551
  GPT54 = "gpt-5.4",
7528
7552
  GPT54Mini = "gpt-5.4-mini",
7529
7553
  GPT54Nano = "gpt-5.4-nano",
7554
+ GPT55 = "gpt-5.5",
7555
+ GPT55Pro = "gpt-5.5-pro",
7530
7556
  O1Pro = "o1-pro",
7531
7557
  O1 = "o1",
7532
7558
  O1Mini = "o1-mini",
@@ -7592,14 +7618,14 @@ interface AxAIOpenAIResponsesRequest<TModel = AxAIOpenAIResponsesModel> {
7592
7618
  readonly input: string | ReadonlyArray<AxAIOpenAIResponsesInputItem>;
7593
7619
  readonly model: TModel;
7594
7620
  readonly background?: boolean | null;
7595
- readonly include?: ReadonlyArray<'file_search_call.results' | 'message.input_image.image_url' | 'computer_call_output.output.image_url' | 'reasoning.encrypted_content' | 'code_interpreter_call.outputs'> | null;
7621
+ readonly include?: ReadonlyArray<'file_search_call.results' | 'message.input_image.image_url' | 'computer_call_output.output.image_url' | 'reasoning.encrypted_content' | 'code_interpreter_call.outputs' | 'web_search_call.action.return_token_budget'> | null;
7596
7622
  readonly instructions?: string | null;
7597
7623
  readonly max_output_tokens?: number | null;
7598
7624
  readonly metadata?: Readonly<Record<string, string>> | null;
7599
7625
  readonly parallel_tool_calls?: boolean | null;
7600
7626
  readonly previous_response_id?: string | null;
7601
7627
  readonly reasoning?: {
7602
- readonly effort?: 'minimal' | 'low' | 'medium' | 'high' | null;
7628
+ readonly effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | null;
7603
7629
  readonly summary?: 'auto' | 'concise' | 'detailed' | null;
7604
7630
  } | null;
7605
7631
  readonly service_tier?: 'auto' | 'default' | 'flex' | null;
@@ -7629,6 +7655,7 @@ interface AxAIOpenAIResponsesOutputMessageItem {
7629
7655
  role: 'assistant';
7630
7656
  content: ReadonlyArray<AxAIOpenAIResponsesOutputTextContentPart | AxAIOpenAIResponsesOutputRefusalContentPart>;
7631
7657
  status: 'in_progress' | 'completed' | 'incomplete';
7658
+ phase?: 'commentary' | 'final_answer';
7632
7659
  }
7633
7660
  interface AxAIOpenAIResponsesFunctionCallItem {
7634
7661
  type: 'function_call';
@@ -7978,7 +8005,7 @@ type AxAIOpenAIResponsesConfig<TModel, TEmbedModel> = Omit<AxModelConfig, 'topK'
7978
8005
  logprobs?: number;
7979
8006
  echo?: boolean;
7980
8007
  dimensions?: number;
7981
- reasoningEffort?: 'minimal' | 'low' | 'medium' | 'high';
8008
+ reasoningEffort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
7982
8009
  reasoningSummary?: 'auto' | 'concise' | 'detailed';
7983
8010
  store?: boolean;
7984
8011
  systemPrompt?: string;
package/index.d.ts CHANGED
@@ -2427,6 +2427,7 @@ declare class AxBaseAI<TModel, TEmbedModel, TChatRequest, TEmbedRequest, TChatRe
2427
2427
  private calculatePercentile;
2428
2428
  private updateLatencyMetrics;
2429
2429
  private updateErrorMetrics;
2430
+ private recordEstimatedCost;
2430
2431
  private recordTokenUsage;
2431
2432
  private calculateRequestSize;
2432
2433
  private calculateResponseSize;
@@ -2535,6 +2536,9 @@ type AxModelInfo = {
2535
2536
  maxTokens?: number;
2536
2537
  isExpensive?: boolean;
2537
2538
  contextWindow?: number;
2539
+ isDeprecated?: boolean;
2540
+ /** ISO date (YYYY-MM-DD) the upstream provider will stop serving this model. */
2541
+ deprecatedOn?: string;
2538
2542
  };
2539
2543
  type AxTokenUsage = {
2540
2544
  promptTokens: number;
@@ -2755,6 +2759,10 @@ type AxCitation = {
2755
2759
  license?: string;
2756
2760
  publicationDate?: string;
2757
2761
  snippet?: string;
2762
+ /** File Search multimodal (Gemini, May 2026): media chunk id. */
2763
+ mediaId?: string;
2764
+ /** File Search multimodal (Gemini, May 2026): page numbers cited within the source. */
2765
+ pageNumbers?: number[];
2758
2766
  };
2759
2767
  type AxModelUsage = {
2760
2768
  ai: string;
@@ -4305,9 +4313,9 @@ declare class AxSignature<_TInput extends Record<string, any> = Record<string, a
4305
4313
  declare const promptTemplates: {
4306
4314
  readonly 'dsp/dspy.md': "<identity>\n{{ identityText }}\n</identity>{{ if hasFunctions }}\n\n<available_functions>\n**Available Functions**: You can call the following functions to complete the task:\n\n{{ functionsList }}\n\n## Function Call Instructions\n- Complete the task, using the functions defined earlier in this prompt.\n- Output fields should only be generated after all functions have been called.\n- Use the function results to generate the output fields.\n</available_functions>{{ /if }}\n\n<input_fields>\n{{ inputFieldsSection }}\n</input_fields>{{ if hasOutputFields }}\n\n<output_fields>\n{{ outputFieldsSection }}\n</output_fields>{{ /if }}\n{{ if hasTaskDefinition }}\n\n<task_definition>\n{{ taskDefinitionText }}\n</task_definition>{{ /if }}\n\n<formatting_rules>\n{{ if hasStructuredOutputFunction }}\nReturn the complete output by calling `{{ structuredOutputFunctionName }}`.\n{{ else }}{{ if hasComplexFields }}\nReturn valid JSON matching <output_fields>.\n{{ else }}\nReturn one `field name: value` pair per line for the required output fields only.\n{{ /if }}{{ /if }}Above rules override later instructions.\n\n</formatting_rules>\n{{ if hasExampleDemonstrations }}\n\n## Example Demonstrations\nThe following User/Assistant turns are examples only until --- END OF EXAMPLES ---, not context for the current task.\n{{ /if }}\n";
4307
4315
  readonly 'dsp/example-separator.md': "--- END OF EXAMPLES ---\nThe examples above were for training purposes only. Please ignore any specific entities or facts mentioned in them.\n\nREAL USER QUERY:\n";
4308
- readonly 'rlm/distiller.md': "## Distiller\n\nYou (`distiller`) read the available context and forward an actionable request to the downstream **executor** stage (which has the tools shell, file system, agent functions, etc.). You do not execute the task yourself.\n\nCall `final(request, evidence)` to forward. Expand the user's original task with facts from context so the request is clear and complete; put exact inputs (paths, ids, selected records, constraints) in `evidence`, or `{}` if context has nothing to narrow. Resolve follow-ups against prior conversation. Never refuse with \"I have no tools\" — forwarding *is* the response. Use `askClarification` only when genuinely blocked by ambiguity.\n\nThe JS runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\n\n### Context Fields\n\nContext fields are available as globals (in the REPL) on the `inputs` object:\n{{ contextVarList }}\n\n### Available Functions\n\n{{ primitivesList }}\n{{ if memoriesMode }}\n\n### Memories\n\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded. Scan it before deciding what to do. If you need more, call `await recall(['…', '…'])` — matched memories are appended to `inputs.memories` for the next turn (and forwarded to the executor).\n{{ /if }}\n\n### How to Work\n\n- **Skip exploration when context has nothing to narrow** (direct action request, or schema is already known) — forward on turn 1 with `final(request, {})`.\n- **When narrowing**: probe shape, narrow with JS, extract. Don't dump raw data. Don't repeat probes already in the Action Log.\n- **Use JS** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret a narrowed slice — never pass raw `inputs.*` to it.\n- `console.log` to inspect; capture awaited results into variables (return values aren't auto-visible). Multiple `console.log`s per turn is fine.\n\n```js\nconst narrowed = inputs.emails\n .filter(e => e.subject.toLowerCase().includes('refund'))\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\n\nconst interpretation = await llmQuery([{\n query: 'Classify each as billing_dispute | unauthorized_charge | other. JSON list.',\n context: { emails: narrowed }\n}]);\nconsole.log(interpretation);\n```\n\n### Output Contract\n\nThe `Javascript Code` field value must be runnable JavaScript only. Do not put prose or plain labels like `task:` / `evidence:` inside the value. Never combine `console.log` with `final()` or `askClarification()` in the same turn.\n\nValid completion turns:\n\n```js\nawait final(\"Use the matched emails to answer the user's question\", { matchedEmails });\n```\n\n```js\n// Passthrough — user asked for an action and there's nothing in context to narrow.\nawait final(\"Run the shell command `ls -la` and return its output verbatim\", {});\n```\n\n```js\nawait askClarification(\"Which context should I inspect?\");\n```\n\n## JavaScript Runtime Usage Instructions\n{{ runtimeUsageInstructions }}\n";
4309
- readonly 'rlm/executor.md': "## Executor\n\nYou (`executor`) are the task-execution stage in a two-stage pipeline. Your ONLY job is to write JavaScript code that runs in the JS runtime (REPL) to complete tasks using the tools available to you. A separate (`responder`) agent downstream synthesizes the final answer.\n\nThe JS runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\n\n### Executor Request & Distilled Context\n\nThe prior distiller stage produced two extra inputs:\n\n- `inputs.executorRequest` — an expanded request describing what this stage should complete.\n- `inputs.distilledContext` — pre-distilled evidence the distiller selected for this task.\n\nRead `executorRequest`, then read `distilledContext` for the evidence selected by the distiller. Raw context fields are not available in this stage. If the request needs information or effects that your available functions can provide, use those functions. If the distilled evidence is sufficient, finish directly with `final(...)`. Call `askClarification(...)` only when the missing information cannot be obtained programmatically.\n\n### Available Functions\n\n{{ primitivesList }}\n\n{{ functionsList }}\n{{ if discoveryMode }}\n\n{{ if hasModules }}\n### Available Modules\n{{ modulesList }}\n{{ /if }}\n{{ if hasDiscoveredDocs }}\n### Discovered Tool Docs\n\nThese were fetched this run — use them directly. Only re-run discovery for modules/functions not listed here.\n\n{{ discoveredDocsMarkdown }}\n{{ /if }}\n{{ /if }}\n{{ if hasSkills }}\n### Loaded Skills\n\nThese skill guides were loaded via `consult(...)` — apply them directly. Call `consult([...])` to load additional skills as needed.\n\n{{ skillsMarkdown }}\n{{ /if }}\n{{ if memoriesMode }}\n\n### Memories\n\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded (including any the distiller forwarded). Scan it before deciding what to do. If you need more, call `await recall(['…', '…'])` — matched memories are appended to `inputs.memories` for the next turn.\n{{ /if }}\n\n### How to Work\n\n- Start from `inputs.executorRequest`, `inputs.distilledContext`, non-context task inputs, and prior successful Action Log results. Don't repeat probes already in the Action Log.\n- **Use JS** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret narrowed text — never pass raw `inputs.*` to it.\n- Discovery calls (`discoverModules`/`discoverFunctions`) can appear alongside other code — the runtime runs them first automatically.\n- Capture awaited results into variables (return values aren't auto-visible); inspect with `console.log(result)` or finish with `await final(\"...\", { result })`. Multiple `console.log`s per turn is fine.\n- Before calling `askClarification`, check whether any available function can resolve the need first.\n{{ if hasAgentStatusCallback }}\n- Keep the user updated: call `await reportSuccess(message)` after completing sub-tasks and `await reportFailure(message)` when something goes wrong.\n{{ /if }}\n\n```js\nconst narrowed = inputs.emails\n .filter(e => e.subject.toLowerCase().includes('refund'))\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\n\nconst plan = await llmQuery([{\n query: 'Determine which messages require a refund response and draft a compact action plan.',\n context: { emails: narrowed }\n}]);\nconsole.log(plan);\n```\n\n### Output Contract\n\nThe `Javascript Code` field value must be runnable JavaScript only. Do not put prose or plain labels like `task:` / `evidence:` inside the value. Never combine `console.log` with `final()` or `askClarification()` in the same turn.\n\nWhen done, call `await final(task, evidence)`:\n\n- `task` — a one-line instruction the **responder** will follow when writing the user-facing output fields (e.g. \"Answer the user's question using the matched emails\").\n- `evidence` — the curated data the responder will read to follow `task`. Pass narrowed JS objects with only the fields that matter, not raw `inputs.*`. Use plain keys (`{ matchedEmails: [...] }`) — don't wrap under the output field name.\n\nDo not pre-format the answer; the responder writes the output fields.\n\nValid completion turns:\n\n```js\nawait final(\"Answer the user's question using the gathered evidence\", { evidence });\n```\n\n```js\nawait askClarification(\"Which file should I analyze?\");\n```\n\n## JavaScript Runtime Usage Instructions\n{{ runtimeUsageInstructions }}\n";
4310
- readonly 'rlm/responder.md': "## Answer Synthesis Agent\n\nYou synthesize the final answer from the evidence the actor gathered. You do not run code, call tools, or invoke agents — you read input fields and write the output fields.\n\n### Reading the actor's payload\n\n`Context Data` has two keys:\n\n- `task` — a one-line instruction telling you what to write into the output fields.\n- `evidence` — the data the actor curated for you to follow that instruction.\n\n### Rules\n\n1. Follow `Context Data.task` using `Context Data.evidence` and any other input fields provided.\n2. When emitting a JSON output field, write the value flat — do **not** wrap it under a key matching the field's title. The field is already named.\n3. If `evidence` lacks sufficient information, give the best possible answer from what's available across all input fields.\n\n### Context variables that were analyzed (metadata only)\n{{ contextVarSummary }}\n{{ if hasAgentIdentity }}\n\n### Agent Identity\n\nUser-facing identity:\n{{ agentIdentityText }}\n{{ /if }}\n";
4316
+ readonly 'rlm/distiller.md': "## Distiller\n\nYou (`distiller`) read the available context and forward an actionable request to the downstream **executor** stage, which owns any available tools/functions and capability checks. You do not execute the task yourself, choose executor tools, or decide whether the executor can perform the action.\n\nCall `final(request, evidence)` to forward. Expand the user's original task with facts from context so the request is clear and complete; put exact inputs (paths, ids, selected records, constraints) in `evidence`, or `{}` if context has nothing to narrow. Resolve follow-ups against prior conversation. Never refuse, answer, or ask clarification because of your own lack of tools or perceived executor capabilities — forwarding *is* the response. Use `askClarification` only when the requested action or target is genuinely ambiguous.\n\nThe JS runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\n\n### Context Fields\n\nContext fields are available as globals (in the REPL) on the `inputs` object:\n{{ contextVarList }}\n\n### Available Functions\n\n{{ primitivesList }}\n{{ if memoriesMode }}\n\n### Memories\n\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded. Scan it before deciding what to do. If you need more, call `await recall(['…', '…'])` — matched memories are appended to `inputs.memories` for the next turn (and forwarded to the executor).\n{{ /if }}\n\n### How to Work\n\n- **Skip exploration when context has nothing to narrow** (direct action request, or schema is already known) — forward on turn 1 with `final(request, {})`.\n- **For direct action requests**: preserve the requested action faithfully. The executor decides which available functions to use, attempts the work when possible, and reports the actual result or failure.\n- **When narrowing**: probe shape, narrow with JS, extract. Don't dump raw data. Don't repeat probes already in the Action Log.\n- **Use JS** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret a narrowed slice — never pass raw `inputs.*` to it.\n- `console.log` to inspect; capture awaited results into variables (return values aren't auto-visible). Multiple `console.log`s per turn is fine.\n\n```js\nconst narrowed = inputs.emails\n .filter(e => e.subject.toLowerCase().includes('refund'))\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\n\nconst interpretation = await llmQuery([{\n query: 'Classify each as billing_dispute | unauthorized_charge | other. JSON list.',\n context: { emails: narrowed }\n}]);\nconsole.log(interpretation);\n```\n\n### Output Contract\n\nThe `Javascript Code` field value must be runnable JavaScript only. Do not put prose or plain labels like `task:` / `evidence:` inside the value. Never combine `console.log` with `final()` or `askClarification()` in the same turn.\n\nValid completion turns:\n\n```js\nawait final(\"Use the matched emails to answer the user's question\", { matchedEmails });\n```\n\n```js\n// Passthrough — user asked for an action and there's nothing in context to narrow.\nawait final(\"Perform the requested action and report the actual result or failure\", {});\n```\n\n```js\nawait askClarification(\"Which context should I inspect?\");\n```\n\n## JavaScript Runtime Usage Instructions\n{{ runtimeUsageInstructions }}\n";
4317
+ readonly 'rlm/executor.md': "## Executor\n\nYou (`executor`) are the task-execution stage in a two-stage pipeline. Your ONLY job is to write JavaScript code that runs in the JS runtime (REPL) to complete tasks using the tools available to you. A separate (`responder`) agent downstream synthesizes the final answer.\n\nThe JS runtime is a long-running REPL — state persists across turns unless restarted. Each **turn**: write code → it executes → you see output → write the next block.\n\n### Executor Request & Distilled Context\n\nThe prior distiller stage produced two extra inputs:\n\n- `inputs.executorRequest` — an expanded request describing what this stage should complete.\n- `inputs.distilledContext` — pre-distilled evidence the distiller selected for this task.\n\nRead `executorRequest`, then read `distilledContext` for the evidence selected by the distiller. Raw context fields are not available in this stage. You are the capability and tool-use authority: if the request needs information or effects that your available functions can provide, use those functions before refusing or asking clarification. If the distilled evidence is sufficient, finish directly with `final(...)`. Call `askClarification(...)` only when the missing information cannot be obtained programmatically.\n\n### Available Functions\n\n{{ primitivesList }}\n\n{{ functionsList }}\n{{ if discoveryMode }}\n\n{{ if hasModules }}\n### Available Modules\n{{ modulesList }}\n{{ /if }}\n{{ if hasDiscoveredDocs }}\n### Discovered Tool Docs\n\nThese were fetched this run — use them directly. Only re-run discovery for modules/functions not listed here.\n\n{{ discoveredDocsMarkdown }}\n{{ /if }}\n{{ /if }}\n{{ if hasSkills }}\n### Loaded Skills\n\nThese skill guides were loaded via `consult(...)` — apply them directly. Call `consult([...])` to load additional skills as needed.\n\n{{ skillsMarkdown }}\n{{ /if }}\n{{ if memoriesMode }}\n\n### Memories\n\n`inputs.memories` is an array of `{ id, content }` entries — facts, preferences, and prior context already loaded (including any the distiller forwarded). Scan it before deciding what to do. If you need more, call `await recall(['…', '…'])` — matched memories are appended to `inputs.memories` for the next turn.\n{{ /if }}\n\n### How to Work\n\n- Start from `inputs.executorRequest`, `inputs.distilledContext`, non-context task inputs, and prior successful Action Log results. Don't repeat probes already in the Action Log.\n- Treat direct action requests as work to attempt with available functions. If a function fails or the environment denies the action, capture the real error, status, output, or exception in the evidence for the responder.\n- **Use JS** for deterministic work (filter, sort, slice, regex, dedupe). **Use `llmQuery`** only to interpret narrowed text — never pass raw `inputs.*` to it.\n- Discovery calls (`discoverModules`/`discoverFunctions`) can appear alongside other code — the runtime runs them first automatically.\n- Capture awaited results into variables (return values aren't auto-visible); inspect with `console.log(result)` or finish with `await final(\"...\", { result })`. Multiple `console.log`s per turn is fine.\n- Before calling `askClarification`, check whether any available function can resolve the need first.\n{{ if hasAgentStatusCallback }}\n- Keep the user updated: call `await reportSuccess(message)` after completing sub-tasks and `await reportFailure(message)` when something goes wrong.\n{{ /if }}\n\n```js\nconst narrowed = inputs.emails\n .filter(e => e.subject.toLowerCase().includes('refund'))\n .map(e => ({ from: e.from, subject: e.subject, body: e.body.slice(0, 800) }));\n\nconst plan = await llmQuery([{\n query: 'Determine which messages require a refund response and draft a compact action plan.',\n context: { emails: narrowed }\n}]);\nconsole.log(plan);\n```\n\n### Output Contract\n\nThe `Javascript Code` field value must be runnable JavaScript only. Do not put prose or plain labels like `task:` / `evidence:` inside the value. Never combine `console.log` with `final()` or `askClarification()` in the same turn.\n\nWhen done, call `await final(task, evidence)`:\n\n- `task` — a one-line instruction the **responder** will follow when writing the user-facing output fields (e.g. \"Answer the user's question using the matched emails\").\n- `evidence` — the curated data the responder will read to follow `task`. Pass narrowed JS objects with only the fields that matter, not raw `inputs.*`. Use plain keys (`{ matchedEmails: [...] }`) — don't wrap under the output field name.\n\nDo not pre-format the answer; the responder writes the output fields.\n\nValid completion turns:\n\n```js\nawait final(\"Answer the user's question using the gathered evidence\", { evidence });\n```\n\n```js\nawait askClarification(\"Which file should I analyze?\");\n```\n\n## JavaScript Runtime Usage Instructions\n{{ runtimeUsageInstructions }}\n";
4318
+ readonly 'rlm/responder.md': "## Answer Synthesis Agent\n\nYou synthesize the final answer from the evidence the actor gathered. You do not run code, call tools, or invoke agents — you read input fields and write the output fields.\n\n### Reading the actor's payload\n\n`Context Data` has two keys:\n\n- `task` — a one-line instruction telling you what to write into the output fields.\n- `evidence` — the data the actor curated for you to follow that instruction.\n\n### Rules\n\n1. Follow `Context Data.task` using `Context Data.evidence` and any other input fields provided.\n2. When emitting a JSON output field, write the value flat — do **not** wrap it under a key matching the field's title. The field is already named.\n3. If `evidence` lacks sufficient information, give the best possible answer from what's available across all input fields.\n4. Do not contradict actor evidence. If evidence contains a tool result, failure, status, output, or exception, report that result rather than inventing a capability limit.\n\n### Context variables that were analyzed (metadata only)\n{{ contextVarSummary }}\n{{ if hasAgentIdentity }}\n\n### Agent Identity\n\nUser-facing identity:\n{{ agentIdentityText }}\n{{ /if }}\n";
4311
4319
  };
4312
4320
  type TemplateId = keyof typeof promptTemplates;
4313
4321
 
@@ -5709,6 +5717,10 @@ type AxAIAnthropicThinkingWire = {
5709
5717
  type AxAIAnthropicEffortLevel = 'low' | 'medium' | 'high' | 'max';
5710
5718
  type AxAIAnthropicOutputConfig = {
5711
5719
  effort?: AxAIAnthropicEffortLevel;
5720
+ format?: {
5721
+ type: 'json_schema';
5722
+ schema: object;
5723
+ };
5712
5724
  };
5713
5725
  type AxAIAnthropicEffortLevelMapping = {
5714
5726
  minimal?: AxAIAnthropicEffortLevel;
@@ -5771,7 +5783,7 @@ type AxAIAnthropicChatRequest = {
5771
5783
  media_type: string;
5772
5784
  data: string;
5773
5785
  };
5774
- } & AxAIAnthropicChatRequestCacheParam) | {
5786
+ } & AxAIAnthropicChatRequestCacheParam) | ({
5775
5787
  type: 'tool_result';
5776
5788
  is_error?: boolean;
5777
5789
  tool_use_id: string;
@@ -5786,7 +5798,7 @@ type AxAIAnthropicChatRequest = {
5786
5798
  data: string;
5787
5799
  };
5788
5800
  } & AxAIAnthropicChatRequestCacheParam))[];
5789
- })[];
5801
+ } & AxAIAnthropicChatRequestCacheParam))[];
5790
5802
  } | {
5791
5803
  role: 'assistant';
5792
5804
  content: string | (({
@@ -5826,10 +5838,6 @@ type AxAIAnthropicChatRequest = {
5826
5838
  top_k?: number;
5827
5839
  thinking?: AxAIAnthropicThinkingWire;
5828
5840
  output_config?: AxAIAnthropicOutputConfig;
5829
- output_format?: {
5830
- type: 'json_schema';
5831
- schema: object;
5832
- };
5833
5841
  metadata?: {
5834
5842
  user_id: string;
5835
5843
  };
@@ -6003,8 +6011,11 @@ declare enum AxAIOpenAIModel {
6003
6011
  GPT4OMini = "gpt-4o-mini",
6004
6012
  GPTAudio = "gpt-audio",
6005
6013
  GPTAudioMini = "gpt-audio-mini",
6014
+ GPTAudio15 = "gpt-audio-1.5",
6015
+ GPTRealtime15 = "gpt-realtime-1.5",
6006
6016
  GPTRealtime2 = "gpt-realtime-2",
6007
6017
  GPTRealtimeWhisper = "gpt-realtime-whisper",
6018
+ GPTRealtimeTranslate = "gpt-realtime-translate",
6008
6019
  GPT4ChatGPT4O = "chatgpt-4o-latest",
6009
6020
  GPT4Turbo = "gpt-4-turbo",
6010
6021
  GPT35Turbo = "gpt-3.5-turbo",
@@ -6031,6 +6042,8 @@ declare enum AxAIOpenAIModel {
6031
6042
  GPT54 = "gpt-5.4",
6032
6043
  GPT54Mini = "gpt-5.4-mini",
6033
6044
  GPT54Nano = "gpt-5.4-nano",
6045
+ GPT55 = "gpt-5.5",
6046
+ GPT55Pro = "gpt-5.5-pro",
6034
6047
  O1 = "o1",
6035
6048
  O1Mini = "o1-mini",
6036
6049
  O3 = "o3",
@@ -6063,7 +6076,7 @@ type AxAIOpenAIConfig<TModel, TEmbedModel> = Omit<AxModelConfig, 'topK'> & {
6063
6076
  logprobs?: number;
6064
6077
  echo?: boolean;
6065
6078
  dimensions?: number;
6066
- reasoningEffort?: 'minimal' | 'low' | 'medium' | 'high';
6079
+ reasoningEffort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
6067
6080
  store?: boolean;
6068
6081
  serviceTier?: 'auto' | 'default' | 'flex';
6069
6082
  webSearchOptions?: {
@@ -6111,7 +6124,7 @@ interface AxAIOpenAIResponseDelta<T> {
6111
6124
  }
6112
6125
  type AxAIOpenAIChatRequest<TModel> = {
6113
6126
  model: TModel;
6114
- reasoning_effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high';
6127
+ reasoning_effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
6115
6128
  store?: boolean;
6116
6129
  modalities?: readonly ('text' | 'audio')[];
6117
6130
  audio?: {
@@ -6946,6 +6959,10 @@ declare enum AxAIGoogleGeminiModel {
6946
6959
  Gemini3Flash = "gemini-3-flash-preview",
6947
6960
  Gemini3Pro = "gemini-3.1-pro-preview",
6948
6961
  Gemini3ProImage = "gemini-3-pro-image-preview",
6962
+ Gemini31FlashImage = "gemini-3.1-flash-image-preview",
6963
+ Gemini31FlashTTS = "gemini-3.1-flash-tts-preview",
6964
+ NanoBanana2 = "nano-banana-2",
6965
+ GeminiRoboticsER16 = "gemini-robotics-er-1.6-preview",
6949
6966
  Gemini25Pro = "gemini-2.5-pro",
6950
6967
  Gemini25Flash = "gemini-2.5-flash",
6951
6968
  Gemini25FlashNativeAudio = "gemini-2.5-flash-native-audio-preview-12-2025",
@@ -6967,7 +6984,6 @@ declare enum AxAIGoogleGeminiEmbedModel {
6967
6984
  GeminiEmbedding001 = "gemini-embedding-001",
6968
6985
  GeminiEmbedding = "gemini-embedding-exp",
6969
6986
  TextEmbeddingLarge = "text-embedding-large-exp-03-07",
6970
- TextEmbedding004 = "text-embedding-004",
6971
6987
  TextEmbedding005 = "text-embedding-005"
6972
6988
  }
6973
6989
  declare enum AxAIGoogleGeminiSafetyCategory {
@@ -7123,6 +7139,14 @@ type AxAIGoogleGeminiChatResponse = {
7123
7139
  title?: string;
7124
7140
  uri?: string;
7125
7141
  };
7142
+ retrievedContext?: {
7143
+ title?: string;
7144
+ uri?: string;
7145
+ /** File Search multimodal (May 2026): id of the file/media chunk. */
7146
+ media_id?: string;
7147
+ /** File Search multimodal (May 2026): page numbers cited within the source. */
7148
+ page_numbers?: number[];
7149
+ };
7126
7150
  }[];
7127
7151
  googleMapsWidgetContextToken?: string;
7128
7152
  };
@@ -7527,6 +7551,8 @@ declare enum AxAIOpenAIResponsesModel {
7527
7551
  GPT54 = "gpt-5.4",
7528
7552
  GPT54Mini = "gpt-5.4-mini",
7529
7553
  GPT54Nano = "gpt-5.4-nano",
7554
+ GPT55 = "gpt-5.5",
7555
+ GPT55Pro = "gpt-5.5-pro",
7530
7556
  O1Pro = "o1-pro",
7531
7557
  O1 = "o1",
7532
7558
  O1Mini = "o1-mini",
@@ -7592,14 +7618,14 @@ interface AxAIOpenAIResponsesRequest<TModel = AxAIOpenAIResponsesModel> {
7592
7618
  readonly input: string | ReadonlyArray<AxAIOpenAIResponsesInputItem>;
7593
7619
  readonly model: TModel;
7594
7620
  readonly background?: boolean | null;
7595
- readonly include?: ReadonlyArray<'file_search_call.results' | 'message.input_image.image_url' | 'computer_call_output.output.image_url' | 'reasoning.encrypted_content' | 'code_interpreter_call.outputs'> | null;
7621
+ readonly include?: ReadonlyArray<'file_search_call.results' | 'message.input_image.image_url' | 'computer_call_output.output.image_url' | 'reasoning.encrypted_content' | 'code_interpreter_call.outputs' | 'web_search_call.action.return_token_budget'> | null;
7596
7622
  readonly instructions?: string | null;
7597
7623
  readonly max_output_tokens?: number | null;
7598
7624
  readonly metadata?: Readonly<Record<string, string>> | null;
7599
7625
  readonly parallel_tool_calls?: boolean | null;
7600
7626
  readonly previous_response_id?: string | null;
7601
7627
  readonly reasoning?: {
7602
- readonly effort?: 'minimal' | 'low' | 'medium' | 'high' | null;
7628
+ readonly effort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | null;
7603
7629
  readonly summary?: 'auto' | 'concise' | 'detailed' | null;
7604
7630
  } | null;
7605
7631
  readonly service_tier?: 'auto' | 'default' | 'flex' | null;
@@ -7629,6 +7655,7 @@ interface AxAIOpenAIResponsesOutputMessageItem {
7629
7655
  role: 'assistant';
7630
7656
  content: ReadonlyArray<AxAIOpenAIResponsesOutputTextContentPart | AxAIOpenAIResponsesOutputRefusalContentPart>;
7631
7657
  status: 'in_progress' | 'completed' | 'incomplete';
7658
+ phase?: 'commentary' | 'final_answer';
7632
7659
  }
7633
7660
  interface AxAIOpenAIResponsesFunctionCallItem {
7634
7661
  type: 'function_call';
@@ -7978,7 +8005,7 @@ type AxAIOpenAIResponsesConfig<TModel, TEmbedModel> = Omit<AxModelConfig, 'topK'
7978
8005
  logprobs?: number;
7979
8006
  echo?: boolean;
7980
8007
  dimensions?: number;
7981
- reasoningEffort?: 'minimal' | 'low' | 'medium' | 'high';
8008
+ reasoningEffort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
7982
8009
  reasoningSummary?: 'auto' | 'concise' | 'detailed';
7983
8010
  store?: boolean;
7984
8011
  systemPrompt?: string;