prompture 0.0.41.dev1__py3-none-any.whl → 0.0.42.dev1__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.41.dev1'
32
- __version_tuple__ = version_tuple = (0, 0, 41, 'dev1')
31
+ __version__ = version = '0.0.42.dev1'
32
+ __version_tuple__ = version_tuple = (0, 0, 42, 'dev1')
33
33
 
34
34
  __commit_id__ = commit_id = None
prompture/agent.py CHANGED
@@ -188,7 +188,7 @@ class Agent(Generic[DepsType]):
188
188
  for fn in tools:
189
189
  self._tools.register(fn)
190
190
 
191
- self._state = AgentState.idle
191
+ self._lifecycle = AgentState.idle
192
192
  self._stop_requested = False
193
193
 
194
194
  # ------------------------------------------------------------------
@@ -206,7 +206,7 @@ class Agent(Generic[DepsType]):
206
206
  @property
207
207
  def state(self) -> AgentState:
208
208
  """Current lifecycle state of the agent."""
209
- return self._state
209
+ return self._lifecycle
210
210
 
211
211
  def stop(self) -> None:
212
212
  """Request graceful shutdown after the current iteration."""
@@ -265,16 +265,16 @@ class Agent(Generic[DepsType]):
265
265
  prompt: The user prompt to send.
266
266
  deps: Optional dependencies injected into :class:`RunContext`.
267
267
  """
268
- self._state = AgentState.running
268
+ self._lifecycle = AgentState.running
269
269
  self._stop_requested = False
270
270
  steps: list[AgentStep] = []
271
271
 
272
272
  try:
273
273
  result = self._execute(prompt, steps, deps)
274
- self._state = AgentState.idle
274
+ self._lifecycle = AgentState.idle
275
275
  return result
276
276
  except Exception:
277
- self._state = AgentState.errored
277
+ self._lifecycle = AgentState.errored
278
278
  raise
279
279
 
280
280
  # ------------------------------------------------------------------
@@ -722,7 +722,7 @@ class Agent(Generic[DepsType]):
722
722
 
723
723
  def _execute_iter(self, prompt: str, deps: Any) -> Generator[AgentStep, None, AgentResult]:
724
724
  """Generator that executes the agent loop and yields each step."""
725
- self._state = AgentState.running
725
+ self._lifecycle = AgentState.running
726
726
  self._stop_requested = False
727
727
  steps: list[AgentStep] = []
728
728
 
@@ -730,10 +730,10 @@ class Agent(Generic[DepsType]):
730
730
  result = self._execute(prompt, steps, deps)
731
731
  # Yield each step one at a time
732
732
  yield from result.steps
733
- self._state = AgentState.idle
733
+ self._lifecycle = AgentState.idle
734
734
  return result
735
735
  except Exception:
736
- self._state = AgentState.errored
736
+ self._lifecycle = AgentState.errored
737
737
  raise
738
738
 
739
739
  # ------------------------------------------------------------------
@@ -757,7 +757,7 @@ class Agent(Generic[DepsType]):
757
757
 
758
758
  def _execute_stream(self, prompt: str, deps: Any) -> Generator[StreamEvent, None, AgentResult]:
759
759
  """Generator that executes the agent loop and yields stream events."""
760
- self._state = AgentState.running
760
+ self._lifecycle = AgentState.running
761
761
  self._stop_requested = False
762
762
  steps: list[AgentStep] = []
763
763
 
@@ -853,10 +853,10 @@ class Agent(Generic[DepsType]):
853
853
  data=result,
854
854
  )
855
855
 
856
- self._state = AgentState.idle
856
+ self._lifecycle = AgentState.idle
857
857
  return result
858
858
  except Exception:
859
- self._state = AgentState.errored
859
+ self._lifecycle = AgentState.errored
860
860
  raise
861
861
 
862
862
 
prompture/async_agent.py CHANGED
@@ -182,7 +182,7 @@ class AsyncAgent(Generic[DepsType]):
182
182
  for fn in tools:
183
183
  self._tools.register(fn)
184
184
 
185
- self._state = AgentState.idle
185
+ self._lifecycle = AgentState.idle
186
186
  self._stop_requested = False
187
187
 
188
188
  # ------------------------------------------------------------------
@@ -197,7 +197,7 @@ class AsyncAgent(Generic[DepsType]):
197
197
  @property
198
198
  def state(self) -> AgentState:
199
199
  """Current lifecycle state of the agent."""
200
- return self._state
200
+ return self._lifecycle
201
201
 
202
202
  def stop(self) -> None:
203
203
  """Request graceful shutdown after the current iteration."""
@@ -264,16 +264,16 @@ class AsyncAgent(Generic[DepsType]):
264
264
  Creates a fresh conversation, sends the prompt, handles tool calls,
265
265
  and optionally parses the final response into ``output_type``.
266
266
  """
