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

@@ -16,10 +16,11 @@ from typing import Iterator
16
16
  import pandas as pd
17
17
  from json import loads
18
18
 
19
- from langchain_core.tools import ToolException
19
+ from openpyxl import load_workbook
20
20
  from langchain_core.documents import Document
21
21
  from .AlitaTableLoader import AlitaTableLoader
22
22
 
23
+ cell_delimeter = " | "
23
24
 
24
25
  class AlitaExcelLoader(AlitaTableLoader):
25
26
 
@@ -39,32 +40,65 @@ class AlitaExcelLoader(AlitaTableLoader):
39
40
 
40
41
  def get_content(self):
41
42
  try:
42
- dfs = pd.read_excel(self.file_path, sheet_name=self.sheet_name)
43
+ # Load the workbook
44
+ workbook = load_workbook(self.file_path, data_only=True) # `data_only=True` ensures we get cell values, not formulas
43
45
 
44
- if self.excel_by_sheets:
46
+ if self.sheet_name:
47
+ # If a specific sheet name is provided, parse only that sheet
48
+ if self.sheet_name in workbook.sheetnames:
49
+ sheet_content = self.parse_sheet(workbook[self.sheet_name])
50
+ return sheet_content
51
+ else:
52
+ raise ValueError(f"Sheet '{self.sheet_name}' does not exist in the workbook.")
53
+ elif self.excel_by_sheets:
54
+ # Parse each sheet individually and return as a dictionary
45
55
  result = {}
46
- for sheet_name, df in dfs.items():
47
- df.fillna('', inplace=True)
48
- result[sheet_name] = self.parse_sheet(df)
56
+ for sheet_name in workbook.sheetnames:
57
+ sheet_content = self.parse_sheet(workbook[sheet_name])
58
+ result[sheet_name] = sheet_content
49
59
  return result
50
60
  else:
61
+ # Combine all sheets into a single string result
51
62
  result = []
52
- for sheet_name, df in dfs.items():
53
- string_content = self.parse_sheet(df)
54
- result.append(f"====== Sheet name: {sheet_name} ======\n{string_content}")
63
+ for sheet_name in workbook.sheetnames:
64
+ sheet_content = self.parse_sheet(workbook[sheet_name])
65
+ result.append(f"====== Sheet name: {sheet_name} ======\n{sheet_content}")
55
66
  return "\n\n".join(result)
56
67
  except Exception as e:
57
- return ToolException(f"Error reading Excel file: {e}")
68
+ return f"Error reading Excel file: {e}"
58
69
 
59
- def parse_sheet(self, df):
60
- df.fillna('', inplace=True)
70
+ def parse_sheet(self, sheet):
71
+ """
72
+ Parses a single sheet, extracting text and hyperlinks, and formats them.
73
+ """
74
+ sheet_content = []
61
75
 
76
+ for row in sheet.iter_rows():
77
+ row_content = []
78
+ for cell in row:
79
+ if cell.hyperlink:
80
+ # If the cell has a hyperlink, format it as Markdown
81
+ hyperlink = cell.hyperlink.target
82
+ cell_value = cell.value or '' # Use cell value or empty string
83
+ row_content.append(f"[{cell_value}]({hyperlink})")
84
+ else:
85
+ # If no hyperlink, use the cell value (computed value if formula)
86
+ row_content.append(str(cell.value) if cell.value is not None else "")
87
+ # Join the row content into a single line using `|` as the delimiter
88
+ sheet_content.append(cell_delimeter.join(row_content))
89
+
90
+ # Format the sheet content based on the return type
62
91
  if self.return_type == 'dict':
63
- return df.to_dict(orient='records')
92
+ # Convert to a list of dictionaries (each row is a dictionary)
93
+ headers = sheet_content[0].split(cell_delimeter) if sheet_content else []
94
+ data_rows = sheet_content[1:] if len(sheet_content) > 1 else []
95
+ return [dict(zip(headers, row.split(cell_delimeter))) for row in data_rows]
64
96
  elif self.return_type == 'csv':
