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

@@ -555,7 +555,7 @@ def create_graph(
555
555
  break
556
556
  elif node_type == 'code':
557
557
  from ..tools.sandbox import create_sandbox_tool
558
- sandbox_tool = create_sandbox_tool(stateful=False, allow_net=True)
558
+ sandbox_tool = create_sandbox_tool(stateful=False, allow_net=True, alita_client=kwargs.get('alita_client', None))
559
559
  code_data = node.get('code', {'type': 'fixed', 'value': "return 'Code block is empty'"})
560
560
  lg_builder.add_node(node_id, FunctionTool(
561
561
  tool=sandbox_tool, name=node['id'], return_type='dict',
@@ -75,6 +75,7 @@ def get_tools(tools_list: list, alita_client, llm, memory_store: BaseStore = Non
75
75
  tools += SandboxToolkit.get_toolkit(
76
76
  stateful=False,
77
77
  allow_net=True,
78
+ alita_client=alita_client,
78
79
  ).get_tools()
79
80
  elif tool['name'] == 'image_generation':
80
81
  if alita_client and alita_client.model_image_generation:
@@ -7,7 +7,7 @@ from langchain_core.callbacks import dispatch_custom_event
7
7
  from langchain_core.messages import ToolCall
8
8
  from langchain_core.runnables import RunnableConfig
9
9
  from langchain_core.tools import BaseTool, ToolException
10
- from typing import Any, Optional, Union, Annotated
10
+ from typing import Any, Optional, Union
11
11
  from langchain_core.utils.function_calling import convert_to_openai_tool
12
12
  from pydantic import ValidationError
13
13
 
@@ -34,25 +34,7 @@ class FunctionTool(BaseTool):
34
34
 
35
35
  del state_copy['messages'] # remove messages to avoid issues with pickling without langchain-core
36
36
  # inject state into the code block as alita_state variable
37
- pyodide_predata = f"alita_state = {state_copy}"
38
- # add classes related to sandbox client
39
- # read the content of alita_sdk/runtime/cliens/sandbox_client.py
40
- try:
41
- import os
42
- from pathlib import Path
43
-
44
- # Get the directory of the current file and construct the path to sandbox_client.py
45
- current_dir = Path(__file__).parent
46
- sandbox_client_path = current_dir.parent / 'clients' / 'sandbox_client.py'
47
-
48
- with open(sandbox_client_path, 'r') as f:
49
- sandbox_client_code = f.read()
50
- pyodide_predata += f"\n{sandbox_client_code}\n"
51
- pyodide_predata += (f"alita_client = SandboxClient(base_url='{self.alita_client.base_url}',"
52
- f"project_id={self.alita_client.project_id},"
53
- f"auth_token='{self.alita_client.auth_token}')")
54
- except FileNotFoundError:
55
- logger.error(f"sandbox_client.py not found at {sandbox_client_path}. Ensure the file exists.")
37
+ pyodide_predata = f"#state dict\nalita_state = {state_copy}\n"
56
38
  return pyodide_predata
57
39
 
58
40
  def _handle_pyodide_output(self, tool_result: Any) -> dict:
@@ -112,7 +94,9 @@ class FunctionTool(BaseTool):
112
94
  # special handler for PyodideSandboxTool
113
95
  if self._is_pyodide_tool():
114
96
  code = func_args['code']
115
- func_args['code'] = f"{self._prepare_pyodide_input(state)}\n{code}"
97
+ func_args['code'] = (f"{self._prepare_pyodide_input(state)}\n{code}"
98
+ # handle new lines in the code properly
99
+ .replace('\\n','\\\\n'))
116
100
  try:
117
101
  tool_result = self.tool.invoke(func_args, config, **kwargs)
118
102
  dispatch_custom_event(
@@ -2,9 +2,12 @@ import asyncio
2
2
  import logging
3
3
  import subprocess
4
4
  import os
5
- from typing import Any, Type, Optional, Dict, List, Literal
5
+ from typing import Any, Type, Optional, Dict, List, Literal, Union
6
+ from copy import deepcopy
7
+ from pathlib import Path
6
8
 
7
9
  from langchain_core.tools import BaseTool, BaseToolkit
10
+ from langchain_core.messages import ToolCall
8
11
  from pydantic import BaseModel, create_model, ConfigDict, Field
9
12
  from pydantic.fields import FieldInfo
10
13
 
@@ -19,7 +22,7 @@ def get_tools(tools_list: list, alita_client=None, llm=None, memory_store=None):
19
22
 
20
23
  Args:
21
24
  tools_list: List of tool configurations
22
- alita_client: Alita client instance (unused for sandbox)
25
+ alita_client: Alita client instance for sandbox tools
23
26
  llm: LLM client instance (unused for sandbox)
24
27
  memory_store: Optional memory store instance (unused for sandbox)
25
28
 
@@ -34,6 +37,7 @@ def get_tools(tools_list: list, alita_client=None, llm=None, memory_store=None):
34
37
  toolkit_instance = SandboxToolkit.get_toolkit(
35
38
  stateful=tool['settings'].get('stateful', False),
36
39
  allow_net=tool['settings'].get('allow_net', True),
40
+ alita_client=alita_client,
37
41
  toolkit_name=tool.get('toolkit_name', '')
38
42
  )
39
43
  all_tools.extend(toolkit_instance.get_tools())
@@ -126,6 +130,7 @@ class PyodideSandboxTool(BaseTool):
126
130
  allow_net: bool = True
127
131
  session_bytes: Optional[bytes] = None
128
132
  session_metadata: Optional[Dict] = None
133
+ alita_client: Optional[Any] = None
129
134
 
130
135
  def __init__(self, **kwargs: Any) -> None:
131
136
  super().__init__(**kwargs)
@@ -134,6 +139,28 @@ class PyodideSandboxTool(BaseTool):
134
139
  _setup_pyodide_cache_env()
135
140
  self._initialize_sandbox()
136
141
 
142
+ def _prepare_pyodide_input(self, code: str) -> str:
143
+ """Prepare input for PyodideSandboxTool by injecting state and alita_client into the code block."""
144
+ pyodide_predata = ""
145
+
146
+ # Add alita_client if available
147
+ if self.alita_client:
148
+ try:
149
+ # Get the directory of the current file and construct the path to sandbox_client.py
150
+ current_dir = Path(__file__).parent
151
+ sandbox_client_path = current_dir.parent / 'clients' / 'sandbox_client.py'
152
+
153
+ with open(sandbox_client_path, 'r') as f:
154
+ sandbox_client_code = f.read()
155
+ pyodide_predata += f"{sandbox_client_code}\n"
156
+ pyodide_predata += (f"alita_client = SandboxClient(base_url='{self.alita_client.base_url}',"
157
+ f"project_id={self.alita_client.project_id},"
158
+ f"auth_token='{self.alita_client.auth_token}')\n")
159
+ except FileNotFoundError:
160
+ logger.error(f"sandbox_client.py not found. Ensure the file exists.")
161
+
162
+ return f"#elitea simplified client\n{pyodide_predata}{code}"
163
+
137
164
  def _initialize_sandbox(self) -> None:
138
165
  """Initialize the PyodideSandbox instance with optimized settings"""
139
166
  try:
@@ -180,6 +207,9 @@ class PyodideSandboxTool(BaseTool):
180
207
  if self._sandbox is None:
181
208
  self._initialize_sandbox()
182
209
 
210
+ # Prepare code with state and client injection
211
+ prepared_code = self._prepare_pyodide_input(code)
212
+
183
213
  # Check if we're already in an async context
184
214
  try:
185
215
  loop = asyncio.get_running_loop()
@@ -187,11 +217,11 @@ class PyodideSandboxTool(BaseTool):
187
217
  # We'll need to use a different approach
188
218
  import concurrent.futures
189
219
  with concurrent.futures.ThreadPoolExecutor() as executor:
190
- future = executor.submit(asyncio.run, self._arun(code))
220
+ future = executor.submit(asyncio.run, self._arun(prepared_code))
191
221
  return future.result()
192
222
  except RuntimeError:
193
223
  # No running loop, safe to use asyncio.run
194
- return asyncio.run(self._arun(code))
224
+ return asyncio.run(self._arun(prepared_code))
195
225
  except (ImportError, RuntimeError) as e:
196
226
  # Handle specific dependency errors gracefully
197
227
  error_msg = str(e)
@@ -250,7 +280,7 @@ class PyodideSandboxTool(BaseTool):
250
280
 
251
281
  except Exception as e:
252
282
  logger.error(f"Error executing code in sandbox: {e}")
253
- return f"Error executing code: {str(e)}"
283
+ return {"error": f"Error executing code: {str(e)}"}
254
284
 
255
285
 
256
286
  class StatefulPyodideSandboxTool(PyodideSandboxTool):
@@ -278,7 +308,7 @@ class StatefulPyodideSandboxTool(PyodideSandboxTool):
278
308
 
279
309
 
280
310
  # Factory function for creating sandbox tools
281
- def create_sandbox_tool(stateful: bool = False, allow_net: bool = True) -> BaseTool:
311
+ def create_sandbox_tool(stateful: bool = False, allow_net: bool = True, alita_client: Optional[Any] = None) -> BaseTool:
282
312
  """
283
313
  Factory function to create sandbox tools with specified configuration.
284
314
 
@@ -302,22 +332,22 @@ def create_sandbox_tool(stateful: bool = False, allow_net: bool = True) -> BaseT
302
332
  - Cached wheels reduce package download time from ~4.76s to near-instant
303
333
  """
304
334
  if stateful:
305
- return StatefulPyodideSandboxTool(allow_net=allow_net)
335
+ return StatefulPyodideSandboxTool(allow_net=allow_net, alita_client=alita_client)
306
336
  else:
307
- return PyodideSandboxTool(stateful=False, allow_net=allow_net)
337
+ return PyodideSandboxTool(stateful=False, allow_net=allow_net, alita_client=alita_client)
308
338
 
309
339
 
310
340
  class SandboxToolkit(BaseToolkit):
311
341
  tools: List[BaseTool] = []
312
342
 
313
343
  @staticmethod
314
- def toolkit_config_schema() -> BaseModel:
344
+ def toolkit_config_schema() -> Type[BaseModel]:
315
345
  # Create sample tools to get their schemas
316
346
  sample_tools = [
317
347
  PyodideSandboxTool(),
318
348
  StatefulPyodideSandboxTool()
319
349
  ]
320
- selected_tools = {x.name: x.args_schema.schema() for x in sample_tools}
350
+ selected_tools = {x.name: x.args_schema.model_json_schema() for x in sample_tools}
321
351
 
322
352
  return create_model(
323
353
  'sandbox',
@@ -338,24 +368,24 @@ class SandboxToolkit(BaseToolkit):
338
368
  )
339
369
 
340
370
  @classmethod
341
- def get_toolkit(cls, stateful: bool = False, allow_net: bool = True, **kwargs):
371
+ def get_toolkit(cls, stateful: bool = False, allow_net: bool = True, alita_client=None, **kwargs):
342
372
  """
343
373
  Get toolkit with sandbox tools.
344
374
 
345
375
  Args:
346
376
  stateful: Whether to maintain state between executions
347
377
  allow_net: Whether to allow network access
378
+ alita_client: Alita client instance for sandbox tools
348
379
  **kwargs: Additional arguments
349
380
  """
350
381
  tools = []
351
382
 
352
383
  if stateful:
353
- tools.append(StatefulPyodideSandboxTool(allow_net=allow_net))
384
+ tools.append(StatefulPyodideSandboxTool(allow_net=allow_net, alita_client=alita_client))
354
385
  else:
355
- tools.append(PyodideSandboxTool(stateful=False, allow_net=allow_net))
386
+ tools.append(PyodideSandboxTool(stateful=False, allow_net=allow_net, alita_client=alita_client))
356
387
 
357
388
  return cls(tools=tools)
358
389
 
359
390
  def get_tools(self):
360
391
  return self.tools
361
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.387
3
+ Version: 0.3.389
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
@@ -45,7 +45,7 @@ alita_sdk/runtime/langchain/assistant.py,sha256=w6OUXNOWxWkju5n99Tfs_bbXlRsu397Q
45
45
  alita_sdk/runtime/langchain/chat_message_template.py,sha256=kPz8W2BG6IMyITFDA5oeb5BxVRkHEVZhuiGl4MBZKdc,2176
46
46
  alita_sdk/runtime/langchain/constants.py,sha256=eHVJ_beJNTf1WJo4yq7KMK64fxsRvs3lKc34QCXSbpk,3319
47
47
  alita_sdk/runtime/langchain/indexer.py,sha256=0ENHy5EOhThnAiYFc7QAsaTNp9rr8hDV_hTK8ahbatk,37592
48
- alita_sdk/runtime/langchain/langraph_agent.py,sha256=2AjPJQk1TpBzAKsJAPsETtjUF1p9GH5Q-GC51knX1es,48659
48
+ alita_sdk/runtime/langchain/langraph_agent.py,sha256=p9okbdkZhG4qY0GHNm4PL6ZGQwVw-enWyoEPB_FKsDg,48706
49
49
  alita_sdk/runtime/langchain/mixedAgentParser.py,sha256=M256lvtsL3YtYflBCEp-rWKrKtcY1dJIyRGVv7KW9ME,2611
50
50
  alita_sdk/runtime/langchain/mixedAgentRenderes.py,sha256=asBtKqm88QhZRILditjYICwFVKF5KfO38hu2O-WrSWE,5964
51
51
  alita_sdk/runtime/langchain/store_manager.py,sha256=i8Fl11IXJhrBXq1F1ukEVln57B1IBe-tqSUvfUmBV4A,2218
@@ -102,7 +102,7 @@ alita_sdk/runtime/toolkits/configurations.py,sha256=kIDAlnryPQfbZyFxV-9SzN2-Vefz
102
102
  alita_sdk/runtime/toolkits/datasource.py,sha256=qk78OdPoReYPCWwahfkKLbKc4pfsu-061oXRryFLP6I,2498
103
103
  alita_sdk/runtime/toolkits/prompt.py,sha256=WIpTkkVYWqIqOWR_LlSWz3ug8uO9tm5jJ7aZYdiGRn0,1192
104
104
  alita_sdk/runtime/toolkits/subgraph.py,sha256=wwUK8JjPXkGzyVZ3tAukmvST6eGbqx_U11rpnmbrvtg,2105
105
- alita_sdk/runtime/toolkits/tools.py,sha256=MV9sX7YTWqXbqhzhc7Xj3PG1Y_NZJ02r8XV8gg__WSI,9274
105
+ alita_sdk/runtime/toolkits/tools.py,sha256=THBOuP6wfWCRScsIMBk4Tu675vhc6bYDVfAgz4ehn4Q,9321
106
106
  alita_sdk/runtime/toolkits/vectorstore.py,sha256=BGppQADa1ZiLO17fC0uCACTTEvPHlodEDYEzUcBRbAA,2901
107
107
  alita_sdk/runtime/tools/__init__.py,sha256=Fx7iHqkzA90-KfjdcUUzMUI_7kDarjuTsSpSzOW2pN0,568
108
108
  alita_sdk/runtime/tools/agent.py,sha256=m98QxOHwnCRTT9j18Olbb5UPS8-ZGeQaGiUyZJSyFck,3162
@@ -110,7 +110,7 @@ alita_sdk/runtime/tools/application.py,sha256=z3vLZODs-_xEEnZFmGF0fKz1j3VtNJxqsA
110
110
  alita_sdk/runtime/tools/artifact.py,sha256=u3szFwZqguHrPZ3tZJ7S_TiZl7cxlT3oHYd6zbdpRDE,13842
111
111
  alita_sdk/runtime/tools/datasource.py,sha256=pvbaSfI-ThQQnjHG-QhYNSTYRnZB0rYtZFpjCfpzxYI,2443
112
112
  alita_sdk/runtime/tools/echo.py,sha256=spw9eCweXzixJqHnZofHE1yWiSUa04L4VKycf3KCEaM,486
113
- alita_sdk/runtime/tools/function.py,sha256=4r-VbGtm8gN_RTU2I-1iUNVs_MWNgRqn-aQrr__lCTc,7001
113
+ alita_sdk/runtime/tools/function.py,sha256=jk_JrtuYByR9Df5EFOGFheB9HktNPJcOwf4jsTzV73w,6144
114
114
  alita_sdk/runtime/tools/graph.py,sha256=7jImBBSEdP5Mjnn2keOiyUwdGDFhEXLUrgUiugO3mgA,3503
115
115
  alita_sdk/runtime/tools/image_generation.py,sha256=Kls9D_ke_SK7xmVr7I9SlQcAEBJc86gf66haN0qIj9k,7469
116
116
  alita_sdk/runtime/tools/indexer_tool.py,sha256=whSLPevB4WD6dhh2JDXEivDmTvbjiMV1MrPl9cz5eLA,4375
@@ -121,7 +121,7 @@ alita_sdk/runtime/tools/mcp_server_tool.py,sha256=MhLxZJ44LYrB_0GrojmkyqKoDRaqIH
121
121
  alita_sdk/runtime/tools/pgvector_search.py,sha256=NN2BGAnq4SsDHIhUcFZ8d_dbEOM8QwB0UwpsWCYruXU,11692
122
122
  alita_sdk/runtime/tools/prompt.py,sha256=nJafb_e5aOM1Rr3qGFCR-SKziU9uCsiP2okIMs9PppM,741
123
123
  alita_sdk/runtime/tools/router.py,sha256=p7e0tX6YAWw2M2Nq0A_xqw1E2P-Xz1DaJvhUstfoZn4,1584
124
- alita_sdk/runtime/tools/sandbox.py,sha256=CBPaHwGv74FiHbELuwLBEvB2C-HhbptUnSMipzJUSZA,14282
124
+ alita_sdk/runtime/tools/sandbox.py,sha256=7KpTAE4Fs1dvQIwAH__jwrxXG4QUa9GhcOhlkE8EKro,16049
125
125
  alita_sdk/runtime/tools/tool.py,sha256=lE1hGi6qOAXG7qxtqxarD_XMQqTghdywf261DZawwno,5631
126
126
  alita_sdk/runtime/tools/vectorstore.py,sha256=0SzfY1dYrGr7YUapJzXY01JFyzLv36dPjwHzs1XZIM4,34392
127
127
  alita_sdk/runtime/tools/vectorstore_base.py,sha256=k_6LAhhBJEs5SXCQJI3bBvJLQli6_3pHjqF6SCQGJGc,28312
@@ -353,8 +353,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
353
353
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0ne8XLJEQSLOWfzd2HdnqOYmQlUliKHbBED5kW_Vias,2895
354
354
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
355
355
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
356
- alita_sdk-0.3.387.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
357
- alita_sdk-0.3.387.dist-info/METADATA,sha256=aJvehGnJX53isNXYpw5172D52dkTBiFRLyzXh4bd6DY,19071
358
- alita_sdk-0.3.387.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
359
- alita_sdk-0.3.387.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
360
- alita_sdk-0.3.387.dist-info/RECORD,,
356
+ alita_sdk-0.3.389.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
357
+ alita_sdk-0.3.389.dist-info/METADATA,sha256=islqusegdEMMBtEZYtzDqn7HIbx_8CNNdu7Oq-HQn9A,19071
358
+ alita_sdk-0.3.389.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
359
+ alita_sdk-0.3.389.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
360
+ alita_sdk-0.3.389.dist-info/RECORD,,