267
- self._state = AgentState.running
267
+ self._lifecycle = AgentState.running
268
268
  self._stop_requested = False
269
269
  steps: list[AgentStep] = []
270
270
 
271
271
  try:
272
272
  result = await self._execute(prompt, steps, deps)
273
- self._state = AgentState.idle
273
+ self._lifecycle = AgentState.idle
274
274
  return result
275
275
  except Exception:
276
- self._state = AgentState.errored
276
+ self._lifecycle = AgentState.errored
277
277
  raise
278
278
 
279
279
  async def iter(self, prompt: str, *, deps: Any = None) -> AsyncAgentIterator:
@@ -714,7 +714,7 @@ class AsyncAgent(Generic[DepsType]):
714
714
 
715
715
  async def _execute_iter(self, prompt: str, deps: Any) -> AsyncGenerator[AgentStep, None]:
716
716
  """Async generator that executes the agent loop and yields each step."""
717
- self._state = AgentState.running
717
+ self._lifecycle = AgentState.running
718
718
  self._stop_requested = False
719
719
  steps: list[AgentStep] = []
720
720
 
@@ -722,11 +722,11 @@ class AsyncAgent(Generic[DepsType]):
722
722
  result = await self._execute(prompt, steps, deps)
723
723
  for step in result.steps:
724
724
  yield step
725
- self._state = AgentState.idle
725
+ self._lifecycle = AgentState.idle
726
726
  # Store result on the generator for retrieval
727
727
  self._last_iter_result = result
728
728
  except Exception:
729
- self._state = AgentState.errored
729
+ self._lifecycle = AgentState.errored
730
730
  raise
731
731
 
732
732
  # ------------------------------------------------------------------
@@ -735,7 +735,7 @@ class AsyncAgent(Generic[DepsType]):
735
735
 
736
736
  async def _execute_stream(self, prompt: str, deps: Any) -> AsyncGenerator[StreamEvent, None]:
737
737
  """Async generator that executes the agent loop and yields stream events."""
738
- self._state = AgentState.running
738
+ self._lifecycle = AgentState.running
739
739
  self._stop_requested = False
740
740
  steps: list[AgentStep] = []
741
741
 
@@ -803,10 +803,10 @@ class AsyncAgent(Generic[DepsType]):
803
803
 
804
804
  yield StreamEvent(event_type=StreamEventType.output, data=result)
805
805
 
806
- self._state = AgentState.idle
806
+ self._lifecycle = AgentState.idle
807
807
  self._last_stream_result = result
808
808
  except Exception:
809
- self._state = AgentState.errored
809
+ self._lifecycle = AgentState.errored
810
810
  raise
811
811
 
812
812
 
prompture/cost_mixin.py CHANGED
@@ -2,9 +2,34 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import copy
5
6
  from typing import Any
6
7
 
7
8
 
