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

@@ -303,7 +303,7 @@ class AlitaClient:
303
303
  app_type=None, memory=None, runtime='langchain',
304
304
  application_variables: Optional[dict] = None,
305
305
  version_details: Optional[dict] = None, store: Optional[BaseStore] = None,
306
- llm: Optional[ChatOpenAI] = None):
306
+ llm: Optional[ChatOpenAI] = None, mcp_tokens: Optional[dict] = None):
307
307
  if tools is None:
308
308
  tools = []
309
309
  if chat_history is None:
@@ -344,11 +344,11 @@ class AlitaClient:
344
344
  app_type = "react"
345
345
  if runtime == 'nonrunnable':
346
346
  return LangChainAssistant(self, data, llm, chat_history, app_type,
347
- tools=tools, memory=memory, store=store)
347
+ tools=tools, memory=memory, store=store, mcp_tokens=mcp_tokens)
348
348
  if runtime == 'langchain':
349
349
  return LangChainAssistant(self, data, llm,
350
350
  chat_history, app_type,
351
- tools=tools, memory=memory, store=store).runnable()
351
+ tools=tools, memory=memory, store=store, mcp_tokens=mcp_tokens).runnable()
352
352
  elif runtime == 'llama':
353
353
  raise NotImplementedError("LLama runtime is not supported")
354
354
 
