alita-sdk 0.3.461__py3-none-any.whl → 0.3.463__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.
@@ -83,4 +83,5 @@ DEFAULT_MULTIMODAL_PROMPT = """
83
83
 
84
84
  ELITEA_RS = "elitea_response"
85
85
  PRINTER = "printer"
86
- PRINTER_NODE_RS = "printer_output"
86
+ PRINTER_NODE_RS = "printer_output"
87
+ PRINTER_COMPLETED_STATE = "PRINTER_COMPLETED"
@@ -19,7 +19,7 @@ from langgraph.managed.base import is_managed_value
19
19
  from langgraph.prebuilt import InjectedStore
20
20
  from langgraph.store.base import BaseStore
21
21
 
22
- from .constants import PRINTER_NODE_RS, PRINTER
22
+ from .constants import PRINTER_NODE_RS, PRINTER, PRINTER_COMPLETED_STATE
23
23
  from .mixedAgentRenderes import convert_message_to_json
24
24
  from .utils import create_state, propagate_the_input_mapping, safe_format
25
25
  from ..tools.function import FunctionTool
@@ -244,11 +244,16 @@ class PrinterNode(Runnable):
244
244
  result = {}
245
245
  logger.debug(f"Initial text pattern: {self.input_mapping}")
246
246
  mapping = propagate_the_input_mapping(self.input_mapping, [], state)
247
+ # for printer node we expect that all the lists will be joined into strings already
248
+ # Join any lists that haven't been converted yet
249
+ for key, value in mapping.items():
250
+ if isinstance(value, list):
251
+ mapping[key] = ', '.join(str(item) for item in value)
247
252
  if mapping.get(PRINTER) is None:
248
253
  raise ToolException(f"PrinterNode requires '{PRINTER}' field in input mapping")
249
254
  formatted_output = mapping[PRINTER]
250
255
  # add info label to the printer's output
251
- if formatted_output:
256
+ if not formatted_output == PRINTER_COMPLETED_STATE:
252
257
  formatted_output += f"\n\n-----\n*How to proceed?*\n* *to resume the pipeline - type anything...*"
253
258
  logger.debug(f"Formatted output: {formatted_output}")
254
259
  result[PRINTER_NODE_RS] = formatted_output
@@ -666,7 +671,7 @@ def create_graph(
666
671
  # reset printer output variable to avoid carrying over
667
672
  reset_node_id = f"{node_id}_reset"
668
673
  lg_builder.add_node(reset_node_id, PrinterNode(
669
- input_mapping={'printer': {'type': 'fixed', 'value': ''}}
674
+ input_mapping={'printer': {'type': 'fixed', 'value': PRINTER_COMPLETED_STATE}}
670
675
  ))
671
676
  lg_builder.add_conditional_edges(node_id, TransitionalEdge(reset_node_id))
672
677
  lg_builder.add_conditional_edges(reset_node_id, TransitionalEdge(clean_string(node['transition'])))
@@ -890,7 +895,7 @@ class LangGraphAgentRunnable(CompiledStateGraph):
890
895
  # input['messages'] = [current_message]
891
896
 
892
897
  # Validate that input is not empty after all processing
893
- if not input.get('input') and not config.get("configurable", {}).get("checkpoint_id"):
898
+ if not input.get('input'):
894
899
  raise RuntimeError(
895
900
  "Empty input after processing. Cannot send empty string to LLM. "
896
901
  "This likely means the message contained only non-text content "
@@ -900,11 +905,15 @@ class LangGraphAgentRunnable(CompiledStateGraph):
900
905
  logging.info(f"Input: {thread_id} - {input}")
901
906
  if self.checkpointer and self.checkpointer.get_tuple(config):
902
907
  self.update_state(config, input)
903
- result = super().invoke(None, config=config, *args, **kwargs)
908
+ if config.pop("should_continue", False):
909
+ invoke_input = input
910
+ else:
911
+ invoke_input = None
912
+ result = super().invoke(invoke_input, config=config, *args, **kwargs)
904
913
  else:
905
914
  result = super().invoke(input, config=config, *args, **kwargs)
906
915
  try:
907
- if not result.get(PRINTER_NODE_RS):
916
+ if result.get(PRINTER_NODE_RS) == PRINTER_COMPLETED_STATE:
908
917
  output = next((msg.content for msg in reversed(result['messages']) if not isinstance(msg, HumanMessage)),
909
918
  result['messages'][-1].content)
910
919
  else:
@@ -131,7 +131,7 @@ def parse_type(type_str):
131
131
 
132
132
 
133
133
  def create_state(data: Optional[dict] = None):
134
- state_dict = {'input': str, 'router_output': str,
134
+ state_dict = {'input': str, 'messages': 'list[str]', 'router_output': str,
135
135
  ELITEA_RS: str, PRINTER_NODE_RS: str} # Always include router_output
136
136
  types_dict = {}
137
137
  if not data:
@@ -4,6 +4,7 @@ import logging
4
4
  import time
5
5
  from typing import Any, Optional, List, Dict, Generator
6
6
 
7
+ from langchain_core.callbacks import dispatch_custom_event
7
8
  from langchain_core.documents import Document
8
9
  from pydantic import create_model, Field, SecretStr
9
10
 
@@ -179,11 +180,13 @@ class BaseIndexerToolkit(VectorStoreWrapperBase):
179
180
  #
180
181
  results_count = result["count"]
181
182
  self.index_meta_update(index_name, IndexerKeywords.INDEX_META_COMPLETED.value, results_count)
183
+ self._emit_index_event(index_name)
182
184
  #
183
185
  return {"status": "ok", "message": f"successfully indexed {results_count} documents" if results_count > 0
184
186
  else "no new documents to index"}
185
187
  except Exception as e:
186
188
  self.index_meta_update(index_name, IndexerKeywords.INDEX_META_FAILED.value, result["count"])
189
+ self._emit_index_event(index_name, error=str(e))
187
190
  raise e
188
191
 
189
192
 
@@ -511,6 +514,54 @@ class BaseIndexerToolkit(VectorStoreWrapperBase):
511
514
  index_meta_doc = Document(page_content=index_meta_raw.get("content", ""), metadata=metadata)
512
515
  add_documents(vectorstore=self.vectorstore, documents=[index_meta_doc], ids=[index_meta_raw.get("id")])
513
516
 
517
+ def _emit_index_event(self, index_name: str, error: Optional[str] = None):
518
+ """
519
+ Emit custom event for index data operation.
520
+
521
+ Args:
522
+ index_name: The name of the index
523
+ error: Error message if the operation failed, None otherwise
524
+ """
525
+ index_meta = super().get_index_meta(index_name)
526
+
527
+ if not index_meta:
528
+ logger.warning(
529
+ f"No index_meta found for index '{index_name}'. "
530
+ "Cannot emit index event."
531
+ )
532
+ return
533
+
534
+ metadata = index_meta.get("metadata", {})
535
+
536
+ # Determine if this is a reindex operation
537
+ history_raw = metadata.get("history", "[]")
538
+ try:
539
+ history = json.loads(history_raw) if history_raw.strip() else []
540
+ is_reindex = len(history) > 1
541
+ except (json.JSONDecodeError, TypeError):
542
+ is_reindex = False
543
+
544
+ # Build event message
545
+ event_data = {
546
+ "id": index_meta.get("id"),
547
+ "index_name": index_name,
548
+ "state": metadata.get("state"),
549
+ "error": error,
550
+ "reindex": is_reindex,
551
+ "indexed": metadata.get("indexed", 0),
552
+ "updated": metadata.get("updated", 0),
553
+ }
554
+
555
+ # Emit the event
556
+ try:
557
+ dispatch_custom_event("index_data_status", event_data)
558
+ logger.debug(
559
+ f"Emitted index_data_status event for index "
560
+ f"'{index_name}': {event_data}"
561
+ )
562
+ except Exception as e:
563
+ logger.warning(f"Failed to emit index_data_status event: {e}")
564
+
514
565
  def get_available_tools(self):
515
566
  """