9
+ def prepare_strict_schema(schema: dict[str, Any]) -> dict[str, Any]:
10
+ """Prepare a JSON schema for OpenAI strict structured-output mode.
11
+
12
+ OpenAI's ``strict: true`` requires every object to have
13
+ ``"additionalProperties": false`` and a ``"required"`` array listing
14
+ all property keys. This function recursively patches a schema copy
15
+ so callers don't need to worry about these constraints.
16
+ """
17
+ schema = copy.deepcopy(schema)
18
+ _patch_strict(schema)
19
+ return schema
20
+
21
+
22
+ def _patch_strict(node: dict[str, Any]) -> None:
23
+ """Recursively add strict-mode constraints to an object schema node."""
24
+ if node.get("type") == "object" and "properties" in node:
25
+ node.setdefault("additionalProperties", False)
26
+ node.setdefault("required", list(node["properties"].keys()))
27
+ for prop in node["properties"].values():
28
+ _patch_strict(prop)
29
+ elif node.get("type") == "array" and isinstance(node.get("items"), dict):
30
+ _patch_strict(node["items"])
31
+
32
+
8
33
  class CostMixin:
9
34
  """Mixin that provides ``_calculate_cost`` to sync and async drivers.
10
35
 
@@ -11,7 +11,7 @@ except Exception:
11
11
  AsyncAzureOpenAI = None
12
12
 
13
13
  from ..async_driver import AsyncDriver
14
- from ..cost_mixin import CostMixin
14
+ from ..cost_mixin import CostMixin, prepare_strict_schema
15
15
  from .azure_driver import AzureDriver
16
16
 
17
17
 
@@ -89,12 +89,13 @@ class AsyncAzureDriver(CostMixin, AsyncDriver):
89
89
  if options.get("json_mode"):
90
90
  json_schema = options.get("json_schema")
91
91
  if json_schema:
92
+ schema_copy = prepare_strict_schema(json_schema)
92
93
  kwargs["response_format"] = {
93
94
  "type": "json_schema",
94
95
  "json_schema": {
95
96
  "name": "extraction",
96
97
  "strict": True,
97
- "schema": json_schema,
98
+ "schema": schema_copy,
98
99
  },
99
100
  }
100
101
  else:
@@ -17,7 +17,7 @@ from typing import Any
17
17
  import httpx
18
18
 
19
19
  from ..async_driver import AsyncDriver
20
- from ..cost_mixin import CostMixin
20
+ from ..cost_mixin import CostMixin, prepare_strict_schema
21
21
  from .moonshot_driver import MoonshotDriver
22
22
 
23
23
 
@@ -88,12 +88,13 @@ class AsyncMoonshotDriver(CostMixin, AsyncDriver):
88
88
  if options.get("json_mode"):
89
89
  json_schema = options.get("json_schema")
90
90
  if json_schema:
91
+ schema_copy = prepare_strict_schema(json_schema)
91
92
  data["response_format"] = {
92
93
  "type": "json_schema",
93
94
  "json_schema": {
94
95
  "name": "extraction",
95
96
  "strict": True,
96
- "schema": json_schema,
97
+ "schema": schema_copy,
97
98
  },
98
99
  }
99
100
  else:
@@ -13,7 +13,7 @@ except Exception:
13
13
  AsyncOpenAI = None
14
14
 
15
15
  from ..async_driver import AsyncDriver
16
- from ..cost_mixin import CostMixin
16
+ from ..cost_mixin import CostMixin, prepare_strict_schema
17
17
  from .openai_driver import OpenAIDriver
18
18
 
19
19
 
@@ -80,12 +80,13 @@ class AsyncOpenAIDriver(CostMixin, AsyncDriver):
80
80
  if options.get("json_mode"):
81
81
  json_schema = options.get("json_schema")
82
82
  if json_schema:
83
+ schema_copy = prepare_strict_schema(json_schema)
83
84
  kwargs["response_format"] = {
84
85
  "type": "json_schema",
85
86
  "json_schema": {
86
87
  "name": "extraction",
87
88
  "strict": True,
88
- "schema": json_schema,
89
+ "schema": schema_copy,
89
90
  },
90
91
  }
91
92
  else:
@@ -10,7 +10,7 @@ from typing import Any
10
10
  import httpx
11
11
 
12
12
  from ..async_driver import AsyncDriver
13
- from ..cost_mixin import CostMixin
13
+ from ..cost_mixin import CostMixin, prepare_strict_schema
14
14
  from .openrouter_driver import OpenRouterDriver
15
15
 
16
16
 
@@ -78,12 +78,13 @@ class AsyncOpenRouterDriver(CostMixin, AsyncDriver):
78
78
  if options.get("json_mode"):
79
79
  json_schema = options.get("json_schema")
80
80
  if json_schema:
81
+ schema_copy = prepare_strict_schema(json_schema)
81
82
  data["response_format"] = {
82
83
  "type": "json_schema",
83
84
  "json_schema": {
84
85
  "name": "extraction",
85
86
  "strict": True,
86
- "schema": json_schema,
87
+ "schema": schema_copy,
87
88
  },
88
89
  }
89
90
  else:
@@ -13,7 +13,7 @@ from typing import Any
13
13
  import httpx
14
14
 
15
15
  from ..async_driver import AsyncDriver
16
- from ..cost_mixin import CostMixin
16
+ from ..cost_mixin import CostMixin, prepare_strict_schema
17
17
  from .zai_driver import ZaiDriver
18
18
 
19
19
 
@@ -83,12 +83,13 @@ class AsyncZaiDriver(CostMixin, AsyncDriver):
83
83
  if options.get("json_mode"):
84
84
  json_schema = options.get("json_schema")
85
85
  if json_schema:
86
+ schema_copy = prepare_strict_schema(json_schema)
86
87
  data["response_format"] = {
87
88
  "type": "json_schema",
88
89
  "json_schema": {
89
90
  "name": "extraction",
90
91
  "strict": True,
91
- "schema": json_schema,
92
+ "schema": schema_copy,
92
93
  },
93
94
  }
94
95
  else:
@@ -10,7 +10,7 @@ try:
10
10
  except Exception:
11
11
  AzureOpenAI = None
12
12
 
13
- from ..cost_mixin import CostMixin
13
+ from ..cost_mixin import CostMixin, prepare_strict_schema
14
14
  from ..driver import Driver
15
15
 
16
16
 
@@ -128,12 +128,13 @@ class AzureDriver(CostMixin, Driver):
128
128
  if options.get("json_mode"):
129
129
  json_schema = options.get("json_schema")
130
130
  if json_schema:
131
+ schema_copy = prepare_strict_schema(json_schema)
131
132
  kwargs["response_format"] = {
132
133
  "type": "json_schema",
133
134
  "json_schema": {
134
135
  "name": "extraction",
135
136
  "strict": True,
136
- "schema": json_schema,
137
+ "schema": schema_copy,
137
138
  },
138
139
  }
139
140
  else:
@@ -16,7 +16,7 @@ from typing import Any
16
16
 
17
17
  import requests
18
18
 
19
- from ..cost_mixin import CostMixin
19
+ from ..cost_mixin import CostMixin, prepare_strict_schema
20
20
  from ..driver import Driver
21
21
 
22
22
 
@@ -116,12 +116,13 @@ class MoonshotDriver(CostMixin, Driver):
116
116
  if options.get("json_mode"):
117
117
  json_schema = options.get("json_schema")
118
118
  if json_schema:
119
+ schema_copy = prepare_strict_schema(json_schema)
119
120
  data["response_format"] = {
120
121
  "type": "json_schema",
121
122
  "json_schema": {
122
123
  "name": "extraction",
123
124
  "strict": True,
124
- "schema": json_schema,
125
+ "schema": schema_copy,
125
126
  },
126
127
  }
127
128
  else:
@@ -12,7 +12,7 @@ try:
12
12
  except Exception:
13
13
  OpenAI = None
14
14
 
15
- from ..cost_mixin import CostMixin
15
+ from ..cost_mixin import CostMixin, prepare_strict_schema
16
16
  from ..driver import Driver
17
17
 
18
18
 
@@ -125,12 +125,13 @@ class OpenAIDriver(CostMixin, Driver):
125
125
  if options.get("json_mode"):
126
126
  json_schema = options.get("json_schema")
127
127
  if json_schema:
128
+ schema_copy = prepare_strict_schema(json_schema)
128
129
  kwargs["response_format"] = {
129
130
  "type": "json_schema",
130
131
  "json_schema": {
131
132
  "name": "extraction",
132
133
  "strict": True,
133
- "schema": json_schema,
134
+ "schema": schema_copy,
134
135
  },
135
136
  }
136
137
  else:
@@ -2,6 +2,7 @@
2
2
  Requires the `requests` package. Uses OPENROUTER_API_KEY env var.
3
3
  """
