alita-sdk 0.3.148__py3-none-any.whl → 0.3.150__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.
@@ -9,6 +9,7 @@ from langchain_core.messages import (
9
9
  SystemMessage, BaseMessage,
10
10
  )
11
11
  from langchain_core.tools import ToolException
12
+ from langgraph.store.base import BaseStore
12
13
 
13
14
  from ..langchain.assistant import Assistant as LangChainAssistant
14
15
  # from ..llamaindex.assistant import Assistant as LLamaAssistant
@@ -178,7 +179,7 @@ class AlitaClient:
178
179
  tools: Optional[list] = None, chat_history: Optional[List[Any]] = None,
179
180
  app_type=None, memory=None, runtime='langchain',
180
181
  application_variables: Optional[dict] = None,
181
- version_details: Optional[dict] = None):
182
+ version_details: Optional[dict] = None, store: Optional[BaseStore] = None):
182
183
  if tools is None:
183
184
  tools = []
184
185
  if chat_history is None:
@@ -210,11 +211,11 @@ class AlitaClient:
210
211
  app_type = "openai"
211
212
  if runtime == 'nonrunnable':
212
213
  return LangChainAssistant(self, data, client, chat_history, app_type,
213
- tools=tools, memory=memory)
214
+ tools=tools, memory=memory, store=store)
214
215
  if runtime == 'langchain':
215
216
  return LangChainAssistant(self, data, client,
216
217
  chat_history, app_type,
217
- tools=tools, memory=memory).runnable()
218
+ tools=tools, memory=memory, store=store).runnable()
218
219
  elif runtime == 'llama':
219
220
  raise NotImplementedError("LLama runtime is not supported")
220
221
 
@@ -5,8 +5,9 @@ from typing import Any, Optional
5
5
  from langchain.agents import (
6
6
  AgentExecutor, create_openai_tools_agent,
7
7
  create_json_chat_agent)
8
+ from langgraph.store.base import BaseStore
9
+
8
10
  from .agents.xml_chat import create_xml_chat_agent
9
- # from ..langchain.mixedAgentRenderes import render_react_text_description_and_args
10
11
  from .langraph_agent import create_graph
11
12
  from langchain_core.messages import (
12
13
  BaseMessage, SystemMessage, HumanMessage
@@ -28,7 +29,8 @@ class Assistant:
28
29
  chat_history: list[BaseMessage] = [],
29
30
  app_type: str = "openai",
30
31
  tools: Optional[list] = [],
31
- memory: Optional[Any] = None):
32
+ memory: Optional[Any] = None,
33
+ store: Optional[BaseStore] = None):
32
34
 
33
35
  self.client = copy(client)
34
36
  self.client.max_tokens = data['llm_settings']['max_tokens']
@@ -40,6 +42,7 @@ class Assistant:
40
42
 
41
43
  self.app_type = app_type
42
44
  self.memory = memory
45
+ self.store = store
43
46
 
44
47
  logger.debug("Data for agent creation: %s", data)
45
48
  logger.info("App type: %s", app_type)
@@ -58,7 +61,10 @@ class Assistant:
58
61
  raise ToolException("Non-pipeline agents cannot have pipelines as a toolkits. "
59
62
  "Review toolkits configuration or use pipeline as master agent.")
60
63
 
61
- self.tools = get_tools(data['tools'], alita_client=alita, llm=self.client)
64
+ # configure memory store if memory tool is defined
65
+ memory_tool = next((tool for tool in data['tools'] if tool['type'] == 'memory'), None)
66
+ self._configure_store(memory_tool)
67
+ self.tools = get_tools(data['tools'], alita_client=alita, llm=self.client, memory_store=self.store)
62
68
  if app_type == "pipeline":
63
69
  self.prompt = data['instructions']
64
70
  else:
@@ -94,6 +100,18 @@ class Assistant:
94
100
  except Exception as e:
95
101
  logger.info(f"Client was created with client setting: temperature - {self.client.temperature} : {self.client.max_tokens}")
96
102
 
103
+ def _configure_store(self, memory_tool: dict | None) -> None:
104
+ """
105
+ Configure the memory store based on a memory_tool definition.
106
+ Only creates a new store if one does not already exist.
107
+ """
108
+ if not memory_tool or self.store is not None:
109
+ return
110
+ from .store_manager import get_manager
111
+ conn_str = memory_tool.get('settings', {}).get('connection_string', '')
112
+ store = get_manager().get_store(conn_str)
113
+ self.store = store
114
+
97
115
  def runnable(self):
98
116
  if self.app_type == 'pipeline':