516
567
  Returns the standardized vector search tools (search operations only).
@@ -564,6 +615,7 @@ class BaseIndexerToolkit(VectorStoreWrapperBase):
564
615
  "mode": "list_collections",
565
616
  "ref": self.list_collections,
566
617
  "description": self.list_collections.__doc__,
567
- "args_schema": create_model("ListCollectionsParams") # No parameters
618
+ # No parameters
619
+ "args_schema": create_model("ListCollectionsParams")
568
620
  },
569
- ]
621
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.461
3
+ Version: 0.3.463
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
@@ -60,13 +60,13 @@ alita_sdk/runtime/clients/sandbox_client.py,sha256=kGOGfm3OAFmYeTM4bIuKbhRsOiOhF
60
60
  alita_sdk/runtime/langchain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  alita_sdk/runtime/langchain/assistant.py,sha256=t93SNBcdki59gvW_Osl68E-x0ohcO2z32jtR8nqEaRI,16201
62
62
  alita_sdk/runtime/langchain/chat_message_template.py,sha256=kPz8W2BG6IMyITFDA5oeb5BxVRkHEVZhuiGl4MBZKdc,2176
63
- alita_sdk/runtime/langchain/constants.py,sha256=oiEHg1h_IYUA5NE8O6nEF24hpxahi9BTvJWrkXjbVcU,3405
63
+ alita_sdk/runtime/langchain/constants.py,sha256=ZcNdsihfmK2m1klSY4gwfDtKniiYhi7ONvkQDb7Jb5s,3451
64
64
  alita_sdk/runtime/langchain/indexer.py,sha256=0ENHy5EOhThnAiYFc7QAsaTNp9rr8hDV_hTK8ahbatk,37592