65
- return df.to_csv()
97
+ # Return as CSV (newline-separated rows, comma-separated values)
98
+ return "\n".join([",".join(row.split(cell_delimeter)) for row in sheet_content])
66
99
  else:
67
- return df.to_string(index=False)
100
+ # Default: Return as plain text (newline-separated rows, pipe-separated values)
101
+ return "\n".join(sheet_content)
68
102
 
69
103
  def load(self) -> list:
70
104
  docs = []
@@ -1,4 +1,5 @@
1
1
  import pymupdf
2
+ import fitz
2
3
  from langchain_community.document_loaders import PyPDFLoader
3
4
 
4
5
  from .ImageParser import ImageParser
@@ -43,8 +44,59 @@ class AlitaPDFLoader:
43
44
  return text_content
44
45
 
45
46
  def read_pdf_page(self, report, page, index):
46
- text_content = f'Page: {index}\n'
47
- text_content += page.get_text()
47
+ # Extract text in block format (to more accurately match hyperlinks to text)
48
+ text_blocks = page.get_text("blocks") # Returns a list of text blocks
49
+ words = page.get_text("words") # Returns words with their coordinates
50
+
51
+ # Extract hyperlinks
52
+ links = page.get_links()
53
+
54
+ # Create a list to store the modified text
55
+ modified_text = []
56
+
57
+ for block in text_blocks:
58
+ block_rect = fitz.Rect(block[:4]) # Coordinates of the text block
59
+ block_text = block[4] # The actual text of the block
60
+
61
+ # Check if there are hyperlinks intersecting with this text block
62
+ for link in links:
63
+ if "uri" in link: # Ensure this is a hyperlink
64
+ link_rect = link["from"] # Coordinates of the hyperlink area
65
+ link_uri = link["uri"] # The URL of the hyperlink
66
+
67
+ # Expand the hyperlink area slightly to account for inaccuracies
68
+ link_rect = fitz.Rect(
69
+ link_rect.x0 - 1, link_rect.y0 - 1, link_rect.x1 + 1, link_rect.y1 + 1
70
+ )
71
+
72
+ # Find words that are inside the hyperlink area
73
+ link_text = []
74
+ for word in words:
75
+ word_rect = fitz.Rect(word[:4]) # Coordinates of the word
76
+ word_text = word[4]
77
+
78
+ # Check if the word rectangle is fully inside the hyperlink rectangle
79
+ if link_rect.contains(word_rect):
80
+ link_text.append(word_text)
81
+ # If the word partially intersects, check vertical alignment
82
+ elif link_rect.intersects(word_rect):
83
+ # Condition: The word must be on the same line as the hyperlink
84
+ if abs(link_rect.y0 - word_rect.y0) < 2 and abs(link_rect.y1 - word_rect.y1) < 2:
85
+ link_text.append(word_text)
86
+
87
+ # Format the hyperlink in Markdown
88
+ full_text = " ".join(link_text) if link_text else "No text"
89
+ hyperlink = f"[{full_text}]({link_uri})"
90
+
91
+ # Replace the hyperlink text in the block with the formatted hyperlink
92
+ block_text = block_text.replace(full_text, hyperlink)
93
+
94
+ # Add the processed text block to the result
95
+ modified_text.append(block_text)
96
+
97
+ # Combine all text blocks into the final text for the page
98
+ text_content = f'Page: {index}\n' + "\n".join(modified_text)
99
+
48
100
  if self.extract_images:
49
101
  images = page.get_images(full=True)
50
102
  for i, img in enumerate(images):