99
117
  return self.pipeline()
@@ -0,0 +1,46 @@
1
+ import threading
2
+ import atexit
3
+ import logging
4
+ from psycopg import Connection
5
+ from langgraph.store.postgres import PostgresStore
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ class StoreManager:
10
+ _instance = None
11
+ _lock = threading.Lock()
12
+
13
+ def __new__(cls):
14
+ if cls._instance is None:
15
+ with cls._lock:
16
+ if cls._instance is None:
17
+ cls._instance = super().__new__(cls)
18
+ cls._instance._stores = {}
19
+ return cls._instance
20
+
21
+ def get_store(self, conn_str: str) -> PostgresStore:
22
+ store = self._stores.get(conn_str)
23
+ if store is None:
24
+ logger.info(f"Creating new PostgresStore for connection: {conn_str}")
25
+ conn = Connection.connect(conn_str, autocommit=True, prepare_threshold=0)
26
+ store = PostgresStore(conn)
27
+ store.setup()
28
+ self._stores[conn_str] = store
29
+ return store
30
+
31
+ def shutdown(self) -> None:
32
+ logger.info("Shutting down StoreManager and closing all stores")
33
+ for store in list(self._stores.values()):
34
+ try:
35
+ conn = getattr(store, 'conn', None)
36
+ if conn:
37
+ conn.close()
38
+ except Exception:
39
+ pass
40
+ self._stores.clear()
41
+
42
+ _store_manager = StoreManager()
43
+ atexit.register(_store_manager.shutdown)
44
+
45
+ def get_manager() -> StoreManager:
46
+ return _store_manager
@@ -1,4 +1,6 @@
1
1
  from typing import List, Any, Optional
2
+
3
+ from langgraph.store.base import BaseStore
2
4
  from pydantic import create_model, BaseModel, Field
3
5
  from langchain_community.agent_toolkits.base import BaseToolkit
4
6
  from langchain_core.tools import BaseTool
@@ -19,8 +21,8 @@ class ApplicationToolkit(BaseToolkit):
19
21
  )
20
22
 
21
23
  @classmethod
22
- def get_toolkit(cls, client: Any, application_id: int, application_version_id: int, app_api_key: str,
23
- selected_tools: list[str] = []):
24
+ def get_toolkit(cls, client: Any, application_id: int, application_version_id: int, app_api_key: str,
25
+ selected_tools: list[str] = [], store: Optional[BaseStore] = None):
24
26
  from ..llms.alita import AlitaChatModel
25
27
 
26
28
  app_details = client.get_app_details(application_id)
@@ -37,7 +39,7 @@ class ApplicationToolkit(BaseToolkit):
37
39
  "temperature": version_details['llm_settings']['temperature'],
38
40
  }
39
41
 
40
- app = client.application(AlitaChatModel(**settings), application_id, application_version_id)
42
+ app = client.application(AlitaChatModel(**settings), application_id, application_version_id, store=store)
41
43
  return cls(tools=[Application(name=app_details.get("name"),
42
44
  description=app_details.get("description"),
43
45
  application=app,
@@ -1,19 +1,20 @@
1
1
  import logging
2
2
 
3
+ from langchain_core.tools import ToolException
4
+ from langgraph.store.base import BaseStore
5
+
3
6
  from alita_sdk.tools import get_toolkits as alita_toolkits
4
7
  from alita_sdk.tools import get_tools as alita_tools
5
-
6
8
  from .application import ApplicationToolkit
7
9
  from .artifact import ArtifactToolkit
8
10
  from .datasource import DatasourcesToolkit
9
11
  from .prompt import PromptToolkit
10
12
  from .subgraph import SubgraphToolkit
11
13
  from .vectorstore import VectorStoreToolkit
12
-
14
+ from ..tools.mcp_server_tool import McpServerTool
13
15
  # Import community tools
14
16
  from ...community import get_toolkits as community_toolkits, get_tools as community_tools
15
-
16
- from ..tools.mcp_server_tool import McpServerTool
17
+ from ...tools.memory import MemoryToolkit
17
18
 
18
19
  logger = logging.getLogger(__name__)
19
20
 
@@ -24,13 +25,14 @@ def get_toolkits():
24
25
  # DatasourcesToolkit.toolkit_config_schema(),
25
26
  # ApplicationToolkit.toolkit_config_schema(),
26
27
  ArtifactToolkit.toolkit_config_schema(),
28
+ MemoryToolkit.toolkit_config_schema(),
27
29
  VectorStoreToolkit.toolkit_config_schema()
28
30
  ]
29
31
 
30
32
  return core_toolkits + community_toolkits() + alita_toolkits()
31
33
 
32
34
 
33
- def get_tools(tools_list: list, alita_client, llm) -> list:
35
+ def get_tools(tools_list: list, alita_client, llm, memory_store: BaseStore = None) -> list:
34
36
  prompts = []
35
37
  tools = []
36
38
 
@@ -65,6 +67,14 @@ def get_tools(tools_list: list, alita_client, llm) -> list:
65
67
  selected_tools=[],
66
68
  llm=llm
67
69
  ))
