Skip to main content
holo3-122b-a10b has no tools, so its loop returns one constrained JSON object per step. Holo3.1 takes this format too. Pick an output format shows which model takes which, and the rest of Core concepts applies here too.

Step format

The tool call is one field of the JSON object:
note is the model’s durable memory: facts from the current screen that later steps need (URLs, IDs, partial answers), null when nothing is new. tool_call is flat: tool_name sits next to the arguments, not in a nested args object.

Define the schema

Define each tool as a Pydantic model with a Literal tool_name, and use their union as the schema. The decoder emits exactly one variant, and you dispatch on tool_name.
Python
In TypeScript, write the same JSON Schema by hand: a oneOf of tool objects, each with tool_name: { const: "..." }. Send the schema twice: in extra_body={"structured_outputs": {"json": schema}}, and appended to the system prompt in an <output_format> block. The model was trained with both, so dropping either hurts reliability. Do not use tools or tool_choice: the action arrives in content, not in tool_calls.

Loop

Tool results go back as user messages wrapped in <tool_output tool="...">, not as tool messages. Plug in your own SYSTEM_PROMPT, observation() (the <observation> message from Core concepts), and execute(tool_call).
Python