prompture 0.0.45.dev1__py3-none-any.whl → 0.0.46__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.
- prompture/_version.py +2 -2
- prompture/async_groups.py +4 -0
- prompture/drivers/async_moonshot_driver.py +61 -10
- prompture/drivers/moonshot_driver.py +126 -10
- prompture/group_types.py +1 -0
- prompture/groups.py +4 -0
- prompture/tools_schema.py +7 -1
- {prompture-0.0.45.dev1.dist-info → prompture-0.0.46.dist-info}/METADATA +1 -1
- {prompture-0.0.45.dev1.dist-info → prompture-0.0.46.dist-info}/RECORD +13 -13
- {prompture-0.0.45.dev1.dist-info → prompture-0.0.46.dist-info}/WHEEL +0 -0
- {prompture-0.0.45.dev1.dist-info → prompture-0.0.46.dist-info}/entry_points.txt +0 -0
- {prompture-0.0.45.dev1.dist-info → prompture-0.0.46.dist-info}/licenses/LICENSE +0 -0
- {prompture-0.0.45.dev1.dist-info → prompture-0.0.46.dist-info}/top_level.txt +0 -0
prompture/_version.py
CHANGED
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.0.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 0,
|
|
31
|
+
__version__ = version = '0.0.46'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 0, 46)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
prompture/async_groups.py
CHANGED
|
@@ -340,6 +340,8 @@ class AsyncSequentialGroup:
|
|
|
340
340
|
if self._callbacks.on_agent_error:
|
|
341
341
|
self._callbacks.on_agent_error(name, exc)
|
|
342
342
|
|
|
343
|
+
if self._error_policy == ErrorPolicy.raise_on_error:
|
|
344
|
+
raise
|
|
343
345
|
if self._error_policy == ErrorPolicy.fail_fast:
|
|
344
346
|
break
|
|
345
347
|
|
|
@@ -495,6 +497,8 @@ class AsyncLoopGroup:
|
|
|
495
497
|
if self._callbacks.on_agent_error:
|
|
496
498
|
self._callbacks.on_agent_error(name, exc)
|
|
497
499
|
|
|
500
|
+
if self._error_policy == ErrorPolicy.raise_on_error:
|
|
501
|
+
raise
|
|
498
502
|
if self._error_policy == ErrorPolicy.fail_fast:
|
|
499
503
|
break
|
|
500
504
|
|
|
@@ -10,6 +10,7 @@ Moonshot-specific constraints:
|
|
|
10
10
|
from __future__ import annotations
|
|
11
11
|
|
|
12
12
|
import json
|
|
13
|
+
import logging
|
|
13
14
|
import os
|
|
14
15
|
from collections.abc import AsyncIterator
|
|
15
16
|
from typing import Any
|
|
@@ -20,6 +21,8 @@ from ..async_driver import AsyncDriver
|
|
|
20
21
|
from ..cost_mixin import CostMixin, prepare_strict_schema
|
|
21
22
|
from .moonshot_driver import MoonshotDriver
|
|
22
23
|
|
|
24
|
+
logger = logging.getLogger("prompture.drivers.moonshot")
|
|
25
|
+
|
|
23
26
|
|
|
24
27
|
class AsyncMoonshotDriver(CostMixin, AsyncDriver):
|
|
25
28
|
supports_json_mode = True
|
|
@@ -122,7 +125,8 @@ class AsyncMoonshotDriver(CostMixin, AsyncDriver):
|
|
|
122
125
|
response.raise_for_status()
|
|
123
126
|
resp = response.json()
|
|
124
127
|
except httpx.HTTPStatusError as e:
|
|
125
|
-
|
|
128
|
+
error_body = MoonshotDriver._format_error_body(data, e)
|
|
129
|
+
error_msg = f"Moonshot API request failed: {e!s}{error_body}"
|
|
126
130
|
raise RuntimeError(error_msg) from e
|
|
127
131
|
except Exception as e:
|
|
128
132
|
raise RuntimeError(f"Moonshot API request failed: {e!s}") from e
|
|
@@ -132,6 +136,57 @@ class AsyncMoonshotDriver(CostMixin, AsyncDriver):
|
|
|
132
136
|
completion_tokens = usage.get("completion_tokens", 0)
|
|
133
137
|
total_tokens = usage.get("total_tokens", 0)
|
|
134
138
|
|
|
139
|
+
message = resp["choices"][0]["message"]
|
|
140
|
+
text = message.get("content") or ""
|
|
141
|
+
|
|
142
|
+
# Reasoning models may return content in reasoning_content when content is empty
|
|
143
|
+
if not text and message.get("reasoning_content"):
|
|
144
|
+
text = message["reasoning_content"]
|
|
145
|
+
|
|
146
|
+
# Structured output fallback: if we used json_schema mode and got an
|
|
147
|
+
# empty response, retry with json_object mode and schema in the prompt.
|
|
148
|
+
used_strict = data.get("response_format", {}).get("type") == "json_schema"
|
|
149
|
+
if used_strict and not text.strip() and completion_tokens == 0:
|
|
150
|
+
logger.info(
|
|
151
|
+
"Moonshot returned empty response with json_schema mode for %s; retrying with json_object fallback",
|
|
152
|
+
model,
|
|
153
|
+
)
|
|
154
|
+
fallback_data = {k: v for k, v in data.items() if k != "response_format"}
|
|
155
|
+
fallback_data["response_format"] = {"type": "json_object"}
|
|
156
|
+
|
|
157
|
+
json_schema = options.get("json_schema")
|
|
158
|
+
schema_instruction = (
|
|
159
|
+
"Return a JSON object that validates against this schema:\n"
|
|
160
|
+
f"{json.dumps(json_schema, indent=2)}\n"
|
|
161
|
+
"If a value is unknown use null."
|
|
162
|
+
)
|
|
163
|
+
fallback_messages = list(fallback_data["messages"])
|
|
164
|
+
fallback_messages.append({"role": "system", "content": schema_instruction})
|
|
165
|
+
fallback_data["messages"] = fallback_messages
|
|
166
|
+
|
|
167
|
+
async with httpx.AsyncClient() as fb_client:
|
|
168
|
+
try:
|
|
169
|
+
fb_response = await fb_client.post(
|
|
170
|
+
f"{self.base_url}/chat/completions",
|
|
171
|
+
headers=self.headers,
|
|
172
|
+
json=fallback_data,
|
|
173
|
+
timeout=120,
|
|
174
|
+
)
|
|
175
|
+
fb_response.raise_for_status()
|
|
176
|
+
fb_resp = fb_response.json()
|
|
177
|
+
except Exception:
|
|
178
|
+
pass # Fallback failed — return original empty result
|
|
179
|
+
else:
|
|
180
|
+
fb_usage = fb_resp.get("usage", {})
|
|
181
|
+
prompt_tokens += fb_usage.get("prompt_tokens", 0)
|
|
182
|
+
completion_tokens = fb_usage.get("completion_tokens", 0)
|
|
183
|
+
total_tokens = prompt_tokens + completion_tokens
|
|
184
|
+
resp = fb_resp
|
|
185
|
+
fb_message = fb_resp["choices"][0]["message"]
|
|
186
|
+
text = fb_message.get("content") or ""
|
|
187
|
+
if not text and fb_message.get("reasoning_content"):
|
|
188
|
+
text = fb_message["reasoning_content"]
|
|
189
|
+
|
|
135
190
|
total_cost = self._calculate_cost("moonshot", model, prompt_tokens, completion_tokens)
|
|
136
191
|
|
|
137
192
|
meta = {
|
|
@@ -143,13 +198,6 @@ class AsyncMoonshotDriver(CostMixin, AsyncDriver):
|
|
|
143
198
|
"model_name": model,
|
|
144
199
|
}
|
|
145
200
|
|
|
146
|
-
message = resp["choices"][0]["message"]
|
|
147
|
-
text = message.get("content") or ""
|
|
148
|
-
|
|
149
|
-
# Reasoning models may return content in reasoning_content when content is empty
|
|
150
|
-
if not text and message.get("reasoning_content"):
|
|
151
|
-
text = message["reasoning_content"]
|
|
152
|
-
|
|
153
201
|
return {"text": text, "meta": meta}
|
|
154
202
|
|
|
155
203
|
# ------------------------------------------------------------------
|
|
@@ -173,10 +221,12 @@ class AsyncMoonshotDriver(CostMixin, AsyncDriver):
|
|
|
173
221
|
opts = {"temperature": 1.0, "max_tokens": 512, **options}
|
|
174
222
|
MoonshotDriver._clamp_temperature(opts)
|
|
175
223
|
|
|
224
|
+
sanitized_tools = MoonshotDriver._sanitize_tools(tools)
|
|
225
|
+
|
|
176
226
|
data: dict[str, Any] = {
|
|
177
227
|
"model": model,
|
|
178
228
|
"messages": messages,
|
|
179
|
-
"tools":
|
|
229
|
+
"tools": sanitized_tools,
|
|
180
230
|
}
|
|
181
231
|
data[tokens_param] = opts.get("max_tokens", 512)
|
|
182
232
|
|
|
@@ -199,7 +249,8 @@ class AsyncMoonshotDriver(CostMixin, AsyncDriver):
|
|
|
199
249
|
response.raise_for_status()
|
|
200
250
|
resp = response.json()
|
|
201
251
|
except httpx.HTTPStatusError as e:
|
|
202
|
-
|
|
252
|
+
error_body = MoonshotDriver._format_error_body(data, e)
|
|
253
|
+
error_msg = f"Moonshot API request failed: {e!s}{error_body}"
|
|
203
254
|
raise RuntimeError(error_msg) from e
|
|
204
255
|
except Exception as e:
|
|
205
256
|
raise RuntimeError(f"Moonshot API request failed: {e!s}") from e
|
|
@@ -10,6 +10,7 @@ Moonshot-specific constraints:
|
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
12
|
import json
|
|
13
|
+
import logging
|
|
13
14
|
import os
|
|
14
15
|
from collections.abc import Iterator
|
|
15
16
|
from typing import Any
|
|
@@ -19,6 +20,8 @@ import requests
|
|
|
19
20
|
from ..cost_mixin import CostMixin, prepare_strict_schema
|
|
20
21
|
from ..driver import Driver
|
|
21
22
|
|
|
23
|
+
logger = logging.getLogger("prompture.drivers.moonshot")
|
|
24
|
+
|
|
22
25
|
|
|
23
26
|
class MoonshotDriver(CostMixin, Driver):
|
|
24
27
|
supports_json_mode = True
|
|
@@ -72,6 +75,70 @@ class MoonshotDriver(CostMixin, Driver):
|
|
|
72
75
|
data["tool_choice"] = "auto"
|
|
73
76
|
return data
|
|
74
77
|
|
|
78
|
+
@staticmethod
|
|
79
|
+
def _sanitize_tools(tools: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
80
|
+
"""Sanitize tool definitions for Moonshot API compatibility.
|
|
81
|
+
|
|
82
|
+
Fixes common issues that cause 400 errors:
|
|
83
|
+
- Ensures every function has a non-empty description.
|
|
84
|
+
- Removes empty ``required`` arrays from parameter schemas.
|
|
85
|
+
- Ensures parameter descriptions are meaningful (not just 'Parameter: x').
|
|
86
|
+
"""
|
|
87
|
+
sanitized = []
|
|
88
|
+
for tool in tools:
|
|
89
|
+
tool = json.loads(json.dumps(tool)) # deep copy
|
|
90
|
+
func = tool.get("function", {})
|
|
91
|
+
|
|
92
|
+
# Ensure description is non-empty
|
|
93
|
+
if not func.get("description"):
|
|
94
|
+
func["description"] = f"Call the {func.get('name', 'unknown')} function"
|
|
95
|
+
|
|
96
|
+
params = func.get("parameters", {})
|
|
97
|
+
|
|
98
|
+
# Remove empty required arrays — Moonshot rejects these
|
|
99
|
+
if "required" in params and not params["required"]:
|
|
100
|
+
del params["required"]
|
|
101
|
+
|
|
102
|
+
# Ensure properties exist even if empty
|
|
103
|
+
if "properties" not in params:
|
|
104
|
+
params["properties"] = {}
|
|
105
|
+
|
|
106
|
+
sanitized.append(tool)
|
|
107
|
+
return sanitized
|
|
108
|
+
|
|
109
|
+
@staticmethod
|
|
110
|
+
def _format_error_body(data: dict[str, Any], error: Exception) -> str:
|
|
111
|
+
"""Build a redacted request body excerpt for error diagnostics.
|
|
112
|
+
|
|
113
|
+
Omits message content (can be large) and the Authorization header.
|
|
114
|
+
Includes model, tools, response_format, and tool_choice if present.
|
|
115
|
+
"""
|
|
116
|
+
excerpt: dict[str, Any] = {}
|
|
117
|
+
for key in ("model", "response_format", "tool_choice"):
|
|
118
|
+
if key in data:
|
|
119
|
+
excerpt[key] = data[key]
|
|
120
|
+
if "tools" in data:
|
|
121
|
+
# Show tool names/parameter keys only, not full schemas
|
|
122
|
+
excerpt["tools"] = [
|
|
123
|
+
{
|
|
124
|
+
"name": t.get("function", {}).get("name"),
|
|
125
|
+
"params": list(t.get("function", {}).get("parameters", {}).get("properties", {}).keys()),
|
|
126
|
+
}
|
|
127
|
+
for t in data.get("tools", [])
|
|
128
|
+
]
|
|
129
|
+
# Include response body from the error if available
|
|
130
|
+
response_text = ""
|
|
131
|
+
resp = getattr(error, "response", None)
|
|
132
|
+
if resp is not None:
|
|
133
|
+
import contextlib
|
|
134
|
+
|
|
135
|
+
with contextlib.suppress(Exception):
|
|
136
|
+
response_text = resp.text[:500] if hasattr(resp, "text") else ""
|
|
137
|
+
parts = [f"\nRequest excerpt: {json.dumps(excerpt, default=str)}"]
|
|
138
|
+
if response_text:
|
|
139
|
+
parts.append(f"Response body: {response_text}")
|
|
140
|
+
return "\n".join(parts)
|
|
141
|
+
|
|
75
142
|
def _prepare_messages(self, messages: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
76
143
|
from .vision_helpers import _prepare_openai_vision_messages
|
|
77
144
|
|
|
@@ -148,7 +215,8 @@ class MoonshotDriver(CostMixin, Driver):
|
|
|
148
215
|
response.raise_for_status()
|
|
149
216
|
resp = response.json()
|
|
150
217
|
except requests.exceptions.HTTPError as e:
|
|
151
|
-
|
|
218
|
+
error_body = self._format_error_body(data, e)
|
|
219
|
+
error_msg = f"Moonshot API request failed: {e!s}{error_body}"
|
|
152
220
|
raise RuntimeError(error_msg) from e
|
|
153
221
|
except requests.exceptions.RequestException as e:
|
|
154
222
|
raise RuntimeError(f"Moonshot API request failed: {e!s}") from e
|
|
@@ -158,6 +226,58 @@ class MoonshotDriver(CostMixin, Driver):
|
|
|
158
226
|
completion_tokens = usage.get("completion_tokens", 0)
|
|
159
227
|
total_tokens = usage.get("total_tokens", 0)
|
|
160
228
|
|
|
229
|
+
message = resp["choices"][0]["message"]
|
|
230
|
+
text = message.get("content") or ""
|
|
231
|
+
|
|
232
|
+
# Reasoning models may return content in reasoning_content when content is empty
|
|
233
|
+
if not text and message.get("reasoning_content"):
|
|
234
|
+
text = message["reasoning_content"]
|
|
235
|
+
|
|
236
|
+
# Structured output fallback: if we used json_schema mode and got an
|
|
237
|
+
# empty response, retry with json_object mode and schema in the prompt.
|
|
238
|
+
used_strict = data.get("response_format", {}).get("type") == "json_schema"
|
|
239
|
+
if used_strict and not text.strip() and completion_tokens == 0:
|
|
240
|
+
logger.info(
|
|
241
|
+
"Moonshot returned empty response with json_schema mode for %s; retrying with json_object fallback",
|
|
242
|
+
model,
|
|
243
|
+
)
|
|
244
|
+
fallback_data = {k: v for k, v in data.items() if k != "response_format"}
|
|
245
|
+
fallback_data["response_format"] = {"type": "json_object"}
|
|
246
|
+
|
|
247
|
+
# Inject schema instructions into messages
|
|
248
|
+
json_schema = options.get("json_schema")
|
|
249
|
+
schema_instruction = (
|
|
250
|
+
"Return a JSON object that validates against this schema:\n"
|
|
251
|
+
f"{json.dumps(json_schema, indent=2)}\n"
|
|
252
|
+
"If a value is unknown use null."
|
|
253
|
+
)
|
|
254
|
+
fallback_messages = list(fallback_data["messages"])
|
|
255
|
+
fallback_messages.append({"role": "system", "content": schema_instruction})
|
|
256
|
+
fallback_data["messages"] = fallback_messages
|
|
257
|
+
|
|
258
|
+
try:
|
|
259
|
+
fb_response = requests.post(
|
|
260
|
+
f"{self.base_url}/chat/completions",
|
|
261
|
+
headers=self.headers,
|
|
262
|
+
json=fallback_data,
|
|
263
|
+
timeout=120,
|
|
264
|
+
)
|
|
265
|
+
fb_response.raise_for_status()
|
|
266
|
+
fb_resp = fb_response.json()
|
|
267
|
+
except requests.exceptions.RequestException:
|
|
268
|
+
# Fallback failed — return original empty result
|
|
269
|
+
pass
|
|
270
|
+
else:
|
|
271
|
+
fb_usage = fb_resp.get("usage", {})
|
|
272
|
+
prompt_tokens += fb_usage.get("prompt_tokens", 0)
|
|
273
|
+
completion_tokens = fb_usage.get("completion_tokens", 0)
|
|
274
|
+
total_tokens = prompt_tokens + completion_tokens
|
|
275
|
+
resp = fb_resp
|
|
276
|
+
fb_message = fb_resp["choices"][0]["message"]
|
|
277
|
+
text = fb_message.get("content") or ""
|
|
278
|
+
if not text and fb_message.get("reasoning_content"):
|
|
279
|
+
text = fb_message["reasoning_content"]
|
|
280
|
+
|
|
161
281
|
total_cost = self._calculate_cost("moonshot", model, prompt_tokens, completion_tokens)
|
|
162
282
|
|
|
163
283
|
meta = {
|
|
@@ -169,13 +289,6 @@ class MoonshotDriver(CostMixin, Driver):
|
|
|
169
289
|
"model_name": model,
|
|
170
290
|
}
|
|
171
291
|
|
|
172
|
-
message = resp["choices"][0]["message"]
|
|
173
|
-
text = message.get("content") or ""
|
|
174
|
-
|
|
175
|
-
# Reasoning models may return content in reasoning_content when content is empty
|
|
176
|
-
if not text and message.get("reasoning_content"):
|
|
177
|
-
text = message["reasoning_content"]
|
|
178
|
-
|
|
179
292
|
return {"text": text, "meta": meta}
|
|
180
293
|
|
|
181
294
|
# ------------------------------------------------------------------
|
|
@@ -202,10 +315,12 @@ class MoonshotDriver(CostMixin, Driver):
|
|
|
202
315
|
opts = {"temperature": 1.0, "max_tokens": 512, **options}
|
|
203
316
|
opts = self._clamp_temperature(opts)
|
|
204
317
|
|
|
318
|
+
sanitized_tools = self._sanitize_tools(tools)
|
|
319
|
+
|
|
205
320
|
data: dict[str, Any] = {
|
|
206
321
|
"model": model,
|
|
207
322
|
"messages": messages,
|
|
208
|
-
"tools":
|
|
323
|
+
"tools": sanitized_tools,
|
|
209
324
|
}
|
|
210
325
|
data[tokens_param] = opts.get("max_tokens", 512)
|
|
211
326
|
|
|
@@ -227,7 +342,8 @@ class MoonshotDriver(CostMixin, Driver):
|
|
|
227
342
|
response.raise_for_status()
|
|
228
343
|
resp = response.json()
|
|
229
344
|
except requests.exceptions.HTTPError as e:
|
|
230
|
-
|
|
345
|
+
error_body = self._format_error_body(data, e)
|
|
346
|
+
error_msg = f"Moonshot API request failed: {e!s}{error_body}"
|
|
231
347
|
raise RuntimeError(error_msg) from e
|
|
232
348
|
except requests.exceptions.RequestException as e:
|
|
233
349
|
raise RuntimeError(f"Moonshot API request failed: {e!s}") from e
|
prompture/group_types.py
CHANGED
prompture/groups.py
CHANGED
|
@@ -232,6 +232,8 @@ class SequentialGroup:
|
|
|
232
232
|
if self._callbacks.on_agent_error:
|
|
233
233
|
self._callbacks.on_agent_error(name, exc)
|
|
234
234
|
|
|
235
|
+
if self._error_policy == ErrorPolicy.raise_on_error:
|
|
236
|
+
raise
|
|
235
237
|
if self._error_policy == ErrorPolicy.fail_fast:
|
|
236
238
|
break
|
|
237
239
|
# continue_on_error / retry_failed: continue to next agent
|
|
@@ -390,6 +392,8 @@ class LoopGroup:
|
|
|
390
392
|
if self._callbacks.on_agent_error:
|
|
391
393
|
self._callbacks.on_agent_error(name, exc)
|
|
392
394
|
|
|
395
|
+
if self._error_policy == ErrorPolicy.raise_on_error:
|
|
396
|
+
raise
|
|
393
397
|
if self._error_policy == ErrorPolicy.fail_fast:
|
|
394
398
|
break
|
|
395
399
|
|
prompture/tools_schema.py
CHANGED
|
@@ -110,7 +110,9 @@ class ToolDefinition:
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
|
|
113
|
-
def tool_from_function(
|
|
113
|
+
def tool_from_function(
|
|
114
|
+
fn: Callable[..., Any], *, name: str | None = None, description: str | None = None
|
|
115
|
+
) -> ToolDefinition:
|
|
114
116
|
"""Build a :class:`ToolDefinition` by inspecting *fn*'s signature and docstring.
|
|
115
117
|
|
|
116
118
|
Parameters:
|
|
@@ -150,6 +152,10 @@ def tool_from_function(fn: Callable[..., Any], *, name: str | None = None, descr
|
|
|
150
152
|
}
|
|
151
153
|
if required:
|
|
152
154
|
parameters["required"] = required
|
|
155
|
+
if not properties:
|
|
156
|
+
# Some providers reject empty properties with required=[].
|
|
157
|
+
# Omit required entirely when there are no parameters.
|
|
158
|
+
parameters.pop("required", None)
|
|
153
159
|
|
|
154
160
|
return ToolDefinition(
|
|
155
161
|
name=tool_name,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
prompture/__init__.py,sha256=cJnkefDpiyFbU77juw4tXPdKJQWoJ-c6XBFt2v-e5Q4,7455
|
|
2
|
-
prompture/_version.py,sha256=
|
|
2
|
+
prompture/_version.py,sha256=Zfksky0dIFN2RZprnAMflcd2YbMf3D0JpTlHasmdh24,706
|
|
3
3
|
prompture/agent.py,sha256=-8qdo_Lz20GGssCe5B_QPxb5Kct71YtKHh5vZgrSYik,34748
|
|
4
4
|
prompture/agent_types.py,sha256=Icl16PQI-ThGLMFCU43adtQA6cqETbsPn4KssKBI4xc,4664
|
|
5
5
|
prompture/async_agent.py,sha256=_6_IRb-LGzZxGxfPVy43SIWByUoQfN-5XnUWahVP6r8,33110
|
|
6
6
|
prompture/async_conversation.py,sha256=m9sdKBu1wxo5veGwO6g6Zvf1sBzpuxP-mSIEeNKlBjQ,31155
|
|
7
7
|
prompture/async_core.py,sha256=hbRXLvsBJv3JAnUwGZbazsL6x022FrsJU6swmZolgxY,29745
|
|
8
8
|
prompture/async_driver.py,sha256=4VQ9Q_tI6Ufw6W1CYJ5j8hVtgVdqFGuk6e2tLaSceWE,8581
|
|
9
|
-
prompture/async_groups.py,sha256=
|
|
9
|
+
prompture/async_groups.py,sha256=pceKrt0UayQjMLFs1dFGoxOHpgD948aEjIY61r608C4,22459
|
|
10
10
|
prompture/cache.py,sha256=4dfQDMsEZ9JMQDXLOkiugPmmMJQIfKVE8rTAKDH4oL8,14401
|
|
11
11
|
prompture/callbacks.py,sha256=JPDqWGzPIzv44l54ocmezlYVBnbKPDEEXRrLdluWGAo,1731
|
|
12
12
|
prompture/cli.py,sha256=tNiIddRmgC1BomjY5O1VVVAwvqHVzF8IHmQrM-cG2wQ,2902
|
|
@@ -16,8 +16,8 @@ prompture/cost_mixin.py,sha256=Qx7gPgPsWgTHiaFeI7q_p9cfe95ccjgN8Mi56d_AVX0,4563
|
|
|
16
16
|
prompture/discovery.py,sha256=K-svbO-qJraHinCbFVS64vEo5McWX5pURv26ZMmuL6U,10295
|
|
17
17
|
prompture/driver.py,sha256=wE7K3vnqeCVT5pEEBP-3uZ6e-YyU6TXtnEKRSB25eOc,10410
|
|
18
18
|
prompture/field_definitions.py,sha256=PLvxq2ot-ngJ8JbWkkZ-XLtM1wvjUQ3TL01vSEo-a6E,21368
|
|
19
|
-
prompture/group_types.py,sha256=
|
|
20
|
-
prompture/groups.py,sha256=
|
|
19
|
+
prompture/group_types.py,sha256=lr8f5kA5IY5cJ_K06OGBaziEf9fPMIRYgtVT12q3aiQ,4769
|
|
20
|
+
prompture/groups.py,sha256=oMxtyO6MugTBB9VsUzXg95jE5tp4VqfQesSrjqwPqpg,20125
|
|
21
21
|
prompture/image.py,sha256=3uBxC6blXRNyY5KAJ5MkG6ow8KGAslX8WxM8Is8S8cw,5620
|
|
22
22
|
prompture/ledger.py,sha256=2iXkd9PWiM9WpRCxvnHG1-nwh_IM4mCbxjF4LE92Gzs,8576
|
|
23
23
|
prompture/logging.py,sha256=SkFO26_56Zai05vW8kTq3jvJudfLG2ipI5qNHaXKH3g,2574
|
|
@@ -30,7 +30,7 @@ prompture/server.py,sha256=W6Kn6Et8nG5twXjD2wKn_N9yplGjz5Z-2naeI_UPd1Y,6198
|
|
|
30
30
|
prompture/session.py,sha256=FldK3cKq_jO0-beukVOhIiwsYWb6U_lLBlAERx95aaM,3821
|
|
31
31
|
prompture/settings.py,sha256=2cTuko8PLhq0SbBMtqmjBgzl9jv6SgoXeaUEhmm4G4Y,2562
|
|
32
32
|
prompture/tools.py,sha256=PmFbGHTWYWahpJOG6BLlM0Y-EG6S37IFW57C-8GdsXo,36449
|
|
33
|
-
prompture/tools_schema.py,sha256=
|
|
33
|
+
prompture/tools_schema.py,sha256=c1ag6kyIGgZxWbZRsaHl72cAelb34J_JomyW1h5Atw0,7964
|
|
34
34
|
prompture/validator.py,sha256=FY_VjIVEbjG2nwzh-r6l23Kt3UzaLyCis8_pZMNGHBA,993
|
|
35
35
|
prompture/aio/__init__.py,sha256=bKqTu4Jxld16aP_7SP9wU5au45UBIb041ORo4E4HzVo,1810
|
|
36
36
|
prompture/drivers/__init__.py,sha256=r8wBYGKD7C7v4CqcyRNoaITzGVyxasoiAU6jBYsPZio,8178
|
|
@@ -45,7 +45,7 @@ prompture/drivers/async_hugging_driver.py,sha256=IblxqU6TpNUiigZ0BCgNkAgzpUr2FtP
|
|
|
45
45
|
prompture/drivers/async_lmstudio_driver.py,sha256=rPn2qVPm6UE2APzAn7ZHYTELUwr0dQMi8XHv6gAhyH8,5782
|
|
46
46
|
prompture/drivers/async_local_http_driver.py,sha256=qoigIf-w3_c2dbVdM6m1e2RMAWP4Gk4VzVs5hM3lPvQ,1609
|
|
47
47
|
prompture/drivers/async_modelscope_driver.py,sha256=wzHYGLf9qE9KXRFZYtN1hZS10Bw1m1Wy6HcmyUD67HM,10170
|
|
48
|
-
prompture/drivers/async_moonshot_driver.py,sha256=
|
|
48
|
+
prompture/drivers/async_moonshot_driver.py,sha256=Jl6rGlW3SsneFfmBiDo0RBZQN5c3-08kwax369me01E,14798
|
|
49
49
|
prompture/drivers/async_ollama_driver.py,sha256=FaSXtFXrgeVHIe0b90Vg6rGeSTWLpPnjaThh9Ai7qQo,5042
|
|
50
50
|
prompture/drivers/async_openai_driver.py,sha256=COa_JE-AgKowKJpmRnfDJp4RSQKZel_7WswxOzvLksM,9044
|
|
51
51
|
prompture/drivers/async_openrouter_driver.py,sha256=GnOMY67CCV3HV83lCC-CxcngwrUnuc7G-AX7fb1DYpg,10698
|
|
@@ -60,7 +60,7 @@ prompture/drivers/hugging_driver.py,sha256=gZir3XnM77VfYIdnu3S1pRftlZJM6G3L8bgGn
|
|
|
60
60
|
prompture/drivers/lmstudio_driver.py,sha256=9ZnJ1l5LuWAjkH2WKfFjZprNMVIXoSC7qXDNDTxm-tA,6748
|
|
61
61
|
prompture/drivers/local_http_driver.py,sha256=QJgEf9kAmy8YZ5fb8FHnWuhoDoZYNd8at4jegzNVJH0,1658
|
|
62
62
|
prompture/drivers/modelscope_driver.py,sha256=yTxTG7j5f7zz4CjbrV8J0VKeoBmxv69F40bfp8nq6AE,10651
|
|
63
|
-
prompture/drivers/moonshot_driver.py,sha256=
|
|
63
|
+
prompture/drivers/moonshot_driver.py,sha256=MtlvtUUwE4WtzCKo_pJJ5wATB-h2GU4zY9jbGo3a_-g,18264
|
|
64
64
|
prompture/drivers/ollama_driver.py,sha256=k9xeUwFp91OrDbjkbYI-F8CDFy5ew-zQ0btXqwbXXWM,10220
|
|
65
65
|
prompture/drivers/openai_driver.py,sha256=DqdMhxF8M2HdOY5vfsFrz0h23lqBoQlbxV3xUdHvZho,10548
|
|
66
66
|
prompture/drivers/openrouter_driver.py,sha256=DaG1H99s8GaOgJXZK4TP28HM7U4wiLu9wHXzWZleW_U,12589
|
|
@@ -76,9 +76,9 @@ prompture/scaffold/templates/env.example.j2,sha256=eESKr1KWgyrczO6d-nwAhQwSpf_G-
|
|
|
76
76
|
prompture/scaffold/templates/main.py.j2,sha256=TEgc5OvsZOEX0JthkSW1NI_yLwgoeVN_x97Ibg-vyWY,2632
|
|
77
77
|
prompture/scaffold/templates/models.py.j2,sha256=JrZ99GCVK6TKWapskVRSwCssGrTu5cGZ_r46fOhY2GE,858
|
|
78
78
|
prompture/scaffold/templates/requirements.txt.j2,sha256=m3S5fi1hq9KG9l_9j317rjwWww0a43WMKd8VnUWv2A4,102
|
|
79
|
-
prompture-0.0.
|
|
80
|
-
prompture-0.0.
|
|
81
|
-
prompture-0.0.
|
|
82
|
-
prompture-0.0.
|
|
83
|
-
prompture-0.0.
|
|
84
|
-
prompture-0.0.
|
|
79
|
+
prompture-0.0.46.dist-info/licenses/LICENSE,sha256=0HgDepH7aaHNFhHF-iXuW6_GqDfYPnVkjtiCAZ4yS8I,1060
|
|
80
|
+
prompture-0.0.46.dist-info/METADATA,sha256=CpjLp4ff432DdZCNmJciCbk_-pv7CXRHx2LYLP1jybA,10837
|
|
81
|
+
prompture-0.0.46.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
82
|
+
prompture-0.0.46.dist-info/entry_points.txt,sha256=AFPG3lJR86g4IJMoWQUW5Ph7G6MLNWG3A2u2Tp9zkp8,48
|
|
83
|
+
prompture-0.0.46.dist-info/top_level.txt,sha256=to86zq_kjfdoLeAxQNr420UWqT0WzkKoZ509J7Qr2t4,10
|
|
84
|
+
prompture-0.0.46.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|