prompture 0.0.43.dev1__py3-none-any.whl → 0.0.44.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.43.dev1'
32
- __version_tuple__ = version_tuple = (0, 0, 43, 'dev1')
31
+ __version__ = version = '0.0.44.dev1'
32
+ __version_tuple__ = version_tuple = (0, 0, 44, 'dev1')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -85,20 +85,31 @@ class AsyncMoonshotDriver(CostMixin, AsyncDriver):
85
85
  if supports_temperature and "temperature" in opts:
86
86
  data["temperature"] = opts["temperature"]
87
87
 
88
+ # Native JSON mode support — skip for reasoning models where
89
+ # Moonshot's API does not reliably support response_format.
88
90
  if options.get("json_mode"):
89
- json_schema = options.get("json_schema")
90
- if json_schema:
91
- schema_copy = prepare_strict_schema(json_schema)
92
- data["response_format"] = {
93
- "type": "json_schema",
94
- "json_schema": {
95
- "name": "extraction",
96
- "strict": True,
97
- "schema": schema_copy,
98
- },
99
- }
100
- else:
101
- data["response_format"] = {"type": "json_object"}
91
+ from ..model_rates import get_model_capabilities
92
+
93
+ caps = get_model_capabilities("moonshot", model)
94
+ is_reasoning = caps is not None and caps.is_reasoning is True
95
+ model_supports_structured = (
96
+ caps is None or caps.supports_structured_output is not False
97
+ ) and not is_reasoning
98
+
99
+ if model_supports_structured:
100
+ json_schema = options.get("json_schema")
101
+ if json_schema:
102
+ schema_copy = prepare_strict_schema(json_schema)
103
+ data["response_format"] = {
104
+ "type": "json_schema",
105
+ "json_schema": {
106
+ "name": "extraction",
107
+ "strict": True,
108
+ "schema": schema_copy,
109
+ },
110
+ }
111
+ else:
112
+ data["response_format"] = {"type": "json_object"}
102
113
 
103
114
  async with httpx.AsyncClient() as client:
104
115
  try:
@@ -132,7 +143,13 @@ class AsyncMoonshotDriver(CostMixin, AsyncDriver):
132
143
  "model_name": model,
133
144
  }
134
145
 
135
- text = resp["choices"][0]["message"]["content"]
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
+
136
153
  return {"text": text, "meta": meta}
137
154
 
138
155
  # ------------------------------------------------------------------
@@ -112,21 +112,31 @@ class MoonshotDriver(CostMixin, Driver):
112
112
  if supports_temperature and "temperature" in opts:
113
113
  data["temperature"] = opts["temperature"]
114
114
 
115
- # Native JSON mode support
115
+ # Native JSON mode support — skip for reasoning models where
116
+ # Moonshot's API does not reliably support response_format.
116
117
  if options.get("json_mode"):
117
- json_schema = options.get("json_schema")
118
- if json_schema:
119
- schema_copy = prepare_strict_schema(json_schema)
120
- data["response_format"] = {
121
- "type": "json_schema",
122
- "json_schema": {
123
- "name": "extraction",
124
- "strict": True,
125
- "schema": schema_copy,
126
- },
127
- }
128
- else:
129
- data["response_format"] = {"type": "json_object"}
118
+ from ..model_rates import get_model_capabilities
119
+
120
+ caps = get_model_capabilities("moonshot", model)
121
+ is_reasoning = caps is not None and caps.is_reasoning is True
122
+ model_supports_structured = (
123
+ caps is None or caps.supports_structured_output is not False
124
+ ) and not is_reasoning
125
+
126
+ if model_supports_structured:
127
+ json_schema = options.get("json_schema")
128
+ if json_schema:
129
+ schema_copy = prepare_strict_schema(json_schema)
130
+ data["response_format"] = {
131
+ "type": "json_schema",
132
+ "json_schema": {
133
+ "name": "extraction",
134
+ "strict": True,
135
+ "schema": schema_copy,
136
+ },
137
+ }
138
+ else:
139
+ data["response_format"] = {"type": "json_object"}
130
140
 
131
141
  try:
132
142
  response = requests.post(
@@ -159,7 +169,13 @@ class MoonshotDriver(CostMixin, Driver):
159
169
  "model_name": model,
160
170
  }
161
171
 
162
- text = resp["choices"][0]["message"]["content"]
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
+
163
179
  return {"text": text, "meta": meta}
164
180
 
165
181
  # ------------------------------------------------------------------
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prompture
3
- Version: 0.0.43.dev1
3
+ Version: 0.0.44.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,5 +1,5 @@
1
1
  prompture/__init__.py,sha256=cJnkefDpiyFbU77juw4tXPdKJQWoJ-c6XBFt2v-e5Q4,7455
2
- prompture/_version.py,sha256=sIK5v7LGoGbel1heQW-Ny-li2gI9AeVYp1F5Mx7lFwM,719
2
+ prompture/_version.py,sha256=JoHyEjVatnAQvqC0TKhNB5pUHhDiYhWIzirjI8Lfai0,719
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
@@ -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=ru6w64qz_w5o7edxtNLL7s0mqb95ahBfbCHgUIwHKtk,11186
48
+ prompture/drivers/async_moonshot_driver.py,sha256=faKiV_Sdo9u3Lvdup4ios_v5QkYS-jw4we-lk1MYc-0,12004
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=444Ie14OKN4sIo9XGNoaK-K1AQKGIb2un74uLi2v3f4,12171
63
+ prompture/drivers/moonshot_driver.py,sha256=6KlQxBgVRgcHvb55EDFuxNUP9ejhBDR_Vm_hlHKlpcY,12954
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.43.dev1.dist-info/licenses/LICENSE,sha256=0HgDepH7aaHNFhHF-iXuW6_GqDfYPnVkjtiCAZ4yS8I,1060
80
- prompture-0.0.43.dev1.dist-info/METADATA,sha256=IZFQOvGyIzqTpAN1WwXuTMQ82NNfrNT_aDccBs1aTFE,10842
81
- prompture-0.0.43.dev1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
82
- prompture-0.0.43.dev1.dist-info/entry_points.txt,sha256=AFPG3lJR86g4IJMoWQUW5Ph7G6MLNWG3A2u2Tp9zkp8,48
83
- prompture-0.0.43.dev1.dist-info/top_level.txt,sha256=to86zq_kjfdoLeAxQNr420UWqT0WzkKoZ509J7Qr2t4,10
84
- prompture-0.0.43.dev1.dist-info/RECORD,,
79
+ prompture-0.0.44.dev1.dist-info/licenses/LICENSE,sha256=0HgDepH7aaHNFhHF-iXuW6_GqDfYPnVkjtiCAZ4yS8I,1060
80
+ prompture-0.0.44.dev1.dist-info/METADATA,sha256=iCkbsbBr5_YIPR0aHxpdL3ZzKK5gXztHaSIZyLTm1GI,10842
81
+ prompture-0.0.44.dev1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
82
+ prompture-0.0.44.dev1.dist-info/entry_points.txt,sha256=AFPG3lJR86g4IJMoWQUW5Ph7G6MLNWG3A2u2Tp9zkp8,48
83
+ prompture-0.0.44.dev1.dist-info/top_level.txt,sha256=to86zq_kjfdoLeAxQNr420UWqT0WzkKoZ509J7Qr2t4,10
84
+ prompture-0.0.44.dev1.dist-info/RECORD,,