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 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.45.dev1'
32
- __version_tuple__ = version_tuple = (0, 0, 45, 'dev1')
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
- error_msg = f"Moonshot API request failed: {e!s}"
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": 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
- error_msg = f"Moonshot API request failed: {e!s}"
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
- error_msg = f"Moonshot API request failed: {e!s}"
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": 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
- error_msg = f"Moonshot API request failed: {e!s}"
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
@@ -21,6 +21,7 @@ class ErrorPolicy(enum.Enum):
21
21
  fail_fast = "fail_fast"
22
22
  continue_on_error = "continue_on_error"
23
23
  retry_failed = "retry_failed"
24
+ raise_on_error = "raise_on_error"
24
25
 
25
26
 
26
27
  @dataclass
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(fn: Callable[..., Any], *, name: str | None = None, description: str | None = None) -> ToolDefinition:
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 0.0.45.dev1
3
+ Version: 0.0.46
4
4
  Summary: Ask LLMs to return structured JSON and run cross-model tests. API-first.
5
5
  Author-email: Juan Denis <juan@vene.co>
6
6
  License-Expression: MIT
@@ -1,12 +1,12 @@
1
1
  prompture/__init__.py,sha256=cJnkefDpiyFbU77juw4tXPdKJQWoJ-c6XBFt2v-e5Q4,7455
2
- prompture/_version.py,sha256=xLMojfHdPHjG5tIRFSg5z948HOl2qNx_wcxRXwPo190,719
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=G7d9mM2A-glD6Qd7GjA1YOzxrMty3eX8EaWzFsaS39s,22261
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=BxeFV1tI4PTH3xPOie7q3-35ivkTdB9lJUPLH0kPH7A,4731
20
- prompture/groups.py,sha256=9lMJBNOmlzRm2qmmwQLXAySsR4NF_oIUCBA6gbxr9cU,19927
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=JVc0dxC4aIHIUlgE8yFCcn1gPzJ3unTMVmZ8Ec04aD0,7764
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=qfIpq-FaZKPjcBiuzlJAsfF7lAPj6UHrbUu4MUeuTNU,12190
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=ZKZollzZecOrdesFieUOaHdJ1UmZKaZdQX-iwZDZuxQ,13128
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.45.dev1.dist-info/licenses/LICENSE,sha256=0HgDepH7aaHNFhHF-iXuW6_GqDfYPnVkjtiCAZ4yS8I,1060
80
- prompture-0.0.45.dev1.dist-info/METADATA,sha256=5b0L_nNk1kpwRuNeGc7pnPwiU6Ge1CaZ7Q9fmY84sDo,10842
81
- prompture-0.0.45.dev1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
82
- prompture-0.0.45.dev1.dist-info/entry_points.txt,sha256=AFPG3lJR86g4IJMoWQUW5Ph7G6MLNWG3A2u2Tp9zkp8,48
83
- prompture-0.0.45.dev1.dist-info/top_level.txt,sha256=to86zq_kjfdoLeAxQNr420UWqT0WzkKoZ509J7Qr2t4,10
84
- prompture-0.0.45.dev1.dist-info/RECORD,,
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,,