evalforge-runtime 0.1.0__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 (43) hide show
  1. evalforge_runtime-0.1.0/.github/workflows/workflow.yml +46 -0
  2. evalforge_runtime-0.1.0/.gitignore +41 -0
  3. evalforge_runtime-0.1.0/LICENSE +21 -0
  4. evalforge_runtime-0.1.0/PKG-INFO +259 -0
  5. evalforge_runtime-0.1.0/README.md +200 -0
  6. evalforge_runtime-0.1.0/fixtures/evalforge.config.yaml +34 -0
  7. evalforge_runtime-0.1.0/pyproject.toml +79 -0
  8. evalforge_runtime-0.1.0/src/evalforge_runtime/__init__.py +37 -0
  9. evalforge_runtime-0.1.0/src/evalforge_runtime/__main__.py +5 -0
  10. evalforge_runtime-0.1.0/src/evalforge_runtime/auth.py +33 -0
  11. evalforge_runtime-0.1.0/src/evalforge_runtime/config.py +157 -0
  12. evalforge_runtime-0.1.0/src/evalforge_runtime/connectors/__init__.py +5 -0
  13. evalforge_runtime-0.1.0/src/evalforge_runtime/connectors/base.py +40 -0
  14. evalforge_runtime-0.1.0/src/evalforge_runtime/connectors/exchange.py +255 -0
  15. evalforge_runtime-0.1.0/src/evalforge_runtime/connectors/gmail.py +218 -0
  16. evalforge_runtime-0.1.0/src/evalforge_runtime/connectors/slack.py +42 -0
  17. evalforge_runtime-0.1.0/src/evalforge_runtime/connectors/webhook.py +31 -0
  18. evalforge_runtime-0.1.0/src/evalforge_runtime/db.py +227 -0
  19. evalforge_runtime-0.1.0/src/evalforge_runtime/executor.py +112 -0
  20. evalforge_runtime-0.1.0/src/evalforge_runtime/files.py +144 -0
  21. evalforge_runtime-0.1.0/src/evalforge_runtime/observability.py +117 -0
  22. evalforge_runtime-0.1.0/src/evalforge_runtime/pipeline.py +524 -0
  23. evalforge_runtime-0.1.0/src/evalforge_runtime/scheduler.py +85 -0
  24. evalforge_runtime-0.1.0/src/evalforge_runtime/secret_providers/__init__.py +1 -0
  25. evalforge_runtime-0.1.0/src/evalforge_runtime/secret_providers/aws_secrets.py +57 -0
  26. evalforge_runtime-0.1.0/src/evalforge_runtime/secret_providers/azure_keyvault.py +47 -0
  27. evalforge_runtime-0.1.0/src/evalforge_runtime/secret_providers/sap_credential.py +92 -0
  28. evalforge_runtime-0.1.0/src/evalforge_runtime/secrets.py +99 -0
  29. evalforge_runtime-0.1.0/src/evalforge_runtime/server.py +600 -0
  30. evalforge_runtime-0.1.0/src/evalforge_runtime/storage.py +43 -0
  31. evalforge_runtime-0.1.0/src/evalforge_runtime/types.py +232 -0
  32. evalforge_runtime-0.1.0/tests/__init__.py +0 -0
  33. evalforge_runtime-0.1.0/tests/conftest.py +68 -0
  34. evalforge_runtime-0.1.0/tests/test_config.py +80 -0
  35. evalforge_runtime-0.1.0/tests/test_connectors.py +148 -0
  36. evalforge_runtime-0.1.0/tests/test_db.py +156 -0
  37. evalforge_runtime-0.1.0/tests/test_executor.py +141 -0
  38. evalforge_runtime-0.1.0/tests/test_langfuse.py +105 -0
  39. evalforge_runtime-0.1.0/tests/test_pipeline.py +310 -0
  40. evalforge_runtime-0.1.0/tests/test_reviews.py +257 -0
  41. evalforge_runtime-0.1.0/tests/test_secret_providers.py +267 -0
  42. evalforge_runtime-0.1.0/tests/test_server.py +242 -0
  43. evalforge_runtime-0.1.0/uv.lock +3288 -0
