alita-sdk 0.3.266__py3-none-any.whl → 0.3.268__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.
@@ -422,7 +422,7 @@ def create_graph(
422
422
  if not pipeline_name:
423
423
  raise ValueError("Subgraph must have a 'tool' node: add required tool to the subgraph node")
424
424
  node_fn = SubgraphRunnable(
425
- inner=tool,
425
+ inner=tool.graph,
426
426
  name=pipeline_name,
427
427
  input_mapping=node.get('input_mapping', {}),
428
428
  output_mapping=node.get('output_mapping', {}),
@@ -666,7 +666,9 @@ class LangGraphAgentRunnable(CompiledStateGraph):
666
666
  config: Optional[RunnableConfig] = None,
667
667
  *args, **kwargs):
668
668
  logger.info(f"Incomming Input: {input}")
669
- if not config.get("configurable", {}).get("thread_id"):
669
+ if config is None:
670
+ config = RunnableConfig()
671
+ if not config.get("configurable", {}).get("thread_id", ""):
670
672
  config["configurable"] = {"thread_id": str(uuid4())}
671
673
  thread_id = config.get("configurable", {}).get("thread_id")
672
674
  # Handle chat history and current input properly
@@ -1,8 +1,11 @@
1
1
  from typing import List, Any
2
2
 
3
+ from langchain_core.tools import BaseTool
4
+ from langgraph.checkpoint.memory import MemorySaver
3
5
  from langgraph.graph.state import CompiledStateGraph
4
6
 
5
7
  from ..langchain.langraph_agent import create_graph, SUBGRAPH_REGISTRY
8
+ from ..tools.graph import GraphTool
6
9
  from ..utils.utils import clean_string
7
10
 
8
11
 
@@ -16,7 +19,7 @@ class SubgraphToolkit:
16
19
  llm,
17
20
  app_api_key: str,
18
21
  selected_tools: list[str] = []
19
- ) -> List[CompiledStateGraph]:
22
+ ) -> List[BaseTool]:
20
23
  from .tools import get_tools
21
24
  # from langgraph.checkpoint.memory import MemorySaver
22
25
 
@@ -36,18 +39,20 @@ class SubgraphToolkit:
36
39
 
37
40
  # For backward compatibility, still create a compiled graph stub
38
41
  # This is mainly used for identification in the parent graph's tools list
42
+ # For now the graph toolkit will have its own ephemeral in memory checkpoint memory.
39
43
  graph = create_graph(
40
44
  client=llm,
41
45
  tools=tools,
42
46
  yaml_schema=version_details['instructions'],
43
47
  debug=False,
44
48
  store=None,
45
- memory=None,
46
- for_subgraph=True, # compile as raw subgraph
49
+ memory=MemorySaver(),
50
+ # for_subgraph=True, # compile as raw subgraph
47
51
  )
48
-
52
+
53
+ cleaned_subgraph_name = clean_string(subgraph_name)
49
54
  # Tag the graph stub for parent lookup
50
- graph.name = clean_string(subgraph_name)
55
+ graph.name = cleaned_subgraph_name
51
56
 
52
57
  # Return the compiled graph stub for backward compatibility