65
- alita_sdk/runtime/langchain/langraph_agent.py,sha256=jBW5ErNWWEFhmVSZvnjXpsa-S0EbHGC1-ZKazkFSq4g,54479
65
+ alita_sdk/runtime/langchain/langraph_agent.py,sha256=H9NF1Y1CEdBfNxEIN4gpcpLNPdE7vXoMdBkbljU0Gx4,54973
66
66
  alita_sdk/runtime/langchain/mixedAgentParser.py,sha256=M256lvtsL3YtYflBCEp-rWKrKtcY1dJIyRGVv7KW9ME,2611
67
67
  alita_sdk/runtime/langchain/mixedAgentRenderes.py,sha256=asBtKqm88QhZRILditjYICwFVKF5KfO38hu2O-WrSWE,5964
68
68
  alita_sdk/runtime/langchain/store_manager.py,sha256=i8Fl11IXJhrBXq1F1ukEVln57B1IBe-tqSUvfUmBV4A,2218
69
- alita_sdk/runtime/langchain/utils.py,sha256=UDxYSYzWfhVB2-qBqJwaTvcIt3EEsujUdgkpX5PMNxo,8506
69
+ alita_sdk/runtime/langchain/utils.py,sha256=jH2Dt_DTgn6Engp1xFLodN73QWYFLHgqeeqkN13es68,8531
70
70
  alita_sdk/runtime/langchain/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
71
  alita_sdk/runtime/langchain/agents/xml_chat.py,sha256=Mx7PK5T97_GrFCwHHZ3JZP42S7MwtUzV0W-_8j6Amt8,6212
72
72
  alita_sdk/runtime/langchain/document_loaders/AlitaBDDScenariosLoader.py,sha256=4kFU1ijrM1Jw7cywQv8mUiBHlE6w-uqfzSZP4hUV5P4,3771
