Prerequisites
The standalone CLI installer does not expose an importable package, so embed from a source checkout:opensre onboard) — the session API reuses the same
config and credentials as the CLI. Run your script inside the checkout’s
environment with uv run python your_script.py.
Register adapters before the first turn (tools and investigation):
One API — chat and investigate
Every surface uses the same two verbs:AgentSession.start() resolves the environment, opens a session, and attaches
an agent with the standard ports — the same tools and prompts the interactive
shell uses. It does not register adapters (core may not import
bootstrap); call configure_process first or use
start_embedded_session. investigate does not require an attached chat
agent; it uses the payload runner installed by configure_process.
Always check result.answered before trusting chat text: when a turn fails (for
example the LLM provider is unreachable), the error message itself lands in
result.primary_response_text.
Internal seams (not for hosts)
Chat hosts terminate atdispatch_chat_turn → run_turn. Investigation
terminates at the installed payload runner (run_investigation_payload). Do not
invent parallel public entrypoints.
A conversation
Eachchat call is one turn in the same session, so follow-ups see earlier
context:
Your own grounding context
The agent builds its prompts from the session by default. To ground it your own way — a different system prompt, your own retrieved context — pass a provider:core.agent_harness.DefaultPromptContextProvider). A custom provider must
satisfy core.agent_harness.ports.PromptContextProvider. The same prompts=
argument is accepted by build_default_headless_agent on the custom-ports path
below.
Custom output and ports
start() buffers all output. To capture tool progress yourself — stream to a
websocket, collect for a report — build the agent explicitly and pass your own
sink:
OutputSink protocol
(core.agent_harness.ports.OutputSink: print, render_response_header,
render_error, stream) works in place of BufferOutputSink.
build_default_headless_agent also accepts a custom logger, prompt surface,
and tool observers — see its docstring for the full port list.
Your own tools
Register a package before the first tool lookup:- Declare tools with
surfaces=("action",)(or include"action"). The@tooldefault is("investigation",)only — the chat/Python-API action loop will not see investigation-only tools. - Tools may live in the package’s
__init__.pyor in submodules; both are scanned after registration.