53
- return [graph]
58
+ return [GraphTool(description=app_details['description'], name=subgraph_name, graph=graph)]
@@ -0,0 +1,75 @@
1
+ import json
2
+
3
+ from langgraph.graph.state import CompiledStateGraph
4
+
5
+ from ..utils.utils import clean_string
6
+ from langchain_core.tools import BaseTool
7
+ from langchain_core.messages import BaseMessage, AIMessage, ToolCall
8
+ from typing import Any, Type, Optional, Union
9
+ from pydantic import create_model, field_validator, BaseModel
10
+ from pydantic.fields import FieldInfo
11
+ from ..langchain.mixedAgentRenderes import convert_message_to_json
12
+ from logging import getLogger
13
+
14
+ logger = getLogger(__name__)
15
+
16
+ graphToolSchema = create_model(
17
+ "graphToolSchema",
18
+ input=(str, FieldInfo(description="User Input for Graph")),
19
+ chat_history=(Optional[list[BaseMessage]],
20
+ FieldInfo(description="Chat History relevant for Graph in format [{'role': '<user| assistant | etc>', 'content': '<content of the respected message>'}]", default=[]))
21
+ )
22
+
23
+
24
+ def formulate_query(kwargs):
25
+ chat_history = []
26
+ if kwargs.get('chat_history'):
27
+ if isinstance(kwargs.get('chat_history')[-1], BaseMessage):
28
+ chat_history = convert_message_to_json(kwargs.get('chat_history')[:])
29
+ elif isinstance(kwargs.get('chat_history')[-1], dict):
30
+ if all([True if message.get('role') and message.get('content') else False for message in
31
+ kwargs.get('chat_history')]):
32
+ chat_history = kwargs.get('chat_history')[:]
33
+ else:
34
+ for each in kwargs.get('chat_history')[:]:
35
+ chat_history.append(AIMessage(json.dumps(each)))
36
+ elif isinstance(kwargs.get('chat_history')[-1], str):
37
+ chat_history = []
38
+ for each in kwargs.get('chat_history')[:]:
39
+ chat_history.append(AIMessage(each))
40
+ elif kwargs.get('messages'):
41
+ chat_history = convert_message_to_json(kwargs.get('messages')[:])
42
+ result = {"input": kwargs.get('input'), "chat_history": chat_history}
43
+ for key, value in kwargs.items():
44
+ if key not in ("input", "chat_history"):
45
+ result[key] = value
46
+ return result
47
+
48
+
49
+ class GraphTool(BaseTool):
50
+ name: str
51
+ description: str
52
+ graph: CompiledStateGraph
53
+ args_schema: Type[BaseModel] = graphToolSchema
54
+ return_type: str = "str"
55
+
56
+ @field_validator('name', mode='before')
57
+ @classmethod
58
+ def remove_spaces(cls, v):
59
+ return clean_string(v)
60
+
61
+ def invoke(self, input: Any, config: Optional[dict] = None, **kwargs: Any) -> Any:
62
+ """Override default invoke to preserve all fields, not just args_schema"""
63
+ schema_values = self.args_schema(**input).model_dump() if self.args_schema else {}
64
+ extras = {k: v for k, v in input.items() if k not in schema_values}
65
+ all_kwargs = {**kwargs, **extras, **schema_values}
66
+ if config is None:
67
+ config = {}
68
+ return self._run(*config, **all_kwargs)
69
+
70
+ def _run(self, *args, **kwargs):
71
+ response = self.graph.invoke(formulate_query(kwargs))
72
+ if self.return_type == "str":
73
+ return response["output"]
74
+ else:
75
+ return {"messages": [{"role": "assistant", "content": response["output"]}]}
@@ -110,8 +110,8 @@ class BaseIndexerToolkit(VectorStoreWrapperBase):
110
110
  connection_string = conn.get_secret_value() if isinstance(conn, SecretStr) else conn
111
111
  collection_name = kwargs.get('collection_name')
112
112
 
113
- if 'embedding_model' not in kwargs:
114
- kwargs['embedding_model'] = 'HuggingFaceEmbeddings'
113
+ if not kwargs.get('embedding_model'):
114
+ kwargs['embedding_model'] = 'text-embedding-ada-002'
115
115
  if 'vectorstore_type' not in kwargs:
116
116
  kwargs['vectorstore_type'] = 'PGVector'
117
117
  vectorstore_type = kwargs.get('vectorstore_type')
@@ -58,8 +58,8 @@ BaseSearchParams = create_model(
58
58
  default={},
59
59
  examples=["{\"key\": \"value\"}", "{\"status\": \"active\"}"]
60
60
  )),
