Skip to main content
Holo is trained to act as a multi-step agent inside a specific harness. Five of its conventions have to come along for the model to behave well in yours; skip any one and quality suffers.

Output format

Function calling or structured outputs, depending on the model.

Answer tool

The only way the model signals it is done.

Reasoning

Read it, never replay it.

Coordinates

Normalized to [0, 1000], scale back yourself.

Observations

Screenshots in <observation> tags, last 3 kept.

Sampling

0.8 for loops, 0.0 for single calls.
Set up the OpenAI client first by following the Quickstart.

Pick an output format

Pick one and stay in it. Only how you declare tools and read the output changes; everything on this page is shared.

Answer tool

Holo is trained to end a task by calling a tool named answer with its work report in the content argument. Register it alongside your action tools, in both formats, and stop the loop when it is called. A step that comes back without any tool call is not a stop signal: treat it as a no-op, append the message, and keep looping. Only answer ends the run.

Reasoning

Holo returns two streams on every call: a thinking trace in message.reasoning and the action in content. Reasoning is essential in agent mode (Holo was trained to plan before each step), so leave it on; reasoning_effort: "medium" is a sensible default.
Past reasoning is dropped between turns by the Qwen 3.5 chat template Holo inherits, so anything the model needs to remember has to flow through content. When re-adding the assistant message to the conversation, push only the parsed output. Do not splice the reasoning back in.

Coordinates in [0, 1000]

Send a screenshot at any size. Holo returns coordinates as integers in [0, 1000], normalized to that image. Scale back to pixels using its dimensions:
Origin is top-left. Send and scale against the same image bytes. Any resize, crop, or DPI mismatch will misclick. Pick one pixel unit (CSS or device) and stay in it end to end.

Observations

Each step, the current screenshot goes in as a user message wrapped in <observation> tags:
Keep at most the last 3 screenshots in context. More degrades accuracy. Replace older screenshots with a short text placeholder and keep the <observation> wrapper:
Both loop guides call this helper right after appending each observation.

Sampling

Agent loops run with temperature: 0.8. Single-call tasks such as element localization and document OCR run with thinking off and temperature: 0.0.

Common pitfalls

Format-specific pitfalls are listed on each loop guide.