telize 0.2.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.
Files changed (93) hide show
  1. {telize-0.2.0 → telize-0.2.1}/PKG-INFO +66 -15
  2. {telize-0.2.0 → telize-0.2.1}/README.md +65 -14
  3. {telize-0.2.0 → telize-0.2.1}/pyproject.toml +1 -1
  4. {telize-0.2.0 → telize-0.2.1}/.github/workflows/ci.yml +0 -0
  5. {telize-0.2.0 → telize-0.2.1}/.github/workflows/publish.yml +0 -0
  6. {telize-0.2.0 → telize-0.2.1}/.gitignore +0 -0
  7. {telize-0.2.0 → telize-0.2.1}/.python-version +0 -0
  8. {telize-0.2.0 → telize-0.2.1}/CHANGELOG.md +0 -0
  9. {telize-0.2.0 → telize-0.2.1}/CONTRIBUTING.md +0 -0
  10. {telize-0.2.0 → telize-0.2.1}/LICENSE +0 -0
  11. {telize-0.2.0 → telize-0.2.1}/examples/call_subflow.yaml +0 -0
  12. {telize-0.2.0 → telize-0.2.1}/examples/data/notes/alpha.md +0 -0
  13. {telize-0.2.0 → telize-0.2.1}/examples/data/notes/beta.md +0 -0
  14. {telize-0.2.0 → telize-0.2.1}/examples/data/sample.txt +0 -0
  15. {telize-0.2.0 → telize-0.2.1}/examples/env_config.yaml +0 -0
  16. {telize-0.2.0 → telize-0.2.1}/examples/llm_loop.yaml +0 -0
  17. {telize-0.2.0 → telize-0.2.1}/examples/llm_save_output.yaml +0 -0
  18. {telize-0.2.0 → telize-0.2.1}/examples/minimal_llm.yaml +0 -0
  19. {telize-0.2.0 → telize-0.2.1}/examples/multi_model.yaml +0 -0
  20. {telize-0.2.0 → telize-0.2.1}/examples/nested_workflow.yaml +0 -0
  21. {telize-0.2.0 → telize-0.2.1}/examples/nested_workflow_child.yaml +0 -0
  22. {telize-0.2.0 → telize-0.2.1}/examples/python_step.yaml +0 -0
  23. {telize-0.2.0 → telize-0.2.1}/examples/read_directory.yaml +0 -0
  24. {telize-0.2.0 → telize-0.2.1}/examples/read_file.yaml +0 -0
  25. {telize-0.2.0 → telize-0.2.1}/examples/shell_to_llm.yaml +0 -0
  26. {telize-0.2.0 → telize-0.2.1}/examples/shell_with_env.yaml +0 -0
  27. {telize-0.2.0 → telize-0.2.1}/examples/spec_reference.yaml +0 -0
  28. {telize-0.2.0 → telize-0.2.1}/src/telize/__init__.py +0 -0
  29. {telize-0.2.0 → telize-0.2.1}/src/telize/__main__.py +0 -0
  30. {telize-0.2.0 → telize-0.2.1}/src/telize/__version__.py +0 -0
  31. {telize-0.2.0 → telize-0.2.1}/src/telize/cli.py +0 -0
  32. {telize-0.2.0 → telize-0.2.1}/src/telize/config/__init__.py +0 -0
  33. {telize-0.2.0 → telize-0.2.1}/src/telize/config/loader.py +0 -0
  34. {telize-0.2.0 → telize-0.2.1}/src/telize/config/models/__init__.py +0 -0
  35. {telize-0.2.0 → telize-0.2.1}/src/telize/config/models/actions.py +0 -0
  36. {telize-0.2.0 → telize-0.2.1}/src/telize/config/models/config.py +0 -0
  37. {telize-0.2.0 → telize-0.2.1}/src/telize/config/models/flow.py +0 -0
  38. {telize-0.2.0 → telize-0.2.1}/src/telize/config/models/spec.py +0 -0
  39. {telize-0.2.0 → telize-0.2.1}/src/telize/console/__init__.py +0 -0
  40. {telize-0.2.0 → telize-0.2.1}/src/telize/console/display.py +0 -0
  41. {telize-0.2.0 → telize-0.2.1}/src/telize/console/observer.py +0 -0
  42. {telize-0.2.0 → telize-0.2.1}/src/telize/exceptions.py +0 -0
  43. {telize-0.2.0 → telize-0.2.1}/src/telize/providers/__init__.py +0 -0
  44. {telize-0.2.0 → telize-0.2.1}/src/telize/providers/base.py +0 -0
  45. {telize-0.2.0 → telize-0.2.1}/src/telize/providers/openai.py +0 -0
  46. {telize-0.2.0 → telize-0.2.1}/src/telize/providers/registry.py +0 -0
  47. {telize-0.2.0 → telize-0.2.1}/src/telize/py.typed +0 -0
  48. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/__init__.py +0 -0
  49. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/__init__.py +0 -0
  50. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/base.py +0 -0
  51. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/input.py +0 -0
  52. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/llm.py +0 -0
  53. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/python.py +0 -0
  54. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/registry.py +0 -0
  55. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/shell.py +0 -0
  56. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/yaml.py +0 -0
  57. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/context.py +0 -0
  58. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/observer.py +0 -0
  59. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/paths.py +0 -0
  60. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/planning.py +0 -0
  61. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/runner.py +0 -0
  62. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/state.py +0 -0
  63. {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/workflow_input.py +0 -0
  64. {telize-0.2.0 → telize-0.2.1}/src/telize/templating/__init__.py +0 -0
  65. {telize-0.2.0 → telize-0.2.1}/src/telize/templating/context.py +0 -0
  66. {telize-0.2.0 → telize-0.2.1}/src/telize/templating/load.py +0 -0
  67. {telize-0.2.0 → telize-0.2.1}/src/telize/templating/renderer.py +0 -0
  68. {telize-0.2.0 → telize-0.2.1}/tests/conftest.py +0 -0
  69. {telize-0.2.0 → telize-0.2.1}/tests/fixtures/cli_input_workflow.yaml +0 -0
  70. {telize-0.2.0 → telize-0.2.1}/tests/fixtures/external_child_workflow.yaml +0 -0
  71. {telize-0.2.0 → telize-0.2.1}/tests/fixtures/hello_agent_workflow.yaml +0 -0
  72. {telize-0.2.0 → telize-0.2.1}/tests/fixtures/invalid_duplicate_step.yaml +0 -0
  73. {telize-0.2.0 → telize-0.2.1}/tests/fixtures/minimal_workflow.yaml +0 -0
  74. {telize-0.2.0 → telize-0.2.1}/tests/fixtures/shell_only.yaml +0 -0
  75. {telize-0.2.0 → telize-0.2.1}/tests/fixtures/yaml_child_config_workflow.yaml +0 -0
  76. {telize-0.2.0 → telize-0.2.1}/tests/fixtures/yaml_input_workflow.yaml +0 -0
  77. {telize-0.2.0 → telize-0.2.1}/tests/test_cli.py +0 -0
  78. {telize-0.2.0 → telize-0.2.1}/tests/test_console_display.py +0 -0
  79. {telize-0.2.0 → telize-0.2.1}/tests/test_console_observer.py +0 -0
  80. {telize-0.2.0 → telize-0.2.1}/tests/test_llm_system_prompt.py +0 -0
  81. {telize-0.2.0 → telize-0.2.1}/tests/test_loader.py +0 -0
  82. {telize-0.2.0 → telize-0.2.1}/tests/test_loader_env.py +0 -0
  83. {telize-0.2.0 → telize-0.2.1}/tests/test_models.py +0 -0
  84. {telize-0.2.0 → telize-0.2.1}/tests/test_observer.py +0 -0
  85. {telize-0.2.0 → telize-0.2.1}/tests/test_openai_provider.py +0 -0
  86. {telize-0.2.0 → telize-0.2.1}/tests/test_planning.py +0 -0
  87. {telize-0.2.0 → telize-0.2.1}/tests/test_runner.py +0 -0
  88. {telize-0.2.0 → telize-0.2.1}/tests/test_templating.py +0 -0
  89. {telize-0.2.0 → telize-0.2.1}/tests/test_templating_load.py +0 -0
  90. {telize-0.2.0 → telize-0.2.1}/tests/test_version.py +0 -0
  91. {telize-0.2.0 → telize-0.2.1}/tests/test_workflow_input.py +0 -0
  92. {telize-0.2.0 → telize-0.2.1}/tests/test_yaml_action.py +0 -0
  93. {telize-0.2.0 → telize-0.2.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: telize
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Low-code agent framework: define agents and flows in YAML, run them from the CLI.
5
5
  Project-URL: Homepage, https://github.com/telize-ai/telize
6
6
  Project-URL: Documentation, https://github.com/telize-ai/telize#readme
@@ -38,7 +38,7 @@ Description-Content-Type: text/markdown
38
38
 
39
39
  # Telize
40
40
 
41
- **Unleash orchestrated AI agents with superhuman reach—build intricate, multi-stage workflows in YAML and command their power from your terminal, under your complete control.**
41
+ **Build reproducible, structured AI workflows with YAML and run them from your terminal, combining LLMs, shell, Python, and more—fully under your control.**
42
42
 
43
43
  Telize is a low-code framework for building agent-style pipelines: chain shell commands, file I/O, LLM calls, Python functions, and nested flows in a single workflow file. Configuration is validated before execution, and the CLI shows live progress as each step completes.
44
44
 
@@ -62,7 +62,7 @@ Telize is a low-code framework for building agent-style pipelines: chain shell c
62
62
 
63
63
  ## Features
64
64
 
65
- - **YAML workflows** — one file defines global config, named flows, and steps
65
+ - **YAML workflows** — one file defines `config`, named `models`, flows, and steps
66
66
  - **Composable steps** — `input`, `llm`, `shell`, `python`, `flow`, and `yaml` actions
67
67
  - **Jinja templating** — wire step outputs together with `{{ steps.name.output }}`
68
68
  - **Loops and sub-flows** — iterate LLM steps over split lists; call nested flows with `uses: flow`
@@ -73,7 +73,7 @@ Telize is a low-code framework for building agent-style pipelines: chain shell c
73
73
  ## Requirements
74
74
 
75
75
  - **Python 3.12+**
76
- - **LLM endpoint** for `uses: llm` steps — [OpenAI](https://platform.openai.com/) or [Ollama](https://ollama.com/) (OpenAI-compatible at `http://localhost:11434` by default)
76
+ - **LLM endpoint** for `uses: llm` steps — [OpenAI](https://platform.openai.com/) or [Ollama](https://ollama.com/); set `api_url` on each model profile (default `http://localhost:11434`)
77
77
  - Optional: [uv](https://docs.astral.sh/uv/) for fast local development
78
78
 
79
79
  ## Installation
@@ -102,25 +102,29 @@ telize --version
102
102
  **1.** For local models, start [Ollama](https://ollama.com/) and pull a model:
103
103
 
104
104
  ```bash
105
- ollama pull qwen3.5:4b # or any model you set in config
105
+ ollama pull qwen3.5:4b # or any model id you set under models.*.model
106
106
  ```
107
107
 
108
- For OpenAI Cloud, set `OPENAI_API_KEY` and use `api_base_url: https://api.openai.com/v1` (or omit `api_base_url` to use the SDK default).
108
+ For OpenAI Cloud, set `OPENAI_API_KEY` and point a model profile at the API, for example `api_url: https://api.openai.com/v1`.
109
109
 
110
110
  **2.** Create `hello.yaml`:
111
111
 
112
112
  ```yaml
113
113
  config:
114
- provider: openai
115
- model: qwen3.5:4b
116
- api_base_url: http://localhost:11434
117
114
  entrypoint: main
118
115
 
116
+ models:
117
+ default:
118
+ provider: openai
119
+ model: qwen3.5:4b
120
+ api_url: http://localhost:11434
121
+
119
122
  flows:
120
123
  main:
121
124
  steps:
122
125
  - name: greet
123
126
  uses: llm
127
+ model: default
124
128
  prompt: Say hello in one friendly sentence.
125
129
  ```
126
130
 
@@ -157,9 +161,9 @@ telize -f examples/spec_reference.yaml --validate-only
157
161
  (step → step) (split & iterate) (uses: flow)
158
162
  ```
159
163
 
160
- 1. Telize loads your YAML and validates it against typed models.
164
+ 1. Telize loads your YAML and validates it against typed Pydantic models.
161
165
  2. The flow named in `config.entrypoint` runs first.
162
- 3. Each step executes through a registered action (`input`, `llm`, `shell`, …).
166
+ 3. Each step executes through a registered action (`input`, `llm`, `shell`, …); `llm` steps resolve their `model:` profile from the top-level `models` map.
163
167
  4. Later steps can reference earlier outputs via Jinja templates.
164
168
  5. The CLI prints progress and results as the workflow runs.
165
169
 
@@ -169,9 +173,55 @@ telize -f examples/spec_reference.yaml --validate-only
169
173
 
170
174
  | Key | Description |
171
175
  |-----|-------------|
172
- | `config` | Global settings: `entrypoint`, `provider`, `model`, `temperature`, `api_base_url`, `api_key`, `system_prompt` |
176
+ | `config` | Global settings: `entrypoint` (which flow runs first) |
177
+ | `models` | Named LLM profiles; referenced by `model:` on each `uses: llm` step |
173
178
  | `flows` | Named flows; `config.entrypoint` must match one of these keys |
174
179
 
180
+ ### `config`
181
+
182
+ | Field | Description |
183
+ |-------|-------------|
184
+ | `entrypoint` | Name of the flow to run when the file is executed |
185
+
186
+ ### `models`
187
+
188
+ Each key under `models` is a profile name (for example `default`, `creative`). LLM steps pick a profile with `model: <name>`.
189
+
190
+ | Field | Required | Description |
191
+ |-------|----------|-------------|
192
+ | `provider` | no (default `openai`) | Registered provider id |
193
+ | `model` | yes | Model id passed to the provider (e.g. `qwen3.5:4b`, `gpt-4o-mini`) |
194
+ | `temperature` | no | Sampling temperature (0–2) |
195
+ | `api_url` | no (default `http://localhost:11434`) | OpenAI-compatible API base URL (`/v1` is appended automatically) |
196
+ | `api_key` | no | API key; use `{{ env.OPENAI_API_KEY }}` or rely on the `OPENAI_API_KEY` env var |
197
+ | `system_prompt` | no | System message for steps using this profile (Jinja at runtime) |
198
+
199
+ Example — multiple profiles:
200
+
201
+ ```yaml
202
+ models:
203
+ factual:
204
+ model: qwen3.5:4b
205
+ temperature: 0.2
206
+ api_url: http://localhost:11434
207
+ system_prompt: Be concise and factual.
208
+
209
+ creative:
210
+ model: qwen3.5:4b
211
+ temperature: 1.0
212
+ api_url: http://localhost:11434
213
+ system_prompt: Be witty but brief.
214
+ ```
215
+
216
+ Load-time env in `api_url` (see [`examples/env_config.yaml`](examples/env_config.yaml)):
217
+
218
+ ```yaml
219
+ models:
220
+ default:
221
+ model: qwen3.5:4b
222
+ api_url: http://{{ env.OLLAMA_HOST }}:11434
223
+ ```
224
+
175
225
  ### Flow
176
226
 
177
227
  | Field | Description |
@@ -183,11 +233,11 @@ telize -f examples/spec_reference.yaml --validate-only
183
233
  | `uses` | Description |
184
234
  |--------|-------------|
185
235
  | `input` | Read a `file` or a `directory` (with glob `include`) |
186
- | `llm` | Send a `prompt` to the configured model; optional `output_to`, `loop` |
236
+ | `llm` | Send a `prompt` using a named `model` from `models`; optional `output_to`, `loop` |
187
237
  | `shell` | Run `run` commands; optional `envs` (supports templates) |
188
238
  | `python` | Call `call` (`module.function`) with `args` |
189
239
  | `flow` | Run another flow via `run` |
190
- | `yaml` | Run an external workflow from `file` (own `config` and `flows`); optional `input` map passed to the child as `{{ input.key }}` |
240
+ | `yaml` | Run an external workflow from `file` (own `config`, `models`, and `flows`); optional `input` map passed to the child as `{{ input.key }}` |
191
241
 
192
242
  ### Templating
193
243
 
@@ -196,7 +246,7 @@ Telize uses [Jinja2](https://jinja.palletsprojects.com/) in step fields.
196
246
  | When | What you can use |
197
247
  |------|------------------|
198
248
  | **Load time** | `{{ env.VAR }}` — expanded when the file is parsed |
199
- | **Runtime** | `{{ steps.<name>.output }}`, `{{ config.model }}`, `{{ input.<key> }}`, `{{ item }}` (inside loops) |
249
+ | **Runtime** | `{{ steps.<name>.output }}`, `{{ models.<name>.model }}`, `{{ input.<key> }}`, `{{ item }}` (inside loops) |
200
250
 
201
251
  Workflow **input** is provided when invoking Telize from the shell (`--input`, `--input-file`, `--input-stdin`) or by a parent `yaml` step's `input` map when running a nested workflow.
202
252
 
@@ -209,6 +259,7 @@ Example — chain a shell step into an LLM step:
209
259
 
210
260
  - name: summarize
211
261
  uses: llm
262
+ model: default
212
263
  prompt: |
213
264
  Summarize this:
214
265
  {{ steps.fetch_data.output }}
@@ -1,6 +1,6 @@
1
1
  # Telize
2
2
 
3
- **Unleash orchestrated AI agents with superhuman reach—build intricate, multi-stage workflows in YAML and command their power from your terminal, under your complete control.**
3
+ **Build reproducible, structured AI workflows with YAML and run them from your terminal, combining LLMs, shell, Python, and more—fully under your control.**
4
4
 
5
5
  Telize is a low-code framework for building agent-style pipelines: chain shell commands, file I/O, LLM calls, Python functions, and nested flows in a single workflow file. Configuration is validated before execution, and the CLI shows live progress as each step completes.
6
6
 
@@ -24,7 +24,7 @@ Telize is a low-code framework for building agent-style pipelines: chain shell c
24
24
 
25
25
  ## Features
26
26
 
27
- - **YAML workflows** — one file defines global config, named flows, and steps
27
+ - **YAML workflows** — one file defines `config`, named `models`, flows, and steps
28
28
  - **Composable steps** — `input`, `llm`, `shell`, `python`, `flow`, and `yaml` actions
29
29
  - **Jinja templating** — wire step outputs together with `{{ steps.name.output }}`
30
30
  - **Loops and sub-flows** — iterate LLM steps over split lists; call nested flows with `uses: flow`
@@ -35,7 +35,7 @@ Telize is a low-code framework for building agent-style pipelines: chain shell c
35
35
  ## Requirements
36
36
 
37
37
  - **Python 3.12+**
38
- - **LLM endpoint** for `uses: llm` steps — [OpenAI](https://platform.openai.com/) or [Ollama](https://ollama.com/) (OpenAI-compatible at `http://localhost:11434` by default)
38
+ - **LLM endpoint** for `uses: llm` steps — [OpenAI](https://platform.openai.com/) or [Ollama](https://ollama.com/); set `api_url` on each model profile (default `http://localhost:11434`)
39
39
  - Optional: [uv](https://docs.astral.sh/uv/) for fast local development
40
40
 
41
41
  ## Installation
@@ -64,25 +64,29 @@ telize --version
64
64
  **1.** For local models, start [Ollama](https://ollama.com/) and pull a model:
65
65
 
66
66
  ```bash
67
- ollama pull qwen3.5:4b # or any model you set in config
67
+ ollama pull qwen3.5:4b # or any model id you set under models.*.model
68
68
  ```
69
69
 
70
- For OpenAI Cloud, set `OPENAI_API_KEY` and use `api_base_url: https://api.openai.com/v1` (or omit `api_base_url` to use the SDK default).
70
+ For OpenAI Cloud, set `OPENAI_API_KEY` and point a model profile at the API, for example `api_url: https://api.openai.com/v1`.
71
71
 
72
72
  **2.** Create `hello.yaml`:
73
73
 
74
74
  ```yaml
75
75
  config:
76
- provider: openai
77
- model: qwen3.5:4b
78
- api_base_url: http://localhost:11434
79
76
  entrypoint: main
80
77
 
78
+ models:
79
+ default:
80
+ provider: openai
81
+ model: qwen3.5:4b
82
+ api_url: http://localhost:11434
83
+
81
84
  flows:
82
85
  main:
83
86
  steps:
84
87
  - name: greet
85
88
  uses: llm
89
+ model: default
86
90
  prompt: Say hello in one friendly sentence.
87
91
  ```
88
92
 
@@ -119,9 +123,9 @@ telize -f examples/spec_reference.yaml --validate-only
119
123
  (step → step) (split & iterate) (uses: flow)
120
124
  ```
121
125
 
122
- 1. Telize loads your YAML and validates it against typed models.
126
+ 1. Telize loads your YAML and validates it against typed Pydantic models.
123
127
  2. The flow named in `config.entrypoint` runs first.
124
- 3. Each step executes through a registered action (`input`, `llm`, `shell`, …).
128
+ 3. Each step executes through a registered action (`input`, `llm`, `shell`, …); `llm` steps resolve their `model:` profile from the top-level `models` map.
125
129
  4. Later steps can reference earlier outputs via Jinja templates.
126
130
  5. The CLI prints progress and results as the workflow runs.
127
131
 
@@ -131,9 +135,55 @@ telize -f examples/spec_reference.yaml --validate-only
131
135
 
132
136
  | Key | Description |
133
137
  |-----|-------------|
134
- | `config` | Global settings: `entrypoint`, `provider`, `model`, `temperature`, `api_base_url`, `api_key`, `system_prompt` |
138
+ | `config` | Global settings: `entrypoint` (which flow runs first) |
139
+ | `models` | Named LLM profiles; referenced by `model:` on each `uses: llm` step |
135
140
  | `flows` | Named flows; `config.entrypoint` must match one of these keys |
136
141
 
142
+ ### `config`
143
+
144
+ | Field | Description |
145
+ |-------|-------------|
146
+ | `entrypoint` | Name of the flow to run when the file is executed |
147
+
148
+ ### `models`
149
+
150
+ Each key under `models` is a profile name (for example `default`, `creative`). LLM steps pick a profile with `model: <name>`.
151
+
152
+ | Field | Required | Description |
153
+ |-------|----------|-------------|
154
+ | `provider` | no (default `openai`) | Registered provider id |
155
+ | `model` | yes | Model id passed to the provider (e.g. `qwen3.5:4b`, `gpt-4o-mini`) |
156
+ | `temperature` | no | Sampling temperature (0–2) |
157
+ | `api_url` | no (default `http://localhost:11434`) | OpenAI-compatible API base URL (`/v1` is appended automatically) |
158
+ | `api_key` | no | API key; use `{{ env.OPENAI_API_KEY }}` or rely on the `OPENAI_API_KEY` env var |
159
+ | `system_prompt` | no | System message for steps using this profile (Jinja at runtime) |
160
+
161
+ Example — multiple profiles:
162
+
163
+ ```yaml
164
+ models:
165
+ factual:
166
+ model: qwen3.5:4b
167
+ temperature: 0.2
168
+ api_url: http://localhost:11434
169
+ system_prompt: Be concise and factual.
170
+
171
+ creative:
172
+ model: qwen3.5:4b
173
+ temperature: 1.0
174
+ api_url: http://localhost:11434
175
+ system_prompt: Be witty but brief.
176
+ ```
177
+
178
+ Load-time env in `api_url` (see [`examples/env_config.yaml`](examples/env_config.yaml)):
179
+
180
+ ```yaml
181
+ models:
182
+ default:
183
+ model: qwen3.5:4b
184
+ api_url: http://{{ env.OLLAMA_HOST }}:11434
185
+ ```
186
+
137
187
  ### Flow
138
188
 
139
189
  | Field | Description |
@@ -145,11 +195,11 @@ telize -f examples/spec_reference.yaml --validate-only
145
195
  | `uses` | Description |
146
196
  |--------|-------------|
147
197
  | `input` | Read a `file` or a `directory` (with glob `include`) |
148
- | `llm` | Send a `prompt` to the configured model; optional `output_to`, `loop` |
198
+ | `llm` | Send a `prompt` using a named `model` from `models`; optional `output_to`, `loop` |
149
199
  | `shell` | Run `run` commands; optional `envs` (supports templates) |
150
200
  | `python` | Call `call` (`module.function`) with `args` |
151
201
  | `flow` | Run another flow via `run` |
152
- | `yaml` | Run an external workflow from `file` (own `config` and `flows`); optional `input` map passed to the child as `{{ input.key }}` |
202
+ | `yaml` | Run an external workflow from `file` (own `config`, `models`, and `flows`); optional `input` map passed to the child as `{{ input.key }}` |
153
203
 
154
204
  ### Templating
155
205
 
@@ -158,7 +208,7 @@ Telize uses [Jinja2](https://jinja.palletsprojects.com/) in step fields.
158
208
  | When | What you can use |
159
209
  |------|------------------|
160
210
  | **Load time** | `{{ env.VAR }}` — expanded when the file is parsed |
161
- | **Runtime** | `{{ steps.<name>.output }}`, `{{ config.model }}`, `{{ input.<key> }}`, `{{ item }}` (inside loops) |
211
+ | **Runtime** | `{{ steps.<name>.output }}`, `{{ models.<name>.model }}`, `{{ input.<key> }}`, `{{ item }}` (inside loops) |
162
212
 
163
213
  Workflow **input** is provided when invoking Telize from the shell (`--input`, `--input-file`, `--input-stdin`) or by a parent `yaml` step's `input` map when running a nested workflow.
164
214
 
@@ -171,6 +221,7 @@ Example — chain a shell step into an LLM step:
171
221
 
172
222
  - name: summarize
173
223
  uses: llm
224
+ model: default
174
225
  prompt: |
175
226
  Summarize this:
176
227
  {{ steps.fetch_data.output }}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "telize"
3
- version = "0.2.0"
3
+ version = "0.2.1"
4
4
  description = "Low-code agent framework: define agents and flows in YAML, run them from the CLI."
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
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