@@ -568,7 +568,8 @@ class AlitaClient:
568
568
  def predict_agent(self, llm: ChatOpenAI, instructions: str = "You are a helpful assistant.",
569
569
  tools: Optional[list] = None, chat_history: Optional[List[Any]] = None,
570
570
  memory=None, runtime='langchain', variables: Optional[list] = None,
571
- store: Optional[BaseStore] = None, debug_mode: Optional[bool] = False):
571
+ store: Optional[BaseStore] = None, debug_mode: Optional[bool] = False,
572
+ mcp_tokens: Optional[dict] = None):
572
573
  """
573
574
  Create a predict-type agent with minimal configuration.
574
575
 
@@ -604,8 +605,17 @@ class AlitaClient:
604
605
  'tools': tools, # Tool configs that will be processed by get_tools()
605
606
  'variables': variables
606
607
  }
607
- return LangChainAssistant(self, agent_data, llm,
608
- chat_history, "predict", memory=memory, store=store, debug_mode=debug_mode).runnable()
608
+ return LangChainAssistant(
609
+ self,
610
+ agent_data,
611
+ llm,
612
+ chat_history,
613
+ "predict",
614
+ memory=memory,
615
+ store=store,
616
+ debug_mode=debug_mode,
617
+ mcp_tokens=mcp_tokens
618
+ ).runnable()
609
619
 
610
620
  def test_toolkit_tool(self, toolkit_config: dict, tool_name: str, tool_params: dict = None,
611
621
  runtime_config: dict = None, llm_model: str = None,
@@ -31,7 +31,8 @@ class Assistant:
31
31
  tools: Optional[list] = [],
32
32
  memory: Optional[Any] = None,
33
33
  store: Optional[BaseStore] = None,
34
- debug_mode: Optional[bool] = False):
34
+ debug_mode: Optional[bool] = False,
35
+ mcp_tokens: Optional[dict] = None):
35
36
 
36
37
  self.app_type = app_type
37
38
  self.memory = memory
@@ -89,7 +90,14 @@ class Assistant:
89
90
  for internal_tool_name in meta.get("internal_tools"):
90
91
  version_tools.append({"type": "internal_tool", "name": internal_tool_name})
91
92
 
92
- self.tools = get_tools(version_tools, alita_client=alita, llm=self.client, memory_store=self.store, debug_mode=debug_mode)
93
+ self.tools = get_tools(
94
+ version_tools,
95
+ alita_client=alita,
96
+ llm=self.client,
97
+ memory_store=self.store,
98
+ debug_mode=debug_mode,
99
+ mcp_tokens=mcp_tokens
100
+ )
93
101
  if tools:
94
102
  self.tools += tools
95
103
  # Handle prompt setup
@@ -17,6 +17,12 @@ from ..tools.mcp_remote_tool import McpRemoteTool
17
17
  from ..tools.mcp_inspect_tool import McpInspectTool
18
18
  from ...tools.utils import TOOLKIT_SPLITTER, clean_string
19
19
  from ..models.mcp_models import McpConnectionConfig
20
+ from ..utils.mcp_oauth import (
21
+ McpAuthorizationRequired,
22
+ canonical_resource,
23
+ extract_resource_metadata_url,
24
+ fetch_resource_metadata,
25
+ )
20
26
 
21
27
  logger = logging.getLogger(__name__)
22
28
 
@@ -409,6 +415,9 @@ class McpToolkit(BaseToolkit):
409
415
  logger.error(f"Discovery error details - URL: {connection_config.url}, Timeout: {timeout}s")
410
416
 
411
417
  # Fallback to static mode if available and not already static
418
+ if isinstance(e, McpAuthorizationRequired):
419
+ # Authorization is required; surface upstream so the caller can prompt the user
420
+ raise
412
421
  if client and discovery_mode != "static":
413
422
  logger.info(f"Falling back to static discovery for toolkit '{toolkit_name}'")
414
423
  tools = cls._create_tools_static(toolkit_name, selected_tools, timeout, client)
@@ -534,6 +543,19 @@ class McpToolkit(BaseToolkit):
534
543
  timeout=timeout
535
544
  )
536
545
 
546
+ auth_header = response.headers.get('WWW-Authenticate', '')
547
+ if response.status_code == 401:
548
+ resource_metadata_url = extract_resource_metadata_url(auth_header)
549
+ metadata = fetch_resource_metadata(resource_metadata_url, timeout=timeout) if resource_metadata_url else None
550
+ raise McpAuthorizationRequired(
551
+ message=f"MCP server {connection_config.url} requires OAuth authorization",
552
+ server_url=canonical_resource(connection_config.url),
553
+ resource_metadata_url=resource_metadata_url,
554
+ www_authenticate=auth_header,
555
+ resource_metadata=metadata,
556
+ status=response.status_code,
557
+ )
558
+
537
559
  if response.status_code != 200:
538
560
  logger.error(f"MCP server returned non-200 status: {response.status_code}")
539
561
  raise Exception(f"HTTP {response.status_code}: {response.text}")
@@ -918,4 +940,4 @@ def get_all_discovered_servers():
918
940
  """Get status of all discovered servers."""
919
941
  from ..clients.mcp_discovery import get_discovery_service
920
942
  service = get_discovery_service()
921
- return service.get_server_health()
943
+ return service.get_server_health()
@@ -19,6 +19,7 @@ from ..tools.image_generation import ImageGenerationToolkit
19
19
  # Import community tools
20
20
  from ...community import get_toolkits as community_toolkits, get_tools as community_tools
21
21
  from ...tools.memory import MemoryToolkit
22
+ from ..utils.mcp_oauth import canonical_resource
22
23
  from ...tools.utils import TOOLKIT_SPLITTER
23
24
 
24
25
  logger = logging.getLogger(__name__)
@@ -37,7 +38,7 @@ def get_toolkits():
37
38
  return core_toolkits + community_toolkits() + alita_toolkits()
38
39
 
39
40
 
40
- def get_tools(tools_list: list, alita_client, llm, memory_store: BaseStore = None, debug_mode: Optional[bool] = False) -> list:
41
+ def get_tools(tools_list: list, alita_client, llm, memory_store: BaseStore = None, debug_mode: Optional[bool] = False, mcp_tokens: Optional[dict] = None) -> list:
41
42
  prompts = []
42
43
  tools = []
43
44
 
@@ -109,10 +110,20 @@ def get_tools(tools_list: list, alita_client, llm, memory_store: BaseStore = Non
109
110
  toolkit_name=tool.get('toolkit_name', ''),
110
111
  **tool['settings']).get_tools())
111
112
  elif tool['type'] == 'mcp':
113
+ settings = dict(tool['settings'])
114
+ url = settings.get('url')
115
+ headers = settings.get('headers')
116
+ token = None
117
+ if mcp_tokens and url:
118
+ token = mcp_tokens.get(canonical_resource(url))
119
+ if token:
120
+ merged_headers = dict(headers) if headers else {}
121
+ merged_headers.setdefault('Authorization', f'Bearer {token}')
122
+ settings['headers'] = merged_headers
112
123
  tools.extend(McpToolkit.get_toolkit(
113
124
  toolkit_name=tool.get('toolkit_name', ''),
114
125
  client=alita_client,
115
- **tool['settings']).get_tools())
126
+ **settings).get_tools())
116
127
  except Exception as e:
117
128
  logger.error(f"Error initializing toolkit for tool '{tool.get('name', 'unknown')}': {e}", exc_info=True)
118
129
  if debug_mode:
@@ -13,6 +13,12 @@ from typing import Any, Dict, Optional
13
13
 
14
14
  from .mcp_server_tool import McpServerTool
15
15
  from pydantic import Field
16
+ from ..utils.mcp_oauth import (
17
+ McpAuthorizationRequired,
18
+ canonical_resource,
19
+ extract_resource_metadata_url,
20
+ fetch_resource_metadata_async,
21
+ )
16
22
 
17
23
  logger = logging.getLogger(__name__)
18
24
 
@@ -48,6 +54,9 @@ class McpRemoteTool(McpServerTool):
48
54
  with ThreadPoolExecutor() as executor:
49
55
  future = executor.submit(self._run_in_new_loop, kwargs)
50
56
  return future.result(timeout=self.tool_timeout_sec)
57
+ except McpAuthorizationRequired:
58
+ # Bubble up so LangChain can surface a tool error with useful metadata
59
+ raise
51
60
  except Exception as e:
52
61
  logger.error(f"Error executing remote MCP tool '{self.name}': {e}")
53
62
  return f"Error executing tool: {e}"
@@ -110,6 +119,25 @@ class McpRemoteTool(McpServerTool):
110
119
  logger.debug(f"Request: {json.dumps(mcp_request, indent=2)}")
111
120
 
112
121
  async with session.post(self.server_url, json=mcp_request, headers=headers) as response:
122
+ auth_header = response.headers.get('WWW-Authenticate') or response.headers.get('Www-Authenticate')
123
+ if response.status == 401:
124
+ resource_metadata_url = extract_resource_metadata_url(auth_header)
125
+ metadata = None
126
+ if resource_metadata_url:
127
+ metadata = await fetch_resource_metadata_async(
128
+ resource_metadata_url,
129
+ session=session,
130
+ timeout=self.tool_timeout_sec,
131
+ )
132
+ raise McpAuthorizationRequired(
133
+ message=f"MCP server {self.server_url} requires OAuth authorization",
134
+ server_url=canonical_resource(self.server_url),
135
+ resource_metadata_url=resource_metadata_url,
136
+ www_authenticate=auth_header,
137
+ resource_metadata=metadata,
138
+ status=response.status,
139
+ )
140
+
113
141
  if response.status != 200:
114
142
  error_text = await response.text()
115
143
  raise Exception(f"HTTP {response.status}: {error_text}")
@@ -0,0 +1,103 @@
1
+ import json
2
+ import logging
3
+ import re
4
+ from typing import Any, Dict, Optional
5
+ from urllib.parse import urlparse
6
+
7
+ import requests
8
+ from langchain_core.tools import ToolException
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+
13
+ class McpAuthorizationRequired(ToolException):
14
+ """Raised when an MCP server requires OAuth authorization before use."""
15
+
16
+ def __init__(
17
+ self,
18
+ message: str,
19
+ server_url: str,
20
+ resource_metadata_url: Optional[str] = None,
21
+ www_authenticate: Optional[str] = None,
22
+ resource_metadata: Optional[Dict[str, Any]] = None,
23
+ status: Optional[int] = None,
24
+ ):
25
+ super().__init__(message)
26
+ self.server_url = server_url
27
+ self.resource_metadata_url = resource_metadata_url
28
+ self.www_authenticate = www_authenticate
29
+ self.resource_metadata = resource_metadata
30
+ self.status = status
31
+
32
+ def to_dict(self) -> Dict[str, Any]:
33
+ return {
34
+ "message": str(self),
35
+ "server_url": self.server_url,
36
+ "resource_metadata_url": self.resource_metadata_url,
37
+ "www_authenticate": self.www_authenticate,
38
+ "resource_metadata": self.resource_metadata,
39
+ "status": self.status,
40
+ }
41
+
42
+
43
+ def extract_resource_metadata_url(www_authenticate: Optional[str]) -> Optional[str]:
44
+ """Pull the resource_metadata URL from a WWW-Authenticate header if present."""
45
+ if not www_authenticate:
46
+ return None
47
+
48
+ # RFC9728 returns `resource_metadata="<url>"` inside the header value
49
+ match = re.search(r'resource_metadata\s*=\s*\"?([^\", ]+)\"?', www_authenticate)
50
+ if match:
51
+ return match.group(1)
52
+ return None
53
+
54
+
55
+ def fetch_resource_metadata(resource_metadata_url: str, timeout: int = 10) -> Optional[Dict[str, Any]]:
56
+ """Fetch and parse the protected resource metadata document."""
57
+ try:
58
+ resp = requests.get(resource_metadata_url, timeout=timeout)
59
+ resp.raise_for_status()
60
+ return resp.json()
61
+ except Exception as exc: # broad catch – we want to surface auth requirement even if this fails
62
+ logger.warning("Failed to fetch resource metadata from %s: %s", resource_metadata_url, exc)
63
+ return None
64
+
65
+
66
+ async def fetch_resource_metadata_async(resource_metadata_url: str, session=None, timeout: int = 10) -> Optional[Dict[str, Any]]:
67
+ """Async variant for fetching protected resource metadata."""
68
+ try:
69
+ import aiohttp
70
+
71
+ client_timeout = aiohttp.ClientTimeout(total=timeout)
72
+ if session:
73
+ async with session.get(resource_metadata_url, timeout=client_timeout) as resp:
74
+ text = await resp.text()
75
+ else:
76
+ async with aiohttp.ClientSession(timeout=client_timeout) as local_session:
77
+ async with local_session.get(resource_metadata_url) as resp:
78
+ text = await resp.text()
79
+
80
+ try:
81
+ return json.loads(text)
82
+ except json.JSONDecodeError:
83
+ logger.warning("Resource metadata at %s is not valid JSON: %s", resource_metadata_url, text[:200])
84
+ return None
85
+ except Exception as exc:
86
+ logger.warning("Failed to fetch resource metadata from %s: %s", resource_metadata_url, exc)
87
+ return None
88
+
89
+
90
+ def canonical_resource(server_url: str) -> str:
91
+ """Produce a canonical resource identifier for the MCP server."""
92
+ parsed = urlparse(server_url)
93
+ # Normalize scheme/host casing per RFC guidance
94
+ normalized = parsed._replace(
95
+ scheme=parsed.scheme.lower(),
96
+ netloc=parsed.netloc.lower(),
97
+ )
98
+ resource = normalized.geturl()
99
+
100
+ # Prefer form without trailing slash unless path is meaningful
101
+ if resource.endswith("/") and parsed.path in ("", "/"):
102
+ resource = resource[:-1]
103
+ return resource
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.438
3
+ Version: 0.3.439
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
@@ -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=ll4_t2MN7acL6SXU7LVQ5f063WdUf6pn7A5aLXnIzEs,46512
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
@@ -103,10 +103,10 @@ 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=HWbVB4A3Ek-xhQeZSX8bZIzvN_X90S1uRu1rNR8pfHU,37863
106
+ alita_sdk/runtime/toolkits/mcp.py,sha256=9avAcSn94BZxjM0W8l-qw0jqydV9N8p_3Hyqfr8uFmM,38963
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=_RX8E0Vh8nTmKetjZ4SQ8vdPPm4G9dB2_VQditliZFg,11535
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,7 @@ 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_remote_tool.py,sha256=SfqU-GW7C0ujSLyqRMIYf2AzLxMbYIV2brY6q9yYFCY,8071
125
+ alita_sdk/runtime/tools/mcp_remote_tool.py,sha256=7iZS2r5xgiRRYk5PySdGC2FQ55ZvVfIqH7dCvPiL_hY,9487
126
126
  alita_sdk/runtime/tools/mcp_server_tool.py,sha256=-xO3H6BM63KaIV1CdcQKPVE0WPigiqOgFZDX7m2_yGs,4419
127
127
  alita_sdk/runtime/tools/pgvector_search.py,sha256=NN2BGAnq4SsDHIhUcFZ8d_dbEOM8QwB0UwpsWCYruXU,11692
128
128
  alita_sdk/runtime/tools/prompt.py,sha256=nJafb_e5aOM1Rr3qGFCR-SKziU9uCsiP2okIMs9PppM,741
@@ -136,6 +136,7 @@ alita_sdk/runtime/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
136
136
  alita_sdk/runtime/utils/constants.py,sha256=Xntx1b_uxUzT4clwqHA_U6K8y5bBqf_4lSQwXdcWrp4,13586
137
137
  alita_sdk/runtime/utils/evaluate.py,sha256=iM1P8gzBLHTuSCe85_Ng_h30m52hFuGuhNXJ7kB1tgI,1872
138
138
  alita_sdk/runtime/utils/logging.py,sha256=svPyiW8ztDfhqHFITv5FBCj8UhLxz6hWcqGIY6wpJJE,3331
139
+ alita_sdk/runtime/utils/mcp_oauth.py,sha256=fh4jM0UjV65-MGNno7o-7_kpRd6pY57fgZ63Cl-v46E,3791
139
140
  alita_sdk/runtime/utils/save_dataframe.py,sha256=i-E1wp-t4wb17Zq3nA3xYwgSILjoXNizaQAA9opWvxY,1576
140
141
  alita_sdk/runtime/utils/streamlit.py,sha256=yIb4YIGH8HRAXZtZlywjxI07Xdcb5eUt7rMA-elFTdc,107261
141
142
  alita_sdk/runtime/utils/toolkit_runtime.py,sha256=MU63Fpxj0b5_r1IUUc0Q3-PN9VwL7rUxp2MRR4tmYR8,5136
@@ -359,8 +360,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
359
360
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0ne8XLJEQSLOWfzd2HdnqOYmQlUliKHbBED5kW_Vias,2895
360
361
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
361
362
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
362
- alita_sdk-0.3.438.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
363
- alita_sdk-0.3.438.dist-info/METADATA,sha256=J4Kuq-eVmDSRvLxmvz44RTa03jPFzb6TAIb_hU2ciQY,19071
364
- alita_sdk-0.3.438.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
365
- alita_sdk-0.3.438.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
366
- alita_sdk-0.3.438.dist-info/RECORD,,
363
+ alita_sdk-0.3.439.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
364
+ alita_sdk-0.3.439.dist-info/METADATA,sha256=lbeT6nOF2HwyP60RzXSr97_MoEZJJMjtXIe6PUE2StE,19071
365
+ alita_sdk-0.3.439.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
366
+ alita_sdk-0.3.439.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
367
+ alita_sdk-0.3.439.dist-info/RECORD,,