provision-stack-langchain 0.1.0__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,14 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Provision Stack tools for LangChain.
|
|
3
|
+
|
|
4
|
+
Usage::
|
|
5
|
+
|
|
6
|
+
from provision_stack_langchain import get_provision_stack_tools
|
|
7
|
+
|
|
8
|
+
tools = get_provision_stack_tools(api_key="your-token")
|
|
9
|
+
agent = initialize_agent(tools, llm, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION)
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from provision_stack_langchain.tools import get_provision_stack_tools
|
|
13
|
+
|
|
14
|
+
__all__ = ["get_provision_stack_tools"]
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"""
|
|
2
|
+
LangChain tool wrappers for Provision Stack.
|
|
3
|
+
|
|
4
|
+
Each tool is a LangChain ``Tool`` instance that wraps the
|
|
5
|
+
corresponding Provision Stack API endpoint.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Any, Optional, Type
|
|
11
|
+
|
|
12
|
+
from langchain_core.tools import BaseTool
|
|
13
|
+
from pydantic import BaseModel, Field
|
|
14
|
+
|
|
15
|
+
from provision_stack.client import ProvisionStackClient
|
|
16
|
+
from provision_stack.config import PRODUCT_NAME
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# ── Pydantic schemas for tool inputs ──────────────────────────────
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class SuggestInput(BaseModel):
|
|
23
|
+
"""Input for getting deployment suggestions."""
|
|
24
|
+
|
|
25
|
+
outcome: str = Field(
|
|
26
|
+
...,
|
|
27
|
+
description="Natural language description of desired infrastructure "
|
|
28
|
+
"(e.g. 'deploy a production web application').",
|
|
29
|
+
)
|
|
30
|
+
region: Optional[str] = Field(
|
|
31
|
+
None,
|
|
32
|
+
description="Cloud region (e.g. 'us-east-1', 'europe-west1').",
|
|
33
|
+
)
|
|
34
|
+
provider: Optional[str] = Field(
|
|
35
|
+
None,
|
|
36
|
+
description="Restrict to one provider: 'aws', 'gcp', 'azure', 'oracle'.",
|
|
37
|
+
)
|
|
38
|
+
max_monthly_cost_usd: Optional[float] = Field(
|
|
39
|
+
None,
|
|
40
|
+
description="Monthly cost cap in USD. Options above this are filtered out.",
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class DeployInput(BaseModel):
|
|
45
|
+
"""Input for deploying infrastructure."""
|
|
46
|
+
|
|
47
|
+
outcome: str = Field(
|
|
48
|
+
...,
|
|
49
|
+
description="Natural language description of what to deploy.",
|
|
50
|
+
)
|
|
51
|
+
tier: Optional[str] = Field(
|
|
52
|
+
None,
|
|
53
|
+
description="Deployment tier: 'Starter', 'MVP', 'Startup', 'Enterprise'.",
|
|
54
|
+
)
|
|
55
|
+
region: Optional[str] = Field(
|
|
56
|
+
None,
|
|
57
|
+
description="Target cloud region.",
|
|
58
|
+
)
|
|
59
|
+
max_monthly_cost_usd: Optional[float] = Field(
|
|
60
|
+
None,
|
|
61
|
+
description="Monthly cost cap in USD.",
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class StatusInput(BaseModel):
|
|
66
|
+
"""Input for checking deployment status."""
|
|
67
|
+
|
|
68
|
+
deployment_id: str = Field(
|
|
69
|
+
...,
|
|
70
|
+
description="The deployment ID to check (e.g. 'd-1234567890-abc123').",
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class DestroyInput(BaseModel):
|
|
75
|
+
"""Input for destroying a deployment."""
|
|
76
|
+
|
|
77
|
+
deployment_id: str = Field(
|
|
78
|
+
...,
|
|
79
|
+
description="The deployment ID to destroy.",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class TopupInput(BaseModel):
|
|
84
|
+
"""Input for adding credits."""
|
|
85
|
+
|
|
86
|
+
amount_usd: float = Field(
|
|
87
|
+
...,
|
|
88
|
+
description="Amount to add in USD.",
|
|
89
|
+
)
|
|
90
|
+
rail: str = Field(
|
|
91
|
+
"stripe",
|
|
92
|
+
description="Payment rail: 'stripe' (card) or 'xrp' (crypto).",
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# ── LangChain tools ───────────────────────────────────────────────
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class ProvisionStackSuggestTool(BaseTool):
|
|
100
|
+
"""Get deployment suggestions for a desired outcome."""
|
|
101
|
+
|
|
102
|
+
name: str = "provision_stack_suggest"
|
|
103
|
+
description: str = (
|
|
104
|
+
f"Get deployment suggestions from {PRODUCT_NAME}. "
|
|
105
|
+
"Returns tier options (Starter/MVP/Startup/Enterprise) with "
|
|
106
|
+
"monthly cost estimates across multiple cloud providers."
|
|
107
|
+
)
|
|
108
|
+
args_schema: Type[BaseModel] = SuggestInput
|
|
109
|
+
client: ProvisionStackClient
|
|
110
|
+
|
|
111
|
+
def _run(
|
|
112
|
+
self,
|
|
113
|
+
outcome: str,
|
|
114
|
+
region: str | None = None,
|
|
115
|
+
provider: str | None = None,
|
|
116
|
+
max_monthly_cost_usd: float | None = None,
|
|
117
|
+
) -> dict[str, Any]:
|
|
118
|
+
return self.client.suggest(
|
|
119
|
+
outcome=outcome,
|
|
120
|
+
region=region,
|
|
121
|
+
provider=provider,
|
|
122
|
+
max_monthly_cost_usd=max_monthly_cost_usd,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class ProvisionStackDeployTool(BaseTool):
|
|
127
|
+
"""Deploy infrastructure for a selected suggestion."""
|
|
128
|
+
|
|
129
|
+
name: str = "provision_stack_deploy"
|
|
130
|
+
description: str = (
|
|
131
|
+
f"Deploy infrastructure via {PRODUCT_NAME}. "
|
|
132
|
+
"The deploy fee is held from your balance and captured only "
|
|
133
|
+
"after verification passes (failed deployments are free)."
|
|
134
|
+
)
|
|
135
|
+
args_schema: Type[BaseModel] = DeployInput
|
|
136
|
+
client: ProvisionStackClient
|
|
137
|
+
|
|
138
|
+
def _run(
|
|
139
|
+
self,
|
|
140
|
+
outcome: str,
|
|
141
|
+
tier: str | None = None,
|
|
142
|
+
region: str | None = None,
|
|
143
|
+
max_monthly_cost_usd: float | None = None,
|
|
144
|
+
) -> dict[str, Any]:
|
|
145
|
+
return self.client.deploy(
|
|
146
|
+
outcome=outcome,
|
|
147
|
+
tier=tier,
|
|
148
|
+
region=region,
|
|
149
|
+
max_monthly_cost_usd=max_monthly_cost_usd,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class ProvisionStackStatusTool(BaseTool):
|
|
154
|
+
"""Check deployment status and verification results."""
|
|
155
|
+
|
|
156
|
+
name: str = "provision_stack_status"
|
|
157
|
+
description: str = (
|
|
158
|
+
f"Check the status and verification results of a {PRODUCT_NAME} deployment."
|
|
159
|
+
)
|
|
160
|
+
args_schema: Type[BaseModel] = StatusInput
|
|
161
|
+
client: ProvisionStackClient
|
|
162
|
+
|
|
163
|
+
def _run(self, deployment_id: str) -> dict[str, Any]:
|
|
164
|
+
return self.client.status(deployment_id)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class ProvisionStackDestroyTool(BaseTool):
|
|
168
|
+
"""Destroy all resources owned by a deployment."""
|
|
169
|
+
|
|
170
|
+
name: str = "provision_stack_destroy"
|
|
171
|
+
description: str = (
|
|
172
|
+
f"Destroy all cloud resources owned by a {PRODUCT_NAME} deployment."
|
|
173
|
+
)
|
|
174
|
+
args_schema: Type[BaseModel] = DestroyInput
|
|
175
|
+
client: ProvisionStackClient
|
|
176
|
+
|
|
177
|
+
def _run(self, deployment_id: str) -> dict[str, Any]:
|
|
178
|
+
return self.client.destroy(deployment_id)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class ProvisionStackBalanceTool(BaseTool):
|
|
182
|
+
"""Check account credit balance."""
|
|
183
|
+
|
|
184
|
+
name: str = "provision_stack_balance"
|
|
185
|
+
description: str = f"Check your {PRODUCT_NAME} account credit balance."
|
|
186
|
+
client: ProvisionStackClient
|
|
187
|
+
|
|
188
|
+
def _run(self) -> dict[str, Any]:
|
|
189
|
+
return self.client.balance()
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class ProvisionStackTopupTool(BaseTool):
|
|
193
|
+
"""Add credits to your account."""
|
|
194
|
+
|
|
195
|
+
name: str = "provision_stack_topup"
|
|
196
|
+
description: str = (
|
|
197
|
+
f"Add credits to your {PRODUCT_NAME} account via Stripe (card) or XRP (crypto)."
|
|
198
|
+
)
|
|
199
|
+
args_schema: Type[BaseModel] = TopupInput
|
|
200
|
+
client: ProvisionStackClient
|
|
201
|
+
|
|
202
|
+
def _run(self, amount_usd: float, rail: str = "stripe") -> dict[str, Any]:
|
|
203
|
+
if rail == "xrp":
|
|
204
|
+
return self.client.topup_xrp(amount_usd)
|
|
205
|
+
return self.client.topup_stripe(amount_usd)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def get_provision_stack_tools(
|
|
209
|
+
api_key: str | None = None,
|
|
210
|
+
base_url: str | None = None,
|
|
211
|
+
sandbox: bool = False,
|
|
212
|
+
) -> list[BaseTool]:
|
|
213
|
+
"""
|
|
214
|
+
Get all Provision Stack tools for LangChain.
|
|
215
|
+
|
|
216
|
+
Parameters
|
|
217
|
+
----------
|
|
218
|
+
api_key : str, optional
|
|
219
|
+
API token. Falls back to PROVISION_STACK_API_KEY env var.
|
|
220
|
+
base_url : str, optional
|
|
221
|
+
API base URL. Falls back to env var or default.
|
|
222
|
+
sandbox : bool
|
|
223
|
+
If True, use sandbox (mock Terraform, no real deploys).
|
|
224
|
+
|
|
225
|
+
Returns
|
|
226
|
+
-------
|
|
227
|
+
list[BaseTool]
|
|
228
|
+
LangChain Tool instances ready to pass to an agent.
|
|
229
|
+
"""
|
|
230
|
+
client = ProvisionStackClient(
|
|
231
|
+
api_key=api_key, base_url=base_url, sandbox=sandbox
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
return [
|
|
235
|
+
ProvisionStackSuggestTool(client=client),
|
|
236
|
+
ProvisionStackDeployTool(client=client),
|
|
237
|
+
ProvisionStackStatusTool(client=client),
|
|
238
|
+
ProvisionStackDestroyTool(client=client),
|
|
239
|
+
ProvisionStackBalanceTool(client=client),
|
|
240
|
+
ProvisionStackTopupTool(client=client),
|
|
241
|
+
]
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: provision-stack-langchain
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: LangChain tools for Provision Stack — deploy cloud infrastructure via AI agents.
|
|
5
|
+
Project-URL: Homepage, https://provision-stack.com
|
|
6
|
+
Project-URL: Documentation, https://docs.provision-stack.com
|
|
7
|
+
Project-URL: Repository, https://github.com/TravisLinkey/provision-stack
|
|
8
|
+
Author: Provision Stack
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
Keywords: ai-agents,aws,gcp,infrastructure,langchain,mcp
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Requires-Dist: langchain-core>=0.3.0
|
|
22
|
+
Requires-Dist: provision-stack>=0.1.0
|
|
23
|
+
Provides-Extra: test
|
|
24
|
+
Requires-Dist: pytest-mock>=3.12; extra == 'test'
|
|
25
|
+
Requires-Dist: pytest>=8.0; extra == 'test'
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
|
|
28
|
+
# provision-stack-langchain
|
|
29
|
+
|
|
30
|
+
> LangChain tools for Provision Stack — deploy cloud infrastructure via AI agents.
|
|
31
|
+
|
|
32
|
+
## Install
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install provision-stack-langchain
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Quick Start
|
|
39
|
+
|
|
40
|
+
```python
|
|
41
|
+
from provision_stack_langchain import get_provision_stack_tools
|
|
42
|
+
|
|
43
|
+
tools = get_provision_stack_tools(api_key="your-token", sandbox=True)
|
|
44
|
+
|
|
45
|
+
# Use with any LangChain agent
|
|
46
|
+
from langchain_openai import ChatOpenAI
|
|
47
|
+
from langchain.agents import initialize_agent, AgentType
|
|
48
|
+
|
|
49
|
+
llm = ChatOpenAI(model="gpt-4o")
|
|
50
|
+
agent = initialize_agent(tools, llm, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION)
|
|
51
|
+
|
|
52
|
+
result = agent.invoke("Deploy a production web application on AWS under $50/month")
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Tools
|
|
56
|
+
|
|
57
|
+
| Tool | Description |
|
|
58
|
+
|------|-------------|
|
|
59
|
+
| `provision_stack_suggest` | Get deployment suggestions with tier options and costs |
|
|
60
|
+
| `provision_stack_deploy` | Deploy infrastructure (fee held, captured after verification) |
|
|
61
|
+
| `provision_stack_status` | Check deployment status and verification results |
|
|
62
|
+
| `provision_stack_destroy` | Destroy all resources owned by a deployment |
|
|
63
|
+
| `provision_stack_balance` | Check account credit balance |
|
|
64
|
+
| `provision_stack_topup` | Add credits via Stripe or XRP |
|
|
65
|
+
|
|
66
|
+
## Configuration
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
tools = get_provision_stack_tools(
|
|
70
|
+
api_key="your-token", # or PROVISION_STACK_API_KEY env var
|
|
71
|
+
base_url="https://...", # or PROVISION_STACK_API_URL env var
|
|
72
|
+
sandbox=True, # use sandbox (mock Terraform)
|
|
73
|
+
)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## License
|
|
77
|
+
|
|
78
|
+
MIT
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
provision_stack_langchain/__init__.py,sha256=yEBsPuGnANVGkle48hmluoaxgjsu_phQaG3pPxjw2VA,398
|
|
2
|
+
provision_stack_langchain/tools.py,sha256=vAE3YWQXdvVDnOw2SklBKUpliOOp3GJ8tpXhMac6tFs,7062
|
|
3
|
+
provision_stack_langchain-0.1.0.dist-info/METADATA,sha256=3-vy0Tp_cJHGoc4fuek2CWodkbzRs2e6426ZF8rPVU0,2666
|
|
4
|
+
provision_stack_langchain-0.1.0.dist-info/WHEEL,sha256=lCkmxWfQsSc9CfIClYeavTdQeEX2toPqufh9gI35EQA,87
|
|
5
|
+
provision_stack_langchain-0.1.0.dist-info/RECORD,,
|