mbxai 0.5.10__py3-none-any.whl → 0.5.11__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/mcp/server.py +1 -1
- mbxai/tools/client.py +87 -10
- {mbxai-0.5.10.dist-info → mbxai-0.5.11.dist-info}/METADATA +1 -1
- {mbxai-0.5.10.dist-info → mbxai-0.5.11.dist-info}/RECORD +7 -7
- {mbxai-0.5.10.dist-info → mbxai-0.5.11.dist-info}/WHEEL +0 -0
- {mbxai-0.5.10.dist-info → mbxai-0.5.11.dist-info}/licenses/LICENSE +0 -0
mbxai/__init__.py
CHANGED
mbxai/mcp/server.py
CHANGED
mbxai/tools/client.py
CHANGED
@@ -5,6 +5,7 @@ ToolClient implementation for MBX AI.
|
|
5
5
|
from typing import Any, Callable, TypeVar, cast
|
6
6
|
import logging
|
7
7
|
import inspect
|
8
|
+
import json
|
8
9
|
from pydantic import BaseModel
|
9
10
|
from ..openrouter import OpenRouterClient
|
10
11
|
from .types import Tool, ToolCall
|
@@ -88,7 +89,25 @@ class ToolClient:
|
|
88
89
|
return response
|
89
90
|
|
90
91
|
message = response.choices[0].message
|
91
|
-
|
92
|
+
# Add the assistant's message with tool calls
|
93
|
+
assistant_message = {
|
94
|
+
"role": "assistant",
|
95
|
+
"content": message.content or None, # Ensure content is None if empty
|
96
|
+
}
|
97
|
+
if message.tool_calls:
|
98
|
+
assistant_message["tool_calls"] = [
|
99
|
+
{
|
100
|
+
"id": tool_call.id,
|
101
|
+
"type": "function",
|
102
|
+
"function": {
|
103
|
+
"name": tool_call.function.name,
|
104
|
+
"arguments": tool_call.function.arguments,
|
105
|
+
},
|
106
|
+
}
|
107
|
+
for tool_call in message.tool_calls
|
108
|
+
]
|
109
|
+
messages.append(assistant_message)
|
110
|
+
logger.debug(f"Added assistant message: {assistant_message}")
|
92
111
|
|
93
112
|
# If there are no tool calls, we're done
|
94
113
|
if not message.tool_calls:
|
@@ -111,7 +130,6 @@ class ToolClient:
|
|
111
130
|
logger.debug(f"Raw arguments: {arguments}")
|
112
131
|
|
113
132
|
if isinstance(arguments, str):
|
114
|
-
import json
|
115
133
|
try:
|
116
134
|
arguments = json.loads(arguments)
|
117
135
|
logger.debug(f"Parsed arguments: {arguments}")
|
@@ -127,12 +145,15 @@ class ToolClient:
|
|
127
145
|
result = tool.function(**arguments)
|
128
146
|
logger.debug(f"Tool result: {result}")
|
129
147
|
|
148
|
+
# Convert result to JSON string if it's not already
|
149
|
+
if not isinstance(result, str):
|
150
|
+
result = json.dumps(result)
|
151
|
+
|
130
152
|
# Add the tool response to the messages
|
131
153
|
tool_response = {
|
132
154
|
"role": "tool",
|
133
155
|
"tool_call_id": tool_call.id,
|
134
|
-
"
|
135
|
-
"content": str(result),
|
156
|
+
"content": result,
|
136
157
|
}
|
137
158
|
messages.append(tool_response)
|
138
159
|
logger.debug(f"Added tool response to messages: {tool_response}")
|
@@ -149,7 +170,25 @@ class ToolClient:
|
|
149
170
|
return response
|
150
171
|
|
151
172
|
message = response.choices[0].message
|
152
|
-
|
173
|
+
# Add the assistant's message with tool calls
|
174
|
+
assistant_message = {
|
175
|
+
"role": "assistant",
|
176
|
+
"content": message.content or None, # Ensure content is None if empty
|
177
|
+
}
|
178
|
+
if message.tool_calls:
|
179
|
+
assistant_message["tool_calls"] = [
|
180
|
+
{
|
181
|
+
"id": tool_call.id,
|
182
|
+
"type": "function",
|
183
|
+
"function": {
|
184
|
+
"name": tool_call.function.name,
|
185
|
+
"arguments": tool_call.function.arguments,
|
186
|
+
},
|
187
|
+
}
|
188
|
+
for tool_call in message.tool_calls
|
189
|
+
]
|
190
|
+
messages.append(assistant_message)
|
191
|
+
logger.debug(f"Added assistant message: {assistant_message}")
|
153
192
|
|
154
193
|
# If there are no more tool calls, we're done
|
155
194
|
if not message.tool_calls:
|
@@ -197,7 +236,25 @@ class ToolClient:
|
|
197
236
|
return response
|
198
237
|
|
199
238
|
message = response.choices[0].message
|
200
|
-
|
239
|
+
# Add the assistant's message with tool calls
|
240
|
+
assistant_message = {
|
241
|
+
"role": "assistant",
|
242
|
+
"content": message.content or None, # Ensure content is None if empty
|
243
|
+
}
|
244
|
+
if message.tool_calls:
|
245
|
+
assistant_message["tool_calls"] = [
|
246
|
+
{
|
247
|
+
"id": tool_call.id,
|
248
|
+
"type": "function",
|
249
|
+
"function": {
|
250
|
+
"name": tool_call.function.name,
|
251
|
+
"arguments": tool_call.function.arguments,
|
252
|
+
},
|
253
|
+
}
|
254
|
+
for tool_call in message.tool_calls
|
255
|
+
]
|
256
|
+
messages.append(assistant_message)
|
257
|
+
logger.debug(f"Added assistant message: {assistant_message}")
|
201
258
|
|
202
259
|
# If there are no tool calls, we're done
|
203
260
|
if not message.tool_calls:
|
@@ -220,7 +277,6 @@ class ToolClient:
|
|
220
277
|
logger.debug(f"Raw arguments: {arguments}")
|
221
278
|
|
222
279
|
if isinstance(arguments, str):
|
223
|
-
import json
|
224
280
|
try:
|
225
281
|
arguments = json.loads(arguments)
|
226
282
|
logger.debug(f"Parsed arguments: {arguments}")
|
@@ -236,12 +292,15 @@ class ToolClient:
|
|
236
292
|
result = tool.function(**arguments)
|
237
293
|
logger.debug(f"Tool result: {result}")
|
238
294
|
|
295
|
+
# Convert result to JSON string if it's not already
|
296
|
+
if not isinstance(result, str):
|
297
|
+
result = json.dumps(result)
|
298
|
+
|
239
299
|
# Add the tool response to the messages
|
240
300
|
tool_response = {
|
241
301
|
"role": "tool",
|
242
302
|
"tool_call_id": tool_call.id,
|
243
|
-
"
|
244
|
-
"content": str(result),
|
303
|
+
"content": result,
|
245
304
|
}
|
246
305
|
messages.append(tool_response)
|
247
306
|
logger.debug(f"Added tool response to messages: {tool_response}")
|
@@ -259,7 +318,25 @@ class ToolClient:
|
|
259
318
|
return response
|
260
319
|
|
261
320
|
message = response.choices[0].message
|
262
|
-
|
321
|
+
# Add the assistant's message with tool calls
|
322
|
+
assistant_message = {
|
323
|
+
"role": "assistant",
|
324
|
+
"content": message.content or None, # Ensure content is None if empty
|
325
|
+
}
|
326
|
+
if message.tool_calls:
|
327
|
+
assistant_message["tool_calls"] = [
|
328
|
+
{
|
329
|
+
"id": tool_call.id,
|
330
|
+
"type": "function",
|
331
|
+
"function": {
|
332
|
+
"name": tool_call.function.name,
|
333
|
+
"arguments": tool_call.function.arguments,
|
334
|
+
},
|
335
|
+
}
|
336
|
+
for tool_call in message.tool_calls
|
337
|
+
]
|
338
|
+
messages.append(assistant_message)
|
339
|
+
logger.debug(f"Added assistant message: {assistant_message}")
|
263
340
|
|
264
341
|
# If there are no more tool calls, we're done
|
265
342
|
if not message.tool_calls:
|
@@ -1,18 +1,18 @@
|
|
1
|
-
mbxai/__init__.py,sha256=
|
1
|
+
mbxai/__init__.py,sha256=Nrk-9hVjGptSGLRYdkZYhni7CQG40G6nbzn7DQCmeTE,48
|
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=hEAVWIrIq758C1zm9aWGf-FiITB3LxtuxZEZ0CcjJ4s,5343
|
5
5
|
mbxai/mcp/example.py,sha256=oaol7AvvZnX86JWNz64KvPjab5gg1VjVN3G8eFSzuaE,2350
|
6
|
-
mbxai/mcp/server.py,sha256=
|
6
|
+
mbxai/mcp/server.py,sha256=kYErSSCh__6Fe5hanBCrgYbtT-5rcjTrP356d2EjuVQ,3463
|
7
7
|
mbxai/openrouter/__init__.py,sha256=Ito9Qp_B6q-RLGAQcYyTJVWwR2YAZvNqE-HIYXxhtD8,298
|
8
8
|
mbxai/openrouter/client.py,sha256=XLRMRNRJH96Jl6_af0KkzRDdLJnixh8I3RvEEcFuXyg,10840
|
9
9
|
mbxai/openrouter/config.py,sha256=MTX_YHsFrM7JYqovJSkEF6JzVyIdajeI5Dja2CALH58,2874
|
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=
|
12
|
+
mbxai/tools/client.py,sha256=0JyWijPzXuyeYBzUuTWndxh9GGmJ0hrEsmLFmXbtD-Q,12978
|
13
13
|
mbxai/tools/example.py,sha256=1HgKK39zzUuwFbnp3f0ThyWVfA_8P28PZcTwaUw5K78,2232
|
14
14
|
mbxai/tools/types.py,sha256=fo5t9UbsHGynhA88vD_ecgDqL8iLvt2E1h1ym43Rrgk,745
|
15
|
-
mbxai-0.5.
|
16
|
-
mbxai-0.5.
|
17
|
-
mbxai-0.5.
|
18
|
-
mbxai-0.5.
|
15
|
+
mbxai-0.5.11.dist-info/METADATA,sha256=e5ZqNMVQfzDegWT_mQyCnd0WqrLsJ8L43Qi2eBuVSos,4108
|
16
|
+
mbxai-0.5.11.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
17
|
+
mbxai-0.5.11.dist-info/licenses/LICENSE,sha256=hEyhc4FxwYo3NQ40yNgZ7STqwVk-1_XcTXOnAPbGJAw,1069
|
18
|
+
mbxai-0.5.11.dist-info/RECORD,,
|
File without changes
|
File without changes
|