mbxai 0.5.9__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 +120 -43
- {mbxai-0.5.9.dist-info → mbxai-0.5.11.dist-info}/METADATA +1 -1
- {mbxai-0.5.9.dist-info → mbxai-0.5.11.dist-info}/RECORD +7 -7
- {mbxai-0.5.9.dist-info → mbxai-0.5.11.dist-info}/WHEEL +0 -0
- {mbxai-0.5.9.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,33 +145,54 @@ 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}")
|
139
160
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
161
|
+
# Get a new response from the model with this tool result
|
162
|
+
response = self._client.chat_completion(
|
163
|
+
messages=messages,
|
164
|
+
model=model,
|
165
|
+
stream=stream,
|
166
|
+
**kwargs,
|
167
|
+
)
|
168
|
+
|
169
|
+
if stream:
|
170
|
+
return response
|
171
|
+
|
172
|
+
message = response.choices[0].message
|
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}")
|
192
|
+
|
193
|
+
# If there are no more tool calls, we're done
|
194
|
+
if not message.tool_calls:
|
195
|
+
return response
|
157
196
|
|
158
197
|
async def parse(
|
159
198
|
self,
|
@@ -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,31 +292,52 @@ 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}")
|
248
307
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
308
|
+
# Get a new response from the model with this tool result
|
309
|
+
response = self._client.chat_completion_parse(
|
310
|
+
messages=messages,
|
311
|
+
response_format=response_format,
|
312
|
+
model=model,
|
313
|
+
stream=stream,
|
314
|
+
**kwargs,
|
315
|
+
)
|
316
|
+
|
317
|
+
if stream:
|
318
|
+
return response
|
319
|
+
|
320
|
+
message = response.choices[0].message
|
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}")
|
340
|
+
|
341
|
+
# If there are no more tool calls, we're done
|
342
|
+
if not message.tool_calls:
|
343
|
+
return response
|
@@ -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
|