alita-sdk 0.3.431__py3-none-any.whl → 0.3.433__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.

Potentially problematic release.


This version of alita-sdk might be problematic. Click here for more details.

@@ -346,7 +346,20 @@ class McpToolkit(BaseToolkit):
346
346
  if response.status_code != 200:
347
347
  raise Exception(f"HTTP {response.status_code}: {response.text}")
348
348
 
349
- data = response.json()
349
+ # Check content type and parse accordingly
350
+ content_type = response.headers.get('Content-Type', '')
351
+
352
+ if 'text/event-stream' in content_type:
353
+ # Parse SSE (Server-Sent Events) format
354
+ data = cls._parse_sse_response(response.text)
355
+ elif 'application/json' in content_type:
356
+ # Parse regular JSON
357
+ try:
358
+ data = response.json()
359
+ except ValueError as json_err:
360
+ raise Exception(f"Invalid JSON response: {json_err}. Response text: {response.text[:200]}")
361
+ else:
362
+ raise Exception(f"Unexpected Content-Type: {content_type}. Response: {response.text[:200]}")
350
363
 
351
364
  if "error" in data:
352
365
  raise Exception(f"MCP Error: {data['error']}")
@@ -361,6 +374,30 @@ class McpToolkit(BaseToolkit):
361
374
  logger.error(f"Failed to discover tools from MCP toolkit '{toolkit_name}': {e}")
362
375
  raise
363
376
 
377
+ @staticmethod
378
+ def _parse_sse_response(sse_text: str) -> Dict[str, Any]:
379
+ """
380
+ Parse Server-Sent Events (SSE) format response.
381
+ SSE format: event: message\ndata: {json}\n\n
382
+ """
383
+ import json
384
+
385
+ lines = sse_text.strip().split('\n')
386
+ data_line = None
387
+
388
+ for line in lines:
389
+ if line.startswith('data:'):
390
+ data_line = line[5:].strip() # Remove 'data:' prefix
391
+ break
392
+
393
+ if not data_line:
394
+ raise Exception(f"No data found in SSE response: {sse_text[:200]}")
395
+
396
+ try:
397
+ return json.loads(data_line)
398
+ except json.JSONDecodeError as e:
399
+ raise Exception(f"Failed to parse SSE data as JSON: {e}. Data: {data_line[:200]}")
400
+
364
401
  @classmethod
365
402
  def _create_tool_from_dict(
366
403
  cls,
@@ -65,21 +65,17 @@ class McpInspectTool(BaseTool):
65
65
  def _run(self, resource_type: str = "all") -> str:
66
66
  """Inspect the MCP server for available resources."""
67
67
  try:
68
- # Run the async inspection
69
- loop = asyncio.get_event_loop()
70
- if loop.is_running():
71
- # If we're in an async context, we need to create a new event loop
72
- import concurrent.futures
73
- with concurrent.futures.ThreadPoolExecutor() as executor:
74
- future = executor.submit(self._run_async_inspection, resource_type)
75
- return future.result(timeout=self.timeout)
76
- else:
77
- return loop.run_until_complete(self._run_async_inspection(resource_type))
68
+ # Always create a new event loop for sync context
69
+ # This avoids issues with existing event loops in threads
70
+ import concurrent.futures
71
+ with concurrent.futures.ThreadPoolExecutor() as executor:
72
+ future = executor.submit(self._run_in_new_loop, resource_type)
73
+ return future.result(timeout=self.timeout)
78
74
  except Exception as e:
79
75
  logger.error(f"Error inspecting MCP server '{self.server_name}': {e}")
80
76
  return f"Error inspecting MCP server: {e}"
81
77
 
82
- def _run_async_inspection(self, resource_type: str) -> str:
78
+ def _run_in_new_loop(self, resource_type: str) -> str:
83
79
  """Run the async inspection in a new event loop."""
84
80
  return asyncio.run(self._inspect_server(resource_type))
85
81
 
@@ -123,6 +119,15 @@ class McpInspectTool(BaseTool):
123
119
 
124
120
  return self._format_results(results, resource_type)
125
121
 
122
+ def _parse_sse(self, text: str) -> Dict[str, Any]:
123
+ """Parse Server-Sent Events (SSE) format response."""
124
+ for line in text.split('\n'):
125
+ line = line.strip()
126
+ if line.startswith('data:'):
127
+ json_str = line[5:].strip()
128
+ return json.loads(json_str)
129
+ raise ValueError("No data found in SSE response")
130
+
126
131
  async def _list_tools(self, session: aiohttp.ClientSession) -> Dict[str, Any]:
127
132
  """List available tools from the MCP server."""
128
133
  request = {
@@ -132,13 +137,24 @@ class McpInspectTool(BaseTool):
132
137
  "params": {}
133
138
  }
134
139
 
135
- headers = {"Content-Type": "application/json", **self.server_headers}
140
+ headers = {
141
+ "Content-Type": "application/json",
142
+ "Accept": "application/json, text/event-stream",
143
+ **self.server_headers
144
+ }
136
145
 
137
146
  async with session.post(self.server_url, json=request, headers=headers) as response:
138
147
  if response.status != 200:
139
148
  raise Exception(f"HTTP {response.status}: {await response.text()}")
140
149
 
141
- data = await response.json()
150
+ # Handle both JSON and SSE responses
151
+ content_type = response.headers.get('Content-Type', '')
152
+ if 'text/event-stream' in content_type:
153
+ # Parse SSE format
154
+ text = await response.text()
155
+ data = self._parse_sse(text)
156
+ else:
157
+ data = await response.json()
142
158
 
143
159
  if "error" in data:
144
160
  raise Exception(f"MCP Error: {data['error']}")
@@ -154,13 +170,23 @@ class McpInspectTool(BaseTool):
154
170
  "params": {}
155
171
  }
