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.
- {telize-0.2.0 → telize-0.2.1}/PKG-INFO +66 -15
- {telize-0.2.0 → telize-0.2.1}/README.md +65 -14
- {telize-0.2.0 → telize-0.2.1}/pyproject.toml +1 -1
- {telize-0.2.0 → telize-0.2.1}/.github/workflows/ci.yml +0 -0
- {telize-0.2.0 → telize-0.2.1}/.github/workflows/publish.yml +0 -0
- {telize-0.2.0 → telize-0.2.1}/.gitignore +0 -0
- {telize-0.2.0 → telize-0.2.1}/.python-version +0 -0
- {telize-0.2.0 → telize-0.2.1}/CHANGELOG.md +0 -0
- {telize-0.2.0 → telize-0.2.1}/CONTRIBUTING.md +0 -0
- {telize-0.2.0 → telize-0.2.1}/LICENSE +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/call_subflow.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/data/notes/alpha.md +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/data/notes/beta.md +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/data/sample.txt +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/env_config.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/llm_loop.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/llm_save_output.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/minimal_llm.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/multi_model.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/nested_workflow.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/nested_workflow_child.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/python_step.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/read_directory.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/read_file.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/shell_to_llm.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/shell_with_env.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/examples/spec_reference.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/__init__.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/__main__.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/__version__.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/cli.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/config/__init__.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/config/loader.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/config/models/__init__.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/config/models/actions.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/config/models/config.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/config/models/flow.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/config/models/spec.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/console/__init__.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/console/display.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/console/observer.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/exceptions.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/providers/__init__.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/providers/base.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/providers/openai.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/providers/registry.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/py.typed +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/__init__.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/__init__.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/base.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/input.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/llm.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/python.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/registry.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/shell.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/actions/yaml.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/context.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/observer.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/paths.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/planning.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/runner.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/state.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/runtime/workflow_input.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/templating/__init__.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/templating/context.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/templating/load.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/src/telize/templating/renderer.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/conftest.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/fixtures/cli_input_workflow.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/fixtures/external_child_workflow.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/fixtures/hello_agent_workflow.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/fixtures/invalid_duplicate_step.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/fixtures/minimal_workflow.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/fixtures/shell_only.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/fixtures/yaml_child_config_workflow.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/fixtures/yaml_input_workflow.yaml +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_cli.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_console_display.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_console_observer.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_llm_system_prompt.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_loader.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_loader_env.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_models.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_observer.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_openai_provider.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_planning.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_runner.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_templating.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_templating_load.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_version.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_workflow_input.py +0 -0
- {telize-0.2.0 → telize-0.2.1}/tests/test_yaml_action.py +0 -0
- {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.
|
|
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
|
-
**
|
|
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
|
|
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/) (
|
|
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
|
|
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
|
|
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
|
|
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`
|
|
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 }}`, `{{
|
|
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
|
-
**
|
|
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
|
|
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/) (
|
|
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
|
|
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
|
|
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
|
|
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`
|
|
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 }}`, `{{
|
|
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 }}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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
|