From aed8199b2b2cbf4764a4ed3beb757e7d31ed1e16 Mon Sep 17 00:00:00 2001 From: Matt Apperson Date: Thu, 4 Dec 2025 13:07:01 -0500 Subject: [PATCH 1/2] updates --- .speakeasy/gen.lock | 63 ++++--- .speakeasy/gen.yaml | 12 +- .speakeasy/out.openapi.yaml | 164 ++++++++---------- USAGE.md | 112 +----------- docs/components/chatgenerationparams.md | 3 +- docs/components/chatmessagecontentitem.md | 6 + .../chatmessagecontentitemaudioformat.md | 14 ++ .../chatmessagecontentitemaudioinputaudio.md | 8 +- .../chatmessagecontentitemcachecontrol.md | 9 - docs/components/chatmessagecontentitemfile.md | 9 + docs/components/chatmessagecontentitemtext.md | 9 +- .../chatmessagecontentitemvideoinputvideo.md | 8 +- .../chatmessagecontentitemvideovideourl.md | 8 +- ...essagecontentitemvideovideourlvideourl.md} | 2 +- docs/components/completionchoice.md | 4 +- docs/components/completionresponse.md | 1 - docs/components/debug.md | 8 - docs/components/file.md | 10 ++ docs/components/idresponsehealing.md | 8 - docs/components/openresponsesrequest.md | 4 +- docs/components/plugin.md | 6 - docs/components/pluginresponsehealing.md | 8 - docs/components/providername.md | 6 +- docs/components/servicetier.md | 10 +- docs/components/ttl.md | 9 - docs/components/{videourl1.md => videourl.md} | 2 +- docs/operations/createembeddingsresponse.md | 21 ++- .../createembeddingsresponsebody.md | 14 ++ docs/operations/getcreditsdata.md | 9 - docs/operations/getcreditsresponse.md | 5 +- docs/operations/getparametersprovider.md | 6 +- docs/operations/updatekeysrequest.md | 2 +- docs/sdks/apikeys/README.md | 5 +- docs/sdks/chat/README.md | 1 - docs/sdks/embeddings/README.md | 19 +- docs/sdks/oauth/README.md | 4 +- docs/sdks/responses/README.md | 59 +------ pyproject.toml | 2 +- src/openrouter/_version.py | 4 +- src/openrouter/api_keys.py | 16 +- src/openrouter/chat.py | 14 -- src/openrouter/components/__init__.py | 80 ++++----- .../components/chatcompletionfinishreason.py | 17 -- .../components/chatgenerationparams.py | 12 -- .../components/chatmessagecontentitem.py | 8 +- .../components/chatmessagecontentitemaudio.py | 31 +++- .../chatmessagecontentitemcachecontrol.py | 32 ---- .../components/chatmessagecontentitemfile.py | 37 ++++ .../components/chatmessagecontentitemtext.py | 11 +- .../components/chatmessagecontentitemvideo.py | 21 +-- .../components/chatresponsechoice.py | 68 +++++++- .../components/chatstreamingchoice.py | 72 -------- .../components/chatstreamingresponsechunk.py | 2 +- src/openrouter/components/completionchoice.py | 23 +-- .../components/completionresponse.py | 3 - .../components/openresponsesrequest.py | 50 +++--- src/openrouter/components/providername.py | 6 +- src/openrouter/components/videourl.py | 13 ++ src/openrouter/embeddings.py | 26 ++- src/openrouter/operations/__init__.py | 17 +- src/openrouter/operations/createembeddings.py | 15 +- src/openrouter/operations/getcredits.py | 19 -- src/openrouter/operations/getparameters.py | 6 +- src/openrouter/operations/updatekeys.py | 4 +- src/openrouter/responses.py | 26 ++- 65 files changed, 518 insertions(+), 765 deletions(-) create mode 100644 docs/components/chatmessagecontentitemaudioformat.md delete mode 100644 docs/components/chatmessagecontentitemcachecontrol.md create mode 100644 docs/components/chatmessagecontentitemfile.md rename docs/components/{videourl2.md => chatmessagecontentitemvideovideourlvideourl.md} (85%) delete mode 100644 docs/components/debug.md create mode 100644 docs/components/file.md delete mode 100644 docs/components/idresponsehealing.md delete mode 100644 docs/components/pluginresponsehealing.md delete mode 100644 docs/components/ttl.md rename docs/components/{videourl1.md => videourl.md} (95%) create mode 100644 docs/operations/createembeddingsresponsebody.md delete mode 100644 docs/operations/getcreditsdata.md delete mode 100644 src/openrouter/components/chatcompletionfinishreason.py delete mode 100644 src/openrouter/components/chatmessagecontentitemcachecontrol.py create mode 100644 src/openrouter/components/chatmessagecontentitemfile.py delete mode 100644 src/openrouter/components/chatstreamingchoice.py create mode 100644 src/openrouter/components/videourl.py diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index a859182..569c59c 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,12 +1,12 @@ lockVersion: 2.0.0 id: cfd52247-6a25-4c6d-bbce-fe6fce0cd69d management: - docChecksum: 7c3a22e3f6b8d7c91ff063e2951aed2f + docChecksum: bcccd1abd05f6654a822386f2eefbd8a docVersion: 1.0.0 speakeasyVersion: 1.666.0 generationVersion: 2.768.0 - releaseVersion: 0.1.1 - configChecksum: 1206f35a1f0802441ea1b8674cd04f00 + releaseVersion: 0.0.16 + configChecksum: cd00e781b0ef78cfcb3fe812f51e93ff repoURL: https://github.com/OpenRouterTeam/python-sdk.git installationURL: https://github.com/OpenRouterTeam/python-sdk.git published: true @@ -66,14 +66,16 @@ generatedFiles: - docs/components/chatgenerationtokenusage.md - docs/components/chatmessagecontentitem.md - docs/components/chatmessagecontentitemaudio.md + - docs/components/chatmessagecontentitemaudioformat.md - docs/components/chatmessagecontentitemaudioinputaudio.md - - docs/components/chatmessagecontentitemcachecontrol.md + - docs/components/chatmessagecontentitemfile.md - docs/components/chatmessagecontentitemimage.md - docs/components/chatmessagecontentitemimagedetail.md - docs/components/chatmessagecontentitemtext.md - docs/components/chatmessagecontentitemvideo.md - docs/components/chatmessagecontentitemvideoinputvideo.md - docs/components/chatmessagecontentitemvideovideourl.md + - docs/components/chatmessagecontentitemvideovideourlvideourl.md - docs/components/chatmessagetokenlogprob.md - docs/components/chatmessagetokenlogprobs.md - docs/components/chatmessagetoolcall.md @@ -106,12 +108,12 @@ generatedFiles: - docs/components/costdetails.md - docs/components/createchargerequest.md - docs/components/datacollection.md - - docs/components/debug.md - docs/components/defaultparameters.md - docs/components/edgenetworktimeoutresponseerrordata.md - docs/components/effort.md - docs/components/endpointstatus.md - docs/components/engine.md + - docs/components/file.md - docs/components/filecitation.md - docs/components/filecitationtype.md - docs/components/filepath.md @@ -119,7 +121,6 @@ generatedFiles: - docs/components/forbiddenresponseerrordata.md - docs/components/idfileparser.md - docs/components/idmoderation.md - - docs/components/idresponsehealing.md - docs/components/idweb.md - docs/components/ignore.md - docs/components/imagegenerationstatus.md @@ -303,7 +304,6 @@ generatedFiles: - docs/components/plugin.md - docs/components/pluginfileparser.md - docs/components/pluginmoderation.md - - docs/components/pluginresponsehealing.md - docs/components/pluginweb.md - docs/components/pricing.md - docs/components/prompt.md @@ -395,7 +395,6 @@ generatedFiles: - docs/components/toplogprob.md - docs/components/topproviderinfo.md - docs/components/truncation.md - - docs/components/ttl.md - docs/components/type.md - docs/components/typeresponsecompleted.md - docs/components/typeresponsecontentpartadded.md @@ -421,8 +420,7 @@ generatedFiles: - docs/components/usermessage.md - docs/components/usermessagecontent.md - docs/components/variables.md - - docs/components/videourl1.md - - docs/components/videourl2.md + - docs/components/videourl.md - docs/components/websearchpreviewtooluserlocation.md - docs/components/websearchpreviewtooluserlocationtype.md - docs/components/websearchstatus.md @@ -459,6 +457,7 @@ generatedFiles: - docs/operations/createembeddingsprovider.md - docs/operations/createembeddingsrequest.md - docs/operations/createembeddingsresponse.md + - docs/operations/createembeddingsresponsebody.md - docs/operations/createkeysdata.md - docs/operations/createkeyslimitreset.md - docs/operations/createkeysrequest.md @@ -472,7 +471,6 @@ generatedFiles: - docs/operations/exchangeauthcodeforapikeycodechallengemethod.md - docs/operations/exchangeauthcodeforapikeyrequest.md - docs/operations/exchangeauthcodeforapikeyresponse.md - - docs/operations/getcreditsdata.md - docs/operations/getcreditsresponse.md - docs/operations/getcurrentkeydata.md - docs/operations/getcurrentkeyresponse.md @@ -555,13 +553,12 @@ generatedFiles: - src/openrouter/components/assistantmessage.py - src/openrouter/components/badgatewayresponseerrordata.py - src/openrouter/components/badrequestresponseerrordata.py - - src/openrouter/components/chatcompletionfinishreason.py - src/openrouter/components/chaterror.py - src/openrouter/components/chatgenerationparams.py - src/openrouter/components/chatgenerationtokenusage.py - src/openrouter/components/chatmessagecontentitem.py - src/openrouter/components/chatmessagecontentitemaudio.py - - src/openrouter/components/chatmessagecontentitemcachecontrol.py + - src/openrouter/components/chatmessagecontentitemfile.py - src/openrouter/components/chatmessagecontentitemimage.py - src/openrouter/components/chatmessagecontentitemtext.py - src/openrouter/components/chatmessagecontentitemvideo.py @@ -570,7 +567,6 @@ generatedFiles: - src/openrouter/components/chatmessagetoolcall.py - src/openrouter/components/chatresponse.py - src/openrouter/components/chatresponsechoice.py - - src/openrouter/components/chatstreamingchoice.py - src/openrouter/components/chatstreamingmessagechunk.py - src/openrouter/components/chatstreamingmessagetoolcall.py - src/openrouter/components/chatstreamingresponsechunk.py @@ -693,6 +689,7 @@ generatedFiles: - src/openrouter/components/unprocessableentityresponseerrordata.py - src/openrouter/components/urlcitation.py - src/openrouter/components/usermessage.py + - src/openrouter/components/videourl.py - src/openrouter/components/websearchpreviewtooluserlocation.py - src/openrouter/components/websearchstatus.py - src/openrouter/credits.py @@ -776,10 +773,10 @@ examples: createResponses: speakeasy-default-create-responses: requestBody: - application/json: {"input": [{"type": "message", "role": "user", "content": "Hello, how are you?"}], "tools": [{"type": "function", "name": "get_current_weather", "description": "Get the current weather in a given location", "parameters": {"type": "object", "properties": {"location": {"type": "string"}}}}], "model": "anthropic/claude-4.5-sonnet-20250929", "temperature": 0.7, "top_p": 0.9, "store": false, "service_tier": "auto", "stream": false} + application/json: {"stream": false} responses: "200": - application/json: {"id": "resp-abc123", "object": "response", "created_at": 1704067200, "model": "gpt-4", "status": "completed", "output": [{"id": "msg-abc123", "role": "assistant", "type": "message", "status": "completed", "content": [{"type": "output_text", "text": "Hello! How can I help you today?", "annotations": []}]}], "error": null, "incomplete_details": null, "usage": {"input_tokens": 10, "input_tokens_details": {"cached_tokens": 0}, "output_tokens": 25, "output_tokens_details": {"reasoning_tokens": 0}, "total_tokens": 35}, "max_output_tokens": null, "temperature": null, "top_p": null, "instructions": null, "metadata": null, "tools": [], "tool_choice": "auto", "parallel_tool_calls": true} + application/json: {"id": "resp-abc123", "object": "response", "created_at": 1704067200, "model": "gpt-4", "output": [{"id": "msg-abc123", "role": "assistant", "type": "message", "content": [{"type": "output_text", "text": "Hello! How can I help you today?"}]}], "error": null, "incomplete_details": null, "temperature": null, "top_p": null, "instructions": null, "metadata": null, "tools": [], "tool_choice": "auto", "parallel_tool_calls": true} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "401": @@ -826,7 +823,7 @@ examples: speakeasy-default-get-credits: responses: "200": - application/json: {"data": {"total_credits": 100.5, "total_usage": 25.75}} + application/json: {} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "403": @@ -851,7 +848,7 @@ examples: createEmbeddings: speakeasy-default-create-embeddings: requestBody: - application/json: {"input": "", "model": "Taurus", "provider": {"data_collection": "allow", "zdr": true, "enforce_distillable_text": true, "order": ["OpenAI"], "only": ["OpenAI"], "ignore": ["OpenAI"], "quantizations": ["fp16"], "sort": "price"}} + application/json: {"input": "", "model": "Taurus"} responses: "200": application/json: {"object": "list", "data": [], "model": "Land Cruiser"} @@ -880,7 +877,7 @@ examples: speakeasy-default-list-embeddings-models: responses: "200": - application/json: {"data": [{"id": "openai/gpt-4", "canonical_slug": "openai/gpt-4", "name": "GPT-4", "created": 1692901234, "description": "GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy.", "pricing": {"prompt": "0.00003", "completion": "0.00006", "request": "0", "image": "0"}, "context_length": 8192, "architecture": {"tokenizer": "GPT", "instruct_type": "chatml", "modality": "text->text", "input_modalities": ["text"], "output_modalities": ["text"]}, "top_provider": {"context_length": 8192, "max_completion_tokens": 4096, "is_moderated": true}, "per_request_limits": null, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "default_parameters": null}]} + application/json: {"data": [{"id": "openai/gpt-4", "canonical_slug": "openai/gpt-4", "name": "GPT-4", "created": 1692901234, "pricing": {"prompt": "0.00003", "completion": "0.00006"}, "context_length": 8192, "architecture": {"modality": "text->text", "input_modalities": ["text"], "output_modalities": ["text"]}, "top_provider": {"is_moderated": true}, "per_request_limits": null, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "default_parameters": null}]} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "500": @@ -920,7 +917,7 @@ examples: speakeasy-default-get-models: responses: "200": - application/json: {"data": [{"id": "openai/gpt-4", "canonical_slug": "openai/gpt-4", "name": "GPT-4", "created": 1692901234, "description": "GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy.", "pricing": {"prompt": "0.00003", "completion": "0.00006", "request": "0", "image": "0"}, "context_length": 8192, "architecture": {"tokenizer": "GPT", "instruct_type": "chatml", "modality": "text->text", "input_modalities": ["text"], "output_modalities": ["text"]}, "top_provider": {"context_length": 8192, "max_completion_tokens": 4096, "is_moderated": true}, "per_request_limits": null, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "default_parameters": null}]} + application/json: {"data": [{"id": "openai/gpt-4", "canonical_slug": "openai/gpt-4", "name": "GPT-4", "created": 1692901234, "pricing": {"prompt": "0.00003", "completion": "0.00006"}, "context_length": 8192, "architecture": {"modality": "text->text", "input_modalities": ["text"], "output_modalities": ["text"]}, "top_provider": {"is_moderated": true}, "per_request_limits": null, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "default_parameters": null}]} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "500": @@ -929,7 +926,7 @@ examples: speakeasy-default-list-models-user: responses: "200": - application/json: {"data": [{"id": "openai/gpt-4", "canonical_slug": "openai/gpt-4", "name": "GPT-4", "created": 1692901234, "description": "GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy.", "pricing": {"prompt": "0.00003", "completion": "0.00006", "request": "0", "image": "0"}, "context_length": 8192, "architecture": {"tokenizer": "GPT", "instruct_type": "chatml", "modality": "text->text", "input_modalities": ["text"], "output_modalities": ["text"]}, "top_provider": {"context_length": 8192, "max_completion_tokens": 4096, "is_moderated": true}, "per_request_limits": null, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "default_parameters": null}]} + application/json: {"data": [{"id": "openai/gpt-4", "canonical_slug": "openai/gpt-4", "name": "GPT-4", "created": 1692901234, "pricing": {"prompt": "0.00003", "completion": "0.00006"}, "context_length": 8192, "architecture": {"modality": "text->text", "input_modalities": ["text"], "output_modalities": ["text"]}, "top_provider": {"is_moderated": true}, "per_request_limits": null, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "default_parameters": null}]} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "500": @@ -942,7 +939,7 @@ examples: slug: "" responses: "200": - application/json: {"data": {"id": "openai/gpt-4", "name": "GPT-4", "created": 1692901234, "description": "GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy.", "architecture": {"tokenizer": "GPT", "instruct_type": "chatml", "modality": "text->text", "input_modalities": ["text"], "output_modalities": ["text"]}, "endpoints": [{"name": "OpenAI: GPT-4", "model_name": "GPT-4", "context_length": 8192, "pricing": {"prompt": "0.00003", "completion": "0.00006", "request": "0", "image": "0"}, "provider_name": "OpenAI", "tag": "openai", "quantization": "fp16", "max_completion_tokens": 4096, "max_prompt_tokens": 8192, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "status": -3, "uptime_last_30m": 99.5, "supports_implicit_caching": true}]}} + application/json: {"data": {"id": "openai/gpt-4", "name": "GPT-4", "created": 1692901234, "description": "GPT-4 is a large multimodal model that can solve difficult problems with greater accuracy.", "architecture": {"tokenizer": "GPT", "instruct_type": "chatml", "modality": "text->text", "input_modalities": ["text"], "output_modalities": ["text"]}, "endpoints": [{"name": "OpenAI: GPT-4", "model_name": "GPT-4", "context_length": 8192, "pricing": {"prompt": "0.00003", "completion": "0.00006"}, "provider_name": "OpenAI", "tag": "openai", "quantization": "fp16", "max_completion_tokens": 4096, "max_prompt_tokens": 8192, "supported_parameters": ["temperature", "top_p", "max_tokens", "frequency_penalty", "presence_penalty"], "uptime_last_30m": 99.5, "supports_implicit_caching": true}]}} "404": application/json: {"error": {"code": 404, "message": "Resource not found"}} "500": @@ -951,7 +948,7 @@ examples: speakeasy-default-list-endpoints-zdr: responses: "200": - application/json: {"data": [{"name": "OpenAI: GPT-4", "model_name": "GPT-4", "context_length": 8192, "pricing": {"prompt": "0.00003", "completion": "0.00006", "request": "0", "image": "0"}, "provider_name": "OpenAI", "tag": "openai", "quantization": "fp16", "max_completion_tokens": 4096, "max_prompt_tokens": 8192, "supported_parameters": ["temperature", "top_p", "max_tokens"], "status": 0, "uptime_last_30m": 99.5, "supports_implicit_caching": true}]} + application/json: {"data": [{"name": "OpenAI: GPT-4", "model_name": "GPT-4", "context_length": 8192, "pricing": {"prompt": "0.00003", "completion": "0.00006"}, "provider_name": "OpenAI", "tag": "openai", "quantization": "fp16", "max_completion_tokens": 4096, "max_prompt_tokens": 8192, "supported_parameters": ["temperature", "top_p", "max_tokens"], "uptime_last_30m": 99.5, "supports_implicit_caching": true}]} "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} getParameters: @@ -973,7 +970,7 @@ examples: speakeasy-default-list-providers: responses: "200": - application/json: {"data": [{"name": "OpenAI", "slug": "openai", "privacy_policy_url": "https://openai.com/privacy", "terms_of_service_url": "https://openai.com/terms", "status_page_url": "https://status.openai.com"}]} + application/json: {"data": [{"name": "OpenAI", "slug": "openai", "privacy_policy_url": "https://openai.com/privacy"}]} "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} list: @@ -984,7 +981,7 @@ examples: offset: "0" responses: "200": - application/json: {"data": [{"hash": "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", "name": "My Production Key", "label": "Production API Key", "disabled": false, "limit": 100, "limit_remaining": 74.5, "limit_reset": "monthly", "include_byok_in_limit": false, "usage": 25.5, "usage_daily": 25.5, "usage_weekly": 25.5, "usage_monthly": 25.5, "byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_weekly": 17.38, "byok_usage_monthly": 17.38, "created_at": "2025-08-24T10:30:00Z", "updated_at": "2025-08-24T15:45:00Z", "expires_at": "2027-12-31T23:59:59Z"}]} + application/json: {"data": [{"hash": "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", "name": "My Production Key", "label": "Production API Key", "disabled": false, "limit": 100, "limit_remaining": 74.5, "limit_reset": "monthly", "include_byok_in_limit": false, "usage": 25.5, "usage_daily": 25.5, "usage_weekly": 25.5, "usage_monthly": 25.5, "byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_weekly": 17.38, "byok_usage_monthly": 17.38, "created_at": "2025-08-24T10:30:00Z", "updated_at": "2025-08-24T15:45:00Z"}]} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "429": @@ -994,10 +991,10 @@ examples: createKeys: speakeasy-default-create-keys: requestBody: - application/json: {"name": "My New API Key", "limit": 50, "limit_reset": "monthly", "include_byok_in_limit": true, "expires_at": "2027-12-31T23:59:59Z"} + application/json: {"name": "My New API Key"} responses: "201": - application/json: {"data": {"hash": "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", "name": "My New API Key", "label": "My New API Key", "disabled": false, "limit": 50, "limit_remaining": 50, "limit_reset": "monthly", "include_byok_in_limit": true, "usage": 0, "usage_daily": 0, "usage_weekly": 0, "usage_monthly": 0, "byok_usage": 0, "byok_usage_daily": 0, "byok_usage_weekly": 0, "byok_usage_monthly": 0, "created_at": "2025-08-24T10:30:00Z", "updated_at": null, "expires_at": "2027-12-31T23:59:59Z"}, "key": "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"} + application/json: {"data": {"hash": "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", "name": "My New API Key", "label": "My New API Key", "disabled": false, "limit": 50, "limit_remaining": 50, "limit_reset": "monthly", "include_byok_in_limit": true, "usage": 0, "usage_daily": 0, "usage_weekly": 0, "usage_monthly": 0, "byok_usage": 0, "byok_usage_daily": 0, "byok_usage_weekly": 0, "byok_usage_monthly": 0, "created_at": "2025-08-24T10:30:00Z", "updated_at": null}, "key": "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"} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "401": @@ -1012,10 +1009,10 @@ examples: path: hash: "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" requestBody: - application/json: {"name": "Updated API Key Name", "disabled": false, "limit": 75, "limit_reset": "daily", "include_byok_in_limit": true} + application/json: {} responses: "200": - application/json: {"data": {"hash": "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", "name": "Updated API Key Name", "label": "Updated API Key Name", "disabled": false, "limit": 75, "limit_remaining": 49.5, "limit_reset": "daily", "include_byok_in_limit": true, "usage": 25.5, "usage_daily": 25.5, "usage_weekly": 25.5, "usage_monthly": 25.5, "byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_weekly": 17.38, "byok_usage_monthly": 17.38, "created_at": "2025-08-24T10:30:00Z", "updated_at": "2025-08-24T16:00:00Z", "expires_at": null}} + application/json: {"data": {"hash": "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", "name": "Updated API Key Name", "label": "Updated API Key Name", "disabled": false, "limit": 75, "limit_remaining": 49.5, "limit_reset": "daily", "include_byok_in_limit": true, "usage": 25.5, "usage_daily": 25.5, "usage_weekly": 25.5, "usage_monthly": 25.5, "byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_weekly": 17.38, "byok_usage_monthly": 17.38, "created_at": "2025-08-24T10:30:00Z", "updated_at": "2025-08-24T16:00:00Z"}} "400": application/json: {"error": {"code": 400, "message": "Invalid request parameters"}} "401": @@ -1049,7 +1046,7 @@ examples: hash: "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" responses: "200": - application/json: {"data": {"hash": "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", "name": "My Production Key", "label": "Production API Key", "disabled": false, "limit": 100, "limit_remaining": 74.5, "limit_reset": "monthly", "include_byok_in_limit": false, "usage": 25.5, "usage_daily": 25.5, "usage_weekly": 25.5, "usage_monthly": 25.5, "byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_weekly": 17.38, "byok_usage_monthly": 17.38, "created_at": "2025-08-24T10:30:00Z", "updated_at": "2025-08-24T15:45:00Z", "expires_at": "2027-12-31T23:59:59Z"}} + application/json: {"data": {"hash": "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", "name": "My Production Key", "label": "Production API Key", "disabled": false, "limit": 100, "limit_remaining": 74.5, "limit_reset": "monthly", "include_byok_in_limit": false, "usage": 25.5, "usage_daily": 25.5, "usage_weekly": 25.5, "usage_monthly": 25.5, "byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_weekly": 17.38, "byok_usage_monthly": 17.38, "created_at": "2025-08-24T10:30:00Z", "updated_at": "2025-08-24T15:45:00Z"}} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "404": @@ -1062,7 +1059,7 @@ examples: speakeasy-default-get-current-key: responses: "200": - application/json: {"data": {"label": "sk-or-v1-au78b3456789012345678901234567890", "limit": 100, "usage": 25.5, "usage_daily": 25.5, "usage_weekly": 25.5, "usage_monthly": 25.5, "byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_weekly": 17.38, "byok_usage_monthly": 17.38, "is_free_tier": false, "is_provisioning_key": false, "limit_remaining": 74.5, "limit_reset": "monthly", "include_byok_in_limit": false, "expires_at": "2027-12-31T23:59:59Z", "rate_limit": {"requests": 1000, "interval": "1h", "note": "This field is deprecated and safe to ignore."}}} + application/json: {"data": {"label": "sk-or-v1-au78b3456789012345678901234567890", "limit": 100, "usage": 25.5, "usage_daily": 25.5, "usage_weekly": 25.5, "usage_monthly": 25.5, "byok_usage": 17.38, "byok_usage_daily": 17.38, "byok_usage_weekly": 17.38, "byok_usage_monthly": 17.38, "is_free_tier": false, "is_provisioning_key": false, "limit_remaining": 74.5, "limit_reset": "monthly", "include_byok_in_limit": false, "rate_limit": {"requests": 1000, "interval": "1h", "note": "This field is deprecated and safe to ignore."}}} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "500": @@ -1070,7 +1067,7 @@ examples: exchangeAuthCodeForAPIKey: speakeasy-default-exchange-auth-code-for-API-key: requestBody: - application/json: {"code": "auth_code_abc123def456", "code_verifier": "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk", "code_challenge_method": "S256"} + application/json: {"code": "auth_code_abc123def456"} responses: "200": application/json: {"key": "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", "user_id": "user_2yOPcMpKoQhcd4bVgSMlELRaIah"} @@ -1083,7 +1080,7 @@ examples: createAuthKeysCode: speakeasy-default-create-auth-keys-code: requestBody: - application/json: {"callback_url": "https://myapp.com/auth/callback", "code_challenge": "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM", "code_challenge_method": "S256", "limit": 100} + application/json: {"callback_url": "https://myapp.com/auth/callback"} responses: "200": application/json: {"data": {"id": "auth_code_xyz789", "app_id": 12345, "created_at": "2025-08-24T10:30:00Z"}} diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 80ecc68..5006069 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -6,7 +6,7 @@ generation: sdkClassName: OpenRouter maintainOpenAPIOrder: true usageSnippets: - optionalPropertyRendering: withExample + optionalPropertyRendering: never sdkInitStyle: constructor useClassNamesForArrayFields: true fixes: @@ -24,13 +24,14 @@ generation: sdkHooksConfigAccess: true schemas: allOfMergeStrategy: shallowMerge - requestBodyFieldName: body + requestBodyFieldName: "" tests: generateTests: false generateNewTests: true skipResponseBodyAssertions: false + preApplyUnionDiscriminators: true python: - version: 0.1.1 + version: 0.0.16 additionalDependencies: dev: {} main: {} @@ -57,11 +58,12 @@ python: imports: option: openapi paths: - callbacks: "" + callbacks: callbacks errors: errors operations: operations shared: components - webhooks: "" + webhooks: webhooks + inferSSEOverload: true inferUnionDiscriminators: true inputModelSuffix: input legacyPyright: false diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index c609cc4..d99089f 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -3464,14 +3464,12 @@ components: - AionLabs - Alibaba - Amazon Bedrock - - Amazon Nova - Anthropic - - Arcee AI + - Arcee - AtlasCloud - Avian - Azure - BaseTen - - BytePlus - Black Forest Labs - Cerebras - Chutes @@ -3486,7 +3484,6 @@ components: - Fireworks - Friendli - GMICloud - - GoPomelo - Google - Google AI Studio - Groq @@ -3517,7 +3514,6 @@ components: - SambaNova - SiliconFlow - Stealth - - StreamLake - Switchpoint - Targon - Together @@ -3652,13 +3648,18 @@ components: nullable: true store: type: boolean - const: false - default: false + nullable: true service_tier: - type: string - enum: - - auto - default: auto + allOf: + - $ref: '#/components/schemas/OpenAIResponsesServiceTier' + - enum: + - auto + - default + - flex + - scale + - priority + example: auto + x-speakeasy-unknown-values: allow truncation: allOf: - $ref: '#/components/schemas/OpenAIResponsesTruncation' @@ -3802,14 +3803,6 @@ components: x-speakeasy-unknown-values: allow required: - id - - type: object - properties: - id: - type: string - enum: - - response-healing - required: - - id description: Plugins you want to enable for this request, including their settings. user: type: string @@ -4604,10 +4597,6 @@ components: status: default uptime_last_30m: 99.5 supports_implicit_caching: true - __schema0: - anyOf: - - $ref: '#/components/schemas/ChatCompletionFinishReason' - - type: 'null' ModelName: type: string ChatMessageContentItemText: @@ -4618,8 +4607,6 @@ components: const: text text: type: string - cache_control: - $ref: '#/components/schemas/ChatMessageContentItemCacheControl' required: - type - text @@ -4659,6 +4646,15 @@ components: type: string format: type: string + enum: + - wav + - mp3 + - flac + - m4a + - ogg + - pcm16 + - pcm24 + x-speakeasy-unknown-values: allow required: - data - format @@ -4673,12 +4669,7 @@ components: type: string const: input_video video_url: - type: object - properties: - url: - type: string - required: - - url + $ref: '#/components/schemas/VideoURL' required: - type - video_url @@ -4698,12 +4689,40 @@ components: - type - video_url type: object + VideoURL: + type: object + properties: + url: + type: string + required: + - url + ChatMessageContentItemFile: + type: object + properties: + type: + type: string + const: file + file: + type: object + properties: + file_data: + type: string + file_id: + type: string + filename: + type: string + required: + - file_data + required: + - type + - file ChatMessageContentItem: oneOf: - $ref: '#/components/schemas/ChatMessageContentItemText' - $ref: '#/components/schemas/ChatMessageContentItemImage' - $ref: '#/components/schemas/ChatMessageContentItemAudio' - $ref: '#/components/schemas/ChatMessageContentItemVideo' + - $ref: '#/components/schemas/ChatMessageContentItemFile' type: object discriminator: propertyName: type @@ -4713,6 +4732,7 @@ components: input_audio: '#/components/schemas/ChatMessageContentItemAudio' input_video: '#/components/schemas/ChatMessageContentItemVideo' video_url: '#/components/schemas/ChatMessageContentItemVideo' + file: '#/components/schemas/ChatMessageContentItemFile' ChatMessageToolCall: type: object properties: @@ -4836,14 +4856,16 @@ components: - prompt_tokens - total_tokens ChatCompletionFinishReason: - type: string - enum: - - tool_calls - - stop - - length - - content_filter - - error - x-speakeasy-unknown-values: allow + anyOf: + - type: string + enum: + - tool_calls + - stop + - length + - content_filter + - error + x-speakeasy-unknown-values: allow + - type: 'null' JSONSchemaConfig: type: object properties: @@ -4885,20 +4907,6 @@ components: required: - type - grammar - ChatMessageContentItemCacheControl: - type: object - properties: - type: - type: string - const: ephemeral - ttl: - type: string - enum: - - 5m - - 1h - x-speakeasy-unknown-values: allow - required: - - type SystemMessage: type: object properties: @@ -5210,18 +5218,13 @@ components: - type: 'null' user: type: string - debug: - type: object - properties: - echo_upstream_body: - type: boolean required: - messages ChatResponseChoice: type: object properties: finish_reason: - $ref: '#/components/schemas/__schema0' + $ref: '#/components/schemas/ChatCompletionFinishReason' index: type: number message: @@ -5282,7 +5285,7 @@ components: delta: $ref: '#/components/schemas/ChatStreamingMessageChunk' finish_reason: - $ref: '#/components/schemas/__schema0' + $ref: '#/components/schemas/ChatCompletionFinishReason' index: type: number logprobs: @@ -5615,12 +5618,6 @@ components: - type: 'null' finish_reason: $ref: '#/components/schemas/CompletionFinishReason' - native_finish_reason: - type: string - reasoning: - anyOf: - - type: string - - type: 'null' required: - text - index @@ -5638,8 +5635,6 @@ components: type: number model: type: string - provider: - type: string system_fingerprint: type: string choices: @@ -5858,26 +5853,6 @@ paths: application/json: schema: type: object - properties: - data: - type: object - properties: - total_credits: - type: number - description: Total credits purchased - example: 100.5 - total_usage: - type: number - description: Total credits used - example: 25.75 - required: - - total_credits - - total_usage - example: - total_credits: 100.5 - total_usage: 25.75 - required: - - data description: Total credits purchased and used example: data: @@ -6242,6 +6217,11 @@ paths: - object - data - model + text/event-stream: + schema: + type: string + description: Not used for embeddings - embeddings do not support streaming + x-speakeasy-sse-sentinel: '[DONE]' '400': description: Bad Request - Invalid request parameters or malformed input content: @@ -6774,14 +6754,12 @@ paths: - AionLabs - Alibaba - Amazon Bedrock - - Amazon Nova - Anthropic - - Arcee AI + - Arcee - AtlasCloud - Avian - Azure - BaseTen - - BytePlus - Black Forest Labs - Cerebras - Chutes @@ -6796,7 +6774,6 @@ paths: - Fireworks - Friendli - GMICloud - - GoPomelo - Google - Google AI Studio - Groq @@ -6827,7 +6804,6 @@ paths: - SambaNova - SiliconFlow - Stealth - - StreamLake - Switchpoint - Targon - Together @@ -8437,5 +8413,3 @@ x-speakeasy-globals: parameters: - $ref: "#/components/parameters/AppIdentifier" - $ref: "#/components/parameters/AppDisplayName" - - $ref: "#/components/parameters/AppIdentifier" - - $ref: "#/components/parameters/AppDisplayName" diff --git a/USAGE.md b/USAGE.md index 4fd5a77..6d76a30 100644 --- a/USAGE.md +++ b/USAGE.md @@ -9,61 +9,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.beta.responses.send(input=[ - { - "type": "message", - "role": "user", - "content": "Hello, how are you?", - }, - ], metadata={ - "user_id": "123", - "session_id": "abc-def-ghi", - }, tools=[ - { - "type": "function", - "name": "get_current_weather", - "description": "Get the current weather in a given location", - "parameters": { - "type": "object", - "properties": { - "location": { - "type": "string", - }, - }, - }, - }, - ], model="anthropic/claude-4.5-sonnet-20250929", text={ - "format_": { - "type": "text", - }, - "verbosity": "medium", - }, reasoning={ - "summary": "auto", - "enabled": True, - }, temperature=0.7, top_p=0.9, prompt={ - "id": "", - "variables": { - "key": { - "type": "input_text", - "text": "Hello, how can I help you?", - }, - }, - }, service_tier="auto", truncation="auto", stream=False, provider={ - "data_collection": "allow", - "zdr": True, - "enforce_distillable_text": True, - "order": [ - "OpenAI", - ], - "only": [ - "OpenAI", - ], - "ignore": [ - "OpenAI", - ], - "quantizations": None, - "sort": "price", - }) + res = open_router.beta.responses.send(stream=False) with res as event_stream: for event in event_stream: @@ -87,61 +33,7 @@ async def main(): api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = await open_router.beta.responses.send_async(input=[ - { - "type": "message", - "role": "user", - "content": "Hello, how are you?", - }, - ], metadata={ - "user_id": "123", - "session_id": "abc-def-ghi", - }, tools=[ - { - "type": "function", - "name": "get_current_weather", - "description": "Get the current weather in a given location", - "parameters": { - "type": "object", - "properties": { - "location": { - "type": "string", - }, - }, - }, - }, - ], model="anthropic/claude-4.5-sonnet-20250929", text={ - "format_": { - "type": "text", - }, - "verbosity": "medium", - }, reasoning={ - "summary": "auto", - "enabled": True, - }, temperature=0.7, top_p=0.9, prompt={ - "id": "", - "variables": { - "key": { - "type": "input_text", - "text": "Hello, how can I help you?", - }, - }, - }, service_tier="auto", truncation="auto", stream=False, provider={ - "data_collection": "allow", - "zdr": True, - "enforce_distillable_text": True, - "order": [ - "OpenAI", - ], - "only": [ - "OpenAI", - ], - "ignore": [ - "OpenAI", - ], - "quantizations": None, - "sort": "price", - }) + res = await open_router.beta.responses.send_async(stream=False) async with res as event_stream: async for event in event_stream: diff --git a/docs/components/chatgenerationparams.md b/docs/components/chatgenerationparams.md index 41db71b..238044f 100644 --- a/docs/components/chatgenerationparams.md +++ b/docs/components/chatgenerationparams.md @@ -26,5 +26,4 @@ | `tool_choice` | *Optional[Any]* | :heavy_minus_sign: | N/A | | `tools` | List[[components.ToolDefinitionJSON](../components/tooldefinitionjson.md)] | :heavy_minus_sign: | N/A | | `top_p` | *OptionalNullable[float]* | :heavy_minus_sign: | N/A | -| `user` | *Optional[str]* | :heavy_minus_sign: | N/A | -| `debug` | [Optional[components.Debug]](../components/debug.md) | :heavy_minus_sign: | N/A | \ No newline at end of file +| `user` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitem.md b/docs/components/chatmessagecontentitem.md index 7063cdb..2ac5390 100644 --- a/docs/components/chatmessagecontentitem.md +++ b/docs/components/chatmessagecontentitem.md @@ -33,3 +33,9 @@ value: components.ChatMessageContentItemVideo = /* values here */ value: components.ChatMessageContentItemVideo = /* values here */ ``` +### `components.ChatMessageContentItemFile` + +```python +value: components.ChatMessageContentItemFile = /* values here */ +``` + diff --git a/docs/components/chatmessagecontentitemaudioformat.md b/docs/components/chatmessagecontentitemaudioformat.md new file mode 100644 index 0000000..97119c0 --- /dev/null +++ b/docs/components/chatmessagecontentitemaudioformat.md @@ -0,0 +1,14 @@ +# ChatMessageContentItemAudioFormat + + +## Values + +| Name | Value | +| ------- | ------- | +| `WAV` | wav | +| `MP3` | mp3 | +| `FLAC` | flac | +| `M4A` | m4a | +| `OGG` | ogg | +| `PCM16` | pcm16 | +| `PCM24` | pcm24 | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemaudioinputaudio.md b/docs/components/chatmessagecontentitemaudioinputaudio.md index f7a62b5..3665698 100644 --- a/docs/components/chatmessagecontentitemaudioinputaudio.md +++ b/docs/components/chatmessagecontentitemaudioinputaudio.md @@ -3,7 +3,7 @@ ## Fields -| Field | Type | Required | Description | -| ------------------ | ------------------ | ------------------ | ------------------ | -| `data` | *str* | :heavy_check_mark: | N/A | -| `format_` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `data` | *str* | :heavy_check_mark: | N/A | +| `format_` | [components.ChatMessageContentItemAudioFormat](../components/chatmessagecontentitemaudioformat.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemcachecontrol.md b/docs/components/chatmessagecontentitemcachecontrol.md deleted file mode 100644 index 2ad30d0..0000000 --- a/docs/components/chatmessagecontentitemcachecontrol.md +++ /dev/null @@ -1,9 +0,0 @@ -# ChatMessageContentItemCacheControl - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | -| `type` | *Literal["ephemeral"]* | :heavy_check_mark: | N/A | -| `ttl` | [Optional[components.TTL]](../components/ttl.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemfile.md b/docs/components/chatmessagecontentitemfile.md new file mode 100644 index 0000000..ca73897 --- /dev/null +++ b/docs/components/chatmessagecontentitemfile.md @@ -0,0 +1,9 @@ +# ChatMessageContentItemFile + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | +| `type` | *Literal["file"]* | :heavy_check_mark: | N/A | +| `file` | [components.File](../components/file.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemtext.md b/docs/components/chatmessagecontentitemtext.md index 4f8a874..4fa8b7b 100644 --- a/docs/components/chatmessagecontentitemtext.md +++ b/docs/components/chatmessagecontentitemtext.md @@ -3,8 +3,7 @@ ## Fields -| Field | Type | Required | Description | -| -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -| `type` | *Literal["text"]* | :heavy_check_mark: | N/A | -| `text` | *str* | :heavy_check_mark: | N/A | -| `cache_control` | [Optional[components.ChatMessageContentItemCacheControl]](../components/chatmessagecontentitemcachecontrol.md) | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `type` | *Literal["text"]* | :heavy_check_mark: | N/A | +| `text` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemvideoinputvideo.md b/docs/components/chatmessagecontentitemvideoinputvideo.md index 4d7dd0e..da28cf1 100644 --- a/docs/components/chatmessagecontentitemvideoinputvideo.md +++ b/docs/components/chatmessagecontentitemvideoinputvideo.md @@ -3,7 +3,7 @@ ## Fields -| Field | Type | Required | Description | -| -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -| `type` | *Literal["input_video"]* | :heavy_check_mark: | N/A | -| `video_url` | [components.VideoURL1](../components/videourl1.md) | :heavy_check_mark: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | +| `type` | *Literal["input_video"]* | :heavy_check_mark: | N/A | +| `video_url` | [components.VideoURL](../components/videourl.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemvideovideourl.md b/docs/components/chatmessagecontentitemvideovideourl.md index 0585b55..023d696 100644 --- a/docs/components/chatmessagecontentitemvideovideourl.md +++ b/docs/components/chatmessagecontentitemvideovideourl.md @@ -3,7 +3,7 @@ ## Fields -| Field | Type | Required | Description | -| -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -| `type` | *Literal["video_url"]* | :heavy_check_mark: | N/A | -| `video_url` | [components.VideoURL2](../components/videourl2.md) | :heavy_check_mark: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| `type` | *Literal["video_url"]* | :heavy_check_mark: | N/A | +| `video_url` | [components.ChatMessageContentItemVideoVideoURLVideoURL](../components/chatmessagecontentitemvideovideourlvideourl.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/videourl2.md b/docs/components/chatmessagecontentitemvideovideourlvideourl.md similarity index 85% rename from docs/components/videourl2.md rename to docs/components/chatmessagecontentitemvideovideourlvideourl.md index b7f2463..ee08920 100644 --- a/docs/components/videourl2.md +++ b/docs/components/chatmessagecontentitemvideovideourlvideourl.md @@ -1,4 +1,4 @@ -# VideoURL2 +# ChatMessageContentItemVideoVideoURLVideoURL ## Fields diff --git a/docs/components/completionchoice.md b/docs/components/completionchoice.md index cb489be..758eea9 100644 --- a/docs/components/completionchoice.md +++ b/docs/components/completionchoice.md @@ -8,6 +8,4 @@ | `text` | *str* | :heavy_check_mark: | N/A | | `index` | *float* | :heavy_check_mark: | N/A | | `logprobs` | [Nullable[components.CompletionLogprobs]](../components/completionlogprobs.md) | :heavy_check_mark: | N/A | -| `finish_reason` | [Nullable[components.CompletionFinishReason]](../components/completionfinishreason.md) | :heavy_check_mark: | N/A | -| `native_finish_reason` | *Optional[str]* | :heavy_minus_sign: | N/A | -| `reasoning` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file +| `finish_reason` | [Nullable[components.CompletionFinishReason]](../components/completionfinishreason.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/completionresponse.md b/docs/components/completionresponse.md index 3e9a9bd..404f19d 100644 --- a/docs/components/completionresponse.md +++ b/docs/components/completionresponse.md @@ -9,7 +9,6 @@ | `object` | *Literal["text_completion"]* | :heavy_check_mark: | N/A | | `created` | *float* | :heavy_check_mark: | N/A | | `model` | *str* | :heavy_check_mark: | N/A | -| `provider` | *Optional[str]* | :heavy_minus_sign: | N/A | | `system_fingerprint` | *Optional[str]* | :heavy_minus_sign: | N/A | | `choices` | List[[components.CompletionChoice](../components/completionchoice.md)] | :heavy_check_mark: | N/A | | `usage` | [Optional[components.CompletionUsage]](../components/completionusage.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/debug.md b/docs/components/debug.md deleted file mode 100644 index 459bb4b..0000000 --- a/docs/components/debug.md +++ /dev/null @@ -1,8 +0,0 @@ -# Debug - - -## Fields - -| Field | Type | Required | Description | -| -------------------- | -------------------- | -------------------- | -------------------- | -| `echo_upstream_body` | *Optional[bool]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/file.md b/docs/components/file.md new file mode 100644 index 0000000..d5b3937 --- /dev/null +++ b/docs/components/file.md @@ -0,0 +1,10 @@ +# File + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `file_data` | *str* | :heavy_check_mark: | N/A | +| `file_id` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `filename` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/idresponsehealing.md b/docs/components/idresponsehealing.md deleted file mode 100644 index 4a12790..0000000 --- a/docs/components/idresponsehealing.md +++ /dev/null @@ -1,8 +0,0 @@ -# IDResponseHealing - - -## Values - -| Name | Value | -| ------------------ | ------------------ | -| `RESPONSE_HEALING` | response-healing | \ No newline at end of file diff --git a/docs/components/openresponsesrequest.md b/docs/components/openresponsesrequest.md index 56283da..fcc6420 100644 --- a/docs/components/openresponsesrequest.md +++ b/docs/components/openresponsesrequest.md @@ -27,8 +27,8 @@ Request schema for Responses endpoint | `include` | List[[components.OpenAIResponsesIncludable](../components/openairesponsesincludable.md)] | :heavy_minus_sign: | N/A | | | `background` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | | | `safety_identifier` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | | -| `store` | *Optional[Literal[False]]* | :heavy_minus_sign: | N/A | | -| `service_tier` | [Optional[components.ServiceTier]](../components/servicetier.md) | :heavy_minus_sign: | N/A | | +| `store` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | | +| `service_tier` | [OptionalNullable[components.ServiceTier]](../components/servicetier.md) | :heavy_minus_sign: | N/A | auto | | `truncation` | [OptionalNullable[components.Truncation]](../components/truncation.md) | :heavy_minus_sign: | N/A | auto | | `stream` | *Optional[bool]* | :heavy_minus_sign: | N/A | | | `provider` | [OptionalNullable[components.Provider]](../components/provider.md) | :heavy_minus_sign: | When multiple model providers are available, optionally indicate your routing preference. | | diff --git a/docs/components/plugin.md b/docs/components/plugin.md index bc21cd4..7f6e744 100644 --- a/docs/components/plugin.md +++ b/docs/components/plugin.md @@ -21,9 +21,3 @@ value: components.PluginWeb = /* values here */ value: components.PluginFileParser = /* values here */ ``` -### `components.PluginResponseHealing` - -```python -value: components.PluginResponseHealing = /* values here */ -``` - diff --git a/docs/components/pluginresponsehealing.md b/docs/components/pluginresponsehealing.md deleted file mode 100644 index ecee55d..0000000 --- a/docs/components/pluginresponsehealing.md +++ /dev/null @@ -1,8 +0,0 @@ -# PluginResponseHealing - - -## Fields - -| Field | Type | Required | Description | -| ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | -| `id` | [components.IDResponseHealing](../components/idresponsehealing.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/providername.md b/docs/components/providername.md index 47b7be5..9c86cd3 100644 --- a/docs/components/providername.md +++ b/docs/components/providername.md @@ -9,14 +9,12 @@ | `AION_LABS` | AionLabs | | `ALIBABA` | Alibaba | | `AMAZON_BEDROCK` | Amazon Bedrock | -| `AMAZON_NOVA` | Amazon Nova | | `ANTHROPIC` | Anthropic | -| `ARCEE_AI` | Arcee AI | +| `ARCEE` | Arcee | | `ATLAS_CLOUD` | AtlasCloud | | `AVIAN` | Avian | | `AZURE` | Azure | | `BASE_TEN` | BaseTen | -| `BYTE_PLUS` | BytePlus | | `BLACK_FOREST_LABS` | Black Forest Labs | | `CEREBRAS` | Cerebras | | `CHUTES` | Chutes | @@ -31,7 +29,6 @@ | `FIREWORKS` | Fireworks | | `FRIENDLI` | Friendli | | `GMI_CLOUD` | GMICloud | -| `GO_POMELO` | GoPomelo | | `GOOGLE` | Google | | `GOOGLE_AI_STUDIO` | Google AI Studio | | `GROQ` | Groq | @@ -62,7 +59,6 @@ | `SAMBA_NOVA` | SambaNova | | `SILICON_FLOW` | SiliconFlow | | `STEALTH` | Stealth | -| `STREAM_LAKE` | StreamLake | | `SWITCHPOINT` | Switchpoint | | `TARGON` | Targon | | `TOGETHER` | Together | diff --git a/docs/components/servicetier.md b/docs/components/servicetier.md index bfc6187..3a7a020 100644 --- a/docs/components/servicetier.md +++ b/docs/components/servicetier.md @@ -3,6 +3,10 @@ ## Values -| Name | Value | -| ------ | ------ | -| `AUTO` | auto | \ No newline at end of file +| Name | Value | +| ---------- | ---------- | +| `AUTO` | auto | +| `DEFAULT` | default | +| `FLEX` | flex | +| `PRIORITY` | priority | +| `SCALE` | scale | \ No newline at end of file diff --git a/docs/components/ttl.md b/docs/components/ttl.md deleted file mode 100644 index 0cbc7f3..0000000 --- a/docs/components/ttl.md +++ /dev/null @@ -1,9 +0,0 @@ -# TTL - - -## Values - -| Name | Value | -| ------- | ------- | -| `FIVEM` | 5m | -| `ONEH` | 1h | \ No newline at end of file diff --git a/docs/components/videourl1.md b/docs/components/videourl.md similarity index 95% rename from docs/components/videourl1.md rename to docs/components/videourl.md index 505c186..5bd5dec 100644 --- a/docs/components/videourl1.md +++ b/docs/components/videourl.md @@ -1,4 +1,4 @@ -# VideoURL1 +# VideoURL ## Fields diff --git a/docs/operations/createembeddingsresponse.md b/docs/operations/createembeddingsresponse.md index 2dc9adf..4c379be 100644 --- a/docs/operations/createembeddingsresponse.md +++ b/docs/operations/createembeddingsresponse.md @@ -1,14 +1,17 @@ # CreateEmbeddingsResponse -Embedding response +## Supported Types -## Fields +### `operations.CreateEmbeddingsResponseBody` + +```python +value: operations.CreateEmbeddingsResponseBody = /* values here */ +``` + +### `str` + +```python +value: str = /* values here */ +``` -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | -| `id` | *Optional[str]* | :heavy_minus_sign: | N/A | -| `object` | [operations.Object](../operations/object.md) | :heavy_check_mark: | N/A | -| `data` | List[[operations.CreateEmbeddingsData](../operations/createembeddingsdata.md)] | :heavy_check_mark: | N/A | -| `model` | *str* | :heavy_check_mark: | N/A | -| `usage` | [Optional[operations.Usage]](../operations/usage.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/operations/createembeddingsresponsebody.md b/docs/operations/createembeddingsresponsebody.md new file mode 100644 index 0000000..2252cfd --- /dev/null +++ b/docs/operations/createembeddingsresponsebody.md @@ -0,0 +1,14 @@ +# CreateEmbeddingsResponseBody + +Embedding response + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | +| `id` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `object` | [operations.Object](../operations/object.md) | :heavy_check_mark: | N/A | +| `data` | List[[operations.CreateEmbeddingsData](../operations/createembeddingsdata.md)] | :heavy_check_mark: | N/A | +| `model` | *str* | :heavy_check_mark: | N/A | +| `usage` | [Optional[operations.Usage]](../operations/usage.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/operations/getcreditsdata.md b/docs/operations/getcreditsdata.md deleted file mode 100644 index 9ba4582..0000000 --- a/docs/operations/getcreditsdata.md +++ /dev/null @@ -1,9 +0,0 @@ -# GetCreditsData - - -## Fields - -| Field | Type | Required | Description | Example | -| ----------------------- | ----------------------- | ----------------------- | ----------------------- | ----------------------- | -| `total_credits` | *float* | :heavy_check_mark: | Total credits purchased | 100.5 | -| `total_usage` | *float* | :heavy_check_mark: | Total credits used | 25.75 | \ No newline at end of file diff --git a/docs/operations/getcreditsresponse.md b/docs/operations/getcreditsresponse.md index a58a336..c52bc01 100644 --- a/docs/operations/getcreditsresponse.md +++ b/docs/operations/getcreditsresponse.md @@ -5,6 +5,5 @@ Total credits purchased and used ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| `data` | [operations.GetCreditsData](../operations/getcreditsdata.md) | :heavy_check_mark: | N/A | {
"total_credits": 100.5,
"total_usage": 25.75
} | \ No newline at end of file +| Field | Type | Required | Description | +| ----------- | ----------- | ----------- | ----------- | \ No newline at end of file diff --git a/docs/operations/getparametersprovider.md b/docs/operations/getparametersprovider.md index f8728f0..21a0244 100644 --- a/docs/operations/getparametersprovider.md +++ b/docs/operations/getparametersprovider.md @@ -9,14 +9,12 @@ | `AION_LABS` | AionLabs | | `ALIBABA` | Alibaba | | `AMAZON_BEDROCK` | Amazon Bedrock | -| `AMAZON_NOVA` | Amazon Nova | | `ANTHROPIC` | Anthropic | -| `ARCEE_AI` | Arcee AI | +| `ARCEE` | Arcee | | `ATLAS_CLOUD` | AtlasCloud | | `AVIAN` | Avian | | `AZURE` | Azure | | `BASE_TEN` | BaseTen | -| `BYTE_PLUS` | BytePlus | | `BLACK_FOREST_LABS` | Black Forest Labs | | `CEREBRAS` | Cerebras | | `CHUTES` | Chutes | @@ -31,7 +29,6 @@ | `FIREWORKS` | Fireworks | | `FRIENDLI` | Friendli | | `GMI_CLOUD` | GMICloud | -| `GO_POMELO` | GoPomelo | | `GOOGLE` | Google | | `GOOGLE_AI_STUDIO` | Google AI Studio | | `GROQ` | Groq | @@ -62,7 +59,6 @@ | `SAMBA_NOVA` | SambaNova | | `SILICON_FLOW` | SiliconFlow | | `STEALTH` | Stealth | -| `STREAM_LAKE` | StreamLake | | `SWITCHPOINT` | Switchpoint | | `TARGON` | Targon | | `TOGETHER` | Together | diff --git a/docs/operations/updatekeysrequest.md b/docs/operations/updatekeysrequest.md index cb4c0a0..ff908da 100644 --- a/docs/operations/updatekeysrequest.md +++ b/docs/operations/updatekeysrequest.md @@ -6,4 +6,4 @@ | Field | Type | Required | Description | Example | | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | `hash` | *str* | :heavy_check_mark: | The hash identifier of the API key to update | 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 | -| `body` | [operations.UpdateKeysRequestBody](../operations/updatekeysrequestbody.md) | :heavy_check_mark: | N/A | {
"name": "Updated API Key Name",
"disabled": false,
"limit": 75,
"limit_reset": "daily",
"include_byok_in_limit": true
} | \ No newline at end of file +| `request_body` | [operations.UpdateKeysRequestBody](../operations/updatekeysrequestbody.md) | :heavy_check_mark: | N/A | {
"name": "Updated API Key Name",
"disabled": false,
"limit": 75,
"limit_reset": "daily",
"include_byok_in_limit": true
} | \ No newline at end of file diff --git a/docs/sdks/apikeys/README.md b/docs/sdks/apikeys/README.md index 829b8d3..303ac8f 100644 --- a/docs/sdks/apikeys/README.md +++ b/docs/sdks/apikeys/README.md @@ -67,7 +67,6 @@ Create a new API key ```python from openrouter import OpenRouter -from openrouter.utils import parse_datetime import os @@ -75,7 +74,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.api_keys.create(name="My New API Key", limit=50, limit_reset="monthly", include_byok_in_limit=True, expires_at=parse_datetime("2027-12-31T23:59:59Z")) + res = open_router.api_keys.create(name="My New API Key") # Handle response print(res) @@ -123,7 +122,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.api_keys.update(hash="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", name="Updated API Key Name", disabled=False, limit=75, limit_reset="daily", include_byok_in_limit=True) + res = open_router.api_keys.update(hash="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") # Handle response print(res) diff --git a/docs/sdks/chat/README.md b/docs/sdks/chat/README.md index 78c3a29..94ffd97 100644 --- a/docs/sdks/chat/README.md +++ b/docs/sdks/chat/README.md @@ -58,7 +58,6 @@ with OpenRouter( | `tools` | List[[components.ToolDefinitionJSON](../../components/tooldefinitionjson.md)] | :heavy_minus_sign: | N/A | | `top_p` | *OptionalNullable[float]* | :heavy_minus_sign: | N/A | | `user` | *Optional[str]* | :heavy_minus_sign: | N/A | -| `debug` | [Optional[components.Debug]](../../components/debug.md) | :heavy_minus_sign: | N/A | | `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | ### Response diff --git a/docs/sdks/embeddings/README.md b/docs/sdks/embeddings/README.md index 0f75d96..4f4244b 100644 --- a/docs/sdks/embeddings/README.md +++ b/docs/sdks/embeddings/README.md @@ -26,24 +26,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.embeddings.generate(input="", model="Taurus", provider={ - "data_collection": "allow", - "zdr": True, - "enforce_distillable_text": True, - "order": [ - "OpenAI", - ], - "only": [ - "OpenAI", - ], - "ignore": [ - "OpenAI", - ], - "quantizations": [ - "fp16", - ], - "sort": "price", - }) + res = open_router.embeddings.generate(input="", model="Taurus") # Handle response print(res) diff --git a/docs/sdks/oauth/README.md b/docs/sdks/oauth/README.md index ae77e75..0c17abc 100644 --- a/docs/sdks/oauth/README.md +++ b/docs/sdks/oauth/README.md @@ -26,7 +26,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.o_auth.exchange_auth_code_for_api_key(code="auth_code_abc123def456", code_verifier="dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk", code_challenge_method="S256") + res = open_router.o_auth.exchange_auth_code_for_api_key(code="auth_code_abc123def456") # Handle response print(res) @@ -71,7 +71,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.o_auth.create_auth_code(callback_url="https://myapp.com/auth/callback", code_challenge="E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM", code_challenge_method="S256", limit=100) + res = open_router.o_auth.create_auth_code(callback_url="https://myapp.com/auth/callback") # Handle response print(res) diff --git a/docs/sdks/responses/README.md b/docs/sdks/responses/README.md index 001617b..4918bce 100644 --- a/docs/sdks/responses/README.md +++ b/docs/sdks/responses/README.md @@ -25,61 +25,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.beta.responses.send(input=[ - { - "type": "message", - "role": "user", - "content": "Hello, how are you?", - }, - ], metadata={ - "user_id": "123", - "session_id": "abc-def-ghi", - }, tools=[ - { - "type": "function", - "name": "get_current_weather", - "description": "Get the current weather in a given location", - "parameters": { - "type": "object", - "properties": { - "location": { - "type": "string", - }, - }, - }, - }, - ], model="anthropic/claude-4.5-sonnet-20250929", text={ - "format_": { - "type": "text", - }, - "verbosity": "medium", - }, reasoning={ - "summary": "auto", - "enabled": True, - }, temperature=0.7, top_p=0.9, prompt={ - "id": "", - "variables": { - "key": { - "type": "input_text", - "text": "Hello, how can I help you?", - }, - }, - }, service_tier="auto", truncation="auto", stream=False, provider={ - "data_collection": "allow", - "zdr": True, - "enforce_distillable_text": True, - "order": [ - "OpenAI", - ], - "only": [ - "OpenAI", - ], - "ignore": [ - "OpenAI", - ], - "quantizations": None, - "sort": "price", - }) + res = open_router.beta.responses.send(stream=False) with res as event_stream: for event in event_stream: @@ -112,7 +58,8 @@ with OpenRouter( | `include` | List[[components.OpenAIResponsesIncludable](../../components/openairesponsesincludable.md)] | :heavy_minus_sign: | N/A | | | `background` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | | | `safety_identifier` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | | -| `service_tier` | [Optional[components.ServiceTier]](../../components/servicetier.md) | :heavy_minus_sign: | N/A | | +| `store` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | | +| `service_tier` | [OptionalNullable[components.ServiceTier]](../../components/servicetier.md) | :heavy_minus_sign: | N/A | auto | | `truncation` | [OptionalNullable[components.Truncation]](../../components/truncation.md) | :heavy_minus_sign: | N/A | auto | | `stream` | *Optional[bool]* | :heavy_minus_sign: | N/A | | | `provider` | [OptionalNullable[components.Provider]](../../components/provider.md) | :heavy_minus_sign: | When multiple model providers are available, optionally indicate your routing preference. | | diff --git a/pyproject.toml b/pyproject.toml index 7d65137..0bca6bd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrouter" -version = "0.1.1" +version = "0.0.16" description = "Official Python Client SDK for OpenRouter." authors = [{ name = "OpenRouter" },] readme = "README-PYPI.md" diff --git a/src/openrouter/_version.py b/src/openrouter/_version.py index 43d4d8d..af0bab6 100644 --- a/src/openrouter/_version.py +++ b/src/openrouter/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "openrouter" -__version__: str = "0.1.1" +__version__: str = "0.0.16" __openapi_doc_version__: str = "1.0.0" __gen_version__: str = "2.768.0" -__user_agent__: str = "speakeasy-sdk/python 0.1.1 2.768.0 1.0.0 openrouter" +__user_agent__: str = "speakeasy-sdk/python 0.0.16 2.768.0 1.0.0 openrouter" try: if __package__ is not None: diff --git a/src/openrouter/api_keys.py b/src/openrouter/api_keys.py index f4f0d23..39bbe5f 100644 --- a/src/openrouter/api_keys.py +++ b/src/openrouter/api_keys.py @@ -506,7 +506,7 @@ def update( request = operations.UpdateKeysRequest( hash=hash, - body=operations.UpdateKeysRequestBody( + request_body=operations.UpdateKeysRequestBody( name=name, disabled=disabled, limit=limit, @@ -529,7 +529,11 @@ def update( http_headers=http_headers, security=self.sdk_configuration.security, get_serialized_body=lambda: utils.serialize_request_body( - request.body, False, False, "json", operations.UpdateKeysRequestBody + request.request_body, + False, + False, + "json", + operations.UpdateKeysRequestBody, ), allow_empty_value=None, timeout_ms=timeout_ms, @@ -638,7 +642,7 @@ async def update_async( request = operations.UpdateKeysRequest( hash=hash, - body=operations.UpdateKeysRequestBody( + request_body=operations.UpdateKeysRequestBody( name=name, disabled=disabled, limit=limit, @@ -661,7 +665,11 @@ async def update_async( http_headers=http_headers, security=self.sdk_configuration.security, get_serialized_body=lambda: utils.serialize_request_body( - request.body, False, False, "json", operations.UpdateKeysRequestBody + request.request_body, + False, + False, + "json", + operations.UpdateKeysRequestBody, ), allow_empty_value=None, timeout_ms=timeout_ms, diff --git a/src/openrouter/chat.py b/src/openrouter/chat.py index bc00143..1587ae5 100644 --- a/src/openrouter/chat.py +++ b/src/openrouter/chat.py @@ -61,7 +61,6 @@ def send( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, - debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -93,7 +92,6 @@ def send( :param tools: :param top_p: :param user: - :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -146,7 +144,6 @@ def send( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, - debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -178,7 +175,6 @@ def send( :param tools: :param top_p: :param user: - :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -230,7 +226,6 @@ def send( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, - debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -262,7 +257,6 @@ def send( :param tools: :param top_p: :param user: - :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -311,7 +305,6 @@ def send( ), top_p=top_p, user=user, - debug=utils.get_pydantic_model(debug, Optional[components.Debug]), ) req = self._build_request( @@ -446,7 +439,6 @@ async def send_async( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, - debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -478,7 +470,6 @@ async def send_async( :param tools: :param top_p: :param user: - :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -531,7 +522,6 @@ async def send_async( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, - debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -563,7 +553,6 @@ async def send_async( :param tools: :param top_p: :param user: - :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -615,7 +604,6 @@ async def send_async( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, - debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -647,7 +635,6 @@ async def send_async( :param tools: :param top_p: :param user: - :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -696,7 +683,6 @@ async def send_async( ), top_p=top_p, user=user, - debug=utils.get_pydantic_model(debug, Optional[components.Debug]), ) req = self._build_request_async( diff --git a/src/openrouter/components/__init__.py b/src/openrouter/components/__init__.py index d7818e6..1554012 100644 --- a/src/openrouter/components/__init__.py +++ b/src/openrouter/components/__init__.py @@ -21,7 +21,6 @@ BadRequestResponseErrorData, BadRequestResponseErrorDataTypedDict, ) - from .chatcompletionfinishreason import ChatCompletionFinishReason from .chaterror import ChatErrorError, ChatErrorErrorTypedDict, Code, CodeTypedDict from .chatgenerationparams import ( ChatGenerationParams, @@ -36,8 +35,6 @@ ChatGenerationParamsStop, ChatGenerationParamsStopTypedDict, ChatGenerationParamsTypedDict, - Debug, - DebugTypedDict, Effort, Reasoning, ReasoningTypedDict, @@ -56,14 +53,16 @@ ) from .chatmessagecontentitemaudio import ( ChatMessageContentItemAudio, + ChatMessageContentItemAudioFormat, ChatMessageContentItemAudioInputAudio, ChatMessageContentItemAudioInputAudioTypedDict, ChatMessageContentItemAudioTypedDict, ) - from .chatmessagecontentitemcachecontrol import ( - ChatMessageContentItemCacheControl, - ChatMessageContentItemCacheControlTypedDict, - TTL, + from .chatmessagecontentitemfile import ( + ChatMessageContentItemFile, + ChatMessageContentItemFileTypedDict, + File, + FileTypedDict, ) from .chatmessagecontentitemimage import ( ChatMessageContentItemImage, @@ -83,10 +82,8 @@ ChatMessageContentItemVideoTypedDict, ChatMessageContentItemVideoVideoURL, ChatMessageContentItemVideoVideoURLTypedDict, - VideoURL1, - VideoURL1TypedDict, - VideoURL2, - VideoURL2TypedDict, + ChatMessageContentItemVideoVideoURLVideoURL, + ChatMessageContentItemVideoVideoURLVideoURLTypedDict, ) from .chatmessagetokenlogprob import ( ChatMessageTokenLogprob, @@ -105,8 +102,13 @@ ChatMessageToolCallTypedDict, ) from .chatresponse import ChatResponse, ChatResponseTypedDict - from .chatresponsechoice import ChatResponseChoice, ChatResponseChoiceTypedDict - from .chatstreamingchoice import ChatStreamingChoice, ChatStreamingChoiceTypedDict + from .chatresponsechoice import ( + ChatCompletionFinishReason, + ChatResponseChoice, + ChatResponseChoiceTypedDict, + ChatStreamingChoice, + ChatStreamingChoiceTypedDict, + ) from .chatstreamingmessagechunk import ( ChatStreamingMessageChunk, ChatStreamingMessageChunkRole, @@ -424,7 +426,6 @@ Engine, IDFileParser, IDModeration, - IDResponseHealing, IDWeb, Ignore, IgnoreTypedDict, @@ -449,8 +450,6 @@ PluginFileParserTypedDict, PluginModeration, PluginModerationTypedDict, - PluginResponseHealing, - PluginResponseHealingTypedDict, PluginTypedDict, PluginWeb, PluginWebTypedDict, @@ -785,6 +784,7 @@ UserMessageContentTypedDict, UserMessageTypedDict, ) + from .videourl import VideoURL, VideoURLTypedDict from .websearchpreviewtooluserlocation import ( WebSearchPreviewToolUserLocation, WebSearchPreviewToolUserLocationType, @@ -825,11 +825,12 @@ "ChatGenerationTokenUsageTypedDict", "ChatMessageContentItem", "ChatMessageContentItemAudio", + "ChatMessageContentItemAudioFormat", "ChatMessageContentItemAudioInputAudio", "ChatMessageContentItemAudioInputAudioTypedDict", "ChatMessageContentItemAudioTypedDict", - "ChatMessageContentItemCacheControl", - "ChatMessageContentItemCacheControlTypedDict", + "ChatMessageContentItemFile", + "ChatMessageContentItemFileTypedDict", "ChatMessageContentItemImage", "ChatMessageContentItemImageDetail", "ChatMessageContentItemImageTypedDict", @@ -842,6 +843,8 @@ "ChatMessageContentItemVideoTypedDict", "ChatMessageContentItemVideoVideoURL", "ChatMessageContentItemVideoVideoURLTypedDict", + "ChatMessageContentItemVideoVideoURLVideoURL", + "ChatMessageContentItemVideoVideoURLVideoURLTypedDict", "ChatMessageTokenLogprob", "ChatMessageTokenLogprobTypedDict", "ChatMessageTokenLogprobs", @@ -902,8 +905,6 @@ "CreateChargeRequest", "CreateChargeRequestTypedDict", "DataCollection", - "Debug", - "DebugTypedDict", "DefaultParameters", "DefaultParametersTypedDict", "EdgeNetworkTimeoutResponseErrorData", @@ -911,17 +912,18 @@ "Effort", "EndpointStatus", "Engine", + "File", "FileCitation", "FileCitationType", "FileCitationTypedDict", "FilePath", "FilePathType", "FilePathTypedDict", + "FileTypedDict", "ForbiddenResponseErrorData", "ForbiddenResponseErrorDataTypedDict", "IDFileParser", "IDModeration", - "IDResponseHealing", "IDWeb", "Ignore", "IgnoreTypedDict", @@ -1215,8 +1217,6 @@ "PluginFileParserTypedDict", "PluginModeration", "PluginModerationTypedDict", - "PluginResponseHealing", - "PluginResponseHealingTypedDict", "PluginTypedDict", "PluginWeb", "PluginWebTypedDict", @@ -1342,7 +1342,6 @@ "SystemMessageContent", "SystemMessageContentTypedDict", "SystemMessageTypedDict", - "TTL", "Tokenizer", "TooManyRequestsResponseErrorData", "TooManyRequestsResponseErrorDataTypedDict", @@ -1392,10 +1391,8 @@ "UserMessageTypedDict", "Variables", "VariablesTypedDict", - "VideoURL1", - "VideoURL1TypedDict", - "VideoURL2", - "VideoURL2TypedDict", + "VideoURL", + "VideoURLTypedDict", "WebSearchPreviewToolUserLocation", "WebSearchPreviewToolUserLocationType", "WebSearchPreviewToolUserLocationTypedDict", @@ -1413,7 +1410,6 @@ "BadGatewayResponseErrorDataTypedDict": ".badgatewayresponseerrordata", "BadRequestResponseErrorData": ".badrequestresponseerrordata", "BadRequestResponseErrorDataTypedDict": ".badrequestresponseerrordata", - "ChatCompletionFinishReason": ".chatcompletionfinishreason", "ChatErrorError": ".chaterror", "ChatErrorErrorTypedDict": ".chaterror", "Code": ".chaterror", @@ -1430,8 +1426,6 @@ "ChatGenerationParamsStop": ".chatgenerationparams", "ChatGenerationParamsStopTypedDict": ".chatgenerationparams", "ChatGenerationParamsTypedDict": ".chatgenerationparams", - "Debug": ".chatgenerationparams", - "DebugTypedDict": ".chatgenerationparams", "Effort": ".chatgenerationparams", "Reasoning": ".chatgenerationparams", "ReasoningTypedDict": ".chatgenerationparams", @@ -1444,12 +1438,14 @@ "ChatMessageContentItem": ".chatmessagecontentitem", "ChatMessageContentItemTypedDict": ".chatmessagecontentitem", "ChatMessageContentItemAudio": ".chatmessagecontentitemaudio", + "ChatMessageContentItemAudioFormat": ".chatmessagecontentitemaudio", "ChatMessageContentItemAudioInputAudio": ".chatmessagecontentitemaudio", "ChatMessageContentItemAudioInputAudioTypedDict": ".chatmessagecontentitemaudio", "ChatMessageContentItemAudioTypedDict": ".chatmessagecontentitemaudio", - "ChatMessageContentItemCacheControl": ".chatmessagecontentitemcachecontrol", - "ChatMessageContentItemCacheControlTypedDict": ".chatmessagecontentitemcachecontrol", - "TTL": ".chatmessagecontentitemcachecontrol", + "ChatMessageContentItemFile": ".chatmessagecontentitemfile", + "ChatMessageContentItemFileTypedDict": ".chatmessagecontentitemfile", + "File": ".chatmessagecontentitemfile", + "FileTypedDict": ".chatmessagecontentitemfile", "ChatMessageContentItemImage": ".chatmessagecontentitemimage", "ChatMessageContentItemImageDetail": ".chatmessagecontentitemimage", "ChatMessageContentItemImageTypedDict": ".chatmessagecontentitemimage", @@ -1463,10 +1459,8 @@ "ChatMessageContentItemVideoTypedDict": ".chatmessagecontentitemvideo", "ChatMessageContentItemVideoVideoURL": ".chatmessagecontentitemvideo", "ChatMessageContentItemVideoVideoURLTypedDict": ".chatmessagecontentitemvideo", - "VideoURL1": ".chatmessagecontentitemvideo", - "VideoURL1TypedDict": ".chatmessagecontentitemvideo", - "VideoURL2": ".chatmessagecontentitemvideo", - "VideoURL2TypedDict": ".chatmessagecontentitemvideo", + "ChatMessageContentItemVideoVideoURLVideoURL": ".chatmessagecontentitemvideo", + "ChatMessageContentItemVideoVideoURLVideoURLTypedDict": ".chatmessagecontentitemvideo", "ChatMessageTokenLogprob": ".chatmessagetokenlogprob", "ChatMessageTokenLogprobTypedDict": ".chatmessagetokenlogprob", "TopLogprob": ".chatmessagetokenlogprob", @@ -1479,10 +1473,11 @@ "ChatMessageToolCallTypedDict": ".chatmessagetoolcall", "ChatResponse": ".chatresponse", "ChatResponseTypedDict": ".chatresponse", + "ChatCompletionFinishReason": ".chatresponsechoice", "ChatResponseChoice": ".chatresponsechoice", "ChatResponseChoiceTypedDict": ".chatresponsechoice", - "ChatStreamingChoice": ".chatstreamingchoice", - "ChatStreamingChoiceTypedDict": ".chatstreamingchoice", + "ChatStreamingChoice": ".chatresponsechoice", + "ChatStreamingChoiceTypedDict": ".chatresponsechoice", "ChatStreamingMessageChunk": ".chatstreamingmessagechunk", "ChatStreamingMessageChunkRole": ".chatstreamingmessagechunk", "ChatStreamingMessageChunkTypedDict": ".chatstreamingmessagechunk", @@ -1729,7 +1724,6 @@ "Engine": ".openresponsesrequest", "IDFileParser": ".openresponsesrequest", "IDModeration": ".openresponsesrequest", - "IDResponseHealing": ".openresponsesrequest", "IDWeb": ".openresponsesrequest", "Ignore": ".openresponsesrequest", "IgnoreTypedDict": ".openresponsesrequest", @@ -1754,8 +1748,6 @@ "PluginFileParserTypedDict": ".openresponsesrequest", "PluginModeration": ".openresponsesrequest", "PluginModerationTypedDict": ".openresponsesrequest", - "PluginResponseHealing": ".openresponsesrequest", - "PluginResponseHealingTypedDict": ".openresponsesrequest", "PluginTypedDict": ".openresponsesrequest", "PluginWeb": ".openresponsesrequest", "PluginWebTypedDict": ".openresponsesrequest", @@ -2006,6 +1998,8 @@ "UserMessageContent": ".usermessage", "UserMessageContentTypedDict": ".usermessage", "UserMessageTypedDict": ".usermessage", + "VideoURL": ".videourl", + "VideoURLTypedDict": ".videourl", "WebSearchPreviewToolUserLocation": ".websearchpreviewtooluserlocation", "WebSearchPreviewToolUserLocationType": ".websearchpreviewtooluserlocation", "WebSearchPreviewToolUserLocationTypedDict": ".websearchpreviewtooluserlocation", diff --git a/src/openrouter/components/chatcompletionfinishreason.py b/src/openrouter/components/chatcompletionfinishreason.py deleted file mode 100644 index 686462c..0000000 --- a/src/openrouter/components/chatcompletionfinishreason.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" - -from __future__ import annotations -from openrouter.types import UnrecognizedStr -from typing import Literal, Union - - -ChatCompletionFinishReason = Union[ - Literal[ - "tool_calls", - "stop", - "length", - "content_filter", - "error", - ], - UnrecognizedStr, -] diff --git a/src/openrouter/components/chatgenerationparams.py b/src/openrouter/components/chatgenerationparams.py index 07b4c33..2b9b05c 100644 --- a/src/openrouter/components/chatgenerationparams.py +++ b/src/openrouter/components/chatgenerationparams.py @@ -156,14 +156,6 @@ class ChatGenerationParamsResponseFormatText(BaseModel): ) -class DebugTypedDict(TypedDict): - echo_upstream_body: NotRequired[bool] - - -class Debug(BaseModel): - echo_upstream_body: Optional[bool] = None - - class ChatGenerationParamsTypedDict(TypedDict): messages: List[MessageTypedDict] model: NotRequired[str] @@ -187,7 +179,6 @@ class ChatGenerationParamsTypedDict(TypedDict): tools: NotRequired[List[ToolDefinitionJSONTypedDict]] top_p: NotRequired[Nullable[float]] user: NotRequired[str] - debug: NotRequired[DebugTypedDict] class ChatGenerationParams(BaseModel): @@ -235,8 +226,6 @@ class ChatGenerationParams(BaseModel): user: Optional[str] = None - debug: Optional[Debug] = None - @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = [ @@ -261,7 +250,6 @@ def serialize_model(self, handler): "tools", "top_p", "user", - "debug", ] nullable_fields = [ "frequency_penalty", diff --git a/src/openrouter/components/chatmessagecontentitem.py b/src/openrouter/components/chatmessagecontentitem.py index eba0a3b..6d949b9 100644 --- a/src/openrouter/components/chatmessagecontentitem.py +++ b/src/openrouter/components/chatmessagecontentitem.py @@ -5,6 +5,10 @@ ChatMessageContentItemAudio, ChatMessageContentItemAudioTypedDict, ) +from .chatmessagecontentitemfile import ( + ChatMessageContentItemFile, + ChatMessageContentItemFileTypedDict, +) from .chatmessagecontentitemimage import ( ChatMessageContentItemImage, ChatMessageContentItemImageTypedDict, @@ -26,9 +30,10 @@ ChatMessageContentItemTypedDict = TypeAliasType( "ChatMessageContentItemTypedDict", Union[ + ChatMessageContentItemTextTypedDict, ChatMessageContentItemImageTypedDict, ChatMessageContentItemAudioTypedDict, - ChatMessageContentItemTextTypedDict, + ChatMessageContentItemFileTypedDict, ChatMessageContentItemVideoTypedDict, ], ) @@ -41,6 +46,7 @@ Annotated[ChatMessageContentItemAudio, Tag("input_audio")], Annotated[ChatMessageContentItemVideo, Tag("input_video")], Annotated[ChatMessageContentItemVideo, Tag("video_url")], + Annotated[ChatMessageContentItemFile, Tag("file")], ], Discriminator(lambda m: get_discriminator(m, "type", "type")), ] diff --git a/src/openrouter/components/chatmessagecontentitemaudio.py b/src/openrouter/components/chatmessagecontentitemaudio.py index b251803..21a8803 100644 --- a/src/openrouter/components/chatmessagecontentitemaudio.py +++ b/src/openrouter/components/chatmessagecontentitemaudio.py @@ -1,23 +1,42 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from openrouter.types import BaseModel -from openrouter.utils import validate_const +from openrouter.types import BaseModel, UnrecognizedStr +from openrouter.utils import validate_const, validate_open_enum import pydantic -from pydantic.functional_validators import AfterValidator -from typing import Literal +from pydantic.functional_validators import AfterValidator, PlainValidator +from typing import Literal, Union from typing_extensions import Annotated, TypedDict +ChatMessageContentItemAudioFormat = Union[ + Literal[ + "wav", + "mp3", + "flac", + "m4a", + "ogg", + "pcm16", + "pcm24", + ], + UnrecognizedStr, +] + + class ChatMessageContentItemAudioInputAudioTypedDict(TypedDict): data: str - format_: str + format_: ChatMessageContentItemAudioFormat class ChatMessageContentItemAudioInputAudio(BaseModel): data: str - format_: Annotated[str, pydantic.Field(alias="format")] + format_: Annotated[ + Annotated[ + ChatMessageContentItemAudioFormat, PlainValidator(validate_open_enum(False)) + ], + pydantic.Field(alias="format"), + ] class ChatMessageContentItemAudioTypedDict(TypedDict): diff --git a/src/openrouter/components/chatmessagecontentitemcachecontrol.py b/src/openrouter/components/chatmessagecontentitemcachecontrol.py deleted file mode 100644 index b96625f..0000000 --- a/src/openrouter/components/chatmessagecontentitemcachecontrol.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" - -from __future__ import annotations -from openrouter.types import BaseModel, UnrecognizedStr -from openrouter.utils import validate_const, validate_open_enum -import pydantic -from pydantic.functional_validators import AfterValidator, PlainValidator -from typing import Literal, Optional, Union -from typing_extensions import Annotated, NotRequired, TypedDict - - -TTL = Union[ - Literal[ - "5m", - "1h", - ], - UnrecognizedStr, -] - - -class ChatMessageContentItemCacheControlTypedDict(TypedDict): - type: Literal["ephemeral"] - ttl: NotRequired[TTL] - - -class ChatMessageContentItemCacheControl(BaseModel): - TYPE: Annotated[ - Annotated[Literal["ephemeral"], AfterValidator(validate_const("ephemeral"))], - pydantic.Field(alias="type"), - ] = "ephemeral" - - ttl: Annotated[Optional[TTL], PlainValidator(validate_open_enum(False))] = None diff --git a/src/openrouter/components/chatmessagecontentitemfile.py b/src/openrouter/components/chatmessagecontentitemfile.py new file mode 100644 index 0000000..f878dc3 --- /dev/null +++ b/src/openrouter/components/chatmessagecontentitemfile.py @@ -0,0 +1,37 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from openrouter.utils import validate_const +import pydantic +from pydantic.functional_validators import AfterValidator +from typing import Literal, Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +class FileTypedDict(TypedDict): + file_data: str + file_id: NotRequired[str] + filename: NotRequired[str] + + +class File(BaseModel): + file_data: str + + file_id: Optional[str] = None + + filename: Optional[str] = None + + +class ChatMessageContentItemFileTypedDict(TypedDict): + file: FileTypedDict + type: Literal["file"] + + +class ChatMessageContentItemFile(BaseModel): + file: File + + TYPE: Annotated[ + Annotated[Literal["file"], AfterValidator(validate_const("file"))], + pydantic.Field(alias="type"), + ] = "file" diff --git a/src/openrouter/components/chatmessagecontentitemtext.py b/src/openrouter/components/chatmessagecontentitemtext.py index 4dc1662..c791fa9 100644 --- a/src/openrouter/components/chatmessagecontentitemtext.py +++ b/src/openrouter/components/chatmessagecontentitemtext.py @@ -1,22 +1,17 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from .chatmessagecontentitemcachecontrol import ( - ChatMessageContentItemCacheControl, - ChatMessageContentItemCacheControlTypedDict, -) from openrouter.types import BaseModel from openrouter.utils import validate_const import pydantic from pydantic.functional_validators import AfterValidator -from typing import Literal, Optional -from typing_extensions import Annotated, NotRequired, TypedDict +from typing import Literal +from typing_extensions import Annotated, TypedDict class ChatMessageContentItemTextTypedDict(TypedDict): text: str type: Literal["text"] - cache_control: NotRequired[ChatMessageContentItemCacheControlTypedDict] class ChatMessageContentItemText(BaseModel): @@ -26,5 +21,3 @@ class ChatMessageContentItemText(BaseModel): Annotated[Literal["text"], AfterValidator(validate_const("text"))], pydantic.Field(alias="type"), ] = "text" - - cache_control: Optional[ChatMessageContentItemCacheControl] = None diff --git a/src/openrouter/components/chatmessagecontentitemvideo.py b/src/openrouter/components/chatmessagecontentitemvideo.py index 06be297..553d826 100644 --- a/src/openrouter/components/chatmessagecontentitemvideo.py +++ b/src/openrouter/components/chatmessagecontentitemvideo.py @@ -1,6 +1,7 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations +from .videourl import VideoURL, VideoURLTypedDict from openrouter.types import BaseModel from openrouter.utils import get_discriminator, validate_const import pydantic @@ -10,21 +11,21 @@ from typing_extensions import Annotated, TypeAliasType, TypedDict -class VideoURL2TypedDict(TypedDict): +class ChatMessageContentItemVideoVideoURLVideoURLTypedDict(TypedDict): url: str -class VideoURL2(BaseModel): +class ChatMessageContentItemVideoVideoURLVideoURL(BaseModel): url: str class ChatMessageContentItemVideoVideoURLTypedDict(TypedDict): - video_url: VideoURL2TypedDict + video_url: ChatMessageContentItemVideoVideoURLVideoURLTypedDict type: Literal["video_url"] class ChatMessageContentItemVideoVideoURL(BaseModel): - video_url: VideoURL2 + video_url: ChatMessageContentItemVideoVideoURLVideoURL TYPE: Annotated[ Annotated[Literal["video_url"], AfterValidator(validate_const("video_url"))], @@ -32,21 +33,13 @@ class ChatMessageContentItemVideoVideoURL(BaseModel): ] = "video_url" -class VideoURL1TypedDict(TypedDict): - url: str - - -class VideoURL1(BaseModel): - url: str - - class ChatMessageContentItemVideoInputVideoTypedDict(TypedDict): - video_url: VideoURL1TypedDict + video_url: VideoURLTypedDict type: Literal["input_video"] class ChatMessageContentItemVideoInputVideo(BaseModel): - video_url: VideoURL1 + video_url: VideoURL TYPE: Annotated[ Annotated[ diff --git a/src/openrouter/components/chatresponsechoice.py b/src/openrouter/components/chatresponsechoice.py index 9592bf1..e59f847 100644 --- a/src/openrouter/components/chatresponsechoice.py +++ b/src/openrouter/components/chatresponsechoice.py @@ -2,24 +2,41 @@ from __future__ import annotations from .assistantmessage import AssistantMessage, AssistantMessageTypedDict -from .chatcompletionfinishreason import ChatCompletionFinishReason from .chatmessagetokenlogprobs import ( ChatMessageTokenLogprobs, ChatMessageTokenLogprobsTypedDict, ) +from .chatstreamingmessagechunk import ( + ChatStreamingMessageChunk, + ChatStreamingMessageChunkTypedDict, +) from openrouter.types import ( BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL, + UnrecognizedStr, ) from openrouter.utils import validate_open_enum from pydantic import model_serializer from pydantic.functional_validators import PlainValidator +from typing import Literal, Union from typing_extensions import Annotated, NotRequired, TypedDict +ChatCompletionFinishReason = Union[ + Literal[ + "tool_calls", + "stop", + "length", + "content_filter", + "error", + ], + UnrecognizedStr, +] + + class ChatResponseChoiceTypedDict(TypedDict): finish_reason: Nullable[ChatCompletionFinishReason] index: float @@ -67,3 +84,52 @@ def serialize_model(self, handler): m[k] = val return m + + +class ChatStreamingChoiceTypedDict(TypedDict): + delta: ChatStreamingMessageChunkTypedDict + finish_reason: Nullable[ChatCompletionFinishReason] + index: float + logprobs: NotRequired[Nullable[ChatMessageTokenLogprobsTypedDict]] + + +class ChatStreamingChoice(BaseModel): + delta: ChatStreamingMessageChunk + + finish_reason: Annotated[ + Nullable[ChatCompletionFinishReason], PlainValidator(validate_open_enum(False)) + ] + + index: float + + logprobs: OptionalNullable[ChatMessageTokenLogprobs] = UNSET + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = ["logprobs"] + nullable_fields = ["finish_reason", "logprobs"] + null_default_fields = [] + + serialized = handler(self) + + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + serialized.pop(k, None) + + optional_nullable = k in optional_fields and k in nullable_fields + is_set = ( + self.__pydantic_fields_set__.intersection({n}) + or k in null_default_fields + ) # pylint: disable=no-member + + if val is not None and val != UNSET_SENTINEL: + m[k] = val + elif val != UNSET_SENTINEL and ( + not k in optional_fields or (optional_nullable and is_set) + ): + m[k] = val + + return m diff --git a/src/openrouter/components/chatstreamingchoice.py b/src/openrouter/components/chatstreamingchoice.py deleted file mode 100644 index b64b8ff..0000000 --- a/src/openrouter/components/chatstreamingchoice.py +++ /dev/null @@ -1,72 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" - -from __future__ import annotations -from .chatcompletionfinishreason import ChatCompletionFinishReason -from .chatmessagetokenlogprobs import ( - ChatMessageTokenLogprobs, - ChatMessageTokenLogprobsTypedDict, -) -from .chatstreamingmessagechunk import ( - ChatStreamingMessageChunk, - ChatStreamingMessageChunkTypedDict, -) -from openrouter.types import ( - BaseModel, - Nullable, - OptionalNullable, - UNSET, - UNSET_SENTINEL, -) -from openrouter.utils import validate_open_enum -from pydantic import model_serializer -from pydantic.functional_validators import PlainValidator -from typing_extensions import Annotated, NotRequired, TypedDict - - -class ChatStreamingChoiceTypedDict(TypedDict): - delta: ChatStreamingMessageChunkTypedDict - finish_reason: Nullable[ChatCompletionFinishReason] - index: float - logprobs: NotRequired[Nullable[ChatMessageTokenLogprobsTypedDict]] - - -class ChatStreamingChoice(BaseModel): - delta: ChatStreamingMessageChunk - - finish_reason: Annotated[ - Nullable[ChatCompletionFinishReason], PlainValidator(validate_open_enum(False)) - ] - - index: float - - logprobs: OptionalNullable[ChatMessageTokenLogprobs] = UNSET - - @model_serializer(mode="wrap") - def serialize_model(self, handler): - optional_fields = ["logprobs"] - nullable_fields = ["finish_reason", "logprobs"] - null_default_fields = [] - - serialized = handler(self) - - m = {} - - for n, f in type(self).model_fields.items(): - k = f.alias or n - val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val - - return m diff --git a/src/openrouter/components/chatstreamingresponsechunk.py b/src/openrouter/components/chatstreamingresponsechunk.py index 7c32481..0ec76bc 100644 --- a/src/openrouter/components/chatstreamingresponsechunk.py +++ b/src/openrouter/components/chatstreamingresponsechunk.py @@ -5,7 +5,7 @@ ChatGenerationTokenUsage, ChatGenerationTokenUsageTypedDict, ) -from .chatstreamingchoice import ChatStreamingChoice, ChatStreamingChoiceTypedDict +from .chatresponsechoice import ChatStreamingChoice, ChatStreamingChoiceTypedDict from openrouter.types import ( BaseModel, Nullable, diff --git a/src/openrouter/components/completionchoice.py b/src/openrouter/components/completionchoice.py index 21ce2b9..3e68a00 100644 --- a/src/openrouter/components/completionchoice.py +++ b/src/openrouter/components/completionchoice.py @@ -2,19 +2,12 @@ from __future__ import annotations from .completionlogprobs import CompletionLogprobs, CompletionLogprobsTypedDict -from openrouter.types import ( - BaseModel, - Nullable, - OptionalNullable, - UNSET, - UNSET_SENTINEL, - UnrecognizedStr, -) +from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL, UnrecognizedStr from openrouter.utils import validate_open_enum from pydantic import model_serializer from pydantic.functional_validators import PlainValidator -from typing import Literal, Optional, Union -from typing_extensions import Annotated, NotRequired, TypedDict +from typing import Literal, Union +from typing_extensions import Annotated, TypedDict CompletionFinishReason = Union[ @@ -32,8 +25,6 @@ class CompletionChoiceTypedDict(TypedDict): index: float logprobs: Nullable[CompletionLogprobsTypedDict] finish_reason: Nullable[CompletionFinishReason] - native_finish_reason: NotRequired[str] - reasoning: NotRequired[Nullable[str]] class CompletionChoice(BaseModel): @@ -47,14 +38,10 @@ class CompletionChoice(BaseModel): Nullable[CompletionFinishReason], PlainValidator(validate_open_enum(False)) ] - native_finish_reason: Optional[str] = None - - reasoning: OptionalNullable[str] = UNSET - @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = ["native_finish_reason", "reasoning"] - nullable_fields = ["logprobs", "finish_reason", "reasoning"] + optional_fields = [] + nullable_fields = ["logprobs", "finish_reason"] null_default_fields = [] serialized = handler(self) diff --git a/src/openrouter/components/completionresponse.py b/src/openrouter/components/completionresponse.py index dcdd529..12bde5f 100644 --- a/src/openrouter/components/completionresponse.py +++ b/src/openrouter/components/completionresponse.py @@ -17,7 +17,6 @@ class CompletionResponseTypedDict(TypedDict): model: str choices: List[CompletionChoiceTypedDict] object: Literal["text_completion"] - provider: NotRequired[str] system_fingerprint: NotRequired[str] usage: NotRequired[CompletionUsageTypedDict] @@ -39,8 +38,6 @@ class CompletionResponse(BaseModel): pydantic.Field(alias="object"), ] = "text_completion" - provider: Optional[str] = None - system_fingerprint: Optional[str] = None usage: Optional[CompletionUsage] = None diff --git a/src/openrouter/components/openresponsesrequest.py b/src/openrouter/components/openresponsesrequest.py index 78f00d3..60a5e54 100644 --- a/src/openrouter/components/openresponsesrequest.py +++ b/src/openrouter/components/openresponsesrequest.py @@ -44,10 +44,9 @@ UNSET_SENTINEL, UnrecognizedStr, ) -from openrouter.utils import get_discriminator, validate_const, validate_open_enum -import pydantic +from openrouter.utils import get_discriminator, validate_open_enum from pydantic import Discriminator, Tag, model_serializer -from pydantic.functional_validators import AfterValidator, PlainValidator +from pydantic.functional_validators import PlainValidator from typing import Any, Dict, List, Literal, Optional, Union from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict @@ -136,7 +135,16 @@ def serialize_model(self, handler): ] -ServiceTier = Literal["auto",] +ServiceTier = Union[ + Literal[ + "auto", + "default", + "flex", + "priority", + "scale", + ], + UnrecognizedStr, +] Truncation = Union[ @@ -348,17 +356,6 @@ def serialize_model(self, handler): return m -IDResponseHealing = Literal["response-healing",] - - -class PluginResponseHealingTypedDict(TypedDict): - id: IDResponseHealing - - -class PluginResponseHealing(BaseModel): - id: IDResponseHealing - - IDFileParser = Literal["file-parser",] @@ -440,12 +437,7 @@ class PluginModeration(BaseModel): PluginTypedDict = TypeAliasType( "PluginTypedDict", - Union[ - PluginModerationTypedDict, - PluginResponseHealingTypedDict, - PluginFileParserTypedDict, - PluginWebTypedDict, - ], + Union[PluginModerationTypedDict, PluginFileParserTypedDict, PluginWebTypedDict], ) @@ -454,7 +446,6 @@ class PluginModeration(BaseModel): Annotated[PluginModeration, Tag("moderation")], Annotated[PluginWeb, Tag("web")], Annotated[PluginFileParser, Tag("file-parser")], - Annotated[PluginResponseHealing, Tag("response-healing")], ], Discriminator(lambda m: get_discriminator(m, "id", "id")), ] @@ -487,8 +478,8 @@ class OpenResponsesRequestTypedDict(TypedDict): include: NotRequired[Nullable[List[OpenAIResponsesIncludable]]] background: NotRequired[Nullable[bool]] safety_identifier: NotRequired[Nullable[str]] - store: Literal[False] - service_tier: NotRequired[ServiceTier] + store: NotRequired[Nullable[bool]] + service_tier: NotRequired[Nullable[ServiceTier]] truncation: NotRequired[Nullable[Truncation]] stream: NotRequired[bool] provider: NotRequired[Nullable[ProviderTypedDict]] @@ -552,12 +543,11 @@ class OpenResponsesRequest(BaseModel): safety_identifier: OptionalNullable[str] = UNSET - STORE: Annotated[ - Annotated[Optional[Literal[False]], AfterValidator(validate_const(False))], - pydantic.Field(alias="store"), - ] = False + store: OptionalNullable[bool] = UNSET - service_tier: Optional[ServiceTier] = "auto" + service_tier: Annotated[ + OptionalNullable[ServiceTier], PlainValidator(validate_open_enum(False)) + ] = UNSET truncation: Annotated[ OptionalNullable[Truncation], PlainValidator(validate_open_enum(False)) @@ -619,6 +609,8 @@ def serialize_model(self, handler): "include", "background", "safety_identifier", + "store", + "service_tier", "truncation", "provider", ] diff --git a/src/openrouter/components/providername.py b/src/openrouter/components/providername.py index 62e892c..21f6345 100644 --- a/src/openrouter/components/providername.py +++ b/src/openrouter/components/providername.py @@ -11,14 +11,12 @@ "AionLabs", "Alibaba", "Amazon Bedrock", - "Amazon Nova", "Anthropic", - "Arcee AI", + "Arcee", "AtlasCloud", "Avian", "Azure", "BaseTen", - "BytePlus", "Black Forest Labs", "Cerebras", "Chutes", @@ -33,7 +31,6 @@ "Fireworks", "Friendli", "GMICloud", - "GoPomelo", "Google", "Google AI Studio", "Groq", @@ -64,7 +61,6 @@ "SambaNova", "SiliconFlow", "Stealth", - "StreamLake", "Switchpoint", "Targon", "Together", diff --git a/src/openrouter/components/videourl.py b/src/openrouter/components/videourl.py new file mode 100644 index 0000000..e1ef80d --- /dev/null +++ b/src/openrouter/components/videourl.py @@ -0,0 +1,13 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel +from typing_extensions import TypedDict + + +class VideoURLTypedDict(TypedDict): + url: str + + +class VideoURL(BaseModel): + url: str diff --git a/src/openrouter/embeddings.py b/src/openrouter/embeddings.py index eaa52b0..3ea39af 100644 --- a/src/openrouter/embeddings.py +++ b/src/openrouter/embeddings.py @@ -1,6 +1,7 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from .basesdk import BaseSDK +from enum import Enum from openrouter import components, errors, operations, utils from openrouter._hooks import HookContext from openrouter.types import OptionalNullable, UNSET @@ -9,6 +10,11 @@ from typing import Any, Mapping, Optional, Union +class GenerateAcceptEnum(str, Enum): + APPLICATION_JSON = "application/json" + TEXT_EVENT_STREAM = "text/event-stream" + + class Embeddings(BaseSDK): r"""Text embedding endpoints""" @@ -30,6 +36,7 @@ def generate( retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, + accept_header_override: Optional[GenerateAcceptEnum] = None, http_headers: Optional[Mapping[str, str]] = None, ) -> operations.CreateEmbeddingsResponse: r"""Submit an embedding request @@ -46,6 +53,7 @@ def generate( :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param accept_header_override: Override the default accept header for this method :param http_headers: Additional headers to set or replace on requests. """ base_url = None @@ -80,7 +88,9 @@ def generate( request_has_path_params=False, request_has_query_params=True, user_agent_header="user-agent", - accept_header_value="application/json", + accept_header_value=accept_header_override.value + if accept_header_override is not None + else "application/json;q=1, text/event-stream;q=0", http_headers=http_headers, security=self.sdk_configuration.security, get_serialized_body=lambda: utils.serialize_request_body( @@ -129,8 +139,10 @@ def generate( response_data: Any = None if utils.match_response(http_res, "200", "application/json"): return unmarshal_json_response( - operations.CreateEmbeddingsResponse, http_res + operations.CreateEmbeddingsResponseBody, http_res ) + if utils.match_response(http_res, "200", "text/event-stream"): + return http_res.text if utils.match_response(http_res, "400", "application/json"): response_data = unmarshal_json_response( errors.BadRequestResponseErrorData, http_res @@ -212,6 +224,7 @@ async def generate_async( retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, + accept_header_override: Optional[GenerateAcceptEnum] = None, http_headers: Optional[Mapping[str, str]] = None, ) -> operations.CreateEmbeddingsResponse: r"""Submit an embedding request @@ -228,6 +241,7 @@ async def generate_async( :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param accept_header_override: Override the default accept header for this method :param http_headers: Additional headers to set or replace on requests. """ base_url = None @@ -262,7 +276,9 @@ async def generate_async( request_has_path_params=False, request_has_query_params=True, user_agent_header="user-agent", - accept_header_value="application/json", + accept_header_value=accept_header_override.value + if accept_header_override is not None + else "application/json;q=1, text/event-stream;q=0", http_headers=http_headers, security=self.sdk_configuration.security, get_serialized_body=lambda: utils.serialize_request_body( @@ -311,8 +327,10 @@ async def generate_async( response_data: Any = None if utils.match_response(http_res, "200", "application/json"): return unmarshal_json_response( - operations.CreateEmbeddingsResponse, http_res + operations.CreateEmbeddingsResponseBody, http_res ) + if utils.match_response(http_res, "200", "text/event-stream"): + return http_res.text if utils.match_response(http_res, "400", "application/json"): response_data = unmarshal_json_response( errors.BadRequestResponseErrorData, http_res diff --git a/src/openrouter/operations/__init__.py b/src/openrouter/operations/__init__.py index 82d7f51..3ba8b45 100644 --- a/src/openrouter/operations/__init__.py +++ b/src/openrouter/operations/__init__.py @@ -45,6 +45,8 @@ CreateEmbeddingsRequest, CreateEmbeddingsRequestTypedDict, CreateEmbeddingsResponse, + CreateEmbeddingsResponseBody, + CreateEmbeddingsResponseBodyTypedDict, CreateEmbeddingsResponseTypedDict, Embedding, EmbeddingTypedDict, @@ -98,12 +100,7 @@ ExchangeAuthCodeForAPIKeyResponse, ExchangeAuthCodeForAPIKeyResponseTypedDict, ) - from .getcredits import ( - GetCreditsData, - GetCreditsDataTypedDict, - GetCreditsResponse, - GetCreditsResponseTypedDict, - ) + from .getcredits import GetCreditsResponse, GetCreditsResponseTypedDict from .getcurrentkey import ( GetCurrentKeyData, GetCurrentKeyDataTypedDict, @@ -219,6 +216,8 @@ "CreateEmbeddingsRequest", "CreateEmbeddingsRequestTypedDict", "CreateEmbeddingsResponse", + "CreateEmbeddingsResponseBody", + "CreateEmbeddingsResponseBodyTypedDict", "CreateEmbeddingsResponseTypedDict", "CreateKeysData", "CreateKeysDataTypedDict", @@ -243,8 +242,6 @@ "ExchangeAuthCodeForAPIKeyRequestTypedDict", "ExchangeAuthCodeForAPIKeyResponse", "ExchangeAuthCodeForAPIKeyResponseTypedDict", - "GetCreditsData", - "GetCreditsDataTypedDict", "GetCreditsResponse", "GetCreditsResponseTypedDict", "GetCurrentKeyData", @@ -373,6 +370,8 @@ "CreateEmbeddingsRequest": ".createembeddings", "CreateEmbeddingsRequestTypedDict": ".createembeddings", "CreateEmbeddingsResponse": ".createembeddings", + "CreateEmbeddingsResponseBody": ".createembeddings", + "CreateEmbeddingsResponseBodyTypedDict": ".createembeddings", "CreateEmbeddingsResponseTypedDict": ".createembeddings", "Embedding": ".createembeddings", "EmbeddingTypedDict": ".createembeddings", @@ -417,8 +416,6 @@ "ExchangeAuthCodeForAPIKeyRequestTypedDict": ".exchangeauthcodeforapikey", "ExchangeAuthCodeForAPIKeyResponse": ".exchangeauthcodeforapikey", "ExchangeAuthCodeForAPIKeyResponseTypedDict": ".exchangeauthcodeforapikey", - "GetCreditsData": ".getcredits", - "GetCreditsDataTypedDict": ".getcredits", "GetCreditsResponse": ".getcredits", "GetCreditsResponseTypedDict": ".getcredits", "GetCurrentKeyData": ".getcurrentkey", diff --git a/src/openrouter/operations/createembeddings.py b/src/openrouter/operations/createembeddings.py index c200370..b184d5a 100644 --- a/src/openrouter/operations/createembeddings.py +++ b/src/openrouter/operations/createembeddings.py @@ -395,7 +395,7 @@ class Usage(BaseModel): cost: Optional[float] = None -class CreateEmbeddingsResponseTypedDict(TypedDict): +class CreateEmbeddingsResponseBodyTypedDict(TypedDict): r"""Embedding response""" object: Object @@ -405,7 +405,7 @@ class CreateEmbeddingsResponseTypedDict(TypedDict): usage: NotRequired[UsageTypedDict] -class CreateEmbeddingsResponse(BaseModel): +class CreateEmbeddingsResponseBody(BaseModel): r"""Embedding response""" object: Object @@ -417,3 +417,14 @@ class CreateEmbeddingsResponse(BaseModel): id: Optional[str] = None usage: Optional[Usage] = None + + +CreateEmbeddingsResponseTypedDict = TypeAliasType( + "CreateEmbeddingsResponseTypedDict", + Union[CreateEmbeddingsResponseBodyTypedDict, str], +) + + +CreateEmbeddingsResponse = TypeAliasType( + "CreateEmbeddingsResponse", Union[CreateEmbeddingsResponseBody, str] +) diff --git a/src/openrouter/operations/getcredits.py b/src/openrouter/operations/getcredits.py index 8cab52d..9719016 100644 --- a/src/openrouter/operations/getcredits.py +++ b/src/openrouter/operations/getcredits.py @@ -5,28 +5,9 @@ from typing_extensions import TypedDict -class GetCreditsDataTypedDict(TypedDict): - total_credits: float - r"""Total credits purchased""" - total_usage: float - r"""Total credits used""" - - -class GetCreditsData(BaseModel): - total_credits: float - r"""Total credits purchased""" - - total_usage: float - r"""Total credits used""" - - class GetCreditsResponseTypedDict(TypedDict): r"""Total credits purchased and used""" - data: GetCreditsDataTypedDict - class GetCreditsResponse(BaseModel): r"""Total credits purchased and used""" - - data: GetCreditsData diff --git a/src/openrouter/operations/getparameters.py b/src/openrouter/operations/getparameters.py index 14349a8..18da669 100644 --- a/src/openrouter/operations/getparameters.py +++ b/src/openrouter/operations/getparameters.py @@ -38,14 +38,12 @@ class GetParametersSecurity(BaseModel): "AionLabs", "Alibaba", "Amazon Bedrock", - "Amazon Nova", "Anthropic", - "Arcee AI", + "Arcee", "AtlasCloud", "Avian", "Azure", "BaseTen", - "BytePlus", "Black Forest Labs", "Cerebras", "Chutes", @@ -60,7 +58,6 @@ class GetParametersSecurity(BaseModel): "Fireworks", "Friendli", "GMICloud", - "GoPomelo", "Google", "Google AI Studio", "Groq", @@ -91,7 +88,6 @@ class GetParametersSecurity(BaseModel): "SambaNova", "SiliconFlow", "Stealth", - "StreamLake", "Switchpoint", "Targon", "Together", diff --git a/src/openrouter/operations/updatekeys.py b/src/openrouter/operations/updatekeys.py index bf3bf90..7f81066 100644 --- a/src/openrouter/operations/updatekeys.py +++ b/src/openrouter/operations/updatekeys.py @@ -105,7 +105,7 @@ def serialize_model(self, handler): class UpdateKeysRequestTypedDict(TypedDict): hash: str r"""The hash identifier of the API key to update""" - body: UpdateKeysRequestBodyTypedDict + request_body: UpdateKeysRequestBodyTypedDict class UpdateKeysRequest(BaseModel): @@ -114,7 +114,7 @@ class UpdateKeysRequest(BaseModel): ] r"""The hash identifier of the API key to update""" - body: Annotated[ + request_body: Annotated[ UpdateKeysRequestBody, FieldMetadata(request=RequestMetadata(media_type="application/json")), ] diff --git a/src/openrouter/responses.py b/src/openrouter/responses.py index fba3823..85701ff 100644 --- a/src/openrouter/responses.py +++ b/src/openrouter/responses.py @@ -69,7 +69,8 @@ def send( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - service_tier: Optional[components.ServiceTier] = "auto", + store: OptionalNullable[bool] = UNSET, + service_tier: OptionalNullable[components.ServiceTier] = UNSET, truncation: OptionalNullable[components.Truncation] = UNSET, stream: Union[Literal[False], None] = None, provider: OptionalNullable[ @@ -108,6 +109,7 @@ def send( :param include: :param background: :param safety_identifier: + :param store: :param service_tier: :param truncation: :param stream: @@ -172,7 +174,8 @@ def send( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - service_tier: Optional[components.ServiceTier] = "auto", + store: OptionalNullable[bool] = UNSET, + service_tier: OptionalNullable[components.ServiceTier] = UNSET, truncation: OptionalNullable[components.Truncation] = UNSET, stream: Literal[True], provider: OptionalNullable[ @@ -211,6 +214,7 @@ def send( :param include: :param background: :param safety_identifier: + :param store: :param service_tier: :param truncation: :param stream: @@ -274,7 +278,8 @@ def send( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - service_tier: Optional[components.ServiceTier] = "auto", + store: OptionalNullable[bool] = UNSET, + service_tier: OptionalNullable[components.ServiceTier] = UNSET, truncation: OptionalNullable[components.Truncation] = UNSET, stream: Optional[bool] = False, provider: OptionalNullable[ @@ -313,6 +318,7 @@ def send( :param include: :param background: :param safety_identifier: + :param store: :param service_tier: :param truncation: :param stream: @@ -368,6 +374,7 @@ def send( include=include, background=background, safety_identifier=safety_identifier, + store=store, service_tier=service_tier, truncation=truncation, stream=stream, @@ -620,7 +627,8 @@ async def send_async( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - service_tier: Optional[components.ServiceTier] = "auto", + store: OptionalNullable[bool] = UNSET, + service_tier: OptionalNullable[components.ServiceTier] = UNSET, truncation: OptionalNullable[components.Truncation] = UNSET, stream: Union[Literal[False], None] = None, provider: OptionalNullable[ @@ -659,6 +667,7 @@ async def send_async( :param include: :param background: :param safety_identifier: + :param store: :param service_tier: :param truncation: :param stream: @@ -723,7 +732,8 @@ async def send_async( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - service_tier: Optional[components.ServiceTier] = "auto", + store: OptionalNullable[bool] = UNSET, + service_tier: OptionalNullable[components.ServiceTier] = UNSET, truncation: OptionalNullable[components.Truncation] = UNSET, stream: Literal[True], provider: OptionalNullable[ @@ -762,6 +772,7 @@ async def send_async( :param include: :param background: :param safety_identifier: + :param store: :param service_tier: :param truncation: :param stream: @@ -825,7 +836,8 @@ async def send_async( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - service_tier: Optional[components.ServiceTier] = "auto", + store: OptionalNullable[bool] = UNSET, + service_tier: OptionalNullable[components.ServiceTier] = UNSET, truncation: OptionalNullable[components.Truncation] = UNSET, stream: Optional[bool] = False, provider: OptionalNullable[ @@ -864,6 +876,7 @@ async def send_async( :param include: :param background: :param safety_identifier: + :param store: :param service_tier: :param truncation: :param stream: @@ -919,6 +932,7 @@ async def send_async( include=include, background=background, safety_identifier=safety_identifier, + store=store, service_tier=service_tier, truncation=truncation, stream=stream, From d4474da1b82a15d6354a5e7183c889d988e5df18 Mon Sep 17 00:00:00 2001 From: Matt Apperson Date: Thu, 4 Dec 2025 13:07:08 -0500 Subject: [PATCH 2/2] more updates --- .speakeasy/gen.lock | 28 +-- .speakeasy/gen.yaml | 2 +- .speakeasy/out.openapi.yaml | 164 +++++++++++------- .speakeasy/workflow.lock | 21 ++- .speakeasy/workflow.yaml | 10 +- USAGE.md | 4 +- docs/components/chatgenerationparams.md | 3 +- docs/components/chatmessagecontentitem.md | 6 - .../chatmessagecontentitemaudioformat.md | 14 -- .../chatmessagecontentitemaudioinputaudio.md | 8 +- .../chatmessagecontentitemcachecontrol.md | 9 + docs/components/chatmessagecontentitemfile.md | 9 - docs/components/chatmessagecontentitemtext.md | 9 +- .../chatmessagecontentitemvideoinputvideo.md | 8 +- .../chatmessagecontentitemvideovideourl.md | 8 +- docs/components/completionchoice.md | 4 +- docs/components/completionresponse.md | 1 + docs/components/debug.md | 8 + docs/components/file.md | 10 -- docs/components/idresponsehealing.md | 8 + docs/components/openresponsesrequest.md | 7 +- docs/components/plugin.md | 6 + docs/components/pluginresponsehealing.md | 8 + docs/components/providername.md | 7 +- docs/components/servicetier.md | 10 +- docs/components/ttl.md | 9 + docs/components/{videourl.md => videourl1.md} | 2 +- ...mvideovideourlvideourl.md => videourl2.md} | 2 +- docs/operations/getcreditsdata.md | 9 + docs/operations/getcreditsresponse.md | 5 +- docs/operations/getparametersprovider.md | 7 +- docs/sdks/chat/README.md | 1 + docs/sdks/responses/README.md | 6 +- pyproject.toml | 2 +- src/openrouter/_version.py | 4 +- src/openrouter/chat.py | 14 ++ src/openrouter/components/__init__.py | 80 +++++---- .../components/chatcompletionfinishreason.py | 17 ++ .../components/chatgenerationparams.py | 12 ++ .../components/chatmessagecontentitem.py | 8 +- .../components/chatmessagecontentitemaudio.py | 31 +--- .../chatmessagecontentitemcachecontrol.py | 32 ++++ .../components/chatmessagecontentitemfile.py | 37 ---- .../components/chatmessagecontentitemtext.py | 11 +- .../components/chatmessagecontentitemvideo.py | 21 ++- .../components/chatresponsechoice.py | 68 +------- .../components/chatstreamingchoice.py | 72 ++++++++ .../components/chatstreamingresponsechunk.py | 2 +- src/openrouter/components/completionchoice.py | 23 ++- .../components/completionresponse.py | 3 + .../components/openresponsesrequest.py | 56 +++--- src/openrouter/components/providername.py | 7 +- src/openrouter/components/videourl.py | 13 -- src/openrouter/operations/__init__.py | 11 +- src/openrouter/operations/getcredits.py | 19 ++ src/openrouter/operations/getparameters.py | 7 +- src/openrouter/responses.py | 40 ++--- 57 files changed, 588 insertions(+), 415 deletions(-) delete mode 100644 docs/components/chatmessagecontentitemaudioformat.md create mode 100644 docs/components/chatmessagecontentitemcachecontrol.md delete mode 100644 docs/components/chatmessagecontentitemfile.md create mode 100644 docs/components/debug.md delete mode 100644 docs/components/file.md create mode 100644 docs/components/idresponsehealing.md create mode 100644 docs/components/pluginresponsehealing.md create mode 100644 docs/components/ttl.md rename docs/components/{videourl.md => videourl1.md} (95%) rename docs/components/{chatmessagecontentitemvideovideourlvideourl.md => videourl2.md} (85%) create mode 100644 docs/operations/getcreditsdata.md create mode 100644 src/openrouter/components/chatcompletionfinishreason.py create mode 100644 src/openrouter/components/chatmessagecontentitemcachecontrol.py delete mode 100644 src/openrouter/components/chatmessagecontentitemfile.py create mode 100644 src/openrouter/components/chatstreamingchoice.py delete mode 100644 src/openrouter/components/videourl.py diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 569c59c..5135a8f 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,12 +1,12 @@ lockVersion: 2.0.0 id: cfd52247-6a25-4c6d-bbce-fe6fce0cd69d management: - docChecksum: bcccd1abd05f6654a822386f2eefbd8a + docChecksum: 01481f11e87a18cf1daa583fee2c88fb docVersion: 1.0.0 speakeasyVersion: 1.666.0 generationVersion: 2.768.0 - releaseVersion: 0.0.16 - configChecksum: cd00e781b0ef78cfcb3fe812f51e93ff + releaseVersion: 0.0.21 + configChecksum: 52c13d7fdf159611bf5d900363e322ac repoURL: https://github.com/OpenRouterTeam/python-sdk.git installationURL: https://github.com/OpenRouterTeam/python-sdk.git published: true @@ -66,16 +66,14 @@ generatedFiles: - docs/components/chatgenerationtokenusage.md - docs/components/chatmessagecontentitem.md - docs/components/chatmessagecontentitemaudio.md - - docs/components/chatmessagecontentitemaudioformat.md - docs/components/chatmessagecontentitemaudioinputaudio.md - - docs/components/chatmessagecontentitemfile.md + - docs/components/chatmessagecontentitemcachecontrol.md - docs/components/chatmessagecontentitemimage.md - docs/components/chatmessagecontentitemimagedetail.md - docs/components/chatmessagecontentitemtext.md - docs/components/chatmessagecontentitemvideo.md - docs/components/chatmessagecontentitemvideoinputvideo.md - docs/components/chatmessagecontentitemvideovideourl.md - - docs/components/chatmessagecontentitemvideovideourlvideourl.md - docs/components/chatmessagetokenlogprob.md - docs/components/chatmessagetokenlogprobs.md - docs/components/chatmessagetoolcall.md @@ -108,12 +106,12 @@ generatedFiles: - docs/components/costdetails.md - docs/components/createchargerequest.md - docs/components/datacollection.md + - docs/components/debug.md - docs/components/defaultparameters.md - docs/components/edgenetworktimeoutresponseerrordata.md - docs/components/effort.md - docs/components/endpointstatus.md - docs/components/engine.md - - docs/components/file.md - docs/components/filecitation.md - docs/components/filecitationtype.md - docs/components/filepath.md @@ -121,6 +119,7 @@ generatedFiles: - docs/components/forbiddenresponseerrordata.md - docs/components/idfileparser.md - docs/components/idmoderation.md + - docs/components/idresponsehealing.md - docs/components/idweb.md - docs/components/ignore.md - docs/components/imagegenerationstatus.md @@ -304,6 +303,7 @@ generatedFiles: - docs/components/plugin.md - docs/components/pluginfileparser.md - docs/components/pluginmoderation.md + - docs/components/pluginresponsehealing.md - docs/components/pluginweb.md - docs/components/pricing.md - docs/components/prompt.md @@ -395,6 +395,7 @@ generatedFiles: - docs/components/toplogprob.md - docs/components/topproviderinfo.md - docs/components/truncation.md + - docs/components/ttl.md - docs/components/type.md - docs/components/typeresponsecompleted.md - docs/components/typeresponsecontentpartadded.md @@ -420,7 +421,8 @@ generatedFiles: - docs/components/usermessage.md - docs/components/usermessagecontent.md - docs/components/variables.md - - docs/components/videourl.md + - docs/components/videourl1.md + - docs/components/videourl2.md - docs/components/websearchpreviewtooluserlocation.md - docs/components/websearchpreviewtooluserlocationtype.md - docs/components/websearchstatus.md @@ -471,6 +473,7 @@ generatedFiles: - docs/operations/exchangeauthcodeforapikeycodechallengemethod.md - docs/operations/exchangeauthcodeforapikeyrequest.md - docs/operations/exchangeauthcodeforapikeyresponse.md + - docs/operations/getcreditsdata.md - docs/operations/getcreditsresponse.md - docs/operations/getcurrentkeydata.md - docs/operations/getcurrentkeyresponse.md @@ -553,12 +556,13 @@ generatedFiles: - src/openrouter/components/assistantmessage.py - src/openrouter/components/badgatewayresponseerrordata.py - src/openrouter/components/badrequestresponseerrordata.py + - src/openrouter/components/chatcompletionfinishreason.py - src/openrouter/components/chaterror.py - src/openrouter/components/chatgenerationparams.py - src/openrouter/components/chatgenerationtokenusage.py - src/openrouter/components/chatmessagecontentitem.py - src/openrouter/components/chatmessagecontentitemaudio.py - - src/openrouter/components/chatmessagecontentitemfile.py + - src/openrouter/components/chatmessagecontentitemcachecontrol.py - src/openrouter/components/chatmessagecontentitemimage.py - src/openrouter/components/chatmessagecontentitemtext.py - src/openrouter/components/chatmessagecontentitemvideo.py @@ -567,6 +571,7 @@ generatedFiles: - src/openrouter/components/chatmessagetoolcall.py - src/openrouter/components/chatresponse.py - src/openrouter/components/chatresponsechoice.py + - src/openrouter/components/chatstreamingchoice.py - src/openrouter/components/chatstreamingmessagechunk.py - src/openrouter/components/chatstreamingmessagetoolcall.py - src/openrouter/components/chatstreamingresponsechunk.py @@ -689,7 +694,6 @@ generatedFiles: - src/openrouter/components/unprocessableentityresponseerrordata.py - src/openrouter/components/urlcitation.py - src/openrouter/components/usermessage.py - - src/openrouter/components/videourl.py - src/openrouter/components/websearchpreviewtooluserlocation.py - src/openrouter/components/websearchstatus.py - src/openrouter/credits.py @@ -773,7 +777,7 @@ examples: createResponses: speakeasy-default-create-responses: requestBody: - application/json: {"stream": false} + application/json: {"store": false, "service_tier": "auto", "stream": false} responses: "200": application/json: {"id": "resp-abc123", "object": "response", "created_at": 1704067200, "model": "gpt-4", "output": [{"id": "msg-abc123", "role": "assistant", "type": "message", "content": [{"type": "output_text", "text": "Hello! How can I help you today?"}]}], "error": null, "incomplete_details": null, "temperature": null, "top_p": null, "instructions": null, "metadata": null, "tools": [], "tool_choice": "auto", "parallel_tool_calls": true} @@ -823,7 +827,7 @@ examples: speakeasy-default-get-credits: responses: "200": - application/json: {} + application/json: {"data": {"total_credits": 100.5, "total_usage": 25.75}} "401": application/json: {"error": {"code": 401, "message": "Missing Authentication header"}} "403": diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 5006069..4cdfb5c 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -31,7 +31,7 @@ generation: skipResponseBodyAssertions: false preApplyUnionDiscriminators: true python: - version: 0.0.16 + version: 0.0.21 additionalDependencies: dev: {} main: {} diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index d99089f..1c24df9 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -3464,12 +3464,14 @@ components: - AionLabs - Alibaba - Amazon Bedrock + - Amazon Nova - Anthropic - - Arcee + - Arcee AI - AtlasCloud - Avian - Azure - BaseTen + - BytePlus - Black Forest Labs - Cerebras - Chutes @@ -3484,6 +3486,7 @@ components: - Fireworks - Friendli - GMICloud + - GoPomelo - Google - Google AI Studio - Groq @@ -3513,7 +3516,9 @@ components: - Relace - SambaNova - SiliconFlow + - Sourceful - Stealth + - StreamLake - Switchpoint - Targon - Together @@ -3648,18 +3653,13 @@ components: nullable: true store: type: boolean - nullable: true + const: false + default: false service_tier: - allOf: - - $ref: '#/components/schemas/OpenAIResponsesServiceTier' - - enum: - - auto - - default - - flex - - scale - - priority - example: auto - x-speakeasy-unknown-values: allow + type: string + enum: + - auto + default: auto truncation: allOf: - $ref: '#/components/schemas/OpenAIResponsesTruncation' @@ -3803,12 +3803,25 @@ components: x-speakeasy-unknown-values: allow required: - id + - type: object + properties: + id: + type: string + enum: + - response-healing + required: + - id description: Plugins you want to enable for this request, including their settings. user: type: string maxLength: 128 description: >- A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters. + session_id: + type: string + maxLength: 128 + description: >- + A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters. description: Request schema for Responses endpoint example: model: anthropic/claude-4.5-sonnet-20250929 @@ -4597,6 +4610,10 @@ components: status: default uptime_last_30m: 99.5 supports_implicit_caching: true + __schema0: + anyOf: + - $ref: '#/components/schemas/ChatCompletionFinishReason' + - type: 'null' ModelName: type: string ChatMessageContentItemText: @@ -4607,6 +4624,8 @@ components: const: text text: type: string + cache_control: + $ref: '#/components/schemas/ChatMessageContentItemCacheControl' required: - type - text @@ -4646,15 +4665,6 @@ components: type: string format: type: string - enum: - - wav - - mp3 - - flac - - m4a - - ogg - - pcm16 - - pcm24 - x-speakeasy-unknown-values: allow required: - data - format @@ -4669,7 +4679,12 @@ components: type: string const: input_video video_url: - $ref: '#/components/schemas/VideoURL' + type: object + properties: + url: + type: string + required: + - url required: - type - video_url @@ -4689,40 +4704,12 @@ components: - type - video_url type: object - VideoURL: - type: object - properties: - url: - type: string - required: - - url - ChatMessageContentItemFile: - type: object - properties: - type: - type: string - const: file - file: - type: object - properties: - file_data: - type: string - file_id: - type: string - filename: - type: string - required: - - file_data - required: - - type - - file ChatMessageContentItem: oneOf: - $ref: '#/components/schemas/ChatMessageContentItemText' - $ref: '#/components/schemas/ChatMessageContentItemImage' - $ref: '#/components/schemas/ChatMessageContentItemAudio' - $ref: '#/components/schemas/ChatMessageContentItemVideo' - - $ref: '#/components/schemas/ChatMessageContentItemFile' type: object discriminator: propertyName: type @@ -4732,7 +4719,6 @@ components: input_audio: '#/components/schemas/ChatMessageContentItemAudio' input_video: '#/components/schemas/ChatMessageContentItemVideo' video_url: '#/components/schemas/ChatMessageContentItemVideo' - file: '#/components/schemas/ChatMessageContentItemFile' ChatMessageToolCall: type: object properties: @@ -4856,16 +4842,14 @@ components: - prompt_tokens - total_tokens ChatCompletionFinishReason: - anyOf: - - type: string - enum: - - tool_calls - - stop - - length - - content_filter - - error - x-speakeasy-unknown-values: allow - - type: 'null' + type: string + enum: + - tool_calls + - stop + - length + - content_filter + - error + x-speakeasy-unknown-values: allow JSONSchemaConfig: type: object properties: @@ -4907,6 +4891,20 @@ components: required: - type - grammar + ChatMessageContentItemCacheControl: + type: object + properties: + type: + type: string + const: ephemeral + ttl: + type: string + enum: + - 5m + - 1h + x-speakeasy-unknown-values: allow + required: + - type SystemMessage: type: object properties: @@ -5218,13 +5216,18 @@ components: - type: 'null' user: type: string + debug: + type: object + properties: + echo_upstream_body: + type: boolean required: - messages ChatResponseChoice: type: object properties: finish_reason: - $ref: '#/components/schemas/ChatCompletionFinishReason' + $ref: '#/components/schemas/__schema0' index: type: number message: @@ -5285,7 +5288,7 @@ components: delta: $ref: '#/components/schemas/ChatStreamingMessageChunk' finish_reason: - $ref: '#/components/schemas/ChatCompletionFinishReason' + $ref: '#/components/schemas/__schema0' index: type: number logprobs: @@ -5618,6 +5621,12 @@ components: - type: 'null' finish_reason: $ref: '#/components/schemas/CompletionFinishReason' + native_finish_reason: + type: string + reasoning: + anyOf: + - type: string + - type: 'null' required: - text - index @@ -5635,6 +5644,8 @@ components: type: number model: type: string + provider: + type: string system_fingerprint: type: string choices: @@ -5853,6 +5864,26 @@ paths: application/json: schema: type: object + properties: + data: + type: object + properties: + total_credits: + type: number + description: Total credits purchased + example: 100.5 + total_usage: + type: number + description: Total credits used + example: 25.75 + required: + - total_credits + - total_usage + example: + total_credits: 100.5 + total_usage: 25.75 + required: + - data description: Total credits purchased and used example: data: @@ -6754,12 +6785,14 @@ paths: - AionLabs - Alibaba - Amazon Bedrock + - Amazon Nova - Anthropic - - Arcee + - Arcee AI - AtlasCloud - Avian - Azure - BaseTen + - BytePlus - Black Forest Labs - Cerebras - Chutes @@ -6774,6 +6807,7 @@ paths: - Fireworks - Friendli - GMICloud + - GoPomelo - Google - Google AI Studio - Groq @@ -6803,7 +6837,9 @@ paths: - Relace - SambaNova - SiliconFlow + - Sourceful - Stealth + - StreamLake - Switchpoint - Targon - Together diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 346e0ea..3124e3e 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -6,30 +6,37 @@ sources: sourceBlobDigest: sha256:ee1f2422281b3ed5b38951c74636ad192c9bb160f216069c1f7931ccc4e52553 tags: - latest + OpenRouter API: + sourceNamespace: open-router-chat-completions-api + sourceRevisionDigest: sha256:9b410c8cfafe475dc6d9550f97a1e755b9a02b54513d3a85efe606e9bb05ca57 + sourceBlobDigest: sha256:61a2d897cc5ddd893a5131bfacad7fcc311fe5b2eaaa5641fbb0a5b3321bfde7 + tags: + - latest + - 1.0.0 targets: open-router: - source: -OAS + source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:f1b59b9b643de5e20d6e3299a8274783d8c0854615876f5d7f6f081814842695 - sourceBlobDigest: sha256:ee1f2422281b3ed5b38951c74636ad192c9bb160f216069c1f7931ccc4e52553 + sourceRevisionDigest: sha256:9b410c8cfafe475dc6d9550f97a1e755b9a02b54513d3a85efe606e9bb05ca57 + sourceBlobDigest: sha256:61a2d897cc5ddd893a5131bfacad7fcc311fe5b2eaaa5641fbb0a5b3321bfde7 workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.666.0 sources: - -OAS: + OpenRouter API: inputs: - - location: registry.speakeasyapi.dev/openrouter/sdk/open-router-chat-completions-api:main + - location: .speakeasy/in.openapi.yaml overlays: - location: .speakeasy/overlays/open-enums.overlay.yaml - location: .speakeasy/overlays/remove-rss-responses.overlay.yaml - location: .speakeasy/overlays/add-headers.overlay.yaml output: .speakeasy/out.openapi.yaml registry: - location: registry.speakeasyapi.dev/openrouter/sdk/-oas + location: registry.speakeasyapi.dev/openrouter/sdk/open-router-chat-completions-api targets: open-router: target: python - source: -OAS + source: OpenRouter API publish: pypi: token: $pypi_token diff --git a/.speakeasy/workflow.yaml b/.speakeasy/workflow.yaml index dce887d..89a9bc6 100644 --- a/.speakeasy/workflow.yaml +++ b/.speakeasy/workflow.yaml @@ -1,26 +1,26 @@ workflowVersion: 1.0.0 speakeasyVersion: 1.666.0 sources: - -OAS: + OpenRouter API: inputs: - - location: registry.speakeasyapi.dev/openrouter/sdk/open-router-chat-completions-api:main + - location: .speakeasy/in.openapi.yaml overlays: - location: .speakeasy/overlays/open-enums.overlay.yaml - location: .speakeasy/overlays/remove-rss-responses.overlay.yaml - location: .speakeasy/overlays/add-headers.overlay.yaml output: .speakeasy/out.openapi.yaml registry: - location: registry.speakeasyapi.dev/openrouter/sdk/-oas + location: registry.speakeasyapi.dev/openrouter/sdk/open-router-chat-completions-api targets: open-router: target: python - source: -OAS + source: OpenRouter API publish: pypi: token: $pypi_token codeSamples: registry: - location: registry.speakeasyapi.dev/openrouter/sdk/-oas-python-code-samples + location: registry.speakeasyapi.dev/openrouter/sdk/open-router-python-code-samples labelOverride: fixedValue: Python (SDK) blocking: false diff --git a/USAGE.md b/USAGE.md index 6d76a30..77a937c 100644 --- a/USAGE.md +++ b/USAGE.md @@ -9,7 +9,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.beta.responses.send(stream=False) + res = open_router.beta.responses.send(service_tier="auto", stream=False) with res as event_stream: for event in event_stream: @@ -33,7 +33,7 @@ async def main(): api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = await open_router.beta.responses.send_async(stream=False) + res = await open_router.beta.responses.send_async(service_tier="auto", stream=False) async with res as event_stream: async for event in event_stream: diff --git a/docs/components/chatgenerationparams.md b/docs/components/chatgenerationparams.md index 238044f..41db71b 100644 --- a/docs/components/chatgenerationparams.md +++ b/docs/components/chatgenerationparams.md @@ -26,4 +26,5 @@ | `tool_choice` | *Optional[Any]* | :heavy_minus_sign: | N/A | | `tools` | List[[components.ToolDefinitionJSON](../components/tooldefinitionjson.md)] | :heavy_minus_sign: | N/A | | `top_p` | *OptionalNullable[float]* | :heavy_minus_sign: | N/A | -| `user` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file +| `user` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `debug` | [Optional[components.Debug]](../components/debug.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitem.md b/docs/components/chatmessagecontentitem.md index 2ac5390..7063cdb 100644 --- a/docs/components/chatmessagecontentitem.md +++ b/docs/components/chatmessagecontentitem.md @@ -33,9 +33,3 @@ value: components.ChatMessageContentItemVideo = /* values here */ value: components.ChatMessageContentItemVideo = /* values here */ ``` -### `components.ChatMessageContentItemFile` - -```python -value: components.ChatMessageContentItemFile = /* values here */ -``` - diff --git a/docs/components/chatmessagecontentitemaudioformat.md b/docs/components/chatmessagecontentitemaudioformat.md deleted file mode 100644 index 97119c0..0000000 --- a/docs/components/chatmessagecontentitemaudioformat.md +++ /dev/null @@ -1,14 +0,0 @@ -# ChatMessageContentItemAudioFormat - - -## Values - -| Name | Value | -| ------- | ------- | -| `WAV` | wav | -| `MP3` | mp3 | -| `FLAC` | flac | -| `M4A` | m4a | -| `OGG` | ogg | -| `PCM16` | pcm16 | -| `PCM24` | pcm24 | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemaudioinputaudio.md b/docs/components/chatmessagecontentitemaudioinputaudio.md index 3665698..f7a62b5 100644 --- a/docs/components/chatmessagecontentitemaudioinputaudio.md +++ b/docs/components/chatmessagecontentitemaudioinputaudio.md @@ -3,7 +3,7 @@ ## Fields -| Field | Type | Required | Description | -| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -| `data` | *str* | :heavy_check_mark: | N/A | -| `format_` | [components.ChatMessageContentItemAudioFormat](../components/chatmessagecontentitemaudioformat.md) | :heavy_check_mark: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `data` | *str* | :heavy_check_mark: | N/A | +| `format_` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemcachecontrol.md b/docs/components/chatmessagecontentitemcachecontrol.md new file mode 100644 index 0000000..2ad30d0 --- /dev/null +++ b/docs/components/chatmessagecontentitemcachecontrol.md @@ -0,0 +1,9 @@ +# ChatMessageContentItemCacheControl + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | +| `type` | *Literal["ephemeral"]* | :heavy_check_mark: | N/A | +| `ttl` | [Optional[components.TTL]](../components/ttl.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemfile.md b/docs/components/chatmessagecontentitemfile.md deleted file mode 100644 index ca73897..0000000 --- a/docs/components/chatmessagecontentitemfile.md +++ /dev/null @@ -1,9 +0,0 @@ -# ChatMessageContentItemFile - - -## Fields - -| Field | Type | Required | Description | -| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | -| `type` | *Literal["file"]* | :heavy_check_mark: | N/A | -| `file` | [components.File](../components/file.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemtext.md b/docs/components/chatmessagecontentitemtext.md index 4fa8b7b..4f8a874 100644 --- a/docs/components/chatmessagecontentitemtext.md +++ b/docs/components/chatmessagecontentitemtext.md @@ -3,7 +3,8 @@ ## Fields -| Field | Type | Required | Description | -| ------------------ | ------------------ | ------------------ | ------------------ | -| `type` | *Literal["text"]* | :heavy_check_mark: | N/A | -| `text` | *str* | :heavy_check_mark: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | +| `type` | *Literal["text"]* | :heavy_check_mark: | N/A | +| `text` | *str* | :heavy_check_mark: | N/A | +| `cache_control` | [Optional[components.ChatMessageContentItemCacheControl]](../components/chatmessagecontentitemcachecontrol.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemvideoinputvideo.md b/docs/components/chatmessagecontentitemvideoinputvideo.md index da28cf1..4d7dd0e 100644 --- a/docs/components/chatmessagecontentitemvideoinputvideo.md +++ b/docs/components/chatmessagecontentitemvideoinputvideo.md @@ -3,7 +3,7 @@ ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | ------------------------------------------------ | -| `type` | *Literal["input_video"]* | :heavy_check_mark: | N/A | -| `video_url` | [components.VideoURL](../components/videourl.md) | :heavy_check_mark: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | +| `type` | *Literal["input_video"]* | :heavy_check_mark: | N/A | +| `video_url` | [components.VideoURL1](../components/videourl1.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/chatmessagecontentitemvideovideourl.md b/docs/components/chatmessagecontentitemvideovideourl.md index 023d696..0585b55 100644 --- a/docs/components/chatmessagecontentitemvideovideourl.md +++ b/docs/components/chatmessagecontentitemvideovideourl.md @@ -3,7 +3,7 @@ ## Fields -| Field | Type | Required | Description | -| ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | -| `type` | *Literal["video_url"]* | :heavy_check_mark: | N/A | -| `video_url` | [components.ChatMessageContentItemVideoVideoURLVideoURL](../components/chatmessagecontentitemvideovideourlvideourl.md) | :heavy_check_mark: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | -------------------------------------------------- | +| `type` | *Literal["video_url"]* | :heavy_check_mark: | N/A | +| `video_url` | [components.VideoURL2](../components/videourl2.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/completionchoice.md b/docs/components/completionchoice.md index 758eea9..cb489be 100644 --- a/docs/components/completionchoice.md +++ b/docs/components/completionchoice.md @@ -8,4 +8,6 @@ | `text` | *str* | :heavy_check_mark: | N/A | | `index` | *float* | :heavy_check_mark: | N/A | | `logprobs` | [Nullable[components.CompletionLogprobs]](../components/completionlogprobs.md) | :heavy_check_mark: | N/A | -| `finish_reason` | [Nullable[components.CompletionFinishReason]](../components/completionfinishreason.md) | :heavy_check_mark: | N/A | \ No newline at end of file +| `finish_reason` | [Nullable[components.CompletionFinishReason]](../components/completionfinishreason.md) | :heavy_check_mark: | N/A | +| `native_finish_reason` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `reasoning` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/completionresponse.md b/docs/components/completionresponse.md index 404f19d..3e9a9bd 100644 --- a/docs/components/completionresponse.md +++ b/docs/components/completionresponse.md @@ -9,6 +9,7 @@ | `object` | *Literal["text_completion"]* | :heavy_check_mark: | N/A | | `created` | *float* | :heavy_check_mark: | N/A | | `model` | *str* | :heavy_check_mark: | N/A | +| `provider` | *Optional[str]* | :heavy_minus_sign: | N/A | | `system_fingerprint` | *Optional[str]* | :heavy_minus_sign: | N/A | | `choices` | List[[components.CompletionChoice](../components/completionchoice.md)] | :heavy_check_mark: | N/A | | `usage` | [Optional[components.CompletionUsage]](../components/completionusage.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/debug.md b/docs/components/debug.md new file mode 100644 index 0000000..459bb4b --- /dev/null +++ b/docs/components/debug.md @@ -0,0 +1,8 @@ +# Debug + + +## Fields + +| Field | Type | Required | Description | +| -------------------- | -------------------- | -------------------- | -------------------- | +| `echo_upstream_body` | *Optional[bool]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/file.md b/docs/components/file.md deleted file mode 100644 index d5b3937..0000000 --- a/docs/components/file.md +++ /dev/null @@ -1,10 +0,0 @@ -# File - - -## Fields - -| Field | Type | Required | Description | -| ------------------ | ------------------ | ------------------ | ------------------ | -| `file_data` | *str* | :heavy_check_mark: | N/A | -| `file_id` | *Optional[str]* | :heavy_minus_sign: | N/A | -| `filename` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/components/idresponsehealing.md b/docs/components/idresponsehealing.md new file mode 100644 index 0000000..4a12790 --- /dev/null +++ b/docs/components/idresponsehealing.md @@ -0,0 +1,8 @@ +# IDResponseHealing + + +## Values + +| Name | Value | +| ------------------ | ------------------ | +| `RESPONSE_HEALING` | response-healing | \ No newline at end of file diff --git a/docs/components/openresponsesrequest.md b/docs/components/openresponsesrequest.md index fcc6420..e96cb5a 100644 --- a/docs/components/openresponsesrequest.md +++ b/docs/components/openresponsesrequest.md @@ -27,10 +27,11 @@ Request schema for Responses endpoint | `include` | List[[components.OpenAIResponsesIncludable](../components/openairesponsesincludable.md)] | :heavy_minus_sign: | N/A | | | `background` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | | | `safety_identifier` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | | -| `store` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | | -| `service_tier` | [OptionalNullable[components.ServiceTier]](../components/servicetier.md) | :heavy_minus_sign: | N/A | auto | +| `store` | *Optional[Literal[False]]* | :heavy_minus_sign: | N/A | | +| `service_tier` | [Optional[components.ServiceTier]](../components/servicetier.md) | :heavy_minus_sign: | N/A | | | `truncation` | [OptionalNullable[components.Truncation]](../components/truncation.md) | :heavy_minus_sign: | N/A | auto | | `stream` | *Optional[bool]* | :heavy_minus_sign: | N/A | | | `provider` | [OptionalNullable[components.Provider]](../components/provider.md) | :heavy_minus_sign: | When multiple model providers are available, optionally indicate your routing preference. | | | `plugins` | List[[components.Plugin](../components/plugin.md)] | :heavy_minus_sign: | Plugins you want to enable for this request, including their settings. | | -| `user` | *Optional[str]* | :heavy_minus_sign: | A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters. | | \ No newline at end of file +| `user` | *Optional[str]* | :heavy_minus_sign: | A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters. | | +| `session_id` | *Optional[str]* | :heavy_minus_sign: | A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters. | | \ No newline at end of file diff --git a/docs/components/plugin.md b/docs/components/plugin.md index 7f6e744..bc21cd4 100644 --- a/docs/components/plugin.md +++ b/docs/components/plugin.md @@ -21,3 +21,9 @@ value: components.PluginWeb = /* values here */ value: components.PluginFileParser = /* values here */ ``` +### `components.PluginResponseHealing` + +```python +value: components.PluginResponseHealing = /* values here */ +``` + diff --git a/docs/components/pluginresponsehealing.md b/docs/components/pluginresponsehealing.md new file mode 100644 index 0000000..ecee55d --- /dev/null +++ b/docs/components/pluginresponsehealing.md @@ -0,0 +1,8 @@ +# PluginResponseHealing + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------ | +| `id` | [components.IDResponseHealing](../components/idresponsehealing.md) | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/components/providername.md b/docs/components/providername.md index 9c86cd3..2bc3f88 100644 --- a/docs/components/providername.md +++ b/docs/components/providername.md @@ -9,12 +9,14 @@ | `AION_LABS` | AionLabs | | `ALIBABA` | Alibaba | | `AMAZON_BEDROCK` | Amazon Bedrock | +| `AMAZON_NOVA` | Amazon Nova | | `ANTHROPIC` | Anthropic | -| `ARCEE` | Arcee | +| `ARCEE_AI` | Arcee AI | | `ATLAS_CLOUD` | AtlasCloud | | `AVIAN` | Avian | | `AZURE` | Azure | | `BASE_TEN` | BaseTen | +| `BYTE_PLUS` | BytePlus | | `BLACK_FOREST_LABS` | Black Forest Labs | | `CEREBRAS` | Cerebras | | `CHUTES` | Chutes | @@ -29,6 +31,7 @@ | `FIREWORKS` | Fireworks | | `FRIENDLI` | Friendli | | `GMI_CLOUD` | GMICloud | +| `GO_POMELO` | GoPomelo | | `GOOGLE` | Google | | `GOOGLE_AI_STUDIO` | Google AI Studio | | `GROQ` | Groq | @@ -58,7 +61,9 @@ | `RELACE` | Relace | | `SAMBA_NOVA` | SambaNova | | `SILICON_FLOW` | SiliconFlow | +| `SOURCEFUL` | Sourceful | | `STEALTH` | Stealth | +| `STREAM_LAKE` | StreamLake | | `SWITCHPOINT` | Switchpoint | | `TARGON` | Targon | | `TOGETHER` | Together | diff --git a/docs/components/servicetier.md b/docs/components/servicetier.md index 3a7a020..bfc6187 100644 --- a/docs/components/servicetier.md +++ b/docs/components/servicetier.md @@ -3,10 +3,6 @@ ## Values -| Name | Value | -| ---------- | ---------- | -| `AUTO` | auto | -| `DEFAULT` | default | -| `FLEX` | flex | -| `PRIORITY` | priority | -| `SCALE` | scale | \ No newline at end of file +| Name | Value | +| ------ | ------ | +| `AUTO` | auto | \ No newline at end of file diff --git a/docs/components/ttl.md b/docs/components/ttl.md new file mode 100644 index 0000000..0cbc7f3 --- /dev/null +++ b/docs/components/ttl.md @@ -0,0 +1,9 @@ +# TTL + + +## Values + +| Name | Value | +| ------- | ------- | +| `FIVEM` | 5m | +| `ONEH` | 1h | \ No newline at end of file diff --git a/docs/components/videourl.md b/docs/components/videourl1.md similarity index 95% rename from docs/components/videourl.md rename to docs/components/videourl1.md index 5bd5dec..505c186 100644 --- a/docs/components/videourl.md +++ b/docs/components/videourl1.md @@ -1,4 +1,4 @@ -# VideoURL +# VideoURL1 ## Fields diff --git a/docs/components/chatmessagecontentitemvideovideourlvideourl.md b/docs/components/videourl2.md similarity index 85% rename from docs/components/chatmessagecontentitemvideovideourlvideourl.md rename to docs/components/videourl2.md index ee08920..b7f2463 100644 --- a/docs/components/chatmessagecontentitemvideovideourlvideourl.md +++ b/docs/components/videourl2.md @@ -1,4 +1,4 @@ -# ChatMessageContentItemVideoVideoURLVideoURL +# VideoURL2 ## Fields diff --git a/docs/operations/getcreditsdata.md b/docs/operations/getcreditsdata.md new file mode 100644 index 0000000..9ba4582 --- /dev/null +++ b/docs/operations/getcreditsdata.md @@ -0,0 +1,9 @@ +# GetCreditsData + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------- | ----------------------- | ----------------------- | ----------------------- | ----------------------- | +| `total_credits` | *float* | :heavy_check_mark: | Total credits purchased | 100.5 | +| `total_usage` | *float* | :heavy_check_mark: | Total credits used | 25.75 | \ No newline at end of file diff --git a/docs/operations/getcreditsresponse.md b/docs/operations/getcreditsresponse.md index c52bc01..a58a336 100644 --- a/docs/operations/getcreditsresponse.md +++ b/docs/operations/getcreditsresponse.md @@ -5,5 +5,6 @@ Total credits purchased and used ## Fields -| Field | Type | Required | Description | -| ----------- | ----------- | ----------- | ----------- | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| `data` | [operations.GetCreditsData](../operations/getcreditsdata.md) | :heavy_check_mark: | N/A | {
"total_credits": 100.5,
"total_usage": 25.75
} | \ No newline at end of file diff --git a/docs/operations/getparametersprovider.md b/docs/operations/getparametersprovider.md index 21a0244..229f9ad 100644 --- a/docs/operations/getparametersprovider.md +++ b/docs/operations/getparametersprovider.md @@ -9,12 +9,14 @@ | `AION_LABS` | AionLabs | | `ALIBABA` | Alibaba | | `AMAZON_BEDROCK` | Amazon Bedrock | +| `AMAZON_NOVA` | Amazon Nova | | `ANTHROPIC` | Anthropic | -| `ARCEE` | Arcee | +| `ARCEE_AI` | Arcee AI | | `ATLAS_CLOUD` | AtlasCloud | | `AVIAN` | Avian | | `AZURE` | Azure | | `BASE_TEN` | BaseTen | +| `BYTE_PLUS` | BytePlus | | `BLACK_FOREST_LABS` | Black Forest Labs | | `CEREBRAS` | Cerebras | | `CHUTES` | Chutes | @@ -29,6 +31,7 @@ | `FIREWORKS` | Fireworks | | `FRIENDLI` | Friendli | | `GMI_CLOUD` | GMICloud | +| `GO_POMELO` | GoPomelo | | `GOOGLE` | Google | | `GOOGLE_AI_STUDIO` | Google AI Studio | | `GROQ` | Groq | @@ -58,7 +61,9 @@ | `RELACE` | Relace | | `SAMBA_NOVA` | SambaNova | | `SILICON_FLOW` | SiliconFlow | +| `SOURCEFUL` | Sourceful | | `STEALTH` | Stealth | +| `STREAM_LAKE` | StreamLake | | `SWITCHPOINT` | Switchpoint | | `TARGON` | Targon | | `TOGETHER` | Together | diff --git a/docs/sdks/chat/README.md b/docs/sdks/chat/README.md index 94ffd97..78c3a29 100644 --- a/docs/sdks/chat/README.md +++ b/docs/sdks/chat/README.md @@ -58,6 +58,7 @@ with OpenRouter( | `tools` | List[[components.ToolDefinitionJSON](../../components/tooldefinitionjson.md)] | :heavy_minus_sign: | N/A | | `top_p` | *OptionalNullable[float]* | :heavy_minus_sign: | N/A | | `user` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `debug` | [Optional[components.Debug]](../../components/debug.md) | :heavy_minus_sign: | N/A | | `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | ### Response diff --git a/docs/sdks/responses/README.md b/docs/sdks/responses/README.md index 4918bce..eb492c5 100644 --- a/docs/sdks/responses/README.md +++ b/docs/sdks/responses/README.md @@ -25,7 +25,7 @@ with OpenRouter( api_key=os.getenv("OPENROUTER_API_KEY", ""), ) as open_router: - res = open_router.beta.responses.send(stream=False) + res = open_router.beta.responses.send(service_tier="auto", stream=False) with res as event_stream: for event in event_stream: @@ -58,13 +58,13 @@ with OpenRouter( | `include` | List[[components.OpenAIResponsesIncludable](../../components/openairesponsesincludable.md)] | :heavy_minus_sign: | N/A | | | `background` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | | | `safety_identifier` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | | -| `store` | *OptionalNullable[bool]* | :heavy_minus_sign: | N/A | | -| `service_tier` | [OptionalNullable[components.ServiceTier]](../../components/servicetier.md) | :heavy_minus_sign: | N/A | auto | +| `service_tier` | [Optional[components.ServiceTier]](../../components/servicetier.md) | :heavy_minus_sign: | N/A | | | `truncation` | [OptionalNullable[components.Truncation]](../../components/truncation.md) | :heavy_minus_sign: | N/A | auto | | `stream` | *Optional[bool]* | :heavy_minus_sign: | N/A | | | `provider` | [OptionalNullable[components.Provider]](../../components/provider.md) | :heavy_minus_sign: | When multiple model providers are available, optionally indicate your routing preference. | | | `plugins` | List[[components.Plugin](../../components/plugin.md)] | :heavy_minus_sign: | Plugins you want to enable for this request, including their settings. | | | `user` | *Optional[str]* | :heavy_minus_sign: | A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters. | | +| `session_id` | *Optional[str]* | :heavy_minus_sign: | A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters. | | | `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response diff --git a/pyproject.toml b/pyproject.toml index 0bca6bd..75da078 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrouter" -version = "0.0.16" +version = "0.0.21" description = "Official Python Client SDK for OpenRouter." authors = [{ name = "OpenRouter" },] readme = "README-PYPI.md" diff --git a/src/openrouter/_version.py b/src/openrouter/_version.py index af0bab6..fa74707 100644 --- a/src/openrouter/_version.py +++ b/src/openrouter/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "openrouter" -__version__: str = "0.0.16" +__version__: str = "0.0.21" __openapi_doc_version__: str = "1.0.0" __gen_version__: str = "2.768.0" -__user_agent__: str = "speakeasy-sdk/python 0.0.16 2.768.0 1.0.0 openrouter" +__user_agent__: str = "speakeasy-sdk/python 0.0.21 2.768.0 1.0.0 openrouter" try: if __package__ is not None: diff --git a/src/openrouter/chat.py b/src/openrouter/chat.py index 1587ae5..bc00143 100644 --- a/src/openrouter/chat.py +++ b/src/openrouter/chat.py @@ -61,6 +61,7 @@ def send( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, + debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -92,6 +93,7 @@ def send( :param tools: :param top_p: :param user: + :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -144,6 +146,7 @@ def send( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, + debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -175,6 +178,7 @@ def send( :param tools: :param top_p: :param user: + :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -226,6 +230,7 @@ def send( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, + debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -257,6 +262,7 @@ def send( :param tools: :param top_p: :param user: + :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -305,6 +311,7 @@ def send( ), top_p=top_p, user=user, + debug=utils.get_pydantic_model(debug, Optional[components.Debug]), ) req = self._build_request( @@ -439,6 +446,7 @@ async def send_async( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, + debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -470,6 +478,7 @@ async def send_async( :param tools: :param top_p: :param user: + :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -522,6 +531,7 @@ async def send_async( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, + debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -553,6 +563,7 @@ async def send_async( :param tools: :param top_p: :param user: + :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -604,6 +615,7 @@ async def send_async( ] = None, top_p: OptionalNullable[float] = UNSET, user: Optional[str] = None, + debug: Optional[Union[components.Debug, components.DebugTypedDict]] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -635,6 +647,7 @@ async def send_async( :param tools: :param top_p: :param user: + :param debug: :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -683,6 +696,7 @@ async def send_async( ), top_p=top_p, user=user, + debug=utils.get_pydantic_model(debug, Optional[components.Debug]), ) req = self._build_request_async( diff --git a/src/openrouter/components/__init__.py b/src/openrouter/components/__init__.py index 1554012..d7818e6 100644 --- a/src/openrouter/components/__init__.py +++ b/src/openrouter/components/__init__.py @@ -21,6 +21,7 @@ BadRequestResponseErrorData, BadRequestResponseErrorDataTypedDict, ) + from .chatcompletionfinishreason import ChatCompletionFinishReason from .chaterror import ChatErrorError, ChatErrorErrorTypedDict, Code, CodeTypedDict from .chatgenerationparams import ( ChatGenerationParams, @@ -35,6 +36,8 @@ ChatGenerationParamsStop, ChatGenerationParamsStopTypedDict, ChatGenerationParamsTypedDict, + Debug, + DebugTypedDict, Effort, Reasoning, ReasoningTypedDict, @@ -53,16 +56,14 @@ ) from .chatmessagecontentitemaudio import ( ChatMessageContentItemAudio, - ChatMessageContentItemAudioFormat, ChatMessageContentItemAudioInputAudio, ChatMessageContentItemAudioInputAudioTypedDict, ChatMessageContentItemAudioTypedDict, ) - from .chatmessagecontentitemfile import ( - ChatMessageContentItemFile, - ChatMessageContentItemFileTypedDict, - File, - FileTypedDict, + from .chatmessagecontentitemcachecontrol import ( + ChatMessageContentItemCacheControl, + ChatMessageContentItemCacheControlTypedDict, + TTL, ) from .chatmessagecontentitemimage import ( ChatMessageContentItemImage, @@ -82,8 +83,10 @@ ChatMessageContentItemVideoTypedDict, ChatMessageContentItemVideoVideoURL, ChatMessageContentItemVideoVideoURLTypedDict, - ChatMessageContentItemVideoVideoURLVideoURL, - ChatMessageContentItemVideoVideoURLVideoURLTypedDict, + VideoURL1, + VideoURL1TypedDict, + VideoURL2, + VideoURL2TypedDict, ) from .chatmessagetokenlogprob import ( ChatMessageTokenLogprob, @@ -102,13 +105,8 @@ ChatMessageToolCallTypedDict, ) from .chatresponse import ChatResponse, ChatResponseTypedDict - from .chatresponsechoice import ( - ChatCompletionFinishReason, - ChatResponseChoice, - ChatResponseChoiceTypedDict, - ChatStreamingChoice, - ChatStreamingChoiceTypedDict, - ) + from .chatresponsechoice import ChatResponseChoice, ChatResponseChoiceTypedDict + from .chatstreamingchoice import ChatStreamingChoice, ChatStreamingChoiceTypedDict from .chatstreamingmessagechunk import ( ChatStreamingMessageChunk, ChatStreamingMessageChunkRole, @@ -426,6 +424,7 @@ Engine, IDFileParser, IDModeration, + IDResponseHealing, IDWeb, Ignore, IgnoreTypedDict, @@ -450,6 +449,8 @@ PluginFileParserTypedDict, PluginModeration, PluginModerationTypedDict, + PluginResponseHealing, + PluginResponseHealingTypedDict, PluginTypedDict, PluginWeb, PluginWebTypedDict, @@ -784,7 +785,6 @@ UserMessageContentTypedDict, UserMessageTypedDict, ) - from .videourl import VideoURL, VideoURLTypedDict from .websearchpreviewtooluserlocation import ( WebSearchPreviewToolUserLocation, WebSearchPreviewToolUserLocationType, @@ -825,12 +825,11 @@ "ChatGenerationTokenUsageTypedDict", "ChatMessageContentItem", "ChatMessageContentItemAudio", - "ChatMessageContentItemAudioFormat", "ChatMessageContentItemAudioInputAudio", "ChatMessageContentItemAudioInputAudioTypedDict", "ChatMessageContentItemAudioTypedDict", - "ChatMessageContentItemFile", - "ChatMessageContentItemFileTypedDict", + "ChatMessageContentItemCacheControl", + "ChatMessageContentItemCacheControlTypedDict", "ChatMessageContentItemImage", "ChatMessageContentItemImageDetail", "ChatMessageContentItemImageTypedDict", @@ -843,8 +842,6 @@ "ChatMessageContentItemVideoTypedDict", "ChatMessageContentItemVideoVideoURL", "ChatMessageContentItemVideoVideoURLTypedDict", - "ChatMessageContentItemVideoVideoURLVideoURL", - "ChatMessageContentItemVideoVideoURLVideoURLTypedDict", "ChatMessageTokenLogprob", "ChatMessageTokenLogprobTypedDict", "ChatMessageTokenLogprobs", @@ -905,6 +902,8 @@ "CreateChargeRequest", "CreateChargeRequestTypedDict", "DataCollection", + "Debug", + "DebugTypedDict", "DefaultParameters", "DefaultParametersTypedDict", "EdgeNetworkTimeoutResponseErrorData", @@ -912,18 +911,17 @@ "Effort", "EndpointStatus", "Engine", - "File", "FileCitation", "FileCitationType", "FileCitationTypedDict", "FilePath", "FilePathType", "FilePathTypedDict", - "FileTypedDict", "ForbiddenResponseErrorData", "ForbiddenResponseErrorDataTypedDict", "IDFileParser", "IDModeration", + "IDResponseHealing", "IDWeb", "Ignore", "IgnoreTypedDict", @@ -1217,6 +1215,8 @@ "PluginFileParserTypedDict", "PluginModeration", "PluginModerationTypedDict", + "PluginResponseHealing", + "PluginResponseHealingTypedDict", "PluginTypedDict", "PluginWeb", "PluginWebTypedDict", @@ -1342,6 +1342,7 @@ "SystemMessageContent", "SystemMessageContentTypedDict", "SystemMessageTypedDict", + "TTL", "Tokenizer", "TooManyRequestsResponseErrorData", "TooManyRequestsResponseErrorDataTypedDict", @@ -1391,8 +1392,10 @@ "UserMessageTypedDict", "Variables", "VariablesTypedDict", - "VideoURL", - "VideoURLTypedDict", + "VideoURL1", + "VideoURL1TypedDict", + "VideoURL2", + "VideoURL2TypedDict", "WebSearchPreviewToolUserLocation", "WebSearchPreviewToolUserLocationType", "WebSearchPreviewToolUserLocationTypedDict", @@ -1410,6 +1413,7 @@ "BadGatewayResponseErrorDataTypedDict": ".badgatewayresponseerrordata", "BadRequestResponseErrorData": ".badrequestresponseerrordata", "BadRequestResponseErrorDataTypedDict": ".badrequestresponseerrordata", + "ChatCompletionFinishReason": ".chatcompletionfinishreason", "ChatErrorError": ".chaterror", "ChatErrorErrorTypedDict": ".chaterror", "Code": ".chaterror", @@ -1426,6 +1430,8 @@ "ChatGenerationParamsStop": ".chatgenerationparams", "ChatGenerationParamsStopTypedDict": ".chatgenerationparams", "ChatGenerationParamsTypedDict": ".chatgenerationparams", + "Debug": ".chatgenerationparams", + "DebugTypedDict": ".chatgenerationparams", "Effort": ".chatgenerationparams", "Reasoning": ".chatgenerationparams", "ReasoningTypedDict": ".chatgenerationparams", @@ -1438,14 +1444,12 @@ "ChatMessageContentItem": ".chatmessagecontentitem", "ChatMessageContentItemTypedDict": ".chatmessagecontentitem", "ChatMessageContentItemAudio": ".chatmessagecontentitemaudio", - "ChatMessageContentItemAudioFormat": ".chatmessagecontentitemaudio", "ChatMessageContentItemAudioInputAudio": ".chatmessagecontentitemaudio", "ChatMessageContentItemAudioInputAudioTypedDict": ".chatmessagecontentitemaudio", "ChatMessageContentItemAudioTypedDict": ".chatmessagecontentitemaudio", - "ChatMessageContentItemFile": ".chatmessagecontentitemfile", - "ChatMessageContentItemFileTypedDict": ".chatmessagecontentitemfile", - "File": ".chatmessagecontentitemfile", - "FileTypedDict": ".chatmessagecontentitemfile", + "ChatMessageContentItemCacheControl": ".chatmessagecontentitemcachecontrol", + "ChatMessageContentItemCacheControlTypedDict": ".chatmessagecontentitemcachecontrol", + "TTL": ".chatmessagecontentitemcachecontrol", "ChatMessageContentItemImage": ".chatmessagecontentitemimage", "ChatMessageContentItemImageDetail": ".chatmessagecontentitemimage", "ChatMessageContentItemImageTypedDict": ".chatmessagecontentitemimage", @@ -1459,8 +1463,10 @@ "ChatMessageContentItemVideoTypedDict": ".chatmessagecontentitemvideo", "ChatMessageContentItemVideoVideoURL": ".chatmessagecontentitemvideo", "ChatMessageContentItemVideoVideoURLTypedDict": ".chatmessagecontentitemvideo", - "ChatMessageContentItemVideoVideoURLVideoURL": ".chatmessagecontentitemvideo", - "ChatMessageContentItemVideoVideoURLVideoURLTypedDict": ".chatmessagecontentitemvideo", + "VideoURL1": ".chatmessagecontentitemvideo", + "VideoURL1TypedDict": ".chatmessagecontentitemvideo", + "VideoURL2": ".chatmessagecontentitemvideo", + "VideoURL2TypedDict": ".chatmessagecontentitemvideo", "ChatMessageTokenLogprob": ".chatmessagetokenlogprob", "ChatMessageTokenLogprobTypedDict": ".chatmessagetokenlogprob", "TopLogprob": ".chatmessagetokenlogprob", @@ -1473,11 +1479,10 @@ "ChatMessageToolCallTypedDict": ".chatmessagetoolcall", "ChatResponse": ".chatresponse", "ChatResponseTypedDict": ".chatresponse", - "ChatCompletionFinishReason": ".chatresponsechoice", "ChatResponseChoice": ".chatresponsechoice", "ChatResponseChoiceTypedDict": ".chatresponsechoice", - "ChatStreamingChoice": ".chatresponsechoice", - "ChatStreamingChoiceTypedDict": ".chatresponsechoice", + "ChatStreamingChoice": ".chatstreamingchoice", + "ChatStreamingChoiceTypedDict": ".chatstreamingchoice", "ChatStreamingMessageChunk": ".chatstreamingmessagechunk", "ChatStreamingMessageChunkRole": ".chatstreamingmessagechunk", "ChatStreamingMessageChunkTypedDict": ".chatstreamingmessagechunk", @@ -1724,6 +1729,7 @@ "Engine": ".openresponsesrequest", "IDFileParser": ".openresponsesrequest", "IDModeration": ".openresponsesrequest", + "IDResponseHealing": ".openresponsesrequest", "IDWeb": ".openresponsesrequest", "Ignore": ".openresponsesrequest", "IgnoreTypedDict": ".openresponsesrequest", @@ -1748,6 +1754,8 @@ "PluginFileParserTypedDict": ".openresponsesrequest", "PluginModeration": ".openresponsesrequest", "PluginModerationTypedDict": ".openresponsesrequest", + "PluginResponseHealing": ".openresponsesrequest", + "PluginResponseHealingTypedDict": ".openresponsesrequest", "PluginTypedDict": ".openresponsesrequest", "PluginWeb": ".openresponsesrequest", "PluginWebTypedDict": ".openresponsesrequest", @@ -1998,8 +2006,6 @@ "UserMessageContent": ".usermessage", "UserMessageContentTypedDict": ".usermessage", "UserMessageTypedDict": ".usermessage", - "VideoURL": ".videourl", - "VideoURLTypedDict": ".videourl", "WebSearchPreviewToolUserLocation": ".websearchpreviewtooluserlocation", "WebSearchPreviewToolUserLocationType": ".websearchpreviewtooluserlocation", "WebSearchPreviewToolUserLocationTypedDict": ".websearchpreviewtooluserlocation", diff --git a/src/openrouter/components/chatcompletionfinishreason.py b/src/openrouter/components/chatcompletionfinishreason.py new file mode 100644 index 0000000..686462c --- /dev/null +++ b/src/openrouter/components/chatcompletionfinishreason.py @@ -0,0 +1,17 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import UnrecognizedStr +from typing import Literal, Union + + +ChatCompletionFinishReason = Union[ + Literal[ + "tool_calls", + "stop", + "length", + "content_filter", + "error", + ], + UnrecognizedStr, +] diff --git a/src/openrouter/components/chatgenerationparams.py b/src/openrouter/components/chatgenerationparams.py index 2b9b05c..07b4c33 100644 --- a/src/openrouter/components/chatgenerationparams.py +++ b/src/openrouter/components/chatgenerationparams.py @@ -156,6 +156,14 @@ class ChatGenerationParamsResponseFormatText(BaseModel): ) +class DebugTypedDict(TypedDict): + echo_upstream_body: NotRequired[bool] + + +class Debug(BaseModel): + echo_upstream_body: Optional[bool] = None + + class ChatGenerationParamsTypedDict(TypedDict): messages: List[MessageTypedDict] model: NotRequired[str] @@ -179,6 +187,7 @@ class ChatGenerationParamsTypedDict(TypedDict): tools: NotRequired[List[ToolDefinitionJSONTypedDict]] top_p: NotRequired[Nullable[float]] user: NotRequired[str] + debug: NotRequired[DebugTypedDict] class ChatGenerationParams(BaseModel): @@ -226,6 +235,8 @@ class ChatGenerationParams(BaseModel): user: Optional[str] = None + debug: Optional[Debug] = None + @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = [ @@ -250,6 +261,7 @@ def serialize_model(self, handler): "tools", "top_p", "user", + "debug", ] nullable_fields = [ "frequency_penalty", diff --git a/src/openrouter/components/chatmessagecontentitem.py b/src/openrouter/components/chatmessagecontentitem.py index 6d949b9..eba0a3b 100644 --- a/src/openrouter/components/chatmessagecontentitem.py +++ b/src/openrouter/components/chatmessagecontentitem.py @@ -5,10 +5,6 @@ ChatMessageContentItemAudio, ChatMessageContentItemAudioTypedDict, ) -from .chatmessagecontentitemfile import ( - ChatMessageContentItemFile, - ChatMessageContentItemFileTypedDict, -) from .chatmessagecontentitemimage import ( ChatMessageContentItemImage, ChatMessageContentItemImageTypedDict, @@ -30,10 +26,9 @@ ChatMessageContentItemTypedDict = TypeAliasType( "ChatMessageContentItemTypedDict", Union[ - ChatMessageContentItemTextTypedDict, ChatMessageContentItemImageTypedDict, ChatMessageContentItemAudioTypedDict, - ChatMessageContentItemFileTypedDict, + ChatMessageContentItemTextTypedDict, ChatMessageContentItemVideoTypedDict, ], ) @@ -46,7 +41,6 @@ Annotated[ChatMessageContentItemAudio, Tag("input_audio")], Annotated[ChatMessageContentItemVideo, Tag("input_video")], Annotated[ChatMessageContentItemVideo, Tag("video_url")], - Annotated[ChatMessageContentItemFile, Tag("file")], ], Discriminator(lambda m: get_discriminator(m, "type", "type")), ] diff --git a/src/openrouter/components/chatmessagecontentitemaudio.py b/src/openrouter/components/chatmessagecontentitemaudio.py index 21a8803..b251803 100644 --- a/src/openrouter/components/chatmessagecontentitemaudio.py +++ b/src/openrouter/components/chatmessagecontentitemaudio.py @@ -1,42 +1,23 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from openrouter.types import BaseModel, UnrecognizedStr -from openrouter.utils import validate_const, validate_open_enum +from openrouter.types import BaseModel +from openrouter.utils import validate_const import pydantic -from pydantic.functional_validators import AfterValidator, PlainValidator -from typing import Literal, Union +from pydantic.functional_validators import AfterValidator +from typing import Literal from typing_extensions import Annotated, TypedDict -ChatMessageContentItemAudioFormat = Union[ - Literal[ - "wav", - "mp3", - "flac", - "m4a", - "ogg", - "pcm16", - "pcm24", - ], - UnrecognizedStr, -] - - class ChatMessageContentItemAudioInputAudioTypedDict(TypedDict): data: str - format_: ChatMessageContentItemAudioFormat + format_: str class ChatMessageContentItemAudioInputAudio(BaseModel): data: str - format_: Annotated[ - Annotated[ - ChatMessageContentItemAudioFormat, PlainValidator(validate_open_enum(False)) - ], - pydantic.Field(alias="format"), - ] + format_: Annotated[str, pydantic.Field(alias="format")] class ChatMessageContentItemAudioTypedDict(TypedDict): diff --git a/src/openrouter/components/chatmessagecontentitemcachecontrol.py b/src/openrouter/components/chatmessagecontentitemcachecontrol.py new file mode 100644 index 0000000..b96625f --- /dev/null +++ b/src/openrouter/components/chatmessagecontentitemcachecontrol.py @@ -0,0 +1,32 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, UnrecognizedStr +from openrouter.utils import validate_const, validate_open_enum +import pydantic +from pydantic.functional_validators import AfterValidator, PlainValidator +from typing import Literal, Optional, Union +from typing_extensions import Annotated, NotRequired, TypedDict + + +TTL = Union[ + Literal[ + "5m", + "1h", + ], + UnrecognizedStr, +] + + +class ChatMessageContentItemCacheControlTypedDict(TypedDict): + type: Literal["ephemeral"] + ttl: NotRequired[TTL] + + +class ChatMessageContentItemCacheControl(BaseModel): + TYPE: Annotated[ + Annotated[Literal["ephemeral"], AfterValidator(validate_const("ephemeral"))], + pydantic.Field(alias="type"), + ] = "ephemeral" + + ttl: Annotated[Optional[TTL], PlainValidator(validate_open_enum(False))] = None diff --git a/src/openrouter/components/chatmessagecontentitemfile.py b/src/openrouter/components/chatmessagecontentitemfile.py deleted file mode 100644 index f878dc3..0000000 --- a/src/openrouter/components/chatmessagecontentitemfile.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" - -from __future__ import annotations -from openrouter.types import BaseModel -from openrouter.utils import validate_const -import pydantic -from pydantic.functional_validators import AfterValidator -from typing import Literal, Optional -from typing_extensions import Annotated, NotRequired, TypedDict - - -class FileTypedDict(TypedDict): - file_data: str - file_id: NotRequired[str] - filename: NotRequired[str] - - -class File(BaseModel): - file_data: str - - file_id: Optional[str] = None - - filename: Optional[str] = None - - -class ChatMessageContentItemFileTypedDict(TypedDict): - file: FileTypedDict - type: Literal["file"] - - -class ChatMessageContentItemFile(BaseModel): - file: File - - TYPE: Annotated[ - Annotated[Literal["file"], AfterValidator(validate_const("file"))], - pydantic.Field(alias="type"), - ] = "file" diff --git a/src/openrouter/components/chatmessagecontentitemtext.py b/src/openrouter/components/chatmessagecontentitemtext.py index c791fa9..4dc1662 100644 --- a/src/openrouter/components/chatmessagecontentitemtext.py +++ b/src/openrouter/components/chatmessagecontentitemtext.py @@ -1,17 +1,22 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations +from .chatmessagecontentitemcachecontrol import ( + ChatMessageContentItemCacheControl, + ChatMessageContentItemCacheControlTypedDict, +) from openrouter.types import BaseModel from openrouter.utils import validate_const import pydantic from pydantic.functional_validators import AfterValidator -from typing import Literal -from typing_extensions import Annotated, TypedDict +from typing import Literal, Optional +from typing_extensions import Annotated, NotRequired, TypedDict class ChatMessageContentItemTextTypedDict(TypedDict): text: str type: Literal["text"] + cache_control: NotRequired[ChatMessageContentItemCacheControlTypedDict] class ChatMessageContentItemText(BaseModel): @@ -21,3 +26,5 @@ class ChatMessageContentItemText(BaseModel): Annotated[Literal["text"], AfterValidator(validate_const("text"))], pydantic.Field(alias="type"), ] = "text" + + cache_control: Optional[ChatMessageContentItemCacheControl] = None diff --git a/src/openrouter/components/chatmessagecontentitemvideo.py b/src/openrouter/components/chatmessagecontentitemvideo.py index 553d826..06be297 100644 --- a/src/openrouter/components/chatmessagecontentitemvideo.py +++ b/src/openrouter/components/chatmessagecontentitemvideo.py @@ -1,7 +1,6 @@ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from __future__ import annotations -from .videourl import VideoURL, VideoURLTypedDict from openrouter.types import BaseModel from openrouter.utils import get_discriminator, validate_const import pydantic @@ -11,21 +10,21 @@ from typing_extensions import Annotated, TypeAliasType, TypedDict -class ChatMessageContentItemVideoVideoURLVideoURLTypedDict(TypedDict): +class VideoURL2TypedDict(TypedDict): url: str -class ChatMessageContentItemVideoVideoURLVideoURL(BaseModel): +class VideoURL2(BaseModel): url: str class ChatMessageContentItemVideoVideoURLTypedDict(TypedDict): - video_url: ChatMessageContentItemVideoVideoURLVideoURLTypedDict + video_url: VideoURL2TypedDict type: Literal["video_url"] class ChatMessageContentItemVideoVideoURL(BaseModel): - video_url: ChatMessageContentItemVideoVideoURLVideoURL + video_url: VideoURL2 TYPE: Annotated[ Annotated[Literal["video_url"], AfterValidator(validate_const("video_url"))], @@ -33,13 +32,21 @@ class ChatMessageContentItemVideoVideoURL(BaseModel): ] = "video_url" +class VideoURL1TypedDict(TypedDict): + url: str + + +class VideoURL1(BaseModel): + url: str + + class ChatMessageContentItemVideoInputVideoTypedDict(TypedDict): - video_url: VideoURLTypedDict + video_url: VideoURL1TypedDict type: Literal["input_video"] class ChatMessageContentItemVideoInputVideo(BaseModel): - video_url: VideoURL + video_url: VideoURL1 TYPE: Annotated[ Annotated[ diff --git a/src/openrouter/components/chatresponsechoice.py b/src/openrouter/components/chatresponsechoice.py index e59f847..9592bf1 100644 --- a/src/openrouter/components/chatresponsechoice.py +++ b/src/openrouter/components/chatresponsechoice.py @@ -2,41 +2,24 @@ from __future__ import annotations from .assistantmessage import AssistantMessage, AssistantMessageTypedDict +from .chatcompletionfinishreason import ChatCompletionFinishReason from .chatmessagetokenlogprobs import ( ChatMessageTokenLogprobs, ChatMessageTokenLogprobsTypedDict, ) -from .chatstreamingmessagechunk import ( - ChatStreamingMessageChunk, - ChatStreamingMessageChunkTypedDict, -) from openrouter.types import ( BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL, - UnrecognizedStr, ) from openrouter.utils import validate_open_enum from pydantic import model_serializer from pydantic.functional_validators import PlainValidator -from typing import Literal, Union from typing_extensions import Annotated, NotRequired, TypedDict -ChatCompletionFinishReason = Union[ - Literal[ - "tool_calls", - "stop", - "length", - "content_filter", - "error", - ], - UnrecognizedStr, -] - - class ChatResponseChoiceTypedDict(TypedDict): finish_reason: Nullable[ChatCompletionFinishReason] index: float @@ -84,52 +67,3 @@ def serialize_model(self, handler): m[k] = val return m - - -class ChatStreamingChoiceTypedDict(TypedDict): - delta: ChatStreamingMessageChunkTypedDict - finish_reason: Nullable[ChatCompletionFinishReason] - index: float - logprobs: NotRequired[Nullable[ChatMessageTokenLogprobsTypedDict]] - - -class ChatStreamingChoice(BaseModel): - delta: ChatStreamingMessageChunk - - finish_reason: Annotated[ - Nullable[ChatCompletionFinishReason], PlainValidator(validate_open_enum(False)) - ] - - index: float - - logprobs: OptionalNullable[ChatMessageTokenLogprobs] = UNSET - - @model_serializer(mode="wrap") - def serialize_model(self, handler): - optional_fields = ["logprobs"] - nullable_fields = ["finish_reason", "logprobs"] - null_default_fields = [] - - serialized = handler(self) - - m = {} - - for n, f in type(self).model_fields.items(): - k = f.alias or n - val = serialized.get(k) - serialized.pop(k, None) - - optional_nullable = k in optional_fields and k in nullable_fields - is_set = ( - self.__pydantic_fields_set__.intersection({n}) - or k in null_default_fields - ) # pylint: disable=no-member - - if val is not None and val != UNSET_SENTINEL: - m[k] = val - elif val != UNSET_SENTINEL and ( - not k in optional_fields or (optional_nullable and is_set) - ): - m[k] = val - - return m diff --git a/src/openrouter/components/chatstreamingchoice.py b/src/openrouter/components/chatstreamingchoice.py new file mode 100644 index 0000000..b64b8ff --- /dev/null +++ b/src/openrouter/components/chatstreamingchoice.py @@ -0,0 +1,72 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .chatcompletionfinishreason import ChatCompletionFinishReason +from .chatmessagetokenlogprobs import ( + ChatMessageTokenLogprobs, + ChatMessageTokenLogprobsTypedDict, +) +from .chatstreamingmessagechunk import ( + ChatStreamingMessageChunk, + ChatStreamingMessageChunkTypedDict, +) +from openrouter.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +from openrouter.utils import validate_open_enum +from pydantic import model_serializer +from pydantic.functional_validators import PlainValidator +from typing_extensions import Annotated, NotRequired, TypedDict + + +class ChatStreamingChoiceTypedDict(TypedDict): + delta: ChatStreamingMessageChunkTypedDict + finish_reason: Nullable[ChatCompletionFinishReason] + index: float + logprobs: NotRequired[Nullable[ChatMessageTokenLogprobsTypedDict]] + + +class ChatStreamingChoice(BaseModel): + delta: ChatStreamingMessageChunk + + finish_reason: Annotated[ + Nullable[ChatCompletionFinishReason], PlainValidator(validate_open_enum(False)) + ] + + index: float + + logprobs: OptionalNullable[ChatMessageTokenLogprobs] = UNSET + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = ["logprobs"] + nullable_fields = ["finish_reason", "logprobs"] + null_default_fields = [] + + serialized = handler(self) + + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k) + serialized.pop(k, None) + + optional_nullable = k in optional_fields and k in nullable_fields + is_set = ( + self.__pydantic_fields_set__.intersection({n}) + or k in null_default_fields + ) # pylint: disable=no-member + + if val is not None and val != UNSET_SENTINEL: + m[k] = val + elif val != UNSET_SENTINEL and ( + not k in optional_fields or (optional_nullable and is_set) + ): + m[k] = val + + return m diff --git a/src/openrouter/components/chatstreamingresponsechunk.py b/src/openrouter/components/chatstreamingresponsechunk.py index 0ec76bc..7c32481 100644 --- a/src/openrouter/components/chatstreamingresponsechunk.py +++ b/src/openrouter/components/chatstreamingresponsechunk.py @@ -5,7 +5,7 @@ ChatGenerationTokenUsage, ChatGenerationTokenUsageTypedDict, ) -from .chatresponsechoice import ChatStreamingChoice, ChatStreamingChoiceTypedDict +from .chatstreamingchoice import ChatStreamingChoice, ChatStreamingChoiceTypedDict from openrouter.types import ( BaseModel, Nullable, diff --git a/src/openrouter/components/completionchoice.py b/src/openrouter/components/completionchoice.py index 3e68a00..21ce2b9 100644 --- a/src/openrouter/components/completionchoice.py +++ b/src/openrouter/components/completionchoice.py @@ -2,12 +2,19 @@ from __future__ import annotations from .completionlogprobs import CompletionLogprobs, CompletionLogprobsTypedDict -from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL, UnrecognizedStr +from openrouter.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, + UnrecognizedStr, +) from openrouter.utils import validate_open_enum from pydantic import model_serializer from pydantic.functional_validators import PlainValidator -from typing import Literal, Union -from typing_extensions import Annotated, TypedDict +from typing import Literal, Optional, Union +from typing_extensions import Annotated, NotRequired, TypedDict CompletionFinishReason = Union[ @@ -25,6 +32,8 @@ class CompletionChoiceTypedDict(TypedDict): index: float logprobs: Nullable[CompletionLogprobsTypedDict] finish_reason: Nullable[CompletionFinishReason] + native_finish_reason: NotRequired[str] + reasoning: NotRequired[Nullable[str]] class CompletionChoice(BaseModel): @@ -38,10 +47,14 @@ class CompletionChoice(BaseModel): Nullable[CompletionFinishReason], PlainValidator(validate_open_enum(False)) ] + native_finish_reason: Optional[str] = None + + reasoning: OptionalNullable[str] = UNSET + @model_serializer(mode="wrap") def serialize_model(self, handler): - optional_fields = [] - nullable_fields = ["logprobs", "finish_reason"] + optional_fields = ["native_finish_reason", "reasoning"] + nullable_fields = ["logprobs", "finish_reason", "reasoning"] null_default_fields = [] serialized = handler(self) diff --git a/src/openrouter/components/completionresponse.py b/src/openrouter/components/completionresponse.py index 12bde5f..dcdd529 100644 --- a/src/openrouter/components/completionresponse.py +++ b/src/openrouter/components/completionresponse.py @@ -17,6 +17,7 @@ class CompletionResponseTypedDict(TypedDict): model: str choices: List[CompletionChoiceTypedDict] object: Literal["text_completion"] + provider: NotRequired[str] system_fingerprint: NotRequired[str] usage: NotRequired[CompletionUsageTypedDict] @@ -38,6 +39,8 @@ class CompletionResponse(BaseModel): pydantic.Field(alias="object"), ] = "text_completion" + provider: Optional[str] = None + system_fingerprint: Optional[str] = None usage: Optional[CompletionUsage] = None diff --git a/src/openrouter/components/openresponsesrequest.py b/src/openrouter/components/openresponsesrequest.py index 60a5e54..23c95d6 100644 --- a/src/openrouter/components/openresponsesrequest.py +++ b/src/openrouter/components/openresponsesrequest.py @@ -44,9 +44,10 @@ UNSET_SENTINEL, UnrecognizedStr, ) -from openrouter.utils import get_discriminator, validate_open_enum +from openrouter.utils import get_discriminator, validate_const, validate_open_enum +import pydantic from pydantic import Discriminator, Tag, model_serializer -from pydantic.functional_validators import PlainValidator +from pydantic.functional_validators import AfterValidator, PlainValidator from typing import Any, Dict, List, Literal, Optional, Union from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict @@ -135,16 +136,7 @@ def serialize_model(self, handler): ] -ServiceTier = Union[ - Literal[ - "auto", - "default", - "flex", - "priority", - "scale", - ], - UnrecognizedStr, -] +ServiceTier = Literal["auto",] Truncation = Union[ @@ -356,6 +348,17 @@ def serialize_model(self, handler): return m +IDResponseHealing = Literal["response-healing",] + + +class PluginResponseHealingTypedDict(TypedDict): + id: IDResponseHealing + + +class PluginResponseHealing(BaseModel): + id: IDResponseHealing + + IDFileParser = Literal["file-parser",] @@ -437,7 +440,12 @@ class PluginModeration(BaseModel): PluginTypedDict = TypeAliasType( "PluginTypedDict", - Union[PluginModerationTypedDict, PluginFileParserTypedDict, PluginWebTypedDict], + Union[ + PluginModerationTypedDict, + PluginResponseHealingTypedDict, + PluginFileParserTypedDict, + PluginWebTypedDict, + ], ) @@ -446,6 +454,7 @@ class PluginModeration(BaseModel): Annotated[PluginModeration, Tag("moderation")], Annotated[PluginWeb, Tag("web")], Annotated[PluginFileParser, Tag("file-parser")], + Annotated[PluginResponseHealing, Tag("response-healing")], ], Discriminator(lambda m: get_discriminator(m, "id", "id")), ] @@ -478,8 +487,8 @@ class OpenResponsesRequestTypedDict(TypedDict): include: NotRequired[Nullable[List[OpenAIResponsesIncludable]]] background: NotRequired[Nullable[bool]] safety_identifier: NotRequired[Nullable[str]] - store: NotRequired[Nullable[bool]] - service_tier: NotRequired[Nullable[ServiceTier]] + store: Literal[False] + service_tier: NotRequired[ServiceTier] truncation: NotRequired[Nullable[Truncation]] stream: NotRequired[bool] provider: NotRequired[Nullable[ProviderTypedDict]] @@ -488,6 +497,8 @@ class OpenResponsesRequestTypedDict(TypedDict): r"""Plugins you want to enable for this request, including their settings.""" user: NotRequired[str] r"""A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters.""" + session_id: NotRequired[str] + r"""A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters.""" class OpenResponsesRequest(BaseModel): @@ -543,11 +554,12 @@ class OpenResponsesRequest(BaseModel): safety_identifier: OptionalNullable[str] = UNSET - store: OptionalNullable[bool] = UNSET + STORE: Annotated[ + Annotated[Optional[Literal[False]], AfterValidator(validate_const(False))], + pydantic.Field(alias="store"), + ] = False - service_tier: Annotated[ - OptionalNullable[ServiceTier], PlainValidator(validate_open_enum(False)) - ] = UNSET + service_tier: Optional[ServiceTier] = "auto" truncation: Annotated[ OptionalNullable[Truncation], PlainValidator(validate_open_enum(False)) @@ -564,6 +576,9 @@ class OpenResponsesRequest(BaseModel): user: Optional[str] = None r"""A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters.""" + session_id: Optional[str] = None + r"""A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters.""" + @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = [ @@ -594,6 +609,7 @@ def serialize_model(self, handler): "provider", "plugins", "user", + "session_id", ] nullable_fields = [ "instructions", @@ -609,8 +625,6 @@ def serialize_model(self, handler): "include", "background", "safety_identifier", - "store", - "service_tier", "truncation", "provider", ] diff --git a/src/openrouter/components/providername.py b/src/openrouter/components/providername.py index 21f6345..dea467c 100644 --- a/src/openrouter/components/providername.py +++ b/src/openrouter/components/providername.py @@ -11,12 +11,14 @@ "AionLabs", "Alibaba", "Amazon Bedrock", + "Amazon Nova", "Anthropic", - "Arcee", + "Arcee AI", "AtlasCloud", "Avian", "Azure", "BaseTen", + "BytePlus", "Black Forest Labs", "Cerebras", "Chutes", @@ -31,6 +33,7 @@ "Fireworks", "Friendli", "GMICloud", + "GoPomelo", "Google", "Google AI Studio", "Groq", @@ -60,7 +63,9 @@ "Relace", "SambaNova", "SiliconFlow", + "Sourceful", "Stealth", + "StreamLake", "Switchpoint", "Targon", "Together", diff --git a/src/openrouter/components/videourl.py b/src/openrouter/components/videourl.py deleted file mode 100644 index e1ef80d..0000000 --- a/src/openrouter/components/videourl.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" - -from __future__ import annotations -from openrouter.types import BaseModel -from typing_extensions import TypedDict - - -class VideoURLTypedDict(TypedDict): - url: str - - -class VideoURL(BaseModel): - url: str diff --git a/src/openrouter/operations/__init__.py b/src/openrouter/operations/__init__.py index 3ba8b45..9466002 100644 --- a/src/openrouter/operations/__init__.py +++ b/src/openrouter/operations/__init__.py @@ -100,7 +100,12 @@ ExchangeAuthCodeForAPIKeyResponse, ExchangeAuthCodeForAPIKeyResponseTypedDict, ) - from .getcredits import GetCreditsResponse, GetCreditsResponseTypedDict + from .getcredits import ( + GetCreditsData, + GetCreditsDataTypedDict, + GetCreditsResponse, + GetCreditsResponseTypedDict, + ) from .getcurrentkey import ( GetCurrentKeyData, GetCurrentKeyDataTypedDict, @@ -242,6 +247,8 @@ "ExchangeAuthCodeForAPIKeyRequestTypedDict", "ExchangeAuthCodeForAPIKeyResponse", "ExchangeAuthCodeForAPIKeyResponseTypedDict", + "GetCreditsData", + "GetCreditsDataTypedDict", "GetCreditsResponse", "GetCreditsResponseTypedDict", "GetCurrentKeyData", @@ -416,6 +423,8 @@ "ExchangeAuthCodeForAPIKeyRequestTypedDict": ".exchangeauthcodeforapikey", "ExchangeAuthCodeForAPIKeyResponse": ".exchangeauthcodeforapikey", "ExchangeAuthCodeForAPIKeyResponseTypedDict": ".exchangeauthcodeforapikey", + "GetCreditsData": ".getcredits", + "GetCreditsDataTypedDict": ".getcredits", "GetCreditsResponse": ".getcredits", "GetCreditsResponseTypedDict": ".getcredits", "GetCurrentKeyData": ".getcurrentkey", diff --git a/src/openrouter/operations/getcredits.py b/src/openrouter/operations/getcredits.py index 9719016..8cab52d 100644 --- a/src/openrouter/operations/getcredits.py +++ b/src/openrouter/operations/getcredits.py @@ -5,9 +5,28 @@ from typing_extensions import TypedDict +class GetCreditsDataTypedDict(TypedDict): + total_credits: float + r"""Total credits purchased""" + total_usage: float + r"""Total credits used""" + + +class GetCreditsData(BaseModel): + total_credits: float + r"""Total credits purchased""" + + total_usage: float + r"""Total credits used""" + + class GetCreditsResponseTypedDict(TypedDict): r"""Total credits purchased and used""" + data: GetCreditsDataTypedDict + class GetCreditsResponse(BaseModel): r"""Total credits purchased and used""" + + data: GetCreditsData diff --git a/src/openrouter/operations/getparameters.py b/src/openrouter/operations/getparameters.py index 18da669..f21ad9b 100644 --- a/src/openrouter/operations/getparameters.py +++ b/src/openrouter/operations/getparameters.py @@ -38,12 +38,14 @@ class GetParametersSecurity(BaseModel): "AionLabs", "Alibaba", "Amazon Bedrock", + "Amazon Nova", "Anthropic", - "Arcee", + "Arcee AI", "AtlasCloud", "Avian", "Azure", "BaseTen", + "BytePlus", "Black Forest Labs", "Cerebras", "Chutes", @@ -58,6 +60,7 @@ class GetParametersSecurity(BaseModel): "Fireworks", "Friendli", "GMICloud", + "GoPomelo", "Google", "Google AI Studio", "Groq", @@ -87,7 +90,9 @@ class GetParametersSecurity(BaseModel): "Relace", "SambaNova", "SiliconFlow", + "Sourceful", "Stealth", + "StreamLake", "Switchpoint", "Targon", "Together", diff --git a/src/openrouter/responses.py b/src/openrouter/responses.py index 85701ff..01bd315 100644 --- a/src/openrouter/responses.py +++ b/src/openrouter/responses.py @@ -69,8 +69,7 @@ def send( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - store: OptionalNullable[bool] = UNSET, - service_tier: OptionalNullable[components.ServiceTier] = UNSET, + service_tier: Optional[components.ServiceTier] = "auto", truncation: OptionalNullable[components.Truncation] = UNSET, stream: Union[Literal[False], None] = None, provider: OptionalNullable[ @@ -80,6 +79,7 @@ def send( Union[List[components.Plugin], List[components.PluginTypedDict]] ] = None, user: Optional[str] = None, + session_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -109,13 +109,13 @@ def send( :param include: :param background: :param safety_identifier: - :param store: :param service_tier: :param truncation: :param stream: :param provider: When multiple model providers are available, optionally indicate your routing preference. :param plugins: Plugins you want to enable for this request, including their settings. :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters. + :param session_id: A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -174,8 +174,7 @@ def send( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - store: OptionalNullable[bool] = UNSET, - service_tier: OptionalNullable[components.ServiceTier] = UNSET, + service_tier: Optional[components.ServiceTier] = "auto", truncation: OptionalNullable[components.Truncation] = UNSET, stream: Literal[True], provider: OptionalNullable[ @@ -185,6 +184,7 @@ def send( Union[List[components.Plugin], List[components.PluginTypedDict]] ] = None, user: Optional[str] = None, + session_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -214,13 +214,13 @@ def send( :param include: :param background: :param safety_identifier: - :param store: :param service_tier: :param truncation: :param stream: :param provider: When multiple model providers are available, optionally indicate your routing preference. :param plugins: Plugins you want to enable for this request, including their settings. :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters. + :param session_id: A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -278,8 +278,7 @@ def send( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - store: OptionalNullable[bool] = UNSET, - service_tier: OptionalNullable[components.ServiceTier] = UNSET, + service_tier: Optional[components.ServiceTier] = "auto", truncation: OptionalNullable[components.Truncation] = UNSET, stream: Optional[bool] = False, provider: OptionalNullable[ @@ -289,6 +288,7 @@ def send( Union[List[components.Plugin], List[components.PluginTypedDict]] ] = None, user: Optional[str] = None, + session_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -318,13 +318,13 @@ def send( :param include: :param background: :param safety_identifier: - :param store: :param service_tier: :param truncation: :param stream: :param provider: When multiple model providers are available, optionally indicate your routing preference. :param plugins: Plugins you want to enable for this request, including their settings. :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters. + :param session_id: A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -374,7 +374,6 @@ def send( include=include, background=background, safety_identifier=safety_identifier, - store=store, service_tier=service_tier, truncation=truncation, stream=stream, @@ -385,6 +384,7 @@ def send( plugins, Optional[List[components.Plugin]] ), user=user, + session_id=session_id, ) req = self._build_request( @@ -627,8 +627,7 @@ async def send_async( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - store: OptionalNullable[bool] = UNSET, - service_tier: OptionalNullable[components.ServiceTier] = UNSET, + service_tier: Optional[components.ServiceTier] = "auto", truncation: OptionalNullable[components.Truncation] = UNSET, stream: Union[Literal[False], None] = None, provider: OptionalNullable[ @@ -638,6 +637,7 @@ async def send_async( Union[List[components.Plugin], List[components.PluginTypedDict]] ] = None, user: Optional[str] = None, + session_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -667,13 +667,13 @@ async def send_async( :param include: :param background: :param safety_identifier: - :param store: :param service_tier: :param truncation: :param stream: :param provider: When multiple model providers are available, optionally indicate your routing preference. :param plugins: Plugins you want to enable for this request, including their settings. :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters. + :param session_id: A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -732,8 +732,7 @@ async def send_async( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - store: OptionalNullable[bool] = UNSET, - service_tier: OptionalNullable[components.ServiceTier] = UNSET, + service_tier: Optional[components.ServiceTier] = "auto", truncation: OptionalNullable[components.Truncation] = UNSET, stream: Literal[True], provider: OptionalNullable[ @@ -743,6 +742,7 @@ async def send_async( Union[List[components.Plugin], List[components.PluginTypedDict]] ] = None, user: Optional[str] = None, + session_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -772,13 +772,13 @@ async def send_async( :param include: :param background: :param safety_identifier: - :param store: :param service_tier: :param truncation: :param stream: :param provider: When multiple model providers are available, optionally indicate your routing preference. :param plugins: Plugins you want to enable for this request, including their settings. :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters. + :param session_id: A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -836,8 +836,7 @@ async def send_async( include: OptionalNullable[List[components.OpenAIResponsesIncludable]] = UNSET, background: OptionalNullable[bool] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, - store: OptionalNullable[bool] = UNSET, - service_tier: OptionalNullable[components.ServiceTier] = UNSET, + service_tier: Optional[components.ServiceTier] = "auto", truncation: OptionalNullable[components.Truncation] = UNSET, stream: Optional[bool] = False, provider: OptionalNullable[ @@ -847,6 +846,7 @@ async def send_async( Union[List[components.Plugin], List[components.PluginTypedDict]] ] = None, user: Optional[str] = None, + session_id: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -876,13 +876,13 @@ async def send_async( :param include: :param background: :param safety_identifier: - :param store: :param service_tier: :param truncation: :param stream: :param provider: When multiple model providers are available, optionally indicate your routing preference. :param plugins: Plugins you want to enable for this request, including their settings. :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 128 characters. + :param session_id: A unique identifier for grouping related requests (e.g., a conversation or agent workflow) for observability. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 128 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -932,7 +932,6 @@ async def send_async( include=include, background=background, safety_identifier=safety_identifier, - store=store, service_tier=service_tier, truncation=truncation, stream=stream, @@ -943,6 +942,7 @@ async def send_async( plugins, Optional[List[components.Plugin]] ), user=user, + session_id=session_id, ) req = self._build_request_async(