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

@@ -0,0 +1,347 @@
1
+ """
2
+ MCP SSE (Server-Sent Events) Client
3
+ Handles persistent SSE connections for MCP servers like Atlassian
4
+ """
5
+ import asyncio
6
+ import json
7
+ import logging
8
+ from typing import Dict, Any, Optional, AsyncIterator
9
+ import aiohttp
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class McpSseClient:
15
+ """
16
+ Client for MCP servers using SSE (Server-Sent Events) transport.
17
+
18
+ For Atlassian-style SSE (dual-connection model):
19
+ - GET request opens persistent SSE stream for receiving events
20
+ - POST requests send commands (return 202 Accepted immediately)
21
+ - Responses come via the GET stream
22
+
23
+ This client handles:
24
+ - Opening persistent SSE connection via GET
25
+ - Sending JSON-RPC requests via POST
26
+ - Reading SSE event streams
27
+ - Matching responses to requests by ID
28
+ """
29
+
30
+ def __init__(self, url: str, session_id: str, headers: Optional[Dict[str, str]] = None, timeout: int = 300):
31
+ """
32
+ Initialize SSE client.
33
+
34
+ Args:
35
+ url: Base URL of the MCP SSE server
36
+ session_id: Client-generated UUID for session
37
+ headers: Additional headers (e.g., Authorization)
38
+ timeout: Request timeout in seconds
39
+ """
40
+ self.url = url
41
+ self.session_id = session_id
42
+ self.headers = headers or {}
43
+ self.timeout = timeout
44
+ self.url_with_session = f"{url}?sessionId={session_id}"
45
+ self._stream_task = None
46
+ self._pending_requests = {} # request_id -> asyncio.Future
47
+ self._stream_session = None
48
+ self._stream_response = None
49
+ self._endpoint_ready = asyncio.Event() # Signal when endpoint is received
50
+
51
+ logger.info(f"[MCP SSE Client] Initialized for {url} with session {session_id}")
52
+
53
+ async def _ensure_stream_connected(self):
54
+ """Ensure the GET stream is connected and reading events."""
55
+ if self._stream_task is None or self._stream_task.done():
56
+ logger.info(f"[MCP SSE Client] Opening persistent SSE stream...")
57
+ self._stream_session = aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=None))
58
+
59
+ headers = {
60
+ "Accept": "text/event-stream",
61
+ **self.headers
62
+ }
63
+
64
+ self._stream_response = await self._stream_session.get(self.url_with_session, headers=headers)
65
+
66
+ logger.info(f"[MCP SSE Client] Stream opened: status={self._stream_response.status}")
67
+
68
+ if self._stream_response.status != 200:
69
+ error_text = await self._stream_response.text()
70
+ raise Exception(f"Failed to open SSE stream: HTTP {self._stream_response.status}: {error_text}")
71
+
72
+ # Start background task to read stream
73
+ self._stream_task = asyncio.create_task(self._read_stream())
74
+
75
+ async def _read_stream(self):
76
+ """Background task that continuously reads the SSE stream."""
77
+ logger.info(f"[MCP SSE Client] Starting stream reader...")
78
+
79
+ try:
80
+ buffer = ""
81
+ current_event = {}
82
+
83
+ async for chunk in self._stream_response.content.iter_chunked(1024):
84
+ chunk_str = chunk.decode('utf-8')
85
+ buffer += chunk_str
86
+
87
+ # Process complete lines
88
+ while '\n' in buffer:
89
+ line, buffer = buffer.split('\n', 1)
90
+ line_str = line.strip()
91
+
92
+ # Empty line indicates end of event
93
+ if not line_str:
94
+ if current_event and 'data' in current_event:
95
+ self._process_event(current_event)
96
+ current_event = {}
97
+ continue
98
+
99
+ # Parse SSE fields
100
+ if line_str.startswith('event:'):
101
+ current_event['event'] = line_str[6:].strip()
102
+ elif line_str.startswith('data:'):
103
+ data_str = line_str[5:].strip()
104
+ current_event['data'] = data_str
105
+ elif line_str.startswith('id:'):
106
+ current_event['id'] = line_str[3:].strip()
107
+
108
+ except Exception as e:
109
+ logger.error(f"[MCP SSE Client] Stream reader error: {e}")
110
+ # Fail all pending requests
111
+ for future in self._pending_requests.values():
112
+ if not future.done():
113
+ future.set_exception(e)
114
+ finally:
115
+ logger.info(f"[MCP SSE Client] Stream reader stopped")
116
+
117
+ def _process_event(self, event: Dict[str, str]):
118
+ """Process a complete SSE event."""
119
+ event_type = event.get('event', 'message')
120
+ data_str = event.get('data', '')
121
+
122
+ # Handle 'endpoint' event - server provides the actual session URL to use
123
+ if event_type == 'endpoint':
124
+ # Extract session ID from endpoint URL
125
+ # Format: /v1/sse?sessionId=<uuid>
126
+ if 'sessionId=' in data_str:
127
+ new_session_id = data_str.split('sessionId=')[1].split('&')[0]
128
+ logger.info(f"[MCP SSE Client] Server provided session ID: {new_session_id}")
129
+ self.session_id = new_session_id
130
+ self.url_with_session = f"{self.url}?sessionId={new_session_id}"
131
+ self._endpoint_ready.set() # Signal that we can now send requests
132
+ return
133
+
134
+ # Skip other non-message events
135
+ if event_type != 'message' and not data_str.startswith('{'):
136
+ return
137
+
138
+ if not data_str:
139
+ return
140
+
141
+ try:
142
+ data = json.loads(data_str)
143
+ request_id = data.get('id')
144
+
145
+ logger.debug(f"[MCP SSE Client] Received response for request {request_id}")
146
+
147
+ # Resolve pending request
148
+ if request_id and request_id in self._pending_requests:
149
+ future = self._pending_requests.pop(request_id)
150
+ if not future.done():
151
+ future.set_result(data)
152
+
153
+ except json.JSONDecodeError as e:
154
+ logger.warning(f"[MCP SSE Client] Failed to parse SSE data: {e}, data: {repr(data_str)[:200]}")
155
+
156
+ except Exception as e:
157
+ logger.error(f"[MCP SSE Client] Stream reader error: {e}")
158
+ # Fail all pending requests
159
+ for future in self._pending_requests.values():
160
+ if not future.done():
161
+ future.set_exception(e)
162
+ finally:
163
+ logger.info(f"[MCP SSE Client] Stream reader stopped")
164
+
165
+ async def send_request(self, method: str, params: Optional[Dict[str, Any]] = None, request_id: Optional[str] = None) -> Dict[str, Any]:
166
+ """
167
+ Send a JSON-RPC request and wait for response via SSE stream.
168
+
169
+ Uses dual-connection model:
170
+ 1. GET stream is kept open to receive responses
171
+ 2. POST request sends the command (returns 202 immediately)
172
+ 3. Response comes via the GET stream
173
+
174
+ Args:
175
+ method: JSON-RPC method name (e.g., "tools/list", "tools/call")
176
+ params: Method parameters
177
+ request_id: Optional request ID (auto-generated if not provided)
178
+
179
+ Returns:
180
+ Parsed JSON-RPC response
181
+
182
+ Raises:
183
+ Exception: If request fails or times out
184
+ """
185
+ import time
186
+ if request_id is None:
187
+ request_id = f"{method.replace('/', '_')}_{int(time.time() * 1000)}"
188
+
189
+ request = {
190
+ "jsonrpc": "2.0",
191
+ "id": request_id,
192
+ "method": method,
193
+ "params": params or {}
194
+ }
195
+
196
+ logger.debug(f"[MCP SSE Client] Sending request: {method} (id={request_id})")
197
+
198
+ # Ensure stream is connected
199
+ await self._ensure_stream_connected()
200
+
201
+ # Wait for endpoint event (server provides the actual session ID to use)
202
+ await asyncio.wait_for(self._endpoint_ready.wait(), timeout=10)
203
+
204
+ # Create future for this request
205
+ future = asyncio.Future()
206
+ self._pending_requests[request_id] = future
207
+
208
+ # Send POST request
209
+ headers = {
210
+ "Content-Type": "application/json",
211
+ **self.headers
212
+ }
213
+
214
+ timeout = aiohttp.ClientTimeout(total=30)
215
+
216
+ try:
217
+ async with aiohttp.ClientSession(timeout=timeout) as session:
218
+ async with session.post(self.url_with_session, json=request, headers=headers) as response:
219
+ if response.status == 404:
220
+ error_text = await response.text()
221
+ raise Exception(f"HTTP 404: {error_text}")
222
+
223
+ # 202 is expected - response will come via stream
224
+ if response.status not in [200, 202]:
225
+ error_text = await response.text()
226
+ raise Exception(f"HTTP {response.status}: {error_text}")
227
+
228
+ # Wait for response from stream (with timeout)
229
+ result = await asyncio.wait_for(future, timeout=self.timeout)
230
+
231
+ # Check for JSON-RPC error
232
+ if 'error' in result:
233
+ error = result['error']
234
+ raise Exception(f"MCP Error: {error.get('message', str(error))}")
235
+
236
+ return result
237
+
238
+ except asyncio.TimeoutError:
239
+ self._pending_requests.pop(request_id, None)
240
+ logger.error(f"[MCP SSE Client] Request timeout after {self.timeout}s")
241
+ raise Exception(f"SSE request timeout after {self.timeout}s")
242
+ except Exception as e:
243
+ self._pending_requests.pop(request_id, None)
244
+ logger.error(f"[MCP SSE Client] Request failed: {e}")
245
+ raise
246
+
247
+ async def close(self):
248
+ """Close the persistent SSE stream."""
249
+ logger.info(f"[MCP SSE Client] Closing connection...")
250
+
251
+ if self._stream_task and not self._stream_task.done():
252
+ self._stream_task.cancel()
253
+ try:
254
+ await self._stream_task
255
+ except asyncio.CancelledError:
256
+ pass
257
+
258
+ if self._stream_response:
259
+ self._stream_response.close()
260
+
261
+ if self._stream_session:
262
+ await self._stream_session.close()
263
+
264
+ logger.info(f"[MCP SSE Client] Connection closed")
265
+
266
+ async def __aenter__(self):
267
+ """Async context manager entry."""
268
+ return self
269
+
270
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
271
+ """Async context manager exit."""
272
+ await self.close()
273
+
274
+ async def initialize(self) -> Dict[str, Any]:
275
+ """
276
+ Send initialize request to establish MCP protocol session.
277
+
278
+ Returns:
279
+ Server capabilities and info
280
+ """
281
+ response = await self.send_request(
282
+ method="initialize",
283
+ params={
284
+ "protocolVersion": "2024-11-05",
285
+ "capabilities": {
286
+ "roots": {"listChanged": True},
287
+ "sampling": {}
288
+ },
289
+ "clientInfo": {
290
+ "name": "Alita MCP Client",
291
+ "version": "1.0.0"
292
+ }
293
+ }
294
+ )
295
+
296
+ logger.info(f"[MCP SSE Client] MCP session initialized")
297
+ return response.get('result', {})
298
+
299
+ async def list_tools(self) -> list:
300
+ """
301
+ Discover available tools from the MCP server.
302
+
303
+ Returns:
304
+ List of tool definitions
305
+ """
306
+ response = await self.send_request(method="tools/list")
307
+ result = response.get('result', {})
308
+ tools = result.get('tools', [])
309
+
310
+ logger.info(f"[MCP SSE Client] Discovered {len(tools)} tools")
311
+ return tools
312
+
313
+ async def list_prompts(self) -> list:
314
+ """
315
+ Discover available prompts from the MCP server.
316
+
317
+ Returns:
318
+ List of prompt definitions
319
+ """
320
+ response = await self.send_request(method="prompts/list")
321
+ result = response.get('result', {})
322
+ prompts = result.get('prompts', [])
323
+
324
+ logger.debug(f"[MCP SSE Client] Discovered {len(prompts)} prompts")
325
+ return prompts
326
+
327
+ async def call_tool(self, tool_name: str, arguments: Dict[str, Any]) -> Any:
328
+ """
329
+ Execute a tool on the MCP server.
330
+
331
+ Args:
332
+ tool_name: Name of the tool to call
333
+ arguments: Tool arguments
334
+
335
+ Returns:
336
+ Tool execution result
337
+ """
338
+ response = await self.send_request(
339
+ method="tools/call",
340
+ params={
341
+ "name": tool_name,
342
+ "arguments": arguments
343
+ }
344
+ )
345
+
346
+ result = response.get('result', {})
347
+ return result
@@ -29,13 +29,14 @@ def instantiate_toolkit_with_client(toolkit_config: Dict[str, Any],
29
29
 
30
30
  Raises:
31
31
  ValueError: If required configuration or client is missing
32
+ McpAuthorizationRequired: If MCP server requires OAuth authorization
32
33
  Exception: If toolkit instantiation fails
33
34
  """
35
+ toolkit_name = toolkit_config.get('toolkit_name', 'unknown')
34
36
  try:
35
37
  from ..toolkits.tools import get_tools
36
38
 
37
- toolkit_name = toolkit_config.get('toolkit_name')
38
- if not toolkit_name:
39
+ if not toolkit_name or toolkit_name == 'unknown':
39
40
  raise ValueError("toolkit_name is required in configuration")
40
41
 
41
42
  if not llm_client:
@@ -70,6 +71,12 @@ def instantiate_toolkit_with_client(toolkit_config: Dict[str, Any],
70
71
  return tools
71
72
 
72
73
  except Exception as e:
74
+ # Re-raise McpAuthorizationRequired without logging as error
75
+ from ..utils.mcp_oauth import McpAuthorizationRequired
76
+ if isinstance(e, McpAuthorizationRequired):
77
+ logger.info(f"Toolkit {toolkit_name} requires MCP OAuth authorization")
78
+ raise
79
+ # Log and re-raise other errors
73
80
  logger.error(f"Error instantiating toolkit {toolkit_name} with client: {str(e)}")
74
81
  raise
75
82
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.435
3
+ Version: 0.3.449
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
@@ -24,6 +24,7 @@ Requires-Dist: fastapi==0.115.9
24
24
  Requires-Dist: httpcore==1.0.7
25
25
  Requires-Dist: urllib3>=2
26
26
  Requires-Dist: certifi==2024.8.30
27
+ Requires-Dist: aiohttp>=3.9.0
27
28
  Provides-Extra: runtime
28
29
  Requires-Dist: streamlit>=1.28.0; extra == "runtime"
29
30
  Requires-Dist: langchain_core<0.4.0,>=0.3.76; extra == "runtime"
@@ -36,14 +36,14 @@ alita_sdk/configurations/zephyr_essential.py,sha256=TiZedsBlfIDroflipvoqxjJeEWPo
36
36
  alita_sdk/runtime/__init__.py,sha256=4W0UF-nl3QF2bvET5lnah4o24CoTwSoKXhuN0YnwvEE,828
37
37
  alita_sdk/runtime/clients/__init__.py,sha256=BdehU5GBztN1Qi1Wul0cqlU46FxUfMnI6Vq2Zd_oq1M,296
38
38
  alita_sdk/runtime/clients/artifact.py,sha256=b7hVuGRROt6qUcT11uAZqzJqslzmlgW-Y6oGsiwNmjI,4029
39
- alita_sdk/runtime/clients/client.py,sha256=8Ch-2wGB6pDT2fexABuZgk5XW4aoO35TPSfezgwVdSQ,46267
39
+ alita_sdk/runtime/clients/client.py,sha256=trgvD6vzOqepn29ks0i1ALKigdVxiBinaJiOi-ejNb0,47754
40
40
  alita_sdk/runtime/clients/datasource.py,sha256=HAZovoQN9jBg0_-lIlGBQzb4FJdczPhkHehAiVG3Wx0,1020
41
41
  alita_sdk/runtime/clients/mcp_discovery.py,sha256=aFJ0wYQ8EAmXa9qLUusHZfQXkNec1wbgkqHdVeSFX-g,11697
42
42
  alita_sdk/runtime/clients/mcp_manager.py,sha256=DRbqiO761l7UgOdv_keHbD2g0oZodtPHejpArXYZIoE,9050
43
43
  alita_sdk/runtime/clients/prompt.py,sha256=li1RG9eBwgNK_Qf0qUaZ8QNTmsncFrAL2pv3kbxZRZg,1447
44
44
  alita_sdk/runtime/clients/sandbox_client.py,sha256=kGOGfm3OAFmYeTM4bIuKbhRsOiOhF0M1q8takBe-sWY,16637
45
45
  alita_sdk/runtime/langchain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- alita_sdk/runtime/langchain/assistant.py,sha256=qKoEjbGuUnX-OZDHmSaK3plb1jON9unzEwAjxBT9DY8,16044
46
+ alita_sdk/runtime/langchain/assistant.py,sha256=t93SNBcdki59gvW_Osl68E-x0ohcO2z32jtR8nqEaRI,16201
47
47
  alita_sdk/runtime/langchain/chat_message_template.py,sha256=kPz8W2BG6IMyITFDA5oeb5BxVRkHEVZhuiGl4MBZKdc,2176
48
48
  alita_sdk/runtime/langchain/constants.py,sha256=oiEHg1h_IYUA5NE8O6nEF24hpxahi9BTvJWrkXjbVcU,3405
49
49
  alita_sdk/runtime/langchain/indexer.py,sha256=0ENHy5EOhThnAiYFc7QAsaTNp9rr8hDV_hTK8ahbatk,37592
@@ -97,16 +97,16 @@ alita_sdk/runtime/langchain/tools/bdd_parser/feature_types.py,sha256=l3AdjSQnNv1
97
97
  alita_sdk/runtime/langchain/tools/bdd_parser/parser.py,sha256=1H1Nd_OH5Wx8A5YV1zUghBxo613yPptZ7fqNo8Eg48M,17289
98
98
  alita_sdk/runtime/llms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
99
  alita_sdk/runtime/llms/preloaded.py,sha256=3AaUbZK3d8fvxAQMjR3ftOoYa0SnkCOL1EvdvDCXIHE,11321
100
- alita_sdk/runtime/models/mcp_models.py,sha256=OdeDsKvB43auvTS1F3O2VBLd1dwe_7zCkhZZjFbICpw,2152
100
+ alita_sdk/runtime/models/mcp_models.py,sha256=rbWCAtF8Jjb7uNgQHhVWyDttXaqPNbRLL087Lf0AjNU,2301
101
101
  alita_sdk/runtime/toolkits/__init__.py,sha256=IenSyI2SrXSFuiWT7c8YO_mRFLVE_zNge61U4bpoyPw,631
102
102
  alita_sdk/runtime/toolkits/application.py,sha256=HHAKgwKOckxc7EQG-AV7rz4POOzQJKFRr7AGEjmLudE,2688
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=MnsvXHRbEIE_8O_qPtsGaW3ZiwSOeWUGYVCZGbHLH1E,31402
106
+ alita_sdk/runtime/toolkits/mcp.py,sha256=5_yapJm8qcv-8aI0TsK8ER9PIBhK_azUhDw4tPV3MLA,36957
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
- alita_sdk/runtime/toolkits/tools.py,sha256=YCTjrTJuwj2V2C8ZQqXhFvUbVr7NQcUHZlCQLLvoeGA,10946
109
+ alita_sdk/runtime/toolkits/tools.py,sha256=74R0SadMiUJFUe3U5_PJcxzw5m1KMMBiVfVeiowZK6I,13434
110
110
  alita_sdk/runtime/toolkits/vectorstore.py,sha256=BGppQADa1ZiLO17fC0uCACTTEvPHlodEDYEzUcBRbAA,2901
111
111
  alita_sdk/runtime/tools/__init__.py,sha256=Fx7iHqkzA90-KfjdcUUzMUI_7kDarjuTsSpSzOW2pN0,568
112
112
  alita_sdk/runtime/tools/agent.py,sha256=m98QxOHwnCRTT9j18Olbb5UPS8-ZGeQaGiUyZJSyFck,3162
@@ -122,7 +122,8 @@ alita_sdk/runtime/tools/llm.py,sha256=iRG_wU4T01LRsjEMPZe5Uah7LiMqDc-vspwkMuQtlt
122
122
  alita_sdk/runtime/tools/loop.py,sha256=uds0WhZvwMxDVFI6MZHrcmMle637cQfBNg682iLxoJA,8335
123
123
  alita_sdk/runtime/tools/loop_output.py,sha256=U4hO9PCQgWlXwOq6jdmCGbegtAxGAPXObSxZQ3z38uk,8069
124
124
  alita_sdk/runtime/tools/mcp_inspect_tool.py,sha256=38X8euaxDbEGjcfp6ElvExZalpZun6QEr6ZEW4nU5pQ,11496
125
- alita_sdk/runtime/tools/mcp_server_tool.py,sha256=HPlEppCbNafee41wSxZL1wnVyYCiOwdMD_dy0eE9IUs,7505
125
+ alita_sdk/runtime/tools/mcp_remote_tool.py,sha256=Bpgu5r97QzDvNert8Vv424DlolMR0rXsac3Qrg2iAig,7059
126
+ alita_sdk/runtime/tools/mcp_server_tool.py,sha256=-xO3H6BM63KaIV1CdcQKPVE0WPigiqOgFZDX7m2_yGs,4419
126
127
  alita_sdk/runtime/tools/pgvector_search.py,sha256=NN2BGAnq4SsDHIhUcFZ8d_dbEOM8QwB0UwpsWCYruXU,11692
127
128
  alita_sdk/runtime/tools/prompt.py,sha256=nJafb_e5aOM1Rr3qGFCR-SKziU9uCsiP2okIMs9PppM,741
128
129
  alita_sdk/runtime/tools/router.py,sha256=p7e0tX6YAWw2M2Nq0A_xqw1E2P-Xz1DaJvhUstfoZn4,1584
@@ -135,10 +136,12 @@ alita_sdk/runtime/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
135
136
  alita_sdk/runtime/utils/constants.py,sha256=Xntx1b_uxUzT4clwqHA_U6K8y5bBqf_4lSQwXdcWrp4,13586
136
137
  alita_sdk/runtime/utils/evaluate.py,sha256=iM1P8gzBLHTuSCe85_Ng_h30m52hFuGuhNXJ7kB1tgI,1872
137
138
  alita_sdk/runtime/utils/logging.py,sha256=svPyiW8ztDfhqHFITv5FBCj8UhLxz6hWcqGIY6wpJJE,3331
139
+ alita_sdk/runtime/utils/mcp_oauth.py,sha256=Ynoa_C_G5WXL_tlcdol2wBLgQauyvIPX0isCJKsvWMs,6151
140
+ alita_sdk/runtime/utils/mcp_sse_client.py,sha256=qGIrZb5udvR015zgrEGuQ0lm5SCdyikq_uCqdbtmJoc,13171
138
141
  alita_sdk/runtime/utils/save_dataframe.py,sha256=i-E1wp-t4wb17Zq3nA3xYwgSILjoXNizaQAA9opWvxY,1576
139
142
  alita_sdk/runtime/utils/streamlit.py,sha256=yIb4YIGH8HRAXZtZlywjxI07Xdcb5eUt7rMA-elFTdc,107261
140
143
  alita_sdk/runtime/utils/toolkit_runtime.py,sha256=MU63Fpxj0b5_r1IUUc0Q3-PN9VwL7rUxp2MRR4tmYR8,5136
141
- alita_sdk/runtime/utils/toolkit_utils.py,sha256=n11byeV6uLHAT7D8lPgIA0FE7tergbaRfbrwTWh5Twk,5447
144
+ alita_sdk/runtime/utils/toolkit_utils.py,sha256=_6cKy514v4ueIZynXTA8LwGC9Q447MfgrQKkDwDI4qM,5886
142
145
  alita_sdk/runtime/utils/utils.py,sha256=PJK8A-JVIzY1IowOjGG8DIqsIiEFe65qDKvFcjJCKWA,1041
143
146
  alita_sdk/tools/__init__.py,sha256=uQzvtnyOsgfdHl3pdo2LqK49Hb3SKFXDBXW_szN2R3k,10992
144
147
  alita_sdk/tools/base_indexer_toolkit.py,sha256=hK1Q2dvNctZCw2K1-khlQrR1Q0JDQviZjqDUiqpnazg,27180
@@ -358,8 +361,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
358
361
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0ne8XLJEQSLOWfzd2HdnqOYmQlUliKHbBED5kW_Vias,2895
359
362
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
360
363
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
361
- alita_sdk-0.3.435.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
362
- alita_sdk-0.3.435.dist-info/METADATA,sha256=kuNOhhnRzdqSLgYrM41t-qLOE62bgF6VE-0r9no-3Z0,19071
363
- alita_sdk-0.3.435.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
364
- alita_sdk-0.3.435.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
365
- alita_sdk-0.3.435.dist-info/RECORD,,
364
+ alita_sdk-0.3.449.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
365
+ alita_sdk-0.3.449.dist-info/METADATA,sha256=j40Je-U0sWlWyGWjTnHo1X22mdyv9Zcj2bWtmxw5CqU,19101
366
+ alita_sdk-0.3.449.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
367
+ alita_sdk-0.3.449.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
368
+ alita_sdk-0.3.449.dist-info/RECORD,,