alita-sdk 0.3.437__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.
@@ -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
@@ -7,7 +7,7 @@ Following MCP specification: https://modelcontextprotocol.io/specification/2025-
7
7
  import logging
8
8
  import re
9
9
  import requests
10
- from typing import List, Optional, Any, Dict, Literal, ClassVar
10
+ from typing import List, Optional, Any, Dict, Literal, ClassVar, Union
11
11
 
12
12
  from langchain_core.tools import BaseToolkit, BaseTool
13
13
  from pydantic import BaseModel, ConfigDict, Field
@@ -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
 
@@ -200,11 +206,10 @@ class McpToolkit(BaseToolkit):
200
206
  )
201
207
  ),
202
208
  timeout=(
203
- int,
209
+ Union[int, str], # TODO: remove one I will figure out why UI sends str
204
210
  Field(
205
- default=60,
206
- ge=1, le=300,
207
- description="Request timeout in seconds"
211
+ default=300,
212
+ description="Request timeout in seconds (1-3600)"
208
213
  )
209
214
  ),
210
215
  discovery_mode=(
@@ -218,11 +223,10 @@ class McpToolkit(BaseToolkit):
218
223
  )
219
224
  ),
220
225
  discovery_interval=(
221
- int,
226
+ Union[int, str],
222
227
  Field(
223
228
  default=300,
224
- ge=60, le=3600,
225
- description="Discovery interval in seconds (for periodic discovery)"
229
+ description="Discovery interval in seconds (60-3600, for periodic discovery)"
226
230
  )
227
231
  ),
228
232
  selected_tools=(
@@ -243,11 +247,10 @@ class McpToolkit(BaseToolkit):
243
247
  )
244
248
  ),
245
249
  cache_ttl=(
246
- int,
250
+ Union[int, str],
247
251
  Field(
248
252
  default=300,
249
- ge=60, le=3600,
250
- description="Cache TTL in seconds"
253
+ description="Cache TTL in seconds (60-3600)"
251
254
  )
252
255
  ),
253
256
  __config__=ConfigDict(
@@ -309,6 +312,11 @@ class McpToolkit(BaseToolkit):
309
312
  if not toolkit_name:
310
313
  raise ValueError("toolkit_name is required")
311
314
 
315
+ # Convert numeric parameters that may come as strings from UI
316
+ timeout = safe_int(timeout, 60)
317
+ discovery_interval = safe_int(discovery_interval, 300)
318
+ cache_ttl = safe_int(cache_ttl, 300)
319
+
312
320
  logger.info(f"Creating MCP toolkit: {toolkit_name}")
313
321
 
314
322
  # Parse headers if they're provided as a JSON string
@@ -407,6 +415,9 @@ class McpToolkit(BaseToolkit):
407
415
  logger.error(f"Discovery error details - URL: {connection_config.url}, Timeout: {timeout}s")
408
416
 
409
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
410
421
  if client and discovery_mode != "static":
411
422
  logger.info(f"Falling back to static discovery for toolkit '{toolkit_name}'")
412
423
  tools = cls._create_tools_static(toolkit_name, selected_tools, timeout, client)
@@ -532,6 +543,19 @@ class McpToolkit(BaseToolkit):
532
543
  timeout=timeout
533
544
  )
534
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
+
535
559
  if response.status_code != 200:
536
560
  logger.error(f"MCP server returned non-200 status: {response.status_code}")
537
561
  raise Exception(f"HTTP {response.status_code}: {response.text}")
@@ -916,4 +940,4 @@ def get_all_discovered_servers():
916
940
  """Get status of all discovered servers."""
917
941
  from ..clients.mcp_discovery import get_discovery_service
918
942
  service = get_discovery_service()
919
- 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.437
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=reAzEnhQe_G5-lQa3P-nV4MCn_YAIx8lllCBFL5uxTk,37624
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.437.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
363
- alita_sdk-0.3.437.dist-info/METADATA,sha256=fCP3C5QT6Qn1COsbs7uehjpBAicDl_G_rsIfCFl3tDE,19071
364
- alita_sdk-0.3.437.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
365
- alita_sdk-0.3.437.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
366
- alita_sdk-0.3.437.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,,