RouteKitAI 0.1.0__tar.gz → 0.2.1__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.
- {routekitai-0.1.0/src/RouteKitAI.egg-info → routekitai-0.2.1}/PKG-INFO +58 -28
- {routekitai-0.1.0 → routekitai-0.2.1}/README.md +54 -27
- routekitai-0.2.1/docs/api-reference.md +135 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/docs/architecture.md +7 -6
- routekitai-0.2.1/docs/getting-started.md +117 -0
- routekitai-0.2.1/docs/guides/cli-reference.md +134 -0
- routekitai-0.2.1/docs/guides/creating-tools.md +122 -0
- routekitai-0.2.1/docs/guides/graph-workflows.md +110 -0
- routekitai-0.2.1/docs/guides/providers.md +120 -0
- routekitai-0.2.1/docs/guides/running-agents.md +111 -0
- routekitai-0.2.1/docs/guides/tracing-and-replay.md +106 -0
- routekitai-0.2.1/docs/index.md +56 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/docs/security-and-governance.md +3 -17
- routekitai-0.2.1/examples/anthropic_agent.py +107 -0
- routekitai-0.2.1/examples/basic.py +30 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/examples/eval_regression.py +10 -5
- {routekitai-0.1.0 → routekitai-0.2.1}/examples/function_calling_policy.py +3 -3
- routekitai-0.2.1/examples/graph_policy.py +119 -0
- routekitai-0.2.1/examples/plan_execute_policy.py +91 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/examples/react_policy.py +5 -5
- {routekitai-0.1.0 → routekitai-0.2.1}/examples/supervisor_agent.py +18 -3
- {routekitai-0.1.0 → routekitai-0.2.1}/examples/supervisor_policy.py +30 -8
- {routekitai-0.1.0 → routekitai-0.2.1}/pyproject.toml +4 -0
- {routekitai-0.1.0 → routekitai-0.2.1/src/RouteKitAI.egg-info}/PKG-INFO +58 -28
- {routekitai-0.1.0 → routekitai-0.2.1}/src/RouteKitAI.egg-info/SOURCES.txt +10 -1
- {routekitai-0.1.0 → routekitai-0.2.1}/src/RouteKitAI.egg-info/requires.txt +4 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/__init__.py +1 -1
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/message.py +2 -2
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/policies.py +20 -14
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/policy.py +3 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/policy_adapter.py +17 -2
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/runtime.py +57 -11
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/tool.py +2 -2
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/graphs/graph.py +2 -2
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/message.py +2 -2
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/providers/__init__.py +2 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/providers/anthropic.py +25 -9
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/sandbox/permissions.py +2 -2
- routekitai-0.1.0/docs/oidc-publishing.md +0 -146
- routekitai-0.1.0/examples/basic.py +0 -54
- routekitai-0.1.0/examples/graph_policy.py +0 -49
- routekitai-0.1.0/examples/plan_execute_policy.py +0 -55
- {routekitai-0.1.0 → routekitai-0.2.1}/CHANGELOG.md +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/LICENSE +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/MANIFEST.in +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/examples/__init__.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/examples/graph_agent.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/examples/graph_agent_real.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/examples/hello_routekit.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/setup.cfg +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/RouteKitAI.egg-info/dependency_links.txt +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/RouteKitAI.egg-info/entry_points.txt +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/RouteKitAI.egg-info/top_level.txt +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/cli/__init__.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/cli/main.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/cli/replay.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/cli/run.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/cli/serve.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/cli/test_agent.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/cli/trace.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/cli/trace_analyze.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/cli/trace_search.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/__init__.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/agent.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/errors.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/hooks.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/memory.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/model.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/core/tools.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/evals/__init__.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/evals/dataset.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/evals/metrics.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/evals/runner.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/graphs/__init__.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/graphs/executors.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/memory/__init__.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/memory/episodic.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/memory/kv.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/memory/retrieval.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/memory/vector.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/memory/working.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/model.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/observability/__init__.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/observability/analyzer.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/observability/exporters/__init__.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/observability/exporters/base.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/observability/exporters/jsonl.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/observability/exporters/otel.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/observability/spans.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/observability/streaming.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/observability/trace.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/providers/azure_openai.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/providers/local.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/providers/openai.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/py.typed +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/sandbox/__init__.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/sandbox/filesystem.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/sandbox/network.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/src/routekitai/tool.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_evals.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_graphs.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_graphs_subgraph.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_hooks.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_integration.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_memory.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_memory_kv.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_memory_vector.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_message.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_otel_exporter.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_runtime.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_sandbox_filesystem.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_sandbox_network.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_streaming.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_streaming_serve.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_tool.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_tools.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_trace_analyzer.py +0 -0
- {routekitai-0.1.0 → routekitai-0.2.1}/tests/test_trace_analyzer_integration.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: RouteKitAI
|
|
3
|
-
Version: 0.1
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: An agent development + orchestration framework
|
|
5
5
|
Author: Mohamed Ghassen Brahim
|
|
6
6
|
License: MIT
|
|
@@ -41,6 +41,9 @@ Requires-Dist: sentence-transformers>=2.2.0; extra == "optional"
|
|
|
41
41
|
Requires-Dist: faiss-cpu>=1.7.4; extra == "optional"
|
|
42
42
|
Requires-Dist: openai>=1.0.0; extra == "optional"
|
|
43
43
|
Requires-Dist: nest-asyncio>=1.5.0; extra == "optional"
|
|
44
|
+
Provides-Extra: docs
|
|
45
|
+
Requires-Dist: mkdocs>=1.5.0; extra == "docs"
|
|
46
|
+
Requires-Dist: mkdocs-material>=9.0.0; extra == "docs"
|
|
44
47
|
Dynamic: license-file
|
|
45
48
|
|
|
46
49
|
# RouteKitAI
|
|
@@ -60,6 +63,8 @@ Dynamic: license-file
|
|
|
60
63
|
|
|
61
64
|
---
|
|
62
65
|
|
|
66
|
+
> **⚠️ Early stage**: RouteKitAI is still in very early development. APIs may change, and some features are experimental. Use with caution in production.
|
|
67
|
+
|
|
63
68
|
RouteKitAI is a Python framework for building AI agents with **graph-based orchestration**, **built-in tracing**, and **deterministic replay**. Unlike other frameworks, RouteKitAI treats observability and testability as first-class features from day one.
|
|
64
69
|
|
|
65
70
|
## ✨ Features
|
|
@@ -195,50 +200,54 @@ asyncio.run(main())
|
|
|
195
200
|
|
|
196
201
|
- **[Architecture Guide](docs/architecture.md)**: Deep dive into RouteKitAI's design
|
|
197
202
|
- **[Security & Governance](docs/security-and-governance.md)**: Security features and best practices
|
|
198
|
-
- **[
|
|
203
|
+
- **[Full documentation](https://routekitai.readthedocs.io)**: Architecture, security, and guides (Read the Docs)
|
|
199
204
|
|
|
200
205
|
## 🎓 Examples
|
|
201
206
|
|
|
202
207
|
Check out the [`examples/`](examples/) directory for complete examples:
|
|
203
208
|
|
|
204
|
-
- **[Basic Agent](examples/
|
|
205
|
-
- **[
|
|
206
|
-
- **[
|
|
209
|
+
- **[Basic Agent](examples/basic.py)** / **[Hello RouteKit](examples/hello_routekit.py)**: Simple agent with tools
|
|
210
|
+
- **[Real agent with Anthropic](examples/anthropic_agent.py)**: Live Claude agent with tool use (requires `ANTHROPIC_API_KEY`)
|
|
211
|
+
- **[Graph Orchestration](examples/graph_agent.py)** / **[Graph Policy](examples/graph_policy.py)**: Multi-agent workflows
|
|
212
|
+
- **[Supervisor Pattern](examples/supervisor_agent.py)** / **[Supervisor Policy](examples/supervisor_policy.py)**: Supervisor delegating to sub-agents
|
|
213
|
+
- **[ReAct / Plan–Execute / Function Calling](examples/react_policy.py)**, **[Plan–Execute](examples/plan_execute_policy.py)**, **[Function Calling](examples/function_calling_policy.py)**: Policy examples
|
|
207
214
|
- **[Evaluation Harness](examples/eval_regression.py)**: Testing agents with datasets
|
|
208
215
|
|
|
216
|
+
Run all examples: `./scripts/run_examples.sh` (or `bash scripts/run_examples.sh`).
|
|
217
|
+
|
|
209
218
|
## 🛠️ CLI Commands
|
|
210
219
|
|
|
211
|
-
RouteKitAI provides a CLI for common operations:
|
|
220
|
+
RouteKitAI provides a CLI (`routekitai`) for common operations:
|
|
212
221
|
|
|
213
222
|
```bash
|
|
214
223
|
# Run an agent script
|
|
215
|
-
|
|
224
|
+
routekitai run agent_script.py
|
|
216
225
|
|
|
217
226
|
# View a trace (multiple formats available)
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
227
|
+
routekitai trace <trace_id> # Table view (default)
|
|
228
|
+
routekitai trace <trace_id> --format timeline # Timeline visualization
|
|
229
|
+
routekitai trace <trace_id> --format steps # Step-by-step execution
|
|
230
|
+
routekitai trace <trace_id> --format json # JSON output
|
|
231
|
+
routekitai trace <trace_id> --format raw # Raw JSONL
|
|
223
232
|
|
|
224
233
|
# Analyze trace metrics
|
|
225
|
-
|
|
234
|
+
routekitai trace-analyze <trace_id> # Performance metrics, token usage, costs
|
|
226
235
|
|
|
227
236
|
# Search traces
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
237
|
+
routekitai trace-search "error" # Search all traces for "error"
|
|
238
|
+
routekitai trace-search "model" --trace-id abc # Search specific trace
|
|
239
|
+
routekitai trace-search "tool" --event-type tool_called # Filter by event type
|
|
231
240
|
|
|
232
241
|
# Replay a trace
|
|
233
|
-
|
|
242
|
+
routekitai replay <trace_id> --agent my_agent
|
|
234
243
|
|
|
235
244
|
# Start web UI for trace visualization
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
245
|
+
routekitai serve # Start on default port 8080
|
|
246
|
+
routekitai serve --port 3000 # Custom port
|
|
247
|
+
routekitai serve --host 0.0.0.0 # Make accessible from network
|
|
239
248
|
|
|
240
249
|
# Run sanity checks
|
|
241
|
-
|
|
250
|
+
routekitai test-agent
|
|
242
251
|
```
|
|
243
252
|
|
|
244
253
|
## 🏗️ Core Primitives
|
|
@@ -271,7 +280,7 @@ pip install -e ".[dev]"
|
|
|
271
280
|
pytest
|
|
272
281
|
|
|
273
282
|
# Run with coverage
|
|
274
|
-
pytest --cov=
|
|
283
|
+
pytest --cov=routekitai --cov-report=html
|
|
275
284
|
|
|
276
285
|
# Run specific test file
|
|
277
286
|
pytest tests/test_runtime.py
|
|
@@ -284,15 +293,15 @@ pytest tests/test_runtime.py
|
|
|
284
293
|
mypy src/
|
|
285
294
|
|
|
286
295
|
# Linting
|
|
287
|
-
ruff check src/
|
|
296
|
+
ruff check src/ tests/ examples/
|
|
288
297
|
|
|
289
298
|
# Format code
|
|
290
|
-
ruff format src/
|
|
299
|
+
ruff format src/ tests/ examples/
|
|
291
300
|
```
|
|
292
301
|
|
|
293
302
|
## 🤝 Contributing
|
|
294
303
|
|
|
295
|
-
Contributions are welcome! Please read
|
|
304
|
+
Contributions are welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) and:
|
|
296
305
|
|
|
297
306
|
1. Fork the repository
|
|
298
307
|
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
@@ -302,8 +311,29 @@ Contributions are welcome! Please read our contributing guidelines (coming soon)
|
|
|
302
311
|
|
|
303
312
|
## 📋 Requirements
|
|
304
313
|
|
|
305
|
-
|
|
306
|
-
|
|
314
|
+
**Core (always installed):**
|
|
315
|
+
|
|
316
|
+
- Python 3.11+
|
|
317
|
+
- [Pydantic](https://docs.pydantic.dev/) 2.x
|
|
318
|
+
- [NumPy](https://numpy.org/) 1.24+
|
|
319
|
+
- [httpx](https://www.python-httpx.org/) 0.24+
|
|
320
|
+
|
|
321
|
+
**Optional extras:**
|
|
322
|
+
|
|
323
|
+
| Extra | Purpose |
|
|
324
|
+
|-------|---------|
|
|
325
|
+
| `[dev]` | CLI, tests, linting, type checking (pytest, mypy, ruff, rich, typer, safety, bandit) |
|
|
326
|
+
| `[ui]` | Web UI for traces: `routekitai serve` (FastAPI, Uvicorn) |
|
|
327
|
+
| `[optional]` | Vector memory, OpenAI adapter (sentence-transformers, faiss, openai, nest-asyncio) |
|
|
328
|
+
| `[docs]` | Build documentation locally (MkDocs, MkDocs Material) |
|
|
329
|
+
|
|
330
|
+
Examples:
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
pip install "RouteKitAI[dev]" # development + CLI
|
|
334
|
+
pip install "RouteKitAI[dev,ui]" # + trace web UI
|
|
335
|
+
pip install "RouteKitAI[docs]" # build docs: mkdocs build / mkdocs serve
|
|
336
|
+
```
|
|
307
337
|
|
|
308
338
|
## 📄 License
|
|
309
339
|
|
|
@@ -316,7 +346,7 @@ RouteKitAI is inspired by the need for testable, observable AI agent frameworks.
|
|
|
316
346
|
## 🔗 Links
|
|
317
347
|
|
|
318
348
|
- **GitHub**: [https://github.com/MedGhassen/RouteKitAI](https://github.com/MedGhassen/RouteKitAI)
|
|
319
|
-
- **Documentation**: [https://
|
|
349
|
+
- **Documentation**: [https://routekitai.readthedocs.io](https://routekitai.readthedocs.io)
|
|
320
350
|
- **Issues**: [https://github.com/MedGhassen/RouteKitAI/issues](https://github.com/MedGhassen/RouteKitAI/issues)
|
|
321
351
|
|
|
322
352
|
---
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
|
|
16
16
|
---
|
|
17
17
|
|
|
18
|
+
> **⚠️ Early stage**: RouteKitAI is still in very early development. APIs may change, and some features are experimental. Use with caution in production.
|
|
19
|
+
|
|
18
20
|
RouteKitAI is a Python framework for building AI agents with **graph-based orchestration**, **built-in tracing**, and **deterministic replay**. Unlike other frameworks, RouteKitAI treats observability and testability as first-class features from day one.
|
|
19
21
|
|
|
20
22
|
## ✨ Features
|
|
@@ -150,50 +152,54 @@ asyncio.run(main())
|
|
|
150
152
|
|
|
151
153
|
- **[Architecture Guide](docs/architecture.md)**: Deep dive into RouteKitAI's design
|
|
152
154
|
- **[Security & Governance](docs/security-and-governance.md)**: Security features and best practices
|
|
153
|
-
- **[
|
|
155
|
+
- **[Full documentation](https://routekitai.readthedocs.io)**: Architecture, security, and guides (Read the Docs)
|
|
154
156
|
|
|
155
157
|
## 🎓 Examples
|
|
156
158
|
|
|
157
159
|
Check out the [`examples/`](examples/) directory for complete examples:
|
|
158
160
|
|
|
159
|
-
- **[Basic Agent](examples/
|
|
160
|
-
- **[
|
|
161
|
-
- **[
|
|
161
|
+
- **[Basic Agent](examples/basic.py)** / **[Hello RouteKit](examples/hello_routekit.py)**: Simple agent with tools
|
|
162
|
+
- **[Real agent with Anthropic](examples/anthropic_agent.py)**: Live Claude agent with tool use (requires `ANTHROPIC_API_KEY`)
|
|
163
|
+
- **[Graph Orchestration](examples/graph_agent.py)** / **[Graph Policy](examples/graph_policy.py)**: Multi-agent workflows
|
|
164
|
+
- **[Supervisor Pattern](examples/supervisor_agent.py)** / **[Supervisor Policy](examples/supervisor_policy.py)**: Supervisor delegating to sub-agents
|
|
165
|
+
- **[ReAct / Plan–Execute / Function Calling](examples/react_policy.py)**, **[Plan–Execute](examples/plan_execute_policy.py)**, **[Function Calling](examples/function_calling_policy.py)**: Policy examples
|
|
162
166
|
- **[Evaluation Harness](examples/eval_regression.py)**: Testing agents with datasets
|
|
163
167
|
|
|
168
|
+
Run all examples: `./scripts/run_examples.sh` (or `bash scripts/run_examples.sh`).
|
|
169
|
+
|
|
164
170
|
## 🛠️ CLI Commands
|
|
165
171
|
|
|
166
|
-
RouteKitAI provides a CLI for common operations:
|
|
172
|
+
RouteKitAI provides a CLI (`routekitai`) for common operations:
|
|
167
173
|
|
|
168
174
|
```bash
|
|
169
175
|
# Run an agent script
|
|
170
|
-
|
|
176
|
+
routekitai run agent_script.py
|
|
171
177
|
|
|
172
178
|
# View a trace (multiple formats available)
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
179
|
+
routekitai trace <trace_id> # Table view (default)
|
|
180
|
+
routekitai trace <trace_id> --format timeline # Timeline visualization
|
|
181
|
+
routekitai trace <trace_id> --format steps # Step-by-step execution
|
|
182
|
+
routekitai trace <trace_id> --format json # JSON output
|
|
183
|
+
routekitai trace <trace_id> --format raw # Raw JSONL
|
|
178
184
|
|
|
179
185
|
# Analyze trace metrics
|
|
180
|
-
|
|
186
|
+
routekitai trace-analyze <trace_id> # Performance metrics, token usage, costs
|
|
181
187
|
|
|
182
188
|
# Search traces
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
189
|
+
routekitai trace-search "error" # Search all traces for "error"
|
|
190
|
+
routekitai trace-search "model" --trace-id abc # Search specific trace
|
|
191
|
+
routekitai trace-search "tool" --event-type tool_called # Filter by event type
|
|
186
192
|
|
|
187
193
|
# Replay a trace
|
|
188
|
-
|
|
194
|
+
routekitai replay <trace_id> --agent my_agent
|
|
189
195
|
|
|
190
196
|
# Start web UI for trace visualization
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
197
|
+
routekitai serve # Start on default port 8080
|
|
198
|
+
routekitai serve --port 3000 # Custom port
|
|
199
|
+
routekitai serve --host 0.0.0.0 # Make accessible from network
|
|
194
200
|
|
|
195
201
|
# Run sanity checks
|
|
196
|
-
|
|
202
|
+
routekitai test-agent
|
|
197
203
|
```
|
|
198
204
|
|
|
199
205
|
## 🏗️ Core Primitives
|
|
@@ -226,7 +232,7 @@ pip install -e ".[dev]"
|
|
|
226
232
|
pytest
|
|
227
233
|
|
|
228
234
|
# Run with coverage
|
|
229
|
-
pytest --cov=
|
|
235
|
+
pytest --cov=routekitai --cov-report=html
|
|
230
236
|
|
|
231
237
|
# Run specific test file
|
|
232
238
|
pytest tests/test_runtime.py
|
|
@@ -239,15 +245,15 @@ pytest tests/test_runtime.py
|
|
|
239
245
|
mypy src/
|
|
240
246
|
|
|
241
247
|
# Linting
|
|
242
|
-
ruff check src/
|
|
248
|
+
ruff check src/ tests/ examples/
|
|
243
249
|
|
|
244
250
|
# Format code
|
|
245
|
-
ruff format src/
|
|
251
|
+
ruff format src/ tests/ examples/
|
|
246
252
|
```
|
|
247
253
|
|
|
248
254
|
## 🤝 Contributing
|
|
249
255
|
|
|
250
|
-
Contributions are welcome! Please read
|
|
256
|
+
Contributions are welcome! Please read [CONTRIBUTING.md](CONTRIBUTING.md) and:
|
|
251
257
|
|
|
252
258
|
1. Fork the repository
|
|
253
259
|
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
@@ -257,8 +263,29 @@ Contributions are welcome! Please read our contributing guidelines (coming soon)
|
|
|
257
263
|
|
|
258
264
|
## 📋 Requirements
|
|
259
265
|
|
|
260
|
-
|
|
261
|
-
|
|
266
|
+
**Core (always installed):**
|
|
267
|
+
|
|
268
|
+
- Python 3.11+
|
|
269
|
+
- [Pydantic](https://docs.pydantic.dev/) 2.x
|
|
270
|
+
- [NumPy](https://numpy.org/) 1.24+
|
|
271
|
+
- [httpx](https://www.python-httpx.org/) 0.24+
|
|
272
|
+
|
|
273
|
+
**Optional extras:**
|
|
274
|
+
|
|
275
|
+
| Extra | Purpose |
|
|
276
|
+
|-------|---------|
|
|
277
|
+
| `[dev]` | CLI, tests, linting, type checking (pytest, mypy, ruff, rich, typer, safety, bandit) |
|
|
278
|
+
| `[ui]` | Web UI for traces: `routekitai serve` (FastAPI, Uvicorn) |
|
|
279
|
+
| `[optional]` | Vector memory, OpenAI adapter (sentence-transformers, faiss, openai, nest-asyncio) |
|
|
280
|
+
| `[docs]` | Build documentation locally (MkDocs, MkDocs Material) |
|
|
281
|
+
|
|
282
|
+
Examples:
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
pip install "RouteKitAI[dev]" # development + CLI
|
|
286
|
+
pip install "RouteKitAI[dev,ui]" # + trace web UI
|
|
287
|
+
pip install "RouteKitAI[docs]" # build docs: mkdocs build / mkdocs serve
|
|
288
|
+
```
|
|
262
289
|
|
|
263
290
|
## 📄 License
|
|
264
291
|
|
|
@@ -271,7 +298,7 @@ RouteKitAI is inspired by the need for testable, observable AI agent frameworks.
|
|
|
271
298
|
## 🔗 Links
|
|
272
299
|
|
|
273
300
|
- **GitHub**: [https://github.com/MedGhassen/RouteKitAI](https://github.com/MedGhassen/RouteKitAI)
|
|
274
|
-
- **Documentation**: [https://
|
|
301
|
+
- **Documentation**: [https://routekitai.readthedocs.io](https://routekitai.readthedocs.io)
|
|
275
302
|
- **Issues**: [https://github.com/MedGhassen/RouteKitAI/issues](https://github.com/MedGhassen/RouteKitAI/issues)
|
|
276
303
|
|
|
277
304
|
---
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# API reference
|
|
2
|
+
|
|
3
|
+
Overview of the main public APIs in RouteKitAI. For full signatures and docstrings, use the in-editor help or the source under `src/routekitai/`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Core: `routekitai` (top-level)
|
|
8
|
+
|
|
9
|
+
| Symbol | Description |
|
|
10
|
+
|--------|-------------|
|
|
11
|
+
| **Agent** | Agent with model, tools, optional policy and memory. Use `agent.run(prompt)` or `agent.run_stream(prompt)`. |
|
|
12
|
+
| **RunResult** | Result of a run: `output` (Message), `trace_id`, `messages`, `final_state`. |
|
|
13
|
+
| **Runtime** | Orchestrator: register agents, run with optional policy, replay traces. |
|
|
14
|
+
| **Message** | Single message: `role`, `content`, `tool_calls`, `tool_result`, `metadata`. |
|
|
15
|
+
| **MessageRole** | Enum: SYSTEM, USER, ASSISTANT, TOOL. |
|
|
16
|
+
| **Model** | Abstract LLM interface: `chat(messages, tools=..., stream=...)`. |
|
|
17
|
+
| **ModelResponse** | `content`, `tool_calls`, `usage`, `metadata`. |
|
|
18
|
+
| **StreamEvent** | Streaming event: `type`, `content`, `tool_calls`, `usage`, `metadata`. |
|
|
19
|
+
| **Tool** | Abstract base for tools: `name`, `description`, `input_model`, `output_model`, `run(input)`. |
|
|
20
|
+
| **ToolCall** | Model-requested tool call: `id`, `name`, `arguments`. |
|
|
21
|
+
| **ToolFilter** | Allow/deny list for tools (agent or runtime hooks). |
|
|
22
|
+
| **Usage** | Token/cost info: `prompt_tokens`, `completion_tokens`, `total_tokens`, `cost`. |
|
|
23
|
+
| **RouteKitError**, **ModelError**, **ToolError**, **PolicyError**, **RouteKitRuntimeError** | Error types. |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Core: `routekitai.core`
|
|
28
|
+
|
|
29
|
+
### Agent and runtime
|
|
30
|
+
|
|
31
|
+
- **Agent** — Same as top-level. Fields: `name`, `model`, `tools`, `policy`, `memory`, `tool_filter`, `trace_dir`.
|
|
32
|
+
- **RunResult** — Same as top-level.
|
|
33
|
+
- **Runtime** — `agents`, `trace_dir`, `timeout`, `max_concurrency`, `policy_hooks`, etc. Methods: `register_agent()`, `run()`, `replay()`.
|
|
34
|
+
|
|
35
|
+
### Messages and model
|
|
36
|
+
|
|
37
|
+
- **Message**, **MessageRole** — As above.
|
|
38
|
+
- **Model**, **ModelResponse**, **StreamEvent**, **ToolCall**, **Usage** — As above.
|
|
39
|
+
|
|
40
|
+
### Tools
|
|
41
|
+
|
|
42
|
+
- **Tool** — Base class. Subclass and implement `run(input) -> output`. Optional: `input_model`, `output_model`, `permissions`, `timeout`, `redact_fields`.
|
|
43
|
+
- **ToolPermission** — Enum: NETWORK, FILESYSTEM, DATABASE, NONE.
|
|
44
|
+
- **EchoTool**, **HttpGetTool**, **FileReadTool** — Built-in tools in `routekitai.core.tools`.
|
|
45
|
+
|
|
46
|
+
### Policies
|
|
47
|
+
|
|
48
|
+
- **Policy** — Abstract: `plan(state) -> list[Action]`, `reflect(state, observation) -> state`.
|
|
49
|
+
- **Action** — Base for model/tool/parallel/final actions.
|
|
50
|
+
- **ModelAction**, **ToolAction**, **Parallel**, **Final** — Action types.
|
|
51
|
+
- **ReActPolicy** — Reasoning + acting loop (default). Config: `max_iterations`.
|
|
52
|
+
- **FunctionCallingPolicy** — Strict function-calling.
|
|
53
|
+
- **GraphPolicy** — Runs a `Graph`; requires a Runtime with registered agents.
|
|
54
|
+
- **SupervisorPolicy** — Delegates to other agents.
|
|
55
|
+
- **PlanExecutePolicy** — Plan then execute.
|
|
56
|
+
- **PolicyAdapter** — Adapts policy interface for the runtime.
|
|
57
|
+
|
|
58
|
+
### Hooks (security and governance)
|
|
59
|
+
|
|
60
|
+
- **PolicyHooks** — Container: `pii_redaction`, `tool_filter`, `approval_gate`.
|
|
61
|
+
- **PIIRedactionHook** — Redact emails, phones, custom patterns.
|
|
62
|
+
- **ToolFilter** — `allowed_tools` / `denied_tools`.
|
|
63
|
+
- **ApprovalGate** — Require approval for certain permissions; `approval_callback(tool_name, tool_args) -> bool`.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Graphs: `routekitai.graphs`
|
|
68
|
+
|
|
69
|
+
| Symbol | Description |
|
|
70
|
+
|--------|-------------|
|
|
71
|
+
| **Graph** | Workflow: `name`, `nodes`, `edges`, `entry_node`, `exit_node`, `state_schema`, `config`. |
|
|
72
|
+
| **GraphNode** | Node: `id`, `type` (NodeType), `agent_name` / `tool_name` / `subgraph_name` / `condition`, `input_mapping`, `output_mapping`. |
|
|
73
|
+
| **GraphEdge** | Edge: `source`, `target`, optional `condition`. |
|
|
74
|
+
| **NodeType** | Enum: MODEL, TOOL, SUBGRAPH, CONDITION. |
|
|
75
|
+
| **GraphExecutor** | Executes a graph (used internally by GraphPolicy). |
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Memory: `routekitai.memory`
|
|
80
|
+
|
|
81
|
+
| Symbol | Description |
|
|
82
|
+
|--------|-------------|
|
|
83
|
+
| **Memory** | Abstract interface (from `routekitai.core.memory`). |
|
|
84
|
+
| **WorkingMemory** | In-memory context for a single run. |
|
|
85
|
+
| **EpisodicMemory** | SQLite-backed episode storage. |
|
|
86
|
+
| **RetrievalMemory** | TF-IDF or substring search. |
|
|
87
|
+
| **VectorMemory** | Vector similarity search (in `routekitai.memory.vector`). |
|
|
88
|
+
| **KVMemory** | Key-value store (in `routekitai.memory.kv`). |
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Evaluations: `routekitai.evals`
|
|
93
|
+
|
|
94
|
+
| Symbol | Description |
|
|
95
|
+
|--------|-------------|
|
|
96
|
+
| **Dataset** | Evaluation dataset (inputs and expected outputs). |
|
|
97
|
+
| **EvalRunner** | Runs an agent over a dataset and computes metrics. |
|
|
98
|
+
| **ExactMatchMetric**, **ContainsMetric**, **RegexMetric** | Built-in metrics. |
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Providers: `routekitai.providers`
|
|
103
|
+
|
|
104
|
+
| Symbol | Description |
|
|
105
|
+
|--------|-------------|
|
|
106
|
+
| **FakeModel** | Local model with preloaded responses (no API key). |
|
|
107
|
+
| **OpenAIChatModel** | OpenAI chat API. |
|
|
108
|
+
| **AnthropicModel** | Anthropic Claude (Messages API). |
|
|
109
|
+
| **AzureOpenAIChatModel** | Azure OpenAI (if installed). |
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Observability: `routekitai.observability`
|
|
114
|
+
|
|
115
|
+
- **Trace**, **TraceEvent** — Trace representation.
|
|
116
|
+
- **JSONLExporter** — Writes traces to `.routekit/traces/<trace_id>.jsonl`.
|
|
117
|
+
- **Analyzer** — Trace analysis (used by CLI `trace-analyze`).
|
|
118
|
+
- **OtelExporter** — OpenTelemetry export (optional).
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Sandbox: `routekitai.sandbox`
|
|
123
|
+
|
|
124
|
+
- **FilesystemSandbox** — Restrict filesystem access.
|
|
125
|
+
- **NetworkSandbox** — Restrict network access.
|
|
126
|
+
- **PermissionManager** — Manages tool permissions (used by runtime).
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## Version
|
|
131
|
+
|
|
132
|
+
```python
|
|
133
|
+
import routekitai
|
|
134
|
+
print(routekitai.__version__)
|
|
135
|
+
```
|
|
@@ -237,8 +237,9 @@ RouteKitAI supports multiple memory backends:
|
|
|
237
237
|
|
|
238
238
|
- **EpisodicMemory**: SQLite-backed episode storage
|
|
239
239
|
- **RetrievalMemory**: TF-IDF or substring search
|
|
240
|
-
- **VectorMemory**: Vector similarity search
|
|
241
|
-
- **KVMemory**: Key-value storage
|
|
240
|
+
- **VectorMemory**: Vector similarity search
|
|
241
|
+
- **KVMemory**: Key-value storage
|
|
242
|
+
- **WorkingMemory**: In-memory context for a single run
|
|
242
243
|
|
|
243
244
|
Memory is accessed through the `Memory` abstract interface, allowing agents to retain context across runs.
|
|
244
245
|
|
|
@@ -273,16 +274,16 @@ Sandboxing provides isolation for tool execution:
|
|
|
273
274
|
- Memory backends: Episodic and retrieval memory
|
|
274
275
|
- Security hooks: PII redaction, tool filtering, approval gates
|
|
275
276
|
- CLI tools: Run, trace, replay, test commands
|
|
277
|
+
- Trace analysis: Metrics (`trace-analyze`), search (`trace-search`), timeline/step views, web UI (`serve`)
|
|
276
278
|
|
|
277
279
|
### Excluded (Post-MVP)
|
|
278
280
|
|
|
279
281
|
- Distributed execution: Multi-machine orchestration
|
|
280
282
|
- Streaming traces: Real-time trace streaming/aggregation
|
|
281
|
-
-
|
|
282
|
-
- Production observability: Integration with monitoring systems
|
|
283
|
+
- Production observability: Integration with external monitoring (e.g. OpenTelemetry exporters exist; full integration TBD)
|
|
283
284
|
- Advanced graph features: Dynamic graphs, conditional branching beyond basics
|
|
284
285
|
- Model providers: Built-in integrations (use adapters)
|
|
285
|
-
- UI/dashboards:
|
|
286
|
+
- UI/dashboards: Additional trace visualization (basic serve UI included)
|
|
286
287
|
|
|
287
288
|
## Design Principles
|
|
288
289
|
|
|
@@ -309,7 +310,7 @@ Performance optimizations can be added later without breaking the core design.
|
|
|
309
310
|
|
|
310
311
|
- **Distributed execution**: Scale across multiple machines
|
|
311
312
|
- **Advanced graph features**: Dynamic graphs, parallel node execution
|
|
312
|
-
- **Trace analysis**:
|
|
313
|
+
- **Trace analysis**: Further tooling and integrations (basic analysis and serve UI included)
|
|
313
314
|
- **Production observability**: Integrate with monitoring systems
|
|
314
315
|
- **Model provider integrations**: Built-in support for major LLM providers
|
|
315
316
|
- **UI/dashboards**: Visual trace inspection and graph editing
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Getting Started
|
|
2
|
+
|
|
3
|
+
This guide gets you from zero to running your first agent and first graph in RouteKitAI.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Install the package from PyPI:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install RouteKitAI
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
For development (CLI, tests, type checking):
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pip install "RouteKitAI[dev]"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Optional extras:
|
|
20
|
+
|
|
21
|
+
- **`[ui]`** — Web UI for traces (`routekitai serve`): FastAPI, Uvicorn
|
|
22
|
+
- **`[optional]`** — Vector memory, OpenAI/Anthropic adapters: sentence-transformers, faiss, openai, etc.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
pip install "RouteKitAI[dev,ui,optional]"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**Requirements:** Python 3.11+, Pydantic 2.x.
|
|
29
|
+
|
|
30
|
+
## Your first agent
|
|
31
|
+
|
|
32
|
+
A minimal agent needs a **model** and optionally **tools**. RouteKitAI uses a provider-agnostic `Model` interface, so you can start with a fake model (no API key) and later switch to OpenAI, Anthropic, or your own backend.
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
import asyncio
|
|
36
|
+
from routekitai import Agent
|
|
37
|
+
from routekitai.core.tools import EchoTool
|
|
38
|
+
from routekitai.providers.local import FakeModel
|
|
39
|
+
|
|
40
|
+
async def main():
|
|
41
|
+
# Local fake model (no API key)
|
|
42
|
+
model = FakeModel(name="basic")
|
|
43
|
+
model.add_response("Hello! I used the echo tool.")
|
|
44
|
+
|
|
45
|
+
agent = Agent(
|
|
46
|
+
name="assistant",
|
|
47
|
+
model=model,
|
|
48
|
+
tools=[EchoTool()],
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
result = await agent.run("Say hello and echo 'RouteKit works!'")
|
|
52
|
+
print(result.output.content)
|
|
53
|
+
print("Trace ID:", result.trace_id)
|
|
54
|
+
|
|
55
|
+
asyncio.run(main())
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- **`agent.run(prompt)`** — Runs the agent and returns a `RunResult` with `output`, `trace_id`, `messages`, and `final_state`.
|
|
59
|
+
- Every run is **traced** by default; traces are written under `.routekit/traces/` unless you set `trace_dir` on the agent.
|
|
60
|
+
|
|
61
|
+
## Your first graph
|
|
62
|
+
|
|
63
|
+
Graphs define **explicit workflows** as nodes (model, tool, subgraph, condition) and edges. Use `GraphPolicy` with a `Runtime` and registered agents.
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
import asyncio
|
|
67
|
+
from pathlib import Path
|
|
68
|
+
from routekitai import Agent
|
|
69
|
+
from routekitai.core.policies import GraphPolicy
|
|
70
|
+
from routekitai.core.runtime import Runtime
|
|
71
|
+
from routekitai.core.tools import EchoTool
|
|
72
|
+
from routekitai.graphs import Graph, GraphNode, GraphEdge, NodeType
|
|
73
|
+
from routekitai.providers.local import FakeModel
|
|
74
|
+
|
|
75
|
+
async def main():
|
|
76
|
+
model = FakeModel(name="m1")
|
|
77
|
+
model.add_response("Processing...")
|
|
78
|
+
agent = Agent(name="worker", model=model, tools=[EchoTool()])
|
|
79
|
+
|
|
80
|
+
graph = Graph(
|
|
81
|
+
name="example",
|
|
82
|
+
entry_node="start",
|
|
83
|
+
exit_node="end",
|
|
84
|
+
nodes=[
|
|
85
|
+
GraphNode(id="start", type=NodeType.MODEL, agent_name="worker",
|
|
86
|
+
output_mapping={"output": "result"}),
|
|
87
|
+
GraphNode(id="end", type=NodeType.MODEL, agent_name="worker",
|
|
88
|
+
input_mapping={"result": "input"}, output_mapping={"output": "final"}),
|
|
89
|
+
],
|
|
90
|
+
edges=[
|
|
91
|
+
GraphEdge(source="start", target="end"),
|
|
92
|
+
],
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
runtime = Runtime(trace_dir=Path(".routekit/traces"))
|
|
96
|
+
runtime.register_agent(agent)
|
|
97
|
+
policy = GraphPolicy(graph=graph)
|
|
98
|
+
|
|
99
|
+
result = await runtime.run("worker", "Hello", policy=policy)
|
|
100
|
+
print(result.output.content)
|
|
101
|
+
print("Trace ID:", result.trace_id)
|
|
102
|
+
|
|
103
|
+
asyncio.run(main())
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
In practice you’ll often build the graph and policy once, then call `runtime.run(...)` with the appropriate agent and policy. See [Graph workflows](guides/graph-workflows.md) for full details.
|
|
107
|
+
|
|
108
|
+
## Next steps
|
|
109
|
+
|
|
110
|
+
- **[Running agents](guides/running-agents.md)** — `run` vs `run_stream`, using `Runtime` directly, trace directory.
|
|
111
|
+
- **[Creating tools](guides/creating-tools.md)** — Define tools with Pydantic input/output, permissions, redaction.
|
|
112
|
+
- **[Graph workflows](guides/graph-workflows.md)** — Nodes, edges, state mapping, `GraphPolicy`, subgraphs.
|
|
113
|
+
- **[Tracing and replay](guides/tracing-and-replay.md)** — Trace IDs, CLI (`trace`, `trace-analyze`, `replay`), replay for tests.
|
|
114
|
+
- **[CLI reference](guides/cli-reference.md)** — All `routekitai` commands and options.
|
|
115
|
+
- **[Providers](guides/providers.md)** — FakeModel, OpenAI, environment variables.
|
|
116
|
+
|
|
117
|
+
For design and concepts, see [Architecture](architecture.md). For security (PII redaction, tool filtering, approval gates), see [Security & Governance](security-and-governance.md).
|