@@ -584,11 +584,19 @@ def create_graph(
584
584
  entry_point = clean_string(schema['entry_point'])
585
585
  except KeyError:
586
586
  raise ToolException("Entry point is not defined in the schema. Please define 'entry_point' in the schema.")
587
- if state.items():
588
- state_default_node = StateDefaultNode(default_vars=set_defaults(state))
589
- lg_builder.add_node(state_default_node.name, state_default_node)
590
- lg_builder.set_entry_point(state_default_node.name)
591
- lg_builder.add_conditional_edges(state_default_node.name, TransitionalEdge(entry_point))
587
+ # if state.items():
588
+ # state_default_node = StateDefaultNode(default_vars=set_defaults(state))
589
+ # lg_builder.add_node(state_default_node.name, state_default_node)
590
+ # lg_builder.set_entry_point(state_default_node.name)
591
+ # lg_builder.add_conditional_edges(state_default_node.name, TransitionalEdge(entry_point))
592
+ for key, value in state.items():
593
+ if 'type' in value and 'value' in value:
594
+ # set default value for state variable if it is defined in the schema
595
+ state_default_node = StateDefaultNode(default_vars=state)
596
+ lg_builder.add_node(state_default_node.name, state_default_node)
597
+ lg_builder.set_entry_point(state_default_node.name)
598
+ lg_builder.add_conditional_edges(state_default_node.name, TransitionalEdge(entry_point))
599
+ break
592
600
  else:
593
601
  # if no state variables are defined, set the entry point directly
594
602
  lg_builder.set_entry_point(entry_point)
@@ -694,7 +702,7 @@ class LangGraphAgentRunnable(CompiledStateGraph):
694
702
 
695
703
  # Append current input to existing messages instead of overwriting
696
704
  if input.get('input'):
697
- current_message = HumanMessage(content=input.get('input'))
705
+ current_message = input.get('input')[-1]
698
706
  if input.get('messages'):
699
707
  # Ensure existing messages are LangChain objects
700
708
  input['messages'] = [convert_dict_to_message(msg) for msg in input['messages']]
@@ -31,7 +31,8 @@ def formulate_query(kwargs):
31
31
  chat_history = []
32
32
  for each in kwargs.get('chat_history')[:]:
33
33
  chat_history.append(AIMessage(each))
34
- result = {"input": kwargs.get('task'), "chat_history": chat_history}
34
+ input_message = AIMessage(content=kwargs.get('task'))
35
+ result = {"input": [input_message], "chat_history": chat_history}
35
36
  for key, value in kwargs.items():
36
37
  if key not in ("task", "chat_history"):
37
38
  result[key] = value
@@ -14,8 +14,7 @@ logger = logging.getLogger(__name__)
14
14
 
15
15
 
16
16
  def create_llm_input_with_messages(
17
- prompt: Dict[str, str],
18
- messages: List[BaseMessage],
17
+ prompt: Dict[str, str],
19
18
  params: Dict[str, Any]
20
19
  ) -> List[BaseMessage]:
21
20
  """
@@ -23,13 +22,12 @@ def create_llm_input_with_messages(
23
22
 
24
23
  Args:
25
24
  prompt: The prompt configuration with template
26
- messages: List of chat history messages
27
25
  params: Additional parameters for prompt formatting
28
26
 
29
27
  Returns:
30
28
  List of messages to send to LLM
31
29
  """
32
- logger.info(f"Creating LLM input with messages: {len(messages)} messages, params: {params}")
30
+ logger.info(f"Creating LLM input with params: {params}")
33
31
 
34
32
  # Build the input messages
35
33
  input_messages = []
@@ -47,9 +45,13 @@ def create_llm_input_with_messages(
47
45
  raise ToolException(error_msg)
48
46
 
49
47
  # Add the chat history messages
48
+ messages = params.get('messages', [])
50
49
  if messages:
51
50
  input_messages.extend(messages)
52
-
51
+ else:
52
+ # conditionally add a default human message if no chat history
53
+ input_messages.extend([HumanMessage(content="Reply to this message.")])
54
+
53
55
  return input_messages
54
56
 
55
57
 
@@ -124,12 +126,13 @@ class LLMNode(BaseTool):
124
126
  # Create parameters for prompt formatting from state
125
127
  params = {}
126
128
  if isinstance(state, dict):
127
- for var in self.input_variables or []:
128
- if var != "messages" and var in state:
129
- params[var] = state[var]
129
+ params = {var: state[var] for var in (self.input_variables or []) if var != "messages" and var in state}
130
+ # message as a part of chat history added ONLY if "messages" is in input_variables
131
+ if "messages" in (self.input_variables or []):
132
+ params["messages"] = messages
130
133
 
131
134
  # Create LLM input with proper message handling
132
- llm_input = create_llm_input_with_messages(self.prompt, messages, params)
135
+ llm_input = create_llm_input_with_messages(self.prompt, params)
133
136
 
134
137
  # Get the LLM client, potentially with tools bound
135
138
  llm_client = self.client
@@ -268,17 +271,14 @@ class LLMNode(BaseTool):
268
271
  if json_output_vars:
269
272
  try:
270
273
  response = _extract_json(content) or {}
271
- response_data = {key: response.get(key) for key in json_output_vars if key in response}
272
-
273
- # Always add the messages to the response
274
- new_messages = messages + [AIMessage(content=content)]
275
- response_data['messages'] = new_messages
276
-
277
- return response_data
274
+ response_data = {key: response.get(key, content) for key in json_output_vars}
278
275
  except (ValueError, json.JSONDecodeError) as e:
279
- # LLM returned non-JSON content, treat as plain text
280
- logger.warning(f"Expected JSON output but got plain text. Output variables specified: {json_output_vars}. Error: {e}")
281
- # Fall through to plain text handling
276
+ logger.warning(
277
+ f"Expected JSON output but got plain text. Output variables specified: {json_output_vars}. Error: {e}")
278
+ response_data = {var: content for var in json_output_vars}
279
+ new_messages = messages + [AIMessage(content=content)]
280
+ response_data['messages'] = new_messages
281
+ return response_data
282
282
 
283
283
  # Simple text response (either no output variables or JSON parsing failed)
284
284
  new_messages = messages + [AIMessage(content=content)]
@@ -4,6 +4,7 @@ import logging
4
4
  import re
5
5
  from enum import Enum
6
6
  from typing import Dict, List, Generator, Optional, Union
7
+ from urllib.parse import urlparse, parse_qs
7
8
 
8
9
  import requests
9
10
  from FigmaPy import FigmaPy
@@ -238,6 +239,7 @@ class FigmaApiWrapper(NonCodeIndexerToolkit):
238
239
 
239
240
  def _base_loader(
240
241
  self,
242
+ file_or_page_url: Optional[str] = None,
241
243
  project_id: Optional[str] = None,
242
244
  file_keys_include: Optional[List[str]] = None,
243
245
  file_keys_exclude: Optional[List[str]] = None,
@@ -247,6 +249,24 @@ class FigmaApiWrapper(NonCodeIndexerToolkit):
247
249
  node_types_exclude: Optional[List[str]] = None,
248
250
  **kwargs
249
251
  ) -> Generator[Document, None, None]:
252
+ if file_or_page_url:
253
+ # If URL is provided and valid, extract and override file_keys_include and node_ids_include
254
+ try:
255
+ parsed = urlparse(file_or_page_url)
256
+ path_parts = parsed.path.strip('/').split('/')
257
+
258
+ # Check if the path matches the expected format
259
+ if len(path_parts) >= 2 and path_parts[0] == 'design':
260
+ file_keys_include = [path_parts[1]]
261
+ if len(path_parts) == 3:
262
+ # To ensure url structure matches Figma's format with 3 path segments
263
+ query_params = parse_qs(parsed.query)
264
+ if "node-id" in query_params:
265
+ node_ids_include = query_params.get('node-id', [])
266
+ except Exception as e:
267
+ raise ToolException(
268
+ f"Unexpected error while processing Figma url {file_or_page_url}: {e}")
269
+
250
270
  # If both include and exclude are provided, use only include
251
271
  if file_keys_include:
252
272
  self._log_tool_event(f"Loading files: {file_keys_include}")
@@ -364,8 +384,11 @@ class FigmaApiWrapper(NonCodeIndexerToolkit):
364
384
  def _index_tool_params(self):
365
385
  """Return the parameters for indexing data."""
366
386
  return {
387
+ "file_or_page_url": (Optional[str], Field(
388
+ description="Url to file or page to index: i.e. https://www.figma.com/design/[YOUR_FILE_KEY]/Login-page-designs?node-id=[YOUR_PAGE_ID]",
389
+ default=None)),
367
390
  "project_id": (Optional[str], Field(
368
- description="ID of the project to list files from: i.e. 55391681'",
391
+ description="ID of the project to list files from: i.e. 55391681",
369
392
  default=None)),
370
393
  'file_keys_include': (Optional[List[str]], Field(
371
394
  description="List of file keys to include in index if project_id is not provided: i.e. ['Fp24FuzPwH0L74ODSrCnQo', 'jmhAr6q78dJoMRqt48zisY']",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.322
3
+ Version: 0.3.324
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
@@ -44,7 +44,7 @@ alita_sdk/runtime/langchain/assistant.py,sha256=1Eq8BIefp8suhbC9CssoOXtC-plkemoU
44
44
  alita_sdk/runtime/langchain/chat_message_template.py,sha256=kPz8W2BG6IMyITFDA5oeb5BxVRkHEVZhuiGl4MBZKdc,2176
45
45
  alita_sdk/runtime/langchain/constants.py,sha256=eHVJ_beJNTf1WJo4yq7KMK64fxsRvs3lKc34QCXSbpk,3319
46
46
  alita_sdk/runtime/langchain/indexer.py,sha256=0ENHy5EOhThnAiYFc7QAsaTNp9rr8hDV_hTK8ahbatk,37592
47
- alita_sdk/runtime/langchain/langraph_agent.py,sha256=5fTT2FyRFSLIbQxm8KkxT_-bkoABmZzZA_V3-9nPse0,44296
47
+ alita_sdk/runtime/langchain/langraph_agent.py,sha256=jbUlqWFly055uSu0pe0qfUvi5L4CoSUCyMHUFVyNMck,44818
48
48
  alita_sdk/runtime/langchain/mixedAgentParser.py,sha256=M256lvtsL3YtYflBCEp-rWKrKtcY1dJIyRGVv7KW9ME,2611
49
49
  alita_sdk/runtime/langchain/mixedAgentRenderes.py,sha256=asBtKqm88QhZRILditjYICwFVKF5KfO38hu2O-WrSWE,5964
50
50
  alita_sdk/runtime/langchain/store_manager.py,sha256=i8Fl11IXJhrBXq1F1ukEVln57B1IBe-tqSUvfUmBV4A,2218
@@ -56,13 +56,13 @@ alita_sdk/runtime/langchain/document_loaders/AlitaCSVLoader.py,sha256=3ne-a5qIkB
56
56
  alita_sdk/runtime/langchain/document_loaders/AlitaConfluenceLoader.py,sha256=NzpoL4C7UzyzLouTSL_xTQw70MitNt-WZz3Eyl7QkTA,8294
57
57
  alita_sdk/runtime/langchain/document_loaders/AlitaDirectoryLoader.py,sha256=fKezkgvIcLG7S2PVJp1a8sZd6C4XQKNZKAFC87DbQts,7003
58
58
  alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py,sha256=9hi5eHgDIfa9wBWqTuwMM6D6W64czrDTfZl_htooe8Y,5943
59
- alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py,sha256=CKFL13TXCyqQa_fl6EmR6q9O9cT_w0tQzoQQFmfCpi8,3712
59
+ alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py,sha256=P17csHx94JkXiyo1a2V-CrfP2E5XCG4uZC31ulZ_Ab4,5817
60
60
  alita_sdk/runtime/langchain/document_loaders/AlitaGitRepoLoader.py,sha256=5WXGcyHraSVj3ANHj_U6X4EDikoekrIYtS0Q_QqNIng,2608
61
61
  alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py,sha256=QwgBJE-BvOasjgT1hYHZc0MP0F_elirUjSzKixoM6fY,6610
62
62
  alita_sdk/runtime/langchain/document_loaders/AlitaJSONLoader.py,sha256=Nav2cgCQKOHQi_ZgYYn_iFdP_Os56KVlVR5nHGXecBc,3445
63
63
  alita_sdk/runtime/langchain/document_loaders/AlitaJiraLoader.py,sha256=M2q3YThkps0yAZOjfoLcyE7qycVTYKcXEGtpmp0N6C8,10950
64
64
  alita_sdk/runtime/langchain/document_loaders/AlitaMarkdownLoader.py,sha256=RGHDfleYTn7AAc3H-yFZrjm06L0Ux14ZtEJpFlVBNCA,2474
65
- alita_sdk/runtime/langchain/document_loaders/AlitaPDFLoader.py,sha256=toXdQbT9TuBCdB4t62t2cPalBY_2RZy2lqKSMU7YVhw,3386
65
+ alita_sdk/runtime/langchain/document_loaders/AlitaPDFLoader.py,sha256=usSrPnYQ3dDOJDdg6gBDTnBJnHiqjLxd_kvOBfRyVxY,5946
66
66
  alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py,sha256=SKAAPo3DfMtRPxICKrPzlXXkC5RfaeiRj7lejLXTi7o,2337
67
67
  alita_sdk/runtime/langchain/document_loaders/AlitaPythonLoader.py,sha256=m_7aq-aCFVb4vXZsJNinfN1hAuyy_S0ylRknv_ahxDc,340
68
68
  alita_sdk/runtime/langchain/document_loaders/AlitaQtestLoader.py,sha256=CUVVnisxm7b5yZWV6rn0Q3MEEaO1GWNcfnz5yWz8T0k,13283
@@ -105,14 +105,14 @@ alita_sdk/runtime/toolkits/tools.py,sha256=Ea3LO6voPNysdzVB7jYMZIqSMtda7LCq_6fkV
105
105
  alita_sdk/runtime/toolkits/vectorstore.py,sha256=BGppQADa1ZiLO17fC0uCACTTEvPHlodEDYEzUcBRbAA,2901
106
106
  alita_sdk/runtime/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
107
  alita_sdk/runtime/tools/agent.py,sha256=m98QxOHwnCRTT9j18Olbb5UPS8-ZGeQaGiUyZJSyFck,3162
108
- alita_sdk/runtime/tools/application.py,sha256=mC2_ZFx4WLHc98Gzll88Vw6cqyx2cmbig2IeJBtHRdg,2836
108
+ alita_sdk/runtime/tools/application.py,sha256=j6H2OFteb7h2Yhxk1ipA-i5g3BvfmTfPuMxbfLPEa0E,2891
109
109
  alita_sdk/runtime/tools/artifact.py,sha256=yIn-kfI9OWoaxbBeqdqF0M1HPeMtNnvZ_pCPoUIwnCk,8708
110
110
  alita_sdk/runtime/tools/datasource.py,sha256=pvbaSfI-ThQQnjHG-QhYNSTYRnZB0rYtZFpjCfpzxYI,2443
111
111
  alita_sdk/runtime/tools/echo.py,sha256=spw9eCweXzixJqHnZofHE1yWiSUa04L4VKycf3KCEaM,486
112
112
  alita_sdk/runtime/tools/function.py,sha256=ZFpd7TGwIawze2e7BHlKwP0NHwNw42wwrmmnXyJQJhk,2600
113
113
  alita_sdk/runtime/tools/graph.py,sha256=MbnZYqdmvZY7SGDp43lOVVIjUt5ARHSgj43mdtBjSjQ,3092
114
114
  alita_sdk/runtime/tools/indexer_tool.py,sha256=whSLPevB4WD6dhh2JDXEivDmTvbjiMV1MrPl9cz5eLA,4375
115
- alita_sdk/runtime/tools/llm.py,sha256=NsrsP-SblyxDdzgMCn9_OBUL0sUGDVS5yqer49V7ciE,15069
115
+ alita_sdk/runtime/tools/llm.py,sha256=lVg8t785JLrB2kwIQjpigfhZZP9-BRu-SEUQw6DQyh8,15128
116
116
  alita_sdk/runtime/tools/loop.py,sha256=uds0WhZvwMxDVFI6MZHrcmMle637cQfBNg682iLxoJA,8335
117
117
  alita_sdk/runtime/tools/loop_output.py,sha256=U4hO9PCQgWlXwOq6jdmCGbegtAxGAPXObSxZQ3z38uk,8069
118
118
  alita_sdk/runtime/tools/mcp_server_tool.py,sha256=trGraI8-AwdbNmTKMjfmlBxgTDMTE4-21heCVtd_lz0,4156
@@ -235,7 +235,7 @@ alita_sdk/tools/custom_open_api/api_wrapper.py,sha256=sDSFpvEqpSvXHGiBISdQQcUecf
235
235
  alita_sdk/tools/elastic/__init__.py,sha256=iwnSRppRpzvJ1da2K3Glu8Uu41MhBDCYbguboLkEbW0,2818
236
236
  alita_sdk/tools/elastic/api_wrapper.py,sha256=pl8CqQxteJAGwyOhMcld-ZgtOTFwwbv42OITQVe8rM0,1948
237
237
  alita_sdk/tools/figma/__init__.py,sha256=W6vIMMkZI2Lmpg6_CRRV3oadaIbVI-qTLmKUh6enqWs,4509
238
- alita_sdk/tools/figma/api_wrapper.py,sha256=SjTKCq8FrW1nCP1uFuRw8A2WVKnzEyRmKEr8e3W4QjE,26174
238
+ alita_sdk/tools/figma/api_wrapper.py,sha256=SFuvjhxYgey1qGsO9sakFpY1bK1RSzgAH-uJsAp7FnE,27477
239
239
  alita_sdk/tools/github/__init__.py,sha256=2rHu0zZyZGnLC5CkHgDIhe14N9yCyaEfrrt7ydH8478,5191
240
240
  alita_sdk/tools/github/api_wrapper.py,sha256=uDwYckdnpYRJtb0uZnDkaz2udvdDLVxuCh1tSwspsiU,8411
241
241
  alita_sdk/tools/github/github_client.py,sha256=nxnSXsDul2PPbWvYZS8TmAFFmR-5ALyakNoV5LN2D4U,86617
@@ -349,8 +349,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
349
349
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0ne8XLJEQSLOWfzd2HdnqOYmQlUliKHbBED5kW_Vias,2895
350
350
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
351
351
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
352
- alita_sdk-0.3.322.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
353
- alita_sdk-0.3.322.dist-info/METADATA,sha256=B4mgVK36EvdhTCCHhCGVQEUVdxRdpRuAE_FLC9eXVFQ,18897
354
- alita_sdk-0.3.322.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
355
- alita_sdk-0.3.322.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
356
- alita_sdk-0.3.322.dist-info/RECORD,,
352
+ alita_sdk-0.3.324.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
353
+ alita_sdk-0.3.324.dist-info/METADATA,sha256=uxEEUIMIOSP9WwGk_YaGjp2hDLTynd35eEWo4SPjHUc,18897
354
+ alita_sdk-0.3.324.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
355
+ alita_sdk-0.3.324.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
356
+ alita_sdk-0.3.324.dist-info/RECORD,,