4
4
 
5
+ import contextlib
5
6
  import json
6
7
  import os
7
8
  from collections.abc import Iterator
@@ -9,7 +10,7 @@ from typing import Any
9
10
 
10
11
  import requests
11
12
 
12
- from ..cost_mixin import CostMixin
13
+ from ..cost_mixin import CostMixin, prepare_strict_schema
13
14
  from ..driver import Driver
14
15
 
15
16
 
@@ -128,12 +129,13 @@ class OpenRouterDriver(CostMixin, Driver):
128
129
  if options.get("json_mode"):
129
130
  json_schema = options.get("json_schema")
130
131
  if json_schema:
132
+ schema_copy = prepare_strict_schema(json_schema)
131
133
  data["response_format"] = {
132
134
  "type": "json_schema",
133
135
  "json_schema": {
134
136
  "name": "extraction",
135
137
  "strict": True,
136
- "schema": json_schema,
138
+ "schema": schema_copy,
137
139
  },
138
140
  }
139
141
  else:
@@ -149,7 +151,13 @@ class OpenRouterDriver(CostMixin, Driver):
149
151
  response.raise_for_status()
150
152
  resp = response.json()
151
153
  except requests.exceptions.HTTPError as e:
154
+ body = ""
155
+ if e.response is not None:
156
+ with contextlib.suppress(Exception):
157
+ body = e.response.text
152
158
  error_msg = f"OpenRouter API request failed: {e!s}"