@@ -159,7 +159,7 @@ alita_sdk/runtime/utils/toolkit_runtime.py,sha256=MU63Fpxj0b5_r1IUUc0Q3-PN9VwL7r
159
159
  alita_sdk/runtime/utils/toolkit_utils.py,sha256=_6cKy514v4ueIZynXTA8LwGC9Q447MfgrQKkDwDI4qM,5886
160
160
  alita_sdk/runtime/utils/utils.py,sha256=PJK8A-JVIzY1IowOjGG8DIqsIiEFe65qDKvFcjJCKWA,1041
161
161
  alita_sdk/tools/__init__.py,sha256=uQzvtnyOsgfdHl3pdo2LqK49Hb3SKFXDBXW_szN2R3k,10992
162
- alita_sdk/tools/base_indexer_toolkit.py,sha256=k8uIwpasxbjqtcsoS2-lvYdYzEZ14qoVSaQuFvkzpHs,27362
162
+ alita_sdk/tools/base_indexer_toolkit.py,sha256=sI7Hv0NoCoxUbZG54vTo6yKK2gfEXFh7FDvgUTV7nOE,29218
163
163
  alita_sdk/tools/code_indexer_toolkit.py,sha256=2VkOC8JfBDc25_jp-NWyMYqpaYRETIzTJFLrIYrfBpE,7814
164
164
  alita_sdk/tools/elitea_base.py,sha256=34fmVdYgd2YXifU5LFNjMQysr4OOIZ6AOZjq4GxLgSw,34417
165
165
  alita_sdk/tools/non_code_indexer_toolkit.py,sha256=6Lrqor1VeSLbPLDHAfg_7UAUqKFy1r_n6bdsc4-ak98,1315
@@ -376,9 +376,9 @@ alita_sdk/tools/zephyr_scale/api_wrapper.py,sha256=kT0TbmMvuKhDUZc0i7KO18O38JM9S
376
376
  alita_sdk/tools/zephyr_squad/__init__.py,sha256=Gl1YAFaMMufTNjIpnuo_c_lbDsQkmproYdZz2ZppgJ4,3007
377
377
  alita_sdk/tools/zephyr_squad/api_wrapper.py,sha256=kmw_xol8YIYFplBLWTqP_VKPRhL_1ItDD0_vXTe_UuI,14906
378
378
  alita_sdk/tools/zephyr_squad/zephyr_squad_cloud_client.py,sha256=R371waHsms4sllHCbijKYs90C-9Yu0sSR3N4SUfQOgU,5066
379
- alita_sdk-0.3.461.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
380
- alita_sdk-0.3.461.dist-info/METADATA,sha256=F5J4SUWNAFsqIcxCo3FpxqCZpWNGSVoQKV0VhwQmLeA,19306
381
- alita_sdk-0.3.461.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
382
- alita_sdk-0.3.461.dist-info/entry_points.txt,sha256=sSxsIZu9YjVGsgf-5mHC631FeBcT6f2vUjm0A_L9tcU,53
383
- alita_sdk-0.3.461.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
384
- alita_sdk-0.3.461.dist-info/RECORD,,
379
+ alita_sdk-0.3.463.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
380
+ alita_sdk-0.3.463.dist-info/METADATA,sha256=Uvf6sV_Xf0nMwWP4fLbp0HO9qg-jMHrdcNITkS03LZY,19306
381
+ alita_sdk-0.3.463.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
382
+ alita_sdk-0.3.463.dist-info/entry_points.txt,sha256=sSxsIZu9YjVGsgf-5mHC631FeBcT6f2vUjm0A_L9tcU,53
383
+ alita_sdk-0.3.463.dist-info/top_level.txt,sha256=0vJYy5p_jK6AwVb1aqXr7Kgqgk3WDtQ6t5C-XI9zkmg,10
384
+ alita_sdk-0.3.463.dist-info/RECORD,,