mbxai 0.5.7__py3-none-any.whl → 0.5.8__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/client.py +1 -23
- mbxai/mcp/server.py +1 -1
- mbxai/tools/client.py +11 -4
- {mbxai-0.5.7.dist-info → mbxai-0.5.8.dist-info}/METADATA +1 -1
- {mbxai-0.5.7.dist-info → mbxai-0.5.8.dist-info}/RECORD +8 -8
- {mbxai-0.5.7.dist-info → mbxai-0.5.8.dist-info}/WHEEL +0 -0
- {mbxai-0.5.7.dist-info → mbxai-0.5.8.dist-info}/licenses/LICENSE +0 -0
mbxai/__init__.py
CHANGED
mbxai/mcp/client.py
CHANGED
@@ -94,29 +94,7 @@ class MCPClient(ToolClient):
|
|
94
94
|
)
|
95
95
|
return response.json()
|
96
96
|
|
97
|
-
|
98
|
-
def sync_tool_function(**kwargs: Any) -> Any:
|
99
|
-
try:
|
100
|
-
# Try to get the current event loop
|
101
|
-
loop = asyncio.get_event_loop()
|
102
|
-
except RuntimeError:
|
103
|
-
# If no event loop exists, create a new one
|
104
|
-
loop = asyncio.new_event_loop()
|
105
|
-
asyncio.set_event_loop(loop)
|
106
|
-
|
107
|
-
# Check if we're already in an event loop
|
108
|
-
if loop.is_running():
|
109
|
-
# Create a new event loop for this call
|
110
|
-
new_loop = asyncio.new_event_loop()
|
111
|
-
try:
|
112
|
-
return new_loop.run_until_complete(tool_function(**kwargs))
|
113
|
-
finally:
|
114
|
-
new_loop.close()
|
115
|
-
else:
|
116
|
-
# Use the existing event loop
|
117
|
-
return loop.run_until_complete(tool_function(**kwargs))
|
118
|
-
|
119
|
-
return sync_tool_function
|
97
|
+
return tool_function
|
120
98
|
|
121
99
|
async def register_mcp_server(self, name: str, base_url: str) -> None:
|
122
100
|
"""Register an MCP server and load its tools."""
|
mbxai/mcp/server.py
CHANGED
mbxai/tools/client.py
CHANGED
@@ -4,6 +4,7 @@ ToolClient implementation for MBX AI.
|
|
4
4
|
|
5
5
|
from typing import Any, Callable, TypeVar, cast
|
6
6
|
import logging
|
7
|
+
import inspect
|
7
8
|
from pydantic import BaseModel
|
8
9
|
from ..openrouter import OpenRouterClient
|
9
10
|
from .types import Tool, ToolCall
|
@@ -48,7 +49,7 @@ class ToolClient:
|
|
48
49
|
self._tools[name] = tool
|
49
50
|
logger.debug(f"Registered tool: {name}")
|
50
51
|
|
51
|
-
def chat(
|
52
|
+
async def chat(
|
52
53
|
self,
|
53
54
|
messages: list[dict[str, Any]],
|
54
55
|
*,
|
@@ -120,7 +121,10 @@ class ToolClient:
|
|
120
121
|
|
121
122
|
# Call the tool
|
122
123
|
logger.debug(f"Calling tool {tool.name} with arguments: {arguments}")
|
123
|
-
|
124
|
+
if inspect.iscoroutinefunction(tool.function):
|
125
|
+
result = await tool.function(**arguments)
|
126
|
+
else:
|
127
|
+
result = tool.function(**arguments)
|
124
128
|
logger.debug(f"Tool result: {result}")
|
125
129
|
|
126
130
|
# Add the tool response to the messages
|
@@ -131,7 +135,7 @@ class ToolClient:
|
|
131
135
|
"content": str(result),
|
132
136
|
})
|
133
137
|
|
134
|
-
def parse(
|
138
|
+
async def parse(
|
135
139
|
self,
|
136
140
|
messages: list[dict[str, Any]],
|
137
141
|
response_format: type[T],
|
@@ -206,7 +210,10 @@ class ToolClient:
|
|
206
210
|
|
207
211
|
# Call the tool
|
208
212
|
logger.debug(f"Calling tool {tool.name} with arguments: {arguments}")
|
209
|
-
|
213
|
+
if inspect.iscoroutinefunction(tool.function):
|
214
|
+
result = await tool.function(**arguments)
|
215
|
+
else:
|
216
|
+
result = tool.function(**arguments)
|
210
217
|
logger.debug(f"Tool result: {result}")
|
211
218
|
|
212
219
|
# Add the tool response to the messages
|
@@ -1,18 +1,18 @@
|
|
1
|
-
mbxai/__init__.py,sha256=
|
1
|
+
mbxai/__init__.py,sha256=jr4xSHeJIuuil62QD7No_Ut6YGCpWh1LTDHPzlHTemE,47
|
2
2
|
mbxai/core.py,sha256=WMvmU9TTa7M_m-qWsUew4xH8Ul6xseCZ2iBCXJTW-Bs,196
|
3
3
|
mbxai/mcp/__init__.py,sha256=_ek9iYdYqW5saKetj4qDci11jxesQDiHPJRpHMKkxgU,175
|
4
|
-
mbxai/mcp/client.py,sha256=
|
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=c03723Fm1SmYJspMXnKPMQ_6bCQGOb2ssaHVg66iONA,3462
|
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=f5sXhh5p39wyYIMH6jZmAVEWkQkEnrcV6BMpj6jCPFA,8047
|
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.8.dist-info/METADATA,sha256=Hhj1q5xRwFddw0vpyoigoMQy4SLdi6CHXWIFs4t_c7c,4107
|
16
|
+
mbxai-0.5.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
17
|
+
mbxai-0.5.8.dist-info/licenses/LICENSE,sha256=hEyhc4FxwYo3NQ40yNgZ7STqwVk-1_XcTXOnAPbGJAw,1069
|
18
|
+
mbxai-0.5.8.dist-info/RECORD,,
|
File without changes
|
File without changes
|