roboz 0.1.2.dev8__tar.gz → 0.1.2.dev10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/.gitignore +4 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/CHANGELOG.md +15 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/PKG-INFO +19 -21
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/README.md +18 -18
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/pyproject.toml +1 -4
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/agent/core.py +16 -4
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/deployment.py +6 -2
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/LICENSE +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/__init__.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/__init__.pyi +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/_naming.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/agent/__init__.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/agent/_execution_context.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/agent/_identifiers.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/agent/_notifications.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/agent/_prompts.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/agent/_tool_observer.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/agent/background_agent.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/agent/prompt_agent_tool.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/agent/subagent.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/dependencies.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/exceptions.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/__init__.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/_diagnostics.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/_retry.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/_truncation.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/binding.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/calls.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/completion.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/endpoints.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/openai_compatible.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/openrouter.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/llm/prompts.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/models/__init__.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/models/_schema.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/models/_serialization.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/models/_telemetry.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/models/core.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/models/messages.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/models/truncation.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/py.typed +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/__init__.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/_environment.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/_external.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/_logging.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/_paths.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/events.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/io.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/observability.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/persistence/__init__.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/persistence/activity.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/persistence/schema.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/pipe.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/runtime/sinks.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/skill/__init__.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/skill/_prompts.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/skill/core.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tooling/__init__.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tooling/_prompts.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tooling/_protocols.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tooling/_typing.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tooling/context.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tooling/core.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tooling/decorators.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tools/__init__.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tools/_identifiers.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tools/control.py +0 -0
- {roboz-0.1.2.dev8 → roboz-0.1.2.dev10}/src/roboz/tools/interaction.py +0 -0
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.1.2.dev10 - 2026-09-21
|
|
6
|
+
|
|
7
|
+
- Define default tools as scheduler-owned chain roots: downstream tools can now
|
|
8
|
+
reference a default-only parent with `chained_to`, while defaults that are
|
|
9
|
+
themselves chained downstream are rejected during agent construction.
|
|
10
|
+
|
|
11
|
+
## 0.1.2.dev9 - 2026-09-20
|
|
12
|
+
|
|
13
|
+
- Remove the leftover `proton-bridge-beta` installation extra. Install
|
|
14
|
+
`roboz-proton-bridge` directly, consistently with the other independently
|
|
15
|
+
published companion distributions.
|
|
16
|
+
|
|
17
|
+
- Make images and links in the published package description resolve outside
|
|
18
|
+
the GitHub repository.
|
|
19
|
+
|
|
5
20
|
## 0.1.2.dev8 - 2026-09-20
|
|
6
21
|
|
|
7
22
|
- Breaking: remove the legacy agent master tool. Model-driven agents run
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: roboz
|
|
3
|
-
Version: 0.1.2.
|
|
3
|
+
Version: 0.1.2.dev10
|
|
4
4
|
Import-Name: roboz
|
|
5
5
|
Summary: Typed primitives for composable agentic workflows
|
|
6
6
|
Project-URL: Homepage, https://github.com/Tachion-Oy/roboz
|
|
@@ -23,15 +23,13 @@ Requires-Python: >=3.13
|
|
|
23
23
|
Requires-Dist: pydantic>=2.12.4
|
|
24
24
|
Requires-Dist: python-dotenv>=1.2.1
|
|
25
25
|
Requires-Dist: rich>=14.2.0
|
|
26
|
-
Provides-Extra: proton-bridge-beta
|
|
27
|
-
Requires-Dist: roboz-proton-bridge<0.2.0,>=0.1.0b1; extra == 'proton-bridge-beta'
|
|
28
26
|
Description-Content-Type: text/markdown
|
|
29
27
|
|
|
30
28
|
<div align="center">
|
|
31
29
|
<picture>
|
|
32
|
-
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/roboz-logo-dark.svg">
|
|
33
|
-
<source media="(prefers-color-scheme: light)" srcset="docs/assets/roboz-logo-light.svg">
|
|
34
|
-
<img alt="RoboZ" src="docs/assets/roboz-logo-
|
|
30
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/Tachion-Oy/roboz/main/docs/assets/roboz-logo-dark.svg">
|
|
31
|
+
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/Tachion-Oy/roboz/main/docs/assets/roboz-logo-light.svg">
|
|
32
|
+
<img alt="RoboZ" src="https://raw.githubusercontent.com/Tachion-Oy/roboz/main/docs/assets/roboz-logo-light.svg" width="560">
|
|
35
33
|
</picture>
|
|
36
34
|
|
|
37
35
|
<p><strong>Chain tools. Skip calls.</strong></p>
|
|
@@ -41,7 +39,7 @@ RoboZ is a framework for building llm powered agents. The core ingredient is tha
|
|
|
41
39
|
|
|
42
40
|
[](https://github.com/Tachion-Oy/roboz/actions/workflows/ci.yml)
|
|
43
41
|
[](https://www.python.org/downloads/)
|
|
44
|
-
[](LICENSE)
|
|
42
|
+
[](https://github.com/Tachion-Oy/roboz/blob/main/LICENSE)
|
|
45
43
|
|
|
46
44
|
> [!WARNING]
|
|
47
45
|
> RoboZ is pre-release software requiring Python 3.13 or newer. APIs may change
|
|
@@ -49,7 +47,7 @@ RoboZ is a framework for building llm powered agents. The core ingredient is tha
|
|
|
49
47
|
|
|
50
48
|
## Basic idea
|
|
51
49
|
|
|
52
|
-

|
|
50
|
+

|
|
53
51
|
|
|
54
52
|
### Problems to solve: Context bloat and too many llm calls
|
|
55
53
|
Suppose the task we want to achieve is ask our buddy Bob out to lunch and then book a table. For the sake of argument assume that our agent has access to the following MCP servers (Note: this is an example, RoboZ has native Tool primitives):
|
|
@@ -99,8 +97,8 @@ output, messages_ = agent.invoke()
|
|
|
99
97
|
print(f'"{output.value}"')
|
|
100
98
|
```
|
|
101
99
|
|
|
102
|
-
The above [simple example](examples/simple.py) uses the accompanying
|
|
103
|
-
[quote file](examples/simpsons_quotes.py) in this repository. Run it from the
|
|
100
|
+
The above [simple example](https://github.com/Tachion-Oy/roboz/blob/main/examples/simple.py) uses the accompanying
|
|
101
|
+
[quote file](https://github.com/Tachion-Oy/roboz/blob/main/examples/simpsons_quotes.py) in this repository. Run it from the
|
|
104
102
|
repository root with
|
|
105
103
|
|
|
106
104
|
```bash
|
|
@@ -124,7 +122,7 @@ An agent is a loop that calls tools. Everything is defined as a tool: Skills, b
|
|
|
124
122
|
**A tool can be triggered in three ways:**
|
|
125
123
|
- **Invoked by an agent**: The `prompt_agent` tool asks an LLM what to do next and its `Invoke` output always calls another tool. It is constructed internally for `AgentMode.STEERABLE` and `AgentMode.AUTONOMOUS` agents, but it is still just a tool.
|
|
126
124
|
- **By chaining**. After an invoked tool has fired RoboZ checks if a chained tool with a *true* chain condition exists (for more than one *true* condition for a fork you get a runtime error). If yes, the output is passed on and the process repeats until the first broken chain or all chained tools are exhausted
|
|
127
|
-
- **As default tools**.
|
|
125
|
+
- **As default tools**. Defaults are ordered chain roots owned by the scheduler. When no chained successor exists, they run in configuration order; a default may feed downstream tools, and the sequence resumes with the next default after that branch ends. A default cannot itself be downstream, so it cannot declare `chained_to`.
|
|
128
126
|
|
|
129
127
|
RoboZ then collapses to the traditional agentic approach as a special case if one just has the `prompt_agent` as the default with no chaining. An `AgentMode.DETERMINISTIC` agent has no `prompt_agent`; its default tools perform tasks directly, allowing deterministic branching through chaining. This is useful for a background agent that performs periodic maintenance work. `AgentMode.STEERABLE` agents may ask the user for input, while `AgentMode.AUTONOMOUS` agents cannot.
|
|
130
128
|
|
|
@@ -138,16 +136,16 @@ The contract in RoboZ is that every action in the agentic loop is a tool call an
|
|
|
138
136
|
### LLM Endpoints are instances
|
|
139
137
|
As a fundamental design rule in Roboz, everything that depends on an LLM call must be trivially swappable to another provider or model. This makes changing an agent endpoint trivial and furthermore multi-endpoint functionality, where inside a single agent several endpoints are implemented, quite easy.
|
|
140
138
|
|
|
141
|
-
To see the above in practice see the [complex example](examples/complex.py) example below.
|
|
139
|
+
To see the above in practice see the [complex example](https://github.com/Tachion-Oy/roboz/blob/main/examples/complex.py) example below.
|
|
142
140
|
|
|
143
141
|
|
|
144
142
|
|
|
145
143
|
## Chains, factories, truncation and many endpoints
|
|
146
|
-

|
|
144
|
+

|
|
147
145
|
|
|
148
146
|
In the code example below we illustrate some of the features that make RoboZ different from other frameworks.
|
|
149
147
|
|
|
150
|
-
**Tool chaining** is usually introduced via the decorator argument `chained_to
|
|
148
|
+
**Tool chaining** is usually introduced via the decorator argument `chained_to`, which points from a downstream tool to the upstream tool whose output becomes its input (tools also possess a `.chain` method). The input/output contract must be Liskov compatible, i.e. the upstream output must be a subclass of the downstream input. A possible `chain_condition` can be passed in, which by definition has access to the tool's input argument and returns a boolean. The chain condition must evaluate to at most one true condition, but it can evaluate to `false` on all links, in which case scheduling resumes with the next configured default. Defaults may be referenced as upstream parents without also appearing in `tools`, but cannot declare `chained_to` themselves. `AgentMode.STEERABLE` and `AgentMode.AUTONOMOUS` construct a `prompt_agent` tool backed by the agent endpoint; `AgentMode.DETERMINISTIC` uses the configured default tools.
|
|
151
149
|
|
|
152
150
|
The `escalate` is an example of a **tool factory**, which is a simple concept. It accepts a context parameter which is added to the tool's closure and calling the factory with a context argument returns a tool. A very common use case is a tool with an endpoint as a context. In RoboZ all llm **endpoints are instances**, so it is easy to have a specific endpoint for a tool, that is different from that of the agent, below we construct deterministic mock endpoints so that no API keys are required for the examples. Factories have precisely the same chaining arguments in their decorator as a tool.
|
|
153
151
|
|
|
@@ -228,7 +226,7 @@ agent.invoke()
|
|
|
228
226
|
|
|
229
227
|
```
|
|
230
228
|
|
|
231
|
-
The above [complex example](examples/complex.py) can be run from the root with
|
|
229
|
+
The above [complex example](https://github.com/Tachion-Oy/roboz/blob/main/examples/complex.py) can be run from the root with
|
|
232
230
|
|
|
233
231
|
```bash
|
|
234
232
|
uv run python examples/complex.py
|
|
@@ -256,9 +254,9 @@ application only needs to install the parts it uses.
|
|
|
256
254
|
| Distribution | Import | Provides |
|
|
257
255
|
| --- | --- | --- |
|
|
258
256
|
| `roboz` | `roboz` | Core agent, tool, workflow, endpoint, and runtime primitives. |
|
|
259
|
-
| [`roboshed`](
|
|
260
|
-
| [`roboz-endpoints`](
|
|
261
|
-
| [`roboz-proton-bridge`](
|
|
257
|
+
| [`roboshed`](https://pypi.org/project/roboshed/) | `roboshed` | Reusable capabilities, guarded system tools, memory, agents, and deployment building blocks. |
|
|
258
|
+
| [`roboz-endpoints`](https://pypi.org/project/roboz-endpoints/) | `roboz_endpoints` | Model catalogues and optional provider adapters. |
|
|
259
|
+
| [`roboz-proton-bridge`](https://pypi.org/project/roboz-proton-bridge/) | `roboz_proton_bridge` | Proton Bridge email integration. |
|
|
262
260
|
|
|
263
261
|
The companion packages build on `roboz`; `roboz-proton-bridge` also uses
|
|
264
262
|
`roboshed`.
|
|
@@ -273,11 +271,11 @@ uv run pyright
|
|
|
273
271
|
bash scripts/run_type_tests.sh
|
|
274
272
|
```
|
|
275
273
|
|
|
276
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) for development and testing guidance. The
|
|
277
|
-
[verification workflow](.github/workflows/verify.yml) defines the complete CI
|
|
274
|
+
See [CONTRIBUTING.md](https://github.com/Tachion-Oy/roboz/blob/main/CONTRIBUTING.md) for development and testing guidance. The
|
|
275
|
+
[verification workflow](https://github.com/Tachion-Oy/roboz/blob/main/.github/workflows/verify.yml) defines the complete CI
|
|
278
276
|
gate.
|
|
279
277
|
Roboz is typed and ships a PEP 561 `py.typed` marker.
|
|
280
278
|
|
|
281
279
|
## License
|
|
282
280
|
|
|
283
|
-
Roboz is licensed under the [Apache License 2.0](LICENSE). Copyright © 2026 Tachion Oy.
|
|
281
|
+
Roboz is licensed under the [Apache License 2.0](https://github.com/Tachion-Oy/roboz/blob/main/LICENSE). Copyright © 2026 Tachion Oy.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
<picture>
|
|
3
|
-
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/roboz-logo-dark.svg">
|
|
4
|
-
<source media="(prefers-color-scheme: light)" srcset="docs/assets/roboz-logo-light.svg">
|
|
5
|
-
<img alt="RoboZ" src="docs/assets/roboz-logo-
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/Tachion-Oy/roboz/main/docs/assets/roboz-logo-dark.svg">
|
|
4
|
+
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/Tachion-Oy/roboz/main/docs/assets/roboz-logo-light.svg">
|
|
5
|
+
<img alt="RoboZ" src="https://raw.githubusercontent.com/Tachion-Oy/roboz/main/docs/assets/roboz-logo-light.svg" width="560">
|
|
6
6
|
</picture>
|
|
7
7
|
|
|
8
8
|
<p><strong>Chain tools. Skip calls.</strong></p>
|
|
@@ -12,7 +12,7 @@ RoboZ is a framework for building llm powered agents. The core ingredient is tha
|
|
|
12
12
|
|
|
13
13
|
[](https://github.com/Tachion-Oy/roboz/actions/workflows/ci.yml)
|
|
14
14
|
[](https://www.python.org/downloads/)
|
|
15
|
-
[](LICENSE)
|
|
15
|
+
[](https://github.com/Tachion-Oy/roboz/blob/main/LICENSE)
|
|
16
16
|
|
|
17
17
|
> [!WARNING]
|
|
18
18
|
> RoboZ is pre-release software requiring Python 3.13 or newer. APIs may change
|
|
@@ -20,7 +20,7 @@ RoboZ is a framework for building llm powered agents. The core ingredient is tha
|
|
|
20
20
|
|
|
21
21
|
## Basic idea
|
|
22
22
|
|
|
23
|
-

|
|
23
|
+

|
|
24
24
|
|
|
25
25
|
### Problems to solve: Context bloat and too many llm calls
|
|
26
26
|
Suppose the task we want to achieve is ask our buddy Bob out to lunch and then book a table. For the sake of argument assume that our agent has access to the following MCP servers (Note: this is an example, RoboZ has native Tool primitives):
|
|
@@ -70,8 +70,8 @@ output, messages_ = agent.invoke()
|
|
|
70
70
|
print(f'"{output.value}"')
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
The above [simple example](examples/simple.py) uses the accompanying
|
|
74
|
-
[quote file](examples/simpsons_quotes.py) in this repository. Run it from the
|
|
73
|
+
The above [simple example](https://github.com/Tachion-Oy/roboz/blob/main/examples/simple.py) uses the accompanying
|
|
74
|
+
[quote file](https://github.com/Tachion-Oy/roboz/blob/main/examples/simpsons_quotes.py) in this repository. Run it from the
|
|
75
75
|
repository root with
|
|
76
76
|
|
|
77
77
|
```bash
|
|
@@ -95,7 +95,7 @@ An agent is a loop that calls tools. Everything is defined as a tool: Skills, b
|
|
|
95
95
|
**A tool can be triggered in three ways:**
|
|
96
96
|
- **Invoked by an agent**: The `prompt_agent` tool asks an LLM what to do next and its `Invoke` output always calls another tool. It is constructed internally for `AgentMode.STEERABLE` and `AgentMode.AUTONOMOUS` agents, but it is still just a tool.
|
|
97
97
|
- **By chaining**. After an invoked tool has fired RoboZ checks if a chained tool with a *true* chain condition exists (for more than one *true* condition for a fork you get a runtime error). If yes, the output is passed on and the process repeats until the first broken chain or all chained tools are exhausted
|
|
98
|
-
- **As default tools**.
|
|
98
|
+
- **As default tools**. Defaults are ordered chain roots owned by the scheduler. When no chained successor exists, they run in configuration order; a default may feed downstream tools, and the sequence resumes with the next default after that branch ends. A default cannot itself be downstream, so it cannot declare `chained_to`.
|
|
99
99
|
|
|
100
100
|
RoboZ then collapses to the traditional agentic approach as a special case if one just has the `prompt_agent` as the default with no chaining. An `AgentMode.DETERMINISTIC` agent has no `prompt_agent`; its default tools perform tasks directly, allowing deterministic branching through chaining. This is useful for a background agent that performs periodic maintenance work. `AgentMode.STEERABLE` agents may ask the user for input, while `AgentMode.AUTONOMOUS` agents cannot.
|
|
101
101
|
|
|
@@ -109,16 +109,16 @@ The contract in RoboZ is that every action in the agentic loop is a tool call an
|
|
|
109
109
|
### LLM Endpoints are instances
|
|
110
110
|
As a fundamental design rule in Roboz, everything that depends on an LLM call must be trivially swappable to another provider or model. This makes changing an agent endpoint trivial and furthermore multi-endpoint functionality, where inside a single agent several endpoints are implemented, quite easy.
|
|
111
111
|
|
|
112
|
-
To see the above in practice see the [complex example](examples/complex.py) example below.
|
|
112
|
+
To see the above in practice see the [complex example](https://github.com/Tachion-Oy/roboz/blob/main/examples/complex.py) example below.
|
|
113
113
|
|
|
114
114
|
|
|
115
115
|
|
|
116
116
|
## Chains, factories, truncation and many endpoints
|
|
117
|
-

|
|
117
|
+

|
|
118
118
|
|
|
119
119
|
In the code example below we illustrate some of the features that make RoboZ different from other frameworks.
|
|
120
120
|
|
|
121
|
-
**Tool chaining** is usually introduced via the decorator argument `chained_to
|
|
121
|
+
**Tool chaining** is usually introduced via the decorator argument `chained_to`, which points from a downstream tool to the upstream tool whose output becomes its input (tools also possess a `.chain` method). The input/output contract must be Liskov compatible, i.e. the upstream output must be a subclass of the downstream input. A possible `chain_condition` can be passed in, which by definition has access to the tool's input argument and returns a boolean. The chain condition must evaluate to at most one true condition, but it can evaluate to `false` on all links, in which case scheduling resumes with the next configured default. Defaults may be referenced as upstream parents without also appearing in `tools`, but cannot declare `chained_to` themselves. `AgentMode.STEERABLE` and `AgentMode.AUTONOMOUS` construct a `prompt_agent` tool backed by the agent endpoint; `AgentMode.DETERMINISTIC` uses the configured default tools.
|
|
122
122
|
|
|
123
123
|
The `escalate` is an example of a **tool factory**, which is a simple concept. It accepts a context parameter which is added to the tool's closure and calling the factory with a context argument returns a tool. A very common use case is a tool with an endpoint as a context. In RoboZ all llm **endpoints are instances**, so it is easy to have a specific endpoint for a tool, that is different from that of the agent, below we construct deterministic mock endpoints so that no API keys are required for the examples. Factories have precisely the same chaining arguments in their decorator as a tool.
|
|
124
124
|
|
|
@@ -199,7 +199,7 @@ agent.invoke()
|
|
|
199
199
|
|
|
200
200
|
```
|
|
201
201
|
|
|
202
|
-
The above [complex example](examples/complex.py) can be run from the root with
|
|
202
|
+
The above [complex example](https://github.com/Tachion-Oy/roboz/blob/main/examples/complex.py) can be run from the root with
|
|
203
203
|
|
|
204
204
|
```bash
|
|
205
205
|
uv run python examples/complex.py
|
|
@@ -227,9 +227,9 @@ application only needs to install the parts it uses.
|
|
|
227
227
|
| Distribution | Import | Provides |
|
|
228
228
|
| --- | --- | --- |
|
|
229
229
|
| `roboz` | `roboz` | Core agent, tool, workflow, endpoint, and runtime primitives. |
|
|
230
|
-
| [`roboshed`](
|
|
231
|
-
| [`roboz-endpoints`](
|
|
232
|
-
| [`roboz-proton-bridge`](
|
|
230
|
+
| [`roboshed`](https://pypi.org/project/roboshed/) | `roboshed` | Reusable capabilities, guarded system tools, memory, agents, and deployment building blocks. |
|
|
231
|
+
| [`roboz-endpoints`](https://pypi.org/project/roboz-endpoints/) | `roboz_endpoints` | Model catalogues and optional provider adapters. |
|
|
232
|
+
| [`roboz-proton-bridge`](https://pypi.org/project/roboz-proton-bridge/) | `roboz_proton_bridge` | Proton Bridge email integration. |
|
|
233
233
|
|
|
234
234
|
The companion packages build on `roboz`; `roboz-proton-bridge` also uses
|
|
235
235
|
`roboshed`.
|
|
@@ -244,11 +244,11 @@ uv run pyright
|
|
|
244
244
|
bash scripts/run_type_tests.sh
|
|
245
245
|
```
|
|
246
246
|
|
|
247
|
-
See [CONTRIBUTING.md](CONTRIBUTING.md) for development and testing guidance. The
|
|
248
|
-
[verification workflow](.github/workflows/verify.yml) defines the complete CI
|
|
247
|
+
See [CONTRIBUTING.md](https://github.com/Tachion-Oy/roboz/blob/main/CONTRIBUTING.md) for development and testing guidance. The
|
|
248
|
+
[verification workflow](https://github.com/Tachion-Oy/roboz/blob/main/.github/workflows/verify.yml) defines the complete CI
|
|
249
249
|
gate.
|
|
250
250
|
Roboz is typed and ships a PEP 561 `py.typed` marker.
|
|
251
251
|
|
|
252
252
|
## License
|
|
253
253
|
|
|
254
|
-
Roboz is licensed under the [Apache License 2.0](LICENSE). Copyright © 2026 Tachion Oy.
|
|
254
|
+
Roboz is licensed under the [Apache License 2.0](https://github.com/Tachion-Oy/roboz/blob/main/LICENSE). Copyright © 2026 Tachion Oy.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "roboz"
|
|
3
|
-
version = "0.1.2.
|
|
3
|
+
version = "0.1.2.dev10"
|
|
4
4
|
description = "Typed primitives for composable agentic workflows"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [{ name = "Tachion Oy" }]
|
|
@@ -29,9 +29,6 @@ dependencies = [
|
|
|
29
29
|
requires = ["hatchling>=1.32"]
|
|
30
30
|
build-backend = "hatchling.build"
|
|
31
31
|
|
|
32
|
-
[project.optional-dependencies]
|
|
33
|
-
proton-bridge-beta = ["roboz-proton-bridge>=0.1.0b1,<0.2.0"]
|
|
34
|
-
|
|
35
32
|
[tool.uv.workspace]
|
|
36
33
|
members = ["packages/*"]
|
|
37
34
|
|
|
@@ -83,6 +83,14 @@ class Agent(HasExternalDependencies):
|
|
|
83
83
|
list of callbacks attached to a newly created pipe. Hosts compose CLI,
|
|
84
84
|
run-scoped, process-scoped, or agent-specific callbacks before creating the
|
|
85
85
|
agent; Agent does not construct or distinguish those scopes.
|
|
86
|
+
|
|
87
|
+
``default_tools`` are scheduler-owned chain roots. The scheduler runs them in
|
|
88
|
+
configuration order whenever the current tool has no chained successor, then
|
|
89
|
+
repeats that sequence in the next cycle. A downstream tool may declare
|
|
90
|
+
``chained_to=default_tool``; when that branch ends, scheduling resumes with the
|
|
91
|
+
next configured default. A default tool cannot itself declare ``chained_to``
|
|
92
|
+
because defaults cannot be downstream tools. Default-only tools remain hidden
|
|
93
|
+
from the model-facing active and passive registries.
|
|
86
94
|
"""
|
|
87
95
|
|
|
88
96
|
def __init__(
|
|
@@ -280,23 +288,27 @@ class Agent(HasExternalDependencies):
|
|
|
280
288
|
|
|
281
289
|
def _init_tools(self, *, tools: Sequence[Tool], skill: Skill | None):
|
|
282
290
|
for t in self.default_tools:
|
|
291
|
+
if t.chained_to:
|
|
292
|
+
raise ValueError(
|
|
293
|
+
f"Default tool '{t.name}' cannot declare chained_to"
|
|
294
|
+
)
|
|
283
295
|
if any(
|
|
284
296
|
issubclass(output_type, Invoke)
|
|
285
297
|
for output_type in get_constituent_types(t.OutputModel)
|
|
286
298
|
):
|
|
287
299
|
raise ValueError(f"Default tool '{t.name}' cannot return Invoke")
|
|
288
300
|
|
|
289
|
-
|
|
301
|
+
registered_tools = set(tools)
|
|
290
302
|
if skill:
|
|
291
|
-
|
|
303
|
+
registered_tools |= set(skill.tools)
|
|
292
304
|
|
|
293
|
-
for t in
|
|
305
|
+
for t in registered_tools:
|
|
294
306
|
if t.chained_to:
|
|
295
307
|
self.passive_tools[t.id] = t
|
|
296
308
|
continue
|
|
297
309
|
self.active_tools[t.id] = t
|
|
298
310
|
self._init_prompt_agent_tool()
|
|
299
|
-
self._validate_tool_chains(
|
|
311
|
+
self._validate_tool_chains(registered_tools | set(self.default_tools))
|
|
300
312
|
|
|
301
313
|
def external_dependencies(
|
|
302
314
|
self,
|
|
@@ -41,8 +41,12 @@ class AgentCapability(Protocol):
|
|
|
41
41
|
class Capability(AgentCapability):
|
|
42
42
|
"""Already-bound tools and skills that provide an agent feature.
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
``default_tools`` are ordered, repeatedly scheduled chain roots. A tool in
|
|
45
|
+
``tools`` may declare ``chained_to`` with one of those defaults as its parent,
|
|
46
|
+
and scheduling resumes with the next default when the downstream branch ends.
|
|
47
|
+
Defaults cannot themselves declare ``chained_to``. Tools shared between
|
|
48
|
+
``tools`` and ``default_tools`` retain their identity. Supplied objects remain
|
|
49
|
+
caller-owned and require no owner configuration.
|
|
46
50
|
"""
|
|
47
51
|
|
|
48
52
|
tools: tuple[Tool | Sequence[Tool], ...] = ()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|