156
172
 
157
- headers = {"Content-Type": "application/json", **self.server_headers}
173
+ headers = {
174
+ "Content-Type": "application/json",
175
+ "Accept": "application/json, text/event-stream",
176
+ **self.server_headers
177
+ }
158
178
 
159
179
  async with session.post(self.server_url, json=request, headers=headers) as response:
160
180
  if response.status != 200:
161
181
  raise Exception(f"HTTP {response.status}: {await response.text()}")
162
182
 
163
- data = await response.json()
183
+ # Handle both JSON and SSE responses
184
+ content_type = response.headers.get('Content-Type', '')
185
+ if 'text/event-stream' in content_type:
186
+ text = await response.text()
187
+ data = self._parse_sse(text)
188
+ else:
189
+ data = await response.json()
164
190
 
165
191
  if "error" in data:
166
192
  raise Exception(f"MCP Error: {data['error']}")
@@ -176,13 +202,23 @@ class McpInspectTool(BaseTool):
176
202
  "params": {}
177
203
  }
178
204
 
179
- headers = {"Content-Type": "application/json", **self.server_headers}
205
+ headers = {
206
+ "Content-Type": "application/json",
207
+ "Accept": "application/json, text/event-stream",
208
+ **self.server_headers
209
+ }
180
210
 
181
211
  async with session.post(self.server_url, json=request, headers=headers) as response:
182
212
  if response.status != 200:
183
213
  raise Exception(f"HTTP {response.status}: {await response.text()}")
184
214
 
185
- data = await response.json()
215
+ # Handle both JSON and SSE responses
216
+ content_type = response.headers.get('Content-Type', '')
217
+ if 'text/event-stream' in content_type:
218
+ text = await response.text()
219
+ data = self._parse_sse(text)
220
+ else:
221
+ data = await response.json()
186
222
 
187
223
  if "error" in data:
