diff --git a/src/libs/OpenRouter/Generated/OpenRouter.IInterns2Client.Chat.g.cs b/src/libs/OpenRouter/Generated/OpenRouter.IInterns2Client.Chat.g.cs
index a4400035..0deda4ba 100644
--- a/src/libs/OpenRouter/Generated/OpenRouter.IInterns2Client.Chat.g.cs
+++ b/src/libs/OpenRouter/Generated/OpenRouter.IInterns2Client.Chat.g.cs
@@ -22,7 +22,7 @@ public partial interface IInterns2Client
/// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering.
/// The token to cancel the operation with
///
- global::System.Threading.Tasks.Task ChatAsync(
+ global::System.Threading.Tasks.Task ChatAsync(
string internId,
global::OpenRouter.InternChatCompletionRequest request,
@@ -46,7 +46,7 @@ public partial interface IInterns2Client
/// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering.
/// The token to cancel the operation with
///
- global::System.Threading.Tasks.Task> ChatAsResponseAsync(
+ global::System.Threading.Tasks.Task> ChatAsResponseAsync(
string internId,
global::OpenRouter.InternChatCompletionRequest request,
@@ -84,7 +84,7 @@ public partial interface IInterns2Client
/// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering.
/// The token to cancel the operation with
///
- global::System.Threading.Tasks.Task ChatAsync(
+ global::System.Threading.Tasks.Task ChatAsync(
string internId,
global::System.Collections.Generic.IList messages,
global::OpenRouter.InternApprovalMode? approvalMode = default,
diff --git a/src/libs/OpenRouter/Generated/OpenRouter.Interns2Client.Chat.g.cs b/src/libs/OpenRouter/Generated/OpenRouter.Interns2Client.Chat.g.cs
index fb717a41..174de366 100644
--- a/src/libs/OpenRouter/Generated/OpenRouter.Interns2Client.Chat.g.cs
+++ b/src/libs/OpenRouter/Generated/OpenRouter.Interns2Client.Chat.g.cs
@@ -61,7 +61,7 @@ partial void ProcessChatResponseContent(
/// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering.
/// The token to cancel the operation with
///
- public async global::System.Threading.Tasks.Task ChatAsync(
+ public async global::System.Threading.Tasks.Task ChatAsync(
string internId,
global::OpenRouter.InternChatCompletionRequest request,
@@ -96,7 +96,7 @@ partial void ProcessChatResponseContent(
/// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering.
/// The token to cancel the operation with
///
- public async global::System.Threading.Tasks.Task> ChatAsResponseAsync(
+ public async global::System.Threading.Tasks.Task> ChatAsResponseAsync(
string internId,
global::OpenRouter.InternChatCompletionRequest request,
@@ -844,9 +844,9 @@ partial void ProcessChatResponseContent(
{
__response.EnsureSuccessStatusCode();
- var __value = global::OpenRouter.InternChatCompletionChunk.FromJson(__content, JsonSerializerContext) ??
+ var __value = global::OpenRouter.InternChatSteeredResponse.FromJson(__content, JsonSerializerContext) ??
throw new global::System.InvalidOperationException($"Response deserialization failed for \"{__content}\" ");
- return new global::OpenRouter.AutoSDKHttpResponse(
+ return new global::OpenRouter.AutoSDKHttpResponse(
statusCode: __response.StatusCode,
headers: global::OpenRouter.AutoSDKHttpResponse.CreateHeaders(__response),
requestUri: __response.RequestMessage?.RequestUri,
@@ -876,9 +876,9 @@ partial void ProcessChatResponseContent(
#endif
).ConfigureAwait(false);
- var __value = await global::OpenRouter.InternChatCompletionChunk.FromJsonStreamAsync(__content, JsonSerializerContext).ConfigureAwait(false) ??
+ var __value = await global::OpenRouter.InternChatSteeredResponse.FromJsonStreamAsync(__content, JsonSerializerContext).ConfigureAwait(false) ??
throw new global::System.InvalidOperationException("Response deserialization failed.");
- return new global::OpenRouter.AutoSDKHttpResponse(
+ return new global::OpenRouter.AutoSDKHttpResponse(
statusCode: __response.StatusCode,
headers: global::OpenRouter.AutoSDKHttpResponse.CreateHeaders(__response),
requestUri: __response.RequestMessage?.RequestUri,
@@ -950,7 +950,7 @@ partial void ProcessChatResponseContent(
/// Per-request overrides such as headers, query parameters, timeout, retries, and response buffering.
/// The token to cancel the operation with
///
- public async global::System.Threading.Tasks.Task ChatAsync(
+ public async global::System.Threading.Tasks.Task ChatAsync(
string internId,
global::System.Collections.Generic.IList messages,
global::OpenRouter.InternApprovalMode? approvalMode = default,
diff --git a/src/libs/OpenRouter/Generated/OpenRouter.Models.OutputFusionServerToolItem.g.cs b/src/libs/OpenRouter/Generated/OpenRouter.Models.OutputFusionServerToolItem.g.cs
index eb598f51..2e821d0c 100644
--- a/src/libs/OpenRouter/Generated/OpenRouter.Models.OutputFusionServerToolItem.g.cs
+++ b/src/libs/OpenRouter/Generated/OpenRouter.Models.OutputFusionServerToolItem.g.cs
@@ -5,7 +5,7 @@ namespace OpenRouter
{
///
/// An openrouter:fusion server tool output item
- /// Example: {"id":"st_tmp_abc123","status":"completed","type":"openrouter:fusion"}
+ /// Example: {"arguments":"{\u0022prompt\u0022:\u0022Compare the leading approaches\u0022}","call_id":"call_fusion_abc123","id":"st_tmp_abc123","status":"completed","type":"openrouter:fusion"}
///
public sealed partial class OutputFusionServerToolItem
{
@@ -17,6 +17,22 @@ public sealed partial class OutputFusionServerToolItem
[global::System.Text.Json.Serialization.JsonPropertyName("analysis")]
public global::OpenRouter.FusionAnalysisResult? Analysis { get; set; }
+ ///
+ /// The raw tool-call arguments string as emitted by the model.
+ /// Example: {"prompt":"Compare the leading approaches"}
+ ///
+ /// {"prompt":"Compare the leading approaches"}
+ [global::System.Text.Json.Serialization.JsonPropertyName("arguments")]
+ public string? Arguments { get; set; }
+
+ ///
+ /// The model-generated tool call id from the originating turn.
+ /// Example: call_fusion_abc123
+ ///
+ /// call_fusion_abc123
+ [global::System.Text.Json.Serialization.JsonPropertyName("call_id")]
+ public string? CallId { get; set; }
+
///
/// Error message when the fusion run did not produce an analysis result.
///
@@ -85,6 +101,14 @@ public sealed partial class OutputFusionServerToolItem
/// Structured analysis produced by the fusion analyst model.
/// Example: {"blind_spots":["No model considered the impact on existing API consumers."],"consensus":["All panel models agree the request is asking for a concise summary."],"contradictions":[{"stances":[{"model":"openai/gpt-5","stance":"Favors an incremental rollout."},{"model":"anthropic/claude-sonnet-4.5","stance":"Favors a single coordinated migration."}],"topic":"Recommended approach"}],"partial_coverage":[{"models":["openai/gpt-5"],"point":"Only one model addressed the rollback strategy."}],"unique_insights":[{"insight":"Highlighted a backwards-compatibility risk the other models missed.","model":"anthropic/claude-sonnet-4.5"}]}
///
+ ///
+ /// The raw tool-call arguments string as emitted by the model.
+ /// Example: {"prompt":"Compare the leading approaches"}
+ ///
+ ///
+ /// The model-generated tool call id from the originating turn.
+ /// Example: call_fusion_abc123
+ ///
///
/// Error message when the fusion run did not produce an analysis result.
///
@@ -108,6 +132,8 @@ public sealed partial class OutputFusionServerToolItem
public OutputFusionServerToolItem(
global::OpenRouter.ToolCallStatus status,
global::OpenRouter.FusionAnalysisResult? analysis,
+ string? arguments,
+ string? callId,
string? error,
global::System.Collections.Generic.IList? failedModels,
string? failureReason,
@@ -117,6 +143,8 @@ public OutputFusionServerToolItem(
global::OpenRouter.OutputFusionServerToolItemType type)
{
this.Analysis = analysis;
+ this.Arguments = arguments;
+ this.CallId = callId;
this.Error = error;
this.FailedModels = failedModels;
this.FailureReason = failureReason;
diff --git a/src/libs/OpenRouter/Generated/OpenRouter.Models.OutputItems.g.cs b/src/libs/OpenRouter/Generated/OpenRouter.Models.OutputItems.g.cs
index 68a2787c..729fe083 100644
--- a/src/libs/OpenRouter/Generated/OpenRouter.Models.OutputItems.g.cs
+++ b/src/libs/OpenRouter/Generated/OpenRouter.Models.OutputItems.g.cs
@@ -1000,7 +1000,7 @@ public bool TryPickOpenrouterExperimentalSearchModels(
///
/// An openrouter:fusion server tool output item
- /// Example: {"id":"st_tmp_abc123","status":"completed","type":"openrouter:fusion"}
+ /// Example: {"arguments":"{\u0022prompt\u0022:\u0022Compare the leading approaches\u0022}","call_id":"call_fusion_abc123","id":"st_tmp_abc123","status":"completed","type":"openrouter:fusion"}
///
#if NET6_0_OR_GREATER
public global::OpenRouter.OutputFusionServerToolItem? OpenrouterFusion { get; init; }
diff --git a/src/libs/OpenRouter/Generated/autosdk.generated-examples.json b/src/libs/OpenRouter/Generated/autosdk.generated-examples.json
index 83f35eda..a571547d 100644
--- a/src/libs/OpenRouter/Generated/autosdk.generated-examples.json
+++ b/src/libs/OpenRouter/Generated/autosdk.generated-examples.json
@@ -347,7 +347,7 @@
"Slug": "listembeddingsmodels",
"Description": "Returns a list of all available embeddings models and their properties",
"Language": "csharp",
- "Code": "using var client = new OpenRouterClient(apiKey);\nvar response = await client.Embeddings.ListModelsAsync();\n\n// Example response:\n// {\n// \u0022data\u0022: [\n// {\n// \u0022architecture\u0022: {\n// \u0022input_modalities\u0022: [\n// \u0022text\u0022\n// ],\n// \u0022instruct_type\u0022: null,\n// \u0022modality\u0022: \u0022text-\\u003Etext\u0022,\n// \u0022output_modalities\u0022: [\n// \u0022embeddings\u0022\n// ],\n// \u0022tokenizer\u0022: \u0022GPT\u0022\n// },\n// \u0022canonical_slug\u0022: \u0022openai/text-embedding-3-small\u0022,\n// \u0022context_length\u0022: 8192,\n// \u0022created\u0022: 1692901234,\n// \u0022default_parameters\u0022: null,\n// \u0022description\u0022: \u0022OpenAI text embedding model optimized for performance.\u0022,\n// \u0022expiration_date\u0022: null,\n// \u0022id\u0022: \u0022openai/text-embedding-3-small\u0022,\n// \u0022knowledge_cutoff\u0022: null,\n// \u0022links\u0022: {\n// \u0022details\u0022: \u0022/api/v1/models/openai/text-embedding-3-small/endpoints\u0022\n// },\n// \u0022name\u0022: \u0022Text Embedding 3 Small\u0022,\n// \u0022per_request_limits\u0022: null,\n// \u0022pricing\u0022: {\n// \u0022completion\u0022: \u00220\u0022,\n// \u0022image\u0022: \u00220\u0022,\n// \u0022prompt\u0022: \u00220.00000002\u0022,\n// \u0022request\u0022: \u00220\u0022\n// },\n// \u0022supported_parameters\u0022: [],\n// \u0022supported_voices\u0022: null,\n// \u0022top_provider\u0022: {\n// \u0022context_length\u0022: 8192,\n// \u0022is_moderated\u0022: false,\n// \u0022max_completion_tokens\u0022: null\n// }\n// }\n// ]\n// }",
+ "Code": "using var client = new OpenRouterClient(apiKey);\nvar response = await client.Embeddings.ListModelsAsync();\n\n// Example response:\n// {\n// \u0022data\u0022: [\n// {\n// \u0022architecture\u0022: {\n// \u0022input_modalities\u0022: [\n// \u0022text\u0022\n// ],\n// \u0022instruct_type\u0022: null,\n// \u0022modality\u0022: \u0022text-\\u003Eembeddings\u0022,\n// \u0022output_modalities\u0022: [\n// \u0022embeddings\u0022\n// ],\n// \u0022tokenizer\u0022: \u0022GPT\u0022\n// },\n// \u0022canonical_slug\u0022: \u0022openai/text-embedding-3-small\u0022,\n// \u0022context_length\u0022: 8192,\n// \u0022created\u0022: 1692901234,\n// \u0022default_parameters\u0022: null,\n// \u0022description\u0022: \u0022OpenAI text embedding model optimized for performance.\u0022,\n// \u0022expiration_date\u0022: null,\n// \u0022id\u0022: \u0022openai/text-embedding-3-small\u0022,\n// \u0022knowledge_cutoff\u0022: null,\n// \u0022links\u0022: {\n// \u0022details\u0022: \u0022/api/v1/models/openai/text-embedding-3-small/endpoints\u0022\n// },\n// \u0022name\u0022: \u0022Text Embedding 3 Small\u0022,\n// \u0022per_request_limits\u0022: null,\n// \u0022pricing\u0022: {\n// \u0022completion\u0022: \u00220\u0022,\n// \u0022image\u0022: \u00220\u0022,\n// \u0022prompt\u0022: \u00220.00000002\u0022,\n// \u0022request\u0022: \u00220\u0022\n// },\n// \u0022supported_parameters\u0022: [],\n// \u0022supported_voices\u0022: null,\n// \u0022top_provider\u0022: {\n// \u0022context_length\u0022: 8192,\n// \u0022is_moderated\u0022: false,\n// \u0022max_completion_tokens\u0022: null\n// }\n// }\n// ]\n// }",
"Format": "sdk",
"OperationId": "listEmbeddingsModels",
"Setup": "This example assumes \u0060using OpenRouter;\u0060 is in scope and \u0060apiKey\u0060 contains the required credential."
@@ -699,7 +699,7 @@
"Slug": "createinternchatcompletion",
"Description": "Sends a prompt to one of your interns and streams the reply as OpenAI-compatible server-sent events ending with \u0060[DONE]\u0060. The run executes on the intern, which may pause to ask you something. It then streams one \u0060openrouter.provide_input\u0060 tool call and finishes with \u0060finish_reason: \u0022tool_calls\u0022\u0060, and the run stays open on the intern.\n\nEvery response, whether it ends with \u0060stop\u0060, \u0060tool_calls\u0060 or \u0060error\u0060, is followed by a final chunk with empty \u0060choices\u0060 that carries \u0060session_id\u0060, then \u0060data: [DONE]\u0060. That chunk carries the \u0060usage\u0060 the intern reported for the run, after \u0060stop\u0060 or \u0060error\u0060, and \u0060null\u0060 when the intern reported none. After \u0060tool_calls\u0060 its \u0060usage\u0060 is \u0060null\u0060 because the turn is not over. Read through \u0060[DONE]\u0060: the \u0060session_id\u0060 you need to reply arrives after the \u0060tool_calls\u0060 finish chunk.\n\nTo answer, send a second request with the same \u0060session_id\u0060, the assistant message echoing that tool call, and a \u0060tool\u0060 message whose \u0060tool_call_id\u0060 is the tool call id and whose \u0060content\u0060 is the answer. The answer is delivered to the run that asked and the stream continues from where it paused. A question stays open for its interaction deadline (5 minutes by default) and the run is cancelled when that passes. Rejected replies do not extend the deadline.\n\nClosing the connection after the \u0060[DONE]\u0060 that follows \u0060finish_reason: \u0022tool_calls\u0022\u0060 keeps the run alive. Disconnecting while a response is still streaming cancels the run. The stream writes a \u0060: keepalive\u0060 comment whenever nothing else has been written for 30 seconds, so a disconnect is noticed within that interval even while the intern is silent.\n\nA run the intern ends while you are still connected, by cancellation or by a deadline, ends the stream with a \u0060finish_reason: \u0022error\u0022\u0060 chunk carrying \u0060410\u0060 and reason \u0060run_ended\u0060, then the final empty-\u0060choices\u0060 chunk and \u0060[DONE]\u0060. That error reports only an ending the intern confirmed. A connection that breaks without that confirmation ends with reason \u0060stream_severed\u0060, and a client that has already disconnected is promised no final event.\n\nSet \u0060approval_mode\u0060 to \u0060manual\u0060 to have the intern ask before approval-bearing tools such as the shell. Omitted, the run self-drives and consents on your behalf. The mode belongs to the run started by that prompt and must be repeated on later prompts.\n\nAvailable to interns programme members. Callers outside the programme receive \u0060404\u0060 for every path under \u0060/api/v1/interns\u0060.",
"Language": "http",
- "Code": "### Stream a chat completion with an intern\n# @name createInternChatCompletion\nPOST {{host}}/interns/{{internId}}/chat/completions\nAuthorization: Bearer {{token}}\nContent-Type: application/json\nAccept: application/json, text/event-stream\n\n{\n \u0022approval_mode\u0022: \u0022manual\u0022,\n \u0022messages\u0022: [\n {\n \u0022content\u0022: \u0022Summarize the open pull requests.\u0022,\n \u0022role\u0022: \u0022user\u0022\n }\n ],\n \u0022stream\u0022: true\n}\n\n## Responses\n# 200\n# Description: The streamed completion. Chunks carry text, then a finish chunk: \u0060finish_reason: \u0022stop\u0022\u0060 when the turn is complete, \u0060finish_reason: \u0022tool_calls\u0022\u0060 when the intern is waiting for an answer, or \u0060finish_reason: \u0022error\u0022\u0060 for a failure after this status. A final chunk with empty \u0060choices\u0060 follows in every case, carrying \u0060session_id\u0060 and \u0060usage\u0060 (\u0060null\u0060 unless the intern reported usage, and always \u0060null\u0060 after \u0060tool_calls\u0060), and the stream ends with \u0060data: [DONE]\u0060.\n# Content-Type: application/json, text/event-stream\n# 202\n# Description: A turn is already running in this \u0060session_id\u0060, and the message was delivered into it instead of starting a new turn. Nothing streams here: the intern takes the message up on the running turn, whose stream continues on the request that started it. Sent only for a \u0060user\u0060 message with a \u0060session_id\u0060; a \u0060tool\u0060 reply into a running session gets \u0060409 busy\u0060, as does a message the intern could not take. Other sessions on the same intern are not affected and run in parallel.\n# Content-Type: application/json\n# 400\n# Description: The body is not a valid request (\u0060bad_request\u0060), or the intern did not accept the answer for the pending question, such as a permission option it did not offer.\n# Content-Type: application/json\n# 401\n# Description: No valid API key.\n# Content-Type: application/json\n# 403\n# Description: The key belongs to a member who has left the organization and holds no grant.\n# Content-Type: application/json\n# 404\n# Description: The caller is outside the interns programme, the intern does not exist for this key (\u0060not_found\u0060), or no pending question has this \u0060tool_call_id\u0060 in this session (\u0060interaction_unknown\u0060).\n# Content-Type: application/json\n# 408\n# Description: The request exceeded the route\u0027s own deadline before the handler answered (\u0060timeout\u0060). Distinct from the 504, which is the intern failing to answer within the turn budget.\n# Content-Type: application/json\n# 409\n# Description: The intern is not running (\u0060intern_not_ready\u0060), a turn is already running in this session and did not take the message within 15 seconds (\u0060busy\u0060, also sent when the turn is waiting on a question of its own), the question is no longer waiting (\u0060interaction_not_pending\u0060), or another request is already attached to the run (\u0060attachment_failed\u0060). Turns in different sessions on the same intern run in parallel. \u0060intern_not_ready\u0060 and \u0060busy\u0060 report \u0060retryable: true\u0060, and a \u0060busy\u0060 refusal carries \u0060Retry-After\u0060.\n# Content-Type: application/json\n# 410\n# Description: The run produced more output than the intern retains, so the paused stream cannot be resumed (\u0060attachment_failed\u0060).\n# Content-Type: application/json\n# 413\n# Description: The body exceeds 1 MiB (\u0060payload_too_large\u0060).\n# Content-Type: application/json\n# 429\n# Description: Too many turns for the user or organization this key acts as (\u0060rate_limited\u0060). It reports \u0060retryable: true\u0060 and carries \u0060Retry-After\u0060.\n# Content-Type: application/json\n# 502\n# Description: The intern could not be reached or rejected the request (\u0060intern_unreachable\u0060, \u0060intern_rejected\u0060), the intern refused the turn before any output (\u0060turn_failed\u0060), or its stream ended before the turn started (\u0060stream_severed\u0060). \u0060intern_unreachable\u0060 and \u0060stream_severed\u0060 are transient and report \u0060retryable: true\u0060; \u0060intern_rejected\u0060 reports \u0060false\u0060. A \u0060turn_failed\u0060 varies by failure and carries the intern\u0027s own classification of what went wrong, so read \u0060metadata.retryable\u0060 rather than assuming from the reason.\n# Content-Type: application/json\n# 503\n# Description: The intern cannot hold another run open across a question right now (\u0060busy\u0060). It reports \u0060retryable: true\u0060 and carries \u0060Retry-After\u0060.\n# Content-Type: application/json\n# 504\n# Description: The intern did not answer within the request budget (\u0060timeout\u0060).\n# Content-Type: application/json",
+ "Code": "### Stream a chat completion with an intern\n# @name createInternChatCompletion\nPOST {{host}}/interns/{{internId}}/chat/completions\nAuthorization: Bearer {{token}}\nContent-Type: application/json\nAccept: application/json, text/event-stream\n\n{\n \u0022approval_mode\u0022: \u0022manual\u0022,\n \u0022messages\u0022: [\n {\n \u0022content\u0022: \u0022Summarize the open pull requests.\u0022,\n \u0022role\u0022: \u0022user\u0022\n }\n ],\n \u0022stream\u0022: true\n}\n\n## Responses\n# 200\n# Description: The streamed completion. Chunks carry text, then a finish chunk: \u0060finish_reason: \u0022stop\u0022\u0060 when the turn is complete, \u0060finish_reason: \u0022tool_calls\u0022\u0060 when the intern is waiting for an answer, or \u0060finish_reason: \u0022error\u0022\u0060 for a failure after this status. A final chunk with empty \u0060choices\u0060 follows in every case, carrying \u0060session_id\u0060 and \u0060usage\u0060 (\u0060null\u0060 unless the intern reported usage, and always \u0060null\u0060 after \u0060tool_calls\u0060), and the stream ends with \u0060data: [DONE]\u0060.\n# Content-Type: text/event-stream\n# 202\n# Description: A turn is already running in this \u0060session_id\u0060, and the message was delivered into it instead of starting a new turn. Nothing streams here: the intern takes the message up on the running turn, whose stream continues on the request that started it. Sent only for a \u0060user\u0060 message with a \u0060session_id\u0060; a \u0060tool\u0060 reply into a running session gets \u0060409 busy\u0060, as does a message the intern could not take. Other sessions on the same intern are not affected and run in parallel.\n# Content-Type: application/json\n# 400\n# Description: The body is not a valid request (\u0060bad_request\u0060), or the intern did not accept the answer for the pending question, such as a permission option it did not offer.\n# Content-Type: application/json\n# 401\n# Description: No valid API key.\n# Content-Type: application/json\n# 403\n# Description: The key belongs to a member who has left the organization and holds no grant.\n# Content-Type: application/json\n# 404\n# Description: The caller is outside the interns programme, the intern does not exist for this key (\u0060not_found\u0060), or no pending question has this \u0060tool_call_id\u0060 in this session (\u0060interaction_unknown\u0060).\n# Content-Type: application/json\n# 408\n# Description: The request exceeded the route\u0027s own deadline before the handler answered (\u0060timeout\u0060). Distinct from the 504, which is the intern failing to answer within the turn budget.\n# Content-Type: application/json\n# 409\n# Description: The intern is not running (\u0060intern_not_ready\u0060), a turn is already running in this session and did not take the message within 15 seconds (\u0060busy\u0060, also sent when the turn is waiting on a question of its own), the question is no longer waiting (\u0060interaction_not_pending\u0060), or another request is already attached to the run (\u0060attachment_failed\u0060). Turns in different sessions on the same intern run in parallel. \u0060intern_not_ready\u0060 and \u0060busy\u0060 report \u0060retryable: true\u0060, and a \u0060busy\u0060 refusal carries \u0060Retry-After\u0060.\n# Content-Type: application/json\n# 410\n# Description: The run produced more output than the intern retains, so the paused stream cannot be resumed (\u0060attachment_failed\u0060).\n# Content-Type: application/json\n# 413\n# Description: The body exceeds 1 MiB (\u0060payload_too_large\u0060).\n# Content-Type: application/json\n# 429\n# Description: Too many turns for the user or organization this key acts as (\u0060rate_limited\u0060). It reports \u0060retryable: true\u0060 and carries \u0060Retry-After\u0060.\n# Content-Type: application/json\n# 502\n# Description: The intern could not be reached or rejected the request (\u0060intern_unreachable\u0060, \u0060intern_rejected\u0060), the intern refused the turn before any output (\u0060turn_failed\u0060), or its stream ended before the turn started (\u0060stream_severed\u0060). \u0060intern_unreachable\u0060 and \u0060stream_severed\u0060 are transient and report \u0060retryable: true\u0060; \u0060intern_rejected\u0060 reports \u0060false\u0060. A \u0060turn_failed\u0060 varies by failure and carries the intern\u0027s own classification of what went wrong, so read \u0060metadata.retryable\u0060 rather than assuming from the reason.\n# Content-Type: application/json\n# 503\n# Description: The intern cannot hold another run open across a question right now (\u0060busy\u0060). It reports \u0060retryable: true\u0060 and carries \u0060Retry-After\u0060.\n# Content-Type: application/json\n# 504\n# Description: The intern did not answer within the request budget (\u0060timeout\u0060).\n# Content-Type: application/json",
"Format": "http",
"OperationId": "createInternChatCompletion",
"Setup": null
diff --git a/src/libs/OpenRouter/openapi.yaml b/src/libs/OpenRouter/openapi.yaml
index b77eebf0..8067c49a 100644
--- a/src/libs/OpenRouter/openapi.yaml
+++ b/src/libs/OpenRouter/openapi.yaml
@@ -12,6 +12,7 @@
"AppDisplayName": {
"name": "X-OpenRouter-Title",
"in": "header",
+ "x-speakeasy-name-override": "appTitle",
"schema": {
"type": "string"
},
@@ -20,6 +21,7 @@
"AppCategories": {
"name": "X-OpenRouter-Categories",
"in": "header",
+ "x-speakeasy-name-override": "appCategories",
"schema": {
"type": "string"
},
@@ -6352,7 +6354,8 @@
"type": "integer"
},
"error": {
- "$ref": "#/components/schemas/ResponsesErrorField"
+ "$ref": "#/components/schemas/ResponsesErrorField",
+ "nullable": true
},
"frequency_penalty": {
"format": "double",
@@ -6365,22 +6368,26 @@
"type": "string"
},
"incomplete_details": {
- "$ref": "#/components/schemas/IncompleteDetails"
+ "$ref": "#/components/schemas/IncompleteDetails",
+ "nullable": true
},
"instructions": {
- "$ref": "#/components/schemas/BaseInputs"
+ "$ref": "#/components/schemas/BaseInputs",
+ "nullable": true
},
"max_output_tokens": {
"type": [
"integer",
"null"
- ]
+ ],
+ "nullable": true
},
"max_tool_calls": {
"type": [
"integer",
"null"
- ]
+ ],
+ "nullable": true
},
"metadata": {
"$ref": "#/components/schemas/RequestMetadata"
@@ -6474,7 +6481,8 @@
"$ref": "#/components/schemas/PromptCacheOptions"
},
"reasoning": {
- "$ref": "#/components/schemas/BaseReasoningConfig"
+ "$ref": "#/components/schemas/BaseReasoningConfig",
+ "nullable": true
},
"safety_identifier": {
"type": [
@@ -6499,7 +6507,8 @@
]
},
"text": {
- "$ref": "#/components/schemas/TextConfig"
+ "$ref": "#/components/schemas/TextConfig",
+ "nullable": true
},
"tool_choice": {
"$ref": "#/components/schemas/OpenAIResponsesToolChoice"
@@ -6623,7 +6632,8 @@
"type": "array"
},
"top_logprobs": {
- "type": "integer"
+ "type": "integer",
+ "nullable": true
},
"top_p": {
"format": "double",
@@ -6633,7 +6643,8 @@
]
},
"truncation": {
- "$ref": "#/components/schemas/Truncation"
+ "$ref": "#/components/schemas/Truncation",
+ "nullable": true
},
"usage": {
"$ref": "#/components/schemas/OpenAIResponsesUsage"
@@ -15279,28 +15290,32 @@
"type": [
"number",
"null"
- ]
+ ],
+ "nullable": true
},
"presence_penalty": {
"format": "double",
"type": [
"number",
"null"
- ]
+ ],
+ "nullable": true
},
"repetition_penalty": {
"format": "double",
"type": [
"number",
"null"
- ]
+ ],
+ "nullable": true
},
"temperature": {
"format": "double",
"type": [
"number",
"null"
- ]
+ ],
+ "nullable": true
},
"top_k": {
"type": [
@@ -15313,7 +15328,8 @@
"type": [
"number",
"null"
- ]
+ ],
+ "nullable": true
}
},
"type": [
@@ -33555,6 +33571,8 @@
"OutputFusionServerToolItem": {
"description": "An openrouter:fusion server tool output item",
"example": {
+ "arguments": "{\"prompt\":\"Compare the leading approaches\"}",
+ "call_id": "call_fusion_abc123",
"id": "st_tmp_abc123",
"status": "completed",
"type": "openrouter:fusion"
@@ -33563,6 +33581,22 @@
"analysis": {
"$ref": "#/components/schemas/FusionAnalysisResult"
},
+ "arguments": {
+ "description": "The raw tool-call arguments string as emitted by the model.",
+ "example": "{\"prompt\":\"Compare the leading approaches\"}",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
+ "call_id": {
+ "description": "The model-generated tool call id from the originating turn.",
+ "example": "call_fusion_abc123",
+ "type": [
+ "string",
+ "null"
+ ]
+ },
"error": {
"description": "Error message when the fusion run did not produce an analysis result.",
"type": "string"
@@ -44339,7 +44373,8 @@
"type": [
"integer",
"null"
- ]
+ ],
+ "nullable": true
},
"is_moderated": {
"description": "Whether the top provider moderates content",
@@ -44352,7 +44387,8 @@
"type": [
"integer",
"null"
- ]
+ ],
+ "nullable": true
}
},
"required": [
@@ -51408,8 +51444,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -53743,8 +53778,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
}
],
@@ -54201,8 +54235,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
}
],
@@ -54968,8 +55001,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -54999,7 +55031,7 @@
"text"
],
"instruct_type": null,
- "modality": "text->text",
+ "modality": "text->embeddings",
"output_modalities": [
"embeddings"
],
@@ -55128,8 +55160,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -57569,8 +57600,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -58272,8 +58302,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -58694,8 +58723,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -59089,8 +59117,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -59220,8 +59247,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -61069,11 +61095,6 @@
"$ref": "#/components/schemas/InternChatStreamingResponse"
},
"x-speakeasy-sse-sentinel": "[DONE]"
- },
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/InternChatCompletionChunk"
- }
}
},
"description": "The streamed completion. Chunks carry text, then a finish chunk: `finish_reason: \"stop\"` when the turn is complete, `finish_reason: \"tool_calls\"` when the intern is waiting for an answer, or `finish_reason: \"error\"` for a failure after this status. A final chunk with empty `choices` follows in every case, carrying `session_id` and `usage` (`null` unless the intern reported usage, and always `null` after `tool_calls`), and the stream ends with `data: [DONE]`."
@@ -63572,8 +63593,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -65875,8 +65895,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -66747,8 +66766,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -67087,8 +67105,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -67787,8 +67804,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -68205,8 +68221,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -69105,8 +69120,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -72743,8 +72757,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -73306,8 +73319,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -73960,8 +73972,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -74263,8 +74274,7 @@
"example": 0,
"maximum": 10000,
"minimum": 0,
- "type": "integer",
- "nullable": false
+ "type": "integer"
}
}
],
@@ -74620,8 +74630,7 @@
"example": 0,
"maximum": 10000,
"minimum": 0,
- "type": "integer",
- "nullable": false
+ "type": "integer"
}
}
],
@@ -75993,8 +76002,7 @@
"example": 0,
"maximum": 10000,
"minimum": 0,
- "type": "integer",
- "nullable": false
+ "type": "integer"
}
}
],
@@ -77538,8 +77546,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -78222,8 +78229,7 @@
"type": [
"integer",
"null"
- ],
- "nullable": false
+ ]
}
},
{
@@ -79323,8 +79329,7 @@
},
{
"name": "beta.responses",
- "deprecated": true,
- "description": "Deprecated alias for responses endpoints. Use responses instead. Scheduled for removal (sunset date TBD)."
+ "description": "Deprecated alias of responses. Use responses instead; scheduled for removal (sunset date TBD)."
}
],
"x-retry-strategy": {