teff.tool.agent¶
teff.tool.agent
¶
Sub-agent tools: a Tool that drives a short ReAct loop.
An :class:AgentTool wraps a sub-agent (:class:~teff.harness.Harness)
inside a single tool, so a coordinator node can treat a domain expert as an
ordinary tool (schema, routing, retry and approval all come free) while the
expert still runs its own LLM loop over a slice of the tool set.
The framework owns all of the plumbing — building the sub-Harness from
the active :class:~teff.node.context.ExecContext (providers, tracer,
on_llm_payload) and threading the enclosing workflow state in via
the runtime __state__ / __ctx__ kwargs (see
:func:teff.harness.tools). Subclasses only declare content: the system
prompt, the user message and how to handle the final reply.
Classes:
| Name | Description |
|---|---|
AgentTool |
A tool that runs a sub-agent ReAct loop over a slice of the tool set. |
AgentTool
¶
Bases: Tool
A tool that runs a sub-agent ReAct loop over a slice of the tool set.
Subclasses declare content and leave the LLM plumbing to this class:
system— the sub-agent system message (a constant, or override :meth:system_promptfor state-dependent text);tools— the slice of the tool set the sub-agent may call, as a mapping{name: Tool}or a plain iterable of :class:Toolinstances (keyed bytool.name);user_message— a template with{placeholder}fields resolved against state:{state_key}takes the value of that key, and derived values (e.g. a schema-renderedproject_info) go through theformattersmapping; override :meth:user_messagefor fully custom messages;- :meth:
handle_reply— turn the final reply into the tool result and, optionally, write results back into state.
For the common shapes the constructor takes:
writes=("plan",) copies the raw reply text into those state keys
(with :meth:handle_reply returning the text), and :meth:json_reply
parses a JSON reply against a schema.
The runtime injects __state__ / __ctx__ (see
:func:teff.harness.tools); anything :meth:handle_reply writes into
state is copied back into the enclosing workflow state.
Methods:
| Name | Description |
|---|---|
arun |
Run the sub-agent and surface the handled reply as the result. |
handle_reply |
Post-process the final reply into the tool result. |
json_reply |
Parse the final reply as a JSON object matching schema. |
system_prompt |
Return the sub-agent's system message (may read state). |
user_message |
Return the sub-agent's user message (may read state). |
Source code in teff/tool/agent.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 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | |
arun
async
¶
arun(*, __state__=None, __ctx__=None, **kwargs)
Run the sub-agent and surface the handled reply as the result.
Source code in teff/tool/agent.py
193 194 195 196 197 198 199 200 201 202 203 204 | |
handle_reply
¶
handle_reply(state, reply)
Post-process the final reply into the tool result.
May read and write state; writes are copied back into the
enclosing workflow state. reply is the final
:class:~teff.harness.loop.Step (reply.content holds the text).
Default: copy the reply text into each writes key and return it.
Source code in teff/tool/agent.py
123 124 125 126 127 128 129 130 131 132 133 134 135 | |
json_reply
¶
json_reply(reply, schema)
Parse the final reply as a JSON object matching schema.
Returns the parsed dict, or None when the reply is not valid
JSON (or fails validation) — failures fall back to None rather
than raising, mirroring how structured outputs are best-effort.
Source code in teff/tool/agent.py
137 138 139 140 141 142 143 144 145 146 147 148 149 150 | |
system_prompt
¶
system_prompt(state)
Return the sub-agent's system message (may read state).
Source code in teff/tool/agent.py
90 91 92 | |
user_message
¶
user_message(state)
Return the sub-agent's user message (may read state).
Default: render the user_template constructor param, resolving
{name} fields via formatters[name](state) when registered,
else from state[name] (empty when absent). Override for fully
custom messages that don't fit the template.
Source code in teff/tool/agent.py
94 95 96 97 98 99 100 101 102 103 104 | |