mbxai 0.6.3__py3-none-any.whl → 0.6.5__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__ = "0.6.3"
5
+ __version__ = "0.6.5"
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="0.6.3",
34
+ version="0.6.5",
35
35
  )
36
36
 
37
37
  # Initialize MCP server
mbxai/tools/client.py CHANGED
@@ -252,7 +252,6 @@ class ToolClient:
252
252
  response_format: type[T],
253
253
  *,
254
254
  model: str | None = None,
255
- stream: bool = False,
256
255
  **kwargs: Any,
257
256
  ) -> Any:
258
257
  """Chat with the model and parse the response into a Pydantic model.
@@ -261,84 +260,47 @@ class ToolClient:
261
260
  messages: The conversation messages
262
261
  response_format: The Pydantic model to parse the response into
263
262
  model: Optional model override
264
- stream: Whether to stream the response
265
263
  **kwargs: Additional parameters for the chat completion
266
264
 
267
265
  Returns:
268
266
  The parsed response from the model
269
267
  """
270
- tools = [tool.to_openai_function() for tool in self._tools.values()]
271
-
272
- if tools:
273
- logger.info(f"Available tools: {[tool['function']['name'] for tool in tools]}")
274
- kwargs["tools"] = tools
275
- kwargs["tool_choice"] = "auto"
276
-
277
- while True:
278
- # Log messages before sending to OpenRouter
279
- self._log_messages(messages)
268
+ # First use the chat function to handle any tool calls
269
+ response = await self.chat(
270
+ messages=messages,
271
+ model=model,
272
+ **kwargs,
273
+ )
274
+
275
+ if not response or not response.choices:
276
+ raise ValueError("No response received from OpenRouter")
280
277
 