188
224
  raise Exception(f"MCP Error: {data['error']}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.431
3
+ Version: 0.3.433
4
4
  Summary: SDK for building langchain agents using resources from Alita
5
5
  Author-email: Artem Rozumenko <artyom.rozumenko@gmail.com>, Mikalai Biazruchka <mikalai_biazruchka@epam.com>, Roman Mitusov <roman_mitusov@epam.com>, Ivan Krakhmaliuk <lifedj27@gmail.com>, Artem Dubrovskiy <ad13box@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -103,7 +103,7 @@ alita_sdk/runtime/toolkits/application.py,sha256=HHAKgwKOckxc7EQG-AV7rz4POOzQJKF
103
103
  alita_sdk/runtime/toolkits/artifact.py,sha256=YChNCX4QhVpaQG7Jk4TS-Wl0Aruc4slQ2K21zh9nNO0,3176
104
104
  alita_sdk/runtime/toolkits/configurations.py,sha256=kIDAlnryPQfbZyFxV-9SzN2-Vefzx06TX1BBdIIpN90,141
105
105
  alita_sdk/runtime/toolkits/datasource.py,sha256=qk78OdPoReYPCWwahfkKLbKc4pfsu-061oXRryFLP6I,2498
106
- alita_sdk/runtime/toolkits/mcp.py,sha256=BcXNhsAs92lgu-ApMu__C6COc60CR9OqkuAviPTPVCw,25256
106
+ alita_sdk/runtime/toolkits/mcp.py,sha256=5fdmY5s5lfw4NieovFYr0C9STiCHGFuOtAZ1uFKaj0U,26764
107
107
  alita_sdk/runtime/toolkits/prompt.py,sha256=WIpTkkVYWqIqOWR_LlSWz3ug8uO9tm5jJ7aZYdiGRn0,1192
108
108
  alita_sdk/runtime/toolkits/subgraph.py,sha256=wwUK8JjPXkGzyVZ3tAukmvST6eGbqx_U11rpnmbrvtg,2105
109
109
  alita_sdk/runtime/toolkits/tools.py,sha256=YCTjrTJuwj2V2C8ZQqXhFvUbVr7NQcUHZlCQLLvoeGA,10946
@@ -121,7 +121,7 @@ alita_sdk/runtime/tools/indexer_tool.py,sha256=whSLPevB4WD6dhh2JDXEivDmTvbjiMV1M
121
121
  alita_sdk/runtime/tools/llm.py,sha256=iRG_wU4T01LRsjEMPZe5Uah7LiMqDc-vspwkMuQtltk,16136
122
122
  alita_sdk/runtime/tools/loop.py,sha256=uds0WhZvwMxDVFI6MZHrcmMle637cQfBNg682iLxoJA,8335
123
123
  alita_sdk/runtime/tools/loop_output.py,sha256=U4hO9PCQgWlXwOq6jdmCGbegtAxGAPXObSxZQ3z38uk,8069
124
- alita_sdk/runtime/tools/mcp_inspect_tool.py,sha256=EW81_XlXX5C4lxT-gHMehHcZhtbuG-8DQzo0NuDkCA4,10160
124
+ alita_sdk/runtime/tools/mcp_inspect_tool.py,sha256=38X8euaxDbEGjcfp6ElvExZalpZun6QEr6ZEW4nU5pQ,11496
125
125
  alita_sdk/runtime/tools/mcp_server_tool.py,sha256=y6y0j3JeUajNatpsLVJfP0JEknhlRcDRJ0PlJ3Ch8fA,6626
126
126
  alita_sdk/runtime/tools/pgvector_search.py,sha256=NN2BGAnq4SsDHIhUcFZ8d_dbEOM8QwB0UwpsWCYruXU,11692
127
127
  alita_sdk/runtime/tools/prompt.py,sha256=nJafb_e5aOM1Rr3qGFCR-SKziU9uCsiP2okIMs9PppM,741
@@ -358,8 +358,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
358
358
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0ne8XLJEQSLOWfzd2HdnqOYmQlUliKHbBED5kW_Vias,2895
359
359
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
360
360
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
361
- alita_sdk-0.3.431.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
362
- alita_sdk-0.3.431.dist-info/METADATA,sha256=x-p6VpEH5cOUrBEOW-cES2TON6nVbBSuQny5aBsWTAQ,19071
363
- alita_sdk-0.3.431.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
364
- alita_sdk-0.3.431.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
365
- alita_sdk-0.3.431.dist-info/RECORD,,
361
+ alita_sdk-0.3.433.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
362
+ alita_sdk-0.3.433.dist-info/METADATA,sha256=EIfa8_iHpAyNV8f5hADnzfRQEKDglXU7--aHZ8qxcxU,19071
363
+ alita_sdk-0.3.433.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
364
+ alita_sdk-0.3.433.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
365
+ alita_sdk-0.3.433.dist-info/RECORD,,