harn-vm 0.9.21

Async bytecode virtual machine for the Harn programming language
Documentation
# ---------- Google Gemini + Gemma 4 (via OpenRouter) -------------------------
#
# Gemini 2.5 exposes thinking budgets through OpenRouter's `reasoning`
# field. Gemma 4 does not; it's a plain instruction-tuned dense / MoE
# model with native tool calling.

[[provider.openrouter]]
model_match = "google/gemini-2.5*"
native_tools = true
# This row pins the NATIVE channel. `json` (fenced-JSON) is now the GLOBAL
# text-channel default, so no per-model json pin is needed to get json; this
# `native` pin is only kept to select the native channel. If this model is run
# on text instead, fenced-json is the default and root-cause-fixes its
# documented heredoc `<<EOF` -> `line 0: <<` leak (json swept a clean 1.0/1.0/1.0
# emission-fidelity bench). To force text formats: `preferred_tool_format =
# "json"` (fenced) or `"text"` (heredoc). gpt-oss UNMEASURED.
preferred_tool_format = "native"
thinking_modes = ["enabled", "effort"]
prompt_caching = true
cache_breakpoint_style = "last_block"
vision_supported = true
vision = true
audio_supported = true
pdf_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 = "reasoning_summary"

[[provider.openrouter]]
model_match = "google/gemini-3.5*"
native_tools = true
preferred_tool_format = "native"
thinking_modes = ["enabled", "adaptive"]
prompt_caching = true
cache_breakpoint_style = "last_block"
vision_supported = true
vision = true
audio_supported = true
pdf_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 = "reasoning_summary"

# Gemma 4 (26B MoE / 31B) served directly by the Gemini API. Multimodal
# text+image with native function calling and thinking; no Gemini-only adaptive
# effort modes. Both the bare id and the `models/` REST resource name resolve to
# the same model. Ahead of the broader gemini rules (first match wins).
[[provider.gemini]]
model_match = "gemma-4*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["enabled"]
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 = "inline"

[[provider.gemini]]
model_match = "models/gemma-4*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["enabled"]
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 = "inline"

# Native Gemini API thinking budgets (generationConfig.thinkingConfig.
# thinkingBudget) are declared here instead of hard-coded model.contains()
# branches in gemini.rs. Flash caps at 24576 and CAN disable thinking
# (thinkingBudget:0); Pro caps at 32768 and CANNOT disable. Flash rows are
# listed first (first match wins). Effort levels map to budgets in the
# provider: minimal/low -> 1024, medium -> 8192, high/xhigh -> this ceiling.
[[provider.gemini]]
model_match = "gemini-2.5-flash*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["enabled", "adaptive", "effort"]
max_thinking_budget = 24576
reasoning_disable_supported = true
vision_supported = true
audio_supported = true
pdf_supported = true
files_api_supported = true
prefers_xml_scaffolding = true
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.gemini]]
model_match = "models/gemini-2.5-flash*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["enabled", "adaptive", "effort"]
max_thinking_budget = 24576
reasoning_disable_supported = true
vision_supported = true
audio_supported = true
pdf_supported = true
files_api_supported = true
prefers_xml_scaffolding = true
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.gemini]]
model_match = "gemini-2.5*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["enabled", "adaptive", "effort"]
max_thinking_budget = 32768
reasoning_disable_supported = false
vision_supported = true
audio_supported = true
pdf_supported = true
files_api_supported = true
prefers_xml_scaffolding = true
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.gemini]]
model_match = "models/gemini-2.5*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["enabled", "adaptive", "effort"]
max_thinking_budget = 32768
reasoning_disable_supported = false
vision_supported = true
audio_supported = true
pdf_supported = true
files_api_supported = true
prefers_xml_scaffolding = true
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.gemini]]
model_match = "gemini-3.5*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["enabled", "adaptive"]
vision_supported = true
audio_supported = true
pdf_supported = true
files_api_supported = true
prompt_caching = true
prefers_xml_scaffolding = true
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.gemini]]
model_match = "models/gemini-3.5*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["enabled", "adaptive"]
vision_supported = true
audio_supported = true
pdf_supported = true
files_api_supported = true
prompt_caching = true
prefers_xml_scaffolding = true
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"

# Gemini 3.1 (Pro Preview / Flash-Lite) — same surface as 3.5:
# thinking_level control (adaptive) plus implicit/explicit caching.
[[provider.gemini]]
model_match = "gemini-3.1*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["enabled", "adaptive"]
vision_supported = true
audio_supported = true
pdf_supported = true
files_api_supported = true
prompt_caching = true
prefers_xml_scaffolding = true
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.gemini]]
model_match = "models/gemini-3.1*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
thinking_modes = ["enabled", "adaptive"]
vision_supported = true
audio_supported = true
pdf_supported = true
files_api_supported = true
prompt_caching = true
prefers_xml_scaffolding = true
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.gemini]]
model_match = "gemini-*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
vision_supported = true
audio_supported = true
pdf_supported = true
files_api_supported = true
prefers_xml_scaffolding = true
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.gemini]]
model_match = "models/gemini-*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
vision_supported = true
audio_supported = true
pdf_supported = true
files_api_supported = true
prefers_xml_scaffolding = true
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.openrouter]]
model_match = "google/gemma-4*"
native_tools = true
vision_supported = true
preferred_tool_format = "native"
structured_output = "native"
top_k_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"

# Meta Llama 3+ routes through OpenRouter to providers (Together, Fireworks,
# Cloudflare, etc.) that all expose OpenAI-compatible function-calling and
# JSON-schema structured output. Surfacing the capability lets eval harnesses
# and downstream callers use these models for structured-output workloads
# without per-call workarounds.
[[provider.openrouter]]
model_match = "meta-llama/llama-4*"
native_tools = true
preferred_tool_format = "native"
structured_output = "native"
top_k_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.openrouter]]
model_match = "meta-llama/llama-3*"
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"