Agents¶
octomate.config.agents.common ¶
Shared agent configuration and routing metadata.
Claim
dataclass
¶
What one route advertises: its ability and the effort levels it accepts.
Source code in octomate/config/agents/common.py
AgentConfig
pydantic-model
¶
Bases: BaseModel
What every agent tentacle's config block declares, whichever runtime it drives: the agent reads the same way everywhere — declared and enabled, or absent — and carries its own half of the gateway switch.
Fields:
Source code in octomate/config/agents/common.py
octomate.config.agents.claude ¶
Claude Code configuration.
ClaudeSSHConfig
pydantic-model
¶
Bases: BaseModel
Remote-host settings for the Claude tentacle.
The SSH transport is parked: nothing constructs it, so a block here is warned
about and not honoured — the run stays local. See ClaudeCodeConfig.ssh.
Fields:
-
host(str) -
identity_file(str | None) -
ssh_options(list[str]) -
claude_bin(str)
Source code in octomate/config/agents/claude.py
ClaudeCodeConfig
pydantic-model
¶
Bases: AgentConfig
Claude Agent SDK runner, selected by type: claude.
Opt-in: the agent is absent unless a block is supplied. The CLI supplies the
model catalog. claude runs as a local subprocess; an ssh block is warned
about and not honoured while the remote transport is parked.
Config:
extra:ignore
Fields:
-
gateway(bool) -
type(Literal['claude']) -
enabled(bool) -
instrument(bool) -
claims(dict[str, Claim]) -
permission_mode(ClaudePermissionMode) -
max_turns(int | None) -
ssh(ClaudeSSHConfig | None) -
approval_timeout(float | None)
Validators:
Source code in octomate/config/agents/claude.py
enabled
pydantic-field
¶
Whether to register the Claude tentacle when the config block exists.
instrument
pydantic-field
¶
Export native Claude OTLP spans to Octomate's Logfire project under the driving trace.
claims
pydantic-field
¶
Metadata for models whose harness omits descriptions or effort capabilities. Keys are provider-qualified model names.
permission_mode
pydantic-field
¶
Approval posture for a Claude conversation whose thread is in no project, or whose project declares none. Handed to the SDK verbatim.
ssh
pydantic-field
¶
Remote host to run claude on. Disabled, and no longer wired: a run happens in its thread's workspace, and there is nothing that makes a workspace on another machine. The tentacle hands the SDK no transport at all now; SSHTransport is kept as it stands, but nothing constructs it. Re-enabling is three things rather than one — somewhere remote to fork a workspace into, a directory on ClaudeSSHConfig to name it, and the transport wired back in. Setting it is warned about rather than refused: with the transport parked the block reaches nothing, so failing a start over it would cost more than it saves.
approval_timeout
pydantic-field
¶
Seconds to wait for a human approval/answer before the card expires and the pending tool is denied (so the live run unblocks). An hour by default, because not answering is the ordinary case rather than the exotic one, and an unbounded wait leaves the thread unusable for good. None waits indefinitely.
warn_remote_runs_are_off
pydantic-validator
¶
Say that a configured remote host is not honoured, and keep it as written.
This refused the whole config while the tentacle still built an SSH transport, since a block that would have been obeyed had to be stopped loudly. The transport is parked now and the block reaches nothing, so the value is left as the operator wrote it and only the effect is reported.
Source code in octomate/config/agents/claude.py
octomate.config.agents.codex ¶
Codex configuration and SDK option types.
CodexConfig
pydantic-model
¶
Bases: AgentConfig
OpenAI Codex SDK runner, selected by type: codex.
Opt-in: the agent is absent unless a tentacles.<id> block with type: codex
is supplied. The app-server supplies the model catalog. Most fields below
are default arguments for Codex SDK calls; the tentacle may compose them with
per-run overrides before calling the SDK.
Config:
extra:ignore
Fields:
-
gateway(bool) -
type(Literal['codex']) -
enabled(bool) -
instrument(bool) -
runtime(CodexConfig) -
claims(dict[str, Claim]) -
permission_mode(CodexPermissionMode) -
base_instructions(str | None) -
developer_instructions(str | None) -
ephemeral(bool | None) -
personality(CodexPersonality | None) -
effort(ReasoningEffort | None) -
summary(CodexReasoningSummary | None) -
approval_timeout(float | None)
Validators:
Source code in octomate/config/agents/codex.py
enabled
pydantic-field
¶
Whether to register the Codex tentacle when the config block exists.
instrument
pydantic-field
¶
Export native Codex OTLP spans to Octomate's Logfire project under the driving trace.
runtime
pydantic-field
¶
Default SDK runtime config used to launch the local Codex app-server.
claims
pydantic-field
¶
Metadata for models whose harness omits descriptions or effort capabilities. Keys are provider-qualified model names.
permission_mode
pydantic-field
¶
Codex permission preset: user_review (Ask for approval), auto_review (Approve for me), or full_access (Full access). The first two restrict writes to the workspace and review network access; full_access removes the sandbox and approval prompts.
base_instructions
pydantic-field
¶
Default base instructions for new Codex threads.
developer_instructions
pydantic-field
¶
Default developer instructions for starting or resuming Codex threads.
ephemeral
pydantic-field
¶
Default ephemeral flag for newly started Codex threads.
personality
pydantic-field
¶
Default Codex personality preset for threads and turns.
effort
pydantic-field
¶
Default reasoning effort override for Codex turns.
summary
pydantic-field
¶
Default reasoning summary setting for Codex turns.
approval_timeout
pydantic-field
¶
Seconds to wait for a human Codex approval/answer before the card expires and the SDK request is denied. An hour by default, because not answering is the ordinary case rather than the exotic one, and an unbounded wait leaves the thread unusable for good. None waits indefinitely.
reject_separate_sandbox
pydantic-validator
¶
Source code in octomate/config/agents/codex.py
octomate.config.agents.deepseek ¶
DeepSeek Harness configuration.
DeepseekConfig
pydantic-model
¶
Bases: AgentConfig
WIP DeepSeek Harness runner, registered as the deepseek agent tentacle.
The tentacle owns a dsh web child with a private configuration home,
sharing settings and session data with the configured native home.
It drives the harness over the /api gateway — HTTP for unary calls,
the mux WebSocket for events — the
same integration surface dsh's own web client uses. Sessions are
per-conversation: the dsh session id is stored as the conversation
external_id and prompted again for later turns.
Config:
extra:ignore
Fields:
-
enabled(bool) -
gateway(bool) -
type(Literal['deepseek']) -
instrument(bool) -
host(Literal['127.0.0.1', 'localhost']) -
port(int) -
browser_url(HttpUrl | None) -
executable(str) -
extra_args(list[str]) -
dsh_home(ConfigPath) -
claims(dict[str, Claim]) -
permission_mode(DeepseekPermissionMode) -
agent_preset(str | None) -
approval_timeout(float | None) -
ready_timeout(float)
Validators:
Source code in octomate/config/agents/deepseek.py
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | |
instrument
pydantic-field
¶
Record DeepSeek session events under the driving Logfire trace.
host
pydantic-field
¶
Where a dsh serves /api — loopback only, enforced here: the gateway uses HTTP, and a started child binds loopback, so a remote host could neither be trusted nor answered.
port
pydantic-field
¶
Port for Octomate's own DSH child, separate from native DSH's 3080. An occupied port fails startup; existing runtimes are never attached.
browser_url
pydantic-field
¶
Browser origin of a reverse proxy, e.g. https://dsh.example:8443. A started child trusts this authority and prints its login link to the console once. Without this setting the printed link uses the child's loopback URL. Configure the proxy separately; the child still binds loopback.
executable
pydantic-field
¶
The dsh command to spawn dsh web — a name resolved on PATH or an absolute path to a built dsh.
extra_args
pydantic-field
¶
Extra arguments placed after web and before the web app's --host, --port, and --no-open flags, e.g. a --patch overlay managed by Octomate. A dsh that refuses one of these exits and fails the start — only octomate's own --no-open is dropped and retried.
dsh_home
pydantic-field
¶
Native DSH home whose settings.yaml, .credentials.yaml, sessions and attachments are shared with Octomate's child. Its plugins, hooks, MCPs and profile patches are not loaded. The child receives a separate temporary DSH_HOME.
claims
pydantic-field
¶
Metadata for models whose harness omits descriptions or effort capabilities. Keys are provider-qualified model names.
permission_mode
pydantic-field
¶
Permission preset a dsh conversation falls back to when it carries none of its own. dsh's preset bundles sandbox mode and approval policy; switched per session via the /permission command.
agent_preset
pydantic-field
¶
Agent preset new sessions are composed from (session/create's agentPreset). Null takes the deployment's default preset.
approval_timeout
pydantic-field
¶
Seconds to wait for a human approval/answer before the card expires and the dsh request is answered cancelled (so the turn unblocks). An hour by default, because not answering is the ordinary case rather than the exotic one, and an unbounded wait leaves the thread unusable for good. None waits indefinitely.
ready_timeout
pydantic-field
¶
Seconds to wait for the dsh web: readiness banner before the spawn is declared failed.
browser_origin
pydantic-validator
¶
Source code in octomate/config/agents/deepseek.py
octomate.config.agents.inkling ¶
Inkling configuration and tool output policies.
ToolOutputAction ¶
ToolOutputAction = Annotated[
TruncateAction | SpillAction | SummarizeAction,
Field(discriminator="kind"),
]
TruncateAction
pydantic-model
¶
Bases: BaseModel
Clamp the return to a character budget. Lossy, and costs nothing.
Fields:
Source code in octomate/config/agents/inkling.py
max_chars
pydantic-field
¶
Characters kept. Counted in characters even when the bands measure in tokens, since truncation is a character operation.
strategy
pydantic-field
¶
Which end survives: head, tail, or head_tail (both, with the middle elided). tail suits a command's output, where the outcome is at the end; head suits a long listing.
SpillAction
pydantic-model
¶
Bases: BaseModel
Store the return whole and hand the model a handle to it. Lossless.
Fields:
-
kind(Literal['spill']) -
preview_chars(int)
Source code in octomate/config/agents/inkling.py
SummarizeAction
pydantic-model
¶
Bases: BaseModel
Replace the return with an LLM summary. Lossy, and costs a model call.
The summary is written by the run's own model. There is deliberately no model override: a name given here would be resolved by pydantic-ai rather than the provider registry that builds every other model this agent runs on, so the two would disagree about what the same name means.
Fields:
-
kind(Literal['summarize'])
Source code in octomate/config/agents/inkling.py
ToolOutputBand
pydantic-model
¶
Bases: BaseModel
A size threshold, and what a return reaching it is replaced with.
Fields:
-
over(int) -
action(ToolOutputAction)
Source code in octomate/config/agents/inkling.py
ToolOutputConfig
pydantic-model
¶
Bases: BaseModel
What becomes of a tool return too large to sit in the context window.
A tool return persists in history, so an oversized one is re-sent on every later
request for the rest of the conversation. Each return is measured once and the
largest band whose over it reaches claims it; anything under every threshold
is left alone, and bands may be listed in any order. A band that cannot run falls
back to truncation, so the payload is bounded either way.
Fields:
-
enabled(bool) -
bands(list[ToolOutputBand]) -
over_tokens(bool) -
retention_hours(float | None)
Source code in octomate/config/agents/inkling.py
enabled
pydantic-field
¶
Whether oversized tool returns are reduced at all. Turning this off sends every return to the model whole, which is a debugging posture rather than a deployment one.
bands
pydantic-field
¶
Size thresholds and their actions. The default spills past ~10k, keeping the payload readable through read_tool_result, and summarizes past ~100k, where a handle buys the model little — reading a payload that size back costs more calls than the summary it would have to reconstruct. To reduce nothing, set enabled: false rather than emptying this.
over_tokens
pydantic-field
¶
Measure band thresholds in estimated tokens instead of characters, via a ~4-chars-per-token heuristic.
retention_hours
pydantic-field
¶
How long a spilled payload stays readable before it is pruned. A spill outlives its run on purpose, since the handle may be read back turns later, but this host is long-lived and the table would only grow. Null keeps payloads forever.
InklingConfig
pydantic-model
¶
Bases: AgentConfig
The in-process pydantic-ai agent, selected by type: inkling: its models,
request limit, tool-output handling and permission posture.
Fields:
-
enabled(bool) -
gateway(bool) -
type(Literal['inkling']) -
models(list[ModelConfig]) -
naming_model(ModelConfig | None) -
request_limit(int) -
claims(dict[KnownModelName, Claim]) -
tool_output(ToolOutputConfig) -
permission_mode(InklingPermissionMode)
Source code in octomate/config/agents/inkling.py
naming_model
pydantic-field
¶
Model used to name sessions alongside each new user turn. Uses the turn's model when omitted. Resolved through the provider registry with the same credentials and settings as other models.
claims
pydantic-field
¶
Optional per-model descriptions and supported thinking efforts. Every configured model is available to bound channels.
tool_output
pydantic-field
¶
How oversized tool returns are cut down before they reach — and stay in — the model's context.
permission_mode
pydantic-field
¶
Approval posture for an Inkling conversation whose thread is in no project, or whose project declares none. Claude's scale, narrowed to what deferred approvals can resolve.