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 CHANGED
@@ -2,4 +2,4 @@
2
2
  MBX AI package.
3
3
  """
4
4
 
5
- __version__ = "1.3.0"
5
+ __version__ = "1.4.0"
@@ -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
@@ -31,7 +31,7 @@ class MCPServer:
31
31
  self.app = FastAPI(
32
32
  title=self.name,
33
33
  description=self.description,
34
- version="1.3.0",
34
+ version="1.4.0",
35
35
  )
36
36
 
37
37
  # Initialize MCP server
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mbxai
3
- Version: 1.3.0
3
+ Version: 1.4.0
4
4
  Summary: MBX AI SDK
5
5
  Project-URL: Homepage, https://www.mibexx.de
6
6
  Project-URL: Documentation, https://www.mibexx.de
@@ -1,4 +1,4 @@
1
- mbxai/__init__.py,sha256=4cotIuKStlHqnJBxOJuEwoHh2V9cg49no_NLkaElFts,47
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=R4H-OU5FvGL41cCkTdLa3bocsmVJYQYOcOHRf61nbZc,2822
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=k_MH77DHutAfnWUSt2UFxoycqH6xn33bZOhdM5PTuW0,3454
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=wWdYIzbrG-0c_MkK2GYy92OOmaaCKVv7qGUwU5tqtTo,19893
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.3.0.dist-info/METADATA,sha256=j9nZGvIPsVhcBL281HSyZNIOEorCboE0qtSfsZqVbSc,4147
26
- mbxai-1.3.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
27
- mbxai-1.3.0.dist-info/licenses/LICENSE,sha256=hEyhc4FxwYo3NQ40yNgZ7STqwVk-1_XcTXOnAPbGJAw,1069
28
- mbxai-1.3.0.dist-info/RECORD,,
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