70
+ elif tool['type'] == 'memory':
71
+ if memory_store is None:
72
+ raise ToolException(f"Memory store is not provided for memory tool: {tool['name']}")
73
+ tools += MemoryToolkit.get_toolkit(
74
+ namespace=tool['settings'].get('namespace', str(tool['id'])),
75
+ store=memory_store,
76
+ toolkit_name=tool.get('toolkit_name', '')
77
+ ).get_tools()
68
78
  elif tool['type'] == 'artifact':
69
79
  tools.extend(ArtifactToolkit.get_toolkit(
70
80
  client=alita_client,
@@ -0,0 +1,40 @@
1
+ from typing import Optional, List
2
+
3
+ from langchain_core.tools import BaseToolkit, BaseTool
4
+ from langgraph.store.postgres import PostgresStore
5
+ from langmem import create_manage_memory_tool, create_search_memory_tool
6
+ from pydantic import create_model, BaseModel, ConfigDict, Field, SecretStr
7
+
8
+ name = "memory"
9
+
10
+ class MemoryToolkit(BaseToolkit):
11
+ tools: List[BaseTool] = []
12
+
13
+
14
+ @staticmethod
15
+ def toolkit_config_schema() -> BaseModel:
16
+ return create_model(
17
+ name,
18
+ namespace=(str, Field(description="Memory namespace", json_schema_extra={'toolkit_name': True})),
19
+ connection_string=(Optional[SecretStr], Field(description="Connection string for vectorstore",
20
+ default=None,
21
+ json_schema_extra={'secret': True})),
22
+ __config__=ConfigDict(json_schema_extra={
23
+ 'metadata': {
24
+ "label": "Memory",
25
+ "icon_url": "jira-icon.svg",
26
+ "categories": ["other"],
27
+ "extra_categories": ["long-term memory", "langmem"],
28
+ }
29
+ })
30
+ )
31
+
32
+ @classmethod
33
+ def get_toolkit(cls, namespace: str, store: PostgresStore, **kwargs):
34
+ return cls(tools=[
35
+ create_manage_memory_tool(namespace=namespace, store=store),
36
+ create_search_memory_tool(namespace=namespace, store=store)
37
+ ])
38
+
39
+ def get_tools(self):
40
+ return self.tools
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.148
3
+ Version: 0.3.150
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>
6
6
  License-Expression: Apache-2.0
@@ -52,7 +52,7 @@ Requires-Dist: openpyxl==3.1.2; extra == "runtime"
52
52
  Requires-Dist: markdown==3.5.1; extra == "runtime"
53
53
  Requires-Dist: beautifulsoup4==4.12.2; extra == "runtime"
54
54
  Requires-Dist: gensim==4.3.3; extra == "runtime"
55
- Requires-Dist: chromadb<0.7.0; extra == "runtime"
55
+ Requires-Dist: chromadb==0.5.20; extra == "runtime"
56
56
  Requires-Dist: pgvector==0.2.5; extra == "runtime"
57
57
  Requires-Dist: scipy==1.13.1; extra == "runtime"
58
58
  Requires-Dist: pytesseract==0.3.13; extra == "runtime"
@@ -62,7 +62,11 @@ Requires-Dist: rlpycairo==0.3.0; extra == "runtime"
62
62
  Requires-Dist: cairocffi==1.7.1; extra == "runtime"
63
63
  Requires-Dist: docx2txt==0.8; extra == "runtime"
64
64
  Requires-Dist: mammoth==1.9.0; extra == "runtime"
65
- Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>1.11.1; extra == "runtime"
65
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc==1.25.0; extra == "runtime"
66
+ Requires-Dist: opentelemetry_api==1.25.0; extra == "runtime"
67
+ Requires-Dist: opentelemetry_instrumentation==0.46b0; extra == "runtime"
68
+ Requires-Dist: grpcio_status==1.63.0rc1; extra == "runtime"
69
+ Requires-Dist: protobuf==4.25.7; extra == "runtime"
66
70
  Requires-Dist: sentence-transformers==2.7.0; extra == "runtime"
67
71
  Provides-Extra: tools
68
72
  Requires-Dist: dulwich==0.21.6; extra == "tools"
@@ -44,17 +44,18 @@ alita_sdk/community/deep_researcher/utils/os.py,sha256=Q1xX7c7_p7EmuzzXIAY9TDmra
44
44
  alita_sdk/runtime/__init__.py,sha256=-2xVy-AmrOgiqyA8atCeiDo85GPtEV0robUSL7XIplc,796
45
45
  alita_sdk/runtime/clients/__init__.py,sha256=5O_7WsZmvg5z5uZf_Jkx-f8j5C6yKIuSwQR6AQ-TM84,31
46
46
  alita_sdk/runtime/clients/artifact.py,sha256=33prjst8z3Wn3SZ8Xl2gJIgQmKzaJPDyaVzay87mDes,2643
47
- alita_sdk/runtime/clients/client.py,sha256=1QZp6Is1WA0z1EPdqQY6t-_rt7VBBsHnCSRznM6teyY,19630
47
+ alita_sdk/runtime/clients/client.py,sha256=jbC_M72CybwZgFfMRL6paj-NmICrSuk1vVnVTm_u-kc,19734
48
48
  alita_sdk/runtime/clients/datasource.py,sha256=HAZovoQN9jBg0_-lIlGBQzb4FJdczPhkHehAiVG3Wx0,1020
49
49
  alita_sdk/runtime/clients/prompt.py,sha256=li1RG9eBwgNK_Qf0qUaZ8QNTmsncFrAL2pv3kbxZRZg,1447
50
50
  alita_sdk/runtime/langchain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
- alita_sdk/runtime/langchain/assistant.py,sha256=Wq4_XtlFKKkrkelvTa4qzkI3BBTHy5zwRmk3v1i22lQ,6676
51
+ alita_sdk/runtime/langchain/assistant.py,sha256=DjMgup0nfFe5jgNkC-xGgZPiAg7wiJ2qb3VN06n_fnE,7439
52
52
  alita_sdk/runtime/langchain/chat_message_template.py,sha256=kPz8W2BG6IMyITFDA5oeb5BxVRkHEVZhuiGl4MBZKdc,2176
53
53
  alita_sdk/runtime/langchain/constants.py,sha256=eHVJ_beJNTf1WJo4yq7KMK64fxsRvs3lKc34QCXSbpk,3319
54
54
  alita_sdk/runtime/langchain/indexer.py,sha256=0ENHy5EOhThnAiYFc7QAsaTNp9rr8hDV_hTK8ahbatk,37592
55
55
  alita_sdk/runtime/langchain/langraph_agent.py,sha256=BkrbYMy4BPAvy9uANH3s9ffBzaGewKFK97evN90L5kY,39917
56
56
  alita_sdk/runtime/langchain/mixedAgentParser.py,sha256=M256lvtsL3YtYflBCEp-rWKrKtcY1dJIyRGVv7KW9ME,2611
57
57
  alita_sdk/runtime/langchain/mixedAgentRenderes.py,sha256=asBtKqm88QhZRILditjYICwFVKF5KfO38hu2O-WrSWE,5964
58
+ alita_sdk/runtime/langchain/store_manager.py,sha256=2MSbk8Zy969R2YjA5lV6qIPoFRPZYAIUHyoK_2apoGw,1420
58
59
  alita_sdk/runtime/langchain/utils.py,sha256=Npferkn10dvdksnKzLJLBI5bNGQyVWTBwqp3vQtUqmY,6631
59
60
  alita_sdk/runtime/langchain/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
61
  alita_sdk/runtime/langchain/agents/xml_chat.py,sha256=Mx7PK5T97_GrFCwHHZ3JZP42S7MwtUzV0W-_8j6Amt8,6212
@@ -96,12 +97,12 @@ alita_sdk/runtime/llms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
96
97
  alita_sdk/runtime/llms/alita.py,sha256=oAALCyrTbQ8gygJO7xzZLjOowpUnTbh8R363argRUVs,10119
97
98
  alita_sdk/runtime/llms/preloaded.py,sha256=TFdoScswWI5vMkqFwEyQn_yW3mIoebWLxjciz_Ars3w,11222
98
99
  alita_sdk/runtime/toolkits/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
- alita_sdk/runtime/toolkits/application.py,sha256=LrxbBV05lkRP3_WtKGBKtMdoQHXVY-_AtFr1cUuHz40,2341
100
+ alita_sdk/runtime/toolkits/application.py,sha256=akqUuaIL9u7-SsUmS-XgN4qxDEnXFhsK9do4n8inpSo,2432
100
101
  alita_sdk/runtime/toolkits/artifact.py,sha256=7fTr9VpGd2zwCB3EwW4aqWa5jVKRTunqV3ETMJWGNmU,2356
101
102
  alita_sdk/runtime/toolkits/datasource.py,sha256=qk78OdPoReYPCWwahfkKLbKc4pfsu-061oXRryFLP6I,2498
102
103
  alita_sdk/runtime/toolkits/prompt.py,sha256=WIpTkkVYWqIqOWR_LlSWz3ug8uO9tm5jJ7aZYdiGRn0,1192
103
104
  alita_sdk/runtime/toolkits/subgraph.py,sha256=ZYqI4yVLbEPAjCR8dpXbjbL2ipX598Hk3fL6AgaqFD4,1758
104
- alita_sdk/runtime/toolkits/tools.py,sha256=jUjOtv1nVkZIJpDnuOwlWMZamnpFsDH7Yw1mYPzzc4U,5462
105
+ alita_sdk/runtime/toolkits/tools.py,sha256=7a1miPVtSQHgEfCnWuX83O-NKP71EYKYi65TupLHe20,6094
105
106
  alita_sdk/runtime/toolkits/vectorstore.py,sha256=BGppQADa1ZiLO17fC0uCACTTEvPHlodEDYEzUcBRbAA,2901
106
107
  alita_sdk/runtime/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
108
  alita_sdk/runtime/tools/agent.py,sha256=m98QxOHwnCRTT9j18Olbb5UPS8-ZGeQaGiUyZJSyFck,3162
@@ -247,6 +248,7 @@ alita_sdk/tools/llm/llm_utils.py,sha256=v3_lWP_Nk6tJLkj0BYohOun0OWNfvzqLjPdPAMl-
247
248
  alita_sdk/tools/localgit/__init__.py,sha256=NScO0Eu-wl-rc63jjD5Qv1RXXB1qukSIJXx-yS_JQLI,2529
248
249
  alita_sdk/tools/localgit/local_git.py,sha256=gsAftNcK7nMCd8VsIkwDLs2SoG0MgpYdkQG5tmoynkA,18074
249
250
  alita_sdk/tools/localgit/tool.py,sha256=It_B24rMvFPurB355Oy5IShg2BsZTASsEoSS8hu2SXw,998
251
+ alita_sdk/tools/memory/__init__.py,sha256=ZpCQQuyGjISCt0zZxMSkDLiGOYPlCPGRzttQGYeY1ts,1530
250
252
  alita_sdk/tools/ocr/__init__.py,sha256=pvslKVXyJmK0q23FFDNieuc7RBIuzNXTjTNj-GqhGb0,3335
251
253
  alita_sdk/tools/ocr/api_wrapper.py,sha256=08UF8wj1sR8DcW0z16pw19bgLatLkBF8dySW-Ds8iRk,29649
252
254
  alita_sdk/tools/ocr/text_detection.py,sha256=1DBxt54r3_HdEi93QynSIVta3rH3UpIvy799TPtDTtk,23825
@@ -312,8 +314,8 @@ alita_sdk/tools/zephyr_enterprise/api_wrapper.py,sha256=Ir3zHljhbZQJRJJQOBzS_GL5
312
314
  alita_sdk/tools/zephyr_enterprise/zephyr_enterprise.py,sha256=hV9LIrYfJT6oYp-ZfQR0YHflqBFPsUw2Oc55HwK0H48,6809
313
315
  alita_sdk/tools/zephyr_scale/__init__.py,sha256=2NTcdrfkx4GSegqyXhsPLsEpc4FlACuDy85b0fk6cAo,4572
314
316
  alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=UHVQUVqcBc3SZvDfO78HSuBzwAsRw2cCDQa-xMOzndE,68663
315
- alita_sdk-0.3.148.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
316
- alita_sdk-0.3.148.dist-info/METADATA,sha256=4YPh627MjXCdFWepoidv1eLeFpD3iDrMBldXGeUJ-bE,18418
317
- alita_sdk-0.3.148.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
318
- alita_sdk-0.3.148.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
319
- alita_sdk-0.3.148.dist-info/RECORD,,
317
+ alita_sdk-0.3.150.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
318
+ alita_sdk-0.3.150.dist-info/METADATA,sha256=N2t0d8uU3QTSNjZU84fyCNzntCQlzlQoow-vd8lROyY,18667
319
+ alita_sdk-0.3.150.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
320
+ alita_sdk-0.3.150.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
321
+ alita_sdk-0.3.150.dist-info/RECORD,,