159
+ if body:
160
+ error_msg += f"\nResponse: {body}"
153
161
  raise RuntimeError(error_msg) from e
154
162
  except requests.exceptions.RequestException as e:
155
163
  raise RuntimeError(f"OpenRouter API request failed: {e!s}") from e
@@ -12,7 +12,7 @@ from typing import Any
12
12
 
13
13
  import requests
14
14
 
15
- from ..cost_mixin import CostMixin
15
+ from ..cost_mixin import CostMixin, prepare_strict_schema
16
16
  from ..driver import Driver
17
17
 
18
18
 
@@ -96,12 +96,13 @@ class ZaiDriver(CostMixin, Driver):
96
96
  if options.get("json_mode"):
97
97
  json_schema = options.get("json_schema")
98
98
  if json_schema:
99
+ schema_copy = prepare_strict_schema(json_schema)
99
100
  data["response_format"] = {
100
101
  "type": "json_schema",
101
102
  "json_schema": {
102
103
  "name": "extraction",
103
104
  "strict": True,
104
- "schema": json_schema,
105
+ "schema": schema_copy,
105
106
  },
106
107
  }
107
108
  else:
prompture/settings.py CHANGED
@@ -45,7 +45,7 @@ class Settings(BaseSettings):
45
45
 
46
46
  # OpenRouter
47
47
  openrouter_api_key: Optional[str] = None
48
- openrouter_model: str = "openai/gpt-3.5-turbo"
48
+ openrouter_model: str = "openai/gpt-4o-mini"
49
49
 
50
50
  # Grok
51
51
  grok_api_key: Optional[str] = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 0.0.41.dev1
3
+ Version: 0.0.42.dev1
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,8 +1,8 @@
1
1
  prompture/__init__.py,sha256=cJnkefDpiyFbU77juw4tXPdKJQWoJ-c6XBFt2v-e5Q4,7455
