roboz 0.1.2.dev10__tar.gz → 0.1.2.dev12__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.
Files changed (148) hide show
  1. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/CHANGELOG.md +23 -1
  2. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/PKG-INFO +90 -24
  3. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/README.md +87 -22
  4. roboz-0.1.2.dev12/docs/catalogues.md +156 -0
  5. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/pyproject.toml +12 -17
  6. roboz-0.1.2.dev12/src/roboz/endpoints/__init__.py +1 -0
  7. roboz-0.1.2.dev12/src/roboz/endpoints/__main__.py +7 -0
  8. roboz-0.1.2.dev12/src/roboz/endpoints/_inventory_codec.py +281 -0
  9. roboz-0.1.2.dev12/src/roboz/endpoints/_inventory_codegen.py +126 -0
  10. roboz-0.1.2.dev12/src/roboz/endpoints/adapters/__init__.py +1 -0
  11. roboz-0.1.2.dev12/src/roboz/endpoints/adapters/openai_compatible.py +250 -0
  12. roboz-0.1.2.dev12/src/roboz/endpoints/catalog.py +89 -0
  13. roboz-0.1.2.dev12/src/roboz/endpoints/catalog.pyi +35 -0
  14. roboz-0.1.2.dev12/src/roboz/endpoints/cli.py +281 -0
  15. roboz-0.1.2.dev12/src/roboz/endpoints/inventory.py +63 -0
  16. roboz-0.1.2.dev12/src/roboz/endpoints/inventory.pyi +37 -0
  17. roboz-0.1.2.dev12/src/roboz/endpoints/specs.py +40 -0
  18. roboz-0.1.2.dev12/src/roboz/examples/__init__.py +1 -0
  19. roboz-0.1.2.dev12/src/roboz/examples/complex.py +72 -0
  20. roboz-0.1.2.dev12/src/roboz/examples/simple.py +36 -0
  21. roboz-0.1.2.dev12/src/roboz/examples/simpsons_quotes.py +44 -0
  22. roboz-0.1.2.dev12/src/roboz/shed/__init__.py +1 -0
  23. roboz-0.1.2.dev12/src/roboz/shed/agents/__init__.py +6 -0
  24. roboz-0.1.2.dev12/src/roboz/shed/agents/librarian.py +50 -0
  25. roboz-0.1.2.dev12/src/roboz/shed/agents/orchestrator.py +49 -0
  26. roboz-0.1.2.dev12/src/roboz/shed/capabilities.py +354 -0
  27. roboz-0.1.2.dev12/src/roboz/shed/dependency_health.py +328 -0
  28. roboz-0.1.2.dev12/src/roboz/shed/deployments/__init__.py +5 -0
  29. roboz-0.1.2.dev12/src/roboz/shed/deployments/robosprawl.py +75 -0
  30. roboz-0.1.2.dev12/src/roboz/shed/identifiers.py +30 -0
  31. roboz-0.1.2.dev12/src/roboz/shed/models.py +242 -0
  32. roboz-0.1.2.dev12/src/roboz/shed/sandbox.py +226 -0
  33. roboz-0.1.2.dev12/src/roboz/shed/skills/__init__.py +8 -0
  34. roboz-0.1.2.dev12/src/roboz/shed/skills/cli_tools/__init__.py +10 -0
  35. roboz-0.1.2.dev12/src/roboz/shed/skills/cli_tools/prompts.py +195 -0
  36. roboz-0.1.2.dev12/src/roboz/shed/skills/email_tools/__init__.py +10 -0
  37. roboz-0.1.2.dev12/src/roboz/shed/skills/email_tools/prompts.py +125 -0
  38. roboz-0.1.2.dev12/src/roboz/shed/skills/file_editing/__init__.py +27 -0
  39. roboz-0.1.2.dev12/src/roboz/shed/skills/file_editing/prompts.py +149 -0
  40. roboz-0.1.2.dev12/src/roboz/shed/skills/robosprawl.py +143 -0
  41. roboz-0.1.2.dev12/src/roboz/shed/tools/__init__.py +52 -0
  42. roboz-0.1.2.dev12/src/roboz/shed/tools/_snapshot_metadata.py +90 -0
  43. roboz-0.1.2.dev12/src/roboz/shed/tools/apply_patch.py +194 -0
  44. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/__init__.py +23 -0
  45. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/run_file_command/__init__.py +12 -0
  46. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/run_file_command/command.py +162 -0
  47. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/run_file_command/resolve.py +388 -0
  48. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/run_file_command/specs.py +131 -0
  49. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/utilities/__init__.py +80 -0
  50. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/utilities/cmd_spec.py +48 -0
  51. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/utilities/constants.py +36 -0
  52. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/utilities/formatting.py +252 -0
  53. roboz-0.1.2.dev12/src/roboz/shed/tools/cli_commands/utilities/path_extractors.py +179 -0
  54. roboz-0.1.2.dev12/src/roboz/shed/tools/compactification/__init__.py +35 -0
  55. roboz-0.1.2.dev12/src/roboz/shed/tools/compactification/compactify_messages.py +260 -0
  56. roboz-0.1.2.dev12/src/roboz/shed/tools/compactification/prompts.py +107 -0
  57. roboz-0.1.2.dev12/src/roboz/shed/tools/compactification/summarize.py +279 -0
  58. roboz-0.1.2.dev12/src/roboz/shed/tools/compactification/summary_prompts.py +61 -0
  59. roboz-0.1.2.dev12/src/roboz/shed/tools/consolidate_memory.py +287 -0
  60. roboz-0.1.2.dev12/src/roboz/shed/tools/consolidate_memory_example.py +110 -0
  61. roboz-0.1.2.dev12/src/roboz/shed/tools/consolidate_memory_prompts.py +110 -0
  62. roboz-0.1.2.dev12/src/roboz/shed/tools/contexts.py +170 -0
  63. roboz-0.1.2.dev12/src/roboz/shed/tools/email/__init__.py +54 -0
  64. roboz-0.1.2.dev12/src/roboz/shed/tools/email/contracts.py +244 -0
  65. roboz-0.1.2.dev12/src/roboz/shed/tools/email/drafts.py +414 -0
  66. roboz-0.1.2.dev12/src/roboz/shed/tools/email/factory.py +266 -0
  67. roboz-0.1.2.dev12/src/roboz/shed/tools/email/inputs.py +66 -0
  68. roboz-0.1.2.dev12/src/roboz/shed/tools/email/messages.py +248 -0
  69. roboz-0.1.2.dev12/src/roboz/shed/tools/email/runtime.py +31 -0
  70. roboz-0.1.2.dev12/src/roboz/shed/tools/guard.py +161 -0
  71. roboz-0.1.2.dev12/src/roboz/shed/tools/guard_formatting.py +58 -0
  72. roboz-0.1.2.dev12/src/roboz/shed/tools/librarian_errors.py +8 -0
  73. roboz-0.1.2.dev12/src/roboz/shed/tools/memory_files.py +117 -0
  74. roboz-0.1.2.dev12/src/roboz/shed/tools/purge_files.py +98 -0
  75. roboz-0.1.2.dev12/src/roboz/shed/tools/runner.py +251 -0
  76. roboz-0.1.2.dev12/src/roboz/shed/tools/sleep_between_runs.py +63 -0
  77. roboz-0.1.2.dev12/src/roboz/shed/tools/snapshot_conversation_example.py +38 -0
  78. roboz-0.1.2.dev12/src/roboz/shed/tools/snapshot_conversation_prompts.py +89 -0
  79. roboz-0.1.2.dev12/src/roboz/shed/tools/snapshot_conversations.py +320 -0
  80. roboz-0.1.2.dev12/src/roboz/shed/tools/snapshot_normalize.py +61 -0
  81. roboz-0.1.2.dev12/src/roboz/shed/tools/stop_when_watched_agents_inactive.py +50 -0
  82. roboz-0.1.2.dev12/src/roboz/shed/tools/truncation.py +20 -0
  83. roboz-0.1.2.dev12/src/roboz/shed/tools/types.py +30 -0
  84. roboz-0.1.2.dev12/src/roboz/shed/tools/utils.py +252 -0
  85. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/.gitignore +0 -0
  86. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/LICENSE +0 -0
  87. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/__init__.py +0 -0
  88. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/__init__.pyi +0 -0
  89. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/_naming.py +0 -0
  90. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/agent/__init__.py +0 -0
  91. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/agent/_execution_context.py +0 -0
  92. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/agent/_identifiers.py +0 -0
  93. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/agent/_notifications.py +0 -0
  94. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/agent/_prompts.py +0 -0
  95. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/agent/_tool_observer.py +0 -0
  96. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/agent/background_agent.py +0 -0
  97. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/agent/core.py +0 -0
  98. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/agent/prompt_agent_tool.py +0 -0
  99. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/agent/subagent.py +0 -0
  100. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/dependencies.py +0 -0
  101. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/deployment.py +0 -0
  102. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/exceptions.py +0 -0
  103. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/__init__.py +0 -0
  104. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/_diagnostics.py +0 -0
  105. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/_retry.py +0 -0
  106. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/_truncation.py +0 -0
  107. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/binding.py +0 -0
  108. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/calls.py +0 -0
  109. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/completion.py +0 -0
  110. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/endpoints.py +0 -0
  111. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/openai_compatible.py +0 -0
  112. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/openrouter.py +0 -0
  113. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/llm/prompts.py +0 -0
  114. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/models/__init__.py +0 -0
  115. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/models/_schema.py +0 -0
  116. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/models/_serialization.py +0 -0
  117. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/models/_telemetry.py +0 -0
  118. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/models/core.py +0 -0
  119. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/models/messages.py +0 -0
  120. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/models/truncation.py +0 -0
  121. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/py.typed +0 -0
  122. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/__init__.py +0 -0
  123. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/_environment.py +0 -0
  124. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/_external.py +0 -0
  125. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/_logging.py +0 -0
  126. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/_paths.py +0 -0
  127. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/events.py +0 -0
  128. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/io.py +0 -0
  129. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/observability.py +0 -0
  130. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/persistence/__init__.py +0 -0
  131. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/persistence/activity.py +0 -0
  132. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/persistence/schema.py +0 -0
  133. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/pipe.py +0 -0
  134. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/runtime/sinks.py +0 -0
  135. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/skill/__init__.py +0 -0
  136. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/skill/_prompts.py +0 -0
  137. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/skill/core.py +0 -0
  138. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tooling/__init__.py +0 -0
  139. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tooling/_prompts.py +0 -0
  140. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tooling/_protocols.py +0 -0
  141. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tooling/_typing.py +0 -0
  142. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tooling/context.py +0 -0
  143. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tooling/core.py +0 -0
  144. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tooling/decorators.py +0 -0
  145. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tools/__init__.py +0 -0
  146. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tools/_identifiers.py +0 -0
  147. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tools/control.py +0 -0
  148. {roboz-0.1.2.dev10 → roboz-0.1.2.dev12}/src/roboz/tools/interaction.py +0 -0
