{"audited_on":"2026-09-07","baseline":"1.16.0","version":"2.0.0.rc1","revision":"87979ac0dd8f9eed025de33148ffc8c94595e5ec","method":"Source and official documentation audit of 1.16.0 and 2.0 at the recorded revision. Selected integrations include live HTTP or WebSocket recordings and focused regressions; each cell separates implementation support from validation evidence. The comparison covers application-owned conversations, tools, media, embeddings, transcription, speech and batches. Realtime conversations and provider-managed conversation storage are outside the release scope; their provider offerings remain recorded but are excluded from comparison totals. One-shot streaming speech and transcription remain in scope. Access restrictions and upstream errors are recorded explicitly. Provider offerings are not an exhaustive endpoint inventory.","groups":[{"id":"conversation","name":"Conversations","summary":true},{"id":"tools","name":"Tools","summary":true},{"id":"context","name":"Caching and Context","summary":true},{"id":"media","name":"Media","summary":true},{"id":"search","name":"Documents and Search","summary":true},{"id":"resources","name":"Files and Batches","summary":true},{"id":"additional","name":"Additional Provider APIs","summary":false},{"id":"boundaries","name":"Realtime and Training","summary":false}],"statuses":{"native":{"symbol":"✓","label":"Built in","description":"A RubyLLM API handles the feature on supported models and protocols. Selecting a protocol or passing options to a registered alias does not make the integration partial. The cell records model and endpoint restrictions."},"partial":{"symbol":"◐","label":"Partial","description":"Some paths or result formats are supported; others are missing or need operational verification. The cell explains the limitation."},"passthrough":{"symbol":"{}","label":"Raw options","description":"Requires provider-specific request options, raw content, or a tool definition rather than a dedicated RubyLLM interface."},"missing":{"symbol":"×","label":"Missing","description":"The provider offers this feature, but the audited version has no integration for it."},"na":{"symbol":"–","label":"Not in this API","description":"The audited API inventory does not document this operation. The cell identifies the scope; separate products, client-side tools and chat prompts doing a similar task are not counted."},"unknown":{"symbol":"?","label":"Unverified","description":"Provider availability or implementation behavior remains unresolved. The cell records the specific uncertainty and the sources checked."},"deprecated":{"symbol":"–","label":"Deprecated","description":"The provider has deprecated this API and scheduled its removal. It is excluded from missing-integration work; the cell records the shutdown date."},"out_of_scope":{"symbol":"╱","label":"Outside scope","description":"The provider offers this feature through realtime conversations or provider-managed conversation state. These integrations are outside RubyLLM 2.0 coverage and excluded from the comparison totals."}},"features":[{"id":"chat","name":"Chat","group":"conversation"},{"id":"streaming","name":"Chat streaming","group":"conversation"},{"id":"structured_output","name":"Structured output","group":"conversation"},{"id":"vision","name":"Image input","group":"conversation"},{"id":"pdf_input","name":"PDF input","group":"conversation"},{"id":"audio_input","name":"Audio input","group":"conversation"},{"id":"video_input","name":"Video input","group":"conversation"},{"id":"thinking","name":"Thinking results","group":"conversation"},{"id":"thinking_controls","name":"Thinking controls","group":"conversation"},{"id":"citations","name":"Citations","group":"conversation"},{"id":"tools","name":"Function tools","group":"tools"},{"id":"tool_choice","name":"Tool choice","group":"tools"},{"id":"parallel_tools","name":"Multiple tool calls","group":"tools"},{"id":"parallel_tool_control","name":"Limit parallel calls","group":"tools"},{"id":"server_web_search","name":"Web search tool","group":"tools"},{"id":"server_web_fetch","name":"Web fetch tool","group":"tools"},{"id":"server_code_execution","name":"Code execution tool","group":"tools"},{"id":"server_file_search","name":"File search tool","group":"tools"},{"id":"server_mcp","name":"Remote MCP tools","group":"tools"},{"id":"prompt_caching","name":"Prompt caching","group":"context"},{"id":"cache_boundaries","name":"Cache boundaries","group":"context"},{"id":"explicit_cache","name":"Managed cache resources","group":"context"},{"id":"compaction","name":"Context compaction","group":"context"},{"id":"token_counting","name":"Token counting","group":"context"},{"id":"image_generation","name":"Image generation","group":"media"},{"id":"image_editing","name":"Image editing","group":"media"},{"id":"video_generation","name":"Video generation","group":"media"},{"id":"speech","name":"Speech generation","group":"media"},{"id":"transcription","name":"Transcription","group":"media"},{"id":"streaming_transcription","name":"Streaming transcription","group":"media"},{"id":"diarization","name":"Speaker identification","group":"media"},{"id":"moderation","name":"Moderation","group":"media"},{"id":"ocr","name":"OCR / document parsing","group":"search"},{"id":"embeddings","name":"Text embeddings","group":"search"},{"id":"multimodal_embeddings","name":"Multimodal embeddings","group":"search"},{"id":"reranking","name":"Reranking","group":"search"},{"id":"file_upload","name":"File upload","group":"resources"},{"id":"file_download","name":"File download","group":"resources"},{"id":"chat_batches","name":"Chat batches","group":"resources"},{"id":"embedding_batches","name":"Embedding batches","group":"resources"},{"id":"advisor_tool","name":"Advisor tool","group":"additional"},{"id":"agent_responses","name":"Perplexity Agent API","group":"additional"},{"id":"agent_skills","name":"Agent skills","group":"additional"},{"id":"async_research","name":"Asynchronous research","group":"additional"},{"id":"background_responses","name":"Background Responses jobs","group":"additional"},{"id":"browser_use","name":"Browser use","group":"additional"},{"id":"classification","name":"Classification","group":"additional"},{"id":"computer_use","name":"Computer use","group":"additional"},{"id":"context_editing","name":"Context editing","group":"additional"},{"id":"contextual_embeddings","name":"Contextual embeddings","group":"additional"},{"id":"dedicated_transcription_api","name":"Dedicated transcription API","group":"additional"},{"id":"dubbing","name":"Dubbing","group":"additional"},{"id":"fast_inference","name":"Fast inference","group":"additional"},{"id":"file_management","name":"File listing and deletion","group":"additional"},{"id":"file_search_store_management","name":"File search store management","group":"additional"},{"id":"fill_in_middle","name":"Fill-in-the-middle completion","group":"additional"},{"id":"fine_tuning","name":"Fine-tuning","group":"boundaries"},{"id":"google_maps","name":"Google Maps grounding","group":"additional"},{"id":"guardrail_configuration","name":"Guardrail configuration","group":"additional"},{"id":"hosted_conversations","name":"Hosted conversations","group":"additional"},{"id":"image_batches","name":"Image batches","group":"additional"},{"id":"interactions_api","name":"Interactions API","group":"additional"},{"id":"json_mode","name":"JSON object mode","group":"additional"},{"id":"mantle_protocols","name":"Bedrock Mantle protocols","group":"additional"},{"id":"manual_compaction","name":"Manual context compaction","group":"additional"},{"id":"music_generation","name":"Music generation","group":"additional"},{"id":"nonchat_batches","name":"Other batch operations","group":"additional"},{"id":"omni_video_generation","name":"Omni video generation","group":"additional"},{"id":"partner_model_protocols","name":"Partner model protocols","group":"additional"},{"id":"prefix_completion","name":"Prefix completion","group":"additional"},{"id":"programmatic_tool_calling","name":"Programmatic tool calling","group":"additional"},{"id":"prompt_cache_controls","name":"Prompt cache options","group":"additional"},{"id":"provider_server_fallback","name":"Provider-managed fallback","group":"additional"},{"id":"realtime","name":"Realtime sessions","group":"boundaries"},{"id":"response_caching","name":"Response caching","group":"additional"},{"id":"responses","name":"Responses API","group":"additional"},{"id":"responses_batches","name":"Responses batches","group":"additional"},{"id":"search_api","name":"Standalone search API","group":"additional"},{"id":"server_apply_patch","name":"Apply patch tool","group":"additional"},{"id":"server_tool_image_generation","name":"Image generation tool","group":"additional"},{"id":"server_tool_search","name":"Tool search","group":"additional"},{"id":"server_x_search","name":"X search tool","group":"additional"},{"id":"shell_computer_tools","name":"Shell and computer tools","group":"additional"},{"id":"sound_effects","name":"Sound effects","group":"additional"},{"id":"streaming_speech","name":"Streaming speech generation","group":"additional"},{"id":"task_budgets","name":"Task budgets","group":"additional"},{"id":"text_intelligence","name":"Text analysis API","group":"additional"},{"id":"vector_store_management","name":"Vector store management","group":"additional"},{"id":"video_batches","name":"Video batches","group":"additional"},{"id":"video_editing","name":"Video editing","group":"additional"},{"id":"video_extension","name":"Video extension","group":"additional"},{"id":"voice_cloning","name":"Voice cloning","group":"additional"},{"id":"voice_conversion","name":"Voice conversion","group":"additional"},{"id":"web_fetch_api","name":"Standalone web fetch API","group":"additional"},{"id":"websockets","name":"Responses over WebSocket","group":"boundaries"}],"summary":{"feature_count":40,"groups":[{"id":"conversation","name":"Conversations","v1":91,"v2":124,"offered":125},{"id":"tools","name":"Tools","v1":44,"v2":95,"offered":101},{"id":"context","name":"Caching and Context","v1":12,"v2":38,"offered":38},{"id":"media","name":"Media","v1":15,"v2":73,"offered":74},{"id":"search","name":"Documents and Search","v1":8,"v2":26,"offered":26},{"id":"resources","name":"Files and Batches","v1":0,"v2":39,"offered":41}],"maximum":125},"sources":{"s1":{"title":"OpenAI Responses create","url":"https://developers.openai.com/api/reference/cli/resources/responses/methods/create"},"s2":{"title":"OpenAI audio and speech","url":"https://developers.openai.com/api/docs/guides/audio"},"s3":{"title":"OpenAI tools","url":"https://developers.openai.com/api/docs/guides/tools"},"s4":{"title":"OpenAI prompt caching","url":"https://developers.openai.com/api/docs/guides/prompt-caching"},"s5":{"title":"OpenAI input token counting","url":"https://developers.openai.com/api/reference/typescript/resources/responses/subresources/input_tokens"},"s6":{"title":"OpenAI video generation","url":"https://developers.openai.com/api/docs/guides/video-generation"},"s7":{"title":"OpenAI Batch API","url":"https://developers.openai.com/api/docs/guides/batch"},"s8":{"title":"Azure OpenAI Responses","url":"https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/responses"},"s9":{"title":"Azure image and audio REST reference","url":"https://learn.microsoft.com/azure/ai-services/openai/reference-preview?tabs=python"},"s10":{"title":"Azure Responses web search","url":"https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/web-search"},"s11":{"title":"Azure prompt caching","url":"https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/prompt-caching"},"s12":{"title":"Azure embeddings REST reference","url":"https://learn.microsoft.com/en-us/rest/api/aifoundry/azureopenai/embeddings"},"s13":{"title":"Azure transcription workflows","url":"https://learn.microsoft.com/en-us/azure/ai-services/speech-service/transcribe-overview"},"s14":{"title":"Azure Sora video generation","url":"https://learn.microsoft.com/en-us/azure/foundry/openai/concepts/video-generation"},"s15":{"title":"Azure global batch processing","url":"https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/batch"},"s16":{"title":"Azure batch REST reference","url":"https://learn.microsoft.com/en-us/rest/api/microsoft-foundry/azureopenai/batch"},"s17":{"title":"xAI tools overview","url":"https://docs.x.ai/developers/tools/overview"},"s18":{"title":"xAI models","url":"https://docs.x.ai/developers/models"},"s19":{"title":"xAI files","url":"https://docs.x.ai/developers/files"},"s20":{"title":"xAI voice REST and WebSocket APIs","url":"https://docs.x.ai/developers/rest-api-reference/inference/voice"},"s21":{"title":"xAI prompt caching","url":"https://docs.x.ai/developers/advanced-api-usage/prompt-caching"},"s22":{"title":"xAI context compaction","url":"https://docs.x.ai/developers/advanced-api-usage/context-compaction"},"s23":{"title":"xAI tokenization endpoint","url":"https://docs.x.ai/developers/rest-api-reference/inference/other"},"s24":{"title":"xAI video generation","url":"https://docs.x.ai/developers/models/video-generation"},"s25":{"title":"xAI speech to text","url":"https://docs.x.ai/developers/models/speech-to-text"},"s26":{"title":"xAI batch API","url":"https://docs.x.ai/developers/advanced-api-usage/batch-api"},"s27":{"title":"xAI release notes","url":"https://docs.x.ai/developers/release-notes"},"s28":{"title":"DeepSeek Responses reference","url":"https://api-docs.deepseek.com/api/create-response/"},"s29":{"title":"DeepSeek Responses compatibility","url":"https://api-docs.deepseek.com/guides/responses_api/"},"s30":{"title":"DeepSeek Files API","url":"https://api-docs.deepseek.com/guides/files_api/"},"s31":{"title":"DeepSeek thinking mode","url":"https://api-docs.deepseek.com/guides/thinking_mode/"},"s32":{"title":"DeepSeek context caching","url":"https://api-docs.deepseek.com/guides/kv_cache/"},"s33":{"title":"Anthropic feature availability","url":"https://platform.claude.com/docs/en/build-with-claude/overview"},"s34":{"title":"Anthropic does not offer its own embeddings","url":"https://platform.claude.com/docs/en/build-with-claude/embeddings"},"s35":{"title":"Anthropic citations","url":"https://platform.claude.com/docs/en/build-with-claude/citations"},"s36":{"title":"Anthropic remote MCP connector","url":"https://platform.claude.com/docs/en/agents-and-tools/mcp-connector"},"s37":{"title":"Anthropic prompt caching","url":"https://platform.claude.com/docs/en/build-with-claude/prompt-caching"},"s38":{"title":"Anthropic compaction","url":"https://platform.claude.com/docs/en/build-with-claude/compaction"},"s39":{"title":"Anthropic Files API","url":"https://platform.claude.com/docs/en/build-with-claude/files"},"s40":{"title":"Anthropic tool search","url":"https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool"},"s41":{"title":"Gemini API overview and Interactions migration","url":"https://ai.google.dev/gemini-api/docs"},"s42":{"title":"Gemini function calling and remote MCP","url":"https://ai.google.dev/gemini-api/docs/function-calling"},"s43":{"title":"Gemini Google Search grounding","url":"https://ai.google.dev/gemini-api/docs/google-search"},"s44":{"title":"Gemini URL context","url":"https://ai.google.dev/gemini-api/docs/url-context"},"s45":{"title":"Gemini code execution","url":"https://ai.google.dev/gemini-api/docs/code-execution"},"s46":{"title":"Gemini File Search","url":"https://ai.google.dev/gemini-api/docs/file-search"},"s47":{"title":"Gemini implicit and explicit caching","url":"https://ai.google.dev/gemini-api/docs/generate-content/caching"},"s48":{"title":"Gemini token counting","url":"https://ai.google.dev/gemini-api/docs/tokens"},"s49":{"title":"Gemini text and multimodal embeddings","url":"https://ai.google.dev/gemini-api/docs/embeddings"},"s50":{"title":"Gemini image generation and editing","url":"https://ai.google.dev/gemini-api/docs/image-generation"},"s51":{"title":"Gemini video generation","url":"https://ai.google.dev/gemini-api/docs/video"},"s52":{"title":"Gemini text-to-speech","url":"https://ai.google.dev/gemini-api/docs/speech-generation"},"s53":{"title":"Gemini dedicated transcription and diarization","url":"https://ai.google.dev/gemini-api/docs/transcribe"},"s54":{"title":"Gemini Live API","url":"https://ai.google.dev/gemini-api/docs/live-api"},"s55":{"title":"Gemini Files API","url":"https://ai.google.dev/gemini-api/docs/files"},"s56":{"title":"Gemini Batch API","url":"https://ai.google.dev/gemini-api/docs/batch-api"},"s57":{"title":"Gemini Developer API fine-tuning availability","url":"https://ai.google.dev/gemini-api/docs/model-tuning"},"s58":{"title":"Google Cloud generative AI overview","url":"https://docs.cloud.google.com/vertex-ai/generative-ai/docs/learn/overview"},"s59":{"title":"Vertex AI function calling","url":"https://docs.cloud.google.com/vertex-ai/generative-ai/docs/multimodal/function-calling"},"s60":{"title":"Vertex AI Search grounding","url":"https://docs.cloud.google.com/vertex-ai/generative-ai/docs/grounding/grounding-with-vertex-ai-search"},"s61":{"title":"Vertex AI URL context","url":"https://docs.cloud.google.com/vertex-ai/generative-ai/docs/url-context"},"s62":{"title":"Vertex AI code execution","url":"https://docs.cloud.google.com/vertex-ai/generative-ai/docs/model-reference/code-execution-api"},"s63":{"title":"Vertex AI context caching","url":"https://docs.cloud.google.com/vertex-ai/generative-ai/docs/context-cache/context-cache-overview"},"s64":{"title":"Vertex AI multimodal embeddings","url":"https://docs.cloud.google.com/vertex-ai/generative-ai/docs/embeddings/get-multimodal-embeddings"},"s65":{"title":"Vertex AI Search ranking API","url":"https://cloud.google.com/generative-ai-app-builder/docs/ranking"},"s66":{"title":"Vertex AI Imagen editing and customization","url":"https://cloud.google.com/vertex-ai/generative-ai/docs/image/subject-customization"},"s67":{"title":"Vertex AI Gemini Live API","url":"https://docs.cloud.google.com/vertex-ai/generative-ai/docs/live-api"},"s68":{"title":"Vertex AI batch embedding inference","url":"https://docs.cloud.google.com/vertex-ai/generative-ai/docs/embeddings/batch-prediction-genai-embeddings"},"s69":{"title":"Vertex AI Tuning API","url":"https://docs.cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning"},"s70":{"title":"Bedrock Converse API","url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html"},"s71":{"title":"Nova web grounding","url":"https://docs.aws.amazon.com/nova/latest/userguide/grounding.html"},"s72":{"title":"Bedrock prompt caching","url":"https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-caching.html"},"s73":{"title":"Bedrock CountTokens","url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_CountTokens.html"},"s74":{"title":"Bedrock Titan embeddings and batch jobs","url":"https://docs.aws.amazon.com/bedrock/latest/userguide/titan-embedding-models.html"},"s75":{"title":"Bedrock Titan multimodal embeddings","url":"https://aws.amazon.com/blogs/aws/amazon-titan-image-generator-multimodal-embeddings-and-text-models-are-now-available-in-amazon-bedrock/"},"s76":{"title":"Bedrock Rerank API","url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_Rerank.html"},"s77":{"title":"Nova Canvas image generation and editing","url":"https://docs.aws.amazon.com/nova/latest/userguide/image-generation.html"},"s78":{"title":"Nova Reel video generation","url":"https://docs.aws.amazon.com/nova/latest/userguide/video-generation.html"},"s79":{"title":"Nova Sonic bidirectional speech API","url":"https://docs.aws.amazon.com/nova/latest/userguide/speech-bidirection.html"},"s80":{"title":"Bedrock Voxtral transcription","url":"https://docs.aws.amazon.com/en_en/bedrock/latest/userguide/model-card-mistral-ai-voxtral-small-24b-2507.html"},"s81":{"title":"Bedrock ApplyGuardrail API","url":"https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails-use-independent-api.html"},"s82":{"title":"Bedrock batch inference","url":"https://docs.aws.amazon.com/bedrock/latest/userguide/batch-inference.html"},"s83":{"title":"Bedrock model customization","url":"https://docs.aws.amazon.com/bedrock/latest/userguide/custom-models.html"},"s84":{"title":"Cohere Chat API","url":"https://docs.cohere.com/reference/chat"},"s85":{"title":"Cohere Parse API","url":"https://docs.cohere.com/reference/parse"},"s86":{"title":"Cohere Tokenize API and API index","url":"https://docs.cohere.com/reference/tokenize"},"s87":{"title":"Cohere reasoning controls","url":"https://docs.cohere.com/docs/reasoning"},"s88":{"title":"Cohere Embed","url":"https://docs.cohere.com/docs/cohere-embed"},"s89":{"title":"Cohere Rerank","url":"https://docs.cohere.com/reference/rerank"},"s90":{"title":"Cohere transcription API","url":"https://docs.cohere.com/reference/create-audio-transcription"},"s91":{"title":"Cohere Embed Jobs","url":"https://docs.cohere.com/docs/embed-jobs-api"},"s92":{"title":"Mistral Chat API and endpoint index","url":"https://docs.mistral.ai/api"},"s93":{"title":"Mistral Speech API","url":"https://docs.mistral.ai/api/endpoint/audio/speech"},"s94":{"title":"Mistral audio transcription API","url":"https://docs.mistral.ai/api/endpoint/audio/transcriptions"},"s95":{"title":"Mistral OCR API","url":"https://docs.mistral.ai/api/endpoint/ocr"},"s96":{"title":"Mistral Files API","url":"https://docs.mistral.ai/api/endpoint/files"},"s97":{"title":"Mistral batch processing","url":"https://docs.mistral.ai/studio/batch-processing"},"s98":{"title":"Mistral real-time transcription","url":"https://docs.mistral.ai/studio/audio/speech_to_text/realtime_transcription"},"s99":{"title":"Mistral deprecated fine-tuning documentation","url":"https://docs.mistral.ai/resources/deprecated/finetuning"},"s100":{"title":"Deepgram prerecorded transcription","url":"https://developers.deepgram.com/reference/speech-to-text/listen-pre-recorded"},"s101":{"title":"Deepgram text to speech","url":"https://developers.deepgram.com/docs/text-to-speech"},"s102":{"title":"Deepgram speaker diarization","url":"https://developers.deepgram.com/docs/diarization"},"s103":{"title":"Deepgram live audio","url":"https://developers.deepgram.com/reference/speech-to-text/listen-streaming"},"s104":{"title":"Deepgram Voice Agent API","url":"https://developers.deepgram.com/docs/twilio-and-deepgram-voice-agent"},"s105":{"title":"Deepgram Text Intelligence Read API","url":"https://developers.deepgram.com/docs/text-intention-recognition"},"s106":{"title":"ElevenLabs audio API overview","url":"https://elevenlabs.io/api"},"s107":{"title":"ElevenLabs speech to text","url":"https://elevenlabs.io/docs/api-reference/speech-to-text/convert"},"s108":{"title":"ElevenLabs realtime transcription","url":"https://elevenlabs.io/docs/api-reference/speech-to-text/v-1-speech-to-text-realtime"},"s109":{"title":"ElevenLabs realtime speech generation","url":"https://elevenlabs.io/docs/eleven-api/guides/how-to/websockets/realtime-tts"},"s110":{"title":"ElevenLabs music composition","url":"https://elevenlabs.io/docs/api-reference/music/compose"},"s111":{"title":"ElevenLabs voice conversion","url":"https://elevenlabs.io/docs/api-reference/speech-to-speech/convert"},"s112":{"title":"Perplexity Sonar API","url":"https://docs.perplexity.ai/api-reference/sonar-post"},"s113":{"title":"Perplexity four API families","url":"https://docs.perplexity.ai/docs/getting-started/quickstart"},"s114":{"title":"Perplexity Deep Research controls and async API","url":"https://docs.perplexity.ai/docs/sonar/models/sonar-deep-research"},"s115":{"title":"Perplexity embeddings","url":"https://docs.perplexity.ai/docs/embeddings/quickstart"},"s116":{"title":"Perplexity Search API","url":"https://docs.perplexity.ai/docs/search/quickstart"},"s117":{"title":"OpenRouter API reference","url":"https://openrouter.ai/docs/api/reference/overview"},"s118":{"title":"OpenRouter audio input and chat audio output","url":"https://openrouter.ai/docs/guides/overview/multimodal/audio"},"s119":{"title":"OpenRouter video generation","url":"https://openrouter.ai/docs/guides/overview/multimodal/video-generation"},"s120":{"title":"OpenRouter web plugin and citations","url":"https://openrouter.ai/docs/guides/features/plugins/web-search"},"s121":{"title":"OpenRouter server tools","url":"https://openrouter.ai/docs/guides/features/server-tools/overview"},"s122":{"title":"OpenRouter prompt caching","url":"https://openrouter.ai/docs/guides/best-practices/prompt-caching"},"s123":{"title":"OpenRouter context compression","url":"https://openrouter.ai/docs/guides/features/message-transforms"},"s124":{"title":"OpenRouter embedding and reranking APIs","url":"https://openrouter.ai/docs/guides/evaluate-and-optimize/rag"},"s125":{"title":"OpenRouter multimodal embeddings","url":"https://openrouter.ai/blog/insights/every-modality-one-api/"},"s126":{"title":"OpenRouter unified Image API","url":"https://openrouter.ai/docs/guides/overview/multimodal/image-generation"},"s127":{"title":"OpenRouter speech generation and reference voices","url":"https://openrouter.ai/docs/guides/overview/multimodal/tts"},"s128":{"title":"OpenRouter speech to text","url":"https://openrouter.ai/docs/guides/overview/multimodal/stt"},"s129":{"title":"OpenRouter Batch API beta","url":"https://openrouter.ai/docs/batch-quickstart"},"s130":{"title":"OpenRouter response caching","url":"https://openrouter.ai/docs/guides/features/response-caching"},"s131":{"title":"Ollama OpenAI compatibility","url":"https://docs.ollama.com/api/openai-compatibility"},"s132":{"title":"Ollama structured outputs and Cloud limitation","url":"https://docs.ollama.com/capabilities/structured-outputs"},"s133":{"title":"Ollama separate web search and fetch APIs","url":"https://docs.ollama.com/capabilities/web-search"},"s134":{"title":"Ollama experimental image generation","url":"https://ollama.com/blog/image-generation"},"s135":{"title":"Ollama Cloud","url":"https://docs.ollama.com/cloud"},"s136":{"title":"GPUStack inference APIs","url":"https://docs.gpustack.ai/latest/integrations/inference-apis/"},"s137":{"url":"https://developers.openai.com/api/docs/llms.txt","title":"OpenAI complete API documentation index"},"s138":{"url":"https://developers.openai.com/api/docs/guides/tools-skills","title":"OpenAI Skills API and shell attachments"},"s139":{"url":"https://developers.openai.com/api/docs/guides/deep-research","title":"OpenAI deep research"},"s140":{"url":"https://developers.openai.com/api/docs/guides/background","title":"OpenAI background mode"},"s141":{"url":"https://developers.openai.com/api/docs/guides/tools-computer-use","title":"OpenAI computer and browser use"},"s142":{"url":"https://developers.openai.com/api/docs/guides/tools-apply-patch","title":"OpenAI apply patch tool"},"s143":{"url":"https://developers.openai.com/api/docs/guides/speech-to-text","title":"OpenAI file transcription"},"s144":{"url":"https://developers.openai.com/api/docs/guides/fast-mode","title":"OpenAI Fast mode"},"s145":{"url":"https://developers.openai.com/api/docs/guides/tools-file-search","title":"OpenAI file search and vector stores"},"s146":{"url":"https://developers.openai.com/api/docs/guides/tools-tool-search","title":"OpenAI tool search and namespaces"},"s147":{"url":"https://developers.openai.com/api/docs/guides/text-to-speech","title":"OpenAI text-to-speech and streaming"},"s148":{"url":"https://developers.openai.com/api/docs/guides/tools-web-search","title":"OpenAI web search: non-reasoning search and Responses page actions"},"s149":{"url":"https://learn.microsoft.com/en-us/azure/foundry/openai/reference-preview-latest","title":"Azure OpenAI v1 preview API inventory"},"s150":{"url":"https://learn.microsoft.com/en-us/rest/api/aifoundry/azureopenai/responses","title":"Azure OpenAI Responses REST reference"},"s151":{"url":"https://docs.cohere.com/v2/docs/cohere-on-azure/azure-ai-reranking","title":"Cohere reranking on Azure AI Foundry"},"s152":{"url":"https://docs.cohere.com/v2/docs/cohere-on-microsoft-azure","title":"Cohere models on Azure"},"s153":{"url":"https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/websockets","title":"Azure Responses WebSocket mode"},"s154":{"url":"https://learn.microsoft.com/en-us/azure/foundry-classic/foundry-models/how-to/use-image-embeddings","title":"Foundry image embeddings"},"s155":{"url":"https://learn.microsoft.com/en-us/azure/ai-services/content-safety/","title":"Azure AI Content Safety is a separate moderation service"},"s156":{"url":"https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/overview","title":"Azure Document Intelligence overview"},"s157":{"url":"https://docs.x.ai/llms.txt","title":"xAI complete API documentation"},"s158":{"url":"https://docs.x.ai/developers/rest-api-reference/inference/chat","title":"xAI Responses and Chat REST reference"},"s159":{"url":"https://docs.x.ai/developers/advanced-api-usage/deferred-chat-completions","title":"xAI deferred Chat Completions"},"s160":{"url":"https://docs.x.ai/developers/model-capabilities/audio/speech-to-text","title":"xAI speech-to-text"},"s161":{"url":"https://docs.x.ai/developers/advanced-api-usage/priority-processing","title":"xAI Priority Processing"},"s162":{"url":"https://docs.x.ai/developers/files/collections/api","title":"xAI Collections API"},"s163":{"url":"https://docs.x.ai/developers/model-capabilities/audio/custom-voices","title":"xAI custom voices and Enterprise API restriction"},"s164":{"url":"https://api-docs.deepseek.com/sitemap.xml","title":"DeepSeek complete API documentation inventory"},"s165":{"url":"https://api-docs.deepseek.com/guides/responses_api","title":"DeepSeek Responses parameter compatibility"},"s166":{"url":"https://api-docs.deepseek.com/api/create-response","title":"DeepSeek full Responses schema"},"s167":{"url":"https://api-docs.deepseek.com/quick_start/token_usage","title":"DeepSeek token usage and local tokenizer"},"s168":{"url":"https://api-docs.deepseek.com/guides/files_api","title":"DeepSeek Files API"},"s169":{"url":"https://docs.cohere.com/sitemap.xml","title":"Cohere complete documentation inventory"},"s170":{"url":"https://docs.cohere.com/docs/deprecations","title":"Cohere endpoint and fine-tuning retirements"},"s171":{"url":"https://docs.cohere.com/reference/list-datasets","title":"Cohere list datasets"},"s172":{"url":"https://docs.cohere.com/reference/delete-dataset","title":"Cohere delete dataset"},"s173":{"url":"https://docs.cohere.com/reference/create-batch","title":"Cohere create generation batch"},"s174":{"url":"https://docs.cohere.com/reference/get-batch","title":"Cohere retrieve generation batch"},"s175":{"url":"https://docs.mistral.ai/sitemap.xml","title":"Mistral complete documentation inventory"},"s176":{"url":"https://docs.mistral.ai/api/endpoint/beta/skills","title":"Mistral Skills API"},"s177":{"url":"https://docs.mistral.ai/api/endpoint/beta/libraries","title":"Mistral Libraries API"},"s178":{"url":"https://docs.mistral.ai/api/endpoint/beta/rag/search_indexes","title":"Mistral RAG search-index API"},"s179":{"url":"https://docs.mistral.ai/api/endpoint/beta/conversations","title":"Mistral hosted Conversations API"},"s180":{"url":"https://docs.mistral.ai/studio/agents/agent-tools/image_generation","title":"Mistral hosted image generation"},"s181":{"url":"https://docs.mistral.ai/api/endpoint/audio/voices","title":"Mistral custom voice API"},"s182":{"url":"https://docs.mistral.ai/studio/agents/agent-tools/websearch","title":"Mistral websearch and website access"},"s183":{"url":"https://docs.mistral.ai/api/endpoint/beta/connectors","title":"Mistral MCP connector API"},"s184":{"url":"https://docs.mistral.ai/resources/cookbooks/concept-deep-dive-tokenization-tokenizer","title":"Mistral local tokenization"},"s185":{"url":"https://docs.mistral.ai/api/endpoint/embeddings","title":"Mistral text-only embeddings request schema"},"s186":{"url":"https://platform.claude.com/docs/en/api/overview","title":"Claude API inventory"},"s187":{"url":"https://platform.claude.com/docs/en/build-with-claude/structured-outputs","title":"Claude structured outputs"},"s188":{"url":"https://platform.claude.com/docs/en/claude_api_primer","title":"Claude Messages prefill"},"s189":{"url":"https://ai.google.dev/api","title":"Gemini Developer API inventory"},"s190":{"url":"https://ai.google.dev/api/interactions-api","title":"Gemini Interactions API reference"},"s191":{"url":"https://ai.google.dev/gemini-api/docs/deep-research","title":"Gemini Deep Research"},"s192":{"url":"https://ai.google.dev/gemini-api/docs/computer-use","title":"Gemini Computer Use"},"s193":{"url":"https://ai.google.dev/gemini-api/docs/live-api/session-management","title":"Gemini Live session and context-window management"},"s194":{"url":"https://ai.google.dev/gemini-api/docs/generate-content/priority-inference","title":"Gemini GenerateContent Priority inference"},"s195":{"url":"https://ai.google.dev/gemini-api/docs/safety-settings","title":"Gemini safety settings"},"s196":{"url":"https://ai.google.dev/api/generate-content","title":"Gemini GenerateContent schema"},"s197":{"url":"https://ai.google.dev/gemini-api/docs/generate-content/music-generation","title":"Lyria music with generateContent"},"s198":{"url":"https://ai.google.dev/gemini-api/docs/models/gemini-2.5-pro-preview-tts","title":"Gemini TTS batch support"},"s199":{"url":"https://ai.google.dev/gemini-api/docs/caching","title":"Gemini caching"},"s200":{"url":"https://ai.google.dev/gemini-api/docs/generate-content/speech-generation","title":"Gemini TTS streaming"},"s201":{"url":"https://ai.google.dev/gemini-api/docs/omni","title":"Gemini Omni video editing"},"s202":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/reference/mcp/tools_list/generate_content","title":"Vertex generateContent request and tool schemas"},"s203":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/reference/models/interactions-api","title":"Vertex AI and Agent Platform API inventory and Interactions reference"},"s204":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/build/managed-agents/interact-with-agents","title":"Vertex managed-agent tools and skills"},"s205":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/agents/use-deep-research","title":"Vertex Deep Research"},"s206":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/partner-models/grok/responses","title":"Vertex Grok Responses"},"s207":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/priority-paygo","title":"Vertex Priority PayGo"},"s208":{"url":"https://platform.claude.com/docs/en/build-with-claude/fast-mode","title":"Claude fast-mode platform restrictions"},"s209":{"url":"https://cloud.google.com/storage/docs/json_api/v1/objects","title":"Cloud Storage object operations"},"s210":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/reference/models/rag-api-v1","title":"Vertex RAG Engine resources"},"s211":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/2-5-flash-image","title":"Vertex Gemini image model batch support"},"s212":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/video/extend-videos","title":"Vertex Omni and Veo extension"},"s213":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/video/edit-videos","title":"Vertex video editing"},"s214":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/context-cache/context-cache-overview","title":"Vertex context caching"},"s215":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/live-api","title":"Vertex Live API"},"s216":{"url":"https://docs.cloud.google.com/text-to-speech/docs/gemini-tts","title":"Gemini TTS API choices"},"s217":{"url":"https://platform.claude.com/docs/en/build-with-claude/task-budgets","title":"Claude task budgets"},"s218":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/security-controls","title":"Vertex generation deployment modes"},"s219":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/models.html","title":"Bedrock model and endpoint inventory"},"s220":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Operations.html","title":"Amazon Bedrock API action inventory"},"s221":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-mantle.html","title":"Bedrock Responses state and background execution"},"s222":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/models-api-compatibility.html","title":"Bedrock model API compatibility"},"s223":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/latency-optimized-inference.html","title":"Bedrock latency-optimized inference"},"s224":{"url":"https://docs.aws.amazon.com/AmazonS3/latest/API/API_Operations_Amazon_Simple_Storage_Service.html","title":"S3 object API operations"},"s225":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_CreateKnowledgeBase.html","title":"Bedrock managed Knowledge Base creation"},"s226":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-anthropic-claude-messages.html","title":"Bedrock Claude Messages parameters"},"s227":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/web-search.html","title":"Bedrock Web Search and Fetch"},"s228":{"url":"https://docs.aws.amazon.com/nova/latest/nova2-userguide/grounding.html","title":"Nova grounding"},"s229":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use-server-side.html","title":"Bedrock Responses server tools and MCP Lambda connectors"},"s230":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-mistral-ai-voxtral-small-24b-2507.html","title":"Bedrock Voxtral model API"},"s231":{"url":"https://developers.deepgram.com/docs/configure-voice-agent","title":"Configure the Voice Agent"},"s232":{"url":"https://developers.deepgram.com/docs/voice-agent-feature-overview","title":"Feature Overview"},"s233":{"url":"https://developers.deepgram.com/asyncapi.json","title":"Dg Asyncapi"},"s234":{"url":"https://developers.deepgram.com/llms.txt","title":"Deepgram complete documentation and API inventory"},"s235":{"url":"https://developers.deepgram.com/openapi.json","title":"REST API API specification"},"s236":{"url":"https://developers.deepgram.com/reference/deepgram-api-overview","title":"Deepgram API Overview"},"s237":{"url":"https://developers.deepgram.com/docs/voice-agent-conversation-context","title":"Maintaining Context"},"s238":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/channel-behavior","title":"Channel behavior"},"s239":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/tools","title":"Tools"},"s240":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/events/client-events","title":"Client events"},"s241":{"url":"https://elevenlabs.io/docs/llms.txt","title":"ElevenLabs complete documentation and API inventory"},"s242":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/multimodal-input","title":"Multimodal input"},"s243":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/llm","title":"Models"},"s244":{"url":"https://elevenlabs.io/docs/eleven-agents/api-reference/agents/create","title":"Create agent"},"s245":{"url":"https://elevenlabs.io/docs/eleven-agents/api-reference/conversations/get","title":"Get conversation details"},"s246":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/knowledge-base/rag","title":"Retrieval-Augmented Generation"},"s247":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/integrations/parallel","title":"Parallel"},"s248":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/tools/code-tools","title":"Code tools"},"s249":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/tools/mcp","title":"ElevenAgents MCP tools"},"s250":{"url":"https://elevenlabs.io/docs/api-reference/flows/image/create","title":"Create Image Generation"},"s251":{"url":"https://elevenlabs.io/docs/api-reference/flows/video/create","title":"Create Video Generation"},"s252":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/procedures","title":"Procedures"},"s253":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/agent-analysis","title":"ElevenAgents conversation analysis"},"s254":{"url":"https://elevenlabs.io/docs/api-reference/music/finetunes/create","title":"Create Music Finetune"},"s255":{"url":"https://elevenlabs.io/docs/eleven-agents/best-practices/guardrails","title":"Guardrails"},"s256":{"url":"https://elevenlabs.io/docs/eleven-agents/api-reference/knowledge-base/compute-rag-index-batch","title":"Compute RAG index in batch"},"s257":{"url":"https://elevenlabs.io/docs/overview/capabilities/image-video","title":"Image & Video"},"s258":{"url":"https://docs.perplexity.ai/openapi-gateway-chat.json","title":"Perplexity Router API (OpenAI-compatible) API specification"},"s259":{"url":"https://docs.perplexity.ai/docs/sonar/media","title":"Media & Attachments"},"s260":{"url":"https://docs.perplexity.ai/openapi-gateway-responses.json","title":"Perplexity Router API (OpenAI Responses-compatible) API specification"},"s261":{"url":"https://docs.perplexity.ai/docs/router/quickstart","title":"Perplexity Router API"},"s262":{"url":"https://docs.perplexity.ai/docs/agent-api/tools/overview","title":"Tools overview"},"s263":{"url":"https://docs.perplexity.ai/api-reference/agent-post","title":"Create Agent Response"},"s264":{"url":"https://docs.perplexity.ai/llms.txt","title":"Perplexity complete documentation and API inventory"},"s265":{"url":"https://docs.perplexity.ai/openapi.json","title":"Perplexity AI API API specification"},"s266":{"url":"https://docs.perplexity.ai/openapi-gateway-messages.json","title":"Perplexity Router API (Anthropic-compatible) API specification"},"s267":{"url":"https://docs.perplexity.ai/docs/agent-api/conversation-state","title":"Conversation state"},"s268":{"url":"https://docs.perplexity.ai/docs/router/routing-and-reliability","title":"Routing & Reliability"},"s269":{"url":"https://openrouter.ai/docs/guides/features/server-tools","title":"Server Tools"},"s270":{"url":"https://openrouter.ai/docs/guides/features/server-tools/shell","title":"Shell"},"s271":{"url":"https://openrouter.ai/docs/guides/features/server-tools/bash","title":"Bash"},"s272":{"url":"https://openrouter.ai/docs/guides/features/server-tools/tool-search","title":"Tool Search"},"s273":{"url":"https://openrouter.ai/docs/api/api-reference/responses/create-a-response","title":"Create a response"},"s274":{"url":"https://openrouter.ai/docs/llms.txt","title":"OpenRouter complete documentation and API inventory"},"s275":{"url":"https://openrouter.ai/docs/guides/overview/multimodal/pdfs","title":"OpenRouter PDF inputs"},"s276":{"url":"https://openrouter.ai/docs/api_reference/responses/overview","title":"OpenRouter Responses API"},"s277":{"url":"https://openrouter.ai/docs/guides/features/classifiers","title":"Custom Classifiers"},"s278":{"url":"https://openrouter.ai/docs/guides/features/service-tiers","title":"OpenRouter service tiers"},"s279":{"url":"https://openrouter.ai/docs/guides/features/files-api","title":"OpenRouter Files API"},"s280":{"url":"https://openrouter.ai/docs/api/reference/parameters","title":"OpenRouter request parameters"},"s281":{"url":"https://openrouter.ai/docs/api/api-reference/video-generation/submit-a-video-generation-request","title":"Submit a video generation request"},"s282":{"url":"https://openrouter.ai/docs/guides/routing/model-fallbacks","title":"OpenRouter model fallbacks"},"s283":{"url":"https://docs.ollama.com/llms.txt","title":"Ollama documentation inventory"},"s284":{"url":"https://github.com/ollama/ollama/releases/tag/v0.33.3","title":"Ollama v0.33.3 release (September 2, 2026)"},"s285":{"url":"https://github.com/ollama/ollama/blob/v0.33.3/openai/openai.go","title":"Ollama v0.33.3 OpenAI request and usage conversion"},"s286":{"url":"https://docs.ollama.com/api/generate","title":"Ollama generation API"},"s287":{"url":"https://github.com/ollama/ollama/blob/v0.33.3/server/routes.go","title":"Ollama v0.33.3 registered inference routes"},"s288":{"url":"https://github.com/ollama/ollama/blob/main/server/routes.go","title":"Ollama main registered inference routes"},"s289":{"url":"https://github.com/ollama/ollama/blob/main/openai/responses_compact.go","title":"Ollama main Responses compaction implementation"},"s290":{"url":"https://github.com/ollama/ollama/blob/v0.33.3/middleware/openai.go","title":"Ollama v0.33.3 transcription middleware and response writer"},"s291":{"url":"https://ollama.com/api/tags","title":"Ollama Cloud model catalog"},"s292":{"url":"https://docs.gpustack.ai/latest/user-guide/built-in-inference-backends/","title":"GPUStack built-in inference backends"},"s293":{"url":"https://docs.vllm.ai/en/latest/examples/tool_calling/openai_responses_client_with_mcp_tools/","title":"vLLM server-side MCP tool examples"},"s294":{"url":"https://docs.gpustack.ai/latest/performance-lab/references/evaluating-lmcache-prefill-acceleration-in-vllm/","title":"GPUStack prefix caching with LMCache"},"s295":{"url":"https://docs.vllm.ai/en/latest/serving/online_serving/openai_compatible_server/","title":"vLLM server API reference"},"s296":{"url":"https://docs.gpustack.ai/latest/using-models/using-audio-models/","title":"GPUStack audio and streaming APIs"},"s297":{"url":"https://docs.vllm.ai/en/latest/serving/online_serving/speech_to_text/","title":"vLLM transcription and realtime APIs"},"s298":{"url":"https://github.com/vllm-project/vllm/blob/main/examples/speech_to_text/openai/openai_transcription_client.py","title":"vLLM transcription client and streamed delta format"},"s299":{"url":"https://gpustack.ai/","title":"GPUStack model ecosystem"},"s300":{"url":"https://docs.vllm.ai/en/latest/models/pooling_models/embed/","title":"vLLM multimodal embedding API"},"s301":{"url":"https://docs.mistral.ai/studio/agents/agent-tools","title":"Mistral hosted tools and supported APIs"},"s302":{"url":"https://docs.mistral.ai/resources/cookbooks/mistral-connectors-05-connectors-in-completions","title":"Mistral multi-completion connector responses"},"s303":{"url":"https://docs.x.ai/docs/guides/tools/collections-search-tool","title":"xAI collection citations"},"s304":{"url":"https://openrouter.ai/docs/api_reference/embeddings","title":"OpenRouter text and image embeddings"},"s305":{"url":"https://github.com/OpenRouterTeam/typescript-sdk/blob/main/src/models/operations/createembeddings.ts","title":"OpenRouter multimodal embedding request schema"},"s306":{"url":"https://developers.openai.com/api/docs/guides/token-counting","title":"OpenAI input-token counting"},"s307":{"url":"https://developers.openai.com/api/reference/resources/responses/subresources/input_tokens/methods/count","title":"OpenAI Responses input_tokens endpoint"},"s308":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/video/generate-videos-from-text","title":"Vertex AI Veo text-to-video prediction jobs"},"s309":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/video/generate-videos-from-an-image","title":"Vertex AI Veo image-to-video requests"},"s310":{"url":"https://github.com/ollama/ollama/blob/v0.33.3/openai/openai.go#L610-L624","title":"Ollama 0.33.3 input_audio request parsing"},"s311":{"url":"https://github.com/vllm-project/vllm/blob/main/examples/speech_to_text/openai/openai_transcription_client.py#L87-L98","title":"vLLM transcription streaming deltas"},"s312":{"title":"Azure OpenAI image and audio REST API reference (2025-04-01-preview)","url":"https://learn.microsoft.com/en-us/azure/foundry/openai/reference-preview"},"s313":{"title":"How to use image generation models from OpenAI on Azure","url":"https://learn.microsoft.com/en-us/azure/foundry/openai/how-to/dall-e"},"s314":{"title":"Router models and cache pricing","url":"https://docs.perplexity.ai/docs/router/models"},"s315":{"title":"Mistral offline transcription and streaming support","url":"https://docs.mistral.ai/studio/audio/speech_to_text/offline_transcription"},"s316":{"title":"Mistral transcription.done event fields","url":"https://github.com/mistralai/client-python/blob/main/src/mistralai/client/models/transcriptionstreamdone.py"},"s317":{"title":"DeepSeek upload fields and limits","url":"https://api-docs.deepseek.com/api/create-file/"},"s318":{"title":"Vertex Gemini Embedding 2 multimodal embeddings: embedContent, modalities and task instructions","url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/embeddings/get-multimodal-embeddings"},"s319":{"title":"Vertex multimodal embedding API contracts","url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/reference/models/multimodal-embeddings-api"},"s320":{"title":"Google Gen AI SDK: Vertex single-content embedContent request and response mapping","url":"https://raw.githubusercontent.com/googleapis/python-genai/main/google/genai/models.py"},"s321":{"title":"Gemini Batch API: asyncBatchEmbedContent and operation lifecycle","url":"https://ai.google.dev/api/batch-api"},"s322":{"title":"Gemini inline embedding batch request/output schema and Struct metadata","url":"https://ai.google.dev/api/embeddings"},"s323":{"title":"Google Gen AI SDK asynchronous embedding batch mappings","url":"https://raw.githubusercontent.com/googleapis/python-genai/main/google/genai/batches.py"},"s324":{"title":"Cohere Parse API: image input, Markdown and blocks output","url":"https://docs.cohere.com/v2/reference/parse"},"s325":{"title":"Cohere Parse quickstart and response access","url":"https://docs.cohere.com/v2/docs/parse-quickstart"},"s326":{"title":"Cohere model catalog: parse-v5.0","url":"https://docs.cohere.com/docs/models"},"s327":{"title":"Cohere Parse public release","url":"https://docs.cohere.com/changelog/parse"},"s328":{"title":"GPUStack 2.1 vLLM-Omni multimodal backends","url":"https://docs.gpustack.ai/2.1/user-guide/built-in-inference-backends/"},"s329":{"title":"vLLM video inputs through Chat Completions","url":"https://docs.vllm.ai/en/stable/features/multimodal_inputs/"},"s330":{"title":"Released vLLM client examples for remote and base64 video URLs","url":"https://docs.vllm.ai/en/v0.12.0/examples/online_serving/openai_chat_completion_client_for_multimodal/"},"s331":{"title":"Stable Diffusion3.5 Large on Bedrock: generation/edit inputs and image outputs","url":"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-diffusion-3-5-large.html"},"s332":{"title":"Stable Image Core1.1 request and response","url":"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-diffusion-stable-image-core-text-image-request-response.html"},"s333":{"title":"Bedrock InvokeModel operation","url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html"},"s334":{"title":"Stability Image Services: inpaint image/mask and alpha-channel behavior","url":"https://docs.aws.amazon.com/bedrock/latest/userguide/stable-image-services.html"},"s335":{"title":"Stable Image Inpaint model and invocation","url":"https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-stability-ai-stable-image-inpaint.html"},"s336":{"title":"Official AWS sample: Mantle Voxtral input_audio with successful transcription and rejected audio_url shape","url":"https://github.com/aws-samples/sample-per-model-bedrock/blob/main/07-mistral/02-devstral-and-voxtral.ipynb"},"s337":{"url":"https://developers.openai.com/api/docs/guides/tools-connectors-mcp","title":"OpenAI remote MCP tools and approvals"},"s338":{"url":"https://learn.microsoft.com/en-us/training/support/mcp-developer-reference","title":"Microsoft Learn read-only MCP server"},"s339":{"url":"https://docs.x.ai/developers/tools/remote-mcp","title":"xAI remote MCP tools"},"s340":{"url":"https://developers.deepgram.com/docs/streaming-the-audio-output","title":"deepgram speech API"},"s341":{"url":"https://elevenlabs.io/docs/api-reference/text-to-speech/stream","title":"elevenlabs speech API"},"s342":{"url":"https://learn.microsoft.com/en-us/azure/foundry-classic/openai/text-to-speech-quickstart?view=foundry-classic","title":"azure speech API"},"s343":{"url":"https://docs.gpustack.ai/2.1/using-models/using-audio-models/","title":"gpustack speech API"},"s344":{"url":"https://docs.x.ai/developers/model-capabilities/video/editing","title":"xAI video editing"},"s345":{"url":"https://docs.x.ai/developers/model-capabilities/imagine/files/inputs","title":"xAI file inputs"},"s346":{"url":"https://docs.x.ai/developers/model-capabilities/video/extension","title":"xAI video extension"},"s347":{"url":"https://docs.x.ai/developers/model-capabilities/audio/text-to-speech","title":"xAI speech generation"},"s348":{"url":"https://ai.google.dev/gemini-api/docs/veo","title":"Gemini Veo video generation and extension"},"s349":{"url":"https://cloud.google.com/vertex-ai/generative-ai/docs/video/extend-a-veo-video","title":"Vertex Veo extension"},"s350":{"url":"https://docs.cohere.com/v1/reference/tokenize","title":"cohere tokenization"},"s351":{"url":"https://developers.openai.com/api/docs/guides/compaction","title":"openai manual compaction"},"s352":{"url":"https://elevenlabs.io/docs/api-reference/flows/image/get","title":"Retrieve an image generation"},"s353":{"url":"https://elevenlabs.io/docs/eleven-api/guides/cookbooks/image-and-video","title":"Image and video API requirements"},"s354":{"url":"https://elevenlabs.io/docs/eleven-api/guides/how-to/image-and-video/references","title":"Media references"},"s355":{"url":"https://elevenlabs.io/docs/api-reference/flows/video/get","title":"Retrieve a video generation"},"s356":{"url":"https://elevenlabs.io/docs/api-reference/assets/create","title":"Create a workspace media asset"},"s357":{"url":"https://elevenlabs.io/docs/api-reference/assets/get","title":"Retrieve a workspace media asset"},"s358":{"url":"https://docs.x.ai/stt-streaming.ws.json","title":"xAI STT WebSocket schema"},"s359":{"url":"https://elevenlabs.io/docs/eleven-api/guides/how-to/speech-to-text/realtime/transcripts-and-commit-strategies","title":"Scribe manual commit boundaries"},"s360":{"url":"https://docs.mistral.ai/studio/search/libraries","title":"Mistral document libraries"},"s361":{"url":"https://raw.githubusercontent.com/mistralai/client-python/main/src/mistralai/client/files.py","title":"Mistral official Files SDK: download /content"},"s362":{"url":"https://docs.mistral.ai/studio/connectors/confirmation","title":"Mistral connector confirmations"},"s363":{"url":"https://ai.google.dev/static/api/interactions.openapi.json","title":"Gemini Interactions OpenAPI schema"},"s364":{"url":"https://ai.google.dev/gemini-api/docs/function-calling#remote-mcp-model-context-protocol","title":"Gemini remote MCP tools"},"s365":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/grounding/grounding-with-vertex-ai-search","title":"Ground Gemini with Vertex AI Search"},"s366":{"url":"https://docs.x.ai/developers/model-capabilities/audio/speech-to-speech","title":"xAI Speech to Speech"},"s367":{"url":"https://docs.x.ai/voice-realtime.ws.json","title":"xAI Voice WebSocket schema"},"s368":{"url":"https://docs.x.ai/developers/advanced-api-usage/websocket-mode","title":"xAI Responses WebSocket mode"},"s369":{"url":"https://docs.cohere.com/reference/create-dataset","title":"Upload and validate a dataset"},"s370":{"url":"https://docs.cohere.com/reference/get-dataset","title":"Dataset metadata and output parts"},"s371":{"url":"https://docs.cohere.com/docs/datasets","title":"Dataset storage limits, validation and retention"},"s372":{"url":"https://developers.deepgram.com/reference/voice-agent/voice-agent","title":"deepgram Voice Agent WebSocket API"},"s373":{"url":"https://developers.deepgram.com/reference/voice-agent/think-models","title":"Voice Agent conversational model inventory"},"s374":{"url":"https://elevenlabs.io/docs/eleven-agents/api-reference/eleven-agents/websocket","title":"elevenlabs Voice Agent WebSocket API"},"s375":{"url":"https://docs.perplexity.ai/docs/agent-api/tools/custom-functions","title":"Perplexity local function calls and exact result replay"},"s376":{"url":"https://docs.perplexity.ai/docs/agent-api/tools/fetch-url-content","title":"Perplexity Agent fetch URL tool"},"s377":{"url":"https://docs.perplexity.ai/docs/agent-api/tools/sandbox","title":"Perplexity sandbox results and generated file downloads"},"s378":{"url":"https://docs.perplexity.ai/docs/agent-api/tools/mcp","title":"Perplexity remote MCP automatic execution"},"s379":{"url":"https://openrouter.ai/api/v1/models","title":"Public catalog including :batch variants"},"s380":{"url":"https://openrouter.ai/docs/guides/features/server-tools/apply-patch","title":"Apply Patch proposal and client output lifecycle"},"s381":{"url":"https://elevenlabs.io/docs/api-reference/conversations/upload-file","title":"Upload a file to an active conversation"},"s382":{"url":"https://elevenlabs.io/docs/api-reference/conversations/get","title":"Stored conversation usage, cost and transcript"},"s383":{"url":"https://github.com/ollama/ollama/commit/4713800b08b2ddf5e14acf8398953cf7b12f169b","title":"Ollama removes experimental image generation"},"s384":{"url":"https://raw.githubusercontent.com/ollama/ollama/v0.33.3/server/routes.go","title":"Released Ollama v0.33.3 request routes"},"s385":{"url":"https://elevenlabs.io/docs/api-reference/agents/create","title":"Source attribution defaults off"},"s386":{"url":"https://elevenlabs.io/docs/changelog/2026/4/27","title":"RAG and knowledge base attribution"},"s387":{"url":"https://raw.githubusercontent.com/gpustack/gpustack/v2.2.3/docs/integrations/inference-apis.md","title":"GPUStack v2.2.3 inference API routes and authenticated model proxy"},"s388":{"url":"https://raw.githubusercontent.com/vllm-project/vllm/v0.28.0/examples/tool_calling/openai_responses_client_with_mcp_tools.py","title":"vLLM v0.28.0 configured MCP examples"},"s389":{"url":"https://raw.githubusercontent.com/vllm-project/vllm/v0.28.0/vllm/entrypoints/openai/responses/context.py","title":"vLLM v0.28.0 MCP session selection and complete MCP result items"},"s390":{"url":"https://raw.githubusercontent.com/vllm-project/vllm/v0.28.0/vllm/entrypoints/openai/responses/serving.py","title":"vLLM v0.28.0 MCP label and allowed-tools selection"},"s391":{"url":"https://raw.githubusercontent.com/vllm-project/vllm/v0.28.0/vllm/entrypoints/openai/responses/harmony.py","title":"vLLM v0.28.0 Harmony result omission and restricted response input types"},"s392":{"url":"https://raw.githubusercontent.com/vllm-project/vllm/v0.28.0/vllm/entrypoints/serve/tokenize/protocol.py","title":"vLLM v0.28.0 text tokenization request and token IDs"},"s393":{"url":"https://raw.githubusercontent.com/vllm-project/vllm-omni/v0.28.0/docs/serving/videos_api.md","title":"vLLM-Omni v0.28.0 multipart video jobs and media inputs"},"s394":{"url":"https://raw.githubusercontent.com/vllm-project/vllm-omni/v0.28.0/vllm_omni/entrypoints/openai/api_server.py","title":"Released vLLM-Omni video form parser, ordered/mixed references and metadata lifecycle"},"s395":{"url":"https://raw.githubusercontent.com/vllm-project/vllm-omni/v0.28.0/vllm_omni/entrypoints/openai/protocol/videos.py","title":"Released vLLM-Omni typed video request and result contract"},"s396":{"url":"https://github.com/cohere-ai/cohere-azure-workshops","title":"Cohere official Azure workshop: supported providers/cohere endpoint and deployment models"},"s397":{"url":"https://docs.cohere.com/v2/reference/embed","title":"Cohere Embed v2 API: v3 images and v4 mixed content"},"s398":{"url":"https://docs.cloud.google.com/generative-ai-app-builder/docs/ranking","title":"Vertex AI Search ranking guide and semantic-ranker-default-004 model"},"s399":{"url":"https://docs.cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/projects.locations.rankingConfigs/rank","title":"Discovery Engine rank request and ranked records response"},"s400":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-luma.html","title":"Bedrock Luma Ray 2 text and image video requests"},"s401":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_StartAsyncInvoke.html","title":"StartAsyncInvoke request, output destination and invocation ARN"},"s402":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_GetAsyncInvoke.html","title":"GetAsyncInvoke status and returned S3 output configuration"},"s403":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_AsyncInvokeS3OutputDataConfig.html","title":"S3 output URI configuration"},"s404":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/batch-inference-supported.html","title":"Bedrock batch support: Titan Text Embeddings V2 and Titan Multimodal Embeddings G1"},"s405":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/batch-inference-data.html","title":"Bedrock batch JSONL recordId and modelInput records"},"s406":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_CreateModelInvocationJob.html","title":"CreateModelInvocationJob: InvokeModel, S3 input/output and idempotency token"},"s407":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_GetModelInvocationJob.html","title":"GetModelInvocationJob: model, invocation type, job name and output prefix"},"s408":{"url":"https://ai.google.dev/gemini-api/docs/live-api/live-transcribe","title":"Google Live transcription"},"s409":{"url":"https://raw.githubusercontent.com/googleapis/python-genai/main/google/genai/live.py","title":"Google SDK Live endpoint and authentication"},"s410":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/3-5-transcribe","title":"Google dedicated transcription API"},"s411":{"url":"https://docs.aws.amazon.com/general/latest/gr/bedrock.html","title":"Bedrock quotas: minimum100recordsforTitanTextEmbeddingsV2andTitanMultimodalEmbeddingG1"},"s412":{"url":"https://docs.perplexity.ai/api-reference/gateway-chat-completions-post","title":"Perplexity Router Chat Completions request, tools, cache and audio contracts"},"s413":{"url":"https://docs.perplexity.ai/api-reference/gateway-messages-post","title":"Router Messages API reference"},"s414":{"url":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/embeddings/batch-prediction-genai-embeddings","title":"Vertex embedding batch inference: supported legacy and Gemini models, JSONL input/output"},"s415":{"url":"https://raw.githubusercontent.com/googleapis/googleapis/master/google/cloud/aiplatform/v1/batch_prediction_job.proto","title":"Official BatchPredictionJob schema: instanceConfig.keyField, modelParameters, labels, output shards and errors"},"s416":{"url":"https://ai.google.dev/api/live","title":"live"},"s417":{"url":"https://ai.google.dev/gemini-api/docs/live-api/best-practices","title":"cost"},"s418":{"url":"https://ai.google.dev/gemini-api/docs/live-api/capabilities","title":"capabilities"},"s419":{"url":"https://api.elevenlabs.io/openapi.json","title":"eleven openapi"},"s420":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/integrations/exa","title":"eleven exa"},"s421":{"url":"https://elevenlabs.io/docs/eleven-agents/customization/personalization/overrides","title":"eleven override"},"s422":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrieveAndGenerate.html","title":"RetrieveAndGenerate request, response, and provider-managed session ID"},"s423":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrieveAndGenerateStream.html","title":"RetrieveAndGenerateStream events and session response header"},"s424":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_CitationEvent.html","title":"Current direct citation event and deprecated nested citation member"},"s425":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_Span.html","title":"Citation answer-span offsets"},"s426":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrievedReference.html","title":"Cited content, source location, and metadata"},"s427":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/model-card-anthropic-claude-haiku-4-5.html","title":"Haiku 4.5 Knowledge Base support and inference profile IDs"},"s428":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_GetInferenceProfile.html","title":"GetInferenceProfile returns the actual inference profile ARN"},"s429":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ApplyGuardrail.html","title":"ApplyGuardrail request, response and action contract"},"s430":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_GuardrailContentFilter.html","title":"Guardrail categorical confidence and actions"},"s431":{"url":"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_GuardrailImageBlock.html","title":"Guardrail PNG/JPEG image blocks"},"s432":{"url":"https://docs.aws.amazon.com/bedrock/latest/userguide/inference-chat-completions-mantle.html","title":"Bedrock Mantle Chat Completions streaming contract"},"s433":{"url":"https://raw.githubusercontent.com/vllm-project/vllm/v0.28.0/vllm/entrypoints/mcp/tool_server.py","title":"allowed_tools filters model-facing descriptions, not execution permissions"},"s434":{"url":"https://learn.microsoft.com/en-us/azure/foundry/foundry-models/concepts/models-sold-directly-by-azure-region-availability?pivots=batch","title":"Current Azure model availability by deployment type"},"s435":{"url":"https://learn.microsoft.com/en-us/rest/api/microsoft-foundry/azureopenai/files","title":"Azure v1 Files REST reference"},"s436":{"title":"OpenAI Sora and Videos API retirement","url":"https://developers.openai.com/api/docs/deprecations#2026-03-24-sora-2-video-generation-models-and-videos-api"},"s437":{"title":"Ollama OpenAI compatibility supported-field checklist","url":"https://docs.ollama.com/api/openai-compatibility.md"},"s438":{"title":"Ollama v0.33.3 ChatCompletionRequest and request conversion","url":"https://github.com/ollama/ollama/blob/v0.33.3/openai/openai.go#L102-L121"}},"working_tree":false,"providers":[{"id":"openai","name":"OpenAI","notes":"The audit covers the public OpenAI inference APIs, built-in tools and their supporting resources, including Responses, media, Files and Batch. Organization, billing, evaluation and training administration are not exhaustively audited.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"Core Chat Completions functionality already existed in 1.16; 2.0 also implements Responses. Availability depends on the chosen model.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"Core Chat Completions functionality already existed in 1.16; 2.0 also implements Responses. Availability depends on the chosen model.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"Core Chat Completions functionality already existed in 1.16; 2.0 also implements Responses. Availability depends on the chosen model.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"Images and PDFs were native attachments in 1.16. Audio conversation input uses compatible Chat Completions audio models; Responses itself does not render audio.","sources":["s2","s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/media.rb","method":"format_attachment"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/media.rb","method":"format_attachment"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/media.rb","method":"format_attachment"}]},"pdf_input":{"v1":"native","v2":"native","offered":true,"notes":"Images and PDFs were native attachments in 1.16. Audio conversation input uses compatible Chat Completions audio models; Responses itself does not render audio.","sources":["s2","s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/media.rb","method":"format_attachment"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/media.rb","method":"format_attachment"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/media.rb","method":"format_attachment"}]},"audio_input":{"v1":"native","v2":"native","offered":true,"notes":"Images and PDFs were native attachments in 1.16. Audio conversation input uses compatible Chat Completions audio models; Responses itself does not render audio.","sources":["s2","s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/media.rb","method":"format_attachment"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/media.rb","method":"format_attachment"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/media.rb","method":"format_attachment"}]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in this audited OpenAI API surface. Video generation and interpreting sampled video frames are separate operations; explicit_cache means a separately created reusable cache resource, not cache boundaries.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already sends reasoning_effort; 2.0 resolves enable/disable and supported levels from model metadata and preserves Responses reasoning state. Raw reasoning visibility depends on the model.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/thinking.rb"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already sends reasoning_effort; 2.0 resolves enable/disable and supported levels from model metadata and preserves Responses reasoning state. Raw reasoning visibility depends on the model.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/thinking.rb"}]},"citations":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 returns typed URL, file-search and container-file citations, including source_id and filename for file references. Sync and streaming parsing preserve text offsets across output parts and retain final-only annotations. 1.16 exposed annotations through the raw response.","sources":["s3"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"parse_completion_response"},{"version":"v2","path":"lib/ruby_llm/citation.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/streaming.rb"}]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"Core Chat Completions functionality already existed in 1.16; 2.0 also implements Responses. Availability depends on the chosen model.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"Core Chat Completions functionality already existed in 1.16; 2.0 also implements Responses. Availability depends on the chosen model.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"Core Chat Completions functionality already existed in 1.16; 2.0 also implements Responses. Availability depends on the chosen model.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"parallel_tool_control":{"v1":"native","v2":"native","offered":true,"notes":"Core Chat Completions functionality already existed in 1.16; 2.0 also implements Responses. Availability depends on the chosen model.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"server_web_search":{"v1":"native","v2":"native","offered":true,"notes":"1.16 can call Chat Completions search models through ordinary chat, with search options passed through. The former search-preview models retired on 2026-07-23; the current Chat Completions replacement is gpt-5-search-api. 2.0 additionally exposes the Responses web_search tool.","sources":["s148"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"server_web_fetch":{"v1":"missing","v2":"native","offered":true,"notes":"Page opening and find-in-page are documented Responses web_search actions on reasoning models. 1.16 only implemented Chat Completions; its non-reasoning search integration did not implement those documented actions. 2.0 preserves the Responses server-tool output.","sources":["s148"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb"}]},"server_code_execution":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 offers named hosted-tool aliases and preserves provider output. File search needs a vector store configured outside RubyLLM.","sources":["s3"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"parse_server_tool_items"}]},"server_file_search":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 offers named hosted-tool aliases and preserves provider output. File search needs a vector store configured outside RubyLLM.","sources":["s3"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"parse_server_tool_items"}]},"server_mcp":{"v1":"missing","v2":"native","offered":true,"notes":"The mcp alias connects remote tools. Pending approvals appear in pending_approvals with server/name/arguments; approve or deny then complete resumes through provider-owned decision items. Completed remote calls remain ServerToolCall. Local tools with matching names never execute. Supports stateless history replay, streaming and Rails/Agent persistence. Fresh gpt-5-nano live approval, denial and streamed continuation all passed.","sources":["s3","s337","s338"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"parse_server_tool_items"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/approvals.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/chat.rb"},{"version":"v2","path":"lib/ruby_llm/tool_call.rb"},{"version":"v2","path":"lib/ruby_llm/active_record/chat_methods.rb"},{"version":"v2","path":"lib/ruby_llm/active_record/tool_call.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gpt-5-nano","spec":"spec/ruby_llm/chat_mcp_spec.rb","example":"RubyLLM::Chat remote MCP tools openai executes a remote read-only tool after approval using stateless continuation","cassette":"spec/fixtures/vcr_cassettes/chat_remote_mcp_tools_openai_executes_a_remote_read-only_tool_after_approval_using_stateless_continuation.yml","notes":"Fresh provider calls, 2 HTTP 200 responses; public read-only Microsoft Learn MCP tool. Approval continuation uses replayed history with store:false."},{"status":"passed","recorded_on":"2026-09-07","model":"gpt-5-nano","spec":"spec/ruby_llm/chat_mcp_spec.rb","example":"RubyLLM::Chat remote MCP tools openai denies a remote call without executing it","cassette":"spec/fixtures/vcr_cassettes/chat_remote_mcp_tools_openai_denies_a_remote_call_without_executing_it.yml","notes":"Fresh provider calls, 2 HTTP 200 responses; public read-only Microsoft Learn MCP tool. Approval continuation uses replayed history with store:false."},{"status":"passed","recorded_on":"2026-09-07","model":"gpt-5-nano","spec":"spec/ruby_llm/chat_mcp_spec.rb","example":"RubyLLM::Chat remote MCP tools openai streams a remote approval and its completed result","cassette":"spec/fixtures/vcr_cassettes/chat_remote_mcp_tools_openai_streams_a_remote_approval_and_its_completed_result.yml","notes":"Fresh provider calls, 2 HTTP 200 responses; public read-only Microsoft Learn MCP tool. Approval continuation uses replayed history with store:false."}]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"Automatic cache reuse and cache-read accounting existed in 1.16. 2.0 adds named cache-key/options controls; options vary by model.","sources":["s4"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"cache_read_tokens"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"apply_prompt_cache_params"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"prompt_cache_params"}]},"cache_boundaries":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 renders cache_until_here boundaries and explicit mode for GPT-5.6 and later. Earlier models do not accept these fields. Raw content/options were the only possible route in 1.16.","sources":["s4"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/media.rb","method":"format_content"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"inject_cache_breakpoint"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"format_message_content"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in this audited OpenAI API surface. Video generation and interpreting sampled video frames are separate operations; explicit_cache means a separately created reusable cache resource, not cache boundaries.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"}]},"compaction":{"v1":"missing","v2":"native","offered":true,"notes":"with_compaction enables provider-managed threshold compaction and preserves its output for subsequent turns. Chat#compact explicitly invokes Responses /compact. Native full compaction envelope resets only subsequent wire context; all historical messages and current instructions retained. Rails Agent.find/reload, multiple rounds, usage persistence and cancellation unit-tested. Pending local/MCP tool calls block compaction. Automatic with_compaction support remains separate and provider-specific.","sources":["s1","s351"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"apply_compaction"},{"version":"v2","path":"lib/ruby_llm/chat.rb"},{"version":"v2","path":"lib/ruby_llm/active_record/chat_methods.rb"},{"version":"v2","path":"lib/ruby_llm/agent.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/compaction.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai/responses.rb"}],"verification":[{"status":"passed","model":"gpt-5-nano","spec":"spec/ruby_llm/chat_compact_spec.rb","example":"compacts and continues a conversation with openai","cassette":"spec/fixtures/vcr_cassettes/chat_compacts_and_continues_a_conversation_with_openai.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: manual compact returns typed assistant Message, native response.compaction envelope preserved, all original history retained, positive compaction input usage, continued response recalls Thimble and has positive input usage."}]},"token_counting":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 count_tokens uses the Responses input_tokens endpoint and returns the provider count before generation. Fresh requests verified staged text, instructions/function tools/JSON Schema, and image input. The shared count API does not forward hosted server tools, provider_options, compaction or before_request changes. Other Responses providers do not inherit this OpenAI-only endpoint.","sources":["s306","s307","s5"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/token_counting.rb"},{"version":"v2","path":"spec/ruby_llm/providers/openai/responses_spec.rb"}]},"image_generation":{"v1":"native","v2":"native","offered":true,"notes":"Both generation and reference-image/mask editing existed in 1.16. 2.0 also exposes multiple returned images.","sources":["s3"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/images.rb"}]},"image_editing":{"v1":"native","v2":"native","offered":true,"notes":"Both generation and reference-image/mask editing existed in 1.16. 2.0 also exposes multiple returned images.","sources":["s3"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/images.rb"}]},"video_generation":{"v1":"deprecated","v2":"deprecated","offered":true,"notes":"OpenAI deprecated Sora and the Videos API on March 24, 2026, with shutdown scheduled for September 24, 2026. Excluded from new integration work. The endpoint remains documented as available until that date; this is a retirement exclusion, not a claim that it has already shut down.","sources":["s436","s6"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb"}]},"speech":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 adds RubyLLM.speak and binary audio results.","sources":["s2"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/speech.rb"}]},"transcription":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already handled diarized_json and known speaker names/references.","sources":["s2"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"}]},"streaming_transcription":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 streams prerecorded file transcription into TranscriptionChunk objects and a final Transcription result. Real-time audio sessions are a separate unsupported transport, recorded under realtime.","sources":["s2"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"}]},"diarization":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already handled diarized_json and known speaker names/references.","sources":["s2"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"}]},"moderation":{"v1":"native","v2":"native","offered":true,"notes":"1.16 provides working text moderation through RubyLLM.moderate. 2.0 also adds image attachments and typed Moderation::Result values; those additions do not make the original text operation partial.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/moderation.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/moderation.rb"}]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in this audited OpenAI API surface. Video generation and interpreting sampled video frames are separate operations; explicit_cache means a separately created reusable cache resource, not cache boundaries.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"}]},"embeddings":{"v1":"native","v2":"native","offered":true,"notes":"Text embeddings and dimensions already supported in 1.16.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/embeddings.rb"}]},"multimodal_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in this audited OpenAI API surface. Video generation and interpreting sampled video frames are separate operations; explicit_cache means a separately created reusable cache resource, not cache boundaries.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"}]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in this audited OpenAI API surface. Video generation and interpreting sampled video frames are separate operations; explicit_cache means a separately created reusable cache resource, not cache boundaries.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"}]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 implements upload, metadata retrieval and content download.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/openai/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 implements upload, metadata retrieval and content download.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/openai/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"chat_batches":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 supports Responses, Chat Completions and embeddings batch endpoints.","sources":["s7"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb","method":"batch_protocol_name_for"}]},"embedding_batches":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 supports Responses, Chat Completions and embeddings batch endpoints.","sources":["s7"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb","method":"batch_protocol_name_for"}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated advisor tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Perplexity Agent API; it is not an API of this provider.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"agent_skills":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Externally prepared skill references can be attached to hosted shell through raw environment.skills tool options. RubyLLM has no dedicated Skills upload/version-management API.","sources":["s138"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"async_research":{"v1":"missing","v2":"partial","offered":true,"notes":"Long research can run through Responses background mode, but RubyLLM has no response retrieval/cancellation/polling lifecycle. Setting background through provider_options alone does not complete the research job.","sources":["s139","s140"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"}]},"background_responses":{"v1":"missing","v2":"partial","offered":true,"notes":"Wire fields can pass through, but RubyLLM normally uses store:false and has no public response retrieval/polling or hosted conversation resource lifecycle.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"render"}]},"browser_use":{"v1":"missing","v2":"partial","offered":true,"notes":"Raw Responses tool definitions can be sent. RubyLLM does not implement the dedicated client computer-action/apply-patch result types and execution loops; these output items are recorded as ServerToolCall rather than dispatched as local Ruby tools.","sources":["s141","s142"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated classification operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"computer_use":{"v1":"missing","v2":"partial","offered":true,"notes":"Raw Responses tool definitions can be sent. RubyLLM does not implement the dedicated client computer-action/apply-patch result types and execution loops; these output items are recorded as ServerToolCall rather than dispatched as local Ruby tools.","sources":["s141","s142"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context editing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated contextual embeddings operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"dedicated_transcription_api":{"v1":"native","v2":"native","offered":true,"notes":"The audio/transcriptions endpoint is a dedicated file transcription operation in both versions. This row overlaps transcription and should not be counted as another feature gain.","sources":["s143"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dubbing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"fast_inference":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Fast/Priority processing is selected with the service_tier request parameter, available through with_params in 1.16 and provider_options in 2.0. RubyLLM has no dedicated public Fast mode switch.","sources":["s144"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/chat.rb"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"File listing/deletion and vector-store lifecycle/search APIs are not provided by the public file abstraction. Hosted file_search can use externally prepared vector stores.","sources":["s3"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"},{"version":"v2","path":"lib/ruby_llm/uploaded_file.rb"}]},"file_search_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"OpenAI vector stores have a separate creation, indexing and search lifecycle. RubyLLM can use a prepared vector_store_id with file_search but cannot manage the store.","sources":["s145"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fill-in-the-middle completion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"fine_tuning":{"v1":"missing","v2":"missing","offered":true,"notes":"No Realtime/WebSocket transport or fine-tuning job management API. Calling an already fine-tuned model is supported separately. Treat training and administration as scope boundaries.","sources":["s2","s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Maps grounding; it is not an API of this provider.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated guardrail configuration operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"hosted_conversations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"OpenAI documents provider-managed conversation storage or hosted conversation resources. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"image_batches":{"v1":"missing","v2":"missing","offered":true,"notes":"The Batch API also accepts image generation, image edits, moderation and legacy completions. RubyLLM only registers Responses, Chat Completions and embedding batches.","sources":["s7"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"}]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Interactions API; it is not an API of this provider.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"json_mode":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Schema-based structured output has its own API; raw JSON-object response mode uses provider options (with_params in 1.16).","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Amazon Bedrock Mantle; it is not an API of this provider.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"manual_compaction":{"v1":"missing","v2":"native","offered":true,"notes":"Chat#compact explicitly invokes Responses /compact. Native full compaction envelope resets only subsequent wire context; all historical messages and current instructions retained. Rails Agent.find/reload, multiple rounds, usage persistence and cancellation unit-tested. Pending local/MCP tool calls block compaction. Automatic with_compaction support remains separate and provider-specific.","sources":["s1","s351"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"apply_compaction"},{"version":"v2","path":"lib/ruby_llm/chat.rb"},{"version":"v2","path":"lib/ruby_llm/active_record/chat_methods.rb"},{"version":"v2","path":"lib/ruby_llm/agent.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/compaction.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai/responses.rb"}],"verification":[{"status":"passed","model":"gpt-5-nano","spec":"spec/ruby_llm/chat_compact_spec.rb","example":"compacts and continues a conversation with openai","cassette":"spec/fixtures/vcr_cassettes/chat_compacts_and_continues_a_conversation_with_openai.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: manual compact returns typed assistant Message, native response.compaction envelope preserved, all original history retained, positive compaction input usage, continued response recalls Thimble and has positive input usage."}]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated music generation operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"nonchat_batches":{"v1":"missing","v2":"missing","offered":true,"notes":"The Batch API also accepts image generation, image edits, moderation and legacy completions. RubyLLM only registers Responses, Chat Completions and embedding batches.","sources":["s7"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"}]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Omni video endpoint; it is not an API of this provider.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated partner model protocols operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"prefix_completion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated prefix completion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"programmatic_tool_calling":{"v1":"missing","v2":"partial","offered":true,"notes":"Raw hosted-tool definitions can be sent; specialized client tool output types and control loops are not first-class. Do not equate raw hash acceptance with a complete tool implementation.","sources":["s3"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/tools/server_tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"parse_server_tool_items"}]},"prompt_cache_controls":{"v1":"passthrough","v2":"native","offered":true,"notes":"Chat Completions wire cache controls pass through with_params in 1.16; 2.0 exposes with_caching and maps supported key/mode/retention options. Model restrictions still apply.","sources":["s4"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"}]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated provider-managed fallback operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"realtime":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"OpenAI documents realtime conversations. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s2","s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated response caching operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"responses":{"v1":"missing","v2":"native","offered":true,"notes":"Responses is the default OpenAI chat protocol in 2.0; selected audio/realtime/search-preview model IDs retain Chat Completions routing.","sources":["s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb","method":"protocol_for"}]},"responses_batches":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 registers a dedicated Responses batch serializer and lifecycle.","sources":["s7"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/batches.rb"}]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone search api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"server_apply_patch":{"v1":"missing","v2":"partial","offered":true,"notes":"Raw Responses tool definitions can be sent. RubyLLM does not implement the dedicated client computer-action/apply-patch result types and execution loops; these output items are recorded as ServerToolCall rather than dispatched as local Ruby tools.","sources":["s141","s142"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"server_tool_image_generation":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 offers named hosted-tool aliases and preserves provider output. File search needs a vector store configured outside RubyLLM.","sources":["s3"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"parse_server_tool_items"}]},"server_tool_search":{"v1":"missing","v2":"partial","offered":true,"notes":"The hosted tool_search definition and defer_loading fields can pass through raw tools. RubyLLM has no dedicated deferred-tool registry or namespace-aware dispatch; function-call namespace information is not normalized into ToolCall.","sources":["s146"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated x search tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"shell_computer_tools":{"v1":"missing","v2":"partial","offered":true,"notes":"Raw hosted-tool definitions can be sent; specialized client tool output types and control loops are not first-class. Do not equate raw hash acceptance with a complete tool implementation.","sources":["s3"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/tools/server_tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"parse_server_tool_items"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated sound effects operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"streaming_speech":{"v1":"missing","v2":"native","offered":true,"notes":"Block on speak yields typed SpeechChunk bytes incrementally and returns the complete Speech; binary HTTP transport validates status/content type, preserves binary encoding and refuses retries after audio delivery.","sources":["s147"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/speech.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gpt-4o-mini-tts","spec":"spec/ruby_llm/speech_streaming_spec.rb","example":"RubyLLM::Speech streams speech from openai","cassette":"spec/fixtures/vcr_cassettes/speech_streams_speech_from_openai.yml","notes":"Fresh API recording plus independent HTTP probe: 106 chunks, 120192 bytes, first audio after 0.69s; joined bytes match the complete Speech."}]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated task budgets operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated text analysis api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"vector_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"File listing/deletion and vector-store lifecycle/search APIs are not provided by the public file abstraction. Hosted file_search can use externally prepared vector stores.","sources":["s3"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"},{"version":"v2","path":"lib/ruby_llm/uploaded_file.rb"}]},"video_batches":{"v1":"deprecated","v2":"deprecated","offered":true,"notes":"OpenAI deprecated Sora and the Videos API on March 24, 2026, with shutdown scheduled for September 24, 2026. Excluded from new integration work. The endpoint remains documented as available until that date; this is a retirement exclusion, not a claim that it has already shut down.","sources":["s436","s6"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb"}]},"video_editing":{"v1":"deprecated","v2":"deprecated","offered":true,"notes":"OpenAI deprecated Sora and the Videos API on March 24, 2026, with shutdown scheduled for September 24, 2026. Excluded from new integration work. The endpoint remains documented as available until that date; this is a retirement exclusion, not a claim that it has already shut down.","sources":["s436","s6"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb"}]},"video_extension":{"v1":"deprecated","v2":"deprecated","offered":true,"notes":"OpenAI deprecated Sora and the Videos API on March 24, 2026, with shutdown scheduled for September 24, 2026. Excluded from new integration work. The endpoint remains documented as available until that date; this is a retirement exclusion, not a claim that it has already shut down.","sources":["s436","s6"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb"}]},"voice_cloning":{"v1":"missing","v2":"missing","offered":true,"notes":"OpenAI documents custom voice creation from consent and sample audio for eligible customers. RubyLLM has no voice/consent creation lifecycle; using an externally created voice is a separate speech option.","sources":["s147"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/speech.rb"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice conversion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone web fetch api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: OpenAI hosted inference APIs; excludes ChatGPT, Codex CLI, Agents SDK-only helpers and administration. Fine-tuning is recorded separately as a boundary.","sources":["s137"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"}]},"websockets":{"v1":"missing","v2":"missing","offered":true,"notes":"No Realtime/WebSocket transport or fine-tuning job management API. Calling an already fine-tuned model is supported separately. Treat training and administration as scope boundaries.","sources":["s2","s1"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openai.rb"}]}},"gaps":[{"notes":"Agent skills: Externally prepared skill references can be attached to hosted shell through raw environment.skills tool options. RubyLLM has no dedicated Skills upload/version-management API.","sources":["s138"]},{"notes":"Asynchronous research: Long research can run through Responses background mode, but RubyLLM has no response retrieval/cancellation/polling lifecycle. Setting background through provider_options alone does not complete the research job.","sources":["s139","s140"]},{"notes":"Background Responses jobs: Wire fields can pass through, but RubyLLM normally uses store:false and has no public response retrieval/polling or hosted conversation resource lifecycle.","sources":["s1"]},{"notes":"Browser use, Computer use, Apply patch tool: Raw Responses tool definitions can be sent. RubyLLM does not implement the dedicated client computer-action/apply-patch result types and execution loops; these output items are recorded as ServerToolCall rather than dispatched as local Ruby tools.","sources":["s141","s142"]},{"notes":"Fast inference: Fast/Priority processing is selected with the service_tier request parameter, available through with_params in 1.16 and provider_options in 2.0. RubyLLM has no dedicated public Fast mode switch.","sources":["s144"]},{"notes":"File listing and deletion, Vector store management: File listing/deletion and vector-store lifecycle/search APIs are not provided by the public file abstraction. Hosted file_search can use externally prepared vector stores.","sources":["s3"]},{"notes":"File search store management: OpenAI vector stores have a separate creation, indexing and search lifecycle. RubyLLM can use a prepared vector_store_id with file_search but cannot manage the store.","sources":["s145"]},{"notes":"Fine-tuning, Responses over WebSocket: No Realtime/WebSocket transport or fine-tuning job management API. Calling an already fine-tuned model is supported separately. Treat training and administration as scope boundaries.","sources":["s2","s1"]},{"notes":"Image batches, Other batch operations: The Batch API also accepts image generation, image edits, moderation and legacy completions. RubyLLM only registers Responses, Chat Completions and embedding batches.","sources":["s7"]},{"notes":"JSON object mode: Schema-based structured output has its own API; raw JSON-object response mode uses provider options (with_params in 1.16).","sources":["s1"]},{"notes":"Programmatic tool calling, Shell and computer tools: Raw hosted-tool definitions can be sent; specialized client tool output types and control loops are not first-class. Do not equate raw hash acceptance with a complete tool implementation.","sources":["s3"]},{"notes":"Tool search: The hosted tool_search definition and defer_loading fields can pass through raw tools. RubyLLM has no dedicated deferred-tool registry or namespace-aware dispatch; function-call namespace information is not normalized into ToolCall.","sources":["s146"]},{"notes":"Voice cloning: OpenAI documents custom voice creation from consent and sample audio for eligible customers. RubyLLM has no voice/consent creation lifecycle; using an externally created voice is a separate speech option.","sources":["s147"]}]},{"id":"anthropic","name":"Anthropic","notes":"The audit includes the direct Claude Messages, Files, Batches and Managed Agents APIs. Built-in coverage is conditional on supported models and documented restrictions; new API offerings are compared against both codebases. Organization and billing administration are outside scope.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"Available in 1.16.0. 2.0 keeps these operations and adds a shared enable/disable thinking switch, model-resolved controls, and display options. Model restrictions apply.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"Available in 1.16.0. 2.0 keeps these operations and adds a shared enable/disable thinking switch, model-resolved controls, and display options. Model restrictions apply.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"Available in 1.16.0. 2.0 keeps these operations and adds a shared enable/disable thinking switch, model-resolved controls, and display options. Model restrictions apply.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"Available in 1.16.0. 2.0 keeps these operations and adds a shared enable/disable thinking switch, model-resolved controls, and display options. Model restrictions apply.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb"}]},"pdf_input":{"v1":"native","v2":"native","offered":true,"notes":"Available in 1.16.0. 2.0 keeps these operations and adds a shared enable/disable thinking switch, model-resolved controls, and display options. Model restrictions apply.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb"}]},"audio_input":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"Available in 1.16.0. 2.0 keeps these operations and adds a shared enable/disable thinking switch, model-resolved controls, and display options. Model restrictions apply.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"Available in 1.16.0. 2.0 keeps these operations and adds a shared enable/disable thinking switch, model-resolved controls, and display options. Model restrictions apply.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb"}]},"citations":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 required raw document blocks and inspecting message.raw. 2.0 enables citable documents with with_citations and returns normalized Citation values, including streamed citations.","sources":["s35"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb","method":"format_content"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb","method":"enable_citations"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb","method":"extract_text_and_citations"}]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"Available in 1.16.0. 2.0 keeps these operations and adds a shared enable/disable thinking switch, model-resolved controls, and display options. Model restrictions apply.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"Available in 1.16.0. 2.0 keeps these operations and adds a shared enable/disable thinking switch, model-resolved controls, and display options. Model restrictions apply.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"Available in 1.16.0. 2.0 keeps these operations and adds a shared enable/disable thinking switch, model-resolved controls, and display options. Model restrictions apply.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/anthropic/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/media.rb"}]},"parallel_tool_control":{"v1":"native","v2":"native","offered":true,"notes":"calls: :one maps to disable_parallel_tool_use on supported tool-choice modes.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/tools.rb","method":"build_tool_choice"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"build_tool_choice"}]},"server_web_search":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 could inject tools with with_params but lacked typed server-tool blocks, automatic pause_turn continuation, and preserved server-tool history. 2.0 supplies named aliases, ServerToolCall values and continuation handling.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/provider.rb","method":"complete"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES and complete"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb","method":"extract_server_tool_calls"}]},"server_web_fetch":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 could inject tools with with_params but lacked typed server-tool blocks, automatic pause_turn continuation, and preserved server-tool history. 2.0 supplies named aliases, ServerToolCall values and continuation handling.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/provider.rb","method":"complete"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES and complete"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb","method":"extract_server_tool_calls"}]},"server_code_execution":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 could inject tools with with_params but lacked typed server-tool blocks, automatic pause_turn continuation, and preserved server-tool history. 2.0 supplies named aliases, ServerToolCall values and continuation handling.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/provider.rb","method":"complete"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES and complete"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb","method":"extract_server_tool_calls"}]},"server_file_search":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"server_mcp":{"v1":"passthrough","v2":"native","offered":true,"notes":"The mcp alias configures the MCP server and matching toolset with the required beta header. Tool selection uses default_config/configs. Remote execution results and raw history replay are supported. Fresh live Microsoft Learn documentation search and subsequent conversation replay passed.","sources":["s36"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"claude-haiku-4-5","spec":"spec/ruby_llm/chat_mcp_spec.rb","example":"RubyLLM::Chat remote MCP execution anthropic executes a read-only tool and replays its history","cassette":"spec/fixtures/vcr_cassettes/chat_remote_mcp_execution_anthropic_executes_a_read-only_tool_and_replays_its_history.yml","notes":"Fresh read-only Microsoft Learn MCP search, typed remote results and successful follow-up replay. Provider-supported direct execution, no approval-mode claim."}]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already had Providers::Anthropic::Content.new(cache: true) plus cache token accounting. 2.0 adds shared with_caching and cache_until_here APIs, automatic top-level caching and TTL options. Repeated-prefix, token-minimum and TTL rules still apply.","sources":["s37"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/content.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb","method":"prompt_cache_control and inject_cache_control"}]},"cache_boundaries":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already had Providers::Anthropic::Content.new(cache: true) plus cache token accounting. 2.0 adds shared with_caching and cache_until_here APIs, automatic top-level caching and TTL options. Repeated-prefix, token-minimum and TTL rules still apply.","sources":["s37"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic/content.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb","method":"prompt_cache_control and inject_cache_control"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"compaction":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 could inject context_management and beta header but did not preserve compaction response blocks. 2.0 with_compaction renders compact_20260112 and keeps compaction blocks in conversation history.","sources":["s38"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb","method":"apply_compaction, compaction_edit, server_tool_block?"}]},"token_counting":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 calls Messages count_tokens before generation.","sources":["s33"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb","method":"count_tokens_url, render_count_tokens_payload"}]},"image_generation":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"image_editing":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"video_generation":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"speech":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"transcription":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"streaming_transcription":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"diarization":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Anthropic explicitly says it has no embedding model and links to Voyage AI instead; do not count Voyage as Anthropic.","sources":["s34"],"code":[]},"multimodal_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Anthropic explicitly says it has no embedding model and links to Voyage AI instead; do not count Voyage as Anthropic.","sources":["s34"],"code":[]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 supports upload, metadata lookup, download and file_id attachments; no list/delete methods. Anthropic permits downloading generated files, not files you uploaded.","sources":["s39"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 supports upload, metadata lookup, download and file_id attachments; no list/delete methods. Anthropic permits downloading generated files, not files you uploaded.","sources":["s39"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"chat_batches":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 implements Message Batches creation, lookup, cancellation and ordered typed results; mixed models are supported.","sources":["s33"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/batches.rb"}]},"embedding_batches":{"v1":"na","v2":"na","offered":false,"notes":"No Anthropic embedding endpoint.","sources":["s34"],"code":[]},"advisor_tool":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"function_for"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"}]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Perplexity Agent API.","sources":["s186"],"code":[]},"agent_skills":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"function_for"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"}]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"browser_use":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"function_for"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"}]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"computer_use":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"function_for"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"}]},"context_editing":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"function_for"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"dedicated_transcription_api":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"fast_inference":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"function_for"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Provider exposes file listing and deletion. RubyLLM implements upload, metadata lookup and download, but not list/delete operations.","sources":["s39"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"},{"version":"v2","path":"lib/ruby_llm/uploaded_file.rb"}]},"file_search_store_management":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"hosted_conversations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Anthropic documents provider-managed conversation storage or hosted conversation resources. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s186"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"}]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Google Interactions API.","sources":["s186"],"code":[]},"json_mode":{"v1":"na","v2":"na","offered":false,"notes":"JSON-schema structured output exists; no separate JSON-object mode documented.","sources":["s187"],"code":[]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Amazon Bedrock Mantle.","sources":["s186"],"code":[]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"Documented compaction is threshold-triggered Messages context management, without a separate manual compact endpoint.","sources":["s38"],"code":[]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Google Gemini Omni.","sources":["s186"],"code":[]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"prefix_completion":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Older Claude models accept a final assistant prefill. Raw messages work in 1.16; 2.0 can add an assistant message before generate. Claude 4.6 and newer reject prefill.","sources":["s188"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/providers/anthropic.rb"}]},"programmatic_tool_calling":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"function_for"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"}]},"prompt_cache_controls":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 supports explicit cache markers with its Content helper; richer TTL and top-level settings need raw options. 2.0 exposes caching configuration and boundaries.","sources":["s37"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/providers/anthropic.rb"}]},"provider_server_fallback":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"function_for"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"}]},"realtime":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding first-party Claude inference endpoint identified. Text extracted through vision or files produced by code execution do not count as dedicated OCR or media generation APIs.","sources":["s33"],"code":[]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"responses":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"server_tool_search":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"function_for"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"shell_computer_tools":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Claude exposes client-executed bash, text editor and computer tools. Provider declarations and application execution are required.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/providers/anthropic.rb"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"streaming_speech":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"task_budgets":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"function_for"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic.rb","method":"SERVER_TOOL_ALIASES"}]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"vector_store_management":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"video_editing":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"voice_cloning":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s186"],"code":[]}},"gaps":[{"notes":"Advisor tool, Agent skills, Browser use, Computer use, Context editing, Fast inference, Programmatic tool calling, Provider-managed fallback, Tool search, Task budgets: No named common RubyLLM operation found. Provider-specific tool declarations, tool provider_options, payload options or headers are required. These interfaces may additionally need caller-managed lifecycle or output parsing; they are not counted as native coverage.","sources":["s33","s40"]},{"notes":"File listing and deletion: Provider exposes file listing and deletion. RubyLLM implements upload, metadata lookup and download, but not list/delete operations.","sources":["s39"]},{"notes":"Prefix completion: Older Claude models accept a final assistant prefill. Raw messages work in 1.16; 2.0 can add an assistant message before generate. Claude 4.6 and newer reject prefill.","sources":["s188"]},{"notes":"Shell and computer tools: Claude exposes client-executed bash, text editor and computer tools. Provider declarations and application execution are required.","sources":["s33"]}]},{"id":"gemini","name":"Gemini","notes":"The audit covers the Gemini Developer API, including generateContent, stateless Interactions, media, files, caches and batches. One-shot Live transcription remains supported. Live conversations and provider-managed conversation storage are outside this release; other Google Cloud products are outside this provider inventory.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"pdf_input":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"audio_input":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"video_input":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"citations":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 returned grounding only in raw response. 2.0 normalizes grounding metadata into Citation values; Enable a grounding tool such as with_server_tools(:web_search) to obtain sources; with_citations alone does not add Search.","sources":["s43"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"extract_citations, support_citations, render_payload"}]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"1.16.0 already implements generateContent, multimodal attachments, tools, structured output and thinking budget/effort. 2.0 expands controls and preserves per-tool thinking signatures. Availability remains model-specific.","sources":["s41","s42"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/streaming.rb"}]},"parallel_tool_control":{"v1":"na","v2":"na","offered":false,"notes":"generateContent exposes neither an Anthropic-style cache breakpoint nor a switch disabling parallel calls. cache_until_here is accepted by RubyLLM but does not set a Gemini cache boundary.","sources":["s47","s42"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"maybe_log_implicit_caching_note"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb","method":"build_tool_config"}]},"server_web_search":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 provides web_search/google_search aliases and normalized grounding metadata; 1.16 needed tools in with_params.","sources":["s43"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"}]},"server_web_fetch":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 provides web_fetch/url_context aliases; supported URLs and models follow Google restrictions.","sources":["s44"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"}]},"server_code_execution":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 has a code_execution alias and returns server execution blocks.","sources":["s45"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"extract_server_tool_calls"}]},"server_file_search":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 file_search alias can use an existing provider file-search store and parse grounding. RubyLLM does not implement creating stores, importing their documents or their full lifecycle; RubyLLM.upload targets ordinary Files, not File Search ingestion.","sources":["s46"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/files.rb"}]},"server_mcp":{"v1":"missing","v2":"native","offered":true,"notes":"The opt-in :interactions protocol exposes with_server_tools(mcp: {name:, url:}) for Streamable HTTP remote MCP. Native calls/results, streamed steps, exact usage and stateless replay are implemented and live-verified with Gemini3.8 Flash. Remote allowed tools execute automatically; this provider contract has no approval-request lifecycle. Default generateContent is unchanged.","sources":["s42","s190","s363","s364"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"completion_url"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/content.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.8-flash","spec":"spec/ruby_llm/protocols/interactions_spec.rb","example":"executes a remote MCP tool and replays its signed results through stateless chat","cassette":"spec/fixtures/vcr_cassettes/protocols_interactions_executes_a_remote_mcp_tool_and_replays_its_signed_results_through_stateless_chat.yml","notes":"Fresh Microsoft Learn MCP execution returned actual call/result steps, then a second user turn used those results. MCP output signatures remain in raw history but are omitted from input as required by the input schema; thought signatures are retained."},{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.8-flash","spec":"spec/ruby_llm/protocols/interactions_spec.rb","example":"streams remote MCP results and preserves the complete signed history","cassette":"spec/fixtures/vcr_cassettes/protocols_interactions_streams_remote_mcp_results_and_preserves_the_complete_signed_history.yml","notes":"Fresh SSE execution reconstructed call, result, thought and model-output steps; text chunks equal final assistant text and actual prompt/tool/thought usage is normalized."}]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"Implicit caching already applied at the provider and 1.16 parsed cached token counts. 2.0 adds the shared API and explicit cache-resource lifecycle. Neither version makes an ineligible model/prompt cacheable.","sources":["s47"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb","method":"parse_completion_response"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"maybe_log_implicit_caching_note"}]},"cache_boundaries":{"v1":"na","v2":"na","offered":false,"notes":"generateContent exposes neither an Anthropic-style cache breakpoint nor a switch disabling parallel calls. cache_until_here is accepted by RubyLLM but does not set a Gemini cache boundary.","sources":["s47","s42"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"maybe_log_implicit_caching_note"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/tools.rb","method":"build_tool_config"}]},"explicit_cache":{"v1":"partial","v2":"native","offered":true,"notes":"1.16 could reference an externally-created cache with with_params(cachedContent: ...); 2.0 RubyLLM.cache supports create/find/update/delete and with_caching(id: cache).","sources":["s47"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/caches.rb"},{"version":"v2","path":"lib/ruby_llm/cached_content.rb"}]},"compaction":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Gemini Live provides context compaction through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s193","s416","s417"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"}]},"token_counting":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 implements countTokens including rendered tools, schema and contents.","sources":["s48"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"render_count_tokens_payload"}]},"image_generation":{"v1":"native","v2":"native","offered":true,"notes":"1.16 paint supported Imagen predict only, while Gemini image responses could be handled through chat. 2.0 paint supports both Imagen and Gemini native image generation, multiple results, aspect ratio and resolution.","sources":["s50"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/images.rb"}]},"image_editing":{"v1":"partial","v2":"native","offered":true,"notes":"1.16 could use Gemini chat multimodal output but paint ignored references/masks. 2.0 paint accepts reference images on Gemini image models; mask-based editing and Imagen editing are not implemented.","sources":["s50"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/images.rb","method":"render_image_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/images.rb","method":"render_gemini_image_payload, validate_paint_inputs!"}]},"video_generation":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 supports Veo text/image-to-video and polling/download lifecycle. It accepts one reference image; newer Omni video generation/editing, reference-video editing and video extension are not implemented as native operations.","sources":["s51"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/videos.rb"}]},"speech":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 speak sends generateContent audio output configuration and returns Speech data. Multi-speaker and specialized generation settings require provider_options.","sources":["s52"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/speech.rb"}]},"transcription":{"v1":"native","v2":"native","offered":true,"notes":"Both versions implement RubyLLM.transcribe using generateContent audio understanding and return a typed transcript. The newer Interactions-only dedicated ASR endpoint is tracked separately, not treated as removing this working operation.","sources":["s53"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/transcription.rb"}]},"streaming_transcription":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.transcribe with gemini-3.5-transcribe-live streams actual BidiGenerateContent WebSocket partial/final text into TranscriptionChunk and returns Transcription. Waits for setupComplete before audio, sends manual activity boundaries, and waits for generationComplete. Uses mono 16-bit PCM WAV, preserving its sample rate. Rejects unsupported diarization/word timestamps and never retries delivered frames. Usage remains unknown if no usageMetadata is returned. This one-shot transcription operation is retained; live conversations are outside the release scope.","sources":["s53","s54","s408","s409"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/transcription.rb","method":"transcribe"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/live_transcription.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.5-transcribe-live","spec":"spec/ruby_llm/transcription_google_spec.rb","example":"RubyLLM::Transcription streams partial and final transcription through gemini Live","cassette":"spec/fixtures/websocket_cassettes/transcription_google_gemini.json","notes":"Fresh provider execution and offline replay passed. Actual WebSocket setup, partial/final transcription and generation-complete frames."}]},"diarization":{"v1":"missing","v2":"native","offered":true,"notes":"Dedicated gemini-3.5-transcribe supports speaker_names: [] to request detected speaker labels; timestamps: :word retains numeric timing. Fresh 8.65-second stock-voice fixture returned two distinct speakers on each provider. Known-speaker identities/reference clips are not supported by this route; the labels are provider-assigned. Google Live ASR does not support diarization.","sources":["s53","s54"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/transcription.rb","method":"transcribe"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/transcription.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.5-transcribe","spec":"spec/ruby_llm/transcription_google_spec.rb","example":"RubyLLM::Transcription transcribes audio with speaker labels and word timestamps through gemini","cassette":"spec/fixtures/vcr_cassettes/transcription_transcribes_audio_with_speaker_labels_and_word_timestamps_through_gemini.yml","notes":"Fresh provider execution and offline replay passed. Typed transcript, numeric word offsets and actual detected speaker labels; the two-speaker fixture returned distinct labels."},{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.5-transcribe","spec":"spec/ruby_llm/transcription_google_spec.rb","example":"RubyLLM::Transcription distinguishes two speakers through gemini dedicated transcription","cassette":"spec/fixtures/vcr_cassettes/transcription_distinguishes_two_speakers_through_gemini_dedicated_transcription.yml","notes":"Fresh provider execution and offline replay passed. Typed transcript, numeric word offsets and actual detected speaker labels; the two-speaker fixture returned distinct labels."}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated endpoint established in Gemini Developer API. Asking a chat model to rank, classify or read text is covered by chat, not a separate operation.","sources":["s41"],"code":[]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated endpoint established in Gemini Developer API. Asking a chat model to rank, classify or read text is covered by chat, not a separate operation.","sources":["s41"],"code":[]},"embeddings":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported text batchEmbedContents. 2.0 adds task_type, title and multimodal input support.","sources":["s49"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/embeddings.rb"}]},"multimodal_embeddings":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 renders image/audio/video/PDF attachment parts for embedding models that support them. It rejects arrays of texts combined with attachments.","sources":["s49"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/embeddings.rb","method":"supports_embedding_media?, media_embedding_payload"}]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated endpoint established in Gemini Developer API. Asking a chat model to rank, classify or read text is covered by chat, not a separate operation.","sources":["s41"],"code":[]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 implements resumable upload, metadata/status handling and provider download URI; uploaded files are not universally downloadable. Generated files with downloadUri can be downloaded.","sources":["s55"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/files.rb"}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 implements resumable upload, metadata/status handling and provider download URI; uploaded files are not universally downloadable. Generated files with downloadUri can be downloaded.","sources":["s55"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/files.rb"}]},"chat_batches":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 supports inline single-model generateContent batches, polling, cancellation and ordered results; file-backed batch submission is not implemented.","sources":["s56"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/batches.rb"}]},"embedding_batches":{"v1":"missing","v2":"native","offered":true,"notes":"Existing embed_later and Batch submit inline text embedding requests to asyncBatchEmbedContent. Batch refresh/find/cancel reuse the Gemini operation lifecycle. Echoed per-item metadata restores scalar, one-element array and multiple-input result shapes, including reordered results and Batch.find in a fresh process. Upstream vector-item counts do not create extra logical result slots. Both documented inlinedEmbedContentResponses and live EmbedContentBatchOutput/inlinedResponses envelopes are parsed. Synchronous batchEmbedContents remains a separate operation. Live submit/find/cancel passed; the original four-vector job also completed, and a fresh Batch.find/results returned three typed Embedding results with flat/one-element-array/two-element-array shapes and 64 dimensions per vector. This does not add file-backed submission or staged multimodal inputs.","sources":["s321","s322","s323","s56"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/embedding_batches.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/batches.rb","method":"create_batch / batch_results"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/embeddings.rb","method":"render_embedding"}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Perplexity Agent API.","sources":["s189"],"code":[]},"agent_skills":{"v1":"missing","v2":"missing","offered":true,"notes":"Interactions remote environments can mount skills. RubyLLM implements model Interactions chat and MCP, but does not create or configure managed-agent environments or mounted skills.","sources":["s190"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions.rb"}]},"async_research":{"v1":"missing","v2":"missing","offered":true,"notes":"Deep Research runs as a background Interactions agent. RubyLLM implements synchronous and streamed model Interactions, but not research-agent submission, background polling or result retrieval.","sources":["s191"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions.rb"}]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"No Responses-wire endpoint documented; Interactions and Live are separate APIs.","sources":["s189","s190"],"code":[]},"browser_use":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"The Computer Use tool supports browser environments. Raw tool configuration and application-side action execution are required.","sources":["s192"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"computer_use":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Provider tool configuration is available through raw tool hashes. google_maps has a 2.0 named alias, while computer_use remains provider-specific and needs caller-side execution.","sources":["s41"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"}]},"context_editing":{"v1":"missing","v2":"missing","offered":true,"notes":"Live contextWindowCompression can remove old turns through a sliding window. Both versions lack the required Live transport; generateContent caching is separate.","sources":["s193"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"dedicated_transcription_api":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.transcribe selects gemini-3.5-transcribe automatically. Gemini uses Interactions with transcription_config.mode; existing generateContent audio understanding remains available. Returns typed Transcription, published usage counters, numeric word offsets and detected speaker labels.","sources":["s53"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/transcription.rb","method":"transcription_url, parse_transcription_response"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/transcription.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.5-transcribe","spec":"spec/ruby_llm/transcription_google_spec.rb","example":"RubyLLM::Transcription transcribes audio with speaker labels and word timestamps through gemini","cassette":"spec/fixtures/vcr_cassettes/transcription_transcribes_audio_with_speaker_labels_and_word_timestamps_through_gemini.yml","notes":"Fresh provider execution and offline replay passed. Typed transcript, numeric word offsets and actual detected speaker labels; the two-speaker fixture returned distinct labels."},{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.5-transcribe","spec":"spec/ruby_llm/transcription_google_spec.rb","example":"RubyLLM::Transcription distinguishes two speakers through gemini dedicated transcription","cassette":"spec/fixtures/vcr_cassettes/transcription_distinguishes_two_speakers_through_gemini_dedicated_transcription.yml","notes":"Fresh provider execution and offline replay passed. Typed transcript, numeric word offsets and actual detected speaker labels; the two-speaker fixture returned distinct labels."}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"fast_inference":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"GenerateContent supports service_tier priority in its request body. Both versions can supply it as raw provider options.","sources":["s194"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Provider exposes file listing and deletion. RubyLLM implements upload, metadata lookup and download, but not list/delete operations.","sources":["s55"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"file_search_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"RubyLLM can call the File Search tool using an existing store, but does not create/delete stores or import/index their documents. Ordinary RubyLLM.upload targets the separate Files API.","sources":["s46"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/files.rb"}]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"Current Gemini Developer API docs state no supported fine-tuning model; Google Cloud tuning is separate.","sources":["s57"],"code":[]},"google_maps":{"v1":"passthrough","v2":"native","offered":true,"notes":"Named google_maps server-tool alias in 2.0.","sources":["s41"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"}]},"guardrail_configuration":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Both versions can pass safetySettings. The common API does not wrap individual safety thresholds.","sources":["s195"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}]},"hosted_conversations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Gemini documents provider-managed conversation storage or hosted conversation resources. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s190","s363","s364"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"}]},"image_batches":{"v1":"missing","v2":"passthrough","offered":true,"notes":"2.0 can stage a chat request with raw image response modalities and parse generated attachments. No dedicated batched paint API; 1.16 has no Batch client.","sources":["s56"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/batches.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"parse_completion_body"}]},"interactions_api":{"v1":"missing","v2":"native","offered":true,"notes":"The opt-in Gemini Interactions protocol handles text/media input, local tools and results, JSON Schema output, streamed native steps, citations, thinking and reported usage. Chat sends store:false and replays actual results from application-owned history. Retained live recordings cover MCP, local functions, streaming and schema output; provider-stored continuation is outside this release.","sources":["s54","s41","s190","s363","s364"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/content.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.8-flash","spec":"spec/ruby_llm/protocols/interactions_spec.rb","example":"executes a remote MCP tool and replays its signed results through stateless chat","cassette":"spec/fixtures/vcr_cassettes/protocols_interactions_executes_a_remote_mcp_tool_and_replays_its_signed_results_through_stateless_chat.yml","notes":"Fresh Microsoft Learn MCP execution returned actual call/result steps, then a second user turn used those results. MCP output signatures remain in raw history but are omitted from input as required by the input schema; thought signatures are retained."},{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.8-flash","spec":"spec/ruby_llm/protocols/interactions_spec.rb","example":"streams remote MCP results and preserves the complete signed history","cassette":"spec/fixtures/vcr_cassettes/protocols_interactions_streams_remote_mcp_results_and_preserves_the_complete_signed_history.yml","notes":"Fresh SSE execution reconstructed call, result, thought and model-output steps; text chunks equal final assistant text and actual prompt/tool/thought usage is normalized."},{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.8-flash","spec":"spec/ruby_llm/protocols/interactions_spec.rb","example":"executes local tools and returns JSON Schema output through Interactions","cassette":"spec/fixtures/vcr_cassettes/protocols_interactions_executes_local_tools_and_returns_json_schema_output_through_interactions.yml","notes":"Fresh local multiply execution and JSON Schema output return parsed answer91, retaining the actual local tool result."},{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.8-flash","spec":"spec/ruby_llm/protocols/interactions_spec.rb","example":"streams local function arguments and continues with the actual tool result","cassette":"spec/fixtures/vcr_cassettes/protocols_interactions_streams_local_function_arguments_and_continues_with_the_actual_tool_result.yml","notes":"Fresh function-call argument deltas start after an empty object, assemble into an object for replay, execute multiply and return323."}]},"json_mode":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Both versions can pass generationConfig.responseMimeType application/json without a schema.","sources":["s196"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Amazon Bedrock Mantle.","sources":["s189"],"code":[]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"Live offers automatic window compression, not a separate manual compact operation.","sources":["s193"],"code":[]},"music_generation":{"v1":"partial","v2":"passthrough","offered":true,"notes":"Lyria has a documented generateContent route. Version 2 can return generated audio attachments through Chat, but has no music operation or Lyria-specific Interactions/Live Music lifecycle. Version 1.16 drops audio attachments when accompanying lyrics are returned.","sources":["s197"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini/chat.rb","method":"parse_completion_response"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"parse_completion_body"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions.rb"}]},"nonchat_batches":{"v1":"missing","v2":"passthrough","offered":true,"notes":"TTS models support Batch. 2.0 can batch raw AUDIO generation chat requests and return attachments; there is no batched speak result API.","sources":["s198"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}]},"omni_video_generation":{"v1":"missing","v2":"missing","offered":true,"notes":"Newer Omni video generation/editing API is absent. Veo video generation is independently implemented and counted as native.","sources":["s51"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/videos.rb"}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"prefix_completion":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"prompt_cache_controls":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 requires raw cachedContent references. 2.0 exposes with_caching(id:) and reusable cache lifecycle controls; implicit caching has no content breakpoints.","sources":["s199"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"realtime":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Gemini documents realtime conversations. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s54","s41","s416","s418"],"code":[]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"responses":{"v1":"na","v2":"na","offered":false,"notes":"No Responses-wire endpoint documented; Interactions and Live are separate APIs.","sources":["s189","s190"],"code":[]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"No Responses-wire endpoint documented; Interactions and Live are separate APIs.","sources":["s189","s190"],"code":[]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"shell_computer_tools":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Computer Use supports desktop/mobile/browser actions. Raw tool definitions and caller execution are required; this does not imply a hosted shell.","sources":["s190"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"streaming_speech":{"v1":"missing","v2":"missing","offered":true,"notes":"Gemini TTS supports streamGenerateContent on selected models. RubyLLM.speak sends a synchronous request and has no speech streaming implementation.","sources":["s200"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"}]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"vector_store_management":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"Batch documents generateContent and embedding jobs; Veo/Omni asynchronous jobs are not video batch jobs.","sources":["s56"],"code":[]},"video_editing":{"v1":"missing","v2":"missing","offered":true,"notes":"The Omni video-editing request and job/result lifecycle are not implemented by the model Interactions adapter. Existing Veo generation uses its separate video protocol.","sources":["s201"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions.rb"}]},"video_extension":{"v1":"missing","v2":"native","offered":true,"notes":"New extend: preserves original generated Veo URI from Video.raw. Source must be a recent Veo video; no arbitrary local-video upload is claimed. Current API rejected the docs inlineData and Python SDK encoding forms with400; verified URI form succeeds.","sources":["s51","s348"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/videos.rb","method":"render_video_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/videos.rb"},{"version":"v2","path":"lib/ruby_llm/video.rb"},{"version":"v2","path":"lib/ruby_llm/video_job.rb"}],"verification":[{"status":"passed","model":"veo-3.1-fast-generate-preview","spec":"spec/ruby_llm/protocols/gemini/videos_spec.rb","example":"extends a freshly generated Veo video through the public API","cassette":"spec/fixtures/vcr_cassettes/protocols_gemini_videos_extends_a_freshly_generated_veo_video_through_the_public_api.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: fresh base generation completed, extension completed, MP4 >1000 bytes, raw done=true."}]},"voice_cloning":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s189"],"code":[]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"No Responses-wire endpoint documented; Interactions and Live are separate APIs.","sources":["s189","s190"],"code":[]}},"gaps":[{"notes":"Agent skills: Interactions remote environments can mount skills. RubyLLM implements model Interactions chat and MCP, but does not create or configure managed-agent environments or mounted skills.","sources":["s190"]},{"notes":"Asynchronous research: Deep Research runs as a background Interactions agent. RubyLLM implements synchronous and streamed model Interactions, but not research-agent submission, background polling or result retrieval.","sources":["s191"]},{"notes":"Browser use: The Computer Use tool supports browser environments. Raw tool configuration and application-side action execution are required.","sources":["s192"]},{"notes":"Computer use: Provider tool configuration is available through raw tool hashes. google_maps has a 2.0 named alias, while computer_use remains provider-specific and needs caller-side execution.","sources":["s41"]},{"notes":"Context editing: Live contextWindowCompression can remove old turns through a sliding window. Both versions lack the required Live transport; generateContent caching is separate.","sources":["s193"]},{"notes":"Fast inference: GenerateContent supports service_tier priority in its request body. Both versions can supply it as raw provider options.","sources":["s194"]},{"notes":"File listing and deletion: Provider exposes file listing and deletion. RubyLLM implements upload, metadata lookup and download, but not list/delete operations.","sources":["s55"]},{"notes":"File search store management: RubyLLM can call the File Search tool using an existing store, but does not create/delete stores or import/index their documents. Ordinary RubyLLM.upload targets the separate Files API.","sources":["s46"]},{"notes":"Guardrail configuration: Both versions can pass safetySettings. The common API does not wrap individual safety thresholds.","sources":["s195"]},{"notes":"Image batches: 2.0 can stage a chat request with raw image response modalities and parse generated attachments. No dedicated batched paint API; 1.16 has no Batch client.","sources":["s56"]},{"notes":"JSON object mode: Both versions can pass generationConfig.responseMimeType application/json without a schema.","sources":["s196"]},{"notes":"Music generation: Lyria has a documented generateContent route. Version 2 can return generated audio attachments through Chat, but has no music operation or Lyria-specific Interactions/Live Music lifecycle. Version 1.16 drops audio attachments when accompanying lyrics are returned.","sources":["s197"]},{"notes":"Other batch operations: TTS models support Batch. 2.0 can batch raw AUDIO generation chat requests and return attachments; there is no batched speak result API.","sources":["s198"]},{"notes":"Omni video generation: Newer Omni video generation/editing API is absent. Veo video generation is independently implemented and counted as native.","sources":["s51"]},{"notes":"Shell and computer tools: Computer Use supports desktop/mobile/browser actions. Raw tool definitions and caller execution are required; this does not imply a hosted shell.","sources":["s190"]},{"notes":"Streaming speech generation: Gemini TTS supports streamGenerateContent on selected models. RubyLLM.speak sends a synchronous request and has no speech streaming implementation.","sources":["s200"]},{"notes":"Video editing: The Omni video-editing request and job/result lifecycle are not implemented by the model Interactions adapter. Existing Veo generation uses its separate video protocol.","sources":["s201"]}]},{"id":"vertexai","name":"Vertex AI","notes":"The audit covers Vertex AI generative inference, including Gemini, supported partner models, media, caching, batches and Interactions. Direct Gemini or Anthropic features are not assumed to exist on Vertex. Separate Cloud Vision and Document AI services are outside scope.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"pdf_input":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"audio_input":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"video_input":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"citations":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 normalizes Gemini grounding citations and Anthropic document citations. Historical raw-response access required provider-specific parsing.","sources":["s60","s35"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"extract_citations"}]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"1.16 supported Google generateContent through inherited Gemini implementation. 2.0 adds protocol routing for Anthropic Claude, Mistral and MaaS Chat Completions alongside Gemini. Model/provider restrictions apply.","sources":["s58","s59"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"parallel_tool_control":{"v1":"missing","v2":"native","offered":true,"notes":"Gemini does not offer disabling parallel function calls. 2.0 Vertex Anthropic adds the disable_parallel_tool_use mapping for Claude; not all hosted protocols share it.","sources":["s42","s33"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/tools.rb","method":"build_tool_choice"}]},"server_web_search":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 Gemini Search alias; Anthropic availability depends on Google Cloud model and API support.","sources":["s58","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"}]},"server_web_fetch":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 URL context via Gemini protocol. Do not assume Anthropic web_fetch works on Google Cloud just because the Anthropic protocol has an alias.","sources":["s61","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"}]},"server_code_execution":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 Gemini code_execution alias and returned execution blocks.","sources":["s62"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"}]},"server_file_search":{"v1":"passthrough","v2":"native","offered":true,"notes":"Named :file_search alias maps an existing datastore to retrieval.vertexAiSearch on Vertex generateContent. Existing retrievedContext grounding normalization returns Citation values. Store provisioning and ingestion remain external. Rendering and grounding have regression coverage; no configured Vertex AI Search datastore was available for live retrieval.","sources":["s60","s365"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_server_tools"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/chat.rb","method":"parse_citations"}],"verification":[{"status":"unit","spec":"spec/ruby_llm/protocols/interactions_spec.rb","example":"uses Vertex AI Search retrieval for its named file-search alias","notes":"Public Chat alias renders the documented retrieval.vertexAiSearch datastore shape."},{"status":"unit","spec":"spec/ruby_llm/protocols/gemini/chat_spec.rb","notes":"Existing retrievedContext citation regression passes alongside the new alias tests."},{"status":"unavailable","checked_on":"2026-09-07","notes":"No accessible Vertex AI Search datastore configured; no retrieval index was provisioned for this audit."}]},"server_mcp":{"v1":"missing","v2":"partial","offered":true,"notes":"RubyLLM.research/research_later connects a remote MCP server through the hosted Deep Research agent, with an explicit agent identity and managed background lifecycle. A fresh Microsoft Learn lookup completed and returned an authoritative microsoft_docs_search result citation. Both completed GET and streamed retrieval omit the actual MCP call/result steps on this route; the citation also lacks a source URL. The common parser retains native calls/results/thinking/citation data when actually returned, but RubyLLM does not invent missing records or URLs. This remains partial, consistently with other providers that drop expected tool-result records. The existing ordinary model chat route is unchanged. Hosted MCP exposes no approval policy; unsupported approval options raise before submission.","sources":["s203","s205","s33","s363"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/research.rb","method":"create_research_job / refresh_research_job / cancel_research_job / parse_research_message"},{"version":"v2","path":"lib/ruby_llm/research_job.rb","method":"research / research_later / find / wait / cancel"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol :research"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/chat.rb","method":"parse_completion_body / parse_interaction_server_calls"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","notes":"Fresh authenticated Vertex Interactions probes returned HTTP400 Unsupported model interaction for gemini-2.5-flash and gemini-3.8-flash. No remote tool execution occurred. These earlier ordinary-model probes do not apply to the subsequently implemented hosted ResearchJob route, whose separate execution evidence appears below."},{"status":"passed","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/vertexai/research_spec.rb","example":"completes a short hosted research task through an actual public documentation MCP server","cassette":"spec/fixtures/vcr_cassettes/protocols_vertexai_research_completes_a_short_hosted_research_task_through_an_actual_public_documentation_mcp_server.yml","notes":"Passed freshly, then passed CI=true offline replay. Completed hosted task through anonymous Microsoft Learn MCP; nonempty report, provider-attributed microsoft_docs_search result citation, positive actual usage, absent model and unknown cost. Agent: deep-research-preview-04-2026. Actual normalized input 36076, output 2048 (including 1749 thinking), total 38124; task price unknown. Successful remote execution and report verified; expected native MCP call/result records, thinking summaries and source URL are absent from this provider route."},{"status":"passed","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/vertexai/research_spec.rb","example":"cancels an actual independently submitted hosted research task","cassette":"spec/fixtures/vcr_cassettes/protocols_vertexai_research_cancels_an_actual_independently_submitted_hosted_research_task.yml","notes":"Passed freshly, then passed CI=true offline replay. Exact created ID receives documented POST /interactions/{id}/cancel; provider confirms cancelled. Agent: deep-research-preview-04-2026. Successful remote execution and report verified; expected native MCP call/result records, thinking summaries and source URL are absent from this provider route."},{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/vertexai/research_spec.rb","notes":"66 focused Message, ResearchJob, Vertex Research and Interactions examples pass. Independent review verifies one submission, bounded retry/backoff deadlines, exact job identity through malformed creates and polls, bounded blocking cleanup, and effective/unknown cost serialization. Provider-omitted MCP records remain absent."}]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already received implicit Gemini caching and parsed usage. 2.0 adds common controls, explicit Gemini cache resources and Anthropic cache support.","sources":["s63","s37"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/anthropic.rb"}]},"cache_boundaries":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 cache_until_here maps to cache_control on Vertex Anthropic; Gemini does not expose per-message breakpoints. Historical Vertex only supported Gemini.","sources":["s37","s63"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb"}]},"explicit_cache":{"v1":"partial","v2":"native","offered":true,"notes":"2.0 uses projects/locations/cachedContents create/update/delete lifecycle. 1.16 could attach an externally created resource using raw params.","sources":["s63"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini.rb","method":"caches_url, cache_model_name"}]},"compaction":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 Vertex Anthropic inherits Anthropic compaction and preservation. Google Cloud documents Claude compaction support; model/beta availability applies. Gemini does not gain server compaction from this.","sources":["s38"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb","method":"apply_compaction"}]},"token_counting":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 native Gemini countTokens; Vertex Anthropic explicitly raises unsupported even though current Claude docs list token counting on Google Cloud.","sources":["s48","s33"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini.rb","method":"count_tokens_url"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/anthropic.rb","method":"count_tokens"}]},"image_generation":{"v1":"partial","v2":"native","offered":true,"notes":"1.16 inherited Gemini Imagen paint code without a Vertex image URL override, so the dedicated paint route is unverified and marked partial. 2.0 routes Imagen and Gemini image endpoints through Vertex model_path.","sources":["s66","s50"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gemini/images.rb","method":"images_url"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini.rb","method":"images_url"}]},"image_editing":{"v1":"partial","v2":"native","offered":true,"notes":"2.0 Gemini image reference editing works, but Imagen mask editing and subject customization are rejected/not rendered. 1.16 only chat-based Gemini image output, not a working paint editing path.","sources":["s66","s50"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/images.rb","method":"validate_paint_inputs!, render_imagen_payload"}]},"video_generation":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 animate and animate_later use Vertex model-scoped prediction jobs, POST polling, and inline or Cloud Storage video output. A fresh us-central1 Veo 3.1 Fast request verified submission, polling and MP4 bytes. Reference-image rendering and Cloud Storage downloads have protocol tests; no live bucket download was run. Vertex Veo is absent from the bundled registry, so use a documented model with assume_model_exists: true.","sources":["s308","s309","s58","s51"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai/videos.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini.rb"},{"version":"v2","path":"spec/ruby_llm/providers/vertexai/videos_spec.rb"}]},"speech":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 overrides Gemini speech endpoint for Vertex model_path and returns Speech values.","sources":["s52","s58"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini.rb","method":"speech_url"}]},"transcription":{"v1":"native","v2":"native","offered":true,"notes":"Both versions implement RubyLLM.transcribe through Vertex generateContent and return a typed transcript. Newer dedicated ASR endpoints and structured ASR outputs are tracked separately.","sources":["s53","s58"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini.rb","method":"transcription_url"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/transcription.rb"}]},"streaming_transcription":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.transcribe with gemini-3.5-transcribe-live-preview streams actual BidiGenerateContent WebSocket partial/final text into TranscriptionChunk and returns Transcription. Waits for setupComplete before audio, sends manual activity boundaries, and waits for generationComplete. Uses mono 16-bit PCM WAV, preserving its sample rate. Rejects unsupported diarization/word timestamps and never retries delivered frames. Vertex AI requires the global location. Usage remains unknown if no usageMetadata is returned. This one-shot transcription operation is retained; live conversations are outside the release scope.","sources":["s67","s53","s408","s410","s409"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/transcription.rb","method":"transcribe"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/live_transcription.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/live_transcription.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.5-transcribe-live-preview","spec":"spec/ruby_llm/transcription_google_spec.rb","example":"RubyLLM::Transcription streams partial and final transcription through vertexai Live","cassette":"spec/fixtures/websocket_cassettes/transcription_google_vertexai.json","notes":"Fresh provider execution and offline replay passed. Actual WebSocket setup, partial/final transcription and generation-complete frames."}]},"diarization":{"v1":"missing","v2":"native","offered":true,"notes":"Dedicated gemini-3.5-transcribe-preview supports speaker_names: [] to request detected speaker labels; timestamps: :word retains numeric timing. Fresh 8.65-second stock-voice fixture returned two distinct speakers on each provider. Known-speaker identities/reference clips are not supported by this route; the labels are provider-assigned. Vertex AI requires the global location. Google Live ASR does not support diarization.","sources":["s67","s53","s410"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/transcription.rb","method":"transcribe"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/transcription.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.5-transcribe-preview","spec":"spec/ruby_llm/transcription_google_spec.rb","example":"RubyLLM::Transcription transcribes audio with speaker labels and word timestamps through vertexai","cassette":"spec/fixtures/vcr_cassettes/transcription_transcribes_audio_with_speaker_labels_and_word_timestamps_through_vertexai.yml","notes":"Fresh provider execution and offline replay passed. Typed transcript, numeric word offsets and actual detected speaker labels; the two-speaker fixture returned distinct labels."},{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.5-transcribe-preview","spec":"spec/ruby_llm/transcription_google_spec.rb","example":"RubyLLM::Transcription distinguishes two speakers through vertexai dedicated transcription","cassette":"spec/fixtures/vcr_cassettes/transcription_distinguishes_two_speakers_through_vertexai_dedicated_transcription.yml","notes":"Fresh provider execution and offline replay passed. Typed transcript, numeric word offsets and actual detected speaker labels; the two-speaker fixture returned distinct labels."}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"No separate operation within the audited generative-model endpoints; Google Cloud Vision and Document AI are separate services. Model safety settings through provider_options are not a standalone moderation operation.","sources":["s58"],"code":[]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"No separate operation within the audited generative-model endpoints; Google Cloud Vision and Document AI are separate services. Model safety settings through provider_options are not a standalone moderation operation.","sources":["s58"],"code":[]},"embeddings":{"v1":"native","v2":"native","offered":true,"notes":"Vertex text embeddings keep the existing predict request and response contract. Gemini Embedding 2 uses its dedicated embedContent route; it accepts one combined input, with task instructions in the input text rather than task_type/title. Multiple independent text inputs must be separate calls on that route.","sources":["s318","s64"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/embed_content.rb"}]},"multimodal_embeddings":{"v1":"missing","v2":"native","offered":true,"notes":"Gemini Embedding 2 and its preview use Vertex embedContent through embed(..., with:). Each request produces one combined vector from text and supported image, audio, video, or PDF parts. Existing Vertex text embedding models retain predict. The legacy multimodalembedding@001 endpoint returns separate modality/segment vectors and is outside this integration. Vertex accepts one text input per request; a one-element array preserves array result shape. Text plus image was live-verified at 128 dimensions; other documented modalities were not exercised live in this pass.","sources":["s318","s319","s320","s64"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/embed_content.rb","method":"render_embedding_payload / parse_embedding_response"}]},"reranking":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.rerank selects the Discovery Engine ranking protocol using existing Vertex credentials/project, independent of chat routing. Shared string documents map to stable record IDs; ranked results recover original text even when the API omits record details. Supports top_n and provider-specific rank options. Uses global default_ranking_config unless explicitly overridden. No token counts or costs are invented. Source-verified semantic-ranker-default-004 is absent from the general Vertex catalog, so examples use assume_model_exists:true. Discovery Engine API enablement is required; current project returns 403 SERVICE_DISABLED.","sources":["s65","s398","s399"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/ranking.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for, ranking_config, ranking_connection"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","model":"semantic-ranker-default-004","spec":"spec/ruby_llm/protocols/vertexai/ranking_spec.rb","notes":"Actual context.rerank with two short documents and top_n:1 fails before a result. No API enablement, IAM change, store creation or billing change performed. Fresh direct adapter probe; protocol specs are offline stubs, not a successful VCR recording."},{"status":"unit","spec":"spec/ruby_llm/protocols/vertexai/ranking_spec.rb","example":"uses Discovery Engine with existing credentials and correlates records that omit their original text","notes":"Documented request/result lifecycle and provider endpoint/auth handling have focused regressions."}]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 normalizes GCS objects behind RubyLLM.upload/download, using google-cloud-storage. This is cloud storage integration, not the Gemini Developer Files API; GCS references work with Gemini, while Vertex Anthropic file_id references are rejected.","sources":["s58"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/files.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/anthropic.rb","method":"supports_provider_file_references?"}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 normalizes GCS objects behind RubyLLM.upload/download, using google-cloud-storage. This is cloud storage integration, not the Gemini Developer Files API; GCS references work with Gemini, while Vertex Anthropic file_id references are rejected.","sources":["s58"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/files.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/anthropic.rb","method":"supports_provider_file_references?"}]},"chat_batches":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 supports Gemini, Anthropic Claude and MaaS chat batchPredictionJobs with GCS; Vertex Mistral batch routing is explicitly absent.","sources":["s58"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"batch_protocol_for"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini/batches.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/anthropic/batches.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/chat_completions/batches.rb"}]},"embedding_batches":{"v1":"missing","v2":"native","offered":true,"notes":"Dedicated Vertex batchPredictionJobs adapter supports text-embedding-004, text-embedding-005, text-multilingual-embedding-002, gemini-embedding-001 and gemini-embedding-2. Legacy models use instance JSONL and job-wide parameters; Gemini models use the documented preview request/content schema and per-row dimensions. Explicit correlation keys preserve scalar and array shapes across out-of-order result shards and Batch.find. Provider errors fail their logical request; missing groups remain pending until the batch ends. Only reported token counts are retained, and an incomplete group count remains unknown. Requires optional google-cloud-storage and an intended vertexai_batch_gcs_uri prefix. Current account can list prediction jobs (fresh HTTP 200), but no intended GCS prefix was supplied, so submission/completed results remain live-unverified.","sources":["s68","s414","s415"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai/gemini/batches.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/batch_prediction.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/embedding_prediction.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/embedding_prediction/requests.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/embedding_prediction/results.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/batch_prediction.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"batch_protocol_for, batch_protocol_for_model_path"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/embed_content.rb","method":"render_embedding"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","model":"text-embedding-004","spec":"spec/ruby_llm/protocols/vertexai/embedding_prediction_live_spec.rb","example":"completes text embeddings and restores shapes after reloading the prediction job","notes":"Fresh read-only prediction-job listing returned HTTP 200. No intended GCS prefix was supplied, so no batch or objects were created. The persistent live test is resource-gated; submission and completed results remain unverified."},{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/vertexai/embedding_prediction_spec.rb","notes":"73 focused embedding and existing chat-batch regressions passed, including shuffled output correlation, scalar/array shapes, reloaded jobs, errors and unknown usage. Legacy and preview Gemini schemas are covered."}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"Claude platform matrix does not offer this on Google Cloud; no corresponding Gemini feature documented.","sources":["s33","s202"],"code":[]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Perplexity Agent API.","sources":["s203"],"code":[]},"agent_skills":{"v1":"missing","v2":"missing","offered":true,"notes":"Managed Agents can configure skills and environments. Neither version implements these agent or skill resources.","sources":["s204"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"async_research":{"v1":"missing","v2":"native","offered":true,"notes":"Single-turn prebuilt hosted Deep Research jobs support explicit agent/provider selection, one non-idempotent submission, polling, final or incomplete Message, find by durable ID and confirmed cancellation. Wait deadlines bound complete request/retry/backoff time. Independent wait timeout retains the running task. Blocking research errors, timeouts and interrupts retain the exact job and attempt bounded cancellation. Usage uses actual task counters; no synthetic model identity, model pricing or poll-as-inference accounting. No agent provisioning, sandbox, public SSE stream or multi-turn research lifecycle is included.","sources":["s205","s203","s363"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/research.rb","method":"create_research_job / refresh_research_job / cancel_research_job / parse_research_message"},{"version":"v2","path":"lib/ruby_llm/research_job.rb","method":"research / research_later / find / wait / cancel"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol :research"},{"version":"v2","path":"lib/ruby_llm/protocols/interactions/chat.rb","method":"parse_completion_body / parse_interaction_server_calls"}],"verification":[{"status":"passed","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/vertexai/research_spec.rb","example":"completes a short hosted research task through an actual public documentation MCP server","cassette":"spec/fixtures/vcr_cassettes/protocols_vertexai_research_completes_a_short_hosted_research_task_through_an_actual_public_documentation_mcp_server.yml","notes":"Passed freshly, then passed CI=true offline replay. Completed hosted task through anonymous Microsoft Learn MCP; nonempty report, provider-attributed microsoft_docs_search result citation, positive actual usage, absent model and unknown cost. Agent: deep-research-preview-04-2026. Actual normalized input 36076, output 2048 (including 1749 thinking), total 38124; task price unknown."},{"status":"passed","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/vertexai/research_spec.rb","example":"cancels an actual independently submitted hosted research task","cassette":"spec/fixtures/vcr_cassettes/protocols_vertexai_research_cancels_an_actual_independently_submitted_hosted_research_task.yml","notes":"Passed freshly, then passed CI=true offline replay. Exact created ID receives documented POST /interactions/{id}/cancel; provider confirms cancelled. Agent: deep-research-preview-04-2026."},{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/vertexai/research_spec.rb","notes":"66 focused Message, ResearchJob, Vertex Research and Interactions examples pass. Independent review verifies one submission, bounded retry/backoff deadlines, exact job identity through malformed creates and polls, bounded blocking cleanup, and effective/unknown cost serialization. Provider-omitted MCP records remain absent."}]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"No such Responses-wire operation documented in the audited Grok endpoint; background Interactions is separate.","sources":["s206"],"code":[]},"browser_use":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Claude on Google Cloud documents this tool/context feature. 2.0 can inject its Anthropic wire declaration and caller-managed behavior; 1.16 has no Anthropic publisher protocol.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"computer_use":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Claude on Google Cloud documents this tool/context feature. 2.0 can inject its Anthropic wire declaration and caller-managed behavior; 1.16 has no Anthropic publisher protocol.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"context_editing":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Claude on Google Cloud documents this tool/context feature. 2.0 can inject its Anthropic wire declaration and caller-managed behavior; 1.16 has no Anthropic publisher protocol.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"dedicated_transcription_api":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.transcribe selects gemini-3.5-transcribe-preview automatically. Vertex uses generateContent audioTranscriptionConfig, not the Developer API Interactions payload. Vertex AI requires the global location. Returns typed Transcription, published usage counters, numeric word offsets and detected speaker labels.","sources":["s53","s410"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/gemini/transcription.rb","method":"transcription_url, parse_transcription_response"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/transcription.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.5-transcribe-preview","spec":"spec/ruby_llm/transcription_google_spec.rb","example":"RubyLLM::Transcription transcribes audio with speaker labels and word timestamps through vertexai","cassette":"spec/fixtures/vcr_cassettes/transcription_transcribes_audio_with_speaker_labels_and_word_timestamps_through_vertexai.yml","notes":"Fresh provider execution and offline replay passed. Typed transcript, numeric word offsets and actual detected speaker labels; the two-speaker fixture returned distinct labels."},{"status":"passed","recorded_on":"2026-09-07","model":"gemini-3.5-transcribe-preview","spec":"spec/ruby_llm/transcription_google_spec.rb","example":"RubyLLM::Transcription distinguishes two speakers through vertexai dedicated transcription","cassette":"spec/fixtures/vcr_cassettes/transcription_distinguishes_two_speakers_through_vertexai_dedicated_transcription.yml","notes":"Fresh provider execution and offline replay passed. Typed transcript, numeric word offsets and actual detected speaker labels; the two-speaker fixture returned distinct labels."}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"fast_inference":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Priority PayGo uses the X-Vertex-AI-LLM-Shared-Request-Type header, available through request headers in both versions. Claude fast mode is not offered on Google Cloud.","sources":["s207","s208"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"GCS exposes object listing/deletion; the public RubyLLM UploadedFile API only uploads, finds and downloads. Internal batch-output listing is not a general file-management API.","sources":["s209"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"file_search_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"RAG Engine exposes corpus and file lifecycle plus managed vector storage. Neither version implements these resources; raw retrieval can use an externally prepared corpus.","sources":["s210"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"fine_tuning":{"v1":"missing","v2":"missing","offered":true,"notes":"Google Cloud supports tuning jobs. RubyLLM has no tuning lifecycle client; this is outside inference operation totals.","sources":["s69"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"google_maps":{"v1":"passthrough","v2":"native","offered":true,"notes":"Gemini on Google Cloud supports Maps grounding. 1.16 requires raw tools; 2.0 inherits the google_maps alias.","sources":["s202"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"guardrail_configuration":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Gemini safetySettings and Model Armor request settings can be passed as provider options. Separate Cloud security services are outside this inference row.","sources":["s202"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"hosted_conversations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Vertex AI documents provider-managed conversation storage or hosted conversation resources. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s203","s205","s363"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"}]},"image_batches":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Google Cloud documents batch image generation. 2.0 can stage raw image-output Gemini chat requests through its batch client and parse attachments; no batched paint API.","sources":["s211"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"interactions_api":{"v1":"missing","v2":"missing","offered":true,"notes":"RubyLLM now registers a dedicated Vertex Interactions dialect for single-turn hosted Deep Research; see Asynchronous research for its implemented lifecycle. A general Vertex Interactions conversation/client API for other agent/model families, continuation and resource management remains unimplemented. Earlier ordinary Gemini model requests to this Vertex endpoint returned Unsupported model interaction.","sources":["s203","s205","s363"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/vertexai/research.rb","method":"single-turn ResearchJob scope"}]},"json_mode":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Gemini generationConfig supports application/json without a schema; both versions can pass it as provider options.","sources":["s202"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Amazon Bedrock Mantle.","sources":["s203"],"code":[]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"music_generation":{"v1":"missing","v2":"missing","offered":true,"notes":"Lyria music is exposed through Vertex Interactions and Lyria model APIs. RubyLLM has no matching music protocol or result API.","sources":["s203"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"omni_video_generation":{"v1":"missing","v2":"missing","offered":true,"notes":"Google Cloud documents Omni generation and video editing through Interactions. RubyLLM implements Veo prediction jobs but has no Interactions protocol.","sources":["s212","s213"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/videos.rb"}]},"partner_model_protocols":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 selects native Anthropic, Mistral and OpenAI-compatible MaaS wire formats; 1.16 Vertex inherited only Gemini.","sources":["s58"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb","method":"protocol_for"}]},"prefix_completion":{"v1":"missing","v2":"passthrough","offered":true,"notes":"2.0 supports older Claude publisher routes with assistant prefill; raw messages can be supplied. Claude 4.6 and newer reject prefill. 1.16 lacks the Anthropic publisher adapter.","sources":["s188","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"Claude platform matrix does not offer this on Google Cloud; no corresponding Gemini feature documented.","sources":["s33","s202"],"code":[]},"prompt_cache_controls":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 accepts raw cachedContent for Gemini. 2.0 adds explicit Gemini cache controls and Anthropic caching configuration on supported publisher routes.","sources":["s214","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"Claude platform matrix does not offer this on Google Cloud; no corresponding Gemini feature documented.","sources":["s33","s202"],"code":[]},"realtime":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Vertex AI documents realtime conversations. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s67"],"code":[]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"responses":{"v1":"missing","v2":"missing","offered":true,"notes":"Google Cloud offers Grok Responses at endpoints/openapi/responses. RubyLLM Vertex only registers Gemini, Anthropic, Mistral and Chat Completions; no Responses route.","sources":["s206"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"No such Responses-wire operation documented in the audited Grok endpoint; background Interactions is separate.","sources":["s206"],"code":[]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"server_tool_search":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Claude on Google Cloud documents this tool/context feature. 2.0 can inject its Anthropic wire declaration and caller-managed behavior; 1.16 has no Anthropic publisher protocol.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"shell_computer_tools":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Claude on Google Cloud documents this tool/context feature. 2.0 can inject its Anthropic wire declaration and caller-managed behavior; 1.16 has no Anthropic publisher protocol.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"streaming_speech":{"v1":"missing","v2":"missing","offered":true,"notes":"Vertex Live provides streamed generated speech; RubyLLM has no Live transport. Its synchronous speak path does not stream audio.","sources":["s215","s216"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"task_budgets":{"v1":"unknown","v2":"unknown","offered":null,"notes":"Claude task budgets are documented on the direct API, but the task-budget page does not establish availability on this cloud platform. No platform-specific confirmation found; raw option acceptance alone is insufficient.","sources":["s217","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"vector_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"RAG Engine exposes corpus and file lifecycle plus managed vector storage. Neither version implements these resources; raw retrieval can use an externally prepared corpus.","sources":["s210"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"The audited Vertex model matrix documents Veo online generation; long-running single jobs are not batch jobs.","sources":["s218"],"code":[]},"video_editing":{"v1":"missing","v2":"missing","offered":true,"notes":"Google Cloud documents Omni generation and video editing through Interactions. RubyLLM implements Veo prediction jobs but has no Interactions protocol.","sources":["s212","s213"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/videos.rb"}]},"video_extension":{"v1":"missing","v2":"native","offered":true,"notes":"New extend: uses Vertex gcsUri/mimeType (or bytesBase64Encoded/mimeType) dialect; fresh live us-central1 GCS sample. Packaged registry lacks this Vertex Veo model; existing assume_model_exists convention used with official/live verified ID. Binary source serializer unit-tested, not freshly called.","sources":["s212","s213","s349"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai/videos.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gemini/videos.rb"}],"verification":[{"status":"passed","model":"veo-3.1-fast-generate-001","spec":"spec/ruby_llm/providers/vertexai/videos_spec.rb","example":"extends a Cloud Storage video through a Vertex prediction job","cassette":"spec/fixtures/vcr_cassettes/providers_vertexai_videos_extends_a_cloud_storage_video_through_a_vertex_prediction_job.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: completed extension, MP4 >1000 bytes."}]},"voice_cloning":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"The generateContent schema documents replicatedVoiceConfig from an audio sample. Raw speech configuration can be supplied; no common voice-cloning API or resource lifecycle exists.","sources":["s202"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/vertexai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/vertexai.rb"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s203"],"code":[]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"No such Responses-wire operation documented in the audited Grok endpoint; background Interactions is separate.","sources":["s206"],"code":[]}},"gaps":[{"notes":"Remote MCP tools: RubyLLM.research/research_later connects a remote MCP server through the hosted Deep Research agent, with an explicit agent identity and managed background lifecycle. A fresh Microsoft Learn lookup completed and returned an authoritative microsoft_docs_search result citation. Both completed GET and streamed retrieval omit the actual MCP call/result steps on this route; the citation also lacks a source URL. The common parser retains native calls/results/thinking/citation data when actually returned, but RubyLLM does not invent missing records or URLs. This remains partial, consistently with other providers that drop expected tool-result records. The existing ordinary model chat route is unchanged. Hosted MCP exposes no approval policy; unsupported approval options raise before submission.","sources":["s203","s205","s33","s363"]},{"notes":"Agent skills: Managed Agents can configure skills and environments. Neither version implements these agent or skill resources.","sources":["s204"]},{"notes":"Browser use, Computer use, Context editing, Tool search, Shell and computer tools: Claude on Google Cloud documents this tool/context feature. 2.0 can inject its Anthropic wire declaration and caller-managed behavior; 1.16 has no Anthropic publisher protocol.","sources":["s33"]},{"notes":"Fast inference: Priority PayGo uses the X-Vertex-AI-LLM-Shared-Request-Type header, available through request headers in both versions. Claude fast mode is not offered on Google Cloud.","sources":["s207","s208"]},{"notes":"File listing and deletion: GCS exposes object listing/deletion; the public RubyLLM UploadedFile API only uploads, finds and downloads. Internal batch-output listing is not a general file-management API.","sources":["s209"]},{"notes":"File search store management, Vector store management: RAG Engine exposes corpus and file lifecycle plus managed vector storage. Neither version implements these resources; raw retrieval can use an externally prepared corpus.","sources":["s210"]},{"notes":"Fine-tuning: Google Cloud supports tuning jobs. RubyLLM has no tuning lifecycle client; this is outside inference operation totals.","sources":["s69"]},{"notes":"Guardrail configuration: Gemini safetySettings and Model Armor request settings can be passed as provider options. Separate Cloud security services are outside this inference row.","sources":["s202"]},{"notes":"Image batches: Google Cloud documents batch image generation. 2.0 can stage raw image-output Gemini chat requests through its batch client and parse attachments; no batched paint API.","sources":["s211"]},{"notes":"Interactions API: RubyLLM now registers a dedicated Vertex Interactions dialect for single-turn hosted Deep Research; see Asynchronous research for its implemented lifecycle. A general Vertex Interactions conversation/client API for other agent/model families, continuation and resource management remains unimplemented. Earlier ordinary Gemini model requests to this Vertex endpoint returned Unsupported model interaction.","sources":["s203","s205","s363"]},{"notes":"JSON object mode: Gemini generationConfig supports application/json without a schema; both versions can pass it as provider options.","sources":["s202"]},{"notes":"Music generation: Lyria music is exposed through Vertex Interactions and Lyria model APIs. RubyLLM has no matching music protocol or result API.","sources":["s203"]},{"notes":"Omni video generation, Video editing: Google Cloud documents Omni generation and video editing through Interactions. RubyLLM implements Veo prediction jobs but has no Interactions protocol.","sources":["s212","s213"]},{"notes":"Prefix completion: 2.0 supports older Claude publisher routes with assistant prefill; raw messages can be supplied. Claude 4.6 and newer reject prefill. 1.16 lacks the Anthropic publisher adapter.","sources":["s188","s33"]},{"notes":"Responses API: Google Cloud offers Grok Responses at endpoints/openapi/responses. RubyLLM Vertex only registers Gemini, Anthropic, Mistral and Chat Completions; no Responses route.","sources":["s206"]},{"notes":"Streaming speech generation: Vertex Live provides streamed generated speech; RubyLLM has no Live transport. Its synchronous speak path does not stream audio.","sources":["s215","s216"]},{"notes":"Task budgets: Claude task budgets are documented on the direct API, but the task-budget page does not establish availability on this cloud platform. No platform-specific confirmation found; raw option acceptance alone is insufficient.","sources":["s217","s33"]},{"notes":"Voice cloning: The generateContent schema documents replicatedVoiceConfig from an audio sample. Raw speech configuration can be supplied; no common voice-cloning API or resource lifecycle exists.","sources":["s202"]}]},{"id":"bedrock","name":"Amazon Bedrock","notes":"The audit covers Bedrock foundation-model inference through Runtime and Mantle, plus documented inference resources and controls. Features may require an explicit protocol, model, region or IAM permission. Separate AWS Data Automation, AgentCore and general AWS services are outside scope.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported Converse, tools, JSON schemas, images/documents and thinking effort/budget. 2.0 adds Mantle Anthropic/Responses/Chat Completions routing and newer model-specific controls. Converse has no force-none tool choice.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported Converse, tools, JSON schemas, images/documents and thinking effort/budget. 2.0 adds Mantle Anthropic/Responses/Chat Completions routing and newer model-specific controls. Converse has no force-none tool choice.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported Converse, tools, JSON schemas, images/documents and thinking effort/budget. 2.0 adds Mantle Anthropic/Responses/Chat Completions routing and newer model-specific controls. Converse has no force-none tool choice.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported Converse, tools, JSON schemas, images/documents and thinking effort/budget. 2.0 adds Mantle Anthropic/Responses/Chat Completions routing and newer model-specific controls. Converse has no force-none tool choice.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"}]},"pdf_input":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported Converse, tools, JSON schemas, images/documents and thinking effort/budget. 2.0 adds Mantle Anthropic/Responses/Chat Completions routing and newer model-specific controls. Converse has no force-none tool choice.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"}]},"audio_input":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 media formatter rejected audio/video unless supplied as raw blocks. 2.0 renders native Converse audio/video content for supporting models.","sources":["s70"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb","method":"render_attachment"},{"version":"v2","path":"lib/ruby_llm/protocols/converse/media.rb","method":"format_audio_attachment, format_video_attachment"}]},"video_input":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 media formatter rejected audio/video unless supplied as raw blocks. 2.0 renders native Converse audio/video content for supporting models.","sources":["s70"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb","method":"render_attachment"},{"version":"v2","path":"lib/ruby_llm/protocols/converse/media.rb","method":"format_audio_attachment, format_video_attachment"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported Converse, tools, JSON schemas, images/documents and thinking effort/budget. 2.0 adds Mantle Anthropic/Responses/Chat Completions routing and newer model-specific controls. Converse has no force-none tool choice.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported Converse, tools, JSON schemas, images/documents and thinking effort/budget. 2.0 adds Mantle Anthropic/Responses/Chat Completions routing and newer model-specific controls. Converse has no force-none tool choice.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"}]},"citations":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 supports document citation configuration and parses Converse citationsContent into Citation values. Mantle Anthropic uses native Anthropic citation parsing.","sources":["s70","s35"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/converse/chat.rb","method":"extract_text_and_citations"},{"version":"v2","path":"lib/ruby_llm/protocols/converse/media.rb"}]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported Converse, tools, JSON schemas, images/documents and thinking effort/budget. 2.0 adds Mantle Anthropic/Responses/Chat Completions routing and newer model-specific controls. Converse has no force-none tool choice.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported Converse, tools, JSON schemas, images/documents and thinking effort/budget. 2.0 adds Mantle Anthropic/Responses/Chat Completions routing and newer model-specific controls. Converse has no force-none tool choice.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"1.16 already supported Converse, tools, JSON schemas, images/documents and thinking effort/budget. 2.0 adds Mantle Anthropic/Responses/Chat Completions routing and newer model-specific controls. Converse has no force-none tool choice.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/streaming.rb"},{"version":"v1","path":"lib/ruby_llm/providers/bedrock/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"}]},"parallel_tool_control":{"v1":"passthrough","v2":"native","offered":true,"notes":"Converse formatter ignores calls: :one; Anthropic-on-Mantle gains native disable_parallel_tool_use. Provider-specific request fields remain necessary on other eligible routes.","sources":["s70","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/converse/chat.rb","method":"format_tool_config"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock/mantle/anthropic.rb"}]},"server_web_search":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 supports Nova grounding through Converse. AWS Mantle web_search also works with explicit protocol: :mantle_responses on supported GPT models; automatic model routing currently omits those GPT-5.x IDs. Model/region/IAM restrictions apply.","sources":["s227","s228"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"server_web_fetch":{"v1":"missing","v2":"native","offered":true,"notes":"AWS Mantle GPT web_search includes provider-executed Fetch. Use protocol: :mantle_responses explicitly: the automatic Responses allowlist currently omits the supported GPT-5.x models. Model, US region and IAM/external_web_access restrictions apply.","sources":["s227"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock/mantle/responses.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock/mantle.rb","method":"RESPONSES_MODELS"},{"version":"v2","path":"lib/ruby_llm/chat.rb","method":"with_model"}]},"server_code_execution":{"v1":"na","v2":"na","offered":false,"notes":"No hosted interpreter documented in audited Bedrock inference tools. AgentCore Code Interpreter is separate.","sources":["s229","s33"],"code":[]},"server_file_search":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Bedrock Knowledge Bases offer RetrieveAndGenerate with provider-managed session state. RubyLLM does not integrate that conversation lifecycle. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s70","s422","s423","s424","s425","s426","s427","s428"],"code":[]},"server_mcp":{"v1":"missing","v2":"native","offered":true,"notes":"Mantle Responses accepts MCP connector_id ARNs for existing Lambda functions or AgentCore Gateways. The named alias, completed remote results and stateless replay are covered by a protocol regression. AgentCore Gateway requires require_approval:never; public server_url is unsupported, confirmed by a live HTTP 400. No configured connector ARN was available for live discovery/execution. This is documented connector support, not public HTTP MCP parity or live-verified approval continuation.","sources":["s229"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"parse_server_tool_items"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock/mantle/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","model":"openai.gpt-oss-20b","notes":"No configured MCP connector ARN. Live Mantle response explicitly rejects server_url and asks for connector_id; no AWS resources provisioned."},{"status":"unit","spec":"spec/ruby_llm/providers/bedrock/mantle_spec.rb","example":"RubyLLM::Providers::Bedrock::Mantle request shape renders ARN-backed MCP connectors and replays their completed results"}]},"prompt_caching":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 parsed cache usage and accepted raw cachePoint blocks. 2.0 common caching API sets Converse cache points with TTL and supports Anthropic cache_control on Mantle. Only eligible models/prompts cache.","sources":["s72"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb","method":"parse_completion_response"},{"version":"v2","path":"lib/ruby_llm/protocols/converse/chat.rb","method":"converse_cache_block_for, cache_boundary?"}]},"cache_boundaries":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 parsed cache usage and accepted raw cachePoint blocks. 2.0 common caching API sets Converse cache points with TTL and supports Anthropic cache_control on Mantle. Only eligible models/prompts cache.","sources":["s72"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock/chat.rb","method":"parse_completion_response"},{"version":"v2","path":"lib/ruby_llm/protocols/converse/chat.rb","method":"converse_cache_block_for, cache_boundary?"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"This row means a separately addressable create/find/update/delete cache resource, not AWS explicit prompt cache checkpoints; checkpoints are counted under cache_boundaries.","sources":["s72"],"code":[]},"compaction":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 supports Anthropic compaction on Mantle via inherited protocol. Converse protocol does not implement common with_compaction translation; older Claude routes may need raw options.","sources":["s38"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock/mantle/anthropic.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/anthropic/chat.rb","method":"apply_compaction"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"apply_compaction"}]},"token_counting":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 CountTokens for Converse and signed Anthropic token-count endpoint on Mantle.","sources":["s73","s33"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/converse/chat.rb","method":"count_tokens_url"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock/mantle/anthropic.rb","method":"count_tokens_url"}]},"image_generation":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.paint supports Stability SD3.5 Large, Stable Image Core 1.1 and Ultra 1.1 through signed Bedrock InvokeModel. Generation size selects an aspect ratio, not exact pixel dimensions; these models return one image per request. MIME type is read from returned bytes because live SD3.5 returned JPEG despite its documented PNG default. SD3.5 generation was live-verified; Core and Ultra share the documented contract but were not called live. Nova Canvas and Titan image serializers are not integrated. Canvas was marked legacy and denied new use by the configured account; Titan was absent from the audited regional catalogs.","sources":["s331","s332","s333","s77","s75"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"image_protocol_for"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/stability_images.rb","method":"paint / render_image_payload / parse_image_responses"}]},"image_editing":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.paint with a source image supports SD3.5 image-to-image generation; provider_options accepts strength. Stable Image Inpaint supports an explicit mask or the source alpha channel, including typed Attachment masks. These operations accept one source image and no separate size option. SD3.5 image-to-image produces a one-megapixel output. Source-and-mask inpainting was live-verified through the us.stability.stable-image-inpaint-v1:0 inference profile. Other Stability edit services, including outpainting, upscaling, background removal and search/replace, are not integrated.","sources":["s331","s334","s335","s77","s75"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/stability_images.rb","method":"render_image_inputs / render_inpaint_inputs / single_image"}]},"video_generation":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.animate and animate_later select a dedicated Luma Ray 2 async-invoke protocol for luma.ray-v2:0. Signed non-retried submission returns VideoJob; refresh maps documented status and preserves failure/raw metadata. Existing with: accepts one or two PNG/JPEG first/last-frame images. Explicit bedrock_video_s3_uri is required, separate from batch storage. Completed output uses the job-returned S3 prefix, lists only that prefix, and downloads its sole MP4 through existing authenticated file APIs. No cancellation or extension is claimed. Fresh regional catalog confirms the model ACTIVE; actual generation awaits an intended S3 test prefix. Nova Reel is LEGACY with September 30, 2026 retirement, so no new legacy adapter was added.","sources":["s78","s400","s401","s402","s403"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/bedrock/async_videos.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for, video_protocol_for"},{"version":"v2","path":"lib/ruby_llm/protocols/bedrock/files.rb","method":"list_uris, download"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","model":"luma.ray-v2:0","spec":"spec/ruby_llm/protocols/bedrock/async_videos_spec.rb","notes":"No job submitted or S3 object written. Meaningful offline lifecycle tests cover submission/poll/download; no successful live generation or S3 download claimed. Fresh GET catalog confirms ACTIVE and asyncInvoke:true in us-west-2, not a generation request."},{"status":"unit","spec":"spec/ruby_llm/protocols/bedrock/async_videos_spec.rb","example":"signs one submission, polls its ARN, and downloads the single MP4 under the returned output prefix","notes":"Documented request/result lifecycle and provider endpoint/auth handling have focused regressions."}]},"speech":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Bedrock speech output uses Nova Sonic and Nova 2 Sonic through InvokeModelWithBidirectionalStream, a bidirectional voice-conversation endpoint rather than standalone text-to-speech. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s222","s79"],"code":[]},"transcription":{"v1":"passthrough","v2":"native","offered":true,"notes":"transcribe supports mistral.voxtral-small-24b-2507 through a dedicated Mantle Chat Completions dialect using input_audio with MP3 or WAV input. Returns typed Transcription text and reported prompt/completion token usage; real WAV speech was transcribed correctly. This is synchronous file transcription through an audio-capable text model, not a hosted audio/transcriptions endpoint or realtime/bidirectional stream. Streaming blocks, speaker metadata and non-text transcript formats are rejected explicitly; language and prompt guide the transcript. Routing is limited to the verified Small24B model; existing conversation and other model routes are unchanged.","sources":["s336","s230","s80"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"protocol_for"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock/mantle/voxtral.rb","method":"transcribe / render_transcription_payload / parse_transcription_response"}]},"streaming_transcription":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.transcribe with a block sends the complete WAV/MP3 to Mantle Voxtral and yields generated transcript text, followed by one final complete transcript. This is output streaming from an uploaded file, not a live microphone session. Requires a terminal stop; truncated or interrupted streams raise. Actual token/cache usage is retained. No timestamps or diarization are invented. Nova Sonic remains outside this operation because audio EOF does not reliably flush pending ASR.","sources":["s79","s432","s230"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock/mantle/voxtral.rb","method":"transcribe / stream_transcription"}],"verification":[{"status":"passed","model":"mistral.voxtral-small-24b-2507","spec":"spec/ruby_llm/providers/bedrock/mantle/voxtral_spec.rb","example":"streams a complete multi-utterance WAV transcript through Bedrock Voxtral with typed usage","cassette":"spec/fixtures/vcr_cassettes/providers_bedrock_mantle_voxtral_streams_a_complete_multi-utterance_wav_transcript_through_bedrock_voxtral_with_typed_usage.yml","checked_on":"2026-09-07","notes":"CI=true focused suite: 15 examples, 0 failures."}]},"diarization":{"v1":"na","v2":"na","offered":false,"notes":"No diarization output documented in audited foundation-model APIs. Data Automation and Amazon Transcribe are separate.","sources":["s222","s230"],"code":[]},"moderation":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.moderate(provider: :bedrock) applies the explicitly configured existing Bedrock guardrail ID/version through signed ApplyGuardrail. No foundation model is selected. Text arrays map to separate requests and verdicts; PNG/JPEG attachments can accompany a single text or be checked alone. flagged? reflects GUARDRAIL_INTERVENED, including masking. Category names/types reflect actual intervening policy filters. Exact assessments, output replacements, and policy usage units are retained in Moderation.raw; probability scores, model, tokens, and cost remain absent rather than inferred. No guardrail creation or policy selection is implemented. Live execution is unavailable because no authorized existing guardrail ID/version was supplied.","sources":["s81","s429","s430","s431"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/bedrock/guardrails.rb","method":"moderate"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"model_required? / guardrail_url / protocol_for"},{"version":"v2","path":"lib/ruby_llm/moderation.rb","method":"moderate / raw"}],"verification":[{"status":"unavailable","spec":"spec/ruby_llm/protocols/bedrock/guardrails_spec.rb","example":"applies an explicitly selected existing guardrail and reports its actual verdict","checked_on":"2026-09-07","notes":"BEDROCK_GUARDRAIL_ID and BEDROCK_GUARDRAIL_VERSION are unset; no resource was created or selected implicitly. 1 live example, 0 failures, 1 explicit resource pending; no live cassette created"},{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/bedrock/guardrails_spec.rb","notes":"Configured guardrail text/image verdicts, policy records, model-free usage, failed later requests and no resource override covered; actual AR nil-model persistence and install/upgrade migration parity pass."}]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated foundation-model OCR operation documented. Bedrock Data Automation and Textract are separate surfaces.","sources":["s220","s219"],"code":[]},"embeddings":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 routes InvokeModel to Titan text/image, Cohere text/image, and Nova multimodal embeddings. Native coverage is for these named model protocols, not every embedding model on the platform.","sources":["s74","s75"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"embedding_protocol_for"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/titan_text_embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/titan_multimodal_embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/cohere_embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/nova_embeddings.rb"}]},"multimodal_embeddings":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 routes InvokeModel to Titan text/image, Cohere text/image, and Nova multimodal embeddings. Native coverage is for these named model protocols, not every embedding model on the platform.","sources":["s74","s75"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"embedding_protocol_for"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/titan_text_embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/titan_multimodal_embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/cohere_embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/nova_embeddings.rb"}]},"reranking":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.rerank uses Bedrock agent-runtime /rerank with Amazon Rerank or Cohere Rerank model ARNs. It consumes nextToken pages and returns original document indices/text plus relevance scores. Text and JSON inline sources are supported, with one query and up to1000 documents. Token usage/cost are unknown because the API does not return them. Fresh Amazon Rerank request passed; Cohere uses the same documented contract but was not separately live-tested.","sources":["s76"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/bedrock/rerank.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"agent_api_base, agent_connection, rerank_model_arn"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"amazon.rerank-v1:0","spec":"spec/ruby_llm/protocols/bedrock/rerank_spec.rb","example":"RubyLLM::Protocols::Bedrock::Rerank reranks actual documents with Amazon Rerank and leaves unreported usage unknown","cassette":"spec/fixtures/vcr_cassettes/protocols_bedrock_rerank_reranks_actual_documents_with_amazon_rerank_and_leaves_unreported_usage_unknown.yml","notes":"Actual top document index1 and positive relevance score; unreported usage/cost remain nil."},{"status":"unit","spec":"spec/ruby_llm/protocols/bedrock/rerank_spec.rb","notes":"Pagination and raw pages, repeated cursor rejection, index bounds, unsupported input/model checks, JSON sources and SigV4 endpoint routing."}]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 uses S3 storage behind normalized upload/download and attaches supported s3Location references; requires aws-sdk-s3 and configured bucket permissions. This is not an Anthropic Files endpoint.","sources":["s70","s82"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/bedrock/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/converse/media.rb"}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 uses S3 storage behind normalized upload/download and attaches supported s3Location references; requires aws-sdk-s3 and configured bucket permissions. This is not an Anthropic Files endpoint.","sources":["s70","s82"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/bedrock/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/converse/media.rb"}]},"chat_batches":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 submits Converse Model Invocation Jobs with S3 input/output. Implementation rejects tools and structured output for this route; Mantle-specific batch formats are not implemented.","sources":["s82"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/converse/batches.rb"}]},"embedding_batches":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.batch accepts staged text embeddings for Titan Text Embeddings V2 and Titan Multimodal Embeddings G1 through InvokeModel batch jobs. Shared S3/job lifecycle supports submission, refresh, cancellation and typed Embedding results. Array requests fan out into provider records and restore original scalar/array shapes across shuffled shards; failures retain logical positions. Batch.find recovers the protocol and logical request count from provider-returned job metadata. Missing token counts stay unknown, and clientRequestToken protects job creation retries. Caller-selected S3 prefix and batch role are required; no bucket or role is provisioned. Live submission is unavailable until those intended resources are supplied.","sources":["s74","s404","s405","s406","s407","s411"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/converse/batches.rb","method":"create_batch, parse_bedrock_record"},{"version":"v2","path":"lib/ruby_llm/protocols/bedrock/batches.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/converse/batches.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/embedding_batches.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/titan_text_embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/invoke_model/titan_multimodal_embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}],"verification":[{"status":"unit","spec":"spec/ruby_llm/protocols/invoke_model/embedding_batches_spec.rb","notes":"Public stage/submit/find/collect/cancel lifecycle with protocol stubs; scalar/array identity, shuffled records, malformed scalar counts, nonnumeric/duplicate/missing/error output, unknown usage, required resources and unsupported models. 48 focused/common Batch examples pass, including unchanged Converse cases."},{"status":"unavailable","checked_on":"2026-09-07","model":"amazon.titan-embed-text-v2:0","notes":"No intended S3 batch prefix or batch role is configured. User resource question is pending; no S3 object or batch job was created. Unit validation is not a successful live inference claim. Permanent live test skips only missing explicit resource/credential configuration before writes, and restores its recorded resource prefix during CI replay.","spec":"spec/ruby_llm/protocols/invoke_model/embedding_batches_spec.rb","example":"RubyLLM::Protocols::InvokeModel::EmbeddingBatches submits, reloads and cancels an embedding batch using explicitly configured S3 resources"},{"status":"unavailable","checked_on":"2026-09-07","model":"amazon.titan-embed-text-v2:0","notes":"The completed-result live test waits up to 180 seconds for 100 physical records, the published Titan minimum. It checks scalar/array order, 256-dimensional numeric vectors, actual token usage, request hydration, successful statuses and Batch.find roundtrip. Missing explicit S3/role configuration skips before writes; queue timeouts remain unavailable. Only the test-owned job is cancelled. S3 cleanup uses that fixture’s unique directory after a terminal state; otherwise artifacts remain.","spec":"spec/ruby_llm/protocols/invoke_model/embedding_batches_spec.rb","example":"RubyLLM::Protocols::InvokeModel::EmbeddingBatches collects completed embedding vectors with original scalar and array shapes from S3"}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"Not offered on AWS-operated Bedrock in Claude platform matrix; separate AgentCore features are excluded.","sources":["s33","s219"],"code":[]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Perplexity Agent API.","sources":["s220"],"code":[]},"agent_skills":{"v1":"na","v2":"na","offered":false,"notes":"Not offered on AWS-operated Bedrock in Claude platform matrix; separate AgentCore features are excluded.","sources":["s33","s219"],"code":[]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"background_responses":{"v1":"missing","v2":"partial","offered":true,"notes":"Mantle Responses documents background execution. Raw provider options can express request fields, but RubyLLM has no hosted-response retrieval, polling or cancellation lifecycle. Normal chat requests send store:false and replay application-owned history.","sources":["s221"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"}]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"Not offered on AWS-operated Bedrock in Claude platform matrix; separate AgentCore features are excluded.","sources":["s33","s219"],"code":[]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"computer_use":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Claude on Bedrock documents this feature. Provider-specific tool/context declarations and caller-managed execution or state are required.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"context_editing":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Claude on Bedrock documents this feature. Provider-specific tool/context declarations and caller-managed execution or state are required.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"dedicated_transcription_api":{"v1":"na","v2":"na","offered":false,"notes":"Voxtral is served through model inference, without a dedicated transcription endpoint; Data Automation is separate.","sources":["s222"],"code":[]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"fast_inference":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Converse performanceConfig.latency optimized is available through raw options in both versions on AWS-listed models/regions.","sources":["s223"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"S3 offers object listing/deletion. RubyLLM public file API only uploads, finds and downloads; internal batch-output listing does not expose general management.","sources":["s224"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"file_search_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Bedrock managed Knowledge Bases expose managed retrieval storage and lifecycle operations. RubyLLM has no Knowledge Base resource client.","sources":["s225"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"fine_tuning":{"v1":"missing","v2":"missing","offered":true,"notes":"Provider exposes model customization jobs; RubyLLM does not manage them. Outside inference totals.","sources":["s83"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"guardrail_configuration":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"guardrailConfig can be set on Converse using raw request options in both versions; not a provider-neutral feature API.","sources":["s70"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"render"}]},"hosted_conversations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Amazon Bedrock documents provider-managed conversation storage or hosted conversation resources. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s221"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"}]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Google Interactions API.","sources":["s220"],"code":[]},"json_mode":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"mantle_protocols":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 routes newer Claude models to Mantle Anthropic and OpenAI models to Responses/Chat Completions with SigV4; 1.16 only had Converse.","sources":["s33"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb","method":"mantle_protocol_for"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock/mantle.rb"}]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"Provider-specific row: Google Gemini Omni.","sources":["s220"],"code":[]},"partner_model_protocols":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 selects Converse, Mantle Messages/Responses/Chat Completions and several InvokeModel embedding dialects. 1.16 implements Converse only.","sources":["s222"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"prefix_completion":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Older Claude models can consume final assistant prefill through raw messages; newer Claude models reject it. No common prefix setter.","sources":["s226"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"Not offered on AWS-operated Bedrock in Claude platform matrix; separate AgentCore features are excluded.","sources":["s33","s219"],"code":[]},"prompt_cache_controls":{"v1":"passthrough","v2":"native","offered":true,"notes":"1.16 requires raw cachePoint/provider options. 2.0 exposes with_caching and explicit cache boundaries on supported Converse and Mantle Anthropic routes.","sources":["s72"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"Not offered on AWS-operated Bedrock in Claude platform matrix; separate AgentCore features are excluded.","sources":["s33","s219"],"code":[]},"realtime":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Amazon Bedrock documents realtime conversations. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s222","s79"],"code":[]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"responses":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 registers Mantle Responses; 1.16 only implements Converse.","sources":["s221"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"server_tool_search":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Claude on Bedrock documents this feature. Provider-specific tool/context declarations and caller-managed execution or state are required.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"shell_computer_tools":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Claude on Bedrock documents this feature. Provider-specific tool/context declarations and caller-managed execution or state are required.","sources":["s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"streaming_speech":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Bedrock speech output uses Nova Sonic and Nova 2 Sonic through InvokeModelWithBidirectionalStream, a bidirectional voice-conversation endpoint rather than standalone text-to-speech. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s222"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"}]},"task_budgets":{"v1":"unknown","v2":"unknown","offered":null,"notes":"Claude task budgets are documented on the direct API, but the task-budget page does not establish availability on this cloud platform. No platform-specific confirmation found; raw option acceptance alone is insufficient.","sources":["s217","s33"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"vector_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Bedrock managed Knowledge Bases expose managed retrieval storage and lifecycle operations. RubyLLM has no Knowledge Base resource client.","sources":["s225"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/bedrock.rb"},{"version":"v2","path":"lib/ruby_llm/providers/bedrock.rb"}]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"video_editing":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"voice_cloning":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"Not documented in audited API inventory.","sources":["s220"],"code":[]}},"gaps":[{"notes":"Background Responses jobs: Mantle Responses documents background execution. Raw provider options can express request fields, but RubyLLM has no hosted-response retrieval, polling or cancellation lifecycle. Normal chat requests send store:false and replay application-owned history.","sources":["s221"]},{"notes":"Computer use, Context editing, Tool search, Shell and computer tools: Claude on Bedrock documents this feature. Provider-specific tool/context declarations and caller-managed execution or state are required.","sources":["s33"]},{"notes":"Fast inference: Converse performanceConfig.latency optimized is available through raw options in both versions on AWS-listed models/regions.","sources":["s223"]},{"notes":"File listing and deletion: S3 offers object listing/deletion. RubyLLM public file API only uploads, finds and downloads; internal batch-output listing does not expose general management.","sources":["s224"]},{"notes":"File search store management, Vector store management: Bedrock managed Knowledge Bases expose managed retrieval storage and lifecycle operations. RubyLLM has no Knowledge Base resource client.","sources":["s225"]},{"notes":"Fine-tuning: Provider exposes model customization jobs; RubyLLM does not manage them. Outside inference totals.","sources":["s83"]},{"notes":"Guardrail configuration: guardrailConfig can be set on Converse using raw request options in both versions; not a provider-neutral feature API.","sources":["s70"]},{"notes":"Prefix completion: Older Claude models can consume final assistant prefill through raw messages; newer Claude models reject it. No common prefix setter.","sources":["s226"]},{"notes":"Task budgets: Claude task budgets are documented on the direct API, but the task-budget page does not establish availability on this cloud platform. No platform-specific confirmation found; raw option acceptance alone is insufficient.","sources":["s217","s33"]}]},{"id":"azure","name":"Azure OpenAI / Foundry","notes":"The audit covers Azure OpenAI and Foundry model inference, including documented partner-model embedding and reranking operations. Azure Speech, Content Safety and Document Intelligence are separate products outside scope. Image and audio operations have Azure-specific endpoint handling with HTTP regression coverage. Live checks returned DeploymentNotFound for the configured resource; these operations still require compatible deployments.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"Inherited Chat Completions behavior existed in 1.16. 2.0 adds a separate Azure Responses dialect. Capabilities depend on deployment, model and API version.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"Inherited Chat Completions behavior existed in 1.16. 2.0 adds a separate Azure Responses dialect. Capabilities depend on deployment, model and API version.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"Inherited Chat Completions behavior existed in 1.16. 2.0 adds a separate Azure Responses dialect. Capabilities depend on deployment, model and API version.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"Azure media formatting includes image and input_audio blocks in both versions. Audio requires a compatible deployment.","sources":["s9"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/media.rb"}]},"pdf_input":{"v1":"missing","v2":"native","offered":true,"notes":"Default Azure Chat Completions rejects PDFs; explicitly selecting Responses in 2.0 enables input_file formatting.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/media.rb"}]},"audio_input":{"v1":"native","v2":"native","offered":true,"notes":"Azure media formatting includes image and input_audio blocks in both versions. Audio requires a compatible deployment.","sources":["s9"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/media.rb"}]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"No separately created cache resource or direct conversation video attachment operation in the Azure OpenAI surface audited here.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"Inherited Chat Completions behavior existed in 1.16. 2.0 adds a separate Azure Responses dialect. Capabilities depend on deployment, model and API version.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"Inherited Chat Completions behavior existed in 1.16. 2.0 adds a separate Azure Responses dialect. Capabilities depend on deployment, model and API version.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"citations":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 returns typed URL, file-search and container-file citations, including source_id and filename for file references. Sync and streaming parsing preserve text offsets across output parts and retain final-only annotations. 1.16 exposed annotations through the raw response.","sources":["s10"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/citation.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/streaming.rb"}]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"Inherited Chat Completions behavior existed in 1.16. 2.0 adds a separate Azure Responses dialect. Capabilities depend on deployment, model and API version.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"Inherited Chat Completions behavior existed in 1.16. 2.0 adds a separate Azure Responses dialect. Capabilities depend on deployment, model and API version.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"Inherited Chat Completions behavior existed in 1.16. 2.0 adds a separate Azure Responses dialect. Capabilities depend on deployment, model and API version.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"parallel_tool_control":{"v1":"native","v2":"native","offered":true,"notes":"Inherited Chat Completions behavior existed in 1.16. 2.0 adds a separate Azure Responses dialect. Capabilities depend on deployment, model and API version.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"server_web_search":{"v1":"missing","v2":"native","offered":true,"notes":"The Azure Responses protocol exposes with_server_tools(:web_search), including provider options such as domain filters. Search, page-opening actions and returned citations use the shared Responses parser. Page opening is part of web_search, not a separate web_fetch request type.","sources":["s10"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb"},{"version":"v2","path":"spec/ruby_llm/providers/azure/responses_spec.rb"}]},"server_web_fetch":{"v1":"missing","v2":"native","offered":true,"notes":"The Azure Responses protocol exposes with_server_tools(:web_search), including provider options such as domain filters. Search, page-opening actions and returned citations use the shared Responses parser. Page opening is part of web_search, not a separate web_fetch request type.","sources":["s10"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb"},{"version":"v2","path":"spec/ruby_llm/providers/azure/responses_spec.rb"}]},"server_code_execution":{"v1":"missing","v2":"native","offered":true,"notes":"Azure Responses inherits hosted-tool aliases. Availability still depends on deployed models and region. File search requires externally provisioned vector stores.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"server_file_search":{"v1":"missing","v2":"native","offered":true,"notes":"Azure Responses inherits hosted-tool aliases. Availability still depends on deployed models and region. File search requires externally provisioned vector stores.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"server_mcp":{"v1":"missing","v2":"native","offered":true,"notes":"The mcp alias connects remote tools. Pending approvals appear in pending_approvals with server/name/arguments; approve or deny then complete resumes through provider-owned decision items. Completed remote calls remain ServerToolCall. Local tools with matching names never execute. Supports stateless history replay, streaming and Rails/Agent persistence. Fresh gpt-5-nano live approval, denial and streamed continuation all passed.","sources":["s8","s338"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"parse_server_tool_items"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/approvals.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/chat.rb"},{"version":"v2","path":"lib/ruby_llm/tool_call.rb"},{"version":"v2","path":"lib/ruby_llm/active_record/chat_methods.rb"},{"version":"v2","path":"lib/ruby_llm/active_record/tool_call.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"gpt-5-nano","spec":"spec/ruby_llm/chat_mcp_spec.rb","example":"RubyLLM::Chat remote MCP tools azure executes a remote read-only tool after approval using stateless continuation","cassette":"spec/fixtures/vcr_cassettes/chat_remote_mcp_tools_azure_executes_a_remote_read-only_tool_after_approval_using_stateless_continuation.yml","notes":"Fresh provider calls, 2 HTTP 200 responses; public read-only Microsoft Learn MCP tool. Approval continuation uses replayed history with store:false."},{"status":"passed","recorded_on":"2026-09-07","model":"gpt-5-nano","spec":"spec/ruby_llm/chat_mcp_spec.rb","example":"RubyLLM::Chat remote MCP tools azure denies a remote call without executing it","cassette":"spec/fixtures/vcr_cassettes/chat_remote_mcp_tools_azure_denies_a_remote_call_without_executing_it.yml","notes":"Fresh provider calls, 2 HTTP 200 responses; public read-only Microsoft Learn MCP tool. Approval continuation uses replayed history with store:false."},{"status":"passed","recorded_on":"2026-09-07","model":"gpt-5-nano","spec":"spec/ruby_llm/chat_mcp_spec.rb","example":"RubyLLM::Chat remote MCP tools azure streams a remote approval and its completed result","cassette":"spec/fixtures/vcr_cassettes/chat_remote_mcp_tools_azure_streams_a_remote_approval_and_its_completed_result.yml","notes":"Fresh provider calls, 2 HTTP 200 responses; public read-only Microsoft Learn MCP tool. Approval continuation uses replayed history with store:false."}]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"Automatic cache reuse/accounting in both versions. 2.0 adds named configuration.","sources":["s11"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"cache_read_tokens"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"apply_prompt_cache_params"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"prompt_cache_params"}]},"cache_boundaries":{"v1":"passthrough","v2":"native","offered":true,"notes":"Explicit boundaries work on GPT-5.6+ Standard deployments. Azure documents rejection on older models and no support on PTU-M deployments.","sources":["s11"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure/media.rb","method":"format_content"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"inject_cache_breakpoint"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"No separately created cache resource or direct conversation video attachment operation in the Azure OpenAI surface audited here.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"compaction":{"v1":"missing","v2":"native","offered":true,"notes":"with_compaction enables provider-managed threshold compaction and preserves its output for subsequent turns. Chat#compact explicitly invokes Responses /compact. Native full compaction envelope resets only subsequent wire context; all historical messages and current instructions retained. Rails Agent.find/reload, multiple rounds, usage persistence and cancellation unit-tested. Pending local/MCP tool calls block compaction. Automatic with_compaction support remains separate and provider-specific.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"apply_compaction"},{"version":"v2","path":"lib/ruby_llm/chat.rb"},{"version":"v2","path":"lib/ruby_llm/active_record/chat_methods.rb"},{"version":"v2","path":"lib/ruby_llm/agent.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/compaction.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"}],"verification":[{"status":"passed","model":"grok-4-1-fast-non-reasoning","spec":"spec/ruby_llm/chat_compact_spec.rb","example":"compacts and continues a conversation with azure","cassette":"spec/fixtures/vcr_cassettes/chat_compacts_and_continues_a_conversation_with_azure.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: manual compact returns typed assistant Message, native response.compaction envelope preserved, all original history retained, positive compaction input usage, continued response recalls Thimble and has positive input usage."}]},"token_counting":{"v1":"na","v2":"na","offered":false,"notes":"No standalone token-count endpoint is documented in the current Azure OpenAI Responses REST reference or v1 preview operation inventory. Usage fields are post-generation accounting; local tokenizers are outside this hosted endpoint comparison.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"image_generation":{"v1":"partial","v2":"native","offered":true,"notes":"paint sends Azure image-generation requests and parses URL/base64 images. Resource and /openai/v1 bases use the Azure v1 media endpoints with api-version=preview by default. Deployment bases retain their deployment path and explicit API version, defaulting to 2025-04-01-preview. Requires a compatible model deployment. Contract and HTTP unit tests pass; live requests returned DeploymentNotFound for the configured resource, so no successful live response was verified.","sources":["s149","s312","s313","s9"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb","method":"azure_media_url"},{"version":"v2","path":"lib/ruby_llm/providers/azure/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/images.rb"},{"version":"v2","path":"spec/ruby_llm/providers/azure/chat_completions_operations_spec.rb"}]},"image_editing":{"v1":"partial","v2":"native","offered":true,"notes":"paint with: and mask: uses Azure multipart uploads even for GPT image models, preserves size/count, and accepts custom deployment names. Resource and /openai/v1 bases use the Azure v1 media endpoints with api-version=preview by default. Deployment bases retain their deployment path and explicit API version, defaulting to 2025-04-01-preview. Requires a compatible model deployment. Contract and HTTP unit tests pass; live requests returned DeploymentNotFound for the configured resource, so no successful live response was verified.","sources":["s149","s312","s313","s9"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb","method":"azure_media_url"},{"version":"v2","path":"lib/ruby_llm/providers/azure/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/images.rb"},{"version":"v2","path":"spec/ruby_llm/providers/azure/chat_completions_operations_spec.rb"}]},"video_generation":{"v1":"missing","v2":"native","offered":true,"notes":"Dedicated Azure Sora job create/poll/download implementation follows the Azure documented job schema. Reference-image input is not rendered by this dialect.","sources":["s14"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/videos.rb"}]},"speech":{"v1":"missing","v2":"native","offered":true,"notes":"speak sends Azure audio/speech requests and returns the binary Speech result. Resource and /openai/v1 bases use the Azure v1 media endpoints with api-version=preview by default. Deployment bases retain their deployment path and explicit API version, defaulting to 2025-04-01-preview. Requires a compatible model deployment. Contract and HTTP unit tests pass; live requests returned DeploymentNotFound for the configured resource, so no successful live response was verified.","sources":["s149","s312","s9"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb","method":"azure_media_url"},{"version":"v2","path":"lib/ruby_llm/providers/azure/audio.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/speech.rb"},{"version":"v2","path":"spec/ruby_llm/providers/azure/chat_completions_operations_spec.rb"}]},"transcription":{"v1":"partial","v2":"native","offered":true,"notes":"transcribe sends multipart audio plus language, prompt and output format, and retains transcript/usage data. Resource and /openai/v1 bases use the Azure v1 media endpoints with api-version=preview by default. Deployment bases retain their deployment path and explicit API version, defaulting to 2025-04-01-preview. Requires a compatible model deployment. Contract and HTTP unit tests pass; live requests returned DeploymentNotFound for the configured resource, so no successful live response was verified.","sources":["s149","s312","s9"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb","method":"azure_media_url"},{"version":"v2","path":"lib/ruby_llm/providers/azure/audio.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"},{"version":"v2","path":"spec/ruby_llm/providers/azure/chat_completions_operations_spec.rb"}]},"streaming_transcription":{"v1":"missing","v2":"native","offered":true,"notes":"The existing prerecorded-audio SSE parser is routed to Azure audio/transcriptions; unit checks preserve delta events and final text/usage. Azure documents streaming for supported GPT transcription models; Whisper does not stream. Realtime sessions are separate. Resource and /openai/v1 bases use the Azure v1 media endpoints with api-version=preview by default. Deployment bases retain their deployment path and explicit API version, defaulting to 2025-04-01-preview. Requires a compatible model deployment. Contract and HTTP unit tests pass; live requests returned DeploymentNotFound for the configured resource, so no successful live response was verified.","sources":["s149","s312"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb","method":"azure_media_url"},{"version":"v2","path":"lib/ruby_llm/providers/azure/audio.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"},{"version":"v2","path":"spec/ruby_llm/providers/azure/chat_completions_operations_spec.rb"}]},"diarization":{"v1":"partial","v2":"native","offered":true,"notes":"The existing diarized_json response parser preserves segment speaker labels through Azure. Supply format: \"diarized_json\" for custom deployment names that do not identify the diarization model; use a gpt-4o-transcribe-diarize deployment. Resource and /openai/v1 bases use the Azure v1 media endpoints with api-version=preview by default. Deployment bases retain their deployment path and explicit API version, defaulting to 2025-04-01-preview. Requires a compatible model deployment. Contract and HTTP unit tests pass; live requests returned DeploymentNotFound for the configured resource, so no successful live response was verified.","sources":["s149","s312","s9"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb","method":"azure_media_url"},{"version":"v2","path":"lib/ruby_llm/providers/azure/audio.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"},{"version":"v2","path":"spec/ruby_llm/providers/azure/chat_completions_operations_spec.rb"}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"Azure OpenAI has integrated content filtering but no standalone OpenAI-compatible moderation endpoint in the audited operation inventory. The standalone Azure AI Content Safety text/image moderation service is explicitly outside this provider-adapter scope.","sources":["s155","s149"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated OCR endpoint is documented in this Azure OpenAI/Foundry model-inference surface. Azure Document Intelligence is a separate document/OCR service and is explicitly outside this comparison.","sources":["s156","s149"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"embeddings":{"v1":"native","v2":"native","offered":true,"notes":"Text embeddings use the Azure endpoint dialect in both versions.","sources":["s12"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/embeddings.rb"}]},"multimodal_embeddings":{"v1":"missing","v2":"native","offered":true,"notes":"Dedicated Azure Cohere protocol reuses the shared Embed renderer/parser. Known Embed v3 deployments accept one image without text via with:, and v4 uses ordered mixed text/image inputs. Typed scalar/array vectors and actual billed input tokens are preserved. Fresh v3 image and three text calls passed; v4 deployment is unavailable on this resource. The deprecated Model Inference images/embeddings route is not used.","sources":["s154","s152","s396","s397","s151"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/rerank.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"Cohere-embed-v3-english","spec":"spec/ruby_llm/providers/azure/cohere_spec.rb","example":"embeds an image through the active Azure Cohere endpoint with billed usage","cassette":"spec/fixtures/vcr_cassettes/providers_azure_cohere_embeds_an_image_through_the_active_azure_cohere_endpoint_with_billed_usage.yml","notes":"Fresh active /providers/cohere/v2/embed HTTP200 returned1024float values and positive actual billed input tokens; ledger succeeded. Existing three Azure text fixtures re-recorded on this same supported endpoint."},{"status":"unit","spec":"spec/ruby_llm/providers/azure/cohere_spec.rb","notes":"Resource/serverless URL normalization, scoped API key/Entra/Bearer authentication, v3 image limits, v4 mixed content, scalar/array shape, typed rerank documents/usage and deployment errors covered. Azure ordinary OpenAI embeddings keep their original protocol."},{"status":"unavailable","checked_on":"2026-09-07","notes":"Fresh configured-resource probes for embed-v-4-0 and Cohere-rerank-v4.0-fast returned404DeploymentNotFound. No additional deployment was created and catalog availability is not treated as actual deployment access."}]},"reranking":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.rerank uses Azure Cohere resource or dedicated serverless endpoints, preserving original documents, provider positions/scores and raw search-unit metadata. Token/cost values remain unknown when not reported. Model/deployment and endpoint credentials stay scoped to the configured Azure context. Unit contract and URL/auth regressions pass; fresh reranker request returned DeploymentNotFound, so successful live execution is unavailable.","sources":["s151","s152","s396","s397"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/rerank.rb"}],"verification":[{"status":"unit","spec":"spec/ruby_llm/providers/azure/cohere_spec.rb","notes":"Resource/serverless URL normalization, scoped API key/Entra/Bearer authentication, v3 image limits, v4 mixed content, scalar/array shape, typed rerank documents/usage and deployment errors covered. Azure ordinary OpenAI embeddings keep their original protocol."},{"status":"unavailable","checked_on":"2026-09-07","notes":"Fresh configured-resource probes for embed-v-4-0 and Cohere-rerank-v4.0-fast returned404DeploymentNotFound. No additional deployment was created and catalog availability is not treated as actual deployment access."},{"status":"unavailable","checked_on":"2026-09-07","model":"Cohere-rerank-v4.0-fast","spec":"spec/ruby_llm/providers/azure/cohere_spec.rb","example":"RubyLLM::Protocols::Azure::Cohere reranks documents through the configured Azure Cohere deployment","cassette":"spec/fixtures/vcr_cassettes/providers_azure_cohere_reranks_documents_through_the_configured_azure_cohere_deployment.yml","notes":"Fresh permanent live example records actual HTTP404 DeploymentNotFound and skips only this precise provider condition. No successful reranking inference is claimed; unrelated errors fail the test."}]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"Azure Files uses /openai/v1/files; Responses attachment uploads use purpose assistants.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/azure/files.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb","method":"provider_file_upload_options"}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"Azure Files uses /openai/v1/files; Responses attachment uploads use purpose assistants.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/azure/files.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb","method":"provider_file_upload_options"}]},"chat_batches":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 provides a working Chat Completions batch create/poll/results/cancel lifecycle. The provider also exposes Responses batching, which is recorded as a separate unsupported endpoint.","sources":["s15"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/chat_completions/batches.rb"}]},"embedding_batches":{"v1":"missing","v2":"unknown","offered":null,"notes":"Current Azure documentation conflicts on embedding batches: the v1 Batch endpoint enum lists /v1/embeddings, while its prose says only chat is supported; the batch guide and regional SKU inventory list no GlobalBatch or DataZoneBatch embedding model. Registry and fresh resource catalog checks confirm embedding models, not batch-capable deployments. RubyLLM has no Azure embedding-batch adapter, but provider availability must be established before this can be classified as a missing integration. No speculative upload or batch job was submitted.","sources":["s16","s15","s434","s435"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","notes":"Fresh authenticated /openai/v1/models catalog returned HTTP200 and three embedding IDs, with no batch/SKU fields. Published batch deployment tables omit them; an earlier synchronous deployment probe returned DeploymentNotFound. No batch-capable deployment or unambiguous service contract was available."}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated advisor tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Perplexity Agent API; it is not an API of this provider.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"agent_skills":{"v1":"missing","v2":"passthrough","offered":true,"notes":"The Azure Responses REST schema documents hosted shell container skills by ID or inline data. A raw shell environment can pass these through. RubyLLM has no dedicated skill-management or attachment API.","sources":["s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"async_research":{"v1":"missing","v2":"partial","offered":true,"notes":"Azure documents stored-response continuation and background jobs. Raw fields can pass through, but RubyLLM has no response retrieval/polling/cancellation lifecycle and normally sends store:false.","sources":["s8"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"}]},"background_responses":{"v1":"missing","v2":"partial","offered":true,"notes":"Azure documents stored-response continuation and background jobs. Raw fields can pass through, but RubyLLM has no response retrieval/polling/cancellation lifecycle and normally sends store:false.","sources":["s8"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"}]},"browser_use":{"v1":"missing","v2":"partial","offered":true,"notes":"The Azure Responses schema documents these specialized tools. Raw tool definitions can be sent, but RubyLLM does not implement their dedicated client execution/output lifecycles.","sources":["s150","s8"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated classification operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"computer_use":{"v1":"missing","v2":"partial","offered":true,"notes":"The Azure Responses schema documents these specialized tools. Raw tool definitions can be sent, but RubyLLM does not implement their dedicated client execution/output lifecycles.","sources":["s150","s8"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context editing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated contextual embeddings operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"dedicated_transcription_api":{"v1":"partial","v2":"native","offered":true,"notes":"The dedicated audio/transcriptions route uses the same completed Azure routing, deployment and multipart integration as transcription. This is the same operation, including supported streamed/detailed result forms. A compatible transcription model must be deployed; live validation was unavailable because the configured Azure resource has no speech deployment.","sources":["s149","s312","s9"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb","method":"azure_media_url"},{"version":"v2","path":"lib/ruby_llm/providers/azure/audio.rb"},{"version":"v2","path":"spec/ruby_llm/providers/azure/chat_completions_operations_spec.rb"}],"verification":[{"status":"unit","spec":"spec/ruby_llm/providers/azure/media_spec.rb","notes":"Resource, deployment and /openai/v1 routes and multipart model handling have regression coverage."},{"status":"unavailable","checked_on":"2026-09-07","notes":"Configured Azure account returned DeploymentNotFound for transcription models; no deployment created."}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dubbing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"fast_inference":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fast inference operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Azure exposes file listing/deletion and vector-store resource APIs. RubyLLM Files supports upload/metadata/download, not these management lifecycles.","sources":["s149"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/azure/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"file_search_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Azure exposes file listing/deletion and vector-store resource APIs. RubyLLM Files supports upload/metadata/download, not these management lifecycles.","sources":["s149"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/azure/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fill-in-the-middle completion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"fine_tuning":{"v1":"missing","v2":"missing","offered":true,"notes":"No realtime session or fine-tuning job lifecycle in either version. Training APIs are outside inference scope.","sources":["s8","s9"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Maps grounding; it is not an API of this provider.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated guardrail configuration operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"hosted_conversations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Azure OpenAI / Foundry documents provider-managed conversation storage or hosted conversation resources. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Interactions API; it is not an API of this provider.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"json_mode":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Raw JSON mode uses wire options; structured schemas have their own public API.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Amazon Bedrock Mantle; it is not an API of this provider.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"manual_compaction":{"v1":"missing","v2":"native","offered":true,"notes":"Chat#compact explicitly invokes Responses /compact. Native full compaction envelope resets only subsequent wire context; all historical messages and current instructions retained. Rails Agent.find/reload, multiple rounds, usage persistence and cancellation unit-tested. Pending local/MCP tool calls block compaction. Automatic with_compaction support remains separate and provider-specific.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"apply_compaction"},{"version":"v2","path":"lib/ruby_llm/chat.rb"},{"version":"v2","path":"lib/ruby_llm/active_record/chat_methods.rb"},{"version":"v2","path":"lib/ruby_llm/agent.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/compaction.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"}],"verification":[{"status":"passed","model":"grok-4-1-fast-non-reasoning","spec":"spec/ruby_llm/chat_compact_spec.rb","example":"compacts and continues a conversation with azure","cassette":"spec/fixtures/vcr_cassettes/chat_compacts_and_continues_a_conversation_with_azure.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: manual compact returns typed assistant Message, native response.compaction envelope preserved, all original history retained, positive compaction input usage, continued response recalls Thimble and has positive input usage."}]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated music generation operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated other batch operations operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Omni video endpoint; it is not an API of this provider.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"partner_model_protocols":{"v1":"missing","v2":"native","offered":true,"notes":"Azure now registers a dedicated Cohere embedding/rerank protocol, automatically selected for exact known embedding model names and rerank operations. Custom Cohere deployment names can use azure_protocol=:cohere. This covers these Cohere inference operations, not all partner chat/audio/OCR or administrative APIs. Live v3 embedding passed; v4/rerank deployments unavailable.","sources":["s151","s152","s396","s397"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/rerank.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"Cohere-embed-v3-english","spec":"spec/ruby_llm/providers/azure/cohere_spec.rb","example":"embeds an image through the active Azure Cohere endpoint with billed usage","cassette":"spec/fixtures/vcr_cassettes/providers_azure_cohere_embeds_an_image_through_the_active_azure_cohere_endpoint_with_billed_usage.yml","notes":"Fresh active /providers/cohere/v2/embed HTTP200 returned1024float values and positive actual billed input tokens; ledger succeeded. Existing three Azure text fixtures re-recorded on this same supported endpoint."},{"status":"unit","spec":"spec/ruby_llm/providers/azure/cohere_spec.rb","notes":"Resource/serverless URL normalization, scoped API key/Entra/Bearer authentication, v3 image limits, v4 mixed content, scalar/array shape, typed rerank documents/usage and deployment errors covered. Azure ordinary OpenAI embeddings keep their original protocol."},{"status":"unavailable","checked_on":"2026-09-07","notes":"Fresh configured-resource probes for embed-v-4-0 and Cohere-rerank-v4.0-fast returned404DeploymentNotFound. No additional deployment was created and catalog availability is not treated as actual deployment access."}]},"prefix_completion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated prefix completion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated programmatic tool calling operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"prompt_cache_controls":{"v1":"passthrough","v2":"native","offered":true,"notes":"The shared with_caching API translates supported Azure cache options; 1.16 requires raw request options for these controls.","sources":["s11"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"}]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated provider-managed fallback operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"realtime":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Azure OpenAI / Foundry documents realtime conversations. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s8","s9"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated response caching operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"responses":{"v1":"missing","v2":"native","offered":true,"notes":"Explicit Responses selection and conservative automatic routing for deployment names matching recent GPT IDs.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb","method":"protocol_for"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb"}]},"responses_batches":{"v1":"missing","v2":"missing","offered":true,"notes":"The provider documents Responses batch requests, but RubyLLM does not register a Responses batch dialect for this provider.","sources":["s15"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/chat_completions/batches.rb"}]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone search api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"server_apply_patch":{"v1":"missing","v2":"partial","offered":true,"notes":"The Azure Responses schema documents these specialized tools. Raw tool definitions can be sent, but RubyLLM does not implement their dedicated client execution/output lifecycles.","sources":["s150","s8"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"server_tool_image_generation":{"v1":"missing","v2":"native","offered":true,"notes":"Azure Responses inherits hosted-tool aliases. Availability still depends on deployed models and region. File search requires externally provisioned vector stores.","sources":["s8"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"server_tool_search":{"v1":"missing","v2":"partial","offered":true,"notes":"Azure documents Responses tool search. Raw tools can include the wire options, but RubyLLM lacks a deferred-tool registry and namespace-aware call dispatch.","sources":["s8","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated x search tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"shell_computer_tools":{"v1":"missing","v2":"partial","offered":true,"notes":"The Azure Responses schema documents these specialized tools. Raw tool definitions can be sent, but RubyLLM does not implement their dedicated client execution/output lifecycles.","sources":["s150","s8"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/tools.rb"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated sound effects operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"streaming_speech":{"v1":"missing","v2":"native","offered":true,"notes":"Block on speak yields typed SpeechChunk bytes incrementally and returns the complete Speech; binary HTTP transport validates status/content type, preserves binary encoding and refuses retries after audio delivery. Deployment URL regression passed; live configured resource rejected the test because no speech deployment exists. No deployment created.","sources":["s149","s342"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/speech.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","notes":"unavailable deployment"},{"status":"unit","spec":"spec/ruby_llm/providers/azure/media_spec.rb","notes":"Documented request routing and returned audio regression; shared binary streaming transport covered separately."}]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated task budgets operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated text analysis api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"vector_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Azure exposes file listing/deletion and vector-store resource APIs. RubyLLM Files supports upload/metadata/download, not these management lifecycles.","sources":["s149"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/azure/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"video_editing":{"v1":"missing","v2":"missing","offered":true,"notes":"Azure Sora 2 documents the videos.remix endpoint. RubyLLM Azure::Videos only implements the earlier generation-job workflow, not remix.","sources":["s14"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/providers/azure/videos.rb"}]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video extension operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"voice_cloning":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice cloning operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice conversion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone web fetch api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Azure OpenAI and Foundry model-inference APIs, including Foundry multimodal embeddings and Cohere model deployments. Separate Azure AI Content Safety, Document Intelligence, Azure AI Speech, AI Search and Agent Service products are outside this matrix.","sources":["s149","s150"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"}]},"websockets":{"v1":"missing","v2":"missing","offered":true,"notes":"Azure explicitly documents Responses over WebSocket. RubyLLM has no WebSocket Responses transport.","sources":["s153"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v1","path":"lib/ruby_llm/providers/azure.rb"},{"version":"v2","path":"lib/ruby_llm/transport/connection.rb"}]}},"gaps":[{"notes":"Embedding batches: Current Azure documentation conflicts on embedding batches: the v1 Batch endpoint enum lists /v1/embeddings, while its prose says only chat is supported; the batch guide and regional SKU inventory list no GlobalBatch or DataZoneBatch embedding model. Registry and fresh resource catalog checks confirm embedding models, not batch-capable deployments. RubyLLM has no Azure embedding-batch adapter, but provider availability must be established before this can be classified as a missing integration. No speculative upload or batch job was submitted.","sources":["s16","s15","s434","s435"]},{"notes":"Agent skills: The Azure Responses REST schema documents hosted shell container skills by ID or inline data. A raw shell environment can pass these through. RubyLLM has no dedicated skill-management or attachment API.","sources":["s150"]},{"notes":"Asynchronous research, Background Responses jobs: Azure documents stored-response continuation and background jobs. Raw fields can pass through, but RubyLLM has no response retrieval/polling/cancellation lifecycle and normally sends store:false.","sources":["s8"]},{"notes":"Browser use, Computer use, Apply patch tool, Shell and computer tools: The Azure Responses schema documents these specialized tools. Raw tool definitions can be sent, but RubyLLM does not implement their dedicated client execution/output lifecycles.","sources":["s150","s8"]},{"notes":"File listing and deletion, File search store management, Vector store management: Azure exposes file listing/deletion and vector-store resource APIs. RubyLLM Files supports upload/metadata/download, not these management lifecycles.","sources":["s149"]},{"notes":"Fine-tuning: No realtime session or fine-tuning job lifecycle in either version. Training APIs are outside inference scope.","sources":["s8","s9"]},{"notes":"JSON object mode: Raw JSON mode uses wire options; structured schemas have their own public API.","sources":["s8"]},{"notes":"Responses batches: The provider documents Responses batch requests, but RubyLLM does not register a Responses batch dialect for this provider.","sources":["s15"]},{"notes":"Tool search: Azure documents Responses tool search. Raw tools can include the wire options, but RubyLLM lacks a deferred-tool registry and namespace-aware call dispatch.","sources":["s8","s150"]},{"notes":"Video editing: Azure Sora 2 documents the videos.remix endpoint. RubyLLM Azure::Videos only implements the earlier generation-job workflow, not remix.","sources":["s14"]},{"notes":"Responses over WebSocket: Azure explicitly documents Responses over WebSocket. RubyLLM has no WebSocket Responses transport.","sources":["s153"]}]},{"id":"xai","name":"xAI","notes":"The audit covers the public xAI model APIs, search tools, media and supporting resources. It does not include consumer Grok UI features or assume an API exists for an announced capability.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"1.16 inherited Chat Completions support including reasoning_effort. 2.0 defaults to Responses. Model support for reasoning controls varies.","sources":["s17","s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"1.16 inherited Chat Completions support including reasoning_effort. 2.0 defaults to Responses. Model support for reasoning controls varies.","sources":["s17","s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"1.16 inherited Chat Completions support including reasoning_effort. 2.0 defaults to Responses. Model support for reasoning controls varies.","sources":["s17","s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"Image attachments supported in 1.16 Chat Completions and 2.0 Responses.","sources":["s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/media.rb","method":"format_attachment"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/media.rb","method":"format_attachment"}]},"pdf_input":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 supports the documented upload-then-attach file-ID flow through the Files and Responses APIs. PDFs trigger provider attachment_search. Inline file_data and direct public-file-URL variants were not independently verified and are not required for this built-in classification.","sources":["s19"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/media.rb","method":"format_provider_file"},{"version":"v2","path":"lib/ruby_llm/protocols/xai/files.rb"}]},"audio_input":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"xAI Voice provides audio input through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s20","s366","s367"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"No direct conversation video attachment format was verified. X Search can inspect videos it finds using provider tool options; that is a server-search capability.","sources":["s17"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/media.rb"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"1.16 inherited Chat Completions support including reasoning_effort. 2.0 defaults to Responses. Model support for reasoning controls varies.","sources":["s17","s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"1.16 inherited Chat Completions support including reasoning_effort. 2.0 defaults to Responses. Model support for reasoning controls varies.","sources":["s17","s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"citations":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 preserves URL annotations and the documented collections:// source references. References returned only in the completed streaming response are also retained. 1.16 exposed these values through the raw response.","sources":["s303","s17"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/streaming.rb"},{"version":"v2","path":"spec/ruby_llm/providers/xai/responses_spec.rb"}]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"1.16 inherited Chat Completions support including reasoning_effort. 2.0 defaults to Responses. Model support for reasoning controls varies.","sources":["s17","s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"1.16 inherited Chat Completions support including reasoning_effort. 2.0 defaults to Responses. Model support for reasoning controls varies.","sources":["s17","s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"1.16 inherited Chat Completions support including reasoning_effort. 2.0 defaults to Responses. Model support for reasoning controls varies.","sources":["s17","s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"parallel_tool_control":{"v1":"native","v2":"native","offered":true,"notes":"1.16 inherited Chat Completions support including reasoning_effort. 2.0 defaults to Responses. Model support for reasoning controls varies.","sources":["s17","s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"server_web_search":{"v1":"passthrough","v2":"native","offered":true,"notes":"Legacy search_parameters could pass through in 1.16. 2.0 has web_search and x_search aliases; browsing pages is part of web search rather than a separate web_fetch tool.","sources":["s17"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"server_web_fetch":{"v1":"passthrough","v2":"native","offered":true,"notes":"Legacy search_parameters could pass through in 1.16. 2.0 has web_search and x_search aliases; browsing pages is part of web search rather than a separate web_fetch tool.","sources":["s17"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"server_code_execution":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 includes code execution, collections/file search and image-generation hosted tool aliases. Collections must be prepared externally.","sources":["s17"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"server_file_search":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 includes code execution, collections/file search and image-generation hosted tool aliases. Collections must be prepared externally.","sources":["s17"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"server_mcp":{"v1":"missing","v2":"native","offered":true,"notes":"The mcp alias accepts portable name/url plus provider settings such as allowed_tools. xAI executes remote tools and returns ServerToolCall results; require_approval and connector_id are not supported by the provider. Fresh live Microsoft Learn documentation search and subsequent conversation replay passed.","sources":["s17","s339"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"grok-4-1-fast-non-reasoning","spec":"spec/ruby_llm/chat_mcp_spec.rb","example":"RubyLLM::Chat remote MCP execution xai executes a read-only tool and replays its history","cassette":"spec/fixtures/vcr_cassettes/chat_remote_mcp_execution_xai_executes_a_read-only_tool_and_replays_its_history.yml","notes":"Fresh read-only Microsoft Learn MCP search, typed remote results and successful follow-up replay. Provider-supported direct execution, no approval-mode claim."}]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"xAI caches matching prefixes automatically; 1.16 already read cached token counts. 2.0 adds named key mapping. x-grok-conv-id still uses headers.","sources":["s21"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"cache_read_tokens"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"apply_prompt_cache_params"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"prompt_cache_params"}]},"cache_boundaries":{"v1":"na","v2":"na","offered":false,"notes":"xAI documents automatic prefix caching and routing keys, not caller-selected cache boundary markers or separately created cache resources.","sources":["s21"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"xAI documents automatic prefix caching and routing keys, not caller-selected cache boundary markers or separately created cache resources.","sources":["s21"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"}]},"compaction":{"v1":"missing","v2":"native","offered":true,"notes":"Chat#compact explicitly invokes Responses /compact. Native full compaction envelope resets only subsequent wire context; all historical messages and current instructions retained. Rails Agent.find/reload, multiple rounds, usage persistence and cancellation unit-tested. Pending local/MCP tool calls block compaction. Automatic with_compaction support remains separate and provider-specific.","sources":["s22"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"COMPACTION_PROVIDERS"},{"version":"v2","path":"lib/ruby_llm/chat.rb"},{"version":"v2","path":"lib/ruby_llm/active_record/chat_methods.rb"},{"version":"v2","path":"lib/ruby_llm/agent.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/compaction.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb"}],"verification":[{"status":"passed","model":"grok-4.3","spec":"spec/ruby_llm/chat_compact_spec.rb","example":"compacts and continues a conversation with xai","cassette":"spec/fixtures/vcr_cassettes/chat_compacts_and_continues_a_conversation_with_xai.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: manual compact returns typed assistant Message, native response.compaction envelope preserved, all original history retained, positive compaction input usage, continued response recalls Thimble and has positive input usage."}]},"token_counting":{"v1":"missing","v2":"native","offered":true,"notes":"Native exact plain-text tokenization via RubyLLM.tokenize; full Chat#count_tokens remains unsupported by this provider. IDs/count are not billed usage; no generation usage entry is inferred.","sources":["s23"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"count_tokens"},{"version":"v2","path":"lib/ruby_llm/tokenization.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/xai/tokenization.rb"},{"version":"v2","path":"lib/ruby_llm/provider.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb"}],"verification":[{"status":"passed","model":"grok-4.3","spec":"spec/ruby_llm/tokenization_spec.rb","example":"tokenizes text with xai through the public API","cassette":"spec/fixtures/vcr_cassettes/tokenization_tokenizes_text_with_xai_through_the_public_api.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: nonempty integer IDs, count exactly ID length, typed Tokenization, model preserved, raw response preserved."}]},"image_generation":{"v1":"partial","v2":"native","offered":true,"notes":"1.16 inherited the OpenAI image API with an always-present size field and no xAI dialect; current xAI rejects size. 2.0 omits it and parses multiple images. Historical compatibility is not live-verified.","sources":["s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/images.rb","method":"render_image_payload"},{"version":"v2","path":"lib/ruby_llm/providers/xai/images.rb"}]},"image_editing":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 adds the xAI JSON image-reference dialect; 1.16 only had OpenAI multipart editing. Masks are unsupported by xAI.","sources":["s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/images.rb","method":"render_edit_payload"},{"version":"v2","path":"lib/ruby_llm/providers/xai/images.rb","method":"render_edit_payload"}]},"video_generation":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 adds text-to-video and a single image reference, with job polling and Video results. More advanced video workflows remain separate gaps.","sources":["s24"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/videos.rb"}]},"speech":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 adds xAI tts and stt dialects. Transcription can request diarization and preserve word-level speaker metadata.","sources":["s20"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/speech.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/transcription.rb"}]},"transcription":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 adds xAI tts and stt dialects. Transcription can request diarization and preserve word-level speaker metadata.","sources":["s20"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/speech.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/transcription.rb"}]},"streaming_transcription":{"v1":"missing","v2":"native","offered":true,"notes":"Public transcribe block opens documented STT WebSocket, waits for transcript.created, streams WAV PCM/G.711 samples, deduplicates locked chunk/utterance repeats and retains text/word timing when terminal event is empty. Mono and multichannel WAV formats supported; raw Opus/container conversion is not claimed. Separate realtime voice sessions remain unimplemented.","sources":["s20","s25","s358"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/transcription.rb","method":"stream_transcription"},{"version":"v2","path":"lib/ruby_llm/providers/xai/speech.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/xai/streaming_transcription.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/transcription.rb"}],"verification":[{"status":"passed","model":"grok-stt","spec":"spec/ruby_llm/protocols/xai/streaming_transcription_spec.rb","example":"streams transcription through the public API with typed chunks and word timing","cassette":"spec/fixtures/websocket_cassettes/transcription_xai.json","recorded_on":"2026-09-07","notes":"Fresh provider recording: text contains Ruby and developer happiness, partial events present, concatenated committed deltas equal full transcript, word start/end timing retained, duration >3seconds, one succeeded usage attempt."}]},"diarization":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 adds xAI tts and stt dialects. Transcription can request diarization and preserve word-level speaker metadata.","sources":["s20"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/speech.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/transcription.rb"}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated inference endpoint documented in the audited xAI surface. Moderating via a chat prompt is not a moderation API.","sources":["s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"}]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated inference endpoint documented in the audited xAI surface. Moderating via a chat prompt is not a moderation API.","sources":["s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"}]},"embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated inference endpoint documented in the audited xAI surface. Moderating via a chat prompt is not a moderation API.","sources":["s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"}]},"multimodal_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated inference endpoint documented in the audited xAI surface. Moderating via a chat prompt is not a moderation API.","sources":["s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"}]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated inference endpoint documented in the audited xAI surface. Moderating via a chat prompt is not a moderation API.","sources":["s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"}]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 implements Files upload/retrieval/content download.","sources":["s19"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/xai/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 implements Files upload/retrieval/content download.","sources":["s19"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/xai/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"chat_batches":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 provides a working Chat Completions batch create/poll/results/cancel lifecycle. The provider also exposes Responses batching, which is recorded as a separate unsupported endpoint.","sources":["s26"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/chat_completions/batches.rb"}]},"embedding_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated inference endpoint documented in the audited xAI surface. Moderating via a chat prompt is not a moderation API.","sources":["s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated advisor tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Perplexity Agent API; it is not an API of this provider.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"agent_skills":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated agent skills operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated asynchronous research operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"The current Responses REST reference explicitly labels background unsupported. Legacy deferred Chat Completions is a different API and does not establish Responses background support.","sources":["s158","s159"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated browser use operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated classification operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"computer_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated computer use operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context editing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated contextual embeddings operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"dedicated_transcription_api":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 implements the dedicated xAI stt file-transcription endpoint. This row overlaps transcription.","sources":["s160"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/transcription.rb"}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dubbing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"fast_inference":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Priority processing accepts service_tier on Chat Completions and Responses. Both versions can pass the wire option; neither has a dedicated priority-processing API.","sources":["s161"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/chat.rb"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"xAI exposes file and Collections management/indexing APIs. RubyLLM implements attachment upload/metadata/download and querying an existing collection through a hosted tool, not collection creation/indexing or file listing/deletion.","sources":["s162"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/xai/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"file_search_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"xAI exposes file and Collections management/indexing APIs. RubyLLM implements attachment upload/metadata/download and querying an existing collection through a hosted tool, not collection creation/indexing or file listing/deletion.","sources":["s162"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/xai/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fill-in-the-middle completion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"The full current public xAI inference and management API inventory documents no fine-tuning job endpoint. This means no documented hosted offering in this audit, not that private enterprise arrangements are impossible.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Maps grounding; it is not an API of this provider.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated guardrail configuration operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"hosted_conversations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"xAI documents provider-managed conversation storage or hosted conversation resources. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s158"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"image_batches":{"v1":"missing","v2":"missing","offered":true,"notes":"Current xAI Batch API documents image-generation jobs; RubyLLM only serializes chat requests for xAI.","sources":["s26"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/chat_completions/batches.rb"}]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Interactions API; it is not an API of this provider.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"json_mode":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Wire JSON mode uses provider options; schema-based structured output has a public method.","sources":["s18"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Amazon Bedrock Mantle; it is not an API of this provider.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"manual_compaction":{"v1":"missing","v2":"native","offered":true,"notes":"Chat#compact explicitly invokes Responses /compact. Native full compaction envelope resets only subsequent wire context; all historical messages and current instructions retained. Rails Agent.find/reload, multiple rounds, usage persistence and cancellation unit-tested. Pending local/MCP tool calls block compaction. Automatic with_compaction support remains separate and provider-specific.","sources":["s22","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb"},{"version":"v2","path":"lib/ruby_llm/chat.rb"},{"version":"v2","path":"lib/ruby_llm/active_record/chat_methods.rb"},{"version":"v2","path":"lib/ruby_llm/agent.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/compaction.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"}],"verification":[{"status":"passed","model":"grok-4.3","spec":"spec/ruby_llm/chat_compact_spec.rb","example":"compacts and continues a conversation with xai","cassette":"spec/fixtures/vcr_cassettes/chat_compacts_and_continues_a_conversation_with_xai.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: manual compact returns typed assistant Message, native response.compaction envelope preserved, all original history retained, positive compaction input usage, continued response recalls Thimble and has positive input usage."}]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated music generation operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated other batch operations operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Omni video endpoint; it is not an API of this provider.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated partner model protocols operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"prefix_completion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated prefix completion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated programmatic tool calling operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"prompt_cache_controls":{"v1":"passthrough","v2":"native","offered":true,"notes":"xAI documents routing/cache keys; 2.0 maps with_caching(key:), while 1.16 requires the wire field/header. This does not imply caller-selected cache boundaries.","sources":["s21","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"}]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated provider-managed fallback operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"realtime":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"xAI documents realtime conversations. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s20","s25","s366","s367"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated response caching operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"responses":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 uses the xAI Responses dialect by default.","sources":["s17"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"}]},"responses_batches":{"v1":"missing","v2":"native","offered":true,"notes":"Existing xAI batch runtime already handles Responses dialect; added request-shape regression and real completed result validation rather than redundant adapter. Completed in8 seconds.","sources":["s26"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/chat_completions/batches.rb"}],"verification":[{"status":"passed","model":"grok-4.3","spec":"spec/ruby_llm/providers/xai/chat_completions/batches_live_spec.rb","example":"collects completed structured Responses and Chat Completions results in submission order","cassette":"spec/fixtures/vcr_cassettes/providers_xai_chatcompletions_batches_collects_completed_structured_responses_and_chat_completions_results_in_submission_order.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: completed2-row batch, Responses schema parsed language=Ruby, ChatCompletions text Rails, ordered typed Message results, input tokens positive and reported cost >=0."}]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone search api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated apply patch tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"server_tool_image_generation":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 includes code execution, collections/file search and image-generation hosted tool aliases. Collections must be prepared externally.","sources":["s17"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated tool search operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"server_x_search":{"v1":"passthrough","v2":"native","offered":true,"notes":"Legacy search_parameters could pass through in 1.16. 2.0 has web_search and x_search aliases; browsing pages is part of web search rather than a separate web_fetch tool.","sources":["s17"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/providers/xai/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"shell_computer_tools":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated shell and computer tools operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated sound effects operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"streaming_speech":{"v1":"missing","v2":"native","offered":true,"notes":"Speech block uses binary HTTP TTS stream through shared stream_speech_response; timestamp JSON mode is explicitly rejected. No claim of WebSocket TTS/realtime voice integration. Fresh API completed1.72s.","sources":["s20","s25","s347"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/transcription.rb","method":"stream_transcription"},{"version":"v2","path":"lib/ruby_llm/providers/xai/speech.rb"}],"verification":[{"status":"passed","model":"grok-tts","spec":"spec/ruby_llm/providers/xai/speech_spec.rb","example":"streams speech and retains the complete audio through the public API","cassette":"spec/fixtures/vcr_cassettes/providers_xai_speech_streams_speech_and_retains_the_complete_audio_through_the_public_api.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: typed SpeechChunk yielded, concatenated chunk bytes equal full Speech blob, audio/mpeg >1000 bytes."}]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated task budgets operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated text analysis api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"vector_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"xAI exposes file and Collections management/indexing APIs. RubyLLM implements attachment upload/metadata/download and querying an existing collection through a hosted tool, not collection creation/indexing or file listing/deletion.","sources":["s162"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/xai/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"video_editing":{"v1":"missing","v2":"native","offered":true,"notes":"Video attachment with: selects /videos/edits; local, URL and uploaded file references normalized. Upstream source <=8.7 seconds; retains duration/aspect ratio. Fresh live uses the official hosted sample.","sources":["s27","s24","s344","s345"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/videos.rb"},{"version":"v2","path":"lib/ruby_llm/video.rb"},{"version":"v2","path":"lib/ruby_llm/video_job.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb"}],"verification":[{"status":"passed","model":"grok-imagine-video","spec":"spec/ruby_llm/providers/xai/videos_spec.rb","example":"completes a video edit through the public API","cassette":"spec/fixtures/vcr_cassettes/providers_xai_videos_completes_a_video_edit_through_the_public_api.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: completed job, downloaded MP4 >1000 bytes, raw status done."}]},"video_extension":{"v1":"missing","v2":"native","offered":true,"notes":"New extend: selects /videos/extensions and accepts Video, video URL/path or uploaded file. duration is added portion; with: and extend: mutually exclusive. Fresh extension added2 seconds.","sources":["s27","s24","s346"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/videos.rb"},{"version":"v2","path":"lib/ruby_llm/video.rb"},{"version":"v2","path":"lib/ruby_llm/video_job.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb"}],"verification":[{"status":"passed","model":"grok-imagine-video","spec":"spec/ruby_llm/providers/xai/videos_spec.rb","example":"completes a video extension through the public API","cassette":"spec/fixtures/vcr_cassettes/providers_xai_videos_completes_a_video_extension_through_the_public_api.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: completed job, downloaded MP4 >1000 bytes, raw status done."}]},"voice_cloning":{"v1":"missing","v2":"missing","offered":true,"notes":"xAI exposes custom voice creation from a recording, gated to Enterprise teams. RubyLLM has no custom-voice creation/list/delete API; speak can use a voice ID prepared externally.","sources":["s163"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/speech.rb"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice conversion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone web fetch api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public xAI inference, Files and Collections APIs; excludes Grok consumer app, Grok Build CLI and management APIs. Enterprise-gated inference features remain included with their access restrictions.","sources":["s157","s158"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"}]},"websockets":{"v1":"missing","v2":"missing","offered":true,"notes":"This row is Responses over WebSocket, not Voice. xAI documents /v1/responses WSS response.create and previous_response_id continuation even store:false. RubyLLM Voice uses /v1/realtime; it does not implement this distinct Responses transport.","sources":["s20","s25","s368"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/xai.rb"},{"version":"v2","path":"lib/ruby_llm/providers/xai/transcription.rb","method":"stream_transcription"},{"version":"v2","path":"lib/ruby_llm/providers/xai/speech.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses.rb"}],"verification":[]}},"gaps":[{"notes":"Fast inference: Priority processing accepts service_tier on Chat Completions and Responses. Both versions can pass the wire option; neither has a dedicated priority-processing API.","sources":["s161"]},{"notes":"File listing and deletion, File search store management, Vector store management: xAI exposes file and Collections management/indexing APIs. RubyLLM implements attachment upload/metadata/download and querying an existing collection through a hosted tool, not collection creation/indexing or file listing/deletion.","sources":["s162"]},{"notes":"Image batches: Current xAI Batch API documents image-generation jobs; RubyLLM only serializes chat requests for xAI.","sources":["s26"]},{"notes":"JSON object mode: Wire JSON mode uses provider options; schema-based structured output has a public method.","sources":["s18"]},{"notes":"Voice cloning: xAI exposes custom voice creation from a recording, gated to Enterprise teams. RubyLLM has no custom-voice creation/list/delete API; speak can use a voice ID prepared externally.","sources":["s163"]},{"notes":"Responses over WebSocket: This row is Responses over WebSocket, not Voice. xAI documents /v1/responses WSS response.create and previous_response_id continuation even store:false. RubyLLM Voice uses /v1/realtime; it does not implement this distinct Responses transport.","sources":["s20","s25","s368"]}]},{"id":"deepseek","name":"DeepSeek","notes":"The audit covers the public DeepSeek API and its documented request controls. Local model hosting, consumer applications and third-party deployments are outside scope.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"Chat Completions behavior existed in 1.16; 2.0 adds Responses. Thinking mode may restrict forced tool choice on Chat Completions. Responses always permits parallel calls.","sources":["s28","s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/chat.rb"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"Chat Completions behavior existed in 1.16; 2.0 adds Responses. Thinking mode may restrict forced tool choice on Chat Completions. Responses always permits parallel calls.","sources":["s28","s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/chat.rb"}]},"structured_output":{"v1":"passthrough","v2":"native","offered":true,"notes":"Select protocol: :responses to use with_schema and enforce JSON Schema. The default Chat Completions dialect still falls back to JSON-object mode with a protocol-specific warning. An explicit supported protocol is built-in integration, not raw options.","sources":["s28"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/chat.rb"}]},"vision":{"v1":"missing","v2":"native","offered":true,"notes":"Select protocol: :responses with a supported DeepSeek vision model. Inline images, uploaded image references and images returned by function tools use input_image parts. Text-only models and arbitrary document attachments do not gain vision support.","sources":["s28"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/responses.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/media.rb"}]},"pdf_input":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"audio_input":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"1.16 extracted reasoning_content and reasoning token usage. 2.0 also parses Responses reasoning_text.","sources":["s31","s28"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/responses.rb","method":"parse_reasoning_summary"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"}]},"thinking_controls":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 translates enable/disable and reasoning effort. DeepSeek has no token-budget control; unsupported budgets are logged and ignored. 1.16 required wire options for DeepSeek-specific toggles.","sources":["s31"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/chat.rb","method":"configure_thinking_payload"}]},"citations":{"v1":"na","v2":"na","offered":false,"notes":"The audited Responses reference documents output_text annotations only as an empty example, with no supported URL/document citation annotation schema. Web-search actions are documented separately. Structured citation output is not a documented offering in this API inventory; this does not assert that model prose cannot contain links.","sources":["s166","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"Chat Completions behavior existed in 1.16; 2.0 adds Responses. Thinking mode may restrict forced tool choice on Chat Completions. Responses always permits parallel calls.","sources":["s28","s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/chat.rb"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"Chat Completions behavior existed in 1.16; 2.0 adds Responses. Thinking mode may restrict forced tool choice on Chat Completions. Responses always permits parallel calls.","sources":["s28","s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/chat.rb"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"Chat Completions behavior existed in 1.16; 2.0 adds Responses. Thinking mode may restrict forced tool choice on Chat Completions. Responses always permits parallel calls.","sources":["s28","s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/chat.rb"}]},"parallel_tool_control":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek Responses ignores parallel_tool_calls and always enables parallel calls. Multiple calls are supported, but a provider one/many control is not.","sources":["s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"server_web_search":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 Responses has a web_search alias; the provider performs search, open_page and find_in_page actions. No separate portable web_fetch alias exists.","sources":["s28"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"server_web_fetch":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 Responses has a web_search alias; the provider performs search, open_page and find_in_page actions. No separate portable web_fetch alias exists.","sources":["s28"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/responses.rb","method":"SERVER_TOOL_ALIASES"}]},"server_code_execution":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek compatibility explicitly ignores unsupported cache keys, context_management, and these server-tool types. Prefix caching is automatic.","sources":["s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"server_file_search":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek compatibility explicitly ignores unsupported cache keys, context_management, and these server-tool types. Prefix caching is automatic.","sources":["s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"server_mcp":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek compatibility explicitly ignores unsupported cache keys, context_management, and these server-tool types. Prefix caching is automatic.","sources":["s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"Provider-managed prefix caching is automatic in both versions. 1.16 already parsed cache hit/miss usage.","sources":["s32"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"cache_read_tokens"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"cache_read_tokens"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"parse_usage"}]},"cache_boundaries":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek compatibility explicitly ignores unsupported cache keys, context_management, and these server-tool types. Prefix caching is automatic.","sources":["s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek compatibility explicitly ignores unsupported cache keys, context_management, and these server-tool types. Prefix caching is automatic.","sources":["s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"compaction":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek compatibility explicitly ignores unsupported cache keys, context_management, and these server-tool types. Prefix caching is automatic.","sources":["s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"token_counting":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek documents a downloadable local tokenizer and approximate token ratios, but its complete API inventory has no hosted token-count/tokenize endpoint. Post-request usage is a separate feature.","sources":["s167","s164"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"image_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"image_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"video_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"speech":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"transcription":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"streaming_transcription":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"diarization":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"multimodal_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.upload and UploadedFile.find support DeepSeek image files and expires_in. Uploads default to the sole supported purpose user_data, reject other purposes, non-supported image formats and files over 64 MiB. Live upload/find/expiry passed; only test-created files were deleted afterward. Stored images can be attached to vision models using the already-supported Responses file_id formatter. No download endpoint is documented, and RubyLLM raises explicitly for download.","sources":["s30","s317"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/deepseek/files.rb"}]},"file_download":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek documents upload, list, retrieve metadata and delete for image files, but no file-content download endpoint in its complete Files API inventory. A metadata retrieval endpoint is not a content-download operation.","sources":["s168","s164"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"chat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"embedding_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated advisor tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Perplexity Agent API; it is not an API of this provider.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"agent_skills":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated agent skills operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated asynchronous research operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek explicitly documents Responses as stateless: background, conversation, store and previous_response_id are unsupported.","sources":["s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated browser use operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated classification operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"computer_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated computer use operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context editing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated contextual embeddings operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"dedicated_transcription_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dedicated transcription api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dubbing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"fast_inference":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek explicitly ignores service_tier, prompt_cache_key/prompt_cache_retention and context_management. Cache reuse is automatic, and no separate manual-compaction endpoint appears in the complete API inventory.","sources":["s165","s164"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"DeepSeek exposes image file listing and deletion. RubyLLM now supports upload and metadata lookup, but the public file API has no list or delete operation. A file-content download endpoint is not documented.","sources":["s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"file_search_store_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file search store management operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"fill_in_middle":{"v1":"missing","v2":"missing","offered":true,"notes":"DeepSeek documents a separate FIM Completion beta API. RubyLLM has no completion_url dialect for /beta/completions.","sources":["s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Maps grounding; it is not an API of this provider.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated guardrail configuration operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"hosted_conversations":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek explicitly documents Responses as stateless: background, conversation, store and previous_response_id are unsupported.","sources":["s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Interactions API; it is not an API of this provider.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"json_mode":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"JSON-object mode uses raw text.format options on Responses, or raw response_format on Chat Completions. with_schema on Responses is the dedicated JSON Schema API and is counted separately as built in.","sources":["s28"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Amazon Bedrock Mantle; it is not an API of this provider.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek explicitly ignores service_tier, prompt_cache_key/prompt_cache_retention and context_management. Cache reuse is automatic, and no separate manual-compaction endpoint appears in the complete API inventory.","sources":["s165","s164"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated music generation operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated other batch operations operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Omni video endpoint; it is not an API of this provider.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated partner model protocols operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"prefix_completion":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"DeepSeek documents Chat Prefix Completion (Beta); raw message fields can be supplied through provider options. There is no RubyLLM prefix-completion method.","sources":["s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v1","path":"lib/ruby_llm/chat.rb","method":"with_tools"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated programmatic tool calling operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"prompt_cache_controls":{"v1":"na","v2":"na","offered":false,"notes":"DeepSeek explicitly ignores service_tier, prompt_cache_key/prompt_cache_retention and context_management. Cache reuse is automatic, and no separate manual-compaction endpoint appears in the complete API inventory.","sources":["s165","s164"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated provider-managed fallback operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"realtime":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated operation in the documented public DeepSeek API surface audited here. Self-hosted/open-weight models and separate products are outside this API comparison.","sources":["s28","s30"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"}]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated response caching operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"responses":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 explicitly registers a DeepSeek Responses dialect; users must select it because Chat Completions remains default.","sources":["s28"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/responses.rb"}]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone search api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"server_apply_patch":{"v1":"missing","v2":"partial","offered":true,"notes":"The alias sends a custom apply_patch definition, but custom_tool_call output is treated as a server item rather than a callable local function; no dedicated client apply-patch loop exists.","sources":["s29"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v2","path":"lib/ruby_llm/providers/deepseek/responses.rb","method":"SERVER_TOOL_ALIASES"},{"version":"v2","path":"lib/ruby_llm/protocols/responses/chat.rb","method":"parse_server_tool_items"}]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image generation tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated tool search operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated x search tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"shell_computer_tools":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated shell and computer tools operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated sound effects operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"streaming_speech":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated streaming speech generation operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated task budgets operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated text analysis api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"vector_store_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated vector store management operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"video_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video editing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video extension operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"voice_cloning":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice cloning operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice conversion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone web fetch api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses over websocket operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The public hosted DeepSeek Chat Completions, Responses, FIM, Files and model-list APIs. Local tokenizers, self-hosted/open-weight models, DeepSeek OCR weights and consumer applications are outside this matrix.","sources":["s164","s165"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepseek.rb"},{"version":"v1","path":"lib/ruby_llm/providers/deepseek.rb"}]}},"gaps":[{"notes":"File listing and deletion: DeepSeek exposes image file listing and deletion. RubyLLM now supports upload and metadata lookup, but the public file API has no list or delete operation. A file-content download endpoint is not documented.","sources":["s30"]},{"notes":"Fill-in-the-middle completion: DeepSeek documents a separate FIM Completion beta API. RubyLLM has no completion_url dialect for /beta/completions.","sources":["s30"]},{"notes":"JSON object mode: JSON-object mode uses raw text.format options on Responses, or raw response_format on Chat Completions. with_schema on Responses is the dedicated JSON Schema API and is counted separately as built in.","sources":["s28"]},{"notes":"Prefix completion: DeepSeek documents Chat Prefix Completion (Beta); raw message fields can be supplied through provider options. There is no RubyLLM prefix-completion method.","sources":["s30"]},{"notes":"Apply patch tool: The alias sends a custom apply_patch definition, but custom_tool_call output is treated as a server item rather than a callable local function; no dedicated client apply-patch loop exists.","sources":["s29"]}]},{"id":"cohere","name":"Cohere","notes":"No built-in Cohere provider exists at tag 1.16.0. Version 2 registers a native Cohere v2 protocol. General chat documents are text or image inputs, not arbitrary uploaded PDFs.","features":{"chat":{"v1":"missing","v2":"native","offered":true,"notes":"Availability and allowed combinations vary by Command model. Multiple calls can be returned; the API does not expose a parallel_tool_calls switch.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/media.rb"}]},"streaming":{"v1":"missing","v2":"native","offered":true,"notes":"Availability and allowed combinations vary by Command model. Multiple calls can be returned; the API does not expose a parallel_tool_calls switch.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/media.rb"}]},"structured_output":{"v1":"missing","v2":"native","offered":true,"notes":"Availability and allowed combinations vary by Command model. Multiple calls can be returned; the API does not expose a parallel_tool_calls switch.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/media.rb"}]},"vision":{"v1":"missing","v2":"native","offered":true,"notes":"Availability and allowed combinations vary by Command model. Multiple calls can be returned; the API does not expose a parallel_tool_calls switch.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/media.rb"}]},"pdf_input":{"v1":"na","v2":"na","offered":false,"notes":"Chat accepts text/images; even Parse currently explicitly excludes PDF and file URL inputs.","sources":["s84","s85"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/media.rb"}]},"audio_input":{"v1":"na","v2":"na","offered":false,"notes":"The current Chat v2 message content schema supports text and images, with no audio/video conversation input blocks. Dedicated file transcription is a separate endpoint.","sources":["s84","s90"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"The current Chat v2 message content schema supports text and images, with no audio/video conversation input blocks. Dedicated file transcription is a separate endpoint.","sources":["s84","s90"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"thinking":{"v1":"missing","v2":"native","offered":true,"notes":"Toggle and token budget on supported reasoning models.","sources":["s87"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb","method":"add_thinking"}]},"thinking_controls":{"v1":"missing","v2":"native","offered":true,"notes":"Toggle and token budget on supported reasoning models.","sources":["s87"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb","method":"add_thinking"}]},"citations":{"v1":"missing","v2":"native","offered":true,"notes":"Typed document citations and streaming citation events.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb","method":"parse_citations"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/streaming.rb"}]},"tools":{"v1":"missing","v2":"native","offered":true,"notes":"Availability and allowed combinations vary by Command model. Multiple calls can be returned; the API does not expose a parallel_tool_calls switch.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/media.rb"}]},"tool_choice":{"v1":"missing","v2":"native","offered":true,"notes":"Supports the choices the provider exposes: auto, required and none. Cohere cannot force an individual named tool.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/tools.rb","method":"build_tool_choice"}]},"parallel_tools":{"v1":"missing","v2":"native","offered":true,"notes":"Availability and allowed combinations vary by Command model. Multiple calls can be returned; the API does not expose a parallel_tool_calls switch.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/media.rb"}]},"parallel_tool_control":{"v1":"na","v2":"na","offered":false,"notes":"No provider option for disabling parallel calls is documented.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb","method":"add_tools"}]},"server_web_search":{"v1":"na","v2":"na","offered":false,"notes":"Cohere retired managed connectors and the chat connectors/search_queries_only parameters on 2025-09-15. Current Chat v2 supports supplied documents and client function tools, not a documented hosted search/fetch/file-search service.","sources":["s170","s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"server_web_fetch":{"v1":"na","v2":"na","offered":false,"notes":"Cohere retired managed connectors and the chat connectors/search_queries_only parameters on 2025-09-15. Current Chat v2 supports supplied documents and client function tools, not a documented hosted search/fetch/file-search service.","sources":["s170","s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"server_code_execution":{"v1":"na","v2":"na","offered":false,"notes":"Current Cohere Chat v2 tools are client-defined function schemas; no hosted code-execution or remote-MCP tool type is documented. The documentation website MCP server is not a model-executed inference tool.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"server_file_search":{"v1":"na","v2":"na","offered":false,"notes":"Cohere retired managed connectors and the chat connectors/search_queries_only parameters on 2025-09-15. Current Chat v2 supports supplied documents and client function tools, not a documented hosted search/fetch/file-search service.","sources":["s170","s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"server_mcp":{"v1":"na","v2":"na","offered":false,"notes":"Current Cohere Chat v2 tools are client-defined function schemas; no hosted code-execution or remote-MCP tool type is documented. The documentation website MCP server is not a model-executed inference tool.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"prompt_caching":{"v1":"missing","v2":"native","offered":true,"notes":"Cohere Chat v2 reports inference-cache hits as usage.cached_tokens. 2.0 parses that field as cache_read_tokens; there was no Cohere provider in 1.16. The current schema exposes no caller cache-boundary or cache-resource API.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb"}]},"cache_boundaries":{"v1":"na","v2":"na","offered":false,"notes":"The current Chat v2 request schema exposes no cache-boundary, cache-resource, retention/routing-key or compaction controls. Cached-token accounting is documented separately. The full API inventory has no dedicated cache/compaction endpoint.","sources":["s84","s169"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"The current Chat v2 request schema exposes no cache-boundary, cache-resource, retention/routing-key or compaction controls. Cached-token accounting is documented separately. The full API inventory has no dedicated cache/compaction endpoint.","sources":["s84","s169"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"compaction":{"v1":"na","v2":"na","offered":false,"notes":"The current Chat v2 request schema exposes no cache-boundary, cache-resource, retention/routing-key or compaction controls. Cached-token accounting is documented separately. The full API inventory has no dedicated cache/compaction endpoint.","sources":["s84","s169"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"token_counting":{"v1":"missing","v2":"native","offered":true,"notes":"Native exact plain-text tokenization via RubyLLM.tokenize; full Chat#count_tokens remains unsupported by this provider. IDs/count are not billed usage; no generation usage entry is inferred.","sources":["s86","s350"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/tokenization.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/tokenization.rb"},{"version":"v2","path":"lib/ruby_llm/provider.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb"}],"verification":[{"status":"passed","model":"command-a-03-2025","spec":"spec/ruby_llm/tokenization_spec.rb","example":"tokenizes text with cohere through the public API","cassette":"spec/fixtures/vcr_cassettes/tokenization_tokenizes_text_with_cohere_through_the_public_api.yml","recorded_on":"2026-09-07","notes":"Fresh provider API recording: nonempty integer IDs, count exactly ID length, typed Tokenization, model preserved, raw response preserved."}]},"image_generation":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding dedicated operation is documented in the current Cohere API inventory. Command vision input, Embed multimodal vectors, Parse OCR and prerecorded Transcribe are distinct operations; North/private deployments are outside this audit.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"image_editing":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding dedicated operation is documented in the current Cohere API inventory. Command vision input, Embed multimodal vectors, Parse OCR and prerecorded Transcribe are distinct operations; North/private deployments are outside this audit.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"video_generation":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding dedicated operation is documented in the current Cohere API inventory. Command vision input, Embed multimodal vectors, Parse OCR and prerecorded Transcribe are distinct operations; North/private deployments are outside this audit.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"speech":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding dedicated operation is documented in the current Cohere API inventory. Command vision input, Embed multimodal vectors, Parse OCR and prerecorded Transcribe are distinct operations; North/private deployments are outside this audit.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"transcription":{"v1":"missing","v2":"native","offered":true,"notes":"Cohere Transcribe returns text, without word timestamps or speaker labels.","sources":["s90"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/transcription.rb"}]},"streaming_transcription":{"v1":"na","v2":"na","offered":false,"notes":"The current transcription endpoint documents neither streaming output nor speaker labeling.","sources":["s90"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/transcription.rb"}]},"diarization":{"v1":"na","v2":"na","offered":false,"notes":"The current transcription endpoint documents neither streaming output nor speaker labeling.","sources":["s90"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/transcription.rb"}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding dedicated operation is documented in the current Cohere API inventory. Command vision input, Embed multimodal vectors, Parse OCR and prerecorded Transcribe are distinct operations; North/private deployments are outside this audit.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"ocr":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.ocr calls the public Cohere v2 Parse endpoint with image URLs or inline image data. parse-v5.0 is registry-verified and returned HTTP 200 for both Markdown and blocks output. Pages normalize to OCR::Page while preserving the original page hash, image/table metadata, and billed page count. This endpoint accepts one image, not PDF or PowerPoint files. Default output is Markdown; provider_options output_format: blocks also works. pages may be omitted or [0]; other selections raise before the request.","sources":["s324","s325","s326","s327","s85"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/ocr.rb","method":"render_ocr_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/ocr.rb","method":"parse_ocr_page"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/models.rb","method":"capabilities_from"},{"version":"v2","path":"lib/ruby_llm/ocr.rb","method":"pages"}]},"embeddings":{"v1":"missing","v2":"native","offered":true,"notes":"Embed v4 accepts mixed text and image inputs; earlier Embed models remain text-only.","sources":["s88"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/embeddings.rb"}]},"multimodal_embeddings":{"v1":"missing","v2":"native","offered":true,"notes":"Cohere Embed v4 accepts mixed text and images through the shared embedding API. Embed v3 accepts one image without text, using the native images payload. Azure-hosted Cohere deployments reuse the same serialization. A fresh native v3 request returned a 1024-dimensional vector; the service reported one billed image without input-token usage, which remains unknown.","sources":["s88"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/embeddings.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"embed-english-v3.0","spec":"spec/ruby_llm/protocols/cohere/embeddings_spec.rb","example":"RubyLLM::Protocols::Cohere::Embeddings embeds an image with native Cohere Embed v3","cassette":"spec/fixtures/vcr_cassettes/protocols_cohere_embeddings_embeds_an_image_with_native_cohere_embed_v3.yml","notes":"Fresh HTTP 200; 1024 float dimensions. Billed image count reported without token usage."}]},"reranking":{"v1":"missing","v2":"native","offered":true,"notes":"","sources":["s89"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/cohere/rerank.rb"}]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"Native upload/find for Cohere datasets. purpose selects dataset type, provider_options sets name and metadata preservation; asynchronous validation status is exposed. Dataset storage does not imply chat file attachments.","sources":["s91","s173","s174","s369","s370","s371"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/datasets.rb"}],"verification":[{"status":"passed","spec":"spec/ruby_llm/protocols/cohere/datasets_spec.rb","example":"uploads validates retrieves and downloads a Cohere dataset","cassette":"spec/fixtures/vcr_cassettes/protocols_cohere_datasets_uploads_validates_retrieves_and_downloads_a_cohere_dataset.yml","recorded_on":"2026-09-07","notes":"Fresh provider recording: upload returns real ID, find reaches validated status, original download equals uploaded bytes, MIME is application/jsonl, own input dataset deleted."}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"Original uploaded bytes are preserved by default and downloaded unchanged. Generated/processed Avro dataset parts decode in provider part order to JSONL via optional avro gem, with correct filename and MIME. Signed URLs are fetched without API credentials.","sources":["s91","s173","s174","s369","s370","s371"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/datasets.rb"}],"verification":[{"status":"passed","spec":"spec/ruby_llm/protocols/cohere/datasets_spec.rb","example":"uploads validates retrieves and downloads a Cohere dataset","cassette":"spec/fixtures/vcr_cassettes/protocols_cohere_datasets_uploads_validates_retrieves_and_downloads_a_cohere_dataset.yml","recorded_on":"2026-09-07","notes":"Fresh provider recording: upload returns real ID, find reaches validated status, original download equals uploaded bytes, MIME is application/jsonl, own input dataset deleted."}]},"chat_batches":{"v1":"missing","v2":"native","offered":true,"notes":"Native v2 batch create/find/cancel/results using batch-chat-v2-input datasets. Requests retain IDs, tool calls, model, and per-request usage; failed rows become failed slots. Batch schema has fewer options than synchronous Chat; unsupported structured output, forced tool choice and retrieval document fields raise before upload.","sources":["s173","s174","s369","s370","s371"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/datasets.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/batches.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/batch_requests.rb"}],"verification":[{"status":"unavailable","model":"command-a-03-2025","spec":"spec/ruby_llm/protocols/cohere/batches_spec.rb","example":"collects completed Cohere chat responses with returned IDs and token usage","cassette":"spec/fixtures/vcr_cassettes/protocols_cohere_batches_collects_completed_cohere_chat_responses_with_returned_ids_and_token_usage.yml","checked_on":"2026-09-07","notes":"Fresh rerecording on 2026-09-07 uploaded and validated its dataset, then POST /v2/batches returned HTTP 502 with no batch ID. The owned dataset was deleted successfully. The prior recording reached job polling before HTTP 502; these are separate observed failures. Fresh known-output probe subsequently decoded two real Messages with provider raw IDs, reversed custom IDs1,0 and input5/output15 each; permanent example remains pending on the new recorded submission HTTP 502."},{"status":"unit","spec":"spec/ruby_llm/protocols/cohere/batches_spec.rb","notes":"Completed result decoding, custom-ID correlation, scalar/array embedding shapes and reported usage have protocol regression coverage."},{"status":"passed","checked_on":"2026-09-07","model":"command-a-03-2025","notes":"Separate fresh read-only probe retrieved a known completed chat output and decoded two actual Message values with raw provider IDs, reversed custom indices1,0 and input10/output30 tokens in total. This was not a completed permanent-spec recording; that recording remains pending on HTTP502."}]},"embedding_batches":{"v1":"missing","v2":"native","offered":true,"notes":"Native v2 batch API with batch-embed-v2-input datasets, using embed-v4.0 (not restricted to legacy v3 embed-jobs). Scalar/one-element/multi-element array shapes survive fresh Batch.find and out-of-order output. Cohere JSON dataset validator rejects nullable int dimensions even with explicit Avro union encoding; dimensions is rejected before upload, synchronous dimensions unchanged.","sources":["s91","s173","s174","s369","s370","s371"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/datasets.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/batches.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/batch_requests.rb"}],"verification":[{"status":"unavailable","model":"embed-v4.0","spec":"spec/ruby_llm/protocols/cohere/batches_spec.rb","example":"collects completed Cohere embedding batches with scalar and array results","cassette":"spec/fixtures/vcr_cassettes/protocols_cohere_batches_collects_completed_cohere_embedding_batches_with_scalar_and_array_results.yml","checked_on":"2026-09-07","notes":"Fresh rerecording on 2026-09-07 uploaded and validated its dataset, then POST /v2/batches returned HTTP 502 with no batch ID. The owned dataset was deleted successfully. The prior recording reached job polling before HTTP 502; these are separate observed failures."},{"status":"unit","spec":"spec/ruby_llm/protocols/cohere/batches_spec.rb","notes":"Completed result decoding, custom-ID correlation, scalar/array embedding shapes and reported usage have protocol regression coverage."}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated advisor tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Perplexity Agent API; it is not an API of this provider.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"agent_skills":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated agent skills operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated asynchronous research operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated background responses jobs operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated browser use operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"Cohere explicitly retired all fine-tuning capabilities and the Classify endpoint on 2025-09-15; previously fine-tuned models became inaccessible. Legacy reference pages remaining online do not establish a current callable offering.","sources":["s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"computer_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated computer use operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context editing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated contextual embeddings operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"dedicated_transcription_api":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 implements the dedicated Cohere audio/transcriptions endpoint. This row overlaps transcription.","sources":["s90"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/transcription.rb"}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dubbing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"fast_inference":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fast inference operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Cohere datasets can be listed and deleted. RubyLLM has no Cohere dataset lifecycle; these resources are for batch/embed data, not general conversation attachments.","sources":["s171","s172"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"},{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"}]},"file_search_store_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file search store management operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fill-in-the-middle completion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"Cohere explicitly retired all fine-tuning capabilities and the Classify endpoint on 2025-09-15; previously fine-tuned models became inaccessible. Legacy reference pages remaining online do not establish a current callable offering.","sources":["s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Maps grounding; it is not an API of this provider.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated guardrail configuration operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"hosted_conversations":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated hosted conversations operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Interactions API; it is not an API of this provider.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"json_mode":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Chat v2 accepts response_format.type=json_object without a schema. RubyLLM supports schema output separately; plain JSON object mode uses provider_options.","sources":["s84"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/cohere/chat.rb"},{"version":"v2","path":"lib/ruby_llm/chat.rb"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Amazon Bedrock Mantle; it is not an API of this provider.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated manual context compaction operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated music generation operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated other batch operations operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Omni video endpoint; it is not an API of this provider.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated partner model protocols operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"prefix_completion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated prefix completion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated programmatic tool calling operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"prompt_cache_controls":{"v1":"na","v2":"na","offered":false,"notes":"The current Chat v2 request schema exposes no cache-boundary, cache-resource, retention/routing-key or compaction controls. Cached-token accounting is documented separately. The full API inventory has no dedicated cache/compaction endpoint.","sources":["s84","s169"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated provider-managed fallback operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"realtime":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding dedicated operation is documented in the current Cohere API inventory. Command vision input, Embed multimodal vectors, Parse OCR and prerecorded Transcribe are distinct operations; North/private deployments are outside this audit.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated response caching operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"responses":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone search api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated apply patch tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image generation tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated tool search operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated x search tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"shell_computer_tools":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated shell and computer tools operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated sound effects operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"streaming_speech":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding dedicated operation is documented in the current Cohere API inventory. Command vision input, Embed multimodal vectors, Parse OCR and prerecorded Transcribe are distinct operations; North/private deployments are outside this audit.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated task budgets operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated text analysis api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"vector_store_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated vector store management operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"video_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video editing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video extension operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"voice_cloning":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice cloning operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice conversion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone web fetch api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses over websocket operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: The active public Cohere inference and dataset APIs. Retired Connectors, Classify and fine-tuning endpoints are identified explicitly; North, Model Vault and third-party/private deployment features are outside this API inventory.","sources":["s169","s84","s170"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/cohere.rb"},{"version":"v1","path":"lib/ruby_llm.rb"}]}},"gaps":[{"notes":"File listing and deletion: Cohere datasets can be listed and deleted. RubyLLM has no Cohere dataset lifecycle; these resources are for batch/embed data, not general conversation attachments.","sources":["s171","s172"]},{"notes":"JSON object mode: Chat v2 accepts response_format.type=json_object without a schema. RubyLLM supports schema output separately; plain JSON object mode uses provider_options.","sources":["s84"]}]},{"id":"mistral","name":"Mistral","notes":"The audit includes Mistral inference and hosted tools. RubyLLM implements default Chat Completions with multi-completion hosted tools and an explicit stateless Conversations protocol. Both replay completed tool results from application-owned history. Stored conversations and provider confirmations that require them are outside this release. Managed agent, library and skill resources remain separate.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"pdf_input":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"audio_input":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"The current Chat content schema documents text, images, documents and audio, not direct video content parts. Extracted image frames and Vibe application behavior are separate from a documented video-input API.","sources":["s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"Thinking text and history already existed in v1.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"V1 public effort controls already worked for supported models, with family-specific high/none mappings. V2 resolves controls from model metadata and adds consistent toggle/default handling.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/thinking.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"}]},"citations":{"v1":"missing","v2":"native","offered":true,"notes":"Mistral Conversations and hosted Chat Completions normalize tool_reference URL/title/description into Citation values, including streamed results. Raw source entries remain on Message.raw_content; stateless wire replay preserves actual reference links. Plain Markdown links are not invented citations.","sources":["s301","s302","s92","s179"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/content.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/multi_completion.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"mistral-small-latest","spec":"spec/ruby_llm/protocols/mistral/conversations_live_spec.rb","example":"searches the web with citations and replays hosted results in a stateless conversation","cassette":"spec/fixtures/vcr_cassettes/protocols_mistral_conversations_searches_the_web_with_citations_and_replays_hosted_results_in_a_stateless_conversation.yml","notes":"Fresh web search, typed URL citations, exact hosted results retained, and a successful second user turn."}]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"parallel_tool_control":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"server_web_search":{"v1":"missing","v2":"native","offered":true,"notes":"with_server_tools(:web_search) uses the explicit :conversations protocol. Completed hosted calls stay ServerToolCall values, with raw results and prompt/connector/completion usage. Stateless follow-ups replay actual executed results.","sources":["s301","s92","s179"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/streaming.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"mistral-small-latest","spec":"spec/ruby_llm/protocols/mistral/conversations_live_spec.rb","example":"searches the web with citations and replays hosted results in a stateless conversation","cassette":"spec/fixtures/vcr_cassettes/protocols_mistral_conversations_searches_the_web_with_citations_and_replays_hosted_results_in_a_stateless_conversation.yml","notes":"Fresh web search, typed URL citations, exact hosted results retained, and a successful second user turn."}]},"server_web_fetch":{"v1":"missing","v2":"native","offered":true,"notes":"with_server_tools(:web_fetch) enables the Conversations web_search tool and its documented open_url operation. Live execution fetched the requested public URL; this is not a second search-only label.","sources":["s301","s182","s92","s179"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/streaming.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"mistral-small-latest","spec":"spec/ruby_llm/protocols/mistral/conversations_live_spec.rb","example":"fetches a public page through the web fetch alias","cassette":"spec/fixtures/vcr_cassettes/protocols_mistral_conversations_fetches_a_public_page_through_the_web_fetch_alias.yml","notes":"Fresh open_url tool execution fetched the official Ruby 3.4 release page and answered Prism."}]},"server_code_execution":{"v1":"missing","v2":"native","offered":true,"notes":"with_server_tools(:code_execution) maps to Conversations code_interpreter, including streamed Python results, raw execution records, usage, and stateless continuation.","sources":["s301","s92","s179"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/streaming.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"mistral-small-latest","spec":"spec/ruby_llm/protocols/mistral/conversations_live_spec.rb","example":"streams hosted Python execution with complete tool history and usage","cassette":"spec/fixtures/vcr_cassettes/protocols_mistral_conversations_streams_hosted_python_execution_with_complete_tool_history_and_usage.yml","notes":"Fresh streamed Python execution returned 703, preserved real result/usage, and completed a later user turn."}]},"server_file_search":{"v1":"missing","v2":"native","offered":true,"notes":"with_server_tools(file_search: {library_ids: [...]}) maps to Conversations document_library and returns real hosted search results. Uses pre-existing indexed Mistral libraries; creating/managing libraries remains separate.","sources":["s301","s92","s179","s360"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/streaming.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"mistral-small-latest","spec":"spec/ruby_llm/protocols/mistral/conversations_live_spec.rb","example":"searches an uploaded document through the file search alias","cassette":"spec/fixtures/vcr_cassettes/protocols_mistral_conversations_searches_an_uploaded_document_through_the_file_search_alias.yml","notes":"Fresh temporary library creation, document upload/indexing, document_library search with correct synthetic facts, and deletion. Public file_search uses an existing library_id; no library-management API claimed."}]},"server_mcp":{"v1":"missing","v2":"native","offered":true,"notes":"The mcp alias maps connector_id to hosted connector tools on default Chat Completions and explicit stateless Conversations. Completed multi-message results and streaming output replay from application-owned history. Provider confirmations require stored conversations and are not supported. Live remote execution remains unavailable because private connector creation requires a scope absent on the configured account.","sources":["s301","s302","s183","s92","s179","s362"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/streaming.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/multi_completion.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","notes":"A fresh request to create a private read-only Microsoft Learn MCP connector returned HTTP 403: this API key lacks personal_and_shared scope. No connector created, permissions changed, or existing business tools invoked. Remote connector execution is not live-verified."},{"status":"unit","spec":"spec/ruby_llm/protocols/mistral/conversations_spec.rb","notes":"Stateless hosted tool rendering and result replay are covered. Storage and confirmation options are rejected before requests."}]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"Both versions parse automatic cache read/write accounting. V1 has no shared caching controls; use wire parameters. V2 adds provider caching controls. Cache boundaries are a separate row.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"cache_read_tokens"},{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb","method":"cache_read_tokens"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"}]},"cache_boundaries":{"v1":"na","v2":"na","offered":false,"notes":"Current Chat exposes automatic cache accounting and prompt_cache_key, but no content-boundary markers, standalone cache resource or compaction control. No cache/compact endpoint appears in the complete API inventory.","sources":["s92","s175"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"Current Chat exposes automatic cache accounting and prompt_cache_key, but no content-boundary markers, standalone cache resource or compaction control. No cache/compact endpoint appears in the complete API inventory.","sources":["s92","s175"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"compaction":{"v1":"na","v2":"na","offered":false,"notes":"Current Chat exposes automatic cache accounting and prompt_cache_key, but no content-boundary markers, standalone cache resource or compaction control. No cache/compact endpoint appears in the complete API inventory.","sources":["s92","s175"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"token_counting":{"v1":"na","v2":"na","offered":false,"notes":"Mistral documents local tokenization through mistral-common, but no hosted token-count endpoint appears in the complete API inventory. Local tokenization and response token usage are outside this endpoint row.","sources":["s184","s175"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"image_generation":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.paint invokes the Conversations image_generation tool and returns Image with downloaded bytes, actual MIME, model and input/output tokens. One image per request; the hosted tool does not expose output sizing or image/mask editing through this path.","sources":["s301","s302","s92","s179","s180","s361"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/files.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"mistral-small-latest","spec":"spec/ruby_llm/protocols/mistral/conversations/images_spec.rb","example":"generates and downloads an image through paint","cassette":"spec/fixtures/vcr_cassettes/protocols_mistral_conversations_images_generates_and_downloads_an_image_through_paint.yml","notes":"Fresh public paint returned image bytes from /files/:id/content, correct actual JPEG MIME, model and positive token usage."}]},"image_editing":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding dedicated operation is documented in the audited API inventory. This statement excludes Vibe/Le Chat consumer features and local Search Toolkit components; streaming speech is overridden below with its explicit API schema.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"video_generation":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding dedicated operation is documented in the audited API inventory. This statement excludes Vibe/Le Chat consumer features and local Search Toolkit components; streaming speech is overridden below with its explicit API schema.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"speech":{"v1":"missing","v2":"native","offered":true,"notes":"Voxtral speech has a dedicated renderer and typed result.","sources":["s93"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral/speech.rb"}]},"transcription":{"v1":"partial","v2":"native","offered":true,"notes":"V1 inherited the compatible basic upload endpoint but had OpenAI-specific optional fields and no Mistral live matrix entry. V2 adds Mistral context biasing and speaker controls.","sources":["s94"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/transcription.rb"}]},"streaming_transcription":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.transcribe with a block handles Mistral SSE transcription.text.delta, transcription.segment and transcription.done. Text, speaker segments, final language, prompt_audio_seconds duration, and prompt/completion token usage are retained. Live Voxtral Mini streaming with diarization passed. This is an uploaded-file SSE operation, not realtime microphone input.","sources":["s94","s315","s316"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral/transcription.rb","method":"build_transcription_chunk"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb","method":"build_streamed_transcription"}]},"diarization":{"v1":"missing","v2":"native","offered":true,"notes":"speaker_names enables diarize and segment timestamps.","sources":["s94"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral/transcription.rb"}]},"moderation":{"v1":"native","v2":"native","offered":true,"notes":"Compatible /moderations operation is inherited in both versions; custom classification endpoints remain separate.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/moderation.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/moderation.rb"}]},"ocr":{"v1":"missing","v2":"native","offered":true,"notes":"Typed pages with page selection; provider-specific annotation options can be supplied.","sources":["s95"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral/ocr.rb"}]},"embeddings":{"v1":"native","v2":"native","offered":true,"notes":"Model and modality support varies; v1 already had Mistral-specific document/audio formatting.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/embeddings.rb"}]},"multimodal_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"The current embeddings endpoint explicitly accepts text input as a string or array of strings. No image/audio/video embedding input is documented.","sources":["s185"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"No corresponding dedicated operation is documented in the audited API inventory. This statement excludes Vibe/Le Chat consumer features and local Search Toolkit components; streaming speech is overridden below with its explicit API schema.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"Files lifecycle and Mistral download endpoint.","sources":["s96"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/mistral/files.rb"}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.download fetches Mistral file bytes through the documented /files/:id/content route, including generated image tool files. The old /download override returned HTTP 404 and has been removed.","sources":["s96","s361"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/mistral/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"mistral-small-latest","spec":"spec/ruby_llm/protocols/mistral/conversations/images_spec.rb","example":"generates and downloads an image through paint","cassette":"spec/fixtures/vcr_cassettes/protocols_mistral_conversations_images_generates_and_downloads_an_image_through_paint.yml","notes":"Fresh public paint returned image bytes from /files/:id/content, correct actual JPEG MIME, model and positive token usage."}]},"chat_batches":{"v1":"missing","v2":"native","offered":true,"notes":"Only chat-completion batches are implemented.","sources":["s97"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat_completions/batches.rb"}]},"embedding_batches":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.batch accepts Mistral embed_later requests through the existing inline batch/jobs API, selects /v1/embeddings, and parses typed Embedding results. Array markers in custom_id preserve scalar versus one-element-array shape after reloading a batch; per-item errors retain their original slots. Live submission/find/cancel passed. Completed live result collection was not verified because test jobs remained queued after the bounded wait; result parsing is covered by protocol regressions.","sources":["s97"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat_completions/batches.rb","method":"mistral_batch_endpoint"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat_completions/batches.rb","method":"parse_mistral_batch_body"}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated advisor tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Perplexity Agent API; it is not an API of this provider.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"agent_skills":{"v1":"missing","v2":"missing","offered":true,"notes":"Mistral has a dedicated /v1/skills resource API. RubyLLM registers no skill or agent resource protocol.","sources":["s176"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"}]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated asynchronous research operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated background responses jobs operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated browser use operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"classification":{"v1":"missing","v2":"missing","offered":true,"notes":"Custom classification endpoint has no domain operation.","sources":["s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"}]},"computer_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated computer use operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context editing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated contextual embeddings operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"dedicated_transcription_api":{"v1":"partial","v2":"native","offered":true,"notes":"The dedicated audio/transcriptions endpoint is inherited with compatibility limitations in 1.16; 2.0 implements a Mistral-specific dialect. This row overlaps transcription.","sources":["s94"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/transcription.rb"}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dubbing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"fast_inference":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fast inference operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Mistral exposes file listing and deletion, while RubyLLM Files implements upload, metadata lookup and download only.","sources":["s96"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"}]},"file_search_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Mistral Libraries expose managed indexing and retrieval. RubyLLM has no library/index creation or management API; its Files integration is separate.","sources":["s177","s178"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"}]},"fill_in_middle":{"v1":"missing","v2":"missing","offered":true,"notes":"Dedicated /fim/completions endpoint is absent.","sources":["s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"}]},"fine_tuning":{"v1":"missing","v2":"missing","offered":null,"notes":"The official page labels fine-tuning deprecated and no longer actively supported, while retaining job/pricing documentation. The current endpoint index omits it. RubyLLM has no fine-tuning lifecycle in either version; public documentation does not establish whether any existing customer can still create a legacy job.","sources":["s99","s175"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Maps grounding; it is not an API of this provider.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated guardrail configuration operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"hosted_conversations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Mistral documents provider-managed conversation storage or hosted conversation resources. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s179","s362"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Interactions API; it is not an API of this provider.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"json_mode":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Mistral documents plain JSON-object response mode and assistant prefix completion. These wire options can be supplied through with_params/provider_options; no dedicated plain-JSON or prefix-completion RubyLLM operation exists.","sources":["s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/chat.rb"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Amazon Bedrock Mantle; it is not an API of this provider.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"Current Chat exposes automatic cache accounting and prompt_cache_key, but no content-boundary markers, standalone cache resource or compaction control. No cache/compact endpoint appears in the complete API inventory.","sources":["s92","s175"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated music generation operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"nonchat_batches":{"v1":"missing","v2":"missing","offered":true,"notes":"Provider also batches FIM, moderation, OCR, classification, conversations and transcription.","sources":["s97"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat_completions/batches.rb"}]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"This row specifically names Google Omni video endpoint; it is not an API of this provider.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated partner model protocols operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"prefix_completion":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Mistral documents plain JSON-object response mode and assistant prefix completion. These wire options can be supplied through with_params/provider_options; no dedicated plain-JSON or prefix-completion RubyLLM operation exists.","sources":["s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"},{"version":"v2","path":"lib/ruby_llm/chat.rb"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated programmatic tool calling operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"prompt_cache_controls":{"v1":"passthrough","v2":"native","offered":true,"notes":"V1 uses with_params with provider cache vocabulary. V2 exposes with_caching; Mistral maps key, OpenRouter maps cache_control and ttl.","sources":["s92"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/chat.rb"}]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated provider-managed fallback operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"realtime":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Mistral documents realtime conversations. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s98"],"code":[]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated response caching operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"responses":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone search api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated apply patch tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"server_tool_image_generation":{"v1":"missing","v2":"native","offered":true,"notes":"with_server_tools(:image_generation) works on default Chat Completions and explicit Conversations. Multi-completion and streaming responses retain every native assistant/tool message and generated attachment, without dispatching completed hosted calls as local Ruby tools.","sources":["s301","s302","s92","s180"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/multi_completion.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/conversations/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/mistral/content.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"mistral-small-latest","spec":"spec/ruby_llm/protocols/mistral/multi_completion_spec.rb","example":"streams and downloads a hosted image through the default chat API","cassette":"spec/fixtures/vcr_cassettes/protocols_mistral_multicompletion_streams_and_downloads_a_hosted_image_through_the_default_chat_api.yml","notes":"Fresh default Chat Completions hosted image stream normalized all assistant/tool messages, downloaded the image, preserved usage and completed a later user turn."},{"status":"passed","recorded_on":"2026-09-07","model":"mistral-small-latest","spec":"spec/ruby_llm/protocols/mistral/conversations/images_spec.rb","example":"generates and downloads an image through paint","cassette":"spec/fixtures/vcr_cassettes/protocols_mistral_conversations_images_generates_and_downloads_an_image_through_paint.yml","notes":"Fresh public paint returned image bytes from /files/:id/content, correct actual JPEG MIME, model and positive token usage."}]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated tool search operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated x search tool operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"shell_computer_tools":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated shell and computer tools operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated sound effects operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"streaming_speech":{"v1":"missing","v2":"native","offered":true,"notes":"Mistral SSE stream:true speech.audio.delta events decode incremental audio; completion event required and prompt/completion token usage preserved. Public voice: maps to documented voice_id. Existing buffered JSON speech remains supported.","sources":["s93"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/speech.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"voxtral-mini-tts-latest","spec":"spec/ruby_llm/speech_streaming_spec.rb","example":"RubyLLM::Speech streams speech from mistral","cassette":"spec/fixtures/vcr_cassettes/speech_streams_speech_from_mistral.yml","notes":"Fresh API recording plus independent HTTP probe: 3 chunks, 43359 bytes, first audio after 1.14s; joined bytes match the complete Speech."}]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated task budgets operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated text analysis api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"vector_store_management":{"v1":"missing","v2":"missing","offered":true,"notes":"Mistral Libraries and RAG search-index APIs support indexing and hosted retrieval. RubyLLM can pass an externally prepared document library into a hosted tool, but has no library/index creation or management API.","sources":["s177","s178"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"}]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video batches operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"video_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video editing operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video extension operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"voice_cloning":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Mistral speech accepts reference audio through ref_audio; RubyLLM.speak can pass that field via provider_options. Mistral also exposes custom voice creation and management, which has no dedicated RubyLLM lifecycle.","sources":["s93","s181"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v2","path":"lib/ruby_llm/providers/mistral/speech.rb"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice conversion operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone web fetch api operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses over websocket operation is documented in the audited API inventory. This is a documentation-scope conclusion, not a claim that the provider or its other products cannot perform related tasks. Scope: Public Mistral inference, Agents/Conversations, connector, library and skill APIs. Vibe/Le Chat-only features, client-side Search Toolkit helpers and platform administration are outside this matrix.","sources":["s175","s92"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/mistral.rb"},{"version":"v1","path":"lib/ruby_llm/providers/mistral.rb"}]}},"gaps":[{"notes":"Agent skills: Mistral has a dedicated /v1/skills resource API. RubyLLM registers no skill or agent resource protocol.","sources":["s176"]},{"notes":"Classification: Custom classification endpoint has no domain operation.","sources":["s92"]},{"notes":"File listing and deletion: Mistral exposes file listing and deletion, while RubyLLM Files implements upload, metadata lookup and download only.","sources":["s96"]},{"notes":"File search store management: Mistral Libraries expose managed indexing and retrieval. RubyLLM has no library/index creation or management API; its Files integration is separate.","sources":["s177","s178"]},{"notes":"Fill-in-the-middle completion: Dedicated /fim/completions endpoint is absent.","sources":["s92"]},{"notes":"Fine-tuning: The official page labels fine-tuning deprecated and no longer actively supported, while retaining job/pricing documentation. The current endpoint index omits it. RubyLLM has no fine-tuning lifecycle in either version; public documentation does not establish whether any existing customer can still create a legacy job.","sources":["s99","s175"]},{"notes":"JSON object mode, Prefix completion: Mistral documents plain JSON-object response mode and assistant prefix completion. These wire options can be supplied through with_params/provider_options; no dedicated plain-JSON or prefix-completion RubyLLM operation exists.","sources":["s92"]},{"notes":"Other batch operations: Provider also batches FIM, moderation, OCR, classification, conversations and transcription.","sources":["s97"]},{"notes":"Vector store management: Mistral Libraries and RAG search-index APIs support indexing and hosted retrieval. RubyLLM can pass an externally prepared document library into a hosted tool, but has no library/index creation or management API.","sources":["s177","s178"]},{"notes":"Voice cloning: Mistral speech accepts reference audio through ref_audio; RubyLLM.speak can pass that field via provider_options. Mistral also exposes custom voice creation and management, which has no dedicated RubyLLM lifecycle.","sources":["s93","s181"]}]},{"id":"openrouter","name":"OpenRouter","notes":"The audit includes Chat Completions, Responses, Messages, media, Files, Batch, routing and documented server tools. RubyLLM defaults to Chat Completions and explicitly selects Responses for its supported hosted tools. Messages-specific tools and incomplete provider result contracts are identified separately. Workspace administration is sampled, not exhaustively audited.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"pdf_input":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"audio_input":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"video_input":{"v1":"missing","v2":"native","offered":true,"notes":"Video URL/data-URI content parts on supported understanding models; generation is a separate operation.","sources":["s119"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb","method":"format_video"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"V1 public effort and budget controls already worked. V2 adds explicit enable/disable and preserves raw reasoning blocks in tool history.","sources":["s117"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/chat.rb","method":"build_reasoning"}]},"citations":{"v1":"passthrough","v2":"native","offered":true,"notes":"V2 normalizes annotations and source links.","sources":["s120"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"extract_citations"}]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"parallel_tool_control":{"v1":"native","v2":"native","offered":true,"notes":"Existing core Chat Completions capabilities.","sources":["s117","s118"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/media.rb"}]},"server_web_search":{"v1":"passthrough","v2":"native","offered":true,"notes":"Portable aliases for OpenRouter-operated server tools.","sources":["s121"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"SERVER_TOOL_ALIASES"}]},"server_web_fetch":{"v1":"passthrough","v2":"native","offered":true,"notes":"Portable aliases for OpenRouter-operated server tools.","sources":["s121"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"SERVER_TOOL_ALIASES"}]},"server_code_execution":{"v1":"missing","v2":"native","offered":true,"notes":"with_server_tools(:code_execution) on protocol: :responses invokes the documented managed shell. RubyLLM preserves returned action/output/exit status in ServerToolCall and provider billing. This verifies hosted shell execution, not a separate interactive desktop/computer session.","sources":["s269","s270","s271","s272"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb","method":"server_tool_aliases"}],"verification":[{"model":"openai/gpt-5.2","spec":"spec/ruby_llm/protocols/openrouter/responses_spec.rb","example":"executes a hosted shell and returns its real output and billed usage","cassette":"spec/fixtures/vcr_cassettes/protocols_openrouter_responses_executes_a_hosted_shell_and_returns_its_real_output_and_billed_usage.yml","status":"passed","recorded_on":"2026-09-07","notes":"Fresh actual API recording; later replay with CI=true forbids network recording Hosted Python stdout is 391 and exit code 0; Completed Message content contains 391; Input/output token counts and actual total cost are positive"}]},"server_file_search":{"v1":"unknown","v2":"unknown","offered":null,"notes":"The Responses request schema includes this tool shape, but the supported server-tools catalog does not establish its working upstream integration or required resource setup. RubyLLM has an explicit Responses protocol; schema forwarding alone does not verify this particular hosted tool.","sources":["s273","s269","s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb"}]},"server_mcp":{"v1":"unknown","v2":"partial","offered":true,"notes":"OpenRouter Responses can invoke remote MCP; actual stream events expose call IDs and arguments, but upstream omits tool names, results and approval records. Requires explicit require_approval: never; omitted/default and approval modes reject before HTTP. Partial records preserve only actual wire data, and do not become local tools or fabricated approvals.","sources":["s273","s269","s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb","method":"merge_server_tool_entries"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb","method":"build_chunk"}],"verification":[{"model":"openai/gpt-5.2","spec":"spec/ruby_llm/protocols/openrouter/responses_spec.rb","example":"records remote MCP arguments without inventing omitted tool names or results","cassette":"spec/fixtures/vcr_cassettes/protocols_openrouter_responses_records_remote_mcp_arguments_without_inventing_omitted_tool_names_or_results.yml","status":"passed","recorded_on":"2026-09-07","notes":"Fresh actual streamed API recording; sanitized offline replay Microsoft Learn response.mcp_call_arguments.done contains actual call ID and Ruby query; Missing tool name and result remain nil; Completed text and input/output usage returned Observed provider limitation: \"require_approval=always raw probe returned HTTP 200 with empty output and no approval record; never streaming returns arguments but no tool name/result. These are actual upstream lifecycle losses.\""}]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"Both versions parse automatic cache read/write accounting. V1 has no shared caching controls; use wire parameters. V2 adds provider caching controls. Cache boundaries are a separate row.","sources":["s122"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"cache_read_tokens"},{"version":"v1","path":"lib/ruby_llm/providers/openrouter/chat.rb","method":"cache_read_tokens"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/chat.rb"}]},"cache_boundaries":{"v1":"passthrough","v2":"native","offered":true,"notes":"cache_until_here maps to a cache_control block; supported upstream models only.","sources":["s122"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/chat.rb","method":"inject_cache_control"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"compaction":{"v1":"passthrough","v2":"native","offered":true,"notes":"Context-compression drops/truncates middle messages; it does not produce a summary.","sources":["s123"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/chat.rb","method":"apply_compaction"}]},"token_counting":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"image_generation":{"v1":"native","v2":"native","offered":true,"notes":"V1 generated via chat; v2 uses the unified /images endpoint.","sources":["s126"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter/images.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/images.rb"}]},"image_editing":{"v1":"missing","v2":"native","offered":true,"notes":"with: reference images are serialized in v2; explicit masks are rejected.","sources":["s126"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter/images.rb","method":"build_input_references"}]},"video_generation":{"v1":"missing","v2":"native","offered":true,"notes":"Async jobs, polling and download; optional first and last frames.","sources":["s119"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter/videos.rb"}]},"speech":{"v1":"missing","v2":"native","offered":true,"notes":"Typed speech output through /audio/speech. Voice cloning requires provider_options input_references.","sources":["s127"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter/speech.rb"}]},"transcription":{"v1":"partial","v2":"native","offered":true,"notes":"Compatible endpoint inherited in v1 but not in the live matrix; v2 exercises OpenRouter in the shared transcription matrix.","sources":["s128"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"},{"version":"v2","path":"spec/support/models_to_test.rb"}]},"streaming_transcription":{"v1":"na","v2":"na","offered":false,"notes":"The dedicated transcription request/response contract documents a completed transcript, with no stream flag or transcript-delta events. Its streaming-offload upload option is input transport, not streamed recognition output. Generic inherited OpenAI event code is not evidence that OpenRouter offers it.","sources":["s128"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"diarization":{"v1":"missing","v2":"native","offered":true,"notes":"speaker_names: [] enables documented Azure/Deepgram backend diarization and verbose_json. Numbered segment/word speaker labels are preserved. Nonempty identity names and speaker_references reject because those hints are not exposed by this interface; actual backend/model support varies.","sources":["s128"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb","method":"render_transcription_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb","method":"render_transcription_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/transcription.rb"}],"verification":[{"model":"microsoft/mai-transcribe-2","spec":"spec/ruby_llm/protocols/openrouter/transcription_spec.rb","example":"transcribes a real recording with speaker labels and reported duration and cost","cassette":"spec/fixtures/vcr_cassettes/protocols_openrouter_transcription_transcribes_a_real_recording_with_speaker_labels_and_reported_duration_and_cost.yml","status":"passed","recorded_on":"2026-09-07","notes":"Fresh actual API recording; sanitized offline replay Ruby transcript; Numeric speaker 0 on segments and words; Positive duration and provider-reported cost"}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"PDF parsing is available as a chat plugin/input transform. The public inference inventory has no separate OCR/document-parsing operation returning an OCR result; document input support is counted separately.","sources":["s274","s275"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"embeddings":{"v1":"native","v2":"native","offered":true,"notes":"Inherited compatible text embedding endpoint.","sources":["s124"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/embeddings.rb"}]},"multimodal_embeddings":{"v1":"passthrough","v2":"native","offered":true,"notes":"2.0 accepts media through embed(..., with: ...), renders one content-array input, and returns a single vector with usage and cost. Supported media depend on the model; arrays of texts cannot be combined with attachments. Fresh Gemini Embedding 2 requests verified joint text/image input and PDF, audio and video files. Embeddings use their own input_file/input_video/input_audio parts with MIME data URLs. 1.16 required manually constructed wire input arrays.","sources":["s304","s305","s125"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/media.rb"},{"version":"v2","path":"spec/ruby_llm/providers/openrouter/embeddings_spec.rb"}]},"reranking":{"v1":"missing","v2":"native","offered":true,"notes":"Jina-compatible /rerank implementation.","sources":["s124"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/rerank.rb"}]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"Files protocol provides lifecycle methods; download availability is carried in the returned file metadata.","sources":["s117"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/files.rb"}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"Files protocol provides lifecycle methods; download availability is carried in the returned file metadata.","sources":["s117"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/files.rb"}]},"chat_batches":{"v1":"missing","v2":"partial","offered":true,"notes":"Implemented documented beta inline batch submission/find/results with one model and protocol, text-only preflight, original request ordering, scalar/array embedding shape, per-request failures and provider aggregate invoice. Cancellation is not exposed. Live submission returned HTTP 400 does not have a :batch endpoint for both normal and catalog-listed variant IDs; embedding rollout also blocked. No real batch lifecycle/results completed, so endpoint integration remains unverified.","sources":["s129","s379"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/batches.rb"},{"version":"v2","path":"lib/ruby_llm/batch.rb","method":"cost"},{"version":"v2","path":"lib/ruby_llm/active_record/batch.rb","method":"sync_from"}],"verification":[{"model":["anthropic/claude-haiku-4.5","openai/gpt-4.1-nano:batch","openai/text-embedding-3-small"],"spec":"spec/ruby_llm/protocols/openrouter/batches_spec.rb","status":"unavailable","checked_on":"2026-09-07","notes":"Fresh actual API probes saved as observed model/status/error tuples, not a passing VCR batch test No batch ID returned, no resources created; Catalog and RubyLLM registry confirmed the explicit :batch variant before its one submission; Stopped submissions after the catalog contradiction; no brute-force model guessing Observed provider limitation: [{\"model\": \"anthropic/claude-haiku-4.5\", \"endpoint\": \"/v1/chat/completions\", \"status\": 400, \"error\": \"Model 'anthropic/claude-haiku-4.5' does not have a :batch endpoint.\"}, {\"model\": \"openai/text-embedding-3-small\", \"endpoint\": \"/v1/embeddings\", \"status\": 400, \"error\": \"Model 'openai/text-embedding-3-small' does not have a :batch endpoint.\"}, {\"model\": \"openai/gpt-4.1-nano:batch\", \"endpoint\": \"/v1/chat/completions\", \"status\": 400, \"error\": \"Model 'openai/gpt-4.1-nano:batch' does not have a :batch endpoint.\"}]"},{"status":"unit","spec":"spec/ruby_llm/protocols/openrouter/batches_spec.rb","notes":"Documented request/result contract and protocol regression coverage; no completed live batch or patch execution claimed."}]},"embedding_batches":{"v1":"missing","v2":"partial","offered":true,"notes":"Implemented documented beta inline batch submission/find/results with one model and protocol, text-only preflight, original request ordering, scalar/array embedding shape, per-request failures and provider aggregate invoice. Cancellation is not exposed. Live submission returned HTTP 400 does not have a :batch endpoint for both normal and catalog-listed variant IDs; embedding rollout also blocked. No real batch lifecycle/results completed, so endpoint integration remains unverified.","sources":["s129","s379"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/batches.rb"},{"version":"v2","path":"lib/ruby_llm/batch.rb","method":"cost"},{"version":"v2","path":"lib/ruby_llm/active_record/batch.rb","method":"sync_from"}],"verification":[{"model":["anthropic/claude-haiku-4.5","openai/gpt-4.1-nano:batch","openai/text-embedding-3-small"],"spec":"spec/ruby_llm/protocols/openrouter/batches_spec.rb","status":"unavailable","checked_on":"2026-09-07","notes":"Fresh actual API probes saved as observed model/status/error tuples, not a passing VCR batch test No batch ID returned, no resources created; Catalog and RubyLLM registry confirmed the explicit :batch variant before its one submission; Stopped submissions after the catalog contradiction; no brute-force model guessing Observed provider limitation: [{\"model\": \"anthropic/claude-haiku-4.5\", \"endpoint\": \"/v1/chat/completions\", \"status\": 400, \"error\": \"Model 'anthropic/claude-haiku-4.5' does not have a :batch endpoint.\"}, {\"model\": \"openai/text-embedding-3-small\", \"endpoint\": \"/v1/embeddings\", \"status\": 400, \"error\": \"Model 'openai/text-embedding-3-small' does not have a :batch endpoint.\"}, {\"model\": \"openai/gpt-4.1-nano:batch\", \"endpoint\": \"/v1/chat/completions\", \"status\": 400, \"error\": \"Model 'openai/gpt-4.1-nano:batch' does not have a :batch endpoint.\"}]"},{"status":"unit","spec":"spec/ruby_llm/protocols/openrouter/batches_spec.rb","notes":"Documented request/result contract and protocol regression coverage; no completed live batch or patch execution claimed."}]},"advisor_tool":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"OpenRouter accepts its advisor tool type and request max_tool_calls / stop_server_tools_when budgets through raw tool definitions/request options. RubyLLM has no dedicated Advisor alias or server-loop budget API.","sources":["s269"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/tools/server_tools.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"}]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Agent / Responses API. It is not a generic capability claim about this provider.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"agent_skills":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"background_responses":{"v1":"unknown","v2":"unknown","offered":null,"notes":"The Responses schema accepts background, but the guide describes synchronous/SSE requests and the audited endpoint inventory does not document response retrieval or cancellation. RubyLLM implements Responses inference, but neither provider background-job availability nor a working RubyLLM polling lifecycle is established.","sources":["s273","s276"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb"}]},"browser_use":{"v1":"unknown","v2":"unknown","offered":null,"notes":"The Responses request schema includes this tool shape, but the supported server-tools catalog does not establish its working upstream integration or required resource setup. RubyLLM has an explicit Responses protocol; schema forwarding alone does not verify this particular hosted tool.","sources":["s273","s269","s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb"}]},"classification":{"v1":"missing","v2":"missing","offered":true,"notes":"OpenRouter Custom Classifiers are provider-side classification rules for request/generation analytics, with API configuration. RubyLLM does not create these classifiers. This is not a standalone arbitrary-text classify operation.","sources":["s277"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"computer_use":{"v1":"unknown","v2":"unknown","offered":null,"notes":"The Responses request schema includes this tool shape, but the supported server-tools catalog does not establish its working upstream integration or required resource setup. RubyLLM has an explicit Responses protocol; schema forwarding alone does not verify this particular hosted tool.","sources":["s273","s269","s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb"}]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"dedicated_transcription_api":{"v1":"partial","v2":"native","offered":true,"notes":"OpenRouter now documents its audio/transcriptions API. Version 1.16 inherits the generic OpenAI endpoint without verified provider-specific behavior; 2.0 integrates the operation through Chat Completions transcription with provider options.","sources":["s128"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"fast_inference":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"The request service_tier field supports priority and accepts fast as an alias. RubyLLM can send it via raw provider request options; there is no dedicated provider-neutral speed-mode API. Support and billing vary by model.","sources":["s273","s278"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"OpenRouter exposes workspace file listing and deletion, but RubyLLM only implements upload, metadata lookup and download. The OpenRouter Files subclass does not add listing or deletion to the shared file abstraction.","sources":["s279"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/files.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/files.rb"},{"version":"v2","path":"lib/ruby_llm/uploaded_file.rb"}]},"file_search_store_management":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"OpenRouter documents routing to public and private/BYOK models but no provider-managed fine-tuning/training job API. Training those models at an upstream provider is outside the OpenRouter API inventory.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Google Maps grounding. It is not a generic capability claim about this provider.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"guardrail_configuration":{"v1":"missing","v2":"missing","offered":true,"notes":"OpenRouter exposes guardrail configuration/management endpoints. RubyLLM does not create or manage workspace guardrails; request routing preferences do not replace this administrative API.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"hosted_conversations":{"v1":"na","v2":"na","offered":false,"notes":"The Responses guide explicitly says requests are stateless; store:true and non-null previous_response_id return 400. Client Agent SDK conversation helpers are not hosted conversation resources.","sources":["s276"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"OpenRouter Batch API is text-only: supported endpoint shapes are Chat Completions, Responses, Messages and embeddings. Image/audio/video/file content and non-text output are rejected; no other operation batches are documented.","sources":["s129"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Interactions API. It is not a generic capability claim about this provider.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"json_mode":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"OpenRouter response_format: {type: json_object} is available on supporting models through RubyLLM raw request options. with_schema provides the separate JSON-schema structured-output operation.","sources":["s280"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Bedrock Mantle protocols. It is not a generic capability claim about this provider.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"OpenRouter Batch API is text-only: supported endpoint shapes are Chat Completions, Responses, Messages and embeddings. Image/audio/video/file content and non-text output are rejected; no other operation batches are documented.","sources":["s129"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"omni_video_generation":{"v1":"missing","v2":"passthrough","offered":true,"notes":"The videos API accepts input_references with image, audio and video assets on compatible models such as Seedance 2+. RubyLLM animate natively maps only first/last images; extra multimodal references require provider_options.","sources":["s281"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter/videos.rb","method":"render_video_payload"}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"prefix_completion":{"v1":"unknown","v2":"unknown","offered":null,"notes":"The API supports assistant conversation messages, but the reviewed contract does not establish whether a final assistant prefix is continued for supported models or merely treated as completed history. This needs provider/model confirmation; no support claim is inferred from the serializer.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"prompt_cache_controls":{"v1":"passthrough","v2":"native","offered":true,"notes":"V1 uses with_params with provider cache vocabulary. V2 exposes with_caching; Mistral maps key, OpenRouter maps cache_control and ttl.","sources":["s122"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter/chat.rb"}]},"provider_server_fallback":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"OpenRouter supports server-side model fallback lists and provider routing preferences through request fields. RubyLLM can forward these fields, but its client model-fallback API is a different feature.","sources":["s282"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"realtime":{"v1":"na","v2":"na","offered":false,"notes":"The public API inventory documents HTTP/SSE inference and media endpoints, not a bidirectional Realtime or Responses WebSocket API. Agent SDK streaming and microphone examples are client implementations, not provider Realtime sessions.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"response_caching":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Separate whole-response cache uses request headers. It is not prompt caching.","sources":["s130"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/chat.rb","method":"with_headers"}]},"responses":{"v1":"missing","v2":"native","offered":true,"notes":"Explicit protocol: :responses registers OpenRouter Responses while ordinary chats remain Chat Completions. Hosted output, reasoning, citations, reported cost and usage are normalized by the Responses dialect. Individual operations retain OpenRouter-specific adapters even when Responses is configured.","sources":["s276","s273","s270"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"resolve_protocol"}],"verification":[{"model":"openai/gpt-5.2","spec":"spec/ruby_llm/protocols/openrouter/responses_spec.rb","example":"executes a hosted shell and returns its real output and billed usage","cassette":"spec/fixtures/vcr_cassettes/protocols_openrouter_responses_executes_a_hosted_shell_and_returns_its_real_output_and_billed_usage.yml","status":"passed","recorded_on":"2026-09-07","notes":"Fresh actual API recording; later replay with CI=true forbids network recording Hosted Python stdout is 391 and exit code 0; Completed Message content contains 391; Input/output token counts and actual total cost are positive"}]},"responses_batches":{"v1":"missing","v2":"partial","offered":true,"notes":"Implemented documented beta inline batch submission/find/results with one model and protocol, text-only preflight, original request ordering, scalar/array embedding shape, per-request failures and provider aggregate invoice. Cancellation is not exposed. Live submission returned HTTP 400 does not have a :batch endpoint for both normal and catalog-listed variant IDs; embedding rollout also blocked. No real batch lifecycle/results completed, so endpoint integration remains unverified.","sources":["s129","s379"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/batches.rb"},{"version":"v2","path":"lib/ruby_llm/batch.rb","method":"cost"},{"version":"v2","path":"lib/ruby_llm/active_record/batch.rb","method":"sync_from"}],"verification":[{"model":["anthropic/claude-haiku-4.5","openai/gpt-4.1-nano:batch","openai/text-embedding-3-small"],"spec":"spec/ruby_llm/protocols/openrouter/batches_spec.rb","status":"unavailable","checked_on":"2026-09-07","notes":"Fresh actual API probes saved as observed model/status/error tuples, not a passing VCR batch test No batch ID returned, no resources created; Catalog and RubyLLM registry confirmed the explicit :batch variant before its one submission; Stopped submissions after the catalog contradiction; no brute-force model guessing Observed provider limitation: [{\"model\": \"anthropic/claude-haiku-4.5\", \"endpoint\": \"/v1/chat/completions\", \"status\": 400, \"error\": \"Model 'anthropic/claude-haiku-4.5' does not have a :batch endpoint.\"}, {\"model\": \"openai/text-embedding-3-small\", \"endpoint\": \"/v1/embeddings\", \"status\": 400, \"error\": \"Model 'openai/text-embedding-3-small' does not have a :batch endpoint.\"}, {\"model\": \"openai/gpt-4.1-nano:batch\", \"endpoint\": \"/v1/chat/completions\", \"status\": 400, \"error\": \"Model 'openai/gpt-4.1-nano:batch' does not have a :batch endpoint.\"}]"},{"status":"unit","spec":"spec/ruby_llm/protocols/openrouter/batches_spec.rb","notes":"Documented request/result contract and protocol regression coverage; no completed live batch or patch execution claimed."}]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"server_apply_patch":{"v1":"missing","v2":"partial","offered":true,"notes":"The existing alias now has an explicit Responses route. Upstream Apply Patch proposes and validates diffs but never applies files: applications must send apply_patch_call_output afterward. Raw output items survive, but RubyLLM has no dedicated local patch execution/result lifecycle. Do not label this a fully implemented hosted editing tool.","sources":["s269","s270","s271","s272","s380"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb","method":"server_tool_aliases"}],"verification":[{"status":"unit","spec":"spec/ruby_llm/protocols/openrouter/responses_spec.rb","notes":"Documented request/result contract and protocol regression coverage; no completed live batch or patch execution claimed."}]},"server_tool_image_generation":{"v1":"passthrough","v2":"native","offered":true,"notes":"OpenRouter image_generation is a server tool supported on the chat endpoint. In 2.0 with_server_tools(:image_generation) selects its dedicated alias; 1.16 requires raw tools through request parameters. Results are represented through the returned message/citations rather than a separate paint result.","sources":["s269"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"server_tool_search":{"v1":"missing","v2":"missing","offered":true,"notes":"OpenRouter documents Tool Search on Responses/Messages. RubyLLM now implements Responses shell and apply-patch declarations, but has no Tool Search alias or dedicated deferred-tool discovery/result lifecycle.","sources":["s269","s270","s271","s272"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"shell_computer_tools":{"v1":"missing","v2":"native","offered":true,"notes":"with_server_tools(:code_execution) on protocol: :responses invokes the documented managed shell. RubyLLM preserves returned action/output/exit status in ServerToolCall and provider billing. This verifies hosted shell execution, not a separate interactive desktop/computer session.","sources":["s269","s270","s271","s272"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/openrouter/responses.rb","method":"server_tool_aliases"}],"verification":[{"model":"openai/gpt-5.2","spec":"spec/ruby_llm/protocols/openrouter/responses_spec.rb","example":"executes a hosted shell and returns its real output and billed usage","cassette":"spec/fixtures/vcr_cassettes/protocols_openrouter_responses_executes_a_hosted_shell_and_returns_its_real_output_and_billed_usage.yml","status":"passed","recorded_on":"2026-09-07","notes":"Fresh actual API recording; later replay with CI=true forbids network recording Hosted Python stdout is 391 and exit code 0; Completed Message content contains 391; Input/output token counts and actual total cost are positive"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"streaming_speech":{"v1":"missing","v2":"native","offered":true,"notes":"Block on speak yields typed SpeechChunk bytes incrementally and returns the complete Speech; binary HTTP transport validates status/content type, preserves binary encoding and refuses retries after audio delivery.","sources":["s127"],"code":[{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"speak"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/speech.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"hexgrad/kokoro-82m","spec":"spec/ruby_llm/speech_streaming_spec.rb","example":"RubyLLM::Speech streams speech from openrouter","cassette":"spec/fixtures/vcr_cassettes/speech_streams_speech_from_openrouter.yml","notes":"Fresh API recording plus independent HTTP probe: 44 chunks, 63816 bytes, first audio after 1.09s; joined bytes match the complete Speech."}]},"task_budgets":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"OpenRouter accepts its advisor tool type and request max_tool_calls / stop_server_tools_when budgets through raw tool definitions/request options. RubyLLM has no dedicated Advisor alias or server-loop budget API.","sources":["s269"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openrouter.rb"},{"version":"v2","path":"lib/ruby_llm/tools/server_tools.rb"},{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb"}]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"vector_store_management":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"OpenRouter Batch API is text-only: supported endpoint shapes are Chat Completions, Responses, Messages and embeddings. Image/audio/video/file content and non-text output are rejected; no other operation batches are documented.","sources":["s129"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"video_editing":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Compatible video models accept reference videos through input_references for video-conditioned generation. RubyLLM exposes this through raw provider_options, not a dedicated editing operation; exact transformations remain model-specific.","sources":["s281"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter/videos.rb","method":"render_video_payload"}]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"voice_cloning":{"v1":"missing","v2":"passthrough","offered":true,"notes":"Raw input_references can be sent through speech provider_options; no shared voice-reference argument.","sources":["s127"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter/speech.rb"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full OpenRouter inference, server-tool, media, Files and Batch API inventory. No dedicated operation for this feature is documented there. Client-side Agent SDK integrations and operations available only by calling an upstream provider directly are outside this provider API cell.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"The public API inventory documents HTTP/SSE inference and media endpoints, not a bidirectional Realtime or Responses WebSocket API. Agent SDK streaming and microphone examples are client implementations, not provider Realtime sessions.","sources":["s274"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/openrouter.rb","method":"protocol"}]}},"gaps":[{"notes":"File search tool, Browser use, Computer use: The Responses request schema includes this tool shape, but the supported server-tools catalog does not establish its working upstream integration or required resource setup. RubyLLM has an explicit Responses protocol; schema forwarding alone does not verify this particular hosted tool.","sources":["s273","s269","s274"]},{"notes":"Remote MCP tools: OpenRouter Responses can invoke remote MCP; actual stream events expose call IDs and arguments, but upstream omits tool names, results and approval records. Requires explicit require_approval: never; omitted/default and approval modes reject before HTTP. Partial records preserve only actual wire data, and do not become local tools or fabricated approvals.","sources":["s273","s269","s274"]},{"notes":"Chat batches, Embedding batches, Responses batches: Implemented documented beta inline batch submission/find/results with one model and protocol, text-only preflight, original request ordering, scalar/array embedding shape, per-request failures and provider aggregate invoice. Cancellation is not exposed. Live submission returned HTTP 400 does not have a :batch endpoint for both normal and catalog-listed variant IDs; embedding rollout also blocked. No real batch lifecycle/results completed, so endpoint integration remains unverified.","sources":["s129","s379"]},{"notes":"Advisor tool, Task budgets: OpenRouter accepts its advisor tool type and request max_tool_calls / stop_server_tools_when budgets through raw tool definitions/request options. RubyLLM has no dedicated Advisor alias or server-loop budget API.","sources":["s269"]},{"notes":"Background Responses jobs: The Responses schema accepts background, but the guide describes synchronous/SSE requests and the audited endpoint inventory does not document response retrieval or cancellation. RubyLLM implements Responses inference, but neither provider background-job availability nor a working RubyLLM polling lifecycle is established.","sources":["s273","s276"]},{"notes":"Classification: OpenRouter Custom Classifiers are provider-side classification rules for request/generation analytics, with API configuration. RubyLLM does not create these classifiers. This is not a standalone arbitrary-text classify operation.","sources":["s277"]},{"notes":"Fast inference: The request service_tier field supports priority and accepts fast as an alias. RubyLLM can send it via raw provider request options; there is no dedicated provider-neutral speed-mode API. Support and billing vary by model.","sources":["s273","s278"]},{"notes":"File listing and deletion: OpenRouter exposes workspace file listing and deletion, but RubyLLM only implements upload, metadata lookup and download. The OpenRouter Files subclass does not add listing or deletion to the shared file abstraction.","sources":["s279"]},{"notes":"Guardrail configuration: OpenRouter exposes guardrail configuration/management endpoints. RubyLLM does not create or manage workspace guardrails; request routing preferences do not replace this administrative API.","sources":["s274"]},{"notes":"JSON object mode: OpenRouter response_format: {type: json_object} is available on supporting models through RubyLLM raw request options. with_schema provides the separate JSON-schema structured-output operation.","sources":["s280"]},{"notes":"Omni video generation: The videos API accepts input_references with image, audio and video assets on compatible models such as Seedance 2+. RubyLLM animate natively maps only first/last images; extra multimodal references require provider_options.","sources":["s281"]},{"notes":"Prefix completion: The API supports assistant conversation messages, but the reviewed contract does not establish whether a final assistant prefix is continued for supported models or merely treated as completed history. This needs provider/model confirmation; no support claim is inferred from the serializer.","sources":["s274"]},{"notes":"Provider-managed fallback: OpenRouter supports server-side model fallback lists and provider routing preferences through request fields. RubyLLM can forward these fields, but its client model-fallback API is a different feature.","sources":["s282"]},{"notes":"Response caching: Separate whole-response cache uses request headers. It is not prompt caching.","sources":["s130"]},{"notes":"Apply patch tool: The existing alias now has an explicit Responses route. Upstream Apply Patch proposes and validates diffs but never applies files: applications must send apply_patch_call_output afterward. Raw output items survive, but RubyLLM has no dedicated local patch execution/result lifecycle. Do not label this a fully implemented hosted editing tool.","sources":["s269","s270","s271","s272","s380"]},{"notes":"Tool search: OpenRouter documents Tool Search on Responses/Messages. RubyLLM now implements Responses shell and apply-patch declarations, but has no Tool Search alias or dedicated deferred-tool discovery/result lifecycle.","sources":["s269","s270","s271","s272"]},{"notes":"Video editing: Compatible video models accept reference videos through input_references for video-conditioned generation. RubyLLM exposes this through raw provider_options, not a dedicated editing operation; exact transformations remain model-specific.","sources":["s281"]},{"notes":"Voice cloning: Raw input_references can be sent through speech provider_options; no shared voice-reference argument.","sources":["s127"]}]},{"id":"perplexity","name":"Perplexity","notes":"The audit includes Sonar, embeddings, standalone search, files and Router. RubyLLM defaults to Sonar; protocol: :router_chat_completions selects the stateless Router adapter. Router request/result contracts have unit coverage, but the configured account returned HTTP 403 limited-preview denial. Perplexity Agent is outside this release because it requires provider-managed conversation state. Perplexity documents Sonar retirement on September 27, 2026.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"Sonar support varies by model; no claim about third-party Agent API models.","sources":["s112"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/perplexity/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"Sonar support varies by model; no claim about third-party Agent API models.","sources":["s112"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/perplexity/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"Legacy Sonar supports JSON Schema through with_schema, independent of the Router private preview. The current live Sonar example returns a parsed Ruby hash and token usage. The 1.16 OpenAI renderer already emitted the same response_format.json_schema shape inherited by Perplexity. Router tool/model support remains unverified.","sources":["s112"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"render_payload"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"render_payload"},{"version":"v2","path":"spec/ruby_llm/providers/perplexity/chat_spec.rb"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"Sonar support varies by model; no claim about third-party Agent API models.","sources":["s112"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/perplexity/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"}]},"pdf_input":{"v1":"native","v2":"native","offered":true,"notes":"Sonar support varies by model; no claim about third-party Agent API models.","sources":["s112"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/perplexity/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"}]},"audio_input":{"v1":"missing","v2":"partial","offered":true,"notes":"The explicitly selected Router protocol serializes documented input_audio content with WAV or MP3 data, while default Sonar still rejects audio. The request contract and public Chat encoding are unit-tested, but the published Router catalog identifies no verified callable audio-capable model and the configured account has no preview access. Audio inference remains unverified; no model capability was invented.","sources":["s261","s314","s258","s259","s412"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/perplexity/router.rb"},{"version":"v2","path":"spec/ruby_llm/protocols/perplexity/router_spec.rb"}],"verification":[{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"serializes documented WAV audio input while keeping Sonar audio unsupported","notes":"Validates WAV encoding through Chat only; no audio inference claim."}]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"Sonar media documentation supports image/file input and can return found videos. Returned search videos do not mean video input or video generation. Router request inventories likewise do not document a video input content type.","sources":["s259","s258","s260"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"Sonar support varies by model; no claim about third-party Agent API models.","sources":["s112"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity/chat.rb"},{"version":"v1","path":"lib/ruby_llm/providers/perplexity/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"reasoning_effort applies to Sonar Deep Research; it is not a universal toggle for all Sonar models.","sources":["s114"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"resolve_effort"}]},"citations":{"v1":"passthrough","v2":"native","offered":true,"notes":"V1 exposes raw citations only. V2 parses root citations/search_results into Citation objects.","sources":["s112"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb","method":"parse_root_citations"}]},"tools":{"v1":"partial","v2":"native","offered":true,"notes":"The explicitly selected router_chat_completions protocol renders Ruby function tools and handles multiple tool calls through the existing Chat tool loop. Actual local results and reasoning context are replayed from application-owned history. Request/result contracts have unit coverage. The configured account returned HTTP 403 limited-preview denial; no successful Router inference is claimed.","sources":["s261","s258","s263","s375","s267","s412","s314"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/perplexity/router.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"}],"verification":[{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"renders required and named tool choices, parallel controls, schema and cache boundaries through Chat","notes":"Public Chat request rendering, local tool execution and actual result replay, SSE deltas, cache counters and unsupported-option guards pass regression coverage."},{"status":"unavailable","recorded_on":"2026-09-07","model":"perplexity/kimi-k3","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"requests a named tool with a cache boundary from the configured Router account","cassette":"spec/fixtures/vcr_cassettes/protocols_perplexity_router_requests_a_named_tool_with_a_cache_boundary_from_the_configured_router_account.yml","notes":"Fresh request returned HTTP 403 with the documented limited-preview access error. The permanent live case skips only this exact error. No successful inference or positive cache hit was verified."}]},"tool_choice":{"v1":"partial","v2":"native","offered":true,"notes":"The explicitly selected router_chat_completions protocol renders automatic, required, disabled and named function selection through with_tool_options. Functions require descriptions; schemas use strict mode. Sonar remains the default. The dedicated contract is unit-tested; fresh live execution is unavailable because this account received HTTP 403 limited-preview denial.","sources":["s261","s258","s412","s314"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/perplexity/router.rb"},{"version":"v2","path":"spec/ruby_llm/protocols/perplexity/router_spec.rb"}],"verification":[{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"renders required and named tool choices, parallel controls, schema and cache boundaries through Chat","notes":"Public Chat request rendering, local tool execution and actual result replay, SSE deltas, cache counters and unsupported-option guards pass regression coverage."},{"status":"unavailable","recorded_on":"2026-09-07","model":"perplexity/kimi-k3","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"requests a named tool with a cache boundary from the configured Router account","cassette":"spec/fixtures/vcr_cassettes/protocols_perplexity_router_requests_a_named_tool_with_a_cache_boundary_from_the_configured_router_account.yml","notes":"Fresh request returned HTTP 403 with the documented limited-preview access error. The permanent live case skips only this exact error. No successful inference or positive cache hit was verified."}]},"parallel_tools":{"v1":"partial","v2":"native","offered":true,"notes":"The explicitly selected router_chat_completions protocol renders Ruby function tools and handles multiple tool calls through the existing Chat tool loop. Actual local results and reasoning context are replayed from application-owned history. Request/result contracts have unit coverage. The configured account returned HTTP 403 limited-preview denial; no successful Router inference is claimed.","sources":["s261","s258","s263","s375","s412","s314"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/perplexity/router.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"}],"verification":[{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"renders required and named tool choices, parallel controls, schema and cache boundaries through Chat","notes":"Public Chat request rendering, local tool execution and actual result replay, SSE deltas, cache counters and unsupported-option guards pass regression coverage."},{"status":"unavailable","recorded_on":"2026-09-07","model":"perplexity/kimi-k3","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"requests a named tool with a cache boundary from the configured Router account","cassette":"spec/fixtures/vcr_cassettes/protocols_perplexity_router_requests_a_named_tool_with_a_cache_boundary_from_the_configured_router_account.yml","notes":"Fresh request returned HTTP 403 with the documented limited-preview access error. The permanent live case skips only this exact error. No successful inference or positive cache hit was verified."}]},"parallel_tool_control":{"v1":"partial","v2":"native","offered":true,"notes":"The explicitly selected router_chat_completions protocol maps with_tool_options(calls: :one/:many) to parallel_tool_calls. Returned local calls execute and replay through the existing Chat tool loop. The default Sonar protocol does not gain unsupported selection flags. The dedicated contract is unit-tested; fresh live execution is unavailable because this account received HTTP 403 limited-preview denial.","sources":["s261","s258","s412","s314"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/perplexity/router.rb"},{"version":"v2","path":"spec/ruby_llm/protocols/perplexity/router_spec.rb"}],"verification":[{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"renders required and named tool choices, parallel controls, schema and cache boundaries through Chat","notes":"Public Chat request rendering, local tool execution and actual result replay, SSE deltas, cache counters and unsupported-option guards pass regression coverage."},{"status":"unavailable","recorded_on":"2026-09-07","model":"perplexity/kimi-k3","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"requests a named tool with a cache boundary from the configured Router account","cassette":"spec/fixtures/vcr_cassettes/protocols_perplexity_router_requests_a_named_tool_with_a_cache_boundary_from_the_configured_router_account.yml","notes":"Fresh request returned HTTP 403 with the documented limited-preview access error. The permanent live case skips only this exact error. No successful inference or positive cache hit was verified."}]},"server_web_search":{"v1":"native","v2":"native","offered":true,"notes":"Sonar performs web search by default. Search filtering/options use provider-specific request options; no with_server_tools alias.","sources":["s112"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"}]},"server_web_fetch":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Perplexity Agent provides web fetch tool through its provider-managed response lifecycle. That API retains remote conversation state even with store:false. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s262","s263","s376"],"code":[]},"server_code_execution":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Perplexity Agent provides code execution tool through its provider-managed response lifecycle. That API retains remote conversation state even with store:false. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s262","s263","s377"],"code":[]},"server_file_search":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"server_mcp":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Perplexity Agent provides remote mcp tools through its provider-managed response lifecycle. That API retains remote conversation state even with store:false. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s262","s263","s378","s267"],"code":[]},"prompt_caching":{"v1":"missing","v2":"native","offered":true,"notes":"The explicitly selected router_chat_completions protocol maps with_caching and cache_until_here to Router cache options and normalizes reported cache-read/write tokens. Request and result contracts have unit coverage. The configured account returned HTTP 403 limited-preview denial; successful inference and positive cache hits are not live-verified.","sources":["s261","s314","s258","s266","s263","s412"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/perplexity/router.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/tools.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"}],"verification":[{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"renders required and named tool choices, parallel controls, schema and cache boundaries through Chat","notes":"Public Chat request rendering, local tool execution and actual result replay, SSE deltas, cache counters and unsupported-option guards pass regression coverage."},{"status":"unavailable","recorded_on":"2026-09-07","model":"perplexity/kimi-k3","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"requests a named tool with a cache boundary from the configured Router account","cassette":"spec/fixtures/vcr_cassettes/protocols_perplexity_router_requests_a_named_tool_with_a_cache_boundary_from_the_configured_router_account.yml","notes":"Fresh request returned HTTP 403 with the documented limited-preview access error. The permanent live case skips only this exact error. No successful inference or positive cache hit was verified."}]},"cache_boundaries":{"v1":"missing","v2":"native","offered":true,"notes":"The explicitly selected router_chat_completions protocol maps with_caching and cache_until_here to explicit cache mode and a prompt_cache_breakpoint on the marked content block. Returned cache-read and cache-write tokens are normalized. The guide uses the provider default lifetime because the current reference and schema disagree on accepted TTL values. The dedicated contract is unit-tested; fresh live execution is unavailable because this account received HTTP 403 limited-preview denial.","sources":["s261","s314","s258","s266","s263","s412"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity/media.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/perplexity/router.rb"},{"version":"v2","path":"spec/ruby_llm/protocols/perplexity/router_spec.rb"}],"verification":[{"status":"unit","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"renders required and named tool choices, parallel controls, schema and cache boundaries through Chat","notes":"Public Chat request rendering, local tool execution and actual result replay, SSE deltas, cache counters and unsupported-option guards pass regression coverage."},{"status":"unavailable","recorded_on":"2026-09-07","model":"perplexity/kimi-k3","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"requests a named tool with a cache boundary from the configured Router account","cassette":"spec/fixtures/vcr_cassettes/protocols_perplexity_router_requests_a_named_tool_with_a_cache_boundary_from_the_configured_router_account.yml","notes":"Fresh request returned HTTP 403 with the documented limited-preview access error. The permanent live case skips only this exact error. No successful inference or positive cache hit was verified."}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"compaction":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"token_counting":{"v1":"unknown","v2":"unknown","offered":null,"notes":"A fresh review of the Router Messages OpenAPI finds CountMessageTokensRequest/Response components describing POST /router/v1/messages/count_tokens, but the published paths contain only /router/v1/messages and the Router overview omits token counting. The Chat Completions dialect does not establish this separate endpoint. Availability remains unresolved, and RubyLLM does not invent a token-count route.","sources":["s266","s261","s413"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"}],"verification":[]},"image_generation":{"v1":"na","v2":"na","offered":false,"notes":"Sonar can return images/videos from search results. That is retrieval, not generation/editing; the complete Agent/Router/media API inventories do not document a dedicated generated-image/video operation.","sources":["s259","s265","s258"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"image_editing":{"v1":"na","v2":"na","offered":false,"notes":"Sonar can return images/videos from search results. That is retrieval, not generation/editing; the complete Agent/Router/media API inventories do not document a dedicated generated-image/video operation.","sources":["s259","s265","s258"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"video_generation":{"v1":"na","v2":"na","offered":false,"notes":"Sonar can return images/videos from search results. That is retrieval, not generation/editing; the complete Agent/Router/media API inventories do not document a dedicated generated-image/video operation.","sources":["s259","s265","s258"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"speech":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"transcription":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"streaming_transcription":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"diarization":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"embeddings":{"v1":"missing","v2":"native","offered":true,"notes":"V2 supplies the correct /v1/embeddings route and int8 base64 decoding; the inherited v1 endpoint was /embeddings.","sources":["s115"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity/embeddings.rb"}]},"multimodal_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"file_upload":{"v1":"na","v2":"na","offered":false,"notes":"Agent exposes list/download of generated sandbox files, and Sonar supports inline/URL file input. The public API inventory has no general managed input-file upload/deletion resource. Listing generated response files alone is not the matrix listing-and-deletion operation.","sources":["s265","s259"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM.find_file and RubyLLM.download accept the full response_id/files/file_id identifier of an existing Perplexity-generated file. The separate Files adapter retrieves metadata and validated authenticated content without requiring an integrated Agent conversation. Direct download and path validation have unit coverage; no current end-to-end Agent generation claim is made.","sources":["s265","s264","s263","s377"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/perplexity/files.rb"},{"version":"v2","path":"lib/ruby_llm/uploaded_file.rb"}],"verification":[{"status":"unit","spec":"spec/ruby_llm/protocols/perplexity/files_spec.rb","example":"finds and downloads only the bound generated file through the provider connection","notes":"Direct metadata lookup and byte download preserve the response-scoped identifier; arbitrary URLs and path traversal are rejected."}]},"chat_batches":{"v1":"na","v2":"na","offered":false,"notes":"The public inventories expose individual async Sonar/Agent jobs and synchronous embedding calls with multiple inputs; no service-managed multi-request Batch API is documented. Multiple inputs to embed are not asynchronous embedding batches.","sources":["s265","s258","s260"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"embedding_batches":{"v1":"na","v2":"na","offered":false,"notes":"The public inventories expose individual async Sonar/Agent jobs and synchronous embedding calls with multiple inputs; no service-managed multi-request Batch API is documented. Multiple inputs to embed are not asynchronous embedding batches.","sources":["s265","s258","s260"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"agent_responses":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Perplexity Agent provides perplexity agent api through its provider-managed response lifecycle. That API retains remote conversation state even with store:false. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s113","s263","s375","s378","s267"],"code":[]},"agent_skills":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Perplexity Agent provides agent skills through its provider-managed response lifecycle. That API retains remote conversation state even with store:false. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s263","s264"],"code":[]},"async_research":{"v1":"missing","v2":"missing","offered":true,"notes":"Asynchronous Sonar Deep Research job submission/polling is absent.","sources":["s114"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"}]},"background_responses":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Perplexity Agent provides background responses jobs through its provider-managed response lifecycle. That API retains remote conversation state even with store:false. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s267","s263","s264"],"code":[]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"computer_use":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"Router Messages accepts context_management for compatibility but its contract explicitly says it is ignored and context edits are not applied.","sources":["s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"contextual_embeddings":{"v1":"missing","v2":"missing","offered":true,"notes":"Contextualized embedding requests and nested result groups have no dedicated renderer/parser.","sources":["s115"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity/embeddings.rb"}]},"dedicated_transcription_api":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"fast_inference":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"file_management":{"v1":"na","v2":"na","offered":false,"notes":"Agent exposes list/download of generated sandbox files, and Sonar supports inline/URL file input. The public API inventory has no general managed input-file upload/deletion resource. Listing generated response files alone is not the matrix listing-and-deletion operation.","sources":["s265","s259"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"file_search_store_management":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Google Maps grounding. It is not a generic capability claim about this provider.","sources":["s264"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"hosted_conversations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Perplexity documents provider-managed conversation storage or hosted conversation resources. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s267","s263","s264"],"code":[]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Interactions API. It is not a generic capability claim about this provider.","sources":["s264"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"json_mode":{"v1":"partial","v2":"passthrough","offered":true,"notes":"On the explicitly selected router_chat_completions protocol, with_provider_options(response_format: { type: \"json_object\" }) forwards the documented JSON object option. The registered Router path handles endpoint selection; a custom base URL is unnecessary. The configured account has no Router preview access, so JSON object output is not live-verified. with_schema provides structured JSON Schema output separately.","sources":["s258","s261"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/perplexity/router.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb"}],"verification":[{"status":"unavailable","recorded_on":"2026-09-07","model":"perplexity/kimi-k3","spec":"spec/ruby_llm/protocols/perplexity/router_spec.rb","example":"requests a named tool with a cache boundary from the configured Router account","cassette":"spec/fixtures/vcr_cassettes/protocols_perplexity_router_requests_a_named_tool_with_a_cache_boundary_from_the_configured_router_account.yml","notes":"Fresh request returned HTTP 403 with the documented limited-preview access error. The permanent live case skips only this exact error. No successful inference or positive cache hit was verified."}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Bedrock Mantle protocols. It is not a generic capability claim about this provider.","sources":["s264"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"The public inventories expose individual async Sonar/Agent jobs and synchronous embedding calls with multiple inputs; no service-managed multi-request Batch API is documented. Multiple inputs to embed are not asynchronous embedding batches.","sources":["s265","s258","s260"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"prefix_completion":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"prompt_cache_controls":{"v1":"missing","v2":"missing","offered":true,"notes":"Router documents prompt-cache keys/options and block-level breakpoints (Chat Completions) or cache_control (Messages); Agent usage also includes cache read/write accounting. RubyLLM defaults to legacy Sonar, without dedicated Router selection or these caching translations. Custom api_base/provider_options requests are unverified integration paths.","sources":["s258","s266","s263"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"provider_server_fallback":{"v1":"missing","v2":"missing","offered":true,"notes":"Perplexity Router documents automatic routing and provider-managed fallback. RubyLLM exposes no dedicated server-fallback configuration or validated fallback-result accounting. Router execution remains access-limited; application-side with_fallbacks is a separate feature.","sources":["s268","s263"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"realtime":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"responses":{"v1":"missing","v2":"missing","offered":true,"notes":"The separate Router /router/v1/responses endpoint has no registered RubyLLM protocol. The retained Router integration uses /router/v1/chat/completions. Perplexity Agent is outside the release scope because it requires provider-managed conversation state.","sources":["s260","s261"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"The public inventories expose individual async Sonar/Agent jobs and synchronous embedding calls with multiple inputs; no service-managed multi-request Batch API is documented. Multiple inputs to embed are not asynchronous embedding batches.","sources":["s265","s258","s260"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"search_api":{"v1":"missing","v2":"missing","offered":true,"notes":"Standalone ranked Search API is distinct from Sonar search-in-answer.","sources":["s116"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb"}]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"shell_computer_tools":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"streaming_speech":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"task_budgets":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Perplexity Agent provides task budgets through its provider-managed response lifecycle. That API retains remote conversation state even with store:false. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s263","s264"],"code":[]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"vector_store_management":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"video_editing":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"voice_cloning":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed Sonar, Agent, Search, Embeddings and Router API inventories and their request contracts. No dedicated public operation for this feature is documented there. Consumer Perplexity Computer and arbitrary code running in a sandbox are not treated as separate inference endpoints.","sources":["s264","s265","s258","s260","s266"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/perplexity.rb","method":"protocol"}]}},"gaps":[{"notes":"Audio input: The explicitly selected Router protocol serializes documented input_audio content with WAV or MP3 data, while default Sonar still rejects audio. The request contract and public Chat encoding are unit-tested, but the published Router catalog identifies no verified callable audio-capable model and the configured account has no preview access. Audio inference remains unverified; no model capability was invented.","sources":["s261","s314","s258","s259","s412"]},{"notes":"Token counting: A fresh review of the Router Messages OpenAPI finds CountMessageTokensRequest/Response components describing POST /router/v1/messages/count_tokens, but the published paths contain only /router/v1/messages and the Router overview omits token counting. The Chat Completions dialect does not establish this separate endpoint. Availability remains unresolved, and RubyLLM does not invent a token-count route.","sources":["s266","s261","s413"]},{"notes":"Asynchronous research: Asynchronous Sonar Deep Research job submission/polling is absent.","sources":["s114"]},{"notes":"Contextual embeddings: Contextualized embedding requests and nested result groups have no dedicated renderer/parser.","sources":["s115"]},{"notes":"JSON object mode: On the explicitly selected router_chat_completions protocol, with_provider_options(response_format: { type: \"json_object\" }) forwards the documented JSON object option. The registered Router path handles endpoint selection; a custom base URL is unnecessary. The configured account has no Router preview access, so JSON object output is not live-verified. with_schema provides structured JSON Schema output separately.","sources":["s258","s261"]},{"notes":"Prompt cache options: Router documents prompt-cache keys/options and block-level breakpoints (Chat Completions) or cache_control (Messages); Agent usage also includes cache read/write accounting. RubyLLM defaults to legacy Sonar, without dedicated Router selection or these caching translations. Custom api_base/provider_options requests are unverified integration paths.","sources":["s258","s266","s263"]},{"notes":"Provider-managed fallback: Perplexity Router documents automatic routing and provider-managed fallback. RubyLLM exposes no dedicated server-fallback configuration or validated fallback-result accounting. Router execution remains access-limited; application-side with_fallbacks is a separate feature.","sources":["s268","s263"]},{"notes":"Responses API: The separate Router /router/v1/responses endpoint has no registered RubyLLM protocol. The retained Router integration uses /router/v1/chat/completions. Perplexity Agent is outside the release scope because it requires provider-managed conversation state.","sources":["s260","s261"]},{"notes":"Standalone search API: Standalone ranked Search API is distinct from Sonar search-in-answer.","sources":["s116"]}]},{"id":"deepgram","name":"Deepgram","notes":"The audit includes speech generation, transcription and Text Intelligence. RubyLLM integrates speech and prerecorded-file transcription, including streaming output. Voice Agent conversations are outside this release; their documented offerings remain listed separately. Account, project and billing administration are outside scope.","features":{"chat":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Deepgram Voice Agent provides chat through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s231","s232","s233","s372"],"code":[]},"streaming":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Deepgram Voice Agent provides chat streaming through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s232","s233","s372"],"code":[]},"structured_output":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"vision":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"pdf_input":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"audio_input":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Deepgram Voice Agent provides audio input through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s231","s232","s233","s372"],"code":[]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"thinking":{"v1":"na","v2":"na","offered":false,"notes":"Voice Agent exposes AgentThinking as a lifecycle event. The documented event has no reasoning-text or reasoning-summary payload, so this is not the matrix feature Thinking results.","sources":["s232","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"thinking_controls":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Deepgram Voice Agent provides thinking controls through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s231","s372","s373"],"code":[]},"citations":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"tools":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Deepgram Voice Agent provides function tools through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s231","s232","s233","s372"],"code":[]},"tool_choice":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"parallel_tools":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Deepgram Voice Agent provides multiple tool calls through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s231","s232","s233","s372"],"code":[]},"parallel_tool_control":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"server_web_search":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"server_web_fetch":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"server_code_execution":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"server_file_search":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"server_mcp":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"prompt_caching":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"cache_boundaries":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"compaction":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"token_counting":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"image_generation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"image_editing":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"video_generation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"speech":{"v1":"missing","v2":"native","offered":true,"notes":"Aura /v1/speak returns a complete Speech object.","sources":["s101"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/deepgram/speech.rb"}]},"transcription":{"v1":"missing","v2":"native","offered":true,"notes":"Local bytes or remote URL; speaker_names uses diarize_model=latest and normalizes words and utterances.","sources":["s100","s102"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/deepgram/transcription.rb"}]},"streaming_transcription":{"v1":"missing","v2":"native","offered":true,"notes":"Block on transcribe streams Nova transcription over the authenticated /v1/listen WebSocket, yielding revisable partials, committed timed segments and a completed typed Transcription with word timestamps. Input is an existing audio file; caller-fed microphone input, Flux /v2/listen and Voice Agent sessions are separate paths.","sources":["s103","s104"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/deepgram/transcription.rb","method":"transcribe"},{"version":"v2","path":"lib/ruby_llm/protocols/deepgram.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/deepgram/streaming_transcription.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"nova-3-general","spec":"spec/ruby_llm/transcription_websocket_spec.rb","example":"RubyLLM::Transcription streams transcription through deepgram WebSockets","cassette":"spec/fixtures/websocket_cassettes/transcription_deepgram.json","notes":"Fresh prerecorded-file WebSocket exchange with partial and committed text, typed final transcription and word timing."},{"status":"unit","spec":"spec/ruby_llm/protocols/deepgram/streaming_transcription_spec.rb","notes":"Streaming event normalization, commit boundaries and completion/error behavior have regression coverage."}]},"diarization":{"v1":"missing","v2":"native","offered":true,"notes":"Local bytes or remote URL; speaker_names uses diarize_model=latest and normalizes words and utterances.","sources":["s100","s102"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/deepgram/transcription.rb"}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"The speech APIs have profanity filtering and redaction; the public inventory has no dedicated content-moderation classification endpoint. Filtering transcription output is not counted as RubyLLM.moderate coverage.","sources":["s235","s236"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"multimodal_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"file_upload":{"v1":"na","v2":"na","offered":false,"notes":"Listen accepts audio bytes or URLs and Speak returns generated audio, but the public REST inventory has no managed file-resource upload/download/list/delete API. Audio input/output are counted in their own rows.","sources":["s235"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"file_download":{"v1":"na","v2":"na","offered":false,"notes":"Listen accepts audio bytes or URLs and Speak returns generated audio, but the public REST inventory has no managed file-resource upload/download/list/delete API. Audio input/output are counted in their own rows.","sources":["s235"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"chat_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"embedding_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Agent / Responses API. It is not a generic capability claim about this provider.","sources":["s234"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"agent_skills":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"classification":{"v1":"missing","v2":"missing","offered":true,"notes":"Text Intelligence /v1/read exposes intent, topic and sentiment analysis. RubyLLM does not implement the Read API; this is separate from transcription keyword formatting.","sources":["s235","s234"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"computer_use":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"dedicated_transcription_api":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM 2.0 implements the dedicated /v1/listen prerecorded transcription endpoint; Deepgram was not a built-in provider in 1.16.","sources":["s235"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/deepgram/transcription.rb","method":"transcription_url"}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"fast_inference":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"file_management":{"v1":"na","v2":"na","offered":false,"notes":"Listen accepts audio bytes or URLs and Speak returns generated audio, but the public REST inventory has no managed file-resource upload/download/list/delete API. Audio input/output are counted in their own rows.","sources":["s235"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"file_search_store_management":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Google Maps grounding. It is not a generic capability claim about this provider.","sources":["s234"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"hosted_conversations":{"v1":"na","v2":"na","offered":false,"notes":"Voice Agent keeps context during the live connection. Reconnection requires the caller to replay agent.context history; the REST inventory exposes saved agent configuration, not stored conversation resources that can be retrieved and continued.","sources":["s237","s235"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Interactions API. It is not a generic capability claim about this provider.","sources":["s234"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"json_mode":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Bedrock Mantle protocols. It is not a generic capability claim about this provider.","sources":["s234"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"prefix_completion":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"prompt_cache_controls":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"realtime":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"Deepgram documents realtime conversations. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s103","s104","s372"],"code":[]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"responses":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"shell_computer_tools":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"streaming_speech":{"v1":"missing","v2":"native","offered":true,"notes":"Block on speak yields typed SpeechChunk bytes incrementally and returns the complete Speech; binary HTTP transport validates status/content type, preserves binary encoding and refuses retries after audio delivery.","sources":["s101","s340"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/deepgram/speech.rb","method":"speak"},{"version":"v2","path":"lib/ruby_llm/protocols/deepgram/speech.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"aura-2-thalia-en","spec":"spec/ruby_llm/speech_streaming_spec.rb","example":"RubyLLM::Speech streams speech from deepgram","cassette":"spec/fixtures/vcr_cassettes/speech_streams_speech_from_deepgram.yml","notes":"Fresh API recording plus independent HTTP probe: 239 chunks, 39168 bytes, first audio after 0.78s; joined bytes match the complete Speech."}]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"text_intelligence":{"v1":"missing","v2":"missing","offered":true,"notes":"Separate /v1/read endpoint for text intent/sentiment/topics is absent.","sources":["s105"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/deepgram.rb"}]},"vector_store_management":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"video_editing":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"voice_cloning":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full Deepgram REST and WebSocket inventories: Listen, Speak, Read/Text Intelligence and Voice Agent, including agent settings and function messages. These contracts do not document this dedicated operation or control. This is an API-scope finding, not a claim about what third-party LLMs attached to Voice Agent can do.","sources":["s234","s235","s233"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/deepgram.rb","method":"protocol"}]}},"gaps":[{"notes":"Classification: Text Intelligence /v1/read exposes intent, topic and sentiment analysis. RubyLLM does not implement the Read API; this is separate from transcription keyword formatting.","sources":["s235","s234"]},{"notes":"Text analysis API: Separate /v1/read endpoint for text intent/sentiment/topics is absent.","sources":["s105"]}]},{"id":"elevenlabs","name":"ElevenLabs","notes":"The audit includes speech APIs and Flows image/video generation and assets. RubyLLM integrates speech, transcription and Flows media operations. ElevenLabs Agents conversations and hosted-agent administration are outside this release; their provider offerings remain listed separately. Account and billing administration are outside scope.","features":{"chat":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides chat through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s238","s239","s240","s374"],"code":[]},"streaming":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides chat streaming through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s240","s238","s374"],"code":[]},"structured_output":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"vision":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides image input through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s242","s381","s374"],"code":[]},"pdf_input":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides pdf input through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s242","s381","s374"],"code":[]},"audio_input":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides audio input through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s238","s239","s240","s374"],"code":[]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"thinking":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides thinking results through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s243","s244","s240"],"code":[]},"thinking_controls":{"v1":"na","v2":"out_of_scope","offered":true,"notes":"ElevenLabs exposes reasoning effort, thinking budget and summary settings on hosted agents and workflows. Those settings are not per-request inference controls; hosted-agent configuration and conversations are outside RubyLLM 2.0 coverage.","sources":["s243","s244","s419","s421","s374"],"code":[]},"citations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides citations through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s245","s246","s382","s385","s386"],"code":[]},"tools":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides function tools through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s238","s239","s240","s374"],"code":[]},"tool_choice":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"parallel_tools":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides multiple tool calls through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s244","s245","s374"],"code":[]},"parallel_tool_control":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"server_web_search":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides web search tool through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s247","s241","s420","s374","s419"],"code":[]},"server_web_fetch":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"server_code_execution":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides code execution tool through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s248","s240","s382"],"code":[]},"server_file_search":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides file search tool through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s246","s241","s385","s240"],"code":[]},"server_mcp":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides remote mcp tools through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s249","s241","s240","s374"],"code":[]},"prompt_caching":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides prompt caching through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s243","s245","s382"],"code":[]},"cache_boundaries":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"compaction":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides context compaction through a live or hosted conversation API. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s242","s419"],"code":[]},"token_counting":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"image_generation":{"v1":"missing","v2":"native","offered":true,"notes":"Existing paint submits once, polls documented job states with a bounded timeout, and returns an Image with MIME and signed content URL. Size maps to aspect ratio. One image per call; count variants are not implemented. Implementation and protocol regressions complete; real account receives HTTP 402 requiring Pro, so successful endpoint/result verification is unavailable.","sources":["s250","s352","s353"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/flows/images.rb"}],"verification":[{"status":"unavailable","spec":"spec/ruby_llm/protocols/elevenlabs/flows_spec.rb","cassette":"spec/fixtures/vcr_cassettes/protocols_elevenlabs_flows_generates_an_image_through_elevenlabs_image_and_video.yml","model":"gemini-3.1-flash-lite-image","checked_on":"2026-09-07","notes":"Fresh HTTP 402 account response: Image & Video API requires Pro plan or above. Successful endpoint output and download were not reached."},{"status":"unit","spec":"spec/ruby_llm/protocols/elevenlabs/flows_spec.rb","notes":"Documented operation payload, result lifecycle and input validation have protocol regression coverage."}]},"image_editing":{"v1":"missing","v2":"native","offered":true,"notes":"Existing with: serializes one or multiple source images as inline_base64 or same-provider asset references. Mask input is serialized only for documented GPT Image model IDs. Generation-ID references remain provider_options, not a claimed dedicated typed path. Implementation and protocol regressions complete; real account receives HTTP 402 requiring Pro, so successful endpoint/result verification is unavailable.","sources":["s250","s354","s353"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/flows/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/flows/media.rb"}],"verification":[{"status":"unavailable","spec":"spec/ruby_llm/protocols/elevenlabs/flows_spec.rb","cassette":"spec/fixtures/vcr_cassettes/protocols_elevenlabs_flows_generates_an_image_through_elevenlabs_image_and_video.yml","model":"gemini-3.1-flash-lite-image","checked_on":"2026-09-07","notes":"Fresh HTTP 402 account response: Image & Video API requires Pro plan or above. Successful endpoint output and download were not reached."},{"status":"unit","spec":"spec/ruby_llm/protocols/elevenlabs/flows_spec.rb","notes":"Documented operation payload, result lifecycle and input validation have protocol regression coverage."}]},"video_generation":{"v1":"missing","v2":"native","offered":true,"notes":"Existing animate/animate_later returns VideoJob and typed Video with MIME/raw response. with: image pair maps first/last frames. Seedance exact documented models additionally serialize image/audio/video reference arrays. Creatify Aurora maps exactly one image plus one audio attachment to singular image/audio references, omitting the prompt. No Kling REST schema is documented in this endpoint. Implementation and protocol regressions complete; real account receives HTTP 402 requiring Pro, so successful endpoint/result verification is unavailable. Public animate and animate_later accept an omitted prompt for image/audio-driven models. Other ElevenLabs generation models still require a prompt.","sources":["s251","s355","s354","s353"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/flows/videos.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/flows/media.rb"}],"verification":[{"status":"unavailable","spec":"spec/ruby_llm/protocols/elevenlabs/flows_spec.rb","cassette":"spec/fixtures/vcr_cassettes/protocols_elevenlabs_flows_generates_a_video_through_an_elevenlabs_video_job.yml","model":"veo-3.1-fast-generate-001","checked_on":"2026-09-07","notes":"Fresh HTTP 402 account response: Image & Video API requires Pro plan or above. Successful endpoint output and download were not reached."},{"status":"unit","spec":"spec/ruby_llm/protocols/elevenlabs/flows_spec.rb","notes":"Documented operation payload, result lifecycle and input validation have protocol regression coverage."}]},"speech":{"v1":"missing","v2":"native","offered":true,"notes":"Text-to-speech with a selected voice and output format.","sources":["s106"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/speech.rb"}]},"transcription":{"v1":"missing","v2":"native","offered":true,"notes":"File transcription; speaker_names enables diarization and sets speaker count.","sources":["s107"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/transcription.rb"}]},"streaming_transcription":{"v1":"missing","v2":"native","offered":true,"notes":"Block on transcribe streams Scribe v2 Realtime over WebSocket, yielding revisable partials, committed text and a final typed Transcription with detected language, duration and word timestamps. Mono PCM or mu-law WAV is validated and committed in 20-second segments, preserving every group. Buffered Scribe transcription/diarization is unchanged. This path does not implement caller-fed microphone input or ElevenAgents sessions.","sources":["s108","s359"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb","method":"stream_transcription"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/streaming_transcription.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"scribe_v2_realtime","spec":"spec/ruby_llm/transcription_websocket_spec.rb","example":"RubyLLM::Transcription streams transcription through elevenlabs WebSockets","cassette":"spec/fixtures/websocket_cassettes/transcription_elevenlabs.json","notes":"Fresh prerecorded-file WebSocket exchange with partial and committed text, typed final transcription and word timing. Additional 25.9-second live input preserved two commit groups and all final text."},{"status":"unit","spec":"spec/ruby_llm/protocols/elevenlabs/streaming_transcription_spec.rb","notes":"Streaming event normalization, commit boundaries and completion/error behavior have regression coverage."}]},"diarization":{"v1":"missing","v2":"native","offered":true,"notes":"File transcription; speaker_names enables diarization and sets speaker count.","sources":["s107"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/transcription.rb"}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"multimodal_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"file_upload":{"v1":"missing","v2":"native","offered":true,"notes":"Existing upload/find maps multipart asset/name and typed UploadedFile metadata. Workspace Image & Video assets only, not ElevenAgents knowledge-base documents. Purpose and expiry unsupported and rejected. Implementation and protocol regressions complete; real account receives HTTP 402 requiring Pro, so successful endpoint/result verification is unavailable.","sources":["s241","s242","s250","s356","s357","s353"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/assets.rb"}],"verification":[{"status":"unavailable","spec":"spec/ruby_llm/protocols/elevenlabs/assets_spec.rb","cassette":"spec/fixtures/vcr_cassettes/protocols_elevenlabs_assets_uploads_retrieves_and_downloads_an_elevenlabs_image_asset.yml","checked_on":"2026-09-07","notes":"Fresh HTTP 402 account response: Image & Video API requires Pro plan or above. Successful endpoint output and download were not reached."},{"status":"unit","spec":"spec/ruby_llm/protocols/elevenlabs/assets_spec.rb","notes":"Documented operation payload, result lifecycle and input validation have protocol regression coverage."}]},"file_download":{"v1":"missing","v2":"native","offered":true,"notes":"Existing download fetches fresh asset metadata, rejects processing without a URL, and downloads the signed content without leaking provider API credentials. Implementation and protocol regressions complete; real account receives HTTP 402 requiring Pro, so successful endpoint/result verification is unavailable.","sources":["s241","s242","s250","s357","s353"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/assets.rb"}],"verification":[{"status":"unavailable","spec":"spec/ruby_llm/protocols/elevenlabs/assets_spec.rb","cassette":"spec/fixtures/vcr_cassettes/protocols_elevenlabs_assets_uploads_retrieves_and_downloads_an_elevenlabs_image_asset.yml","checked_on":"2026-09-07","notes":"Fresh HTTP 402 account response: Image & Video API requires Pro plan or above. Successful endpoint output and download were not reached."},{"status":"unit","spec":"spec/ruby_llm/protocols/elevenlabs/assets_spec.rb","notes":"Documented operation payload, result lifecycle and input validation have protocol regression coverage."}]},"chat_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"embedding_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Agent / Responses API. It is not a generic capability claim about this provider.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"agent_skills":{"v1":"missing","v2":"missing","offered":true,"notes":"ElevenAgents Procedures are reusable task-specific instructions loaded when relevant, with create/compile/get/delete endpoints. RubyLLM does not integrate these hosted skills/procedures.","sources":["s252","s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"classification":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides classification as hosted-agent configuration, knowledge-base administration or post-conversation analysis. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s253","s241"],"code":[]},"computer_use":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"dedicated_transcription_api":{"v1":"missing","v2":"native","offered":true,"notes":"RubyLLM 2.0 implements ElevenLabs /v1/speech-to-text. ElevenLabs was not a built-in provider in 1.16.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/transcription.rb","method":"transcription_url"}]},"dubbing":{"v1":"missing","v2":"missing","offered":true,"notes":"Separate ElevenLabs audio generation operations are not covered by speak/transcribe.","sources":["s106"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs.rb"}]},"fast_inference":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"file_management":{"v1":"missing","v2":"missing","offered":true,"notes":"RubyLLM supports Flows media asset upload, metadata lookup and download. General asset listing and deletion have no dedicated public lifecycle. Hosted-agent knowledge-base and conversation-file administration are outside the release scope.","sources":["s241","s242","s250"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/assets.rb"}]},"file_search_store_management":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides file search store management as hosted-agent configuration, knowledge-base administration or post-conversation analysis. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s246","s241"],"code":[]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"fine_tuning":{"v1":"missing","v2":"missing","offered":true,"notes":"The public music fine-tunes API creates custom music fine-tunes. RubyLLM has no training/job lifecycle integration. This is separate from the already documented voice-cloning APIs.","sources":["s254"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Google Maps grounding. It is not a generic capability claim about this provider.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"guardrail_configuration":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides guardrail configuration as hosted-agent configuration, knowledge-base administration or post-conversation analysis. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s255","s244"],"code":[]},"hosted_conversations":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs documents provider-managed conversation storage or hosted conversation resources. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s245","s382"],"code":[]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Interactions API. It is not a generic capability claim about this provider.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"json_mode":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"This row names another provider-specific API: Bedrock Mantle protocols. It is not a generic capability claim about this provider.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"music_generation":{"v1":"missing","v2":"missing","offered":true,"notes":"No /v1/music client.","sources":["s110"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs.rb"}]},"nonchat_batches":{"v1":"missing","v2":"missing","offered":true,"notes":"ElevenAgents exposes a batch RAG-index computation API. This specialized knowledge-base operation is not the same as batched chat or embedding-vector generation, and RubyLLM does not integrate it.","sources":["s256","s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"omni_video_generation":{"v1":"missing","v2":"native","offered":true,"notes":"animate/animate_later maps image, audio and video reference arrays for the exact documented Seedance models and returns typed VideoJob/Video results. Creatify Aurora separately accepts one image plus one audio input without a prompt. Media combinations remain model-specific; this does not implement Kling editing or all website workflows. Protocol mapping and job lifecycle have unit coverage. The fresh video endpoint probe returned HTTP 402 requiring Pro, so combined-media generation has no successful live verification.","sources":["s251","s355","s354","s353"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/flows/videos.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/flows/media.rb"}],"verification":[{"status":"unavailable","spec":"spec/ruby_llm/protocols/elevenlabs/flows_spec.rb","cassette":"spec/fixtures/vcr_cassettes/protocols_elevenlabs_flows_generates_a_video_through_an_elevenlabs_video_job.yml","model":"veo-3.1-fast-generate-001","checked_on":"2026-09-07","notes":"Fresh HTTP 402 account response: Image & Video API requires Pro plan or above. Successful endpoint output and download were not reached."},{"status":"unit","spec":"spec/ruby_llm/protocols/elevenlabs/flows_spec.rb","notes":"Seedance video-reference mapping and rejection for Veo, Aurora image/audio public calls, and typed pending/completed VideoJob results are regression-tested. Combined image/audio/video acceptance is supported by the documented per-model renderer; no successful live Seedance run is claimed."}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"prefix_completion":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"prompt_cache_controls":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"provider_server_fallback":{"v1":"missing","v2":"missing","offered":true,"notes":"ElevenAgents supports default/custom/disabled model fallback sequences. RubyLLM does not configure these server-side agent fallbacks.","sources":["s243"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"realtime":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs documents realtime conversations. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s108","s374"],"code":[]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"responses":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"shell_computer_tools":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"sound_effects":{"v1":"missing","v2":"missing","offered":true,"notes":"Separate ElevenLabs audio generation operations are not covered by speak/transcribe.","sources":["s106"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs.rb"}]},"streaming_speech":{"v1":"missing","v2":"native","offered":true,"notes":"Block on speak yields typed SpeechChunk bytes incrementally and returns the complete Speech; binary HTTP transport validates status/content type, preserves binary encoding and refuses retries after audio delivery.","sources":["s109","s341"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/speech.rb"}],"verification":[{"status":"passed","recorded_on":"2026-09-07","model":"eleven_flash_v2_5","spec":"spec/ruby_llm/speech_streaming_spec.rb","example":"RubyLLM::Speech streams speech from elevenlabs","cassette":"spec/fixtures/vcr_cassettes/speech_streams_speech_from_elevenlabs.yml","notes":"Fresh API recording plus independent HTTP probe: 90 chunks, 116655 bytes, first audio after 0.20s; joined bytes match the complete Speech."}]},"task_budgets":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides task budgets as hosted-agent configuration, knowledge-base administration or post-conversation analysis. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s244","s245"],"code":[]},"text_intelligence":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides text analysis api as hosted-agent configuration, knowledge-base administration or post-conversation analysis. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s253","s241"],"code":[]},"vector_store_management":{"v1":"missing","v2":"out_of_scope","offered":true,"notes":"ElevenLabs Agents provides vector store management as hosted-agent configuration, knowledge-base administration or post-conversation analysis. This is outside RubyLLM 2.0 coverage; conversation state stays in the application.","sources":["s246","s241"],"code":[]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"video_editing":{"v1":"missing","v2":"missing","offered":true,"notes":"RubyLLM Flows video generation accepts Seedance reference videos through with:. The separately advertised Kling O3 Edit/O1 Edit workflows have no implemented REST request/result contract; reference-conditioned generation does not claim those dedicated editing models.","sources":["s257","s251"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"},{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs/flows/videos.rb"}]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"voice_cloning":{"v1":"missing","v2":"missing","offered":true,"notes":"ElevenAPI exposes instant and professional voice cloning and associated training/voice-management endpoints. RubyLLM accepts an existing voice ID for speech but does not create voices.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"voice_conversion":{"v1":"missing","v2":"missing","offered":true,"notes":"Speech-to-speech voice conversion has no public RubyLLM operation.","sources":["s111"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/elevenlabs.rb"}]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"Reviewed the full ElevenAPI, ElevenAgents and Flows API inventory, including agent configuration, conversation results, media generation and knowledge-base endpoints. No dedicated public operation or request control for this feature is documented in that inventory. Related capabilities available only by writing an arbitrary external function are not counted as a provider operation.","sources":["s241"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/elevenlabs.rb","method":"protocol"}]}},"gaps":[{"notes":"Agent skills: ElevenAgents Procedures are reusable task-specific instructions loaded when relevant, with create/compile/get/delete endpoints. RubyLLM does not integrate these hosted skills/procedures.","sources":["s252","s241"]},{"notes":"Dubbing, Sound effects: Separate ElevenLabs audio generation operations are not covered by speak/transcribe.","sources":["s106"]},{"notes":"File listing and deletion: RubyLLM supports Flows media asset upload, metadata lookup and download. General asset listing and deletion have no dedicated public lifecycle. Hosted-agent knowledge-base and conversation-file administration are outside the release scope.","sources":["s241","s242","s250"]},{"notes":"Fine-tuning: The public music fine-tunes API creates custom music fine-tunes. RubyLLM has no training/job lifecycle integration. This is separate from the already documented voice-cloning APIs.","sources":["s254"]},{"notes":"Music generation: No /v1/music client.","sources":["s110"]},{"notes":"Other batch operations: ElevenAgents exposes a batch RAG-index computation API. This specialized knowledge-base operation is not the same as batched chat or embedding-vector generation, and RubyLLM does not integrate it.","sources":["s256","s241"]},{"notes":"Provider-managed fallback: ElevenAgents supports default/custom/disabled model fallback sequences. RubyLLM does not configure these server-side agent fallbacks.","sources":["s243"]},{"notes":"Video editing: RubyLLM Flows video generation accepts Seedance reference videos through with:. The separately advertised Kling O3 Edit/O1 Edit workflows have no implemented REST request/result contract; reference-conditioned generation does not claim those dedicated editing models.","sources":["s257","s251"]},{"notes":"Voice cloning: ElevenAPI exposes instant and professional voice cloning and associated training/voice-management endpoints. RubyLLM accepts an existing voice ID for speech but does not create voices.","sources":["s241"]},{"notes":"Voice conversion: Speech-to-speech voice conversion has no public RubyLLM operation.","sources":["s111"]}]},{"id":"ollama","name":"Ollama","notes":"Self-hosted Ollama uses the OpenAI-compatible Chat Completions and embeddings routes. Native Ollama endpoints and hosted web services are separate. Server/model/backend versions affect available capabilities. Scope: native and compatibility inference, plus the separately documented Ollama hosted search/fetch API. Local runner features are not assumed to exist on the Cloud host. Model-file imports and LoRA loading do not count as training jobs.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"Local supported models; multiple tool calls parsed.","sources":["s131","s132"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"Local supported models; multiple tool calls parsed.","sources":["s131","s132"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"Local supported models; multiple tool calls parsed.","sources":["s131","s132"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"Local supported models; multiple tool calls parsed.","sources":["s131","s132"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"pdf_input":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated pdf input operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"audio_input":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 with: audio attachments render the input_audio data/format supported in released Ollama 0.33.3. An audio-capable model is required. Regression specs verify audio encoding in the media formatter; live validation was unavailable because the local server is 0.32.15 and has no audio-capable model.","sources":["s310","s284","s285"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama/media.rb","method":"format_content"},{"version":"v2","path":"lib/ruby_llm/providers/ollama/media.rb"},{"version":"v2","path":"spec/ruby_llm/providers/ollama/media_spec.rb"}]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video input operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"Local supported models; multiple tool calls parsed.","sources":["s131","s132"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"V1 already mapped public effort controls to reasoning_effort. V2 adds consistent toggle/default handling. Ollama does not offer token budgets; those are logged and ignored.","sources":["s131"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama/chat.rb"}]},"citations":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated citations operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"Local supported models; multiple tool calls parsed.","sources":["s131","s132"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"tool_choice":{"v1":"na","v2":"na","offered":false,"notes":"The official OpenAI-compatibility checklist marks tool_choice unsupported, and Ollama v0.33.3's ChatCompletionRequest does not define it. RubyLLM 1.16 and 2.0 can serialize the field through shared Chat Completions code, but that does not provide endpoint support. Both versions are compared against the current provider API.","sources":["s131","s437","s438"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"Local supported models; multiple tool calls parsed.","sources":["s131","s132"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"parallel_tool_control":{"v1":"na","v2":"na","offered":false,"notes":"Ollama's OpenAI-compatible request contract supports tools but exposes neither tool_choice nor parallel_tool_calls. The v0.33.3 request struct has neither field. Models can return multiple tool calls, but there is no dedicated request control to limit their number.","sources":["s131","s437","s438"],"code":[]},"server_web_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated web search tool operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"server_web_fetch":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated web fetch tool operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"server_code_execution":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated code execution tool operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"server_file_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file search tool operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"server_mcp":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated remote mcp tools operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"Automatic local prompt reuse works without a RubyLLM switch. Released Ollama v0.33.3 maps PromptEvalCachedCount to prompt_tokens_details.cached_tokens, which both RubyLLM versions parse; actual reuse depends on the runner.","sources":["s284","s286","s285"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"}]},"cache_boundaries":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated cache boundaries operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated managed cache resources operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"compaction":{"v1":"unknown","v2":"unknown","offered":null,"notes":"Upstream main implements /v1/responses/compact and compaction handling on /v1/responses, but latest released v0.33.3 has neither route/handler. Released availability is therefore unconfirmed, rather than absent by API inventory. RubyLLM registers only Chat Completions for Ollama and has no integration for these main-branch Responses operations.","sources":["s284","s287","s288","s289"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"token_counting":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated token counting operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"image_generation":{"v1":"na","v2":"na","offered":false,"notes":"The current released Ollama API no longer offers image generation. Upstream removed the experimental engine, routes and documentation on 2026-07-28; v0.33.3 rejects image-generation models. This is a current-offering correction, not a claim that the historical experimental API never worked.","sources":["s134","s383","s384"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}],"verification":[]},"image_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image editing operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"video_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video generation operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"speech":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated speech generation operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"transcription":{"v1":"native","v2":"native","offered":true,"notes":"Released Ollama v0.33.3 registers /v1/audio/transcriptions. Its multipart model/file/language/prompt request and JSON {text: ...} or plain-text response match the inherited RubyLLM transcription operation in both versions. Requires a compatible audio model; speaker segments are not returned. This endpoint is newer than the public documentation inventory.","sources":["s284","s287","s290"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"}]},"streaming_transcription":{"v1":"na","v2":"na","offered":false,"notes":"Ollama v0.33.3 transcription middleware buffers the internal chat stream, then returns only final text. It exposes neither transcription delta events nor speaker segments; a supplied stream flag or verbose/diarized format does not change this response contract.","sources":["s290","s285"],"code":[]},"diarization":{"v1":"na","v2":"na","offered":false,"notes":"Ollama v0.33.3 transcription middleware buffers the internal chat stream, then returns only final text. It exposes neither transcription delta events nor speaker segments; a supplied stream flag or verbose/diarized format does not change this response contract.","sources":["s290","s285"],"code":[]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated moderation operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated ocr / document parsing operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"embeddings":{"v1":"native","v2":"native","offered":true,"notes":"Compatible /v1/embeddings endpoint.","sources":["s131"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/embeddings.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/embeddings.rb"}]},"multimodal_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated multimodal embeddings operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated reranking operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"file_upload":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file upload operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"file_download":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file download operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"chat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated chat batches operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"embedding_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated embedding batches operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated advisor tool operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated agent / responses api operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"agent_skills":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated agent skills operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated asynchronous research operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"Ollama documents stateless Responses support; stored conversations and previous_response_id are explicitly unsupported.","sources":["s131"],"code":[]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated browser use operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated classification operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"computer_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated computer use operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context editing operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated contextual embeddings operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"dedicated_transcription_api":{"v1":"native","v2":"native","offered":true,"notes":"Released Ollama v0.33.3 registers /v1/audio/transcriptions. Its multipart model/file/language/prompt request and JSON {text: ...} or plain-text response match the inherited RubyLLM transcription operation in both versions. Requires a compatible audio model; speaker segments are not returned. This endpoint is newer than the public documentation inventory.","sources":["s284","s287","s290"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dubbing operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"fast_inference":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fast inference operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"file_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file listing and deletion operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"file_search_store_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file search store management operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"fill_in_middle":{"v1":"missing","v2":"missing","offered":true,"notes":"Native /api/generate and compatible completions accept a prompt and suffix; RubyLLM has no completions operation.","sources":["s286","s131"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fine-tuning operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated google maps grounding operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated guardrail configuration operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"hosted_conversations":{"v1":"na","v2":"na","offered":false,"notes":"Ollama documents stateless Responses support; stored conversations and previous_response_id are explicitly unsupported.","sources":["s131"],"code":[]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image batches operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated interactions api operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"json_mode":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"The compatibility API accepts JSON object mode through raw response_format; with_schema exposes structured JSON Schema output.","sources":["s131"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated bedrock mantle protocols operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"manual_compaction":{"v1":"unknown","v2":"unknown","offered":null,"notes":"Upstream main implements /v1/responses/compact and compaction handling on /v1/responses, but latest released v0.33.3 has neither route/handler. Released availability is therefore unconfirmed, rather than absent by API inventory. RubyLLM registers only Chat Completions for Ollama and has no integration for these main-branch Responses operations.","sources":["s284","s287","s288","s289"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/ollama.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated music generation operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated other batch operations operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated omni video generation operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated partner model protocols operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"prefix_completion":{"v1":"missing","v2":"missing","offered":true,"notes":"Native /api/generate and compatible completions accept a prompt and suffix; RubyLLM has no completions operation.","sources":["s286","s131"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated programmatic tool calling operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"prompt_cache_controls":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated prompt cache options operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated provider-managed fallback operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"realtime":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated realtime sessions operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated response caching operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"responses":{"v1":"missing","v2":"missing","offered":true,"notes":"Ollama offers stateless /v1/responses. RubyLLM registers only its Chat Completions dialect.","sources":["s131"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses batches operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"search_api":{"v1":"missing","v2":"missing","offered":true,"notes":"Hosted /api/web_search and /api/web_fetch require an Ollama account key; no domain wrapper.","sources":["s133"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated apply patch tool operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image generation tool operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated tool search operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated x search tool operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"shell_computer_tools":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated shell and computer tools operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated sound effects operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"streaming_speech":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated streaming speech generation operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated task budgets operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated text analysis api operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"vector_store_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated vector store management operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video batches operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"video_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video editing operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video extension operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"voice_cloning":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice cloning operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice conversion operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]},"web_fetch_api":{"v1":"missing","v2":"missing","offered":true,"notes":"Hosted /api/web_search and /api/web_fetch require an Ollama account key; no domain wrapper.","sources":["s133"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama.rb"}]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses over websocket operation is documented in the audited Ollama native and compatibility APIs.","sources":["s283","s131"],"code":[]}},"gaps":[{"notes":"Context compaction, Manual context compaction: Upstream main implements /v1/responses/compact and compaction handling on /v1/responses, but latest released v0.33.3 has neither route/handler. Released availability is therefore unconfirmed, rather than absent by API inventory. RubyLLM registers only Chat Completions for Ollama and has no integration for these main-branch Responses operations.","sources":["s284","s287","s288","s289"]},{"notes":"Fill-in-the-middle completion, Prefix completion: Native /api/generate and compatible completions accept a prompt and suffix; RubyLLM has no completions operation.","sources":["s286","s131"]},{"notes":"JSON object mode: The compatibility API accepts JSON object mode through raw response_format; with_schema exposes structured JSON Schema output.","sources":["s131"]},{"notes":"Responses API: Ollama offers stateless /v1/responses. RubyLLM registers only its Chat Completions dialect.","sources":["s131"]},{"notes":"Standalone search API, Standalone web fetch API: Hosted /api/web_search and /api/web_fetch require an Ollama account key; no domain wrapper.","sources":["s133"]}]},{"id":"ollama_cloud","name":"Ollama Cloud","notes":"Dedicated provider introduced in v2; v1 could target cloud manually through Ollama base URL/key configuration, so v1 missing means no named provider integration, not impossible access. Scope: native and compatibility inference, plus the separately documented Ollama hosted search/fetch API. Local runner features are not assumed to exist on the Cloud host. Model-file imports and LoRA loading do not count as training jobs.","features":{"chat":{"v1":"missing","v2":"native","offered":true,"notes":"Only supported cloud models; inherits the Ollama Chat Completions dialect.","sources":["s131","s135"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"}]},"streaming":{"v1":"missing","v2":"native","offered":true,"notes":"Only supported cloud models; inherits the Ollama Chat Completions dialect.","sources":["s131","s135"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"}]},"structured_output":{"v1":"na","v2":"na","offered":false,"notes":"The current official guide explicitly says Ollama Cloud does not support structured outputs.","sources":["s132"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"}]},"vision":{"v1":"missing","v2":"native","offered":true,"notes":"Only supported cloud models; inherits the Ollama Chat Completions dialect.","sources":["s131","s135"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"}]},"pdf_input":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated pdf input operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"audio_input":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated audio input operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"video_input":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video input operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"thinking":{"v1":"missing","v2":"native","offered":true,"notes":"Only supported cloud models; inherits the Ollama Chat Completions dialect.","sources":["s131","s135"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"}]},"thinking_controls":{"v1":"missing","v2":"native","offered":true,"notes":"Effort controls where the hosted model exposes them; no thinking budget.","sources":["s131"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"},{"version":"v2","path":"lib/ruby_llm/providers/ollama/chat.rb"}]},"citations":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated citations operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"tools":{"v1":"missing","v2":"native","offered":true,"notes":"Only supported cloud models; inherits the Ollama Chat Completions dialect.","sources":["s131","s135"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"}]},"tool_choice":{"v1":"na","v2":"na","offered":false,"notes":"The audited Cloud endpoint uses Ollama's OpenAI-compatible API, whose official checklist marks tool_choice unsupported. The 2.0 Cloud adapter inherits the Ollama dialect; that does not add this endpoint control. The comparison uses current provider offerings for both versions, so this is not counted as a missing 1.16 integration.","sources":["s131","s437","s438","s135"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"}]},"parallel_tools":{"v1":"missing","v2":"native","offered":true,"notes":"Only supported cloud models; inherits the Ollama Chat Completions dialect.","sources":["s131","s135"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"}]},"parallel_tool_control":{"v1":"na","v2":"na","offered":false,"notes":"Ollama's OpenAI-compatible request contract supports tools but exposes neither tool_choice nor parallel_tool_calls. The v0.33.3 request struct has neither field. Models can return multiple tool calls, but there is no dedicated request control to limit their number.","sources":["s131","s437","s438"],"code":[]},"server_web_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated web search tool operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"server_web_fetch":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated web fetch tool operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"server_code_execution":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated code execution tool operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"server_file_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file search tool operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"server_mcp":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated remote mcp tools operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"prompt_caching":{"v1":"unknown","v2":"unknown","offered":null,"notes":"Local Ollama documents prompt-cache reuse, but the Cloud documentation does not establish the hosted cache contract or cache-hit accounting.","sources":["s135","s286"],"code":[]},"cache_boundaries":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated cache boundaries operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated managed cache resources operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"compaction":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context compaction operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"token_counting":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated token counting operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"image_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image generation operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"image_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image editing operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"video_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video generation operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"speech":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated speech generation operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"transcription":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated transcription operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"streaming_transcription":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated streaming transcription operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"diarization":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated speaker identification operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated moderation operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"ocr":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated ocr / document parsing operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"embeddings":{"v1":"unknown","v2":"unknown","offered":null,"notes":"The local /api/embed endpoint is documented; the Cloud guide and public hosted catalog do not establish a callable Cloud embedding operation.","sources":["s135","s291"],"code":[]},"multimodal_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated multimodal embeddings operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"reranking":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated reranking operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"file_upload":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file upload operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"file_download":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file download operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"chat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated chat batches operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"embedding_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated embedding batches operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated advisor tool operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated agent / responses api operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"agent_skills":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated agent skills operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated asynchronous research operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"Ollama documents stateless Responses support; stored conversations and previous_response_id are explicitly unsupported.","sources":["s131"],"code":[]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated browser use operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"classification":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated classification operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"computer_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated computer use operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context editing operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated contextual embeddings operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"dedicated_transcription_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dedicated transcription api operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dubbing operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"fast_inference":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fast inference operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"file_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file listing and deletion operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"file_search_store_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file search store management operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fill-in-the-middle completion operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fine-tuning operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated google maps grounding operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated guardrail configuration operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"hosted_conversations":{"v1":"na","v2":"na","offered":false,"notes":"Ollama documents stateless Responses support; stored conversations and previous_response_id are explicitly unsupported.","sources":["s131"],"code":[]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image batches operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated interactions api operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"json_mode":{"v1":"na","v2":"na","offered":false,"notes":"The structured-output guide explicitly excludes Ollama Cloud; it describes both JSON mode and schema-constrained output.","sources":["s132"],"code":[]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated bedrock mantle protocols operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated manual context compaction operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated music generation operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated other batch operations operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"omni_video_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated omni video generation operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated partner model protocols operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"prefix_completion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated prefix completion operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated programmatic tool calling operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"prompt_cache_controls":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated prompt cache options operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated provider-managed fallback operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"realtime":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated realtime sessions operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated response caching operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"responses":{"v1":"unknown","v2":"unknown","offered":null,"notes":"The compatibility reference documents local stateless Responses; the Cloud guide does not establish that endpoint on the remote ollama.com host.","sources":["s135","s131"],"code":[]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses batches operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"search_api":{"v1":"missing","v2":"missing","offered":true,"notes":"Separate hosted search/fetch APIs are not wrapped by the Cloud adapter.","sources":["s133"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"}]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated apply patch tool operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image generation tool operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated tool search operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated x search tool operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"shell_computer_tools":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated shell and computer tools operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated sound effects operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"streaming_speech":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated streaming speech generation operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated task budgets operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated text analysis api operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"vector_store_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated vector store management operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video batches operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"video_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video editing operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video extension operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"voice_cloning":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice cloning operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice conversion operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]},"web_fetch_api":{"v1":"missing","v2":"missing","offered":true,"notes":"Separate hosted search/fetch APIs are not wrapped by the Cloud adapter.","sources":["s133"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/ollama_cloud.rb"}]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses over websocket operation is documented in the audited Ollama Cloud inference API.","sources":["s135","s283"],"code":[]}},"gaps":[{"notes":"Prompt caching: Local Ollama documents prompt-cache reuse, but the Cloud documentation does not establish the hosted cache contract or cache-hit accounting.","sources":["s135","s286"]},{"notes":"Text embeddings: The local /api/embed endpoint is documented; the Cloud guide and public hosted catalog do not establish a callable Cloud embedding operation.","sources":["s135","s291"]},{"notes":"Responses API: The compatibility reference documents local stateless Responses; the Cloud guide does not establish that endpoint on the remote ollama.com host.","sources":["s135","s131"]},{"notes":"Standalone search API, Standalone web fetch API: Separate hosted search/fetch APIs are not wrapped by the Cloud adapter.","sources":["s133"]}]},{"id":"gpustack","name":"GPUStack","notes":"Scope: GPUStack standard inference routes and documented built-in backends, including vLLM-Omni. Support is conditional on the deployed model, backend version and settings. The optional generic proxy can forward custom APIs; this audit does not claim those arbitrary extensions are absent. GPU administration, external model-provider integrations and loading fine-tuned weights are outside the comparison.","features":{"chat":{"v1":"native","v2":"native","offered":true,"notes":"Supported on compatible backends; existing v1 chat integration.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"}]},"streaming":{"v1":"native","v2":"native","offered":true,"notes":"Supported on compatible backends; existing v1 chat integration.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"}]},"structured_output":{"v1":"native","v2":"native","offered":true,"notes":"Supported on compatible backends; existing v1 chat integration.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"}]},"vision":{"v1":"native","v2":"native","offered":true,"notes":"Supported on compatible backends; existing v1 chat integration.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"}]},"pdf_input":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated pdf input operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"audio_input":{"v1":"missing","v2":"native","offered":true,"notes":"V2 serializes input_audio; deployed model must support audio.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack/media.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack/media.rb"}]},"video_input":{"v1":"missing","v2":"native","offered":true,"notes":"The existing Chat attachment API renders GPUStack video inputs as vLLM video_url content parts. Remote video URLs pass through and local videos become data URLs. Requires a video-capable deployment, such as a suitable vLLM or vLLM-Omni model; support is not claimed for all GPUStack models/backends. The documented wire shape and public Chat request are covered by regressions. No live GPUStack endpoint was available locally, so inference was not verified.","sources":["s328","s329","s330","s292"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack/media.rb"},{"version":"v1","path":"lib/ruby_llm/providers/gpustack/media.rb","method":"format_content"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack/media.rb","method":"format_video"}]},"thinking":{"v1":"native","v2":"native","offered":true,"notes":"Supported on compatible backends; existing v1 chat integration.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"}]},"thinking_controls":{"v1":"native","v2":"native","offered":true,"notes":"Both versions map public effort controls to reasoning_effort on compatible deployed backends. Other backend-specific controls, such as enable_thinking, still use provider_options; this does not imply universal backend support.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"},{"version":"v2","path":"spec/support/chat_helpers.rb"}]},"citations":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated citations operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"tools":{"v1":"native","v2":"native","offered":true,"notes":"Supported on compatible backends; existing v1 chat integration.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"}]},"tool_choice":{"v1":"native","v2":"native","offered":true,"notes":"Supported on compatible backends; existing v1 chat integration.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"}]},"parallel_tools":{"v1":"native","v2":"native","offered":true,"notes":"Supported on compatible backends; existing v1 chat integration.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"}]},"parallel_tool_control":{"v1":"native","v2":"native","offered":true,"notes":"Supported on compatible backends; existing v1 chat integration.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"}]},"server_web_search":{"v1":"missing","v2":"partial","offered":true,"notes":"with_server_tools(web_search: { require_approval: \"never\" }) maps to the configured browser search subtool. Search and fetch aliases coalesce into one MCP entry, retaining both requested filters. Requires an explicitly selected Responses protocol and a deployment-configured vLLM MCP tool server. RubyLLM requires explicit require_approval: never and rejects alias settings that change namespaces or broaden subtools. The upstream allowed_tools filter affects model-facing descriptions, not Harmony execution authorization. Harmony may omit tool result data; RubyLLM retains available call/action records without inventing results. No live endpoint is configured. Historical audit correction: tag 1.16.0 only routes GPUStack chat through Chat Completions and cannot call this Responses-hosted tool API.","sources":["s136","s293","s387","s388","s390","s389","s391","s433"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb","method":"GPUStack inherits OpenAI Chat Completions; no Responses route"},{"version":"v2","path":"lib/ruby_llm/protocols/gpustack/responses.rb","method":"MCP_ALIASES / render_mcp_alias / merge_mcp_filters"},{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"completion_url fixed to chat/completions; inherited by GPUStack in tag 1.16.0"}],"verification":[{"status":"unit","spec":"spec/ruby_llm/protocols/gpustack/responses_spec.rb","notes":"Exact portable alias request shape, no extra namespace/subtools, combination preserves both filters, conflicting duplicate settings rejected, existing actual-result/raw-history normalization preserved.","checked_on":"2026-09-07"},{"status":"unavailable","checked_on":"2026-09-07","notes":"Prior configured GPUStack /v1/models probe at localhost:11444 refused the connection, retained in gpustack-completion-report.json. No backend provisioned, no new execution or successful live claim."}]},"server_web_fetch":{"v1":"missing","v2":"partial","offered":true,"notes":"with_server_tools(web_fetch: { require_approval: \"never\" }) maps to the configured browser open subtool. Requires a backend with subtool dispatch such as Harmony; released non-Harmony dispatch only implements search. Requires an explicitly selected Responses protocol and a deployment-configured vLLM MCP tool server. RubyLLM requires explicit require_approval: never and rejects alias settings that change namespaces or broaden subtools. The upstream allowed_tools filter affects model-facing descriptions, not Harmony execution authorization. Harmony may omit tool result data; RubyLLM retains available call/action records without inventing results. No live endpoint is configured. Historical audit correction: tag 1.16.0 only routes GPUStack chat through Chat Completions and cannot call this Responses-hosted tool API.","sources":["s136","s293","s387","s388","s390","s389","s391","s433"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb","method":"GPUStack inherits OpenAI Chat Completions; no Responses route"},{"version":"v2","path":"lib/ruby_llm/protocols/gpustack/responses.rb","method":"MCP_ALIASES / render_mcp_alias / merge_mcp_filters"},{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"completion_url fixed to chat/completions; inherited by GPUStack in tag 1.16.0"}],"verification":[{"status":"unit","spec":"spec/ruby_llm/protocols/gpustack/responses_spec.rb","notes":"Exact portable alias request shape, no extra namespace/subtools, combination preserves both filters, conflicting duplicate settings rejected, existing actual-result/raw-history normalization preserved.","checked_on":"2026-09-07"},{"status":"unavailable","checked_on":"2026-09-07","notes":"Prior configured GPUStack /v1/models probe at localhost:11444 refused the connection, retained in gpustack-completion-report.json. No backend provisioned, no new execution or successful live claim."}]},"server_code_execution":{"v1":"missing","v2":"partial","offered":true,"notes":"with_server_tools(code_execution: { require_approval: \"never\" }) selects only the deployment-configured Python namespace, without enabling container tools. Requires an explicitly selected Responses protocol and a deployment-configured vLLM MCP tool server. RubyLLM requires explicit require_approval: never and rejects alias settings that change namespaces or broaden subtools. The upstream allowed_tools filter affects model-facing descriptions, not Harmony execution authorization. Harmony may omit tool result data; RubyLLM retains available call/action records without inventing results. No live endpoint is configured. Historical audit correction: tag 1.16.0 only routes GPUStack chat through Chat Completions and cannot call this Responses-hosted tool API.","sources":["s136","s293","s387","s388","s390","s389","s391","s433"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/gpustack.rb","method":"GPUStack inherits OpenAI Chat Completions; no Responses route"},{"version":"v2","path":"lib/ruby_llm/protocols/gpustack/responses.rb","method":"MCP_ALIASES / render_mcp_alias / merge_mcp_filters"},{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb","method":"completion_url fixed to chat/completions; inherited by GPUStack in tag 1.16.0"}],"verification":[{"status":"unit","spec":"spec/ruby_llm/protocols/gpustack/responses_spec.rb","notes":"Exact portable alias request shape, no extra namespace/subtools, combination preserves both filters, conflicting duplicate settings rejected, existing actual-result/raw-history normalization preserved.","checked_on":"2026-09-07"},{"status":"unavailable","checked_on":"2026-09-07","notes":"Prior configured GPUStack /v1/models probe at localhost:11444 refused the connection, retained in gpustack-completion-report.json. No backend provisioned, no new execution or successful live claim."}]},"server_file_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file search tool operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"server_mcp":{"v1":"missing","v2":"partial","offered":true,"notes":"Dedicated with_server_tools(mcp: ...) on explicit Responses for deployment-configured vLLM MCP servers. Complete non-Harmony calls retain actual name/arguments/results and replay as supported function-call pairs, preserving original raw_content. Released Harmony/GPT-OSS output omits tool result messages, may emit built-in calls only as reasoning or search actions, and rejects native MCP/search output item replay. Incomplete records retain actual JSON as assistant history, without fabricated results. Requires explicit require_approval: never; URLs/connectors/authorization and ignored read_only filters reject before HTTP. Backend setup required; this is not arbitrary per-request MCP routing or a managed GPUStack service. allowed_tools filters the descriptions shown to the model; Harmony does not enforce it as execution authorization. Configure execution restrictions on the deployed tool server.","sources":["s136","s293","s387","s388","s389","s390","s391","s433"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gpustack/responses.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/gpustack/responses_spec.rb","notes":"Fresh configured /v1/models connection probe failed: localhost:11444 refused the connection. No live feature execution is claimed."},{"status":"unit","spec":"spec/ruby_llm/protocols/gpustack/responses_spec.rb","notes":"Released provider/backend request and response contracts have focused protocol regressions. sends configured MCP labels and preserves complete calls, usage, and multi-turn replay; passes documented browser subtool filters to the configured server; rejects approval modes, per-request servers, and ignored read-only filters before HTTP; retains incomplete Harmony tool records without inventing results or replaying unsupported item types; reads actual Harmony reasoning content when the provider has no summary"}]},"prompt_caching":{"v1":"native","v2":"native","offered":true,"notes":"Built-in backends support automatic prefix reuse, including documented LMCache deployments. Both versions read compatible cache-hit usage; deployment settings determine caching.","sources":["s294"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/chat.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"}]},"cache_boundaries":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated cache boundaries operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"explicit_cache":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated managed cache resources operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"compaction":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context compaction operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"token_counting":{"v1":"missing","v2":"native","offered":true,"notes":"Native exact plain-text RubyLLM.tokenize through vLLM /tokenize using an enabled GPUStack model proxy base ending /model/proxy/ROUTE_ID/v1. Custom installation path prefixes and authentication are preserved. Standard gateway is rejected before HTTP. Returns typed IDs/count/model/raw with vLLM default special-token handling; no generation usage is inferred. Chat#count_tokens remains unimplemented and this is not full conversation/tool/media counting.","sources":["s136","s295","s387","s392"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gpustack/tokenization.rb"},{"version":"v2","path":"lib/ruby_llm/tokenization.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/gpustack/tokenization_spec.rb","notes":"Fresh configured /v1/models connection probe failed: localhost:11444 refused the connection. No live feature execution is claimed."},{"status":"unit","spec":"spec/ruby_llm/protocols/gpustack/tokenization_spec.rb","notes":"Released provider/backend request and response contracts have focused protocol regressions. uses the model proxy tokenizer and preserves IDs and raw backend metadata without charging usage; rejects gateway tokenization before issuing a request; keeps tokenization on its dialect when Responses is the configured chat protocol"}]},"image_generation":{"v1":"native","v2":"native","offered":true,"notes":"Inherited OpenAI-compatible operation routes; backend/model support remains required.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/embeddings.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions.rb"}]},"image_editing":{"v1":"native","v2":"native","offered":true,"notes":"Inherited OpenAI-compatible operation routes; backend/model support remains required.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/embeddings.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions.rb"}]},"video_generation":{"v1":"missing","v2":"native","offered":true,"notes":"Native animate/animate_later for deployed vLLM-Omni video backends through an enabled GPUStack model proxy. Multipart text/image/video/audio input including ordered grouped references, non-idempotent submission, typed pending/completed/failed jobs, authenticated polling and MP4 download. One result per call; uploaded file IDs and extend are explicitly unsupported. Backend model support controls valid media combinations. Duration remains nil because released seconds metadata is requested/default length, not measured output; full metadata remains raw. No cancellation/delete API is invented.","sources":["s292","s387","s393","s394","s395"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gpustack/videos.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb"},{"version":"v2","path":"lib/ruby_llm/video_job.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/gpustack/videos_spec.rb","notes":"Fresh configured /v1/models connection probe failed: localhost:11444 refused the connection. No live feature execution is claimed."},{"status":"unit","spec":"spec/ruby_llm/protocols/gpustack/videos_spec.rb","notes":"Released provider/backend request and response contracts have focused protocol regressions. submits text-only multipart once, polls all states, and downloads bytes with proxy authentication; serializes image and audio input and nested backend options as JSON multipart fields; preserves ordered multiple references and passes remote videos without downloading them; does not repeat a video submission after an uncertain transport failure; preserves provider failure and rejects unknown job states rather than polling forever"}]},"speech":{"v1":"missing","v2":"native","offered":true,"notes":"V2 adds compatible /audio/speech and typed Speech result.","sources":["s136"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/speech.rb"}]},"transcription":{"v1":"native","v2":"native","offered":true,"notes":"The documented multipart /v1/audio/transcriptions request and text result match both versions. Supported models and optional fields depend on the backend.","sources":["s296"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"}]},"streaming_transcription":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 transcribe with a block reads vLLM choices[].delta.content, assembles the returned transcript, and requests/preserves final token usage. Typed transcript events remain supported. This requires a streaming vLLM deployment; VoxBox does not stream. Protocol regressions passed; no GPUStack endpoint was available for live validation.","sources":["s296","s311","s297","s298"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"},{"version":"v2","path":"spec/ruby_llm/providers/gpustack/transcription_spec.rb"}]},"diarization":{"v1":"native","v2":"native","offered":true,"notes":"On a compatible vLLM deployment, the documented diarized_json response contains speaker-labelled segments (currently documented for OpenMOSS-Team/MOSS-Transcribe-Diarize). RubyLLM 1.16 can request response_format: diarized_json, and 2.0 format: diarized_json; both retain segments. This is model/backend-specific and does not establish named-speaker reference support or VoxBox diarization.","sources":["s296","s297"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb","method":"parse_transcription_response"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb","method":"parse_transcription_response"}]},"moderation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated moderation operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"ocr":{"v1":"unknown","v2":"unknown","offered":null,"notes":"GPUStack advertises OCR model deployment, but no dedicated document-parsing route or output contract is established in its inference reference. Reading an image through chat is counted under image input.","sources":["s299","s136"],"code":[]},"embeddings":{"v1":"native","v2":"native","offered":true,"notes":"Inherited OpenAI-compatible operation routes; backend/model support remains required.","sources":["s136"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/embeddings.rb"},{"version":"v1","path":"lib/ruby_llm/providers/openai/images.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions.rb"}]},"multimodal_embeddings":{"v1":"missing","v2":"native","offered":true,"notes":"2.0 embed(..., with: image) renders vLLM messages through the common attachment API and returns a single vector. The deployment needs a multimodal embedding model with the appropriate chat template; arrays of texts cannot be combined with attachments. Protocol and public API regression tests passed; no GPUStack endpoint was available for live validation.","sources":["s300","s292"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack/embeddings.rb"},{"version":"v2","path":"spec/ruby_llm/providers/gpustack/embeddings_spec.rb"}]},"reranking":{"v1":"missing","v2":"native","offered":true,"notes":"V2 adds /v1/rerank.","sources":["s136"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/rerank.rb"}]},"file_upload":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file upload operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"file_download":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file download operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"chat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated chat batches operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"embedding_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated embedding batches operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"advisor_tool":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated advisor tool operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"agent_responses":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated agent / responses api operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"agent_skills":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated agent skills operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"async_research":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated asynchronous research operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"background_responses":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated background responses jobs operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"browser_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated browser use operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"classification":{"v1":"missing","v2":"missing","offered":true,"notes":"The opt-in vLLM proxy exposes classification endpoints. RubyLLM implements the separate plain tokenization route, but has no classification request or typed classification result API.","sources":["s136","s295"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gpustack/tokenization.rb"}]},"computer_use":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated computer use operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"context_editing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated context editing operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"contextual_embeddings":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated contextual embeddings operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"dedicated_transcription_api":{"v1":"native","v2":"native","offered":true,"notes":"The documented multipart /v1/audio/transcriptions request and text result match both versions. Supported models and optional fields depend on the backend.","sources":["s296"],"code":[{"version":"v1","path":"lib/ruby_llm/providers/openai/transcription.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/transcription.rb"}]},"dubbing":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated dubbing operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"fast_inference":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fast inference operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"file_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file listing and deletion operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"file_search_store_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated file search store management operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"fill_in_middle":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fill-in-the-middle completion operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"fine_tuning":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated fine-tuning operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"google_maps":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated google maps grounding operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"guardrail_configuration":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated guardrail configuration operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"hosted_conversations":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated hosted conversations operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"image_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image batches operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"interactions_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated interactions api operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"json_mode":{"v1":"passthrough","v2":"passthrough","offered":true,"notes":"Compatible models accept response_format JSON object mode through raw options; RubyLLM exposes schema output separately.","sources":["s136","s295"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/chat.rb"}]},"mantle_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated bedrock mantle protocols operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"manual_compaction":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated manual context compaction operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"music_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated music generation operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"nonchat_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated other batch operations operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"omni_video_generation":{"v1":"missing","v2":"native","offered":true,"notes":"animate/animate_later maps ordered image, audio and video references through an enabled GPUStack vLLM-Omni model proxy and returns typed VideoJob/Video results. Valid combinations depend on the deployed backend/model. Multipart mappings, pending/completed/failed states and authenticated download have unit coverage. The configured gateway refused the live connection; no successful generation is claimed.","sources":["s292","s387","s393","s394","s395"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gpustack/videos.rb"},{"version":"v2","path":"lib/ruby_llm/protocol.rb"},{"version":"v2","path":"lib/ruby_llm/video_job.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/gpustack/videos_spec.rb","notes":"Fresh configured /v1/models connection probe failed: localhost:11444 refused the connection. No live feature execution is claimed."},{"status":"unit","spec":"spec/ruby_llm/protocols/gpustack/videos_spec.rb","notes":"Released provider/backend request and response contracts have focused protocol regressions. submits text-only multipart once, polls all states, and downloads bytes with proxy authentication; serializes image and audio input and nested backend options as JSON multipart fields; preserves ordered multiple references and passes remote videos without downloading them; does not repeat a video submission after an uncertain transport failure; preserves provider failure and rejects unknown job states rather than polling forever"}]},"partner_model_protocols":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated partner model protocols operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"prefix_completion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated prefix completion operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"programmatic_tool_calling":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated programmatic tool calling operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"prompt_cache_controls":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated prompt cache options operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"provider_server_fallback":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated provider-managed fallback operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"realtime":{"v1":"unknown","v2":"unknown","offered":null,"notes":"Built-in vLLM offers realtime transcription over WebSockets, but GPUStack documentation does not establish WebSocket forwarding for this route.","sources":["s136","s297"],"code":[]},"response_caching":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated response caching operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"responses":{"v1":"missing","v2":"native","offered":true,"notes":"Explicit protocol: :responses registers the documented vLLM Responses route on the GPUStack gateway or enabled model proxy. Normal chat and individual operations retain their existing adapters. Supported output, token usage and MCP raw items use the shared Responses parser. Configured backend/model support is required. vLLM-specific output replay normalization avoids unsupported MCP input item types; Harmony reasoning content is retained. MCP lifecycle limitations are tracked separately.","sources":["s136","s387","s388","s389","s390","s391"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gpustack/responses.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/gpustack/responses_spec.rb","notes":"Fresh configured /v1/models connection probe failed: localhost:11444 refused the connection. No live feature execution is claimed."},{"status":"unit","spec":"spec/ruby_llm/protocols/gpustack/responses_spec.rb","notes":"Released provider/backend request and response contracts have focused protocol regressions. sends configured MCP labels and preserves complete calls, usage, and multi-turn replay; does not imply a managed web or code service and keeps ordinary chat on Chat Completions"}]},"responses_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses batches operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"search_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone search api operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"server_apply_patch":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated apply patch tool operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"server_tool_image_generation":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated image generation tool operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"server_tool_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated tool search operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"server_x_search":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated x search tool operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"shell_computer_tools":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated shell and computer tools operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"sound_effects":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated sound effects operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"streaming_speech":{"v1":"missing","v2":"native","offered":true,"notes":"Streaming speech on GPUStack vLLM uses the public speak block, typed audio chunks, stream:true and PCM by default. Documented request and result contract has a public API regression; no deployed speech model was accessible for a live call. VoxBox does not offer streaming.","sources":["s296","s343"],"code":[{"version":"v2","path":"lib/ruby_llm/protocols/chat_completions/speech.rb"},{"version":"v2","path":"lib/ruby_llm/providers/gpustack/speech.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","notes":"unavailable deployment"},{"status":"unit","spec":"spec/ruby_llm/providers/gpustack/speech_spec.rb","notes":"Documented request routing and returned audio regression; shared binary streaming transport covered separately."}]},"task_budgets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated task budgets operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"text_intelligence":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated text analysis api operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"vector_store_management":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated vector store management operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"video_batches":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video batches operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"video_editing":{"v1":"missing","v2":"native","offered":true,"notes":"Native existing animate(with: source_video) maps to documented vLLM-Omni video_reference through the configured model proxy. Supports remote URLs or inline bytes and ordered multi-reference input on backends that implement it. It is model-dependent video conditioning/editing, not an unsupported standalone edits/extension route. Same typed lifecycle and authenticated video download as generation.","sources":["s292","s387","s393","s394","s395"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"},{"version":"v2","path":"lib/ruby_llm/protocols/gpustack/videos.rb"}],"verification":[{"status":"unavailable","checked_on":"2026-09-07","spec":"spec/ruby_llm/protocols/gpustack/videos_spec.rb","notes":"Fresh configured /v1/models connection probe failed: localhost:11444 refused the connection. No live feature execution is claimed."},{"status":"unit","spec":"spec/ruby_llm/protocols/gpustack/videos_spec.rb","notes":"Released provider/backend request and response contracts have focused protocol regressions. preserves ordered multiple references and passes remote videos without downloading them; submits text-only multipart once, polls all states, and downloads bytes with proxy authentication; accepts a local video through the public attachment API and sends a JSON reference field"}]},"video_extension":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated video extension operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"voice_cloning":{"v1":"missing","v2":"missing","offered":true,"notes":"GPUStack documents Qwen3-TTS reference-audio voice cloning; RubyLLM has no dedicated cloning operation.","sources":["s296"],"code":[{"version":"v2","path":"lib/ruby_llm/providers/gpustack.rb"}]},"voice_conversion":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated voice conversion operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"web_fetch_api":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated standalone web fetch api operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]},"websockets":{"v1":"na","v2":"na","offered":false,"notes":"No dedicated responses over websocket operation is documented in the audited GPUStack standard inference routes and documented built-in backends.","sources":["s136","s292"],"code":[]}},"gaps":[{"notes":"Web search tool: with_server_tools(web_search: { require_approval: \"never\" }) maps to the configured browser search subtool. Search and fetch aliases coalesce into one MCP entry, retaining both requested filters. Requires an explicitly selected Responses protocol and a deployment-configured vLLM MCP tool server. RubyLLM requires explicit require_approval: never and rejects alias settings that change namespaces or broaden subtools. The upstream allowed_tools filter affects model-facing descriptions, not Harmony execution authorization. Harmony may omit tool result data; RubyLLM retains available call/action records without inventing results. No live endpoint is configured. Historical audit correction: tag 1.16.0 only routes GPUStack chat through Chat Completions and cannot call this Responses-hosted tool API.","sources":["s136","s293","s387","s388","s390","s389","s391","s433"]},{"notes":"Web fetch tool: with_server_tools(web_fetch: { require_approval: \"never\" }) maps to the configured browser open subtool. Requires a backend with subtool dispatch such as Harmony; released non-Harmony dispatch only implements search. Requires an explicitly selected Responses protocol and a deployment-configured vLLM MCP tool server. RubyLLM requires explicit require_approval: never and rejects alias settings that change namespaces or broaden subtools. The upstream allowed_tools filter affects model-facing descriptions, not Harmony execution authorization. Harmony may omit tool result data; RubyLLM retains available call/action records without inventing results. No live endpoint is configured. Historical audit correction: tag 1.16.0 only routes GPUStack chat through Chat Completions and cannot call this Responses-hosted tool API.","sources":["s136","s293","s387","s388","s390","s389","s391","s433"]},{"notes":"Code execution tool: with_server_tools(code_execution: { require_approval: \"never\" }) selects only the deployment-configured Python namespace, without enabling container tools. Requires an explicitly selected Responses protocol and a deployment-configured vLLM MCP tool server. RubyLLM requires explicit require_approval: never and rejects alias settings that change namespaces or broaden subtools. The upstream allowed_tools filter affects model-facing descriptions, not Harmony execution authorization. Harmony may omit tool result data; RubyLLM retains available call/action records without inventing results. No live endpoint is configured. Historical audit correction: tag 1.16.0 only routes GPUStack chat through Chat Completions and cannot call this Responses-hosted tool API.","sources":["s136","s293","s387","s388","s390","s389","s391","s433"]},{"notes":"Remote MCP tools: Dedicated with_server_tools(mcp: ...) on explicit Responses for deployment-configured vLLM MCP servers. Complete non-Harmony calls retain actual name/arguments/results and replay as supported function-call pairs, preserving original raw_content. Released Harmony/GPT-OSS output omits tool result messages, may emit built-in calls only as reasoning or search actions, and rejects native MCP/search output item replay. Incomplete records retain actual JSON as assistant history, without fabricated results. Requires explicit require_approval: never; URLs/connectors/authorization and ignored read_only filters reject before HTTP. Backend setup required; this is not arbitrary per-request MCP routing or a managed GPUStack service. allowed_tools filters the descriptions shown to the model; Harmony does not enforce it as execution authorization. Configure execution restrictions on the deployed tool server.","sources":["s136","s293","s387","s388","s389","s390","s391","s433"]},{"notes":"OCR / document parsing: GPUStack advertises OCR model deployment, but no dedicated document-parsing route or output contract is established in its inference reference. Reading an image through chat is counted under image input.","sources":["s299","s136"]},{"notes":"Classification: The opt-in vLLM proxy exposes classification endpoints. RubyLLM implements the separate plain tokenization route, but has no classification request or typed classification result API.","sources":["s136","s295"]},{"notes":"JSON object mode: Compatible models accept response_format JSON object mode through raw options; RubyLLM exposes schema output separately.","sources":["s136","s295"]},{"notes":"Realtime sessions: Built-in vLLM offers realtime transcription over WebSockets, but GPUStack documentation does not establish WebSocket forwarding for this route.","sources":["s136","s297"]},{"notes":"Voice cloning: GPUStack documents Qwen3-TTS reference-audio voice cloning; RubyLLM has no dedicated cloning operation.","sources":["s296"]}]}]}