2
- prompture/_version.py,sha256=yG4lZCl4Owse_k2wh8vNXsyiU8hUaxTENaipOhh22Ec,719
3
- prompture/agent.py,sha256=xe_yFHGDzTxaU4tmaLt5AQnzrN0I72hBGwGVrCxg2D0,34704
2
+ prompture/_version.py,sha256=SSM-qShNUjWEfdsxyswrsdNVeXKkZXRlSSnZCvyhXh8,719
3
+ prompture/agent.py,sha256=-8qdo_Lz20GGssCe5B_QPxb5Kct71YtKHh5vZgrSYik,34748
4
4
  prompture/agent_types.py,sha256=Icl16PQI-ThGLMFCU43adtQA6cqETbsPn4KssKBI4xc,4664
5
- prompture/async_agent.py,sha256=nOLOQCNkg0sKKTpryIiidmIcAAlA3FR2NfnZwrNBuCg,33066
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
@@ -12,7 +12,7 @@ prompture/callbacks.py,sha256=JPDqWGzPIzv44l54ocmezlYVBnbKPDEEXRrLdluWGAo,1731
12
12
  prompture/cli.py,sha256=tNiIddRmgC1BomjY5O1VVVAwvqHVzF8IHmQrM-cG2wQ,2902
13
13
  prompture/conversation.py,sha256=kBflwh7Qmw1I_jcUGyV36oskdVz4SYDSw_dCjemRRRc,32756
14
14
  prompture/core.py,sha256=5FHwX7fNPwFHMbFCMvV-RH7LpPpTToLAmcyDnKbrN0E,57202
15
- prompture/cost_mixin.py,sha256=BR-zd42Tj4K865iRIntXlJEfryUcrd5Tuwcfx89QknE,3547
15
+ prompture/cost_mixin.py,sha256=Qx7gPgPsWgTHiaFeI7q_p9cfe95ccjgN8Mi56d_AVX0,4563
16
16
  prompture/discovery.py,sha256=EWx2d-LJHmlDpm8dlpOicey6XZdDx70ZEetIlOOIlxw,9464
17
17
  prompture/driver.py,sha256=wE7K3vnqeCVT5pEEBP-3uZ6e-YyU6TXtnEKRSB25eOc,10410
18
18
  prompture/field_definitions.py,sha256=PLvxq2ot-ngJ8JbWkkZ-XLtM1wvjUQ3TL01vSEo-a6E,21368
@@ -28,7 +28,7 @@ prompture/runner.py,sha256=lHe2L2jqY1pDXoKNPJALN9lAm-Q8QOY8C8gw-vM9VrM,4213
28
28
  prompture/serialization.py,sha256=m4cdAQJspitMcfwRgecElkY2SBt3BjEwubbhS3W-0s0,7433
29
29
  prompture/server.py,sha256=W6Kn6Et8nG5twXjD2wKn_N9yplGjz5Z-2naeI_UPd1Y,6198
30
30
  prompture/session.py,sha256=FldK3cKq_jO0-beukVOhIiwsYWb6U_lLBlAERx95aaM,3821
31
- prompture/settings.py,sha256=57HfJXTjqnzb5-po2nBFtS_tKcvdKZWnxHtQuSTbiew,2564
31
+ prompture/settings.py,sha256=2cTuko8PLhq0SbBMtqmjBgzl9jv6SgoXeaUEhmm4G4Y,2562
32
32
  prompture/tools.py,sha256=PmFbGHTWYWahpJOG6BLlM0Y-EG6S37IFW57C-8GdsXo,36449
33
33
  prompture/tools_schema.py,sha256=JVc0dxC4aIHIUlgE8yFCcn1gPzJ3unTMVmZ8Ec04aD0,7764
34
34
  prompture/validator.py,sha256=FY_VjIVEbjG2nwzh-r6l23Kt3UzaLyCis8_pZMNGHBA,993
@@ -36,7 +36,7 @@ prompture/aio/__init__.py,sha256=bKqTu4Jxld16aP_7SP9wU5au45UBIb041ORo4E4HzVo,181
36
36
  prompture/drivers/__init__.py,sha256=r8wBYGKD7C7v4CqcyRNoaITzGVyxasoiAU6jBYsPZio,8178