@@ -2,6 +2,28 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.1.2.dev12 - 2026-09-21
6
+
7
+ - Breaking: consolidate core, Shed, and Endpoints into the `roboz`
8
+ distribution. Replace `roboshed` imports with `roboz.shed` and
9
+ `roboz_endpoints` imports with `roboz.endpoints`; no compatibility packages
10
+ or forwarding namespaces are provided.
11
+ - Install the OpenAI SDK as a required dependency while retaining deferred
12
+ endpoint client construction and credential-free imports. Remove package
13
+ extras and the `roboz-endpoints` executable; manage catalogues with
14
+ `python -m roboz.endpoints inventory`.
15
+ - Exclude Proton Bridge from the consolidated distribution. Its pre-migration
16
+ implementation and development setup remain preserved on the
17
+ `wip/proton-bridge` branch.
18
+ - Consolidate package documentation into the main README and move the detailed
19
+ project catalogue guide to `docs/catalogues.md`.
20
+
21
+ ## 0.1.2.dev11 - 2026-09-21
22
+
23
+ - Ship the simple and complex examples in `roboz.examples`, so installed users
24
+ can run the credential-free agent demo with `python -m roboz.examples.simple`
25
+ without cloning the repository.
26
+
5
27
  ## 0.1.2.dev10 - 2026-09-21
