harn-vm 0.9.11

Async bytecode virtual machine for the Harn programming language
Documentation
# ---------- OpenAI family -----------------------------------------------------
#
# `provider.openai` rules are inherited by the sibling providers declared
# in `[provider_family]` below (OpenRouter, Together, Groq, DeepSeek,
# Fireworks, HuggingFace, local vLLM/SGLang). Siblings may still add their
# own `[[provider.<name>]]` rules and those win over the openai fallback.

# ChatGPT-era GPT models use Markdown prompt sections and native JSON output.
[[provider.openai]]
model_match = "gpt-4o*"
native_tools = true
preferred_tool_format = "native"
vision = true
audio_supported = true
structured_output = "native"
vision_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "none"

[[provider.openai]]
model_match = "gpt-4.1*"
native_tools = true
preferred_tool_format = "native"
vision_supported = true
structured_output = "native"
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "none"

# OpenAI `*-codex` agentic-coding tunes (gpt-5-codex, gpt-5.1-codex,
# gpt-5.1-codex-max, gpt-5.1-codex-mini, gpt-5.2-codex, gpt-5.3-codex) are
# served ONLY by the Responses API; `/v1/chat/completions` returns HTTP 404
# "Use the v1/responses endpoint instead". Flag them so Harn auto-routes
# through the Responses provider and never silently 404s on the chat lane.
# Placed before the generic `gpt-*` version rows so it wins the first-match.
[[provider.openai]]
model_match = "gpt-*codex*"
native_tools = true
preferred_tool_format = "native"
responses_api = true
chat_completions_unsupported = true
requires_completion_tokens = true
defer_loading = true
tool_search = ["hosted", "client"]
hosted_tools = ["web_search", "web_search_preview", "file_search", "code_interpreter", "image_generation", "computer_use", "mcp", "remote_mcp"]
remote_mcp = true
conversation_state = true
compaction = true
background_mode = true
tool_approval_policy = "provider_or_harn"
vision_supported = true
structured_output = "native"
thinking_modes = ["effort"]
reasoning_effort_supported = true
reasoning_none_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

# gpt-5.4+ exposes native `tool_search` on the Responses API. gpt-5.x
# reasoning models reject the legacy `max_tokens` request field on
# `/v1/chat/completions` and require `max_completion_tokens` instead.
[[provider.openai]]
model_match = "gpt-*"
version_min = [5, 4]
native_tools = true
preferred_tool_format = "native"
requires_completion_tokens = true
defer_loading = true
tool_search = ["hosted", "client"]
responses_api = true
hosted_tools = ["web_search", "web_search_preview", "file_search", "code_interpreter", "image_generation", "computer_use", "mcp", "remote_mcp"]
remote_mcp = true
conversation_state = true
compaction = true
background_mode = true
tool_approval_policy = "provider_or_harn"
vision_supported = true
structured_output = "native"
thinking_modes = ["effort"]
reasoning_effort_supported = true
reasoning_none_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

[[provider.openai]]
model_match = "gpt-*"
version_min = [5, 1]
native_tools = true
preferred_tool_format = "native"
requires_completion_tokens = true
vision_supported = true
structured_output = "native"
thinking_modes = ["effort"]
reasoning_effort_supported = true
reasoning_none_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

[[provider.openai]]
model_match = "gpt-*"
version_min = [5, 0]
native_tools = true
preferred_tool_format = "native"
requires_completion_tokens = true
vision_supported = true
structured_output = "native"
thinking_modes = ["effort"]
reasoning_effort_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

# Legacy GPT: native tool calls only.
[[provider.openai]]
model_match = "gpt-*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "none"

# Reasoning family (o1, o3, o4, ...).
[[provider.openai]]
model_match = "o1*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["effort"]
requires_completion_tokens = true
reasoning_effort_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = true
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

[[provider.openai]]
model_match = "o3*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["effort"]
requires_completion_tokens = true
reasoning_effort_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = true
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

[[provider.openai]]
model_match = "o4*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["effort"]
vision_supported = true
requires_completion_tokens = true
reasoning_effort_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = true
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

# OpenRouter-style provider-prefixed IDs.
[[provider.openai]]
model_match = "openai/gpt-4o*"
native_tools = true
preferred_tool_format = "native"
vision = true
audio_supported = true
structured_output = "native"
vision_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "none"

[[provider.openai]]
model_match = "openai/gpt-4.1*"
native_tools = true
preferred_tool_format = "native"
vision_supported = true
structured_output = "native"
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "none"

# OpenRouter-style provider-prefixed codex ids (responses-only, chat 404).
[[provider.openai]]
model_match = "openai/gpt-*codex*"
native_tools = true
preferred_tool_format = "native"
responses_api = true
chat_completions_unsupported = true
requires_completion_tokens = true
defer_loading = true
tool_search = ["hosted", "client"]
hosted_tools = ["web_search", "web_search_preview", "file_search", "code_interpreter", "image_generation", "computer_use", "mcp", "remote_mcp"]
remote_mcp = true
conversation_state = true
compaction = true
background_mode = true
tool_approval_policy = "provider_or_harn"
vision_supported = true
structured_output = "native"
thinking_modes = ["effort"]
reasoning_effort_supported = true
reasoning_none_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

[[provider.openai]]
model_match = "openai/gpt-*"
version_min = [5, 4]
native_tools = true
preferred_tool_format = "native"
requires_completion_tokens = true
defer_loading = true
tool_search = ["hosted", "client"]
responses_api = true
hosted_tools = ["web_search", "web_search_preview", "file_search", "code_interpreter", "image_generation", "computer_use", "mcp", "remote_mcp"]
remote_mcp = true
conversation_state = true
compaction = true
background_mode = true
tool_approval_policy = "provider_or_harn"
vision_supported = true
structured_output = "native"
thinking_modes = ["effort"]
reasoning_effort_supported = true
reasoning_none_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

[[provider.openai]]
model_match = "openai/gpt-*"
version_min = [5, 1]
native_tools = true
preferred_tool_format = "native"
requires_completion_tokens = true
structured_output = "native"
thinking_modes = ["effort"]
reasoning_effort_supported = true
reasoning_none_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

[[provider.openai]]
model_match = "openai/gpt-*"
version_min = [5, 0]
native_tools = true
preferred_tool_format = "native"
requires_completion_tokens = true
structured_output = "native"
thinking_modes = ["effort"]
reasoning_effort_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

[[provider.openai]]
model_match = "openai/gpt-*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = false
prefers_xml_tools = false
thinking_block_style = "none"

[[provider.openai]]
model_match = "openai/o1*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["effort"]
requires_completion_tokens = true
reasoning_effort_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = true
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

[[provider.openai]]
model_match = "openai/o3*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["effort"]
requires_completion_tokens = true
reasoning_effort_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = true
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"

[[provider.openai]]
model_match = "openai/o4*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["effort"]
vision_supported = true
requires_completion_tokens = true
reasoning_effort_supported = true
prefers_xml_scaffolding = false
prefers_markdown_scaffolding = true
structured_output_mode = "native_json"
supports_assistant_prefill = false
prefers_role_developer = true
prefers_xml_tools = false
thinking_block_style = "reasoning_summary"