61
- cut_off=(Optional[float], Field(description="Cut-off score for search results", default=0.5)),
62
- search_top=(Optional[int], Field(description="Number of top results to return", default=10)),
61
+ cut_off=(Optional[float], Field(description="Cut-off score for search results", default=0.5, ge=0, le=1)),
62
+ search_top=(Optional[int], Field(description="Number of top results to return", default=10, ge=0)),
63
63
  full_text_search=(Optional[Dict[str, Any]], Field(
64
64
  description="Full text search parameters. Can be a dictionary with search options.",
65
65
  default=None
@@ -88,8 +88,8 @@ BaseStepbackSearchParams = create_model(
88
88
  default={},
89
89
  examples=["{\"key\": \"value\"}", "{\"status\": \"active\"}"]
90
90
  )),
91
- cut_off=(Optional[float], Field(description="Cut-off score for search results", default=0.5)),
92
- search_top=(Optional[int], Field(description="Number of top results to return", default=10)),
91
+ cut_off=(Optional[float], Field(description="Cut-off score for search results", default=0.5, ge=0, le=1)),
92
+ search_top=(Optional[int], Field(description="Number of top results to return", default=10, ge=0)),
93
93
  reranker=(Optional[dict], Field(
94
94
  description="Reranker configuration. Can be a dictionary with reranking parameters.",
95
95
  default={}
@@ -106,18 +106,6 @@ class GitLabAPIWrapper(BaseCodeToolApiWrapper):
106
106
  _repo_instance: Any = PrivateAttr()
107
107
  _active_branch: Any = PrivateAttr()
108
108
 
109
- llm: Optional[Any] = None
110
- # Alita instance
111
- alita: Optional[Any] = None
112
-
113
- # Vector store configuration
114
- connection_string: Optional[SecretStr] = None
115
- collection_name: Optional[str] = None
116
- doctype: Optional[str] = 'code'
117
- embedding_model: Optional[str] = "HuggingFaceEmbeddings"
118
- embedding_model_params: Optional[Dict[str, Any]] = {"model_name": "sentence-transformers/all-MiniLM-L6-v2"}
119
- vectorstore_type: Optional[str] = "PGVector"
120
-
121
109
  @model_validator(mode='before')
122
110
  @classmethod
123
111
  def validate_toolkit(cls, values: Dict) -> Dict:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.266
3
+ Version: 0.3.268
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 <lifedjik@gmail.com>, Artem Dubrovskiy <ad13box@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -34,7 +34,7 @@ alita_sdk/runtime/langchain/assistant.py,sha256=suBFEt24t9bLyBHMzkR3Mkgd9HIrGBq_
34
34
  alita_sdk/runtime/langchain/chat_message_template.py,sha256=kPz8W2BG6IMyITFDA5oeb5BxVRkHEVZhuiGl4MBZKdc,2176
35
35
  alita_sdk/runtime/langchain/constants.py,sha256=eHVJ_beJNTf1WJo4yq7KMK64fxsRvs3lKc34QCXSbpk,3319
36
36
  alita_sdk/runtime/langchain/indexer.py,sha256=0ENHy5EOhThnAiYFc7QAsaTNp9rr8hDV_hTK8ahbatk,37592
37
- alita_sdk/runtime/langchain/langraph_agent.py,sha256=m96QQR1zoWQ8cDfwD4mcrlBl41JIrLwxDGPOg6yQzf8,43850
37
+ alita_sdk/runtime/langchain/langraph_agent.py,sha256=3s1QLEPu0U0pz-PVaLBIEZLp7dhqAxy2wNUIjvIt49I,43925
38
38
  alita_sdk/runtime/langchain/mixedAgentParser.py,sha256=M256lvtsL3YtYflBCEp-rWKrKtcY1dJIyRGVv7KW9ME,2611
39
39
  alita_sdk/runtime/langchain/mixedAgentRenderes.py,sha256=asBtKqm88QhZRILditjYICwFVKF5KfO38hu2O-WrSWE,5964
40
40
  alita_sdk/runtime/langchain/store_manager.py,sha256=i8Fl11IXJhrBXq1F1ukEVln57B1IBe-tqSUvfUmBV4A,2218
@@ -87,7 +87,7 @@ alita_sdk/runtime/toolkits/artifact.py,sha256=3AjdKxrsbb0kzQ6NxJla9XqJcgyDJicMAq
87
87
  alita_sdk/runtime/toolkits/configurations.py,sha256=kIDAlnryPQfbZyFxV-9SzN2-Vefzx06TX1BBdIIpN90,141
88
88
  alita_sdk/runtime/toolkits/datasource.py,sha256=qk78OdPoReYPCWwahfkKLbKc4pfsu-061oXRryFLP6I,2498
89
89
  alita_sdk/runtime/toolkits/prompt.py,sha256=WIpTkkVYWqIqOWR_LlSWz3ug8uO9tm5jJ7aZYdiGRn0,1192
90
- alita_sdk/runtime/toolkits/subgraph.py,sha256=ZYqI4yVLbEPAjCR8dpXbjbL2ipX598Hk3fL6AgaqFD4,1758
90
+ alita_sdk/runtime/toolkits/subgraph.py,sha256=wwUK8JjPXkGzyVZ3tAukmvST6eGbqx_U11rpnmbrvtg,2105
91
91
  alita_sdk/runtime/toolkits/tools.py,sha256=jNgWazbCb2t-H0OOErg7oPDxKXM-ezUAc6y9wqlI6GY,7875
92
92
  alita_sdk/runtime/toolkits/vectorstore.py,sha256=BGppQADa1ZiLO17fC0uCACTTEvPHlodEDYEzUcBRbAA,2901
93
93
  alita_sdk/runtime/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -97,6 +97,7 @@ alita_sdk/runtime/tools/artifact.py,sha256=yIn-kfI9OWoaxbBeqdqF0M1HPeMtNnvZ_pCPo
97
97
  alita_sdk/runtime/tools/datasource.py,sha256=pvbaSfI-ThQQnjHG-QhYNSTYRnZB0rYtZFpjCfpzxYI,2443
98
98
  alita_sdk/runtime/tools/echo.py,sha256=spw9eCweXzixJqHnZofHE1yWiSUa04L4VKycf3KCEaM,486
99
99
  alita_sdk/runtime/tools/function.py,sha256=ZFpd7TGwIawze2e7BHlKwP0NHwNw42wwrmmnXyJQJhk,2600
100
+ alita_sdk/runtime/tools/graph.py,sha256=MbnZYqdmvZY7SGDp43lOVVIjUt5ARHSgj43mdtBjSjQ,3092
100
101
  alita_sdk/runtime/tools/indexer_tool.py,sha256=whSLPevB4WD6dhh2JDXEivDmTvbjiMV1MrPl9cz5eLA,4375
101
102
  alita_sdk/runtime/tools/llm.py,sha256=NsrsP-SblyxDdzgMCn9_OBUL0sUGDVS5yqer49V7ciE,15069
102
103
  alita_sdk/runtime/tools/loop.py,sha256=uds0WhZvwMxDVFI6MZHrcmMle637cQfBNg682iLxoJA,8335
@@ -119,8 +120,8 @@ alita_sdk/runtime/utils/toolkit_runtime.py,sha256=MU63Fpxj0b5_r1IUUc0Q3-PN9VwL7r
119
120
  alita_sdk/runtime/utils/toolkit_utils.py,sha256=I9QFqnaqfVgN26LUr6s3XlBlG6y0CoHURnCzG7XcwVs,5311
120
121
  alita_sdk/runtime/utils/utils.py,sha256=VXNLsdeTmf6snn9EtUyobv4yL-xzLhUcH8P_ORMifYc,675
121
122
  alita_sdk/tools/__init__.py,sha256=ko5TToGYZFmBrho26DRAVvrkHWxQ2sfs8gVAASinYp8,10611
122
- alita_sdk/tools/base_indexer_toolkit.py,sha256=17v9AIMGLO0OBUWS6A_-1xvHMArqTwK84mfkpTrwPwM,18434
123
- alita_sdk/tools/elitea_base.py,sha256=PfelIUb5YFTjDN_1jNYT9tJbjfYr11PAUrPQHyW2d5I,32830
123
+ alita_sdk/tools/base_indexer_toolkit.py,sha256=JcjsN-xdZfwNJ7qy_TUgv6F1dIZhsQnguxsWsnsmj14,18437
124
+ alita_sdk/tools/elitea_base.py,sha256=zx0ai3aN0re-Uc7_AKJjbTPeJ_K4OpFfK0jsaGvdMMU,32866
124
125
  alita_sdk/tools/non_code_indexer_toolkit.py,sha256=v9uq1POE1fQKCd152mbqDtF-HSe0qoDj83k4E5LAkMI,1080
125
126
  alita_sdk/tools/ado/__init__.py,sha256=u2tdDgufGuDb-7lIgKKQlqgStL9Wd1gzNmRNYems2c0,1267
126
127
  alita_sdk/tools/ado/utils.py,sha256=PTCludvaQmPLakF2EbCGy66Mro4-rjDtavVP-xcB2Wc,1252
@@ -230,7 +231,7 @@ alita_sdk/tools/github/schemas.py,sha256=yFsqivfjCPRk9GxFJrL8sTz6nnjFCZ0j5DIfPtG
230
231
  alita_sdk/tools/github/tool.py,sha256=Jnnv5lenV5ds8AAdyo2m8hSzyJ117HZBjzHC6T1ck-M,1037
231
232
  alita_sdk/tools/github/tool_prompts.py,sha256=y6ZW_FpUCE87Uop3WuQAZVRnzxO5t7xjBOI5bCqiluw,30194
232
233
  alita_sdk/tools/gitlab/__init__.py,sha256=wLTgBEeX44A3YkPkyUoPe4GVkDwHgLUpNEIBwJvaGUY,4488
233
- alita_sdk/tools/gitlab/api_wrapper.py,sha256=KYCRO2pF8EPTLhWuEj64XsHPCYSucsf8S3R_ofJttrA,22301
234
+ alita_sdk/tools/gitlab/api_wrapper.py,sha256=x2AdR4CkqnMPxVOWwIAgxXuQuzel58drz8m2jyf2R0M,21833
234
235
  alita_sdk/tools/gitlab/tools.py,sha256=vOGTlSaGaFmWn6LS6YFP-FuTqUPun9vnv1VrUcUHAZQ,16500
235
236
  alita_sdk/tools/gitlab/utils.py,sha256=Z2XiqIg54ouqqt1to-geFybmkCb1I6bpE91wfnINH1I,2320
236
237
  alita_sdk/tools/gitlab_org/__init__.py,sha256=k8ECZzeGCmgKJ9UaVmPPlFxf-h1E6taC2SnPVrxPpHY,3775
@@ -335,8 +336,8 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=HOt9ShtJI_1tVPcwd3Rwk-VS0SMLq
335
336
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=0AI_j27xVO5Gk5HQMFrqPTd4uvuVTpiZUicBrdfEpKg,2796
336
337
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
337
338
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
338
- alita_sdk-0.3.266.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
339
- alita_sdk-0.3.266.dist-info/METADATA,sha256=zPwf0nv3u6t4QxbLBnNNSifv802d_j070ob8wr47fyw,18897
340
- alita_sdk-0.3.266.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
341
- alita_sdk-0.3.266.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
342
- alita_sdk-0.3.266.dist-info/RECORD,,
339
+ alita_sdk-0.3.268.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
340
+ alita_sdk-0.3.268.dist-info/METADATA,sha256=PSq9ld7E0116iWPhcL1hXxmgvIDs-p4zrEaF2eoHEx8,18897
341
+ alita_sdk-0.3.268.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
342
+ alita_sdk-0.3.268.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
343
+ alita_sdk-0.3.268.dist-info/RECORD,,