toolplane-python-client 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.
- toolplane/__init__.py +106 -0
- toolplane/common/__init__.py +93 -0
- toolplane/common/base_config.py +129 -0
- toolplane/common/base_connection_manager.py +171 -0
- toolplane/common/base_session_manager.py +321 -0
- toolplane/common/base_tool_manager.py +347 -0
- toolplane/common/constants.py +47 -0
- toolplane/common/utils.py +310 -0
- toolplane/core/__init__.py +67 -0
- toolplane/core/config.py +107 -0
- toolplane/core/connection.py +285 -0
- toolplane/core/errors.py +298 -0
- toolplane/core/machine.py +480 -0
- toolplane/core/request.py +775 -0
- toolplane/core/session.py +332 -0
- toolplane/core/session_context.py +514 -0
- toolplane/core/task.py +130 -0
- toolplane/core/tool.py +329 -0
- toolplane/http_core/__init__.py +37 -0
- toolplane/http_core/http_config.py +97 -0
- toolplane/http_core/http_connection.py +409 -0
- toolplane/http_core/http_machine.py +298 -0
- toolplane/http_core/http_request.py +748 -0
- toolplane/http_core/http_session.py +348 -0
- toolplane/http_core/http_session_context.py +491 -0
- toolplane/http_core/http_task.py +101 -0
- toolplane/http_core/http_tool.py +400 -0
- toolplane/interfaces/__init__.py +27 -0
- toolplane/interfaces/client_interface.py +122 -0
- toolplane/interfaces/connection_interface.py +193 -0
- toolplane/interfaces/event_interface.py +290 -0
- toolplane/interfaces/request_interface.py +439 -0
- toolplane/interfaces/session_interface.py +288 -0
- toolplane/interfaces/tool_interface.py +441 -0
- toolplane/proto/__init__.py +0 -0
- toolplane/proto/service_pb2.py +315 -0
- toolplane/proto/service_pb2_grpc.py +2240 -0
- toolplane/provider_cli.py +268 -0
- toolplane/provider_registry.py +77 -0
- toolplane/provider_runtime.py +302 -0
- toolplane/toolkits/__init__.py +0 -0
- toolplane/toolkits/standalone_tools/__init__.py +0 -0
- toolplane/toolkits/standalone_tools/create_directory.py +94 -0
- toolplane/toolkits/standalone_tools/create_file.py +124 -0
- toolplane/toolkits/standalone_tools/file_search.py +229 -0
- toolplane/toolkits/standalone_tools/grep_search.py +372 -0
- toolplane/toolkits/standalone_tools/launcher.py +146 -0
- toolplane/toolkits/standalone_tools/list_dir.py +395 -0
- toolplane/toolkits/standalone_tools/read_file.py +346 -0
- toolplane/toolkits/standalone_tools/replace_string_in_file.py +407 -0
- toolplane/toolkits/standalone_tools/run_tests.py +66 -0
- toolplane/toolkits/standalone_tools/semantic_search.py +485 -0
- toolplane/toolkits/standalone_tools/standalone_toolkit.py +979 -0
- toolplane/toolkits/standalone_tools/test_failure_analysis.py +618 -0
- toolplane/toolkits/standalone_tools/test_standalone_toolkit.py +517 -0
- toolplane/toolkits/swe/__init__.py +35 -0
- toolplane/toolkits/swe/create_directory.py +15 -0
- toolplane/toolkits/swe/create_file.py +15 -0
- toolplane/toolkits/swe/descriptions.py +273 -0
- toolplane/toolkits/swe/execute_bash.py +93 -0
- toolplane/toolkits/swe/file_editor.py +775 -0
- toolplane/toolkits/swe/file_search.py +16 -0
- toolplane/toolkits/swe/finish.py +50 -0
- toolplane/toolkits/swe/grep_search.py +19 -0
- toolplane/toolkits/swe/list_dir.py +407 -0
- toolplane/toolkits/swe/read_file.py +18 -0
- toolplane/toolkits/swe/replace_string_in_file.py +17 -0
- toolplane/toolkits/swe/search.py +260 -0
- toolplane/toolkits/swe/semantic_search.py +20 -0
- toolplane/toolkits/swe/str_replace_editor.py +647 -0
- toolplane/toolkits/swe/submit.py +29 -0
- toolplane/toolkits/swe/swe_toolkit.py +1296 -0
- toolplane/toolplane_client.py +686 -0
- toolplane/toolplane_http_client.py +681 -0
- toolplane/utils/__init__.py +3 -0
- toolplane/utils/schema.py +146 -0
- toolplane_python_client-0.1.0.dist-info/METADATA +543 -0
- toolplane_python_client-0.1.0.dist-info/RECORD +81 -0
- toolplane_python_client-0.1.0.dist-info/WHEEL +5 -0
- toolplane_python_client-0.1.0.dist-info/entry_points.txt +2 -0
- toolplane_python_client-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,543 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: toolplane-python-client
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Python client for the Toolplane control plane
|
|
5
|
+
Author-email: Abhishek Chohan <54611095+Abhishek-chohan@users.noreply.github.com>
|
|
6
|
+
License: Apache-2.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/Abhishek-chohan/tool-control-plane
|
|
8
|
+
Project-URL: Repository, https://github.com/Abhishek-chohan/tool-control-plane
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/Abhishek-chohan/tool-control-plane/issues
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Requires-Python: >=3.9
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
Requires-Dist: grpcio>=1.80.0
|
|
22
|
+
Requires-Dist: grpcio-tools>=1.80.0
|
|
23
|
+
Requires-Dist: protobuf<7.0.0,>=6.31.1
|
|
24
|
+
Requires-Dist: googleapis-common-protos>=1.63.0
|
|
25
|
+
Requires-Dist: requests>=2.25.0
|
|
26
|
+
Requires-Dist: typing-extensions>=4.0.0
|
|
27
|
+
Requires-Dist: pydantic>=2.0.0
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
30
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
|
|
31
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
32
|
+
Requires-Dist: isort>=5.10.0; extra == "dev"
|
|
33
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
34
|
+
Requires-Dist: flake8>=6.0.0; extra == "dev"
|
|
35
|
+
Requires-Dist: flake8-docstrings>=1.7.0; extra == "dev"
|
|
36
|
+
Requires-Dist: flake8-builtins>=2.0.0; extra == "dev"
|
|
37
|
+
Requires-Dist: flake8-annotations>=3.0.0; extra == "dev"
|
|
38
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
39
|
+
Requires-Dist: coverage>=7.0.0; extra == "dev"
|
|
40
|
+
Requires-Dist: pre-commit>=3.0.0; extra == "dev"
|
|
41
|
+
Requires-Dist: mkdocs>=1.4.0; extra == "dev"
|
|
42
|
+
Requires-Dist: mkdocs-material>=9.0.0; extra == "dev"
|
|
43
|
+
Provides-Extra: docs
|
|
44
|
+
Requires-Dist: mkdocs>=1.4.0; extra == "docs"
|
|
45
|
+
Requires-Dist: mkdocs-material>=9.0.0; extra == "docs"
|
|
46
|
+
Requires-Dist: mkdocstrings[python]>=0.20.0; extra == "docs"
|
|
47
|
+
Provides-Extra: lint
|
|
48
|
+
Requires-Dist: black>=23.0.0; extra == "lint"
|
|
49
|
+
Requires-Dist: isort>=5.10.0; extra == "lint"
|
|
50
|
+
Requires-Dist: mypy>=1.0.0; extra == "lint"
|
|
51
|
+
Requires-Dist: flake8>=6.0.0; extra == "lint"
|
|
52
|
+
Requires-Dist: flake8-docstrings>=1.7.0; extra == "lint"
|
|
53
|
+
Requires-Dist: flake8-builtins>=2.0.0; extra == "lint"
|
|
54
|
+
Requires-Dist: flake8-annotations>=3.0.0; extra == "lint"
|
|
55
|
+
|
|
56
|
+
# Toolplane Python Client
|
|
57
|
+
|
|
58
|
+
The Python package is the primary maintained SDK for Toolplane's durable remote tool-execution control plane. Python is the richest current client surface and the baseline for the repo's end-to-end provider, consumer, and admin capability.
|
|
59
|
+
|
|
60
|
+
## Decision Rule
|
|
61
|
+
|
|
62
|
+
Use Toolplane when one remote tool may outlive the caller, needs inspection or bounded replay after disconnect, needs explicit provider ownership or drain behavior, or is queue-backed enough that request lifecycle control matters. If the work is quick, in-process, same-lifecycle, and not operationally sensitive, direct tool calling is simpler.
|
|
63
|
+
|
|
64
|
+
A concrete first offload candidate is one sandboxed code-execution worker. The Python provider-consumer path is the maintained starting point for that shape because it covers explicit provider ownership, request lifecycle control, and the maintained HTTP gateway compatibility layer on the richest SDK surface.
|
|
65
|
+
|
|
66
|
+
## Support Status
|
|
67
|
+
|
|
68
|
+
- Primary maintained SDK and current completeness baseline.
|
|
69
|
+
- gRPC is the primary transport for the repo's control-plane story.
|
|
70
|
+
- `ToolplaneHTTP` is a maintained compatibility surface over the same session, tool, machine, request, and task flows.
|
|
71
|
+
- Python exposes a broader public surface than the current Go and TypeScript SDKs; confirm cross-SDK portability in [SDK_MAP.md](../../SDK_MAP.md) before assuming parity.
|
|
72
|
+
|
|
73
|
+
## First Offload Path
|
|
74
|
+
|
|
75
|
+
Start with the maintained provider-consumer pair before exploring the full API. The sample tools are intentionally simple, but this is the same lifecycle you would reuse to offload one sandboxed code-execution tool or another environment-bound worker:
|
|
76
|
+
|
|
77
|
+
1. Run `example_client.py` — connects via gRPC, creates a session through the explicit `ProviderRuntime`, registers machine-backed tools, and starts the provider loop.
|
|
78
|
+
2. Copy the printed `TOOLPLANE_SESSION_ID`.
|
|
79
|
+
3. Run `example_user.py` with that session ID — lists tools, invokes provider-backed work, and polls request state.
|
|
80
|
+
|
|
81
|
+
See [README_EXAMPLES.md](README_EXAMPLES.md) for environment defaults and the full example flow. For runtime semantics — request lifecycle, streaming, recovery windows, machine drain — see [server/DOCUMENTATION.md](../../server/DOCUMENTATION.md).
|
|
82
|
+
|
|
83
|
+
### Scope Categories
|
|
84
|
+
|
|
85
|
+
The Python public surface spans three scope categories (see [SDK_MAP.md](../../SDK_MAP.md) for the full matrix):
|
|
86
|
+
|
|
87
|
+
- **Consumer scope** — session/machine/task lifecycle, tool discovery, and remote invocation (`create_session`, `invoke`, `stream`, etc.). These methods are portable across maintained SDKs.
|
|
88
|
+
- **Provider scope** — tool registration, request claiming, heartbeat, and result submission through the explicit `ProviderRuntime` surface. The client also exposes convenience aliases `tool()`, `start()`, and `stop()` over that same runtime surface.
|
|
89
|
+
- **Admin scope** — session administration helpers (`list_user_sessions`, `bulk_delete_sessions`, `get_session_stats`, `invalidate_session`). These are currently exposed only in the Python SDK.
|
|
90
|
+
|
|
91
|
+
## Installation
|
|
92
|
+
|
|
93
|
+
The package is not published to PyPI yet; install it from the repository.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Clone the repository
|
|
97
|
+
git clone https://github.com/Abhishek-chohan/tool-control-plane.git
|
|
98
|
+
cd tool-control-plane/clients/python-client
|
|
99
|
+
|
|
100
|
+
# Install in development mode
|
|
101
|
+
pip install -e .
|
|
102
|
+
|
|
103
|
+
# Install with all development dependencies
|
|
104
|
+
pip install -e ".[dev]"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Requirements: Python 3.8+ with grpcio, protobuf, requests, googleapis-common-protos, and pydantic. The optional toolkits under `toolplane/toolkits/` have heavier dependencies; install their requirements only if you use them. `grpcio-tools` is needed only for proto regeneration (`cd server && make gen-proto-python`).
|
|
108
|
+
|
|
109
|
+
## Quick Start
|
|
110
|
+
|
|
111
|
+
### Consumer Usage with gRPC Client
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
from toolplane import Toolplane
|
|
115
|
+
|
|
116
|
+
# Initialize a consumer-oriented client
|
|
117
|
+
client = Toolplane(
|
|
118
|
+
server_host="localhost",
|
|
119
|
+
server_port=9001,
|
|
120
|
+
api_key="your-api-key-here",
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
client.connect()
|
|
124
|
+
|
|
125
|
+
# Attach to an existing provider-backed session
|
|
126
|
+
session_id = "provider-session-123"
|
|
127
|
+
tools = client.get_available_tools(session_id)
|
|
128
|
+
print(tools)
|
|
129
|
+
|
|
130
|
+
# Execute a tool synchronously
|
|
131
|
+
result = client.invoke("echo-tool", session_id, text="Hello World")
|
|
132
|
+
print(result) # Output: Echo: Hello World
|
|
133
|
+
|
|
134
|
+
# Submit a tool invocation without blocking; awaits the request ID
|
|
135
|
+
import asyncio
|
|
136
|
+
request_id = asyncio.run(
|
|
137
|
+
client.ainvoke("echo-tool", session_id, text="Async Test")
|
|
138
|
+
)
|
|
139
|
+
print(f"Request ID: {request_id}")
|
|
140
|
+
# Poll client.get_request_status(session_id, request_id) for the outcome.
|
|
141
|
+
|
|
142
|
+
# Stream tool execution
|
|
143
|
+
def stream_callback(chunk, is_final):
|
|
144
|
+
if is_final:
|
|
145
|
+
print("Stream completed")
|
|
146
|
+
else:
|
|
147
|
+
print(f"Received chunk: {chunk}")
|
|
148
|
+
|
|
149
|
+
client.stream("echo-tool", stream_callback, session_id, text="Streaming Test")
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Explicit Provider Runtime with gRPC Client
|
|
153
|
+
|
|
154
|
+
```python
|
|
155
|
+
from toolplane import Toolplane
|
|
156
|
+
|
|
157
|
+
client = Toolplane(
|
|
158
|
+
server_host="localhost",
|
|
159
|
+
server_port=9001,
|
|
160
|
+
api_key="your-api-key-here",
|
|
161
|
+
user_id="provider-user",
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
provider = client.provider_runtime()
|
|
165
|
+
session = provider.create_session(
|
|
166
|
+
name="My Provider Session",
|
|
167
|
+
description="Session backed by the explicit provider runtime",
|
|
168
|
+
namespace="development",
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
@provider.tool(
|
|
172
|
+
session_id=session.session_id,
|
|
173
|
+
name="echo-tool",
|
|
174
|
+
description="Echo back the input text",
|
|
175
|
+
tags=["utility", "testing"],
|
|
176
|
+
)
|
|
177
|
+
def echo_tool(text: str) -> str:
|
|
178
|
+
return f"Echo: {text}"
|
|
179
|
+
|
|
180
|
+
provider.run_forever()
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Explicit Provider Runtime with HTTP Client
|
|
184
|
+
|
|
185
|
+
```python
|
|
186
|
+
from toolplane import ToolplaneHTTP
|
|
187
|
+
|
|
188
|
+
# Initialize HTTP client against the gateway (default port 8080)
|
|
189
|
+
client = ToolplaneHTTP(
|
|
190
|
+
server_host="localhost",
|
|
191
|
+
server_port=8080,
|
|
192
|
+
api_key="your-api-key-here",
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
# Create an explicit provider runtime
|
|
196
|
+
provider = client.provider_runtime()
|
|
197
|
+
session = provider.create_session(
|
|
198
|
+
user_id="user123",
|
|
199
|
+
name="My HTTP Provider Session",
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# Register a tool
|
|
203
|
+
@provider.tool(
|
|
204
|
+
session_id=session.session_id,
|
|
205
|
+
name="http-tool",
|
|
206
|
+
description="HTTP-based tool execution",
|
|
207
|
+
)
|
|
208
|
+
def http_tool(text: str) -> str:
|
|
209
|
+
return f"HTTP Processed: {text}"
|
|
210
|
+
|
|
211
|
+
provider.run_forever()
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Tools are session-scoped: a consumer can only invoke tools registered into the same session, so separate provider and consumer processes must share a session ID (this is what the examples arrange through `TOOLPLANE_SESSION_ID`).
|
|
215
|
+
|
|
216
|
+
## Session Management
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
# Consumer-side session creation does not imply machine registration
|
|
220
|
+
session = client.create_session(
|
|
221
|
+
session_id="my-unique-session-id",
|
|
222
|
+
user_id="user123",
|
|
223
|
+
name="My Application Session",
|
|
224
|
+
description="Session for my application",
|
|
225
|
+
namespace="production",
|
|
226
|
+
register_machine=False,
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
# Provider-side session creation uses the explicit runtime and attaches a machine
|
|
230
|
+
provider = client.provider_runtime()
|
|
231
|
+
provider_session = provider.create_session(
|
|
232
|
+
user_id="user123",
|
|
233
|
+
name="Provider Session",
|
|
234
|
+
namespace="production",
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
# Get an existing session
|
|
238
|
+
session_context = client.get_session("my-unique-session-id")
|
|
239
|
+
|
|
240
|
+
# List user sessions with pagination (page_token is the opaque cursor
|
|
241
|
+
# returned by the previous page; it is a string, not an offset)
|
|
242
|
+
user_sessions = client.list_user_sessions(
|
|
243
|
+
user_id="user123",
|
|
244
|
+
page_size=10,
|
|
245
|
+
page_token="",
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
# Get session statistics
|
|
249
|
+
stats = client.get_session_stats(user_id="user123")
|
|
250
|
+
print(f"Total sessions: {stats['total_sessions']}")
|
|
251
|
+
|
|
252
|
+
# Bulk delete sessions
|
|
253
|
+
bulk_delete_result = client.bulk_delete_sessions(
|
|
254
|
+
user_id="user123",
|
|
255
|
+
session_ids=["session-1", "session-2"],
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
# Invalidate a session (revokes every live API key of the session)
|
|
259
|
+
success = client.invalidate_session("session-123", reason="Session expired")
|
|
260
|
+
print(f"Session invalidated: {success}")
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Tool Management
|
|
264
|
+
|
|
265
|
+
```python
|
|
266
|
+
# Registration uses the explicit provider runtime
|
|
267
|
+
provider = client.provider_runtime(["session-123"])
|
|
268
|
+
provider.attach_session("session-123", register_machine=True)
|
|
269
|
+
|
|
270
|
+
# Register a tool with automatic schema generation
|
|
271
|
+
@provider.tool(
|
|
272
|
+
session_id="session-123",
|
|
273
|
+
name="process-data",
|
|
274
|
+
description="Process and transform data",
|
|
275
|
+
tags=["data-processing", "utility"],
|
|
276
|
+
)
|
|
277
|
+
def process_data(input: str, format: str = "json") -> dict:
|
|
278
|
+
return {"input": input, "format": format, "processed": True}
|
|
279
|
+
|
|
280
|
+
# Register a streaming tool
|
|
281
|
+
@provider.tool(
|
|
282
|
+
session_id="session-123",
|
|
283
|
+
name="stream-data",
|
|
284
|
+
description="Stream data processing",
|
|
285
|
+
stream=True,
|
|
286
|
+
)
|
|
287
|
+
def stream_data(input: str):
|
|
288
|
+
for char in input:
|
|
289
|
+
yield f"Processing: {char}"
|
|
290
|
+
|
|
291
|
+
# Discover tools in the session
|
|
292
|
+
available_tools = client.get_available_tools("session-123")
|
|
293
|
+
print(f"Available tools: {available_tools}")
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## Machine Management
|
|
297
|
+
|
|
298
|
+
```python
|
|
299
|
+
# Consumer sessions are not machine-backed by default; attach through
|
|
300
|
+
# the provider runtime to register a machine
|
|
301
|
+
provider = client.provider_runtime(["session-123"])
|
|
302
|
+
session_context = provider.attach_session("session-123", register_machine=True)
|
|
303
|
+
machine_id = session_context.machine_id
|
|
304
|
+
print(f"Registered machine ID: {machine_id}")
|
|
305
|
+
|
|
306
|
+
# Public machine-management helpers stay on the client
|
|
307
|
+
machine_status = client.get_machine("session-123", machine_id)
|
|
308
|
+
print(f"Machine status: {machine_status}")
|
|
309
|
+
|
|
310
|
+
# Drain the machine gracefully before shutdown, then unregister
|
|
311
|
+
client.drain_machine("session-123", machine_id)
|
|
312
|
+
client.unregister_machine("session-123", machine_id)
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
Heartbeats are owned by the explicit provider runtime (`heartbeat_interval` on the client constructor configures the cadence); you never send them yourself.
|
|
316
|
+
|
|
317
|
+
## Request Processing
|
|
318
|
+
|
|
319
|
+
```python
|
|
320
|
+
# Create a request directly (the same path invoke() uses)
|
|
321
|
+
request_id = client.create_request(
|
|
322
|
+
session_id="session-123",
|
|
323
|
+
tool_name="process-data",
|
|
324
|
+
input_data='{"input": "test", "format": "json"}',
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
# Poll request status: arguments are (session_id, request_id)
|
|
328
|
+
status = client.get_request_status("session-123", request_id)
|
|
329
|
+
print(f"Request status: {status['status']}")
|
|
330
|
+
|
|
331
|
+
# List requests in a session; page_token is the cursor from the previous page
|
|
332
|
+
requests = client.list_requests("session-123", status="done", limit=10, page_token="")
|
|
333
|
+
|
|
334
|
+
# Cancel a request
|
|
335
|
+
client.cancel_request("session-123", request_id)
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Configuration Parameters
|
|
339
|
+
|
|
340
|
+
#### `Toolplane` (gRPC facade)
|
|
341
|
+
|
|
342
|
+
| Parameter | Type | Default | Description |
|
|
343
|
+
| --- | --- | --- | --- |
|
|
344
|
+
| `server_host` | str | "localhost" | Server hostname |
|
|
345
|
+
| `server_port` | int | 9001 | Server port |
|
|
346
|
+
| `use_tls` | bool | False | Enable TLS encryption |
|
|
347
|
+
| `tls_cert_path` | str | None | Optional client TLS certificate for mutual TLS |
|
|
348
|
+
| `tls_key_path` | str | None | Optional client TLS private key for mutual TLS |
|
|
349
|
+
| `tls_ca_cert_path` | str | None | Optional CA bundle for direct gRPC TLS |
|
|
350
|
+
| `tls_server_name` | str | None | Optional TLS server name override |
|
|
351
|
+
| `api_key` | str | None | Authentication API key |
|
|
352
|
+
| `user_id` | str | None | User identifier |
|
|
353
|
+
| `session_name` | str | None | Session name |
|
|
354
|
+
| `session_description` | str | None | Session description |
|
|
355
|
+
| `session_namespace` | str | None | Session namespace |
|
|
356
|
+
| `heartbeat_interval` | int | 60 | Heartbeat interval in seconds |
|
|
357
|
+
| `max_workers` | int | 10 | Maximum worker threads |
|
|
358
|
+
| `request_timeout` | int | 30 | Request timeout in seconds |
|
|
359
|
+
| `max_retries` | int | 3 | Maximum retry attempts |
|
|
360
|
+
| `retry_base_delay` | float | 1.0 | Base retry delay in seconds |
|
|
361
|
+
| `retry_max_delay` | float | 60.0 | Maximum retry delay in seconds |
|
|
362
|
+
| `retry_backoff_factor` | float | 2.0 | Exponential backoff factor |
|
|
363
|
+
| `debug` | bool | False | Enable debug logging |
|
|
364
|
+
| `log_level` | str | "INFO" | Logging level |
|
|
365
|
+
|
|
366
|
+
#### `ToolplaneHTTP` (HTTP gateway facade)
|
|
367
|
+
|
|
368
|
+
| Parameter | Type | Default | Description |
|
|
369
|
+
| --- | --- | --- | --- |
|
|
370
|
+
| `server_host` | str | "localhost" | Gateway hostname |
|
|
371
|
+
| `server_port` | int | 8080 | Gateway port |
|
|
372
|
+
| `api_key` | str | None | Authentication API key |
|
|
373
|
+
| `user_id` | str | None | User identifier |
|
|
374
|
+
| `session_name` | str | None | Session name |
|
|
375
|
+
| `session_description` | str | None | Session description |
|
|
376
|
+
| `session_namespace` | str | None | Session namespace |
|
|
377
|
+
| `max_buffer_size` | int | 4194304 | Buffer size (4MB) |
|
|
378
|
+
| `max_retries` | int | 3 | Maximum retry attempts |
|
|
379
|
+
| `request_timeout` | int | 30 | Request timeout in seconds |
|
|
380
|
+
| `retry_backoff_ms` | int | 250 | Retry backoff in milliseconds |
|
|
381
|
+
| `heartbeat_interval` | int | 60 | Heartbeat interval in seconds |
|
|
382
|
+
| `max_workers` | int | 10 | Maximum worker threads |
|
|
383
|
+
|
|
384
|
+
Configuration commonly comes from the environment; the examples read `TOOLPLANE_SERVER_HOST`, `TOOLPLANE_SERVER_PORT`, `TOOLPLANE_API_KEY`, `TOOLPLANE_USER_ID`, `TOOLPLANE_USE_TLS`, `TOOLPLANE_TLS_CA_CERT_PATH`, and `TOOLPLANE_TLS_SERVER_NAME`, defaulting the port to 9001 and the API key to `toolplane-conformance-fixture-key`.
|
|
385
|
+
|
|
386
|
+
## Error Handling
|
|
387
|
+
|
|
388
|
+
The client raises a typed hierarchy rooted at `ToolplaneError`:
|
|
389
|
+
|
|
390
|
+
```python
|
|
391
|
+
from toolplane import ToolplaneError, ToolplaneNotFoundError
|
|
392
|
+
|
|
393
|
+
try:
|
|
394
|
+
client.invoke("missing-tool", session_id)
|
|
395
|
+
except ToolplaneNotFoundError as e:
|
|
396
|
+
print(f"Tool not found: {e}")
|
|
397
|
+
except ToolplaneError as e:
|
|
398
|
+
print(f"Toolplane error: {e}")
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
| Exception | Raised for |
|
|
402
|
+
| --- | --- |
|
|
403
|
+
| `ToolplaneError` | Base class for every client error |
|
|
404
|
+
| `ConnectionError` | The server is unreachable or the channel dropped |
|
|
405
|
+
| `ToolError` / `SessionError` / `MachineError` / `RequestError` / `TaskError` | Domain-level failures in the matching resource |
|
|
406
|
+
| `ToolplaneAPIError` | Base for gRPC status-mapped server errors |
|
|
407
|
+
| `ToolplaneNotFoundError`, `ToolplaneInvalidArgumentError`, `ToolplaneFailedPreconditionError`, `ToolplaneResourceExhaustedError`, `ToolplaneUnauthenticatedError`, `ToolplanePermissionDeniedError`, `ToolplaneAlreadyExistsError`, `ToolplaneTimeoutError`, `ToolplaneUnavailableError`, `ToolplaneCancelledError`, `ToolplaneInternalError` | The matching gRPC status returned by the server |
|
|
408
|
+
|
|
409
|
+
## API Reference
|
|
410
|
+
|
|
411
|
+
<!-- BEGIN GENERATED: api-surface -- tooling: tools/gen_sdk_readmes.py; edits inside this block are overwritten -->
|
|
412
|
+
#### `Toolplane`
|
|
413
|
+
|
|
414
|
+
Public methods parsed from `toolplane/toolplane_client.py`:
|
|
415
|
+
|
|
416
|
+
| Method | Description |
|
|
417
|
+
| --- | --- |
|
|
418
|
+
| `connect() -> bool` | Connect to Toolplane server. |
|
|
419
|
+
| `disconnect() -> None` | Disconnect from Toolplane server. |
|
|
420
|
+
| `ensure_session_context(session_id: str, create_if_missing: bool=False, register_machine: bool=False) -> SessionContext` | Ensure a local session context exists without implying provider startup. |
|
|
421
|
+
| `create_session(session_id: Optional[str]=None, user_id: Optional[str]=None, name: Optional[str]=None, description: Optional[str]=None, namespace: Optional[str]=None, register_machine: bool=False) -> SessionContext` | Create a new session. |
|
|
422
|
+
| `get_session(session_id: str) -> Optional[SessionContext]` | Get session context by ID. |
|
|
423
|
+
| `list_sessions() -> List[SessionContext]` | List all session contexts. |
|
|
424
|
+
| `list_user_sessions(user_id: str, page_size: int=10, page_token: str='', filter: str='') -> Dict[str, Any]` | List user sessions with pagination and filtering. |
|
|
425
|
+
| `bulk_delete_sessions(user_id: str, session_ids: Optional[List[str]]=None, filter: str='') -> Dict[str, Any]` | Bulk delete sessions for a user. |
|
|
426
|
+
| `get_session_stats(user_id: str) -> Dict[str, int]` | Get session statistics for a user. |
|
|
427
|
+
| `invalidate_session(session_id: str, reason: str='') -> bool` | Invalidate a session. |
|
|
428
|
+
| `update_session(session_id: str, name: Optional[str]=None, description: Optional[str]=None, namespace: Optional[str]=None) -> Dict[str, Any]` | Update session metadata. |
|
|
429
|
+
| `create_request(session_id: str, tool_name: str, input_data: str, idempotency_key: str='') -> str` | Create a new request in a session. |
|
|
430
|
+
| `list_requests(session_id: str, status: str='', tool_name: str='', limit: int=10, page_token: str='') -> List[Dict[str, Any]]` | List requests in a session. |
|
|
431
|
+
| `list_requests_page(session_id: str, status: str='', tool_name: str='', limit: int=10, page_token: str='') -> Dict[str, Any]` | List one page of requests, with the continuation cursor. |
|
|
432
|
+
| `cancel_request(session_id: str, request_id: str) -> bool` | Cancel a request in a session. |
|
|
433
|
+
| `create_task(session_id: str, tool_name: str, input_data: str) -> Dict[str, Any]` | Create a new task in a session. |
|
|
434
|
+
| `get_task(session_id: str, task_id: str) -> Dict[str, Any]` | Get a task by ID in a session. |
|
|
435
|
+
| `list_tasks(session_id: str) -> List[Dict[str, Any]]` | List tasks in a session. |
|
|
436
|
+
| `cancel_task(session_id: str, task_id: str) -> bool` | Cancel a task in a session. |
|
|
437
|
+
| `list_machines(session_id: str) -> List[Dict[str, Any]]` | List machines in a session. |
|
|
438
|
+
| `get_machine(session_id: str, machine_id: str) -> Dict[str, Any]` | Get a machine by ID. |
|
|
439
|
+
| `unregister_machine(session_id: str, machine_id: Optional[str]=None) -> bool` | Unregister a machine from a session. |
|
|
440
|
+
| `drain_machine(session_id: str, machine_id: Optional[str]=None) -> bool` | Drain a machine from a session. |
|
|
441
|
+
| `create_api_key(session_id: str, name: str, capabilities: List[str]) -> Dict[str, Any]` | Create a new API key for a session. |
|
|
442
|
+
| `list_api_keys(session_id: str) -> List[Dict[str, Any]]` | List active API keys for a session. |
|
|
443
|
+
| `revoke_api_key(session_id: str, key_id: str) -> bool` | Revoke an API key for a session. |
|
|
444
|
+
| `tool(session_id: str, name: Optional[str]=None, description: Optional[str]=None, stream: bool=False, tags: Optional[List[str]]=None) -> Callable[[Callable], Callable]` | Decorator to register a tool for a session. |
|
|
445
|
+
| `invoke(tool_name: str, session_id: str, timeout_seconds: int=0, wait_timeout: Optional[int]=None, **params) -> Any` | Invoke a tool in a session and return the tool result value. |
|
|
446
|
+
| `async ainvoke(tool_name: str, session_id: str, timeout_seconds: int=0, **params) -> str` | Submit a tool invocation without blocking; awaits the request ID. |
|
|
447
|
+
| `stream(tool_name: str, callback: Callable[[Any, bool], None], session_id: str, timeout_seconds: int=0, **params) -> List[Any]` | Stream tool execution. |
|
|
448
|
+
| `async astream(tool_name: str, callback: Callable[[Any, bool], None], session_id: str, timeout_seconds: int=0, **params) -> List[Any]` | Awaitable stream: resolves with the collected chunks. |
|
|
449
|
+
| `get_available_tools(session_id: str) -> Dict[str, Any]` | Get available tools for a session. |
|
|
450
|
+
| `list_tools(session_id: str) -> List[Dict[str, Any]]` | List tools for a session. |
|
|
451
|
+
| `get_tool_by_id(session_id: str, tool_id: str) -> Dict[str, Any]` | Get a tool by ID. |
|
|
452
|
+
| `get_tool_by_name(session_id: str, tool_name: str) -> Dict[str, Any]` | Get a tool by name. |
|
|
453
|
+
| `delete_tool(session_id: str, tool_id: str) -> bool` | Delete a tool by ID. |
|
|
454
|
+
| `get_request_status(session_id: str, request_id: str) -> Dict[str, Any]` | Get request status (session-scoped, like every other facade method). |
|
|
455
|
+
| `provider_runtime(session_ids: Optional[List[str]]=None)` | Return the explicit provider runtime for this client. |
|
|
456
|
+
| `start() -> None` | Backward-compatible alias for the explicit provider runtime. |
|
|
457
|
+
| `stop() -> None` | Stop the explicit provider runtime if it is active. |
|
|
458
|
+
|
|
459
|
+
#### `ToolplaneHTTP`
|
|
460
|
+
|
|
461
|
+
Public methods parsed from `toolplane/toolplane_http_client.py`:
|
|
462
|
+
|
|
463
|
+
| Method | Description |
|
|
464
|
+
| --- | --- |
|
|
465
|
+
| `connect() -> bool` | Connect to HTTP server. |
|
|
466
|
+
| `disconnect()` | Disconnect from HTTP server. |
|
|
467
|
+
| `ensure_session_context(session_id: str, create_if_missing: bool=False, register_machine: bool=False) -> HTTPSessionContext` | Ensure a local session context exists without implying provider startup. |
|
|
468
|
+
| `create_session(session_id: Optional[str]=None, user_id: Optional[str]=None, name: Optional[str]=None, description: Optional[str]=None, namespace: Optional[str]=None, register_machine: bool=False) -> HTTPSessionContext` | Create a new session. |
|
|
469
|
+
| `get_session(session_id: str) -> Optional[HTTPSessionContext]` | Get session context by ID. |
|
|
470
|
+
| `list_sessions() -> List[HTTPSessionContext]` | List all session contexts. |
|
|
471
|
+
| `get_primary_session_context() -> Optional[HTTPSessionContext]` | Get primary session context. |
|
|
472
|
+
| `tool(session_id: str, name: Optional[str]=None, description: Optional[str]=None, stream: bool=False, tags: Optional[List[str]]=None)` | Decorator to register a tool for a session. |
|
|
473
|
+
| `invoke(tool_name: str, session_id: str, timeout_seconds: int=0, wait_timeout: Optional[int]=None, **params) -> Any` | Invoke a tool in a session and return the tool result value. |
|
|
474
|
+
| `async ainvoke(tool_name: str, session_id: str, timeout_seconds: int=0, **params) -> str` | Submit a tool invocation without blocking; awaits the request ID. |
|
|
475
|
+
| `stream(tool_name: str, callback: Callable[[Any, bool], None], session_id: str, **params) -> List[Any]` | Stream tool execution. |
|
|
476
|
+
| `async astream(tool_name: str, callback: Callable[[Any, bool], None], session_id: str, **params) -> List[Any]` | Awaitable stream: resolves with the collected chunks. |
|
|
477
|
+
| `get_available_tools(session_id: str) -> Dict[str, Any]` | Get available tools for a session. |
|
|
478
|
+
| `list_tools(session_id: str) -> List[Dict[str, Any]]` | List tools for a session. |
|
|
479
|
+
| `get_tool_by_id(session_id: str, tool_id: str) -> Dict[str, Any]` | Get a tool by ID. |
|
|
480
|
+
| `get_tool_by_name(session_id: str, tool_name: str) -> Dict[str, Any]` | Get a tool by name. |
|
|
481
|
+
| `delete_tool(session_id: str, tool_id: str) -> bool` | Delete a tool by ID. |
|
|
482
|
+
| `get_request_status(session_id: str, request_id: str) -> Dict[str, Any]` | Get request status (session-scoped, like every other facade method). |
|
|
483
|
+
| `list_user_sessions(user_id: str, page_size: int=10, page_token: str='', filter: str='') -> Dict[str, Any]` | List user sessions with pagination and filtering. |
|
|
484
|
+
| `bulk_delete_sessions(user_id: str, session_ids: List[str]=None, filter: str='') -> Dict[str, Any]` | Bulk delete sessions for a user. |
|
|
485
|
+
| `get_session_stats(user_id: str) -> Dict[str, int]` | Get session statistics for a user. |
|
|
486
|
+
| `invalidate_session(session_id: str, reason: str='') -> bool` | Invalidate a session. |
|
|
487
|
+
| `update_session(session_id: str, name: Optional[str]=None, description: Optional[str]=None, namespace: Optional[str]=None) -> Dict[str, Any]` | Update session metadata. |
|
|
488
|
+
| `create_request(session_id: str, tool_name: str, input_data: str, idempotency_key: str='') -> str` | Create a new request in a session. |
|
|
489
|
+
| `list_requests(session_id: str, status: str='', tool_name: str='', limit: int=10, page_token: str='') -> List[Dict[str, Any]]` | List requests in a session. |
|
|
490
|
+
| `list_requests_page(session_id: str, status: str='', tool_name: str='', limit: int=10, page_token: str='') -> Dict[str, Any]` | List one page of requests, with the continuation cursor. |
|
|
491
|
+
| `cancel_request(session_id: str, request_id: str) -> bool` | Cancel a request in a session. |
|
|
492
|
+
| `create_task(session_id: str, tool_name: str, input_data: str) -> Dict[str, Any]` | Create a new task in a session. |
|
|
493
|
+
| `get_task(session_id: str, task_id: str) -> Dict[str, Any]` | Get a task by ID in a session. |
|
|
494
|
+
| `list_tasks(session_id: str) -> List[Dict[str, Any]]` | List tasks in a session. |
|
|
495
|
+
| `cancel_task(session_id: str, task_id: str) -> bool` | Cancel a task in a session. |
|
|
496
|
+
| `list_machines(session_id: str) -> List[Dict[str, Any]]` | List machines in a session. |
|
|
497
|
+
| `get_machine(session_id: str, machine_id: str) -> Dict[str, Any]` | Get a machine by ID. |
|
|
498
|
+
| `unregister_machine(session_id: str, machine_id: Optional[str]=None) -> bool` | Unregister a machine from a session. |
|
|
499
|
+
| `drain_machine(session_id: str, machine_id: Optional[str]=None) -> bool` | Drain a machine from a session. |
|
|
500
|
+
| `create_api_key(session_id: str, name: str, capabilities: List[str]) -> Dict[str, Any]` | Create a new API key for a session. |
|
|
501
|
+
| `list_api_keys(session_id: str) -> List[Dict[str, Any]]` | List active API keys for a session. |
|
|
502
|
+
| `revoke_api_key(session_id: str, key_id: str) -> bool` | Revoke an API key for a session. |
|
|
503
|
+
| `provider_runtime(session_ids: Optional[List[str]]=None)` | Return the explicit provider runtime for this client. |
|
|
504
|
+
| `start()` | Backward-compatible alias for the explicit provider runtime. |
|
|
505
|
+
| `stop()` | Stop the explicit provider runtime if it is active. |
|
|
506
|
+
| `health()` | Check server health. |
|
|
507
|
+
|
|
508
|
+
#### `ProviderRuntime`
|
|
509
|
+
|
|
510
|
+
Public methods parsed from `toolplane/provider_runtime.py`:
|
|
511
|
+
|
|
512
|
+
| Method | Description |
|
|
513
|
+
| --- | --- |
|
|
514
|
+
| `running -> bool` | Property. |
|
|
515
|
+
| `add_sessions(session_ids: Optional[Iterable[str]]) -> None` | |
|
|
516
|
+
| `managed_session_ids() -> List[str]` | |
|
|
517
|
+
| `attach_session(session_id: str, register_machine: bool=True)` | |
|
|
518
|
+
| `create_session(session_id: Optional[str]=None, user_id: Optional[str]=None, name: Optional[str]=None, description: Optional[str]=None, namespace: Optional[str]=None, register_machine: bool=True)` | |
|
|
519
|
+
| `register_tool(session_id: str, name: str, func: Callable, schema: Optional[dict]=None, description: Optional[str]=None, stream: bool=False, tags: Optional[List[str]]=None) -> Callable` | |
|
|
520
|
+
| `tool(session_id: Optional[str]=None, name: Optional[str]=None, description: Optional[str]=None, stream: bool=False, tags: Optional[List[str]]=None)` | Queue a tool for registration at runtime start. |
|
|
521
|
+
| `poll_once() -> None` | |
|
|
522
|
+
| `start_in_background(session_ids: Optional[Iterable[str]]=None) -> 'ProviderRuntime'` | |
|
|
523
|
+
| `run_forever(session_ids: Optional[Iterable[str]]=None) -> None` | |
|
|
524
|
+
| `stop() -> None` | |
|
|
525
|
+
| `close() -> None` | |
|
|
526
|
+
<!-- END GENERATED: api-surface -->
|
|
527
|
+
|
|
528
|
+
## Contributing
|
|
529
|
+
|
|
530
|
+
Contributions are welcome — see the [repository-level README](../../README.md) Contributing section for the required checks. Run the Python suites locally with:
|
|
531
|
+
|
|
532
|
+
```bash
|
|
533
|
+
cd server
|
|
534
|
+
make python-unit # unit tests
|
|
535
|
+
make conformance-python # shared-fixture conformance
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
## Support
|
|
539
|
+
|
|
540
|
+
- Advanced API reference: [MANUAL.md](MANUAL.md)
|
|
541
|
+
- Example walkthrough: [README_EXAMPLES.md](README_EXAMPLES.md)
|
|
542
|
+
- Package architecture: [ARCHITECTURE.md](ARCHITECTURE.md)
|
|
543
|
+
- Issues: [open one on the GitHub repository](https://github.com/Abhishek-chohan/tool-control-plane/issues)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
toolplane/__init__.py,sha256=VOb4oztCIfY5GP-yccU4lpbgqeFSWhvBgg2gZSJ6pjs,2666
|
|
2
|
+
toolplane/provider_cli.py,sha256=87hYn9snp6z7XTXuWxAQKGECC-tXihsrQUq-jnlgvvU,9176
|
|
3
|
+
toolplane/provider_registry.py,sha256=_7ZKKBOGn-vvr24gfwF03t6d4268qt8J2AvEAL3iSeU,2094
|
|
4
|
+
toolplane/provider_runtime.py,sha256=IfB5ofss_MvcNBZZqxv_J1Ui2WvXoB7Q4Dzc5f3yWqw,10455
|
|
5
|
+
toolplane/toolplane_client.py,sha256=nWAl-7ezD36oEDHGVeeQ5u5ZU3P5FddY6PjPGeGIF0s,25369
|
|
6
|
+
toolplane/toolplane_http_client.py,sha256=ZWA3SkzH-VciTvW6MXq6b7-maZR1iGobZCv_E_y21yY,25148
|
|
7
|
+
toolplane/common/__init__.py,sha256=lYa6uC-D7ldacgJjSiImwqlDuU1GwAMnw-BdWNoy-lM,2352
|
|
8
|
+
toolplane/common/base_config.py,sha256=SapLuCMxdZLg2vvpUqs_KC8keQIrLNDagSZMCA6sp3w,4537
|
|
9
|
+
toolplane/common/base_connection_manager.py,sha256=qz-sS8b4rkTSKpjBR63Bbj5jd27ODJ4ODmXX5PzF5TU,5214
|
|
10
|
+
toolplane/common/base_session_manager.py,sha256=37a65TWzLV0hLnmC0IhZbf0P0NgFpVvwBg4HgHWpnG0,10608
|
|
11
|
+
toolplane/common/base_tool_manager.py,sha256=o6J69U5xthfBH4MyeXbywv6rGSMUSoyloTt0W9kfeGM,11951
|
|
12
|
+
toolplane/common/constants.py,sha256=VMVseqhhQTEEMBcMGhJ1m6ZSPs6U8f5bKi_tQ46yw4g,1582
|
|
13
|
+
toolplane/common/utils.py,sha256=eRpGoMBLrlk4eBqDFmVIupeGUBcbHfGYIz7MOpgEEhI,9111
|
|
14
|
+
toolplane/core/__init__.py,sha256=Q8N7n9sf9-8WTA2BStExeJuB6K-y2lt2C_AUEHULXT4,1781
|
|
15
|
+
toolplane/core/config.py,sha256=jRoMVc_hoeqfwaav8UwVYdWoVvPiBYBG82w3AluJkkk,3858
|
|
16
|
+
toolplane/core/connection.py,sha256=pD0zicdVQGY6rNNNsmGAE66rIfoCpNkTCifkFgw4MDI,10790
|
|
17
|
+
toolplane/core/errors.py,sha256=ddeZ32RdGSwlgQKw8JyFtKnrmbxEcMYhq05cRorVEY8,9562
|
|
18
|
+
toolplane/core/machine.py,sha256=ksG8JdK0QmBOPd0zwjdq4BPOfE4w5-lS6S57E4wazyU,17484
|
|
19
|
+
toolplane/core/request.py,sha256=XjtjHjaJ42lBShXCXqwRWX-pr9gIzyfmSy5sLrV34fA,26630
|
|
20
|
+
toolplane/core/session.py,sha256=WiuwZl6r80NwRRxjMJIOC8ylyiT7w8RIL4TUx60eOo0,11802
|
|
21
|
+
toolplane/core/session_context.py,sha256=VLwyle33cA6oeE-Pam-zapPUj5rU7Im-ok2vEiV5kL0,18506
|
|
22
|
+
toolplane/core/task.py,sha256=COuxyoERoAioQbkjXj7pwqNtmzYBSWR099kADjWtE8M,4951
|
|
23
|
+
toolplane/core/tool.py,sha256=DFeKMdNC5_Y5bF5Q2gkditCqRywBIHiUUxFjb1Q9CVc,12620
|
|
24
|
+
toolplane/http_core/__init__.py,sha256=CESVsLFujKeufk8TT7JtKe-A9B0aO6LJEemCplymyf8,927
|
|
25
|
+
toolplane/http_core/http_config.py,sha256=JUdeElZtYmmypjlWZF9JSyKDzIe1W3W-nt6G7YiBGdg,3314
|
|
26
|
+
toolplane/http_core/http_connection.py,sha256=AxrJIOIXxG0IC5B6itTj80N9YxeSkutJV1r6jvQDpNs,14356
|
|
27
|
+
toolplane/http_core/http_machine.py,sha256=uhJo5JnwpS5Yxl3tgiqFPpNGXZPyDplyuknWhMIXbWY,10823
|
|
28
|
+
toolplane/http_core/http_request.py,sha256=4VBWmVztpEh-HjFHX96aHLbLNaSMQNkUN-nIt8HrNvA,25999
|
|
29
|
+
toolplane/http_core/http_session.py,sha256=zdKgB5rRkgWDYnLcocnIKg-Wg-kXnIoetbfeUatk4DI,12681
|
|
30
|
+
toolplane/http_core/http_session_context.py,sha256=ulounQrxX20uzE3BYGJaFdprdbJHtcGqTJcDPCIuXNY,18121
|
|
31
|
+
toolplane/http_core/http_task.py,sha256=L-E7cjd4rA73Bzj98TpDuYdzREgEMqSSqe4RywW4iL0,4079
|
|
32
|
+
toolplane/http_core/http_tool.py,sha256=Te_QprfpO22JqUnf7YI4FcPFwN7e1Jf9qnyuNw-7Als,14659
|
|
33
|
+
toolplane/interfaces/__init__.py,sha256=rdV6dJ_REiZMbq2m2LlmDhlKPq1h7ym9IRDEeOvwuUI,846
|
|
34
|
+
toolplane/interfaces/client_interface.py,sha256=umlv0tG8B9Wt02ObK3jIPMtJdPJOpcpdebWMvWSd6ME,3797
|
|
35
|
+
toolplane/interfaces/connection_interface.py,sha256=FS5NSGoUuSL5H_Se5Na04Rchx3nVUOJO1TqpArfktR0,5526
|
|
36
|
+
toolplane/interfaces/event_interface.py,sha256=z6H0v0lio0pPWPkkXDLr_NbZScDJMZuK2ojyl7g7G7M,9107
|
|
37
|
+
toolplane/interfaces/request_interface.py,sha256=YP6V22jx5V6xSCHeZr26fgWyj8mGhox9cmRk78Hstxo,13340
|
|
38
|
+
toolplane/interfaces/session_interface.py,sha256=XNvBp965x94N2d-kGTGhEMOg0G1tdfL3WToqjyG2yU8,9430
|
|
39
|
+
toolplane/interfaces/tool_interface.py,sha256=aVN7nWZTIhlVEcbCy1MEJaodoPUbjIWysyjTDETzNbY,14220
|
|
40
|
+
toolplane/proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
41
|
+
toolplane/proto/service_pb2.py,sha256=ZlFtsXIjetDYw9uizIOyc5w5Du9eAt4G5E_CAoT9ITA,44670
|
|
42
|
+
toolplane/proto/service_pb2_grpc.py,sha256=Jd-PeE8VVKvtp3k9XP-hZBFYtlB8q5ieUZ2b0JDDJRY,88951
|
|
43
|
+
toolplane/toolkits/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
|
+
toolplane/toolkits/standalone_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
|
+
toolplane/toolkits/standalone_tools/create_directory.py,sha256=jxdXpE-GclcRLp_kfxVvaMVkT9EbB0WUHbUT1Cr4Ej4,2890
|
|
46
|
+
toolplane/toolkits/standalone_tools/create_file.py,sha256=_9iXmXt1GyxgqqSoPzOLkWpTVXaBbyMgWMdc-YTBIDQ,3964
|
|
47
|
+
toolplane/toolkits/standalone_tools/file_search.py,sha256=wlu4tUD2MW2crsWvfORZhTV2hiLuJ7dRlP5-GZaAxL4,7262
|
|
48
|
+
toolplane/toolkits/standalone_tools/grep_search.py,sha256=4NF5FdVNdRfcN8XctXBYbtcTOlu2YGotCeXlxsliK5Q,10687
|
|
49
|
+
toolplane/toolkits/standalone_tools/launcher.py,sha256=DjMFENQQhZzPgwCHZ58ecCV7akV6rbu_PON_Yg4Ani0,4365
|
|
50
|
+
toolplane/toolkits/standalone_tools/list_dir.py,sha256=ampfoYEvJq9NNsy__sjzChpB70_5Mgyc9Q1DjM6nFSk,13006
|
|
51
|
+
toolplane/toolkits/standalone_tools/read_file.py,sha256=oFCMCS6JGm65dG0o7NUDSsZH2g1ghUZwDOgWY8nqj1k,10506
|
|
52
|
+
toolplane/toolkits/standalone_tools/replace_string_in_file.py,sha256=_2Rz-dlCRyMnH12KpVnWCLPhuqgZq66dZOD-iIpBt9g,13516
|
|
53
|
+
toolplane/toolkits/standalone_tools/run_tests.py,sha256=wY6nZWIMXV2CZAEQ1Q7jnKuQVUSf-0EgGL349Bt5GBM,1813
|
|
54
|
+
toolplane/toolkits/standalone_tools/semantic_search.py,sha256=AuLenPHDW00NGPL7ILqhDYqdcZLjLABYUYEy31GpcQs,14443
|
|
55
|
+
toolplane/toolkits/standalone_tools/standalone_toolkit.py,sha256=AWVS4ap1OKxPs67aiLNhLEWw7KbENiKGUJQav12OCuA,35141
|
|
56
|
+
toolplane/toolkits/standalone_tools/test_failure_analysis.py,sha256=O1Z7Z5266iOW5uIpUF0aXVF74vAt_hnRSp0zRTrCo4k,20898
|
|
57
|
+
toolplane/toolkits/standalone_tools/test_standalone_toolkit.py,sha256=XQRgXnfYCYu_ahzX2y4KBSaIfDH1pittdSEsBeaVhgg,18112
|
|
58
|
+
toolplane/toolkits/swe/__init__.py,sha256=Ql-hdU6jPWIdwwZQblfJu5qlkwiW6VDKrbo7OGg9Imw,664
|
|
59
|
+
toolplane/toolkits/swe/create_directory.py,sha256=CCrJ2t7-NrWMQvB3d110PDRu4wIgN5oU96lNglrg98A,400
|
|
60
|
+
toolplane/toolkits/swe/create_file.py,sha256=1DVsvJx4uPjXnGC1C8u2wDQ2ndrvfbUN1CNmGTSzPik,390
|
|
61
|
+
toolplane/toolkits/swe/descriptions.py,sha256=D9pYfZ2WZjWpeg3jJm3yKCGq-2_cFnG1BKboD7jRm-U,11766
|
|
62
|
+
toolplane/toolkits/swe/execute_bash.py,sha256=ettykydDNEjYd78vdABhxQAwxDI2-YyccimrauybPXU,2932
|
|
63
|
+
toolplane/toolkits/swe/file_editor.py,sha256=l2HRFvgN5zFAXlVExPBmHcgaiJzi59ppVLCEVSgdrkI,29405
|
|
64
|
+
toolplane/toolkits/swe/file_search.py,sha256=JKltNkySi_HbUvWw7Ct2jFcHxbfJH1GeKt64iwXYzoo,407
|
|
65
|
+
toolplane/toolkits/swe/finish.py,sha256=lJkTclzO1YLUFiaFnjfY2nYp46Q38o6Ky2D3axZ3idE,1494
|
|
66
|
+
toolplane/toolkits/swe/grep_search.py,sha256=eRc7vtVoV_Wmo9hiO034TKVbBqWYU7sxgTgzhyWb-3E,475
|
|
67
|
+
toolplane/toolkits/swe/list_dir.py,sha256=-wOSxQ-2k4sRYIfCKkZaQqW9mDYeBGp9i5m8RqFf7cY,13451
|
|
68
|
+
toolplane/toolkits/swe/read_file.py,sha256=NeI8z6ztsiCk0ccHIY8UIgJuFXR200pfMYmDJ05_HY4,449
|
|
69
|
+
toolplane/toolkits/swe/replace_string_in_file.py,sha256=_wgmKiSlgogznhg4QAToi_AuHqk627f3TwRN7p7tB6w,472
|
|
70
|
+
toolplane/toolkits/swe/search.py,sha256=b_Z9HWy1FPFn1YAg-B-3nUeiTbd2G8GJy-jSZUIG3yk,9370
|
|
71
|
+
toolplane/toolkits/swe/semantic_search.py,sha256=Zcd5Ls3FwJKr8lWGZDBzMylBYMn5-oPQB4ENGL87Aa8,523
|
|
72
|
+
toolplane/toolkits/swe/str_replace_editor.py,sha256=Q43mJonOUbFiothzGa10eSN-89FA7_AdhlCwxv5WLs4,23630
|
|
73
|
+
toolplane/toolkits/swe/submit.py,sha256=pRRjofidgf24RcWD2vhwgjFLr7bBOAAV9NSvqYbwlL8,547
|
|
74
|
+
toolplane/toolkits/swe/swe_toolkit.py,sha256=Eh9Jrccc-H2D1zEQkGM2IsH_aMGqv0fD6E8ho0ajem8,44835
|
|
75
|
+
toolplane/utils/__init__.py,sha256=w_djmtPagjMs-KyUy9MN09J-x-4ShX2SBRah38pSy2U,139
|
|
76
|
+
toolplane/utils/schema.py,sha256=X2WjsAakymlaV5-dgsUZiciKyzsrw6ErTPYA8ZcYuxI,4406
|
|
77
|
+
toolplane_python_client-0.1.0.dist-info/METADATA,sha256=TRFWd5xwQnOMWko5xTUZPkK-ydsTof8tkuJm58FtIrM,28378
|
|
78
|
+
toolplane_python_client-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
79
|
+
toolplane_python_client-0.1.0.dist-info/entry_points.txt,sha256=JkR2hs-auiqhLpTqwy4nfUj24WRUn5Fe_rs6us6W2J0,67
|
|
80
|
+
toolplane_python_client-0.1.0.dist-info/top_level.txt,sha256=siTUe6zrWvaqnzl_wEXbc2gEQyGKNCxg3pkzuXP895g,10
|
|
81
|
+
toolplane_python_client-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
toolplane
|