mbxai 0.5.11__tar.gz → 0.5.12__tar.gz
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-0.5.11 → mbxai-0.5.12}/PKG-INFO +1 -1
- {mbxai-0.5.11 → mbxai-0.5.12}/pyproject.toml +1 -1
- {mbxai-0.5.11 → mbxai-0.5.12}/setup.py +1 -1
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/__init__.py +1 -1
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/mcp/server.py +1 -1
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/tools/client.py +91 -81
- {mbxai-0.5.11 → mbxai-0.5.12}/uv.lock +7 -7
- {mbxai-0.5.11 → mbxai-0.5.12}/.vscode/PythonImportHelper-v2-Completion.json +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/LICENSE +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/README.md +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/core.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/mcp/__init__.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/mcp/client.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/mcp/example.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/openrouter/__init__.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/openrouter/client.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/openrouter/config.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/openrouter/models.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/tools/__init__.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/tools/example.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/src/mbxai/tools/types.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/tests/test_core.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/tests/test_mcp.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/tests/test_openrouter.py +0 -0
- {mbxai-0.5.11 → mbxai-0.5.12}/tests/test_tools.py +0 -0
@@ -113,7 +113,8 @@ class ToolClient:
|
|
113
113
|
if not message.tool_calls:
|
114
114
|
return response
|
115
115
|
|
116
|
-
# Handle
|
116
|
+
# Handle all tool calls before getting the next model response
|
117
|
+
tool_responses = []
|
117
118
|
for tool_call in message.tool_calls:
|
118
119
|
logger.debug(f"Processing tool call: {tool_call}")
|
119
120
|
logger.debug(f"Tool call ID: {tool_call.id}")
|
@@ -149,50 +150,54 @@ class ToolClient:
|
|
149
150
|
if not isinstance(result, str):
|
150
151
|
result = json.dumps(result)
|
151
152
|
|
152
|
-
#
|
153
|
+
# Create the tool response
|
153
154
|
tool_response = {
|
154
155
|
"role": "tool",
|
155
156
|
"tool_call_id": tool_call.id,
|
156
157
|
"content": result,
|
157
158
|
}
|
158
|
-
|
159
|
-
logger.debug(f"
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
159
|
+
tool_responses.append(tool_response)
|
160
|
+
logger.debug(f"Created tool response: {tool_response}")
|
161
|
+
|
162
|
+
# Add all tool responses to the messages
|
163
|
+
messages.extend(tool_responses)
|
164
|
+
logger.debug(f"Added all tool responses to messages: {tool_responses}")
|
165
|
+
|
166
|
+
# Get a new response from the model with all tool results
|
167
|
+
response = self._client.chat_completion(
|
168
|
+
messages=messages,
|
169
|
+
model=model,
|
170
|
+
stream=stream,
|
171
|
+
**kwargs,
|
172
|
+
)
|
173
|
+
|
174
|
+
if stream:
|
175
|
+
return response
|
176
|
+
|
177
|
+
message = response.choices[0].message
|
178
|
+
# Add the assistant's message with tool calls
|
179
|
+
assistant_message = {
|
180
|
+
"role": "assistant",
|
181
|
+
"content": message.content or None, # Ensure content is None if empty
|
182
|
+
}
|
183
|
+
if message.tool_calls:
|
184
|
+
assistant_message["tool_calls"] = [
|
185
|
+
{
|
186
|
+
"id": tool_call.id,
|
187
|
+
"type": "function",
|
188
|
+
"function": {
|
189
|
+
"name": tool_call.function.name,
|
190
|
+
"arguments": tool_call.function.arguments,
|
191
|
+
},
|
192
|
+
}
|
193
|
+
for tool_call in message.tool_calls
|
194
|
+
]
|
195
|
+
messages.append(assistant_message)
|
196
|
+
logger.debug(f"Added assistant message: {assistant_message}")
|
197
|
+
|
198
|
+
# If there are no more tool calls, we're done
|
199
|
+
if not message.tool_calls:
|
200
|
+
return response
|
196
201
|
|
197
202
|
async def parse(
|
198
203
|
self,
|
@@ -260,7 +265,8 @@ class ToolClient:
|
|
260
265
|
if not message.tool_calls:
|
261
266
|
return response
|
262
267
|
|
263
|
-
# Handle
|
268
|
+
# Handle all tool calls before getting the next model response
|
269
|
+
tool_responses = []
|
264
270
|
for tool_call in message.tool_calls:
|
265
271
|
logger.debug(f"Processing tool call: {tool_call}")
|
266
272
|
logger.debug(f"Tool call ID: {tool_call.id}")
|
@@ -296,48 +302,52 @@ class ToolClient:
|
|
296
302
|
if not isinstance(result, str):
|
297
303
|
result = json.dumps(result)
|
298
304
|
|
299
|
-
#
|
305
|
+
# Create the tool response
|
300
306
|
tool_response = {
|
301
307
|
"role": "tool",
|
302
308
|
"tool_call_id": tool_call.id,
|
303
309
|
"content": result,
|
304
310
|
}
|
305
|
-
|
306
|
-
logger.debug(f"
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
311
|
+
tool_responses.append(tool_response)
|
312
|
+
logger.debug(f"Created tool response: {tool_response}")
|
313
|
+
|
314
|
+
# Add all tool responses to the messages
|
315
|
+
messages.extend(tool_responses)
|
316
|
+
logger.debug(f"Added all tool responses to messages: {tool_responses}")
|
317
|
+
|
318
|
+
# Get a new response from the model with all tool results
|
319
|
+
response = self._client.chat_completion_parse(
|
320
|
+
messages=messages,
|
321
|
+
response_format=response_format,
|
322
|
+
model=model,
|
323
|
+
stream=stream,
|
324
|
+
**kwargs,
|
325
|
+
)
|
326
|
+
|
327
|
+
if stream:
|
328
|
+
return response
|
329
|
+
|
330
|
+
message = response.choices[0].message
|
331
|
+
# Add the assistant's message with tool calls
|
332
|
+
assistant_message = {
|
333
|
+
"role": "assistant",
|
334
|
+
"content": message.content or None, # Ensure content is None if empty
|
335
|
+
}
|
336
|
+
if message.tool_calls:
|
337
|
+
assistant_message["tool_calls"] = [
|
338
|
+
{
|
339
|
+
"id": tool_call.id,
|
340
|
+
"type": "function",
|
341
|
+
"function": {
|
342
|
+
"name": tool_call.function.name,
|
343
|
+
"arguments": tool_call.function.arguments,
|
344
|
+
},
|
345
|
+
}
|
346
|
+
for tool_call in message.tool_calls
|
347
|
+
]
|
348
|
+
messages.append(assistant_message)
|
349
|
+
logger.debug(f"Added assistant message: {assistant_message}")
|
350
|
+
|
351
|
+
# If there are no more tool calls, we're done
|
352
|
+
if not message.tool_calls:
|
353
|
+
return response
|
@@ -292,11 +292,11 @@ wheels = [
|
|
292
292
|
|
293
293
|
[[package]]
|
294
294
|
name = "httpx-sse"
|
295
|
-
version = "0.5.
|
295
|
+
version = "0.5.12"
|
296
296
|
source = { registry = "https://pypi.org/simple" }
|
297
|
-
sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.5.
|
297
|
+
sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.5.12.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624 }
|
298
298
|
wheels = [
|
299
|
-
{ url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.5.
|
299
|
+
{ url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.5.12-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819 },
|
300
300
|
]
|
301
301
|
|
302
302
|
[[package]]
|
@@ -446,7 +446,7 @@ wheels = [
|
|
446
446
|
|
447
447
|
[[package]]
|
448
448
|
name = "mbxai"
|
449
|
-
version = "0.5.
|
449
|
+
version = "0.5.12"
|
450
450
|
source = { editable = "." }
|
451
451
|
dependencies = [
|
452
452
|
{ name = "fastapi" },
|
@@ -980,14 +980,14 @@ wheels = [
|
|
980
980
|
|
981
981
|
[[package]]
|
982
982
|
name = "typing-inspection"
|
983
|
-
version = "0.5.
|
983
|
+
version = "0.5.12"
|
984
984
|
source = { registry = "https://pypi.org/simple" }
|
985
985
|
dependencies = [
|
986
986
|
{ name = "typing-extensions" },
|
987
987
|
]
|
988
|
-
sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.5.
|
988
|
+
sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.5.12.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 }
|
989
989
|
wheels = [
|
990
|
-
{ url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.5.
|
990
|
+
{ url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.5.12-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 },
|
991
991
|
]
|
992
992
|
|
993
993
|
[[package]]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|