6
28
 
7
29
  - Define default tools as scheduler-owned chain roots: downstream tools can now
@@ -166,7 +188,7 @@
166
188
 
167
189
  - Breaking: remove the `roboz[openai]` extra. Install
168
190
  `roboz-endpoints[openai]` directly for the endpoint catalogue and SDK adapter;
169
- it installs core automatically. See `packages/endpoints/README.md` for migration.
191
+ it installs core automatically.
170
192
 
171
193
  - Breaking: move dependency primitives from `roboz.tooling.dependencies` and
172
194
  `roboz.tooling` to `roboz.dependencies`. Update those imports; the existing
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: roboz
3
- Version: 0.1.2.dev10
3
+ Version: 0.1.2.dev12
4
4
  Import-Name: roboz
5
- Summary: Typed primitives for composable agentic workflows
5
+ Summary: Typed agents, reusable capabilities, and model catalogues
6
6
  Project-URL: Homepage, https://github.com/Tachion-Oy/roboz
7
7
  Project-URL: Repository, https://github.com/Tachion-Oy/roboz
8
8
  Project-URL: Issues, https://github.com/Tachion-Oy/roboz/issues
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.13
20
20
  Classifier: Programming Language :: Python :: 3.14
21
21
  Classifier: Typing :: Typed
22
22
  Requires-Python: >=3.13
23
+ Requires-Dist: openai<3,>=2.8.1
23
24
  Requires-Dist: pydantic>=2.12.4
24
25
  Requires-Dist: python-dotenv>=1.2.1
25
26
  Requires-Dist: rich>=14.2.0