281
- # Get the model's response
282
- response = await self._openrouter_client.chat_completion_parse(
278
+ choice = response.choices[0]
279
+ if not choice:
280
+ raise ValueError("Empty choice in response")
281
+
282
+ message = choice.message
283
+ if not message:
284
+ raise ValueError("Choice missing message")
285
+
286
+ # If we still have tool calls, something went wrong
287
+ if message.tool_calls:
288
+ raise ValueError("Unexpected tool calls in final response")
289
+
290
+ # Ensure we have content to parse
291
+ if not message.content:
292
+ raise ValueError("No content in final response to parse")
293
+
294
+ # Now that we have the final response, parse it into the desired format
295
+ try:
296
+ final_response = await self._openrouter_client.chat_completion_parse(
283
297
  messages=messages,
284
298
  response_format=response_format,
285
299
  model=model,
286
- stream=stream,
300
+ tools=None, # No tools for the final parse
287
301
  **kwargs,
288
302
  )
289
-
290
- if stream:
291
- return response
292
-
293
- if not response or not response.choices:
294
- raise ValueError("No response received from OpenRouter")
295
-
296
- choice = response.choices[0]
297
- if not choice:
298
- raise ValueError("Empty choice in response")
299
-
300
- message = choice.message
301
- if not message:
302
- raise ValueError("Choice missing message")
303
-
304
- # Check for tool calls first
305
- if message.tool_calls:
306
- # Add the assistant's message with tool calls
307
- assistant_message = {
308
- "role": "assistant",
309
- "content": None,
310
- "tool_calls": [
311
- {
312
- "id": tool_call.id,
313
- "type": "function",
314
- "function": {
315
- "name": tool_call.function.name,
316
- "arguments": tool_call.function.arguments,
317
- },
318
- }
319
- for tool_call in message.tool_calls
320
- ]
321
- }
322
- messages.append(assistant_message)
323
- logger.info(f"Message count: {len(messages)}, Added assistant message with tool calls: {[tc.function.name for tc in message.tool_calls]}")
324
-
325
- # Process all tool calls
326
- await self._process_tool_calls(message, messages)
327
-
328
- # Continue the loop to get the next response
329
- continue
330
-
331
- # If we have a parsed response, return it
332
- if hasattr(message, "parsed") and message.parsed:
333
- return response
334
-
335
- # If we have content but no tool calls, try to parse it
336
- if message.content:
337
- try:
338
- return response
339
- except Exception as e:
340
- logger.error(f"Failed to parse response: {e}")
341
- raise ValueError(f"Failed to parse response as {response_format.__name__}: {str(e)}")
342
-
343
- # If we have neither parsed content nor tool calls, something is wrong
344
- raise ValueError("Response has neither parsed content nor tool calls")
303
+ return final_response
304
+ except Exception as e:
305
+ logger.error(f"Failed to parse response: {e}")
306
+ raise ValueError(f"Failed to parse response as {response_format.__name__}: {str(e)}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mbxai
3
- Version: 0.6.3
3
+ Version: 0.6.5
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,18 +1,18 @@
1
- mbxai/__init__.py,sha256=BMqoY5xamu9yHHw49edZO3PXPMjy_-oXovlRNf-sU78,47
1
+ mbxai/__init__.py,sha256=C_O5XTKt8ws8GVayjNJK-2h4-zghRDr80HB4nYUvDvU,47
2
2
  mbxai/core.py,sha256=WMvmU9TTa7M_m-qWsUew4xH8Ul6xseCZ2iBCXJTW-Bs,196
3
3
  mbxai/mcp/__init__.py,sha256=_ek9iYdYqW5saKetj4qDci11jxesQDiHPJRpHMKkxgU,175
4
4
  mbxai/mcp/client.py,sha256=B8ZpH-uecmTCgoDw65LwwVxsFWVoX-08t5ff0hOEPXk,6011
5
5
  mbxai/mcp/example.py,sha256=oaol7AvvZnX86JWNz64KvPjab5gg1VjVN3G8eFSzuaE,2350
6
- mbxai/mcp/server.py,sha256=Ecapt1_yeR4ROmCSF8C0Jn7DHjLM506YLW2vv_MrbbI,3462
6
+ mbxai/mcp/server.py,sha256=URtiGIwGoagb7_0isx6V6JsrI9RfAHwqYT_FnRSdJcM,3462
7
7
  mbxai/openrouter/__init__.py,sha256=Ito9Qp_B6q-RLGAQcYyTJVWwR2YAZvNqE-HIYXxhtD8,298
8
8
  mbxai/openrouter/client.py,sha256=RO5tbF42vkcjxjvC-QFB8DGA0gQLljH3KPBn3HgZV8I,13662
9
9
  mbxai/openrouter/config.py,sha256=Ia93s-auim9Sq71eunVDbn9ET5xX2zusXpV4JBdHAzs,3251
10
10
  mbxai/openrouter/models.py,sha256=b3IjjtZAjeGOf2rLsdnCD1HacjTnS8jmv_ZXorc-KJQ,2604
11
11
  mbxai/tools/__init__.py,sha256=QUFaXhDm-UKcuAtT1rbKzhBkvyRBVokcQIOf9cxIuwc,160
12
- mbxai/tools/client.py,sha256=prubkDWakvM_jhbI0dlEO2NRDxPN7kBdglQPoJecqMI,13563
12
+ mbxai/tools/client.py,sha256=uY1dtQAVqzLy6y2-Ps3ca05ejHZRnleLxwusoqQoXN4,11941
13
13
  mbxai/tools/example.py,sha256=1HgKK39zzUuwFbnp3f0ThyWVfA_8P28PZcTwaUw5K78,2232
14
14
  mbxai/tools/types.py,sha256=fo5t9UbsHGynhA88vD_ecgDqL8iLvt2E1h1ym43Rrgk,745
15
- mbxai-0.6.3.dist-info/METADATA,sha256=OSzpwF2znzDZUtsyN0TN1_zZYe44i83MUNZ9B1Mg-I8,4107
16
- mbxai-0.6.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
17
- mbxai-0.6.3.dist-info/licenses/LICENSE,sha256=hEyhc4FxwYo3NQ40yNgZ7STqwVk-1_XcTXOnAPbGJAw,1069
18
- mbxai-0.6.3.dist-info/RECORD,,
15
+ mbxai-0.6.5.dist-info/METADATA,sha256=8eAqM3Jkm5tjJHuDJxmvcN4M--EpTYzz2MlqQE1fCuw,4107
16
+ mbxai-0.6.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
17
+ mbxai-0.6.5.dist-info/licenses/LICENSE,sha256=hEyhc4FxwYo3NQ40yNgZ7STqwVk-1_XcTXOnAPbGJAw,1069
18
+ mbxai-0.6.5.dist-info/RECORD,,
File without changes