37
37
  prompture/drivers/airllm_driver.py,sha256=SaTh7e7Plvuct_TfRqQvsJsKHvvM_3iVqhBtlciM-Kw,3858
38
38
  prompture/drivers/async_airllm_driver.py,sha256=1hIWLXfyyIg9tXaOE22tLJvFyNwHnOi1M5BIKnV8ysk,908
39
- prompture/drivers/async_azure_driver.py,sha256=CFYh4TsI16m7KgAQ_jThJCRw60e_MlHEejDhm7klGH4,4456
39
+ prompture/drivers/async_azure_driver.py,sha256=uXPMStCn5jMnLFpiLYBvTheZm2dNlwKmSLWL3J2s8es,4544
40
40
  prompture/drivers/async_claude_driver.py,sha256=oawbFVVMtRlikQOmu3jRjbdpoeu95JqTF1YHLKO3ybE,10576
41
41
  prompture/drivers/async_google_driver.py,sha256=LTUgCXJjzuTDGzsCsmY2-xH2KdTLJD7htwO49ZNFOdE,13711
42
42
  prompture/drivers/async_grok_driver.py,sha256=s3bXEGhVrMyw10CowkBhs5522mhipWJyWWu-xVixzyg,3538
@@ -45,13 +45,13 @@ 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=vG_xkPf4x21ElUGD6XlOCcA8fFx3ErKrPB9apykSWnY,11098
48
+ prompture/drivers/async_moonshot_driver.py,sha256=ru6w64qz_w5o7edxtNLL7s0mqb95ahBfbCHgUIwHKtk,11186
49
49
  prompture/drivers/async_ollama_driver.py,sha256=FaSXtFXrgeVHIe0b90Vg6rGeSTWLpPnjaThh9Ai7qQo,5042
50
- prompture/drivers/async_openai_driver.py,sha256=mv0_H2ZQFm96xfDL1oFz3qRhB9v-whv48dwvE0b02dA,8956
51
- prompture/drivers/async_openrouter_driver.py,sha256=OnJZjrl39YGmYyO4y3U8rfMPOtXfihvJYkPJOXY6Xqo,10610
50
+ prompture/drivers/async_openai_driver.py,sha256=COa_JE-AgKowKJpmRnfDJp4RSQKZel_7WswxOzvLksM,9044
51
+ prompture/drivers/async_openrouter_driver.py,sha256=GnOMY67CCV3HV83lCC-CxcngwrUnuc7G-AX7fb1DYpg,10698
52
52
  prompture/drivers/async_registry.py,sha256=JFEnXNPm-8AAUCiNLoKuYBSCYEK-4BmAen5t55QrMvg,5223
53
- prompture/drivers/async_zai_driver.py,sha256=jYYT8x_uNE6i2gSF9A7-rhzmcudxuNJsbZD_zEWoZOo,10639
54
- prompture/drivers/azure_driver.py,sha256=bcfYxfkIbfxqopr_O6sbhdtk4PLl7t-4gbUL0OoMeM0,5710
53
+ prompture/drivers/async_zai_driver.py,sha256=zXHxske1CtK8dDTGY-D_kiyZZ_NfceNTJlyTpKn0R4c,10727
54
+ prompture/drivers/azure_driver.py,sha256=zwCRNJRm18XEfYeqpFCDLMEEyY0vIGdqrwKk9ng6s4s,5798
55
55
  prompture/drivers/claude_driver.py,sha256=C8Av3DXP2x3f35jEv8BRwEM_4vh0cfmLsy3t5dsR6aM,11837
56
56
  prompture/drivers/google_driver.py,sha256=Zck5VUsW37kDgohXz3cUWRmZ88OfhmTpVD-qzAVMp-8,16318
57
57
  prompture/drivers/grok_driver.py,sha256=CzAXKAbbWmbE8qLFZxxoEhf4Qzbtc9YqDX7kkCsE4dk,5320
