{
 "object": "capabilities",
 "contract": "openai-compatible-subset",
 "version": "1.1.0",
 "base_url": "https://dyadic.app/api/openai/v1",
 "openapi": "https://dyadic.app/api/openai/v1/openapi.json",
 "tested_openai_sdk": {
  "python": "3.26.0"
 },
 "untested_openai_sdk": {
  "javascript": "Not run in the test suite yet (the server tests run in the Python service image); it sends the same requests as the Python SDK."
 },
 "errors": {
  "unsupported_parameter": "400 {error: {type: invalid_request_error, code: unsupported_parameter, param}}",
  "unsupported_endpoint": "404 {error: {type: invalid_request_error, code: unsupported_endpoint}}"
 },
 "headers": {
  "X-Request-Id": "On every response, errors included. Opaque; quote it when asking for help.",
  "X-Client-Request-Id": "Optional: your own id (printable ASCII, up to 512 characters), kept in the activity log. Not an idempotency key.",
  "x-ratelimit-limit-requests": "The key's requests per minute; with -remaining- and -reset- (seconds, like 12s).",
  "x-ratelimit-limit-tokens": "The key's token limit for its period, when it has one; with -remaining- and -reset-.",
  "X-Dyadic-Ignored-Parameters": "Fields the request sent that OpenAI doesn't define for the endpoint, so nothing used them."
 },
 "endpoints": {
  "/chat/completions": {
   "methods": [
    "POST"
   ],
   "fields": [
    "frequency_penalty",
    "function_call",
    "functions",
    "logit_bias",
    "logprobs",
    "max_completion_tokens",
    "max_tokens",
    "messages",
    "metadata",
    "min_p",
    "model",
    "parallel_tool_calls",
    "presence_penalty",
    "reasoning",
    "reasoning_effort",
    "repetition_penalty",
    "response_format",
    "safety_identifier",
    "seed",
    "stop",
    "store",
    "stream",
    "stream_options",
    "temperature",
    "tool_choice",
    "tools",
    "top_a",
    "top_k",
    "top_logprobs",
    "top_p",
    "user",
    "verbosity"
   ],
   "field_notes": {
    "model": "iris or iris-think.",
    "messages": "The whole conversation: text, images, files, audio, tool calls and results.",
    "tools": "Function tools.",
    "tool_choice": "auto, none, required or a function.",
    "functions": "Legacy function tools.",
    "function_call": "Legacy tool_choice.",
    "parallel_tool_calls": "Sent to the model.",
    "max_tokens": "Output cap (also capped by the key).",
    "max_completion_tokens": "Alias of max_tokens.",
    "temperature": "0 to 2 (default 0.7).",
    "top_p": "Nucleus sampling.",
    "stop": "Up to 4 sequences.",
    "stream": "Server-Sent Events.",
    "stream_options": "include_usage adds a final usage chunk.",
    "presence_penalty": "-2 to 2.",
    "frequency_penalty": "-2 to 2.",
    "logit_bias": "Token biases.",
    "logprobs": "Token log probabilities.",
    "top_logprobs": "0 to 20.",
    "seed": "Best-effort determinism.",
    "response_format": "text, json_object or json_schema.",
    "reasoning_effort": "none to xhigh, on models that reason.",
    "reasoning": "Only effort.",
    "user": "Kept in the activity log.",
    "safety_identifier": "Kept in the activity log.",
    "store": "Keep the completion for 30 days (list, retrieve, update, delete).",
    "metadata": "Up to 16 string keys (64 chars) and values (512 chars); stored with the object.",
    "verbosity": "low, medium or high: added to the instructions as how long the answer should be.",
    "top_k": "Sample from the top K tokens (many open models).",
    "min_p": "Minimum probability relative to the top token.",
    "top_a": "Top-A sampling.",
    "repetition_penalty": "Penalty for repeated tokens."
   },
   "limited_fields": {
    "n": {
     "allowed": [
      1
     ],
     "note": "One choice per request."
    },
    "service_tier": {
     "allowed": [
      "auto",
      "default"
     ],
     "note": "One processing tier; flex, priority, scale and fast aren't offered."
    },
    "modalities": {
     "allowed": [
      "text"
     ],
     "note": "Text output only."
    }
   },
   "unsupported_fields": {
    "audio": "Audio output isn't offered; use /audio/speech.",
    "prediction": "Predicted outputs aren't applied.",
    "web_search_options": "Search runs through Iris's own tools (leave tools empty), not web_search_options.",
    "moderation": "Moderation is set per API key (Moderate requests), not per request; /moderations classifies content."
   },
   "accepted_without_effect": {
    "stream_options.include_obfuscation": "Streamed chunks carry no obfuscation padding.",
    "prompt_cache_key": "Prompt caching is managed by the platform; the key changes nothing about the answer.",
    "prompt_cache_options": "Prompt caching is managed by the platform.",
    "prompt_cache_retention": "Prompt caching is managed by the platform."
   },
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [
    "function"
   ],
   "dyadic_extensions": [
    "top_k",
    "min_p",
    "top_a",
    "repetition_penalty"
   ]
  },
  "/completions": {
   "methods": [
    "POST"
   ],
   "fields": [
    "frequency_penalty",
    "logit_bias",
    "max_completion_tokens",
    "max_tokens",
    "min_p",
    "model",
    "presence_penalty",
    "prompt",
    "reasoning",
    "reasoning_effort",
    "repetition_penalty",
    "response_format",
    "seed",
    "stop",
    "stream",
    "stream_options",
    "temperature",
    "top_a",
    "top_k",
    "top_p",
    "user"
   ],
   "field_notes": {
    "model": "iris or iris-think.",
    "prompt": "One prompt (a string or a one-item list).",
    "max_tokens": "Output cap.",
    "temperature": "0 to 2 (default 0.7).",
    "top_p": "Nucleus sampling.",
    "stop": "Up to 4 sequences.",
    "stream": "Server-Sent Events.",
    "stream_options": "include_usage adds a final usage chunk.",
    "presence_penalty": "-2 to 2.",
    "frequency_penalty": "-2 to 2.",
    "logit_bias": "Token biases.",
    "seed": "Best-effort determinism.",
    "user": "Kept in the activity log.",
    "top_k": "Sample from the top K tokens (many open models).",
    "min_p": "Minimum probability relative to the top token.",
    "top_a": "Top-A sampling.",
    "repetition_penalty": "Penalty for repeated tokens.",
    "max_completion_tokens": "Alias of max_tokens.",
    "response_format": "text, json_object or json_schema.",
    "reasoning_effort": "none to xhigh, on models that reason.",
    "reasoning": "Only effort."
   },
   "limited_fields": {
    "n": {
     "allowed": [
      1
     ],
     "note": "One choice per request."
    },
    "best_of": {
     "allowed": [
      1
     ],
     "note": "One candidate per request."
    },
    "echo": {
     "allowed": [
      false
     ],
     "note": "The prompt isn't echoed."
    },
    "logprobs": {
     "allowed": [
      false
     ],
     "note": "Legacy token log probabilities aren't returned."
    },
    "suffix": {
     "allowed": [
      ""
     ],
     "note": "Insertion (suffix) isn't offered."
    }
   },
   "unsupported_fields": {},
   "accepted_without_effect": {
    "stream_options.include_obfuscation": "Streamed chunks carry no obfuscation padding."
   },
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [
    "top_k",
    "min_p",
    "top_a",
    "repetition_penalty"
   ]
  },
  "/responses": {
   "methods": [
    "POST",
    "GET (WebSocket)"
   ],
   "fields": [
    "background",
    "conversation",
    "input",
    "instructions",
    "max_output_tokens",
    "metadata",
    "model",
    "parallel_tool_calls",
    "previous_response_id",
    "reasoning",
    "safety_identifier",
    "store",
    "stream",
    "stream_options",
    "temperature",
    "text",
    "tool_choice",
    "tools",
    "top_logprobs",
    "top_p",
    "user"
   ],
   "field_notes": {
    "model": "iris or iris-think.",
    "input": "Text or input items: messages, function calls and outputs, images, files, compaction items, hosted tool items and mcp_approval_response.",
    "instructions": "A system message for this response only.",
    "previous_response_id": "Continue from a stored response.",
    "conversation": "Continue a conversation; this response's input and output are added to it.",
    "store": "Keep the response for 30 days (default true).",
    "stream": "Responses streaming events.",
    "background": "Run in the background; poll GET /responses/{id}, cancel with POST /responses/{id}/cancel.",
    "metadata": "Up to 16 string keys (64 chars) and values (512 chars); stored with the object.",
    "max_output_tokens": "Output cap (also capped by the key).",
    "temperature": "0 to 2 (default 0.7).",
    "top_p": "Nucleus sampling.",
    "top_logprobs": "0 to 20, with include message.output_text.logprobs.",
    "parallel_tool_calls": "Sent to the model.",
    "tools": "Function tools, web search and hosted tools: code_interpreter and shell (Code interpreter switch), file_search (File search), image_generation (Image generation) and mcp (Remote MCP servers) run on the platform; shell with environment {type: local}, computer (and computer_use_preview) and apply_patch run in your app (Function calling switch): shell_call, computer_call and apply_patch_call items you answer.",
    "tool_choice": "auto, none, required, a function, web search or a hosted tool (as auto).",
    "text": "text.format: text, json_object or json_schema; text.verbosity: low, medium or high: added to the instructions as how long the answer should be.",
    "reasoning": "effort (summary: see below).",
    "user": "Kept in the activity log.",
    "safety_identifier": "Kept in the activity log.",
    "stream_options": "Accepted."
   },
   "limited_fields": {
    "include": {
     "allowed": [
      "message.output_text.logprobs",
      "message.input_image.image_url",
      "reasoning.encrypted_content",
      "code_interpreter_call.outputs",
      "file_search_call.results"
     ],
     "note": "Output logprobs, input image URLs, code interpreter logs and file search results; reasoning.encrypted_content is accepted but adds nothing (reasoning comes back as summary text)."
    },
    "service_tier": {
     "allowed": [
      "auto",
      "default"
     ],
     "note": "One processing tier; flex, priority, scale and fast aren't offered."
    },
    "truncation": {
     "allowed": [
      "disabled"
     ],
     "note": "Input is never truncated; a request over the context window fails."
    }
   },
   "unsupported_fields": {
    "prompt": "Stored prompt templates aren't offered; send instructions and input.",
    "context_management": "Automatic compaction isn't offered; call /responses/compact.",
    "moderation": "Moderation is set per API key (Moderate requests), not per request; /moderations classifies content.",
    "max_tool_calls": "A tool call limit isn't enforced.",
    "access_programs": "Access programs aren't offered."
   },
   "accepted_without_effect": {
    "prompt_cache_key": "Prompt caching is managed by the platform; the key changes nothing about the answer.",
    "prompt_cache_options": "Prompt caching is managed by the platform.",
    "prompt_cache_retention": "Prompt caching is managed by the platform.",
    "stream_options.include_obfuscation": "Streamed events carry no obfuscation padding.",
    "reasoning.summary": "The model's reasoning comes back as summary text whenever it gives some, whatever this asks.",
    "reasoning.generate_summary": "As reasoning.summary."
   },
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [
    "function",
    "web_search",
    "web_search_preview",
    "web_search_2025_08_26",
    "web_search_preview_2025_03_11",
    "code_interpreter",
    "shell",
    "file_search",
    "image_generation",
    "mcp",
    "computer",
    "computer_use_preview",
    "apply_patch"
   ],
   "dyadic_extensions": [],
   "notes": "background can't be combined with stream (poll instead). Over a WebSocket (GET /responses with Upgrade), send response.create events; background and response.steer aren't offered there."
  },
  "/responses/input_tokens": {
   "methods": [
    "POST"
   ],
   "fields": [
    "conversation",
    "input",
    "instructions",
    "model",
    "parallel_tool_calls",
    "previous_response_id",
    "reasoning",
    "text",
    "tool_choice",
    "tools"
   ],
   "field_notes": {
    "model": "iris or iris-think.",
    "input": "As for /responses.",
    "instructions": "As for /responses.",
    "previous_response_id": "As for /responses.",
    "conversation": "As for /responses.",
    "tools": "As for /responses.",
    "tool_choice": "As for /responses.",
    "parallel_tool_calls": "Accepted.",
    "text": "As for /responses.",
    "reasoning": "As for /responses."
   },
   "limited_fields": {
    "truncation": {
     "allowed": [
      "disabled"
     ],
     "note": "Input is never truncated."
    }
   },
   "unsupported_fields": {
    "personality": "Personality presets aren't offered."
   },
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [
    "function",
    "web_search",
    "web_search_preview",
    "web_search_2025_08_26",
    "web_search_preview_2025_03_11",
    "code_interpreter",
    "shell",
    "file_search",
    "image_generation",
    "mcp"
   ],
   "dyadic_extensions": [],
   "notes": "An estimate: about four bytes of text per token, plus a fixed amount per image and per message, and the agent's own instructions. Free; no model runs."
  },
  "/responses/compact": {
   "methods": [
    "POST"
   ],
   "fields": [
    "input",
    "instructions",
    "model",
    "previous_response_id"
   ],
   "field_notes": {
    "model": "iris or iris-think.",
    "input": "The conversation to compact.",
    "instructions": "Kept as context for the summary.",
    "previous_response_id": "Compact a stored response chain."
   },
   "limited_fields": {
    "service_tier": {
     "allowed": [
      "auto",
      "default"
     ],
     "note": "One processing tier; flex, priority, scale and fast aren't offered."
    }
   },
   "unsupported_fields": {},
   "accepted_without_effect": {
    "prompt_cache_key": "Prompt caching is managed by the platform; the key changes nothing about the answer.",
    "prompt_cache_options": "Prompt caching is managed by the platform.",
    "prompt_cache_retention": "Prompt caching is managed by the platform."
   },
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "notes": "Returns your user messages and one compaction item: a summary of everything else, sealed so only your account can use it. Send the output as the next request's input."
  },
  "/conversations": {
   "methods": [
    "POST"
   ],
   "fields": [
    "items",
    "metadata"
   ],
   "field_notes": {
    "items": "Up to 20 initial items.",
    "metadata": "Up to 16 string keys (64 chars) and values (512 chars); stored with the object."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/conversations/{conversation_id}": {
   "methods": [
    "GET",
    "POST",
    "DELETE"
   ],
   "fields": [
    "metadata"
   ],
   "field_notes": {
    "metadata": "Up to 16 string keys (64 chars) and values (512 chars); stored with the object."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "notes": "Deleting a conversation deletes its items."
  },
  "/conversations/{conversation_id}/items": {
   "methods": [
    "GET",
    "POST"
   ],
   "fields": [
    "items"
   ],
   "field_notes": {
    "items": "Up to 20 items."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "notes": "include (query) is limited to message.output_text.logprobs, message.input_image.image_url."
  },
  "/conversations/{conversation_id}/items/{item_id}": {
   "methods": [
    "GET",
    "DELETE"
   ],
   "fields": [],
   "field_notes": {},
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/chat/completions/{completion_id}": {
   "methods": [
    "GET",
    "POST",
    "DELETE"
   ],
   "fields": [
    "metadata"
   ],
   "field_notes": {
    "metadata": "Up to 16 string keys (64 chars) and values (512 chars); stored with the object."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "notes": "Completions created with store: true, for 30 days."
  },
  "/chat/completions/{completion_id}/messages": {
   "methods": [
    "GET"
   ],
   "fields": [],
   "field_notes": {},
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/embeddings": {
   "methods": [
    "POST"
   ],
   "fields": [
    "dimensions",
    "encoding_format",
    "input",
    "model",
    "user"
   ],
   "field_notes": {
    "model": "iris-embed, iris-embed-large, text-embedding-3-small, text-embedding-3-large or text-embedding-ada-002.",
    "input": "Text: a string or up to 2048.",
    "dimensions": "1 to 3072.",
    "encoding_format": "float or base64.",
    "user": "Kept in the activity log."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/moderations": {
   "methods": [
    "POST"
   ],
   "fields": [
    "input",
    "model"
   ],
   "field_notes": {
    "model": "iris-moderation, omni-moderation and text-moderation models (default omni-moderation-latest).",
    "input": "Text or text and images."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/decisions": {
   "methods": [
    "POST"
   ],
   "fields": [
    "input",
    "model",
    "questions"
   ],
   "field_notes": {
    "model": "typesafe/jev-1.14 (default, through OpenRouter), another OpenRouter decision model such as ~typesafe/jev-latest, or gpt-6-luna (OpenAI; also any request with images).",
    "input": "The evidence: text, or user messages of input_text and input_image parts (images as inline base64 data: URLs).",
    "questions": "1 to 32, each with a unique name, instructions and type predicate, choice (2-32 choices: value, description) or score (2-32 levels: label, description, lowest first)."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "notes": "Answers: predicate probability; choice value with each choice's probability and a confidence; score as the probability-weighted level index (from 0) with each level's probability; or a refusal. Billed at the provider's cost."
  },
  "/images/generations": {
   "methods": [
    "POST"
   ],
   "fields": [
    "prompt",
    "quality",
    "size",
    "user"
   ],
   "field_notes": {
    "prompt": "Up to 4000 characters.",
    "size": "Sets the aspect ratio.",
    "quality": "standard, hd, high or max.",
    "user": "Kept in the activity log."
   },
   "limited_fields": {
    "n": {
     "allowed": [
      1
     ],
     "note": "One image per request."
    },
    "background": {
     "allowed": [
      "auto"
     ],
     "note": "Transparent or opaque backgrounds can't be requested."
    },
    "moderation": {
     "allowed": [
      "auto"
     ],
     "note": "The image model's own moderation applies."
    },
    "partial_images": {
     "allowed": [
      0
     ],
     "note": "Partial images aren't streamed."
    },
    "stream": {
     "allowed": [
      false
     ],
     "note": "Images aren't streamed."
    }
   },
   "unsupported_fields": {
    "style": "Styles aren't applied; describe the style in the prompt.",
    "output_format": "The image comes back in the model's format (PNG, JPEG or WebP).",
    "output_compression": "Compression isn't applied."
   },
   "accepted_without_effect": {
    "model": "Dyadic's image model draws every image, whatever model is named.",
    "response_format": "The image comes back as b64_json, or as url when the model returns a link."
   },
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/images/edits": {
   "methods": [
    "POST"
   ],
   "fields": [
    "image",
    "prompt",
    "quality",
    "size",
    "user"
   ],
   "field_notes": {
    "image": "One PNG, JPEG, WebP or GIF up to 8 MB.",
    "prompt": "What to change.",
    "size": "Sets the aspect ratio.",
    "quality": "standard, hd, high or max.",
    "user": "Kept in the activity log."
   },
   "limited_fields": {
    "n": {
     "allowed": [
      1
     ],
     "note": "One image per request."
    },
    "background": {
     "allowed": [
      "auto"
     ],
     "note": "Transparent or opaque backgrounds can't be requested."
    },
    "partial_images": {
     "allowed": [
      0
     ],
     "note": "Partial images aren't streamed."
    },
    "stream": {
     "allowed": [
      false
     ],
     "note": "Images aren't streamed."
    }
   },
   "unsupported_fields": {
    "mask": "Masks aren't supported; describe the area to change in the prompt.",
    "input_fidelity": "Input fidelity isn't applied.",
    "output_format": "The image comes back in the model's format.",
    "output_compression": "Compression isn't applied."
   },
   "accepted_without_effect": {
    "model": "Dyadic's image model draws every image.",
    "response_format": "b64_json, or url when the model returns a link."
   },
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "content_type": "multipart/form-data"
  },
  "/images/variations": {
   "methods": [
    "POST"
   ],
   "fields": [
    "image",
    "size",
    "user"
   ],
   "field_notes": {
    "image": "One PNG, JPEG, WebP or GIF up to 8 MB.",
    "size": "Sets the aspect ratio.",
    "user": "Kept in the activity log."
   },
   "limited_fields": {
    "n": {
     "allowed": [
      1
     ],
     "note": "One image per request."
    }
   },
   "unsupported_fields": {},
   "accepted_without_effect": {
    "model": "Dyadic's image model draws every image.",
    "response_format": "b64_json, or url when the model returns a link."
   },
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "content_type": "multipart/form-data"
  },
  "/audio/speech": {
   "methods": [
    "POST"
   ],
   "fields": [
    "input",
    "model",
    "response_format",
    "speed",
    "voice"
   ],
   "field_notes": {
    "model": "iris-voice, tts-1, tts-1-hd, gpt-4o-mini-tts or gpt-4o-tts.",
    "input": "Up to 4096 characters.",
    "voice": "OpenAI's voice names, or Iris's (eve, ara, rex, sal, leo); iris-voice defaults to eve.",
    "response_format": "mp3, wav or pcm.",
    "speed": "0.25 to 4."
   },
   "limited_fields": {
    "stream_format": {
     "allowed": [
      "audio"
     ],
     "note": "The audio comes back as one file, not SSE."
    }
   },
   "unsupported_fields": {
    "instructions": "The speech model doesn't take voice instructions."
   },
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/audio/transcriptions": {
   "methods": [
    "POST"
   ],
   "fields": [
    "file",
    "language",
    "model",
    "prompt",
    "response_format",
    "temperature",
    "timestamp_granularities"
   ],
   "field_notes": {
    "file": "flac, m4a, mp3, mp4, mpeg, mpga, oga, ogg, wav or webm, up to 25 MB.",
    "model": "iris-transcribe, Whisper and GPT-4o transcription models.",
    "language": "ISO-639-1.",
    "prompt": "Context for the transcript.",
    "response_format": "json, text, srt, verbose_json or vtt.",
    "temperature": "0 to 1.",
    "timestamp_granularities": "word and segment."
   },
   "limited_fields": {
    "stream": {
     "allowed": [
      false
     ],
     "note": "Transcripts aren't streamed."
    }
   },
   "unsupported_fields": {
    "chunking_strategy": "Chunking strategies aren't applied.",
    "include": "Transcript logprobs aren't returned.",
    "known_speaker_names": "Speaker diarization isn't offered.",
    "known_speaker_references": "Speaker diarization isn't offered."
   },
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "content_type": "multipart/form-data"
  },
  "/audio/translations": {
   "methods": [
    "POST"
   ],
   "fields": [
    "file",
    "model",
    "prompt",
    "response_format",
    "temperature"
   ],
   "field_notes": {
    "file": "Audio up to 25 MB.",
    "model": "Whisper and GPT-4o transcription models.",
    "prompt": "Context for the transcript.",
    "response_format": "json, text or verbose_json.",
    "temperature": "0 to 1."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "content_type": "multipart/form-data"
  },
  "/files": {
   "methods": [
    "POST",
    "GET"
   ],
   "fields": [
    "file",
    "purpose"
   ],
   "field_notes": {
    "file": "Up to 20 MB (100 MB for batch .jsonl).",
    "purpose": "assistants, batch, fine-tune, vision, user_data or evals."
   },
   "limited_fields": {},
   "unsupported_fields": {
    "expires_after": "Files stay until deleted."
   },
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "content_type": "multipart/form-data"
  },
  "/batches": {
   "methods": [
    "POST",
    "GET"
   ],
   "fields": [
    "completion_window",
    "endpoint",
    "input_file_id",
    "metadata"
   ],
   "field_notes": {
    "input_file_id": "A .jsonl file uploaded with purpose batch.",
    "endpoint": "/v1/chat/completions, /v1/completions, /v1/embeddings, /v1/responses or /v1/moderations.",
    "completion_window": "24h.",
    "metadata": "Up to 16 string keys (64 chars) and values (512 chars); stored with the object."
   },
   "limited_fields": {},
   "unsupported_fields": {
    "output_expires_after": "Output files stay until deleted."
   },
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/containers": {
   "methods": [
    "POST",
    "GET"
   ],
   "fields": [
    "expires_after",
    "file_ids",
    "name",
    "skills"
   ],
   "field_notes": {
    "name": "Up to 200 characters.",
    "file_ids": "Up to 50 files uploaded with POST /files, copied in.",
    "expires_after": "{anchor: last_active_at, minutes: 1 to 60} (default 20).",
    "skills": "Skill references ({type: skill_reference, skill_id, version}), mounted read-only at /mnt/skills."
   },
   "limited_fields": {
    "memory_limit": {
     "allowed": [
      "1g"
     ],
     "note": "Containers run with 1 GB."
    },
    "network_policy": {
     "allowed": [
      {
       "type": "disabled"
      }
     ],
     "note": "Containers have no network."
    }
   },
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "notes": "Needs the key's Code interpreter switch (and Skills to mount skills). No network; 64 MB and 1,000 files; each program runs up to 30 seconds; a container expires after its minutes without use."
  },
  "/containers/{container_id}/files": {
   "methods": [
    "POST",
    "GET"
   ],
   "fields": [
    "file",
    "file_id"
   ],
   "field_notes": {
    "file": "Multipart: a file up to 20 MB, placed at /mnt/data/<name>.",
    "file_id": "JSON: copy a file uploaded with POST /files."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "content_type": "multipart/form-data"
  },
  "/vector_stores": {
   "methods": [
    "POST",
    "GET"
   ],
   "fields": [
    "chunking_strategy",
    "expires_after",
    "file_ids",
    "metadata",
    "name"
   ],
   "field_notes": {
    "name": "Up to 256 characters.",
    "file_ids": "Up to 100 files uploaded with POST /files (text, code, HTML, PDF or Word).",
    "expires_after": "{anchor: last_active_at, days: 1 to 365}.",
    "metadata": "Up to 16 string keys (64 chars) and values (512 chars); stored with the object.",
    "chunking_strategy": "auto (800 tokens, 400 overlap) or static {max_chunk_size_tokens, chunk_overlap_tokens}."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "notes": "Needs the key's File search switch. Text, Markdown, CSV, JSON, HTML, XML, YAML, code, PDF (with a text layer) and Word (.docx) files. Indexing and search are free: Dyadic embeds with its own model (multilingual-e5-small, 384 dimensions, 512 tokens a chunk). Each account's search index holds up to 500 MB of passages and vectors."
  },
  "/vector_stores/{vector_store_id}": {
   "methods": [
    "GET",
    "POST",
    "DELETE"
   ],
   "fields": [
    "expires_after",
    "metadata",
    "name"
   ],
   "field_notes": {
    "name": "Up to 256 characters.",
    "expires_after": "{anchor: last_active_at, days: 1 to 365}.",
    "metadata": "Up to 16 string keys (64 chars) and values (512 chars); stored with the object."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/vector_stores/{vector_store_id}/search": {
   "methods": [
    "POST"
   ],
   "fields": [
    "filters",
    "max_num_results",
    "query",
    "ranking_options"
   ],
   "field_notes": {
    "query": "Text, or a list of texts searched together.",
    "max_num_results": "1 to 50 (default 10).",
    "filters": "Attribute filters: eq, ne, gt, gte, lt, lte, in, nin, combined with and / or.",
    "ranking_options": "score_threshold: 0 to 1."
   },
   "limited_fields": {},
   "unsupported_fields": {
    "ranking_options.hybrid_search": "Hybrid search isn't offered; passages rank by meaning."
   },
   "accepted_without_effect": {
    "rewrite_query": "The query is searched as written.",
    "ranking_options.ranker": "One ranker."
   },
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/vector_stores/{vector_store_id}/files": {
   "methods": [
    "POST",
    "GET"
   ],
   "fields": [
    "attributes",
    "chunking_strategy",
    "file_id"
   ],
   "field_notes": {
    "file_id": "A file uploaded with POST /files (text, code, HTML, PDF or Word).",
    "attributes": "Up to 16 keys for filters.",
    "chunking_strategy": "As for /vector_stores."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/vector_stores/{vector_store_id}/files/{file_id}": {
   "methods": [
    "GET",
    "POST",
    "DELETE"
   ],
   "fields": [
    "attributes"
   ],
   "field_notes": {
    "attributes": "Up to 16 keys for filters."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/vector_stores/{vector_store_id}/file_batches": {
   "methods": [
    "POST"
   ],
   "fields": [
    "attributes",
    "chunking_strategy",
    "file_ids",
    "files"
   ],
   "field_notes": {
    "file_ids": "Up to 500 files.",
    "files": "Up to 500 {file_id, attributes, chunking_strategy}.",
    "attributes": "For every file in file_ids.",
    "chunking_strategy": "For every file in file_ids."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/skills": {
   "methods": [
    "POST",
    "GET"
   ],
   "fields": [
    "files"
   ],
   "field_notes": {
    "files": "The skill's files (a SKILL.md with name and description front matter at the top, each named by its path), or one zip."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "content_type": "multipart/form-data",
   "notes": "Needs the key's Skills switch. Up to 500 files and 25 MB unpacked."
  },
  "/skills/{skill_id}": {
   "methods": [
    "GET",
    "POST",
    "DELETE"
   ],
   "fields": [
    "default_version"
   ],
   "field_notes": {
    "default_version": "The version containers mount when none is named (versions are numbers, sent and returned as text)."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": []
  },
  "/skills/{skill_id}/versions": {
   "methods": [
    "POST",
    "GET"
   ],
   "fields": [
    "default",
    "files"
   ],
   "field_notes": {
    "files": "As for /skills.",
    "default": "true makes the new version the default."
   },
   "limited_fields": {},
   "unsupported_fields": {},
   "accepted_without_effect": {},
   "unsupported_fields_error": true,
   "unknown_fields": "ignored, and named in the X-Dyadic-Ignored-Parameters response header",
   "tools": [],
   "dyadic_extensions": [],
   "content_type": "multipart/form-data"
  }
 },
 "unsupported_endpoints": {
  "realtime": "the Realtime API",
  "assistants": "Assistants",
  "threads": "Assistants threads",
  "fine_tuning": "fine-tuning",
  "fine-tunes": "fine-tuning",
  "evals": "evals",
  "videos": "video generation",
  "uploads": "multi-part uploads (use /v1/files)",
  "chatkit": "ChatKit",
  "edits": "the retired edits endpoint",
  "engines": "the retired engines endpoints",
  "webhooks": "webhooks",
  "admin": "the admin API",
  "organization": "the organization API",
  "live": "the Live API",
  "safety": "safety checks",
  "content_provenance_checks": "content provenance checks"
 }
}