Skip to main content
Simulation Lab is agent-agnostic. The default agent uses a tool-calling loop with any LLM API (via LiteLLM), but you can bring your own agent implementation by implementing the BaseAgent contract.

The Agent Contract

A custom agent extends BaseAgent and implements four methods:
Register your agent at runtime via the CLI:

The Environment Interface

The environment object passed to your agent provides:
  • environment.list_tools(tool_server=None) — returns tool schemas (names, descriptions, input schemas) for one server or all servers in the workspace.
  • environment.call_tool(tool_server, tool_name, parameters) — executes a tool call on a specific server and returns a ToolCallResult.
  • environment.tool_servers — property returning a dict[str, str] mapping server names to base URLs.
Under the hood, these map to the tool server protocol: list_tools() calls GET /tools, and call_tool() calls POST /step.

Run Artifacts

As the agent executes, it populates a RunArtifacts object — the structured record of the run (conversation history, tool calls, results, errors). Helper methods (record_message, record_tool_call, set_error) allow incremental recording so that partial results are captured even on timeout or error. Verifiers consume RunArtifacts to determine whether the agent succeeded. This is the contract between agent execution and verification — your agent populates it, and verifiers read from it.