@@ -69,9 +70,8 @@ Chaining not only reduces the llm calls, but it also provides a useful way of in
69
70
  ```python
70
71
  from random import choice
71
72
 
72
- from simpsons_quotes import QUOTES
73
-
74
73
  from roboz import Agent, tool
74
+ from roboz.examples.simpsons_quotes import QUOTES
75
75
  from roboz.llm.endpoints import MockLLMEndpoint
76
76
  from roboz.models import Empty, Message, Stop
77
77
 
@@ -97,12 +97,12 @@ output, messages_ = agent.invoke()
97
97
  print(f'"{output.value}"')
98
98
  ```
99
99
 
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
102
- repository root with
100
+ The above [simple example](https://github.com/Tachion-Oy/roboz/blob/main/src/roboz/examples/simple.py) uses the accompanying
101
+ [quote file](https://github.com/Tachion-Oy/roboz/blob/main/src/roboz/examples/simpsons_quotes.py). First add RoboZ to your
102
+ environment as shown in [Try it out](#try-it-out), then run it with
103
103
 
104
104
  ```bash
105
- uv run python examples/simple.py
105
+ uv run python -m roboz.examples.simple
106
106
  ```
107
107
  It creates an agent that returns a random
108
108
  Simpsons quote. **The docstring in the tool is the instruction that the agent sees**. It uses a mock endpoint, with pre-determined replies, so you can run it without API keys.
@@ -136,7 +136,7 @@ The contract in RoboZ is that every action in the agentic loop is a tool call an
136
136
  ### LLM Endpoints are instances
137
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.
138
138
 
139
- To see the above in practice see the [complex example](https://github.com/Tachion-Oy/roboz/blob/main/examples/complex.py) example below.
139
+ To see the above in practice see the [complex example](https://github.com/Tachion-Oy/roboz/blob/main/src/roboz/examples/complex.py) below.
140
140
 
141
141
 
142
142
 
@@ -226,40 +226,106 @@ agent.invoke()
226
226
 
227
227
  ```
228
228
 
229
- The above [complex example](https://github.com/Tachion-Oy/roboz/blob/main/examples/complex.py) can be run from the root with
229
+ The above [complex example](https://github.com/Tachion-Oy/roboz/blob/main/src/roboz/examples/complex.py) is also bundled with
230
+ RoboZ. First add the library to your environment as shown in
231
+ [Try it out](#try-it-out), then run it with
230
232
 
231
233
  ```bash
232
- uv run python examples/complex.py
234
+ uv run python -m roboz.examples.complex
233
235
  ```
234
236
 
235
237
 
236
238
  ## Try it out
237
239
 
240
+ Add RoboZ to a uv project and run the same bundled example. The one dependency
241
+ includes the core framework, Shed, Endpoints, and the OpenAI SDK:
242
+
238
243
  ```bash
239
244
  uv add roboz
245
+ uv run python -m roboz.examples.simple
240
246
  ```
241
247
 
242
- Or with pip:
248
+ or with pip, install RoboZ into the active environment first:
243
249
 
244
250
  ```bash
245
251
  python -m pip install roboz
252
+ python -m roboz.examples.simple
253
+ ```
254
+
255
+ ## Shed
256
+
257
+ `roboz.shed` provides reusable components built on the core primitives. Use an
258
+ individual guarded file or email tool, add a capability to a
259
+ `DeployableAgent`, start from the orchestrator and Librarian definitions, or use
260
+ the RoboSprawl recipe to assemble a persistent project agent. Applications own
261
+ the model endpoints, event sinks, lifecycle, and filesystem layout.
262
+
263
+ - `roboz.shed.agents` contains the orchestrator and Librarian definitions.
264
+ - `roboz.shed.capabilities` binds reusable behavior to agent configuration.
265
+ - `roboz.shed.tools` contains guarded file commands, patching, email contracts,
266
+ conversation compaction, snapshots, memory consolidation, and retention.
267
+ - `roboz.shed.skills` supplies the agent instructions for those tools.
268
+ - `roboz.shed.sandbox` defines filesystem scopes and tool permission policies.
269
+ - `roboz.shed.dependency_health` checks configured external resources.
270
+
271
+ Shed permission policies guard Shed tools. They are not an operating-system
272
+ sandbox.
273
+
274
+ ## Endpoints and model catalogues
275
+
276
+ `roboz.endpoints` builds concrete `LLMEndpoint` and `TranscriptionEndpoint`
277
+ objects for OpenAI-compatible APIs. The OpenAI SDK is installed with RoboZ, but
278
+ client construction and credential lookup remain deferred until an endpoint is
279
+ materialized or used. Importing and inspecting the bundled catalogue needs no
280
+ credentials:
281
+
282
+ ```python
283
+ from roboz.endpoints.inventory import openrouter
284
+
285
+ endpoint = openrouter.z_ai__glm_5_3
286
+ print(endpoint.model_name)
287
+ print(endpoint.max_context_tokens)
246
288
  ```
247
289
 
248
- ## Packages
290
+ The bundled OpenRouter, Cerebras, and Groq entries are examples. Export them to
291
+ an editable project catalogue, change `models.json`, then generate the Python
292
+ snapshot:
249
293
 
250
- This repository contains four independently versioned Python distributions.
251
- They share development and release tooling, but are published separately so an
252
- application only needs to install the parts it uses.
294
+ ```bash
295
+ uv run python -m roboz.endpoints inventory export
296
+ # Edit model_catalogue/models.json.
297
+ uv run python -m roboz.endpoints inventory import
298
+ ```
253
299
 
254
- | Distribution | Import | Provides |
255
- | --- | --- | --- |
256
- | `roboz` | `roboz` | Core agent, tool, workflow, endpoint, and runtime primitives. |
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. |
300
+ For a src-layout project named `my-app`, the commands create
301
+ `src/my_app/model_catalogue/models.json` and
302
+ `src/my_app/model_catalogue/providers.py`. Import the generated catalogue from
303
+ your application package:
304
+
305
+ ```python
306
+ from my_app.model_catalogue.providers import my_service
307
+
308
+ endpoint = my_service.chat
309
+ ```
260
310
 
261
- The companion packages build on `roboz`; `roboz-proton-bridge` also uses
262
- `roboshed`.
311
+ Only OpenAI-compatible API protocols are supported. An inventory entry records
312
+ a provider URL, the name of its credential environment variable, and its model
313
+ routes; it never stores the credential itself. See the
314
+ [project catalogue guide](docs/catalogues.md) for custom paths, inventory
315
+ format, reset, and recovery.
316
+
317
+ ## Module map
318
+
319
+ | Module | Provides |
320
+ | --- | --- |
321
+ | `roboz` | Agent, tool, factory, and skill authoring facade. |
322
+ | `roboz.agent` | Agent implementations, subagents, and background agents. |
323
+ | `roboz.deployment` | Reusable agent definitions and capabilities. |
324
+ | `roboz.llm` | Endpoint contracts, selection, calls, and request policies. |
325
+ | `roboz.models` | Typed messages and tool input/output models. |
326
+ | `roboz.runtime` | Events, pipes, sinks, persistence, and observability. |
327
+ | `roboz.shed` | Reusable capabilities, guarded tools, agents, and recipes. |
328
+ | `roboz.endpoints` | OpenAI-compatible adapters and typed model catalogues. |
263
329
 
264
330
  ## Development
265
331
 
@@ -42,9 +42,8 @@ Chaining not only reduces the llm calls, but it also provides a useful way of in
42
42
  ```python
43
43
  from random import choice
44
44
 
45
- from simpsons_quotes import QUOTES
46
-
47
45
  from roboz import Agent, tool
46
+ from roboz.examples.simpsons_quotes import QUOTES
48
47
  from roboz.llm.endpoints import MockLLMEndpoint
49
48
  from roboz.models import Empty, Message, Stop
50
49
 
@@ -70,12 +69,12 @@ output, messages_ = agent.invoke()
70
69
  print(f'"{output.value}"')
71
70
  ```
72
71
 
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
- repository root with
72
+ The above [simple example](https://github.com/Tachion-Oy/roboz/blob/main/src/roboz/examples/simple.py) uses the accompanying
73
+ [quote file](https://github.com/Tachion-Oy/roboz/blob/main/src/roboz/examples/simpsons_quotes.py). First add RoboZ to your
74
+ environment as shown in [Try it out](#try-it-out), then run it with
76
75
 
77
76
  ```bash
78
- uv run python examples/simple.py
77
+ uv run python -m roboz.examples.simple
79
78
  ```
80
79
  It creates an agent that returns a random
81
80
  Simpsons quote. **The docstring in the tool is the instruction that the agent sees**. It uses a mock endpoint, with pre-determined replies, so you can run it without API keys.
@@ -109,7 +108,7 @@ The contract in RoboZ is that every action in the agentic loop is a tool call an
109
108
  ### LLM Endpoints are instances
110
109
  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
110
 
112
- To see the above in practice see the [complex example](https://github.com/Tachion-Oy/roboz/blob/main/examples/complex.py) example below.
111
+ To see the above in practice see the [complex example](https://github.com/Tachion-Oy/roboz/blob/main/src/roboz/examples/complex.py) below.
113
112
 
114
113
 
115
114
 
@@ -199,40 +198,106 @@ agent.invoke()
199
198
 
200
199
  ```
201
200
 
202
- The above [complex example](https://github.com/Tachion-Oy/roboz/blob/main/examples/complex.py) can be run from the root with
201
+ The above [complex example](https://github.com/Tachion-Oy/roboz/blob/main/src/roboz/examples/complex.py) is also bundled with
202
+ RoboZ. First add the library to your environment as shown in
203
+ [Try it out](#try-it-out), then run it with
203
204
 
204
205
  ```bash
205
- uv run python examples/complex.py
206
+ uv run python -m roboz.examples.complex
206
207
  ```
207
208
 
208
209
 
209
210
  ## Try it out
210
211
 
212
+ Add RoboZ to a uv project and run the same bundled example. The one dependency
213
+ includes the core framework, Shed, Endpoints, and the OpenAI SDK:
214
+
211
215
  ```bash
212
216
  uv add roboz
217
+ uv run python -m roboz.examples.simple
213
218
  ```
214
219
 
215
- Or with pip:
220
+ or with pip, install RoboZ into the active environment first:
216
221
 
217
222
  ```bash
218
223
  python -m pip install roboz
224
+ python -m roboz.examples.simple
225
+ ```
226
+
227
+ ## Shed
228
+
229
+ `roboz.shed` provides reusable components built on the core primitives. Use an
230
+ individual guarded file or email tool, add a capability to a
231
+ `DeployableAgent`, start from the orchestrator and Librarian definitions, or use
232
+ the RoboSprawl recipe to assemble a persistent project agent. Applications own
233
+ the model endpoints, event sinks, lifecycle, and filesystem layout.
234
+
235
+ - `roboz.shed.agents` contains the orchestrator and Librarian definitions.
236
+ - `roboz.shed.capabilities` binds reusable behavior to agent configuration.
237
+ - `roboz.shed.tools` contains guarded file commands, patching, email contracts,
238
+ conversation compaction, snapshots, memory consolidation, and retention.
239
+ - `roboz.shed.skills` supplies the agent instructions for those tools.
240
+ - `roboz.shed.sandbox` defines filesystem scopes and tool permission policies.
241
+ - `roboz.shed.dependency_health` checks configured external resources.
242
+
243
+ Shed permission policies guard Shed tools. They are not an operating-system
244
+ sandbox.
245
+
246
+ ## Endpoints and model catalogues
247
+
248
+ `roboz.endpoints` builds concrete `LLMEndpoint` and `TranscriptionEndpoint`
249
+ objects for OpenAI-compatible APIs. The OpenAI SDK is installed with RoboZ, but
250
+ client construction and credential lookup remain deferred until an endpoint is
251
+ materialized or used. Importing and inspecting the bundled catalogue needs no
252
+ credentials:
253
+
254
+ ```python
255
+ from roboz.endpoints.inventory import openrouter
256
+
257
+ endpoint = openrouter.z_ai__glm_5_3
258
+ print(endpoint.model_name)
259
+ print(endpoint.max_context_tokens)
219
260
  ```
220
261
 
221
- ## Packages
262
+ The bundled OpenRouter, Cerebras, and Groq entries are examples. Export them to
263
+ an editable project catalogue, change `models.json`, then generate the Python
264
+ snapshot:
222
265
 
223
- This repository contains four independently versioned Python distributions.
224
- They share development and release tooling, but are published separately so an
225
- application only needs to install the parts it uses.
266
+ ```bash
267
+ uv run python -m roboz.endpoints inventory export
268
+ # Edit model_catalogue/models.json.
269
+ uv run python -m roboz.endpoints inventory import
270
+ ```
226
271
 
227
- | Distribution | Import | Provides |
228
- | --- | --- | --- |
229
- | `roboz` | `roboz` | Core agent, tool, workflow, endpoint, and runtime primitives. |
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. |
272
+ For a src-layout project named `my-app`, the commands create
273
+ `src/my_app/model_catalogue/models.json` and
274
+ `src/my_app/model_catalogue/providers.py`. Import the generated catalogue from
275
+ your application package:
276
+
277
+ ```python
278
+ from my_app.model_catalogue.providers import my_service
279
+
280
+ endpoint = my_service.chat
281
+ ```
233
282
 
234
- The companion packages build on `roboz`; `roboz-proton-bridge` also uses
235
- `roboshed`.
283
+ Only OpenAI-compatible API protocols are supported. An inventory entry records
284
+ a provider URL, the name of its credential environment variable, and its model
285
+ routes; it never stores the credential itself. See the
286
+ [project catalogue guide](docs/catalogues.md) for custom paths, inventory
287
+ format, reset, and recovery.
288
+
289
+ ## Module map
290
+
291
+ | Module | Provides |
292
+ | --- | --- |
293
+ | `roboz` | Agent, tool, factory, and skill authoring facade. |
294
+ | `roboz.agent` | Agent implementations, subagents, and background agents. |
295
+ | `roboz.deployment` | Reusable agent definitions and capabilities. |
296
+ | `roboz.llm` | Endpoint contracts, selection, calls, and request policies. |
297
+ | `roboz.models` | Typed messages and tool input/output models. |
298
+ | `roboz.runtime` | Events, pipes, sinks, persistence, and observability. |
299
+ | `roboz.shed` | Reusable capabilities, guarded tools, agents, and recipes. |
300
+ | `roboz.endpoints` | OpenAI-compatible adapters and typed model catalogues. |
236
301
 
237
302
  ## Development
238
303
 
@@ -0,0 +1,156 @@
1
+ # Project catalogues
2
+
3
+ A project catalogue is an editable JSON inventory plus a generated Python
4
+ module. It lets an application define its own OpenAI-compatible providers and
5
+ models without modifying RoboZ.
6
+
7
+ ## Standard workflow
8
+
9
+ Run these commands from the application project root:
10
+
11
+ ```bash
12
+ uv run python -m roboz.endpoints inventory export
13
+ # Edit the generated models.json.
14
+ uv run python -m roboz.endpoints inventory import
15
+ ```
16
+
17
+ The export command creates a `model_catalogue` package. The import command reads
18
+ `models.json` and generates `providers.py` beside it. Edit and retain the JSON;
19
+ do not edit the generated Python module.
20
+
21
+ For a project with `name = "my-app"` in `pyproject.toml`, the default location
22
+ follows the existing package layout:
23
+
24
+ - `src/my_app/__init__.py` → `src/my_app/model_catalogue/`
25
+ - `my_app/__init__.py` → `my_app/model_catalogue/`
26
+
27
+ If neither package exists, the CLI uses `model_catalogue/` in the project root.
28
+ For reliable imports from every application module, use `--path` to place the
29
+ catalogue inside the actual application package when automatic detection fails.
30
+
31
+ The generated package contains:
32
+
33
+ ```text
34
+ model_catalogue/
35
+ ├── __init__.py
36
+ ├── models.json # editable source
37
+ └── providers.py # generated snapshot
38
+ ```
39
+
40
+ Import through the application's package path:
41
+
42
+ ```python
43
+ from my_app.model_catalogue.providers import my_service
44
+ ```
45
+
46
+ ## Choose another name or location
47
+
48
+ `--path` selects the JSON file. Unless `--output` is provided, import generates
49
+ `providers.py` beside that JSON file. For example, to call the package
50
+ `endpoints`:
51
+
52
+ ```bash
53
+ mkdir -p src/my_app/endpoints
54
+ touch src/my_app/endpoints/__init__.py
55
+
56
+ uv run python -m roboz.endpoints inventory export \
57
+ --path src/my_app/endpoints/models.json
58
+
59
+ uv run python -m roboz.endpoints inventory import \
60
+ --path src/my_app/endpoints/models.json
61
+ ```
62
+
63
+ Then import it from any application module:
64
+
65
+ ```python
66
+ from my_app.endpoints.providers import my_service
67
+ ```
68
+
69
+ To choose the generated module name as well:
70
+
71
+ ```bash
72
+ uv run python -m roboz.endpoints inventory import \
73
+ --path src/my_app/endpoints/models.json \
74
+ --output src/my_app/endpoints/catalogue.py
75
+ ```
76
+
77
+ That module is imported as:
78
+
79
+ ```python
80
+ from my_app.endpoints.catalogue import my_service
81
+ ```
82
+
83
+ For custom paths, create the parent package and its `__init__.py` first. Paths
84
+ are relative to the directory in which the command runs.
85
+
86
+ ## Inventory format
87
+
88
+ The exported file is the complete starting inventory. A provider entry has its
89
+ service URL, the name of its credential environment variable, and one or more
90
+ models:
91
+
92
+ ```json
93
+ {
94
+ "schema_version": 1,
95
+ "providers": {
96
+ "my_service": {
97
+ "base_url": "https://models.example.com/v1",
98
+ "api_key_env": "MY_SERVICE_API_KEY",
99
+ "models": {
100
+ "chat": {
101
+ "model_id": "my-chat-model",
102
+ "endpoint_type": "llm",
103
+ "max_context_tokens": 128000
104
+ },
105
+ "voice": {
106
+ "model_id": "my-transcription-model",
107
+ "endpoint_type": "transcription"
108
+ }
109
+ }
110
+ }
111
+ }
112
+ }
113
+ ```
114
+
115
+ Provider and model keys become Python names, so they must be valid public Python
116
+ identifiers. `model_id` is the identifier sent to the provider. A chat model
117
+ requires `max_context_tokens`; a transcription model does not accept it.
118
+
119
+ Only OpenAI-compatible APIs are currently supported. Store the environment
120
+ variable name in `api_key_env`, never the credential itself.
121
+
122
+ ## Regenerate after editing
123
+
124
+ Once `providers.py` exists, regenerate it with `--force`:
125
+
126
+ ```bash
127
+ uv run python -m roboz.endpoints inventory import --force
128
+ ```
129
+
130
+ For a custom location, pass the same `--path` and, if used originally,
131
+ `--output`. Restart the application so it imports the new snapshot. Package
132
+ upgrades do not replace a project catalogue.
133
+
134
+ ## Reset or recover
135
+
136
+ Reset restores the bundled examples after confirmation and discards catalogue
137
+ customizations:
138
+
139
+ ```bash
140
+ uv run python -m roboz.endpoints inventory reset
141
+ ```
142
+
143
+ For a custom catalogue, pass its `--path` and `--output`. Copy anything that
144
+ must be retained before confirming the reset.
145
+
146
+ If `models.json` was lost but the generated module remains, recover JSON without
147
+ executing the module:
148
+
149
+ ```bash
150
+ uv run python -m roboz.endpoints inventory export \
151
+ --from-module src/my_app/model_catalogue/providers.py \
152
+ --path recovered-models.json
153
+ ```
154
+
155
+ Use `uv run python -m roboz.endpoints inventory <command> --help` for the full
156
+ options of `export`, `import`, or `reset`.
@@ -1,7 +1,7 @@
1
1
  [project]
2
2
  name = "roboz"
3
- version = "0.1.2.dev10"
4
- description = "Typed primitives for composable agentic workflows"
3
+ version = "0.1.2.dev12"
4
+ description = "Typed agents, reusable capabilities, and model catalogues"
5
5
  readme = "README.md"
6
6
  authors = [{ name = "Tachion Oy" }]
7
7
  license = "Apache-2.0"
@@ -20,6 +20,7 @@ classifiers = [
20
20
  "Typing :: Typed",
21
21
  ]
22
22
  dependencies = [
23
+ "openai>=2.8.1,<3",
23
24
  "pydantic>=2.12.4",
24
25
  "python-dotenv>=1.2.1",
25
26
  "rich>=14.2.0",
@@ -29,20 +30,18 @@ dependencies = [
29
30
  requires = ["hatchling>=1.32"]
30
31
  build-backend = "hatchling.build"
31
32
 
32
- [tool.uv.workspace]
33
- members = ["packages/*"]
34
-
35
- [tool.uv.sources]
36
- roboz = { workspace = true }
37
- roboshed = { workspace = true }
38
- roboz-endpoints = { workspace = true }
39
- roboz-proton-bridge = { workspace = true }
40
-
41
33
  [tool.hatch.build.targets.wheel]
42
34
  packages = ["src/roboz"]
43
35
 
44
36
  [tool.hatch.build.targets.sdist]
45
- include = ["/src/roboz", "/README.md", "/CHANGELOG.md", "/LICENSE", "/pyproject.toml"]
37
+ include = [
38
+ "/src/roboz",
39
+ "/docs/catalogues.md",
40
+ "/README.md",
41
+ "/CHANGELOG.md",
42
+ "/LICENSE",
43
+ "/pyproject.toml",
44
+ ]
46
45
 
47
46
  [project.urls]
48
47
  Homepage = "https://github.com/Tachion-Oy/roboz"
@@ -53,7 +52,7 @@ Documentation = "https://github.com/Tachion-Oy/roboz#readme"
53
52
  [tool.pytest.ini_options]
54
53
  addopts = "--cov=roboz --cov-report=term-missing --ignore=tests/type_tests"
55
54
  python_files = ["test_*.py", "tests_*.py"]
56
- testpaths = ["tests", "packages/shed/tests", "packages/endpoints/tests", "packages/proton-bridge/tests"]
55
+ testpaths = ["tests"]
57
56
 
58
57
  [tool.ruff.lint]
59
58
  select = ["D", "E4", "E7", "E9", "F"]
@@ -63,16 +62,12 @@ convention = "google"
63
62
 
64
63
  [tool.ruff.lint.per-file-ignores]
65
64
  "examples/**/*.py" = ["D"]
66
- "packages/*/tests/**/*.py" = ["D"]
67
65
  "scripts/**/*.py" = ["D"]
68
66
  "tests/**/*.py" = ["D"]
69
67
 
70
68
  [dependency-groups]
71
69
  dev = [
72
70
  "check-wheel-contents>=0.6",
73
- "roboshed",
74
- "roboz-endpoints[openai]",
75
- "roboz-proton-bridge",
76
71
  "pyright>=1.1.411",
77
72
  "pytest>=7.0",
78
73
  "pytest-cov>=4.0",
@@ -0,0 +1 @@
1
+ """Typed model catalogues and OpenAI-compatible endpoint adapters."""
@@ -0,0 +1,7 @@
1
+ """Run catalogue management with ``python -m roboz.endpoints``."""
2
+
3
+ from roboz.endpoints.cli import main
4
+
5
+
6
+ if __name__ == "__main__":
7
+ raise SystemExit(main())