@@ -0,0 +1,46 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ jobs:
8
+ build:
9
+ name: Build distribution
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+
14
+ - name: Set up Python
15
+ uses: actions/setup-python@v5
16
+ with:
17
+ python-version: "3.12"
18
+
19
+ - name: Install build dependencies
20
+ run: pip install build
21
+
22
+ - name: Build package
23
+ run: python -m build
24
+
25
+ - name: Upload distribution artifacts
26
+ uses: actions/upload-artifact@v4
27
+ with:
28
+ name: python-package-distributions
29
+ path: dist/
30
+
31
+ publish:
32
+ name: Publish to PyPI
33
+ needs: build
34
+ runs-on: ubuntu-latest
35
+ environment: pypi
36
+ permissions:
37
+ id-token: write
38
+ steps:
39
+ - name: Download distribution artifacts
40
+ uses: actions/download-artifact@v4
41
+ with:
42
+ name: python-package-distributions
43
+ path: dist/
44
+
45
+ - name: Publish to PyPI
46
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,41 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ *.egg
7
+ dist/
8
+ build/
9
+ *.whl
10
+
11
+ # Virtual environments
12
+ .venv/
13
+ venv/
14
+ ENV/
15
+
16
+ # IDE
17
+ .idea/
18
+ .vscode/
19
+ *.swp
20
+ *.swo
21
+
22
+ # Testing
23
+ .pytest_cache/
24
+ .coverage
25
+ htmlcov/
26
+
27
+ # Runtime data
28
+ data/
29
+ *.db
30
+ *.sqlite
31
+
32
+ # Environment
33
+ .env
34
+ .env.local
35
+
36
+ # OS
37
+ .DS_Store
38
+ Thumbs.db
39
+
40
+ # UV
41
+ .python-version
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jannis Conen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,259 @@
1
+ Metadata-Version: 2.4
2
+ Name: evalforge-runtime
3
+ Version: 0.1.0
4
+ Summary: Runtime engine for EvalForge generated applications
5
+ Project-URL: Homepage, https://github.com/JannisConen/evalforge-runtime
6
+ Project-URL: Repository, https://github.com/JannisConen/evalforge-runtime
7
+ Project-URL: Issues, https://github.com/JannisConen/evalforge-runtime/issues
8
+ Author: Jannis Conen
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: ai,evalforge,evaluation,fastapi,llm,runtime
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Framework :: FastAPI
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Topic :: Software Development :: Libraries
22
+ Requires-Python: >=3.10
23
+ Requires-Dist: aiosqlite>=0.20.0
24
+ Requires-Dist: fastapi>=0.115.0
25
+ Requires-Dist: httpx>=0.28.0
26
+ Requires-Dist: litellm>=1.60.0
27
+ Requires-Dist: pydantic-settings>=2.7.0
28
+ Requires-Dist: pydantic>=2.10.0
29
+ Requires-Dist: python-dotenv>=1.0.0
30
+ Requires-Dist: python-multipart>=0.0.18
31
+ Requires-Dist: pyyaml>=6.0
32
+ Requires-Dist: sqlalchemy>=2.0.0
33
+ Requires-Dist: uvicorn[standard]>=0.34.0
34
+ Provides-Extra: all
35
+ Requires-Dist: apscheduler<4.0.0,>=3.10.0; extra == 'all'
36
+ Requires-Dist: azure-identity>=1.15.0; extra == 'all'
37
+ Requires-Dist: azure-keyvault-secrets>=4.8.0; extra == 'all'
38
+ Requires-Dist: boto3>=1.34.0; extra == 'all'
39
+ Requires-Dist: google-auth>=2.0.0; extra == 'all'
40
+ Requires-Dist: langfuse>=2.0.0; extra == 'all'
41
+ Provides-Extra: aws
42
+ Requires-Dist: boto3>=1.34.0; extra == 'aws'
43
+ Provides-Extra: azure
44
+ Requires-Dist: azure-identity>=1.15.0; extra == 'azure'
45
+ Requires-Dist: azure-keyvault-secrets>=4.8.0; extra == 'azure'
46
+ Provides-Extra: dev
47
+ Requires-Dist: pytest-asyncio>=0.24.0; extra == 'dev'
48
+ Requires-Dist: pytest>=8.0; extra == 'dev'
49
+ Requires-Dist: ruff>=0.9.0; extra == 'dev'
50
+ Provides-Extra: exchange
51
+ Requires-Dist: httpx>=0.28.0; extra == 'exchange'
52
+ Provides-Extra: gmail
53
+ Requires-Dist: google-auth>=2.0.0; extra == 'gmail'
54
+ Provides-Extra: langfuse
55
+ Requires-Dist: langfuse>=2.0.0; extra == 'langfuse'
56
+ Provides-Extra: scheduling
57
+ Requires-Dist: apscheduler<4.0.0,>=3.10.0; extra == 'scheduling'
58
+ Description-Content-Type: text/markdown
59
+
60
+ # evalforge-runtime
61
+
62
+ Runtime engine for [EvalForge](https://github.com/JannisConen/evalforge-runtime) generated applications. Provides a FastAPI server that executes LLM-powered processes with cost tracking, execution logging, secret management, and file handling.
63
+
64
+ > Completely vibe-coded in 1 hour.
65
+
66
+ ## Installation
67
+
68
+ ```bash
69
+ pip install evalforge-runtime
70
+ ```
71
+
72
+ With optional extras:
73
+
74
+ ```bash
75
+ # Langfuse observability
76
+ pip install evalforge-runtime[langfuse]
77
+
78
+ # Azure Key Vault secrets
79
+ pip install evalforge-runtime[azure]
80
+
81
+ # AWS Secrets Manager
82
+ pip install evalforge-runtime[aws]
83
+
84
+ # Everything
85
+ pip install evalforge-runtime[all]
86
+ ```
87
+
88
+ ## Quick start
89
+
90
+ ### 1. Create a config file
91
+
92
+ Create `evalforge.config.yaml` in your project root:
93
+
94
+ ```yaml
95
+ project:
96
+ id: my-project
97
+
98
+ llm:
99
+ model: anthropic/claude-sonnet-4-6
100
+
101
+ processes:
102
+ classify:
103
+ process_id: classify
104
+ trigger:
105
+ type: webhook
106
+ instructions: |
107
+ Classify the incoming support ticket into one of: billing, technical, general.
108
+ ```
109
+
110
+ ### 2. Set your API keys
111
+
112
+ ```bash
113
+ export EVALFORGE_API_KEYS=my-secret-key
114
+ export ANTHROPIC_API_KEY=sk-ant-...
115
+ ```
116
+
117
+ `EVALFORGE_API_KEYS` is a comma-separated list of keys that authenticate requests to the runtime.
118
+
119
+ ### 3. Start the server
120
+
121
+ ```bash
122
+ evalforge-runtime start --config evalforge.config.yaml
123
+ ```
124
+
125
+ The server starts on `http://localhost:8000` by default.
126
+
127
+ ### 4. Call a process
128
+
129
+ ```bash
130
+ curl -X POST http://localhost:8000/process/classify \
131
+ -H "Authorization: Bearer my-secret-key" \
132
+ -H "Content-Type: application/json" \
133
+ -d '{"ticket_text": "I cannot log in to my account"}'
134
+ ```
135
+
136
+ ## API endpoints
137
+
138
+ | Method | Path | Description |
139
+ |--------|------|-------------|
140
+ | `GET` | `/health` | Health check with version and uptime |
141
+ | `POST` | `/process/<name>` | Execute a process (authenticated) |
142
+ | `GET` | `/executions` | Query execution history |
143
+ | `GET` | `/executions/:id` | Single execution detail |
144
+ | `GET` | `/executions/stats` | Aggregated cost, latency, and volume stats |
145
+
146
+ ## Configuration
147
+
148
+ The runtime is configured via `evalforge.config.yaml`. Environment variables can be referenced with `${VAR_NAME}` syntax.
149
+
150
+ ### Top-level sections
151
+
152
+ ```yaml
153
+ project:
154
+ id: my-project # Required: project identifier
155
+ evalforge_url: https://... # Optional: EvalForge server URL
156
+ version: 1.0.0
157
+
158
+ llm:
159
+ model: anthropic/claude-sonnet-4-6 # Default LLM model (LiteLLM format)
160
+
161
+ database:
162
+ url: sqlite+aiosqlite:///./data/app.db # Execution log database
163
+
164
+ storage:
165
+ type: local # local or s3
166
+ path: ./data/files # Local file storage path
167
+
168
+ auth:
169
+ methods:
170
+ - type: api_key # api_key or oauth2
171
+
172
+ secrets:
173
+ provider: env # env, evalforge, azure_keyvault, aws_secrets_manager, sap_credential_store
174
+
175
+ observability:
176
+ langfuse:
177
+ enabled: false
178
+ host: https://cloud.langfuse.com
179
+ ```
180
+
181
+ ### Process configuration
182
+
183
+ Each process defines an LLM-powered task:
184
+
185
+ ```yaml
186
+ processes:
187
+ my-process:
188
+ process_id: my-process
189
+ trigger:
190
+ type: webhook # webhook, schedule, or process
191
+ cron: "0 9 * * *" # For schedule triggers
192
+ after: other-process # For process triggers (chaining)
193
+ instructions: |
194
+ Your LLM instructions here...
195
+ llm_model: openai/gpt-4o # Override default model
196
+ connector: exchange # Optional: built-in connector
197
+ review:
198
+ enabled: true
199
+ timeout: 24h
200
+ ```
201
+
202
+ ### Custom process modules
203
+
204
+ For advanced logic, provide Python modules for the three-phase pipeline:
205
+
206
+ ```yaml
207
+ processes:
208
+ my-process:
209
+ process_id: my-process
210
+ trigger:
211
+ type: webhook
212
+ before_module: processes.my_process.before # Pre-processing
213
+ execution_module: processes.my_process.execution # Custom LLM call
214
+ after_module: processes.my_process.after # Post-processing
215
+ ```
216
+
217
+ Each module should define an async function matching the phase signature. See the [EvalForge docs](https://github.com/JannisConen/evalforge-runtime) for details.
218
+
219
+ ## Secret providers
220
+
221
+ The runtime supports multiple secret backends:
222
+
223
+ | Provider | Config value | Description |
224
+ |----------|-------------|-------------|
225
+ | Environment | `env` | Read from environment variables (default) |
226
+ | EvalForge | `evalforge` | Fetch from EvalForge server |
227
+ | Azure Key Vault | `azure_keyvault` | Azure Key Vault (`pip install evalforge-runtime[azure]`) |
228
+ | AWS Secrets Manager | `aws_secrets_manager` | AWS Secrets Manager (`pip install evalforge-runtime[aws]`) |
229
+ | SAP Credential Store | `sap_credential_store` | SAP BTP Credential Store |
230
+
231
+ ## CLI reference
232
+
233
+ ```
234
+ evalforge-runtime start [OPTIONS]
235
+
236
+ Options:
237
+ --config PATH Path to evalforge.config.yaml (default: evalforge.config.yaml)
238
+ --host TEXT Bind host (default: 0.0.0.0)
239
+ --port INT Bind port (default: 8000)
240
+ ```
241
+
242
+ ## Development
243
+
244
+ ```bash
245
+ # Clone and install
246
+ git clone https://github.com/JannisConen/evalforge-runtime.git
247
+ cd evalforge-runtime
248
+ pip install -e ".[dev]"
249
+
250
+ # Run tests
251
+ pytest -v
252
+
253
+ # Lint
254
+ ruff check .
255
+ ```
256
+
257
+ ## License
258
+
259
+ MIT
@@ -0,0 +1,200 @@
1
+ # evalforge-runtime
2
+
3
+ Runtime engine for [EvalForge](https://github.com/JannisConen/evalforge-runtime) generated applications. Provides a FastAPI server that executes LLM-powered processes with cost tracking, execution logging, secret management, and file handling.
4
+
5
+ > Completely vibe-coded in 1 hour.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ pip install evalforge-runtime
11
+ ```
12
+
13
+ With optional extras:
14
+
15
+ ```bash
16
+ # Langfuse observability
17
+ pip install evalforge-runtime[langfuse]
18
+
19
+ # Azure Key Vault secrets
20
+ pip install evalforge-runtime[azure]
21
+
22
+ # AWS Secrets Manager
23
+ pip install evalforge-runtime[aws]
24
+
25
+ # Everything
26
+ pip install evalforge-runtime[all]
27
+ ```
28
+
29
+ ## Quick start
30
+
31
+ ### 1. Create a config file
32
+
33
+ Create `evalforge.config.yaml` in your project root:
34
+
35
+ ```yaml
36
+ project:
37
+ id: my-project
38
+
39
+ llm:
40
+ model: anthropic/claude-sonnet-4-6
41
+
42
+ processes:
43
+ classify:
44
+ process_id: classify
45
+ trigger:
46
+ type: webhook
47
+ instructions: |
48
+ Classify the incoming support ticket into one of: billing, technical, general.
49
+ ```
50
+
51
+ ### 2. Set your API keys
52
+
53
+ ```bash
54
+ export EVALFORGE_API_KEYS=my-secret-key
55
+ export ANTHROPIC_API_KEY=sk-ant-...
56
+ ```
57
+
58
+ `EVALFORGE_API_KEYS` is a comma-separated list of keys that authenticate requests to the runtime.
59
+
60
+ ### 3. Start the server
61
+
62
+ ```bash
63
+ evalforge-runtime start --config evalforge.config.yaml
64
+ ```
65
+
66
+ The server starts on `http://localhost:8000` by default.
67
+
68
+ ### 4. Call a process
69
+
70
+ ```bash
71
+ curl -X POST http://localhost:8000/process/classify \
72
+ -H "Authorization: Bearer my-secret-key" \
73
+ -H "Content-Type: application/json" \
74
+ -d '{"ticket_text": "I cannot log in to my account"}'
75
+ ```
76
+
77
+ ## API endpoints
78
+
79
+ | Method | Path | Description |
80
+ |--------|------|-------------|
81
+ | `GET` | `/health` | Health check with version and uptime |
82
+ | `POST` | `/process/<name>` | Execute a process (authenticated) |
83
+ | `GET` | `/executions` | Query execution history |
84
+ | `GET` | `/executions/:id` | Single execution detail |
85
+ | `GET` | `/executions/stats` | Aggregated cost, latency, and volume stats |
86
+
87
+ ## Configuration
88
+
89
+ The runtime is configured via `evalforge.config.yaml`. Environment variables can be referenced with `${VAR_NAME}` syntax.
90
+
91
+ ### Top-level sections
92
+
93
+ ```yaml
94
+ project:
95
+ id: my-project # Required: project identifier
96
+ evalforge_url: https://... # Optional: EvalForge server URL
97
+ version: 1.0.0
98
+
99
+ llm:
100
+ model: anthropic/claude-sonnet-4-6 # Default LLM model (LiteLLM format)
101
+
102
+ database:
103
+ url: sqlite+aiosqlite:///./data/app.db # Execution log database
104
+
105
+ storage:
106
+ type: local # local or s3
107
+ path: ./data/files # Local file storage path
108
+
109
+ auth:
110
+ methods:
111
+ - type: api_key # api_key or oauth2
112
+
113
+ secrets:
114
+ provider: env # env, evalforge, azure_keyvault, aws_secrets_manager, sap_credential_store
115
+
116
+ observability:
117
+ langfuse:
118
+ enabled: false
119
+ host: https://cloud.langfuse.com
120
+ ```
121
+
122
+ ### Process configuration
123
+
124
+ Each process defines an LLM-powered task:
125
+
126
+ ```yaml
127
+ processes:
128
+ my-process:
129
+ process_id: my-process
130
+ trigger:
131
+ type: webhook # webhook, schedule, or process
132
+ cron: "0 9 * * *" # For schedule triggers
133
+ after: other-process # For process triggers (chaining)
134
+ instructions: |
135
+ Your LLM instructions here...
136
+ llm_model: openai/gpt-4o # Override default model
137
+ connector: exchange # Optional: built-in connector
138
+ review:
139
+ enabled: true
140
+ timeout: 24h
141
+ ```
142
+
143
+ ### Custom process modules
144
+
145
+ For advanced logic, provide Python modules for the three-phase pipeline:
146
+
147
+ ```yaml
148
+ processes:
149
+ my-process:
150
+ process_id: my-process
151
+ trigger:
152
+ type: webhook
153
+ before_module: processes.my_process.before # Pre-processing
154
+ execution_module: processes.my_process.execution # Custom LLM call
155
+ after_module: processes.my_process.after # Post-processing
156
+ ```
157
+
158
+ Each module should define an async function matching the phase signature. See the [EvalForge docs](https://github.com/JannisConen/evalforge-runtime) for details.
159
+
160
+ ## Secret providers
161
+
162
+ The runtime supports multiple secret backends:
163
+
164
+ | Provider | Config value | Description |
165
+ |----------|-------------|-------------|
166
+ | Environment | `env` | Read from environment variables (default) |
167
+ | EvalForge | `evalforge` | Fetch from EvalForge server |
168
+ | Azure Key Vault | `azure_keyvault` | Azure Key Vault (`pip install evalforge-runtime[azure]`) |
169
+ | AWS Secrets Manager | `aws_secrets_manager` | AWS Secrets Manager (`pip install evalforge-runtime[aws]`) |
170
+ | SAP Credential Store | `sap_credential_store` | SAP BTP Credential Store |
171
+
172
+ ## CLI reference
173
+
174
+ ```
175
+ evalforge-runtime start [OPTIONS]
176
+
177
+ Options:
178
+ --config PATH Path to evalforge.config.yaml (default: evalforge.config.yaml)
179
+ --host TEXT Bind host (default: 0.0.0.0)
180
+ --port INT Bind port (default: 8000)
181
+ ```
182
+
183
+ ## Development
184
+
185
+ ```bash
186
+ # Clone and install
187
+ git clone https://github.com/JannisConen/evalforge-runtime.git
188
+ cd evalforge-runtime
189
+ pip install -e ".[dev]"
190
+
191
+ # Run tests
192
+ pytest -v
193
+
194
+ # Lint
195
+ ruff check .
196
+ ```
197
+
198
+ ## License
199
+
200
+ MIT
@@ -0,0 +1,34 @@
1
+ project:
2
+ id: "test_proj_001"
3
+ version: "0.1.0"
4
+
5
+ secrets:
6
+ provider: env
7
+
8
+ auth:
9
+ methods:
10
+ - type: api_key
11
+ header: "X-API-Key"
12
+
13
+ llm:
14
+ model: "anthropic/claude-haiku-4-5"
15
+
16
+ database:
17
+ url: "sqlite+aiosqlite:///./data/app.db"
18
+
19
+ storage:
20
+ type: local
21
+ path: "./data/files"
22
+
23
+ processes:
24
+ email-categorizer:
25
+ process_id: "proc_001"
26
+ instructions: |
27
+ You are an email categorizer. Given an email subject and body,
28
+ categorize it and assign a priority score.
29
+
30
+ Respond with JSON: {"category": "...", "priority": N}
31
+ Categories: inquiry, complaint, spam, invoice, other
32
+ Priority: 1-10 (10 = most urgent)
33
+ trigger:
34
+ type: webhook
@@ -0,0 +1,79 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "evalforge-runtime"
7
+ version = "0.1.0"
8
+ description = "Runtime engine for EvalForge generated applications"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = "MIT"
12
+ authors = [{ name = "Jannis Conen" }]
13
+ keywords = ["evalforge", "llm", "ai", "evaluation", "runtime", "fastapi"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Framework :: FastAPI",
17
+ "Intended Audience :: Developers",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3.10",
21
+ "Programming Language :: Python :: 3.11",
22
+ "Programming Language :: Python :: 3.12",
23
+ "Programming Language :: Python :: 3.13",
24
+ "Topic :: Software Development :: Libraries",
25
+ ]
26
+
27
+ dependencies = [
28
+ "fastapi>=0.115.0",
29
+ "uvicorn[standard]>=0.34.0",
30
+ "litellm>=1.60.0",
31
+ "pydantic>=2.10.0",
32
+ "pydantic-settings>=2.7.0",
33
+ "sqlalchemy>=2.0.0",
34
+ "aiosqlite>=0.20.0",
35
+ "httpx>=0.28.0",
36
+ "pyyaml>=6.0",
37
+ "python-multipart>=0.0.18",
38
+ "python-dotenv>=1.0.0",
39
+ ]
40
+
41
+ [project.urls]
42
+ Homepage = "https://github.com/JannisConen/evalforge-runtime"
43
+ Repository = "https://github.com/JannisConen/evalforge-runtime"
44
+ Issues = "https://github.com/JannisConen/evalforge-runtime/issues"
45
+
46
+ [project.optional-dependencies]
47
+ exchange = ["httpx>=0.28.0"]
48
+ gmail = ["google-auth>=2.0.0"]
49
+ scheduling = ["apscheduler>=3.10.0,<4.0.0"]
50
+ azure = ["azure-identity>=1.15.0", "azure-keyvault-secrets>=4.8.0"]
51
+ aws = ["boto3>=1.34.0"]
52
+ langfuse = ["langfuse>=2.0.0"]
53
+ all = [
54
+ "google-auth>=2.0.0",
55
+ "apscheduler>=3.10.0,<4.0.0",
56
+ "azure-identity>=1.15.0",
57
+ "azure-keyvault-secrets>=4.8.0",
58
+ "boto3>=1.34.0",
59
+ "langfuse>=2.0.0",
60
+ ]
61
+ dev = [
62
+ "pytest>=8.0",
63
+ "pytest-asyncio>=0.24.0",
64
+ "ruff>=0.9.0",
65
+ ]
66
+
67
+ [project.scripts]
68
+ evalforge-runtime = "evalforge_runtime:main"
69
+
70
+ [tool.hatch.build.targets.wheel]
71
+ packages = ["src/evalforge_runtime"]
72
+
73
+ [tool.pytest.ini_options]
74
+ asyncio_mode = "auto"
75
+ testpaths = ["tests"]
76
+
77
+ [tool.ruff]
78
+ target-version = "py310"
79
+ line-length = 100