agentdeploy 0.1.1__py3-none-any.whl

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.
@@ -0,0 +1,337 @@
1
+ Metadata-Version: 2.4
2
+ Name: agentdeploy
3
+ Version: 0.1.1
4
+ Summary: Zero-boilerplate deployment for AI agent frameworks — LangGraph, CrewAI, OpenAI Agents SDK, and custom agents
5
+ Project-URL: Homepage, https://github.com/erenat77/agentdeploy
6
+ Project-URL: Repository, https://github.com/erenat77/agentdeploy
7
+ Project-URL: Issues, https://github.com/erenat77/agentdeploy/issues
8
+ Project-URL: Documentation, https://github.com/erenat77/agentdeploy#readme
9
+ Project-URL: Changelog, https://github.com/erenat77/agentdeploy/blob/main/CHANGELOG.md
10
+ Author: Aaron
11
+ License: MIT
12
+ License-File: LICENSE
13
+ Keywords: agents,ai,crewai,deployment,docker,kubernetes,langgraph
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Software Development :: Libraries
20
+ Requires-Python: >=3.11
21
+ Requires-Dist: httpx>=0.27
22
+ Requires-Dist: jinja2>=3.1
23
+ Requires-Dist: langgraph>=1.1.10
24
+ Requires-Dist: opentelemetry-api>=1.20
25
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.20
26
+ Requires-Dist: opentelemetry-sdk>=1.20
27
+ Requires-Dist: pydantic>=2.0
28
+ Requires-Dist: pyyaml>=6.0
29
+ Requires-Dist: rich>=13.0
30
+ Requires-Dist: typer>=0.12
31
+ Provides-Extra: all
32
+ Requires-Dist: anthropic>=0.34; extra == 'all'
33
+ Requires-Dist: boto3>=1.34; extra == 'all'
34
+ Requires-Dist: build>=1.2; extra == 'all'
35
+ Requires-Dist: crewai>=0.70; extra == 'all'
36
+ Requires-Dist: google-cloud-run>=0.10; extra == 'all'
37
+ Requires-Dist: kubernetes>=28.1; extra == 'all'
38
+ Requires-Dist: langgraph>=0.2; extra == 'all'
39
+ Requires-Dist: mypy>=1.10; extra == 'all'
40
+ Requires-Dist: openai>=1.50; extra == 'all'
41
+ Requires-Dist: pre-commit>=3.7; extra == 'all'
42
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'all'
43
+ Requires-Dist: pytest-cov>=5.0; extra == 'all'
44
+ Requires-Dist: pytest>=8.0; extra == 'all'
45
+ Requires-Dist: ruff>=0.4; extra == 'all'
46
+ Requires-Dist: twine>=5.0; extra == 'all'
47
+ Provides-Extra: aws
48
+ Requires-Dist: boto3>=1.34; extra == 'aws'
49
+ Provides-Extra: claude
50
+ Requires-Dist: anthropic>=0.34; extra == 'claude'
51
+ Provides-Extra: crewai
52
+ Requires-Dist: crewai>=0.70; extra == 'crewai'
53
+ Provides-Extra: dev
54
+ Requires-Dist: build>=1.2; extra == 'dev'
55
+ Requires-Dist: mypy>=1.10; extra == 'dev'
56
+ Requires-Dist: pre-commit>=3.7; extra == 'dev'
57
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
58
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
59
+ Requires-Dist: pytest>=8.0; extra == 'dev'
60
+ Requires-Dist: ruff>=0.4; extra == 'dev'
61
+ Requires-Dist: twine>=5.0; extra == 'dev'
62
+ Provides-Extra: gcp
63
+ Requires-Dist: google-cloud-run>=0.10; extra == 'gcp'
64
+ Provides-Extra: k8s
65
+ Requires-Dist: kubernetes>=28.1; extra == 'k8s'
66
+ Provides-Extra: langgraph
67
+ Requires-Dist: langgraph>=0.2; extra == 'langgraph'
68
+ Provides-Extra: openai
69
+ Requires-Dist: openai>=1.50; extra == 'openai'
70
+ Description-Content-Type: text/markdown
71
+
72
+ # AgentDeploy
73
+
74
+ [![CI](https://github.com/erenat77/agentdeploy/actions/workflows/ci.yml/badge.svg)](https://github.com/erenat77/agentdeploy/actions/workflows/ci.yml)
75
+ [![PyPI](https://img.shields.io/pypi/v/agentdeploy.svg)](https://pypi.org/project/agentdeploy/)
76
+ [![Python](https://img.shields.io/pypi/pyversions/agentdeploy.svg)](https://pypi.org/project/agentdeploy/)
77
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
78
+
79
+ **Zero-boilerplate deployment for AI agent frameworks.**
80
+
81
+ Take any LangGraph, CrewAI, OpenAI Agents SDK, or custom agent and generate production-ready Kubernetes manifests, Docker Compose files, Lambda handlers, or Cloud Run services — in under 10 lines of Python.
82
+
83
+ ---
84
+
85
+ ## The problem it solves
86
+
87
+ Every team building AI agents in 2025–2026 faces the same 3–6 week detour:
88
+
89
+ - Write the agent (30 min)
90
+ - Figure out how to containerise it (1 day)
91
+ - Write Kubernetes manifests with correct resource limits, health checks, and HPA (2 days)
92
+ - Add human-in-the-loop gates (1 week)
93
+ - Wire up OpenTelemetry tracing and cost tracking (3 days)
94
+ - Repeat for every new agent
95
+
96
+ AgentDeploy collapses this to a single fluent call.
97
+
98
+ ---
99
+
100
+ ## Install
101
+
102
+ ```bash
103
+ # pip
104
+ pip install agentdeploy
105
+
106
+ # uv (recommended)
107
+ uv add agentdeploy
108
+
109
+ # With framework extras:
110
+ uv add "agentdeploy[langgraph]"
111
+ uv add "agentdeploy[crewai]"
112
+ uv add "agentdeploy[openai]"
113
+ uv add "agentdeploy[all]"
114
+ ```
115
+
116
+ ---
117
+
118
+ ## Quick start
119
+
120
+ ```python
121
+ from agentdeploy import AgentApp, deploy
122
+
123
+ # 1. Wrap your existing agent (framework auto-detected)
124
+ app = (
125
+ AgentApp("my-agent", description="Summarisation agent")
126
+ .wrap(my_langgraph_graph) # or CrewAI Crew, OpenAI Agent, callable
127
+ .env("ANTHROPIC_API_KEY", from_secret="anthropic-key")
128
+ .resources(memory_mb=2048, timeout_seconds=120)
129
+ )
130
+
131
+ # 2. Generate Kubernetes manifests + Dockerfile
132
+ result = (
133
+ deploy(app)
134
+ .to_kubernetes(namespace="agents", image="my-agent:0.1.0")
135
+ .with_replicas(2)
136
+ .with_autoscale(min=1, max=10, cpu_percent=60)
137
+ .with_hitl_gate(webhook="https://yourapp.com/api/approve")
138
+ .with_telemetry(endpoint="http://otel-collector:4317")
139
+ .build()
140
+ )
141
+
142
+ print(result)
143
+ # → Dockerfile, deployment.yaml, service.yaml, hpa.yaml, secret.yaml
144
+ # → kubectl apply -k ./deploy/my-agent/k8s/
145
+ ```
146
+
147
+ ---
148
+
149
+ ## Supported frameworks
150
+
151
+ | Framework | Detection | Adapter |
152
+ |---|---|---|
153
+ | LangGraph | `CompiledStateGraph` type | `_LangGraphAdapter` |
154
+ | CrewAI | `crewai` module, `Crew` type | `_CrewAIAdapter` |
155
+ | OpenAI Agents SDK | `openai.agents` module | `_OpenAIAgentAdapter` |
156
+ | Any `async callable` | fallback | `_CallableAdapter` |
157
+
158
+ Custom framework? Register your own adapter:
159
+
160
+ ```python
161
+ from agentdeploy.adapters import AdapterRegistry, AgentAdapter
162
+
163
+ class MyAdapter(AgentAdapter):
164
+ framework_name = "my-framework"
165
+ def validate(self): ...
166
+ def pip_extras(self): return ["my-framework>=1.0"]
167
+ def entrypoint_code(self, app_name, port): return "..."
168
+
169
+ AdapterRegistry.register("my-framework", MyAdapter)
170
+ ```
171
+
172
+ ---
173
+
174
+ ## Deploy targets
175
+
176
+ ### Kubernetes
177
+ ```python
178
+ deploy(app).to_kubernetes(namespace="prod", image="myimg:1.0")
179
+ .with_replicas(3)
180
+ .with_autoscale(min=1, max=20, cpu_percent=70)
181
+ .with_hitl_gate(webhook="https://yourapp.com/approve")
182
+ .with_telemetry(endpoint="http://otel-collector:4317")
183
+ .build()
184
+ ```
185
+ Generates: `Dockerfile`, `deployment.yaml`, `service.yaml`, `hpa.yaml`, `secret.yaml`, `kustomization.yaml`
186
+
187
+ ### Docker Compose (local / staging)
188
+ ```python
189
+ deploy(app).to_docker_compose()
190
+ .with_redis()
191
+ .with_otel_collector()
192
+ .build()
193
+ # → docker compose up --build
194
+ ```
195
+
196
+ ### AWS Lambda
197
+ ```python
198
+ deploy(app).to_lambda(region="us-east-1", function_name="my-agent")
199
+ .build()
200
+ # → sam build && sam deploy
201
+ ```
202
+
203
+ ### Google Cloud Run
204
+ ```python
205
+ deploy(app).to_cloud_run(project="my-gcp-project", region="us-central1")
206
+ .with_scaling(min_instances=0, max_instances=20)
207
+ .build()
208
+ # → gcloud builds submit && gcloud run services replace ...
209
+ ```
210
+
211
+ ---
212
+
213
+ ## Human-in-the-Loop (HITL)
214
+
215
+ Add human oversight at any decision point:
216
+
217
+ ```python
218
+ from agentdeploy import HITLGate, HITLDecision
219
+
220
+ gate = HITLGate(webhook="https://yourapp.com/api/approve")
221
+
222
+ async def run_agent(user_input):
223
+ state = await my_agent.ainvoke(user_input)
224
+
225
+ approval = await gate.checkpoint(
226
+ state=state,
227
+ description="Agent about to write to production database",
228
+ )
229
+
230
+ if approval.decision == HITLDecision.REJECT:
231
+ return {"status": "cancelled", "reason": approval.reason}
232
+
233
+ return approval.modified_state or state
234
+ ```
235
+
236
+ Your webhook endpoint resolves the checkpoint:
237
+ ```python
238
+ from agentdeploy import HITLGate, HITLDecision, CheckpointResult
239
+
240
+ @app.post("/api/approve/{checkpoint_id}")
241
+ async def approve(checkpoint_id: str):
242
+ await gate.resolve(checkpoint_id, CheckpointResult(
243
+ decision=HITLDecision.APPROVE,
244
+ reviewer="alice@company.com",
245
+ ))
246
+ ```
247
+
248
+ Delivery channels: `webhook=`, `slack_webhook=`, `console_fallback=True` (local dev)
249
+
250
+ ---
251
+
252
+ ## Telemetry
253
+
254
+ ```python
255
+ from agentdeploy import Telemetry
256
+
257
+ telemetry = Telemetry("my-agent", otel_endpoint="http://otel-collector:4317")
258
+
259
+ async with telemetry.trace("invoke", input=user_input) as span:
260
+ result = await my_agent.ainvoke(user_input)
261
+ span.set_tokens(prompt=512, completion=128, model="claude-sonnet-4-6")
262
+ # → auto-calculates cost, writes span to OTel collector
263
+ ```
264
+
265
+ Built-in cost estimation for: `gpt-4o`, `gpt-4o-mini`, `claude-sonnet-4-6`, `claude-opus-4-6`, `gemini-1.5-pro`
266
+
267
+ ---
268
+
269
+ ## CLI
270
+
271
+ ```bash
272
+ # Scaffold a new project
273
+ agentdeploy init my-agent --framework langgraph --target kubernetes
274
+
275
+ # Validate config without building
276
+ agentdeploy validate
277
+
278
+ # Build artifacts
279
+ agentdeploy build --output ./deploy
280
+
281
+ # Dry run
282
+ agentdeploy build --dry-run
283
+ ```
284
+
285
+ ---
286
+
287
+ ## Project layout (generated)
288
+
289
+ ```
290
+ deploy/
291
+ └── my-agent/
292
+ ├── Dockerfile
293
+ ├── server.py # auto-generated FastAPI entrypoint
294
+ └── k8s/
295
+ ├── deployment.yaml
296
+ ├── service.yaml
297
+ ├── hpa.yaml
298
+ ├── secret.yaml # placeholder — fill in before applying
299
+ └── kustomization.yaml
300
+ ```
301
+
302
+ Apply to cluster:
303
+ ```bash
304
+ kubectl apply -k ./deploy/my-agent/k8s/
305
+ kubectl rollout status deployment/my-agent -n agents
306
+ ```
307
+
308
+ ---
309
+
310
+ ## Roadmap
311
+
312
+ - [ ] v0.2 — Helm chart output target
313
+ - [ ] v0.2 — Multi-agent topology (one app, N agent pods with message bus wiring)
314
+ - [ ] v0.3 — Budget enforcement middleware (per-run token caps)
315
+ - [ ] v0.3 — Replay debugger (capture + replay full execution traces)
316
+ - [ ] v0.4 — Pulumi / Terraform IaC output
317
+ - [ ] v0.5 — GitHub Actions / GitLab CI pipeline generation
318
+
319
+ ---
320
+
321
+ ## Contributing
322
+
323
+ ```bash
324
+ git clone https://github.com/erenat77/agentdeploy
325
+ cd agentdeploy
326
+ uv pip install -e ".[dev]" # or: pip install -e ".[dev]"
327
+ pre-commit install
328
+ pytest tests/ -v
329
+ ```
330
+
331
+ PRs welcome. Please add tests for new adapters and targets.
332
+
333
+ ---
334
+
335
+ ## License
336
+
337
+ MIT
@@ -0,0 +1,21 @@
1
+ agentdeploy/__init__.py,sha256=71jFKhj73jdmFRboB8E2KbtAMPHKlI9_DeuchjxEkpg,1029
2
+ agentdeploy/adapters/__init__.py,sha256=d8xqSF6TcssGHqTEo_eR1nVAmJgm4JxAooUtYop9kz0,215
3
+ agentdeploy/adapters/base.py,sha256=cj1T9tXrIRWEPjMZOGeyJFxrOMKQmayYCrkvJg7egxw,1331
4
+ agentdeploy/adapters/registry.py,sha256=alx5XWXTAt1uSWVBd60j8US8LBR5gt1Pq81MCz9N-M0,7084
5
+ agentdeploy/cli/__init__.py,sha256=-RWOHBibe1RdoANob862FJLhsEJpsa8fwxxrf1Gg5w8,120
6
+ agentdeploy/cli/main.py,sha256=9f9Yw_DQhU26-F2axAOMLEHtqnkusPSIW6Z89JQGV5o,7943
7
+ agentdeploy/core/__init__.py,sha256=VrG06G-NAfeAkbgYsn6wIOkACKCGf7e4c78yORpn5tc,64
8
+ agentdeploy/core/app.py,sha256=ay-nVS4fj051G7yS1ykOMdNjKSNbDK1MBMNExDxHf2o,3548
9
+ agentdeploy/core/deploy.py,sha256=wUYKG0VQIGnGq-yG9WtnOJisab7AsvqiUTCol_tf4mU,2597
10
+ agentdeploy/core/hitl.py,sha256=4VoVG4u-qzkJOQiC95bodwGj3Y0BuMaadPYKKMdTSi0,7104
11
+ agentdeploy/core/observability.py,sha256=gu7XxH1HnUDvrhsNZ-sanO82vO-sJf1veSfdRq3uXsY,5291
12
+ agentdeploy/targets/__init__.py,sha256=tZn0Jr06BnPmAKlDTNp6PBTpH8cxmcgIj4bsUVy81s4,588
13
+ agentdeploy/targets/cloud_run.py,sha256=jRUHH9rX2Eq7I5ectDekkqz3T_ZJAZKpCdulrGwlFdE,4204
14
+ agentdeploy/targets/docker_compose.py,sha256=LD3GGztecyBu6dSkWVXzPubjsgoNvoV83bxpfJ5aDdw,4718
15
+ agentdeploy/targets/kubernetes.py,sha256=FzD0nKxl-TgUTLUrecSOoXJ4Y5K01tSi1mG77QHuVWU,12131
16
+ agentdeploy/targets/lambda_target.py,sha256=XU6E7VMLlBSK8tly3Zq15UGdMD9DmlSOFg3C_3f-wQA,5315
17
+ agentdeploy-0.1.1.dist-info/METADATA,sha256=LqL-YujGnucTO9DHXwC5Oc0i04K4HqdJG2qqc8C0Tuk,9882
18
+ agentdeploy-0.1.1.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
19
+ agentdeploy-0.1.1.dist-info/entry_points.txt,sha256=Tt4FqaX6xrPLz8bOWA5N9L7sMC56w6KYFKNATxge1N0,57
20
+ agentdeploy-0.1.1.dist-info/licenses/LICENSE,sha256=UMc4mS14438SV5uomIhZElAVh0Gr_j77UXAq_ZBc-p4,1062
21
+ agentdeploy-0.1.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.31.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ agentdeploy = agentdeploy.cli.main:app
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Aaron
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.