@@ -60,13 +60,13 @@ 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=ngw7G20WlgIAlXly9ZFHda59ycXmGJdjjK6cocUaaUs,12083
63
+ prompture/drivers/moonshot_driver.py,sha256=444Ie14OKN4sIo9XGNoaK-K1AQKGIb2un74uLi2v3f4,12171
64
64
  prompture/drivers/ollama_driver.py,sha256=k9xeUwFp91OrDbjkbYI-F8CDFy5ew-zQ0btXqwbXXWM,10220
65
- prompture/drivers/openai_driver.py,sha256=WJ2LnSttq0FvrRzEeweAxzigv3qu_BYvpXv7PSVRZSI,10460
66
- prompture/drivers/openrouter_driver.py,sha256=5tZlrdfTaDlPduauiyJgii4RKNnuKiVmBi3skwpPKTQ,12254
65
+ prompture/drivers/openai_driver.py,sha256=DqdMhxF8M2HdOY5vfsFrz0h23lqBoQlbxV3xUdHvZho,10548
66
+ prompture/drivers/openrouter_driver.py,sha256=DaG1H99s8GaOgJXZK4TP28HM7U4wiLu9wHXzWZleW_U,12589
67
67
  prompture/drivers/registry.py,sha256=Dg_5w9alnIPKhOnsR9Xspuf5T7roBGu0r_L2Cf-UhXs,9926
68
68
  prompture/drivers/vision_helpers.py,sha256=l5iYXHJLR_vLFvqDPPPK1QqK7YPKh5GwocpbSyt0R04,5403
69
- prompture/drivers/zai_driver.py,sha256=oOyynb5mepTCwZKx_spFnjn9_BdxIPaMxLUZjabC7jo,10950
69
+ prompture/drivers/zai_driver.py,sha256=Wkur0HfwKJt8ugYErpvz1Gy6e9an8vt4R7U3i6HWV_s,11038
70
70
  prompture/scaffold/__init__.py,sha256=aitUxBV0MpjC7Od3iG8WUzcC7tGPXSt3oMzUBX8UDwQ,60
71
71
  prompture/scaffold/generator.py,sha256=5QTHdWEXB7ADqOttfU7NgoxuaofNQnObzzI7NIPWFgo,2387
72
72
  prompture/scaffold/templates/Dockerfile.j2,sha256=ukox6eVzQMVw-hAaFmNRL5HTrXw2Z0RB6g-vvbMVeu8,207
@@ -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.41.dev1.dist-info/licenses/LICENSE,sha256=0HgDepH7aaHNFhHF-iXuW6_GqDfYPnVkjtiCAZ4yS8I,1060
80
- prompture-0.0.41.dev1.dist-info/METADATA,sha256=1w3CWhuNAMTzZQX13hyyYnHEURL5p_eDHJmjGpiY7Fk,10842
81
- prompture-0.0.41.dev1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
82
- prompture-0.0.41.dev1.dist-info/entry_points.txt,sha256=AFPG3lJR86g4IJMoWQUW5Ph7G6MLNWG3A2u2Tp9zkp8,48
83
- prompture-0.0.41.dev1.dist-info/top_level.txt,sha256=to86zq_kjfdoLeAxQNr420UWqT0WzkKoZ509J7Qr2t4,10
84
- prompture-0.0.41.dev1.dist-info/RECORD,,
79
+ prompture-0.0.42.dev1.dist-info/licenses/LICENSE,sha256=0HgDepH7aaHNFhHF-iXuW6_GqDfYPnVkjtiCAZ4yS8I,1060
80
+ prompture-0.0.42.dev1.dist-info/METADATA,sha256=8IPzdovJ1OSR92U6_J5AFOxJbEYBXs-NZ-NN451iGJU,10842
81
+ prompture-0.0.42.dev1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
82
+ prompture-0.0.42.dev1.dist-info/entry_points.txt,sha256=AFPG3lJR86g4IJMoWQUW5Ph7G6MLNWG3A2u2Tp9zkp8,48
83
+ prompture-0.0.42.dev1.dist-info/top_level.txt,sha256=to86zq_kjfdoLeAxQNr420UWqT0WzkKoZ509J7Qr2t4,10
84
+ prompture-0.0.42.dev1.dist-info/RECORD,,