mbxai 1.3.0__py3-none-any.whl → 1.4.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.
- mbxai/__init__.py +1 -1
- mbxai/examples/mcp/mcp_client_example.py +4 -0
- mbxai/mcp/server.py +1 -1
- mbxai/openrouter/client.py +18 -41
- {mbxai-1.3.0.dist-info → mbxai-1.4.0.dist-info}/METADATA +1 -1
- {mbxai-1.3.0.dist-info → mbxai-1.4.0.dist-info}/RECORD +8 -8
- {mbxai-1.3.0.dist-info → mbxai-1.4.0.dist-info}/WHEEL +0 -0
- {mbxai-1.3.0.dist-info → mbxai-1.4.0.dist-info}/licenses/LICENSE +0 -0
mbxai/__init__.py
CHANGED
@@ -51,6 +51,10 @@ def main():
|
|
51
51
|
if not hasattr(response, 'choices'):
|
52
52
|
logger.error(f"Invalid response format - no choices attribute: {response}")
|
53
53
|
return
|
54
|
+
|
55
|
+
if response.choices is None:
|
56
|
+
logger.error("Response choices is None")
|
57
|
+
return
|
54
58
|
|
55
59
|
if not response.choices:
|
56
60
|
logger.error("No choices in response")
|
mbxai/mcp/server.py
CHANGED
mbxai/openrouter/client.py
CHANGED
@@ -234,6 +234,15 @@ class OpenRouterClient:
|
|
234
234
|
logger.error("Received None response from OpenRouter API")
|
235
235
|
raise OpenRouterAPIError("Received None response from OpenRouter API")
|
236
236
|
|
237
|
+
# Validate response structure
|
238
|
+
if not hasattr(response, 'choices'):
|
239
|
+
logger.error(f"Response missing 'choices' attribute. Available attributes: {dir(response)}")
|
240
|
+
raise OpenRouterAPIError("Invalid response format: missing 'choices' attribute")
|
241
|
+
|
242
|
+
if response.choices is None:
|
243
|
+
logger.error("Response choices is None")
|
244
|
+
raise OpenRouterAPIError("Invalid response format: choices is None")
|
245
|
+
|
237
246
|
logger.debug(f"Response type: {type(response)}")
|
238
247
|
logger.debug(f"Response attributes: {dir(response)}")
|
239
248
|
logger.debug(f"Received response from OpenRouter: {len(response.choices)} choices")
|
@@ -320,47 +329,6 @@ class OpenRouterClient:
|
|
320
329
|
logger.error("Received None response from OpenRouter API")
|
321
330
|
raise OpenRouterAPIError("Received None response from OpenRouter API")
|
322
331
|
|
323
|
-
# Try to get the raw response content if available
|
324
|
-
if hasattr(response, '_response'):
|
325
|
-
try:
|
326
|
-
raw_content = response._response.text
|
327
|
-
logger.debug(f"Raw response content: {raw_content[:1000]}...")
|
328
|
-
except Exception as e:
|
329
|
-
logger.debug(f"Could not get raw response content: {e}")
|
330
|
-
|
331
|
-
# Validate response structure
|
332
|
-
if not hasattr(response, 'choices'):
|
333
|
-
logger.error(f"Response missing 'choices' attribute. Available attributes: {dir(response)}")
|
334
|
-
raise OpenRouterAPIError("Invalid response format: missing 'choices' attribute")
|
335
|
-
|
336
|
-
if not response.choices:
|
337
|
-
logger.error("Response has empty choices list")
|
338
|
-
raise OpenRouterAPIError("Invalid response format: empty choices list")
|
339
|
-
|
340
|
-
if not hasattr(response.choices[0], 'message'):
|
341
|
-
logger.error(f"First choice missing 'message' attribute. Available attributes: {dir(response.choices[0])}")
|
342
|
-
raise OpenRouterAPIError("Invalid response format: missing 'message' attribute in first choice")
|
343
|
-
|
344
|
-
# Check if the message has a parsed attribute or content
|
345
|
-
if not hasattr(response.choices[0].message, 'parsed') and not hasattr(response.choices[0].message, 'content'):
|
346
|
-
logger.error(f"Message missing both 'parsed' and 'content' attributes. Available attributes: {dir(response.choices[0].message)}")
|
347
|
-
raise OpenRouterAPIError("Invalid response format: message must have either 'parsed' or 'content' attribute")
|
348
|
-
|
349
|
-
# If there's no parsed attribute but there is content, try to parse it
|
350
|
-
if not hasattr(response.choices[0].message, 'parsed') and hasattr(response.choices[0].message, 'content'):
|
351
|
-
try:
|
352
|
-
content = response.choices[0].message.content
|
353
|
-
if isinstance(content, str):
|
354
|
-
parsed = json.loads(content)
|
355
|
-
response.choices[0].message.parsed = parsed
|
356
|
-
else:
|
357
|
-
response.choices[0].message.parsed = content
|
358
|
-
except Exception as e:
|
359
|
-
stack_trace = traceback.format_exc()
|
360
|
-
logger.error(f"Failed to parse message content: {str(e)}")
|
361
|
-
logger.error(f"Stack trace:\n{stack_trace}")
|
362
|
-
raise OpenRouterAPIError(f"Failed to parse message content: {str(e)}\nStack trace:\n{stack_trace}")
|
363
|
-
|
364
332
|
logger.debug(f"Received response from OpenRouter: {len(response.choices)} choices")
|
365
333
|
|
366
334
|
return response
|
@@ -431,6 +399,15 @@ class OpenRouterClient:
|
|
431
399
|
logger.error("Received None response from OpenRouter API")
|
432
400
|
raise OpenRouterAPIError("Received None response from OpenRouter API")
|
433
401
|
|
402
|
+
# Validate response structure
|
403
|
+
if not hasattr(response, 'choices'):
|
404
|
+
logger.error(f"Response missing 'choices' attribute. Available attributes: {dir(response)}")
|
405
|
+
raise OpenRouterAPIError("Invalid response format: missing 'choices' attribute")
|
406
|
+
|
407
|
+
if response.choices is None:
|
408
|
+
logger.error("Response choices is None")
|
409
|
+
raise OpenRouterAPIError("Invalid response format: choices is None")
|
410
|
+
|
434
411
|
logger.debug(f"Response type: {type(response)}")
|
435
412
|
logger.debug(f"Response attributes: {dir(response)}")
|
436
413
|
logger.debug(f"Received response from OpenRouter: {len(response.choices)} choices")
|
@@ -1,4 +1,4 @@
|
|
1
|
-
mbxai/__init__.py,sha256=
|
1
|
+
mbxai/__init__.py,sha256=E7p4_3-qHNUH7NcRh8unQZwHeS5pRX-O8zL-n0jaR2M,47
|
2
2
|
mbxai/core.py,sha256=WMvmU9TTa7M_m-qWsUew4xH8Ul6xseCZ2iBCXJTW-Bs,196
|
3
3
|
mbxai/examples/openrouter_example.py,sha256=-grXHKMmFLoh-yUIEMc31n8Gg1S7uSazBWCIOWxgbyQ,1317
|
4
4
|
mbxai/examples/parse_example.py,sha256=eCKMJoOl6qwo8sDP6Trc6ncgjPlgTqi5tPE2kB5_P0k,3821
|
@@ -7,14 +7,14 @@ mbxai/examples/request.json,sha256=fjVMses305wVUXgcmjESCvPgP81Js8Kk6zHjZ8EDyEg,5
|
|
7
7
|
mbxai/examples/response.json,sha256=4SGJJyQjWWeN__Mrxm6ZtHIo1NUtLEheldd5KaA2mHw,856
|
8
8
|
mbxai/examples/send_request.py,sha256=O5gCHUHy7RvkEFo9IQATgnSOfOdu8OqKHfjAlLDwWPg,6023
|
9
9
|
mbxai/examples/tool_client_example.py,sha256=9DNaejXLA85dPbExMiv5y76qlFhzOJF9E5EnMOsy_Dc,3993
|
10
|
-
mbxai/examples/mcp/mcp_client_example.py,sha256=
|
10
|
+
mbxai/examples/mcp/mcp_client_example.py,sha256=d5-TRHNDdp3nT_NGt0tKpT3VUAJVvqAHSyqkzk9Dd2s,2972
|
11
11
|
mbxai/examples/mcp/mcp_server_example.py,sha256=nFfg22Jnc6HMW_ezLO3So1xwDdx2_rItj5CR-y_Nevs,3966
|
12
12
|
mbxai/mcp/__init__.py,sha256=_ek9iYdYqW5saKetj4qDci11jxesQDiHPJRpHMKkxgU,175
|
13
13
|
mbxai/mcp/client.py,sha256=QRzId6o4_WRWVv3rtm8cfZZGaoY_UlaOO-oqNjY-tmw,5219
|
14
14
|
mbxai/mcp/example.py,sha256=oaol7AvvZnX86JWNz64KvPjab5gg1VjVN3G8eFSzuaE,2350
|
15
|
-
mbxai/mcp/server.py,sha256=
|
15
|
+
mbxai/mcp/server.py,sha256=V-o8BugXj9Jj_yUIGepH0fCw8lrxYSpVRpI5CFfAvnk,3454
|
16
16
|
mbxai/openrouter/__init__.py,sha256=Ito9Qp_B6q-RLGAQcYyTJVWwR2YAZvNqE-HIYXxhtD8,298
|
17
|
-
mbxai/openrouter/client.py,sha256=
|
17
|
+
mbxai/openrouter/client.py,sha256=3LD6WDJ8wjo_nefH5d1NJCsrWPvBc_KBf2NsItUoSt8,18302
|
18
18
|
mbxai/openrouter/config.py,sha256=Ia93s-auim9Sq71eunVDbn9ET5xX2zusXpV4JBdHAzs,3251
|
19
19
|
mbxai/openrouter/models.py,sha256=b3IjjtZAjeGOf2rLsdnCD1HacjTnS8jmv_ZXorc-KJQ,2604
|
20
20
|
mbxai/openrouter/schema.py,sha256=H_77ZrA9zmbX155bWpCJj1jehUyJPS0QybEW1IVAoe0,540
|
@@ -22,7 +22,7 @@ mbxai/tools/__init__.py,sha256=ogxrHvgJ7OR62Lmd5x9Eh5d2C0jqWyQis7Zy3yKpZ78,218
|
|
22
22
|
mbxai/tools/client.py,sha256=j6yB2hYxvWbaQ5SqN1Fs_YFdPtwettdcMoXcdeV-520,14930
|
23
23
|
mbxai/tools/example.py,sha256=1HgKK39zzUuwFbnp3f0ThyWVfA_8P28PZcTwaUw5K78,2232
|
24
24
|
mbxai/tools/types.py,sha256=7gNIJBjzr9i4DT50OGLMjn3-6yBXqlK-kIz_RWcqywo,5875
|
25
|
-
mbxai-1.
|
26
|
-
mbxai-1.
|
27
|
-
mbxai-1.
|
28
|
-
mbxai-1.
|
25
|
+
mbxai-1.4.0.dist-info/METADATA,sha256=EWpGN5OMQTKiNodh1zxL-tU1Ud3U3-Q20Sz-Ep7YUuA,4147
|
26
|
+
mbxai-1.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
27
|
+
mbxai-1.4.0.dist-info/licenses/LICENSE,sha256=hEyhc4FxwYo3NQ40yNgZ7STqwVk-1_XcTXOnAPbGJAw,1069
|
28
|
+
mbxai-1.4.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|