alita-sdk 0.3.257__py3-none-any.whl → 0.3.562__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.
Files changed (278) hide show
  1. alita_sdk/cli/__init__.py +10 -0
  2. alita_sdk/cli/__main__.py +17 -0
  3. alita_sdk/cli/agent/__init__.py +5 -0
  4. alita_sdk/cli/agent/default.py +258 -0
  5. alita_sdk/cli/agent_executor.py +155 -0
  6. alita_sdk/cli/agent_loader.py +215 -0
  7. alita_sdk/cli/agent_ui.py +228 -0
  8. alita_sdk/cli/agents.py +3601 -0
  9. alita_sdk/cli/callbacks.py +647 -0
  10. alita_sdk/cli/cli.py +168 -0
  11. alita_sdk/cli/config.py +306 -0
  12. alita_sdk/cli/context/__init__.py +30 -0
  13. alita_sdk/cli/context/cleanup.py +198 -0
  14. alita_sdk/cli/context/manager.py +731 -0
  15. alita_sdk/cli/context/message.py +285 -0
  16. alita_sdk/cli/context/strategies.py +289 -0
  17. alita_sdk/cli/context/token_estimation.py +127 -0
  18. alita_sdk/cli/formatting.py +182 -0
  19. alita_sdk/cli/input_handler.py +419 -0
  20. alita_sdk/cli/inventory.py +1073 -0
  21. alita_sdk/cli/mcp_loader.py +315 -0
  22. alita_sdk/cli/toolkit.py +327 -0
  23. alita_sdk/cli/toolkit_loader.py +85 -0
  24. alita_sdk/cli/tools/__init__.py +43 -0
  25. alita_sdk/cli/tools/approval.py +224 -0
  26. alita_sdk/cli/tools/filesystem.py +1751 -0
  27. alita_sdk/cli/tools/planning.py +389 -0
  28. alita_sdk/cli/tools/terminal.py +414 -0
  29. alita_sdk/community/__init__.py +72 -12
  30. alita_sdk/community/inventory/__init__.py +236 -0
  31. alita_sdk/community/inventory/config.py +257 -0
  32. alita_sdk/community/inventory/enrichment.py +2137 -0
  33. alita_sdk/community/inventory/extractors.py +1469 -0
  34. alita_sdk/community/inventory/ingestion.py +3172 -0
  35. alita_sdk/community/inventory/knowledge_graph.py +1457 -0
  36. alita_sdk/community/inventory/parsers/__init__.py +218 -0
  37. alita_sdk/community/inventory/parsers/base.py +295 -0
  38. alita_sdk/community/inventory/parsers/csharp_parser.py +907 -0
  39. alita_sdk/community/inventory/parsers/go_parser.py +851 -0
  40. alita_sdk/community/inventory/parsers/html_parser.py +389 -0
  41. alita_sdk/community/inventory/parsers/java_parser.py +593 -0
  42. alita_sdk/community/inventory/parsers/javascript_parser.py +629 -0
  43. alita_sdk/community/inventory/parsers/kotlin_parser.py +768 -0
  44. alita_sdk/community/inventory/parsers/markdown_parser.py +362 -0
  45. alita_sdk/community/inventory/parsers/python_parser.py +604 -0
  46. alita_sdk/community/inventory/parsers/rust_parser.py +858 -0
  47. alita_sdk/community/inventory/parsers/swift_parser.py +832 -0
  48. alita_sdk/community/inventory/parsers/text_parser.py +322 -0
  49. alita_sdk/community/inventory/parsers/yaml_parser.py +370 -0
  50. alita_sdk/community/inventory/patterns/__init__.py +61 -0
  51. alita_sdk/community/inventory/patterns/ast_adapter.py +380 -0
  52. alita_sdk/community/inventory/patterns/loader.py +348 -0
  53. alita_sdk/community/inventory/patterns/registry.py +198 -0
  54. alita_sdk/community/inventory/presets.py +535 -0
  55. alita_sdk/community/inventory/retrieval.py +1403 -0
  56. alita_sdk/community/inventory/toolkit.py +173 -0
  57. alita_sdk/community/inventory/toolkit_utils.py +176 -0
  58. alita_sdk/community/inventory/visualize.py +1370 -0
  59. alita_sdk/configurations/__init__.py +11 -0
  60. alita_sdk/configurations/ado.py +148 -2
  61. alita_sdk/configurations/azure_search.py +1 -1
  62. alita_sdk/configurations/bigquery.py +1 -1
  63. alita_sdk/configurations/bitbucket.py +94 -2
  64. alita_sdk/configurations/browser.py +18 -0
  65. alita_sdk/configurations/carrier.py +19 -0
  66. alita_sdk/configurations/confluence.py +130 -1
  67. alita_sdk/configurations/delta_lake.py +1 -1
  68. alita_sdk/configurations/figma.py +76 -5
  69. alita_sdk/configurations/github.py +65 -1
  70. alita_sdk/configurations/gitlab.py +81 -0
  71. alita_sdk/configurations/google_places.py +17 -0
  72. alita_sdk/configurations/jira.py +103 -0
  73. alita_sdk/configurations/openapi.py +111 -0
  74. alita_sdk/configurations/postman.py +1 -1
  75. alita_sdk/configurations/qtest.py +72 -3
  76. alita_sdk/configurations/report_portal.py +115 -0
  77. alita_sdk/configurations/salesforce.py +19 -0
  78. alita_sdk/configurations/service_now.py +1 -12
  79. alita_sdk/configurations/sharepoint.py +167 -0
  80. alita_sdk/configurations/sonar.py +18 -0
  81. alita_sdk/configurations/sql.py +20 -0
  82. alita_sdk/configurations/testio.py +101 -0
  83. alita_sdk/configurations/testrail.py +88 -0
  84. alita_sdk/configurations/xray.py +94 -1
  85. alita_sdk/configurations/zephyr_enterprise.py +94 -1
  86. alita_sdk/configurations/zephyr_essential.py +95 -0
  87. alita_sdk/runtime/clients/artifact.py +21 -4
  88. alita_sdk/runtime/clients/client.py +458 -67
  89. alita_sdk/runtime/clients/mcp_discovery.py +342 -0
  90. alita_sdk/runtime/clients/mcp_manager.py +262 -0
  91. alita_sdk/runtime/clients/sandbox_client.py +352 -0
  92. alita_sdk/runtime/langchain/_constants_bkup.py +1318 -0
  93. alita_sdk/runtime/langchain/assistant.py +183 -43
  94. alita_sdk/runtime/langchain/constants.py +647 -1
  95. alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py +315 -3
  96. alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +209 -31
  97. alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py +1 -1
  98. alita_sdk/runtime/langchain/document_loaders/AlitaJSONLinesLoader.py +77 -0
  99. alita_sdk/runtime/langchain/document_loaders/AlitaJSONLoader.py +10 -3
  100. alita_sdk/runtime/langchain/document_loaders/AlitaMarkdownLoader.py +66 -0
  101. alita_sdk/runtime/langchain/document_loaders/AlitaPDFLoader.py +79 -10
  102. alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py +52 -15
  103. alita_sdk/runtime/langchain/document_loaders/AlitaPythonLoader.py +9 -0
  104. alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py +1 -4
  105. alita_sdk/runtime/langchain/document_loaders/AlitaTextLoader.py +15 -2
  106. alita_sdk/runtime/langchain/document_loaders/ImageParser.py +30 -0
  107. alita_sdk/runtime/langchain/document_loaders/constants.py +189 -41
  108. alita_sdk/runtime/langchain/interfaces/llm_processor.py +4 -2
  109. alita_sdk/runtime/langchain/langraph_agent.py +407 -92
  110. alita_sdk/runtime/langchain/utils.py +102 -8
  111. alita_sdk/runtime/llms/preloaded.py +2 -6
  112. alita_sdk/runtime/models/mcp_models.py +61 -0
  113. alita_sdk/runtime/skills/__init__.py +91 -0
  114. alita_sdk/runtime/skills/callbacks.py +498 -0
  115. alita_sdk/runtime/skills/discovery.py +540 -0
  116. alita_sdk/runtime/skills/executor.py +610 -0
  117. alita_sdk/runtime/skills/input_builder.py +371 -0
  118. alita_sdk/runtime/skills/models.py +330 -0
  119. alita_sdk/runtime/skills/registry.py +355 -0
  120. alita_sdk/runtime/skills/skill_runner.py +330 -0
  121. alita_sdk/runtime/toolkits/__init__.py +28 -0
  122. alita_sdk/runtime/toolkits/application.py +14 -4
  123. alita_sdk/runtime/toolkits/artifact.py +24 -9
  124. alita_sdk/runtime/toolkits/datasource.py +13 -6
  125. alita_sdk/runtime/toolkits/mcp.py +780 -0
  126. alita_sdk/runtime/toolkits/planning.py +178 -0
  127. alita_sdk/runtime/toolkits/skill_router.py +238 -0
  128. alita_sdk/runtime/toolkits/subgraph.py +11 -6
  129. alita_sdk/runtime/toolkits/tools.py +314 -70
  130. alita_sdk/runtime/toolkits/vectorstore.py +11 -5
  131. alita_sdk/runtime/tools/__init__.py +24 -0
  132. alita_sdk/runtime/tools/application.py +16 -4
  133. alita_sdk/runtime/tools/artifact.py +367 -33
  134. alita_sdk/runtime/tools/data_analysis.py +183 -0
  135. alita_sdk/runtime/tools/function.py +100 -4
  136. alita_sdk/runtime/tools/graph.py +81 -0
  137. alita_sdk/runtime/tools/image_generation.py +218 -0
  138. alita_sdk/runtime/tools/llm.py +1013 -177
  139. alita_sdk/runtime/tools/loop.py +3 -1
  140. alita_sdk/runtime/tools/loop_output.py +3 -1
  141. alita_sdk/runtime/tools/mcp_inspect_tool.py +284 -0
  142. alita_sdk/runtime/tools/mcp_remote_tool.py +181 -0
  143. alita_sdk/runtime/tools/mcp_server_tool.py +3 -1
  144. alita_sdk/runtime/tools/planning/__init__.py +36 -0
  145. alita_sdk/runtime/tools/planning/models.py +246 -0
  146. alita_sdk/runtime/tools/planning/wrapper.py +607 -0
  147. alita_sdk/runtime/tools/router.py +2 -1
  148. alita_sdk/runtime/tools/sandbox.py +375 -0
  149. alita_sdk/runtime/tools/skill_router.py +776 -0
  150. alita_sdk/runtime/tools/tool.py +3 -1
  151. alita_sdk/runtime/tools/vectorstore.py +69 -65
  152. alita_sdk/runtime/tools/vectorstore_base.py +163 -90
  153. alita_sdk/runtime/utils/AlitaCallback.py +137 -21
  154. alita_sdk/runtime/utils/mcp_client.py +492 -0
  155. alita_sdk/runtime/utils/mcp_oauth.py +361 -0
  156. alita_sdk/runtime/utils/mcp_sse_client.py +434 -0
  157. alita_sdk/runtime/utils/mcp_tools_discovery.py +124 -0
  158. alita_sdk/runtime/utils/streamlit.py +41 -14
  159. alita_sdk/runtime/utils/toolkit_utils.py +28 -9
  160. alita_sdk/runtime/utils/utils.py +48 -0
  161. alita_sdk/tools/__init__.py +135 -37
  162. alita_sdk/tools/ado/__init__.py +2 -2
  163. alita_sdk/tools/ado/repos/__init__.py +15 -19
  164. alita_sdk/tools/ado/repos/repos_wrapper.py +12 -20
  165. alita_sdk/tools/ado/test_plan/__init__.py +26 -8
  166. alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +56 -28
  167. alita_sdk/tools/ado/wiki/__init__.py +27 -12
  168. alita_sdk/tools/ado/wiki/ado_wrapper.py +114 -40
  169. alita_sdk/tools/ado/work_item/__init__.py +27 -12
  170. alita_sdk/tools/ado/work_item/ado_wrapper.py +95 -11
  171. alita_sdk/tools/advanced_jira_mining/__init__.py +12 -8
  172. alita_sdk/tools/aws/delta_lake/__init__.py +14 -11
  173. alita_sdk/tools/aws/delta_lake/tool.py +5 -1
  174. alita_sdk/tools/azure_ai/search/__init__.py +13 -8
  175. alita_sdk/tools/base/tool.py +5 -1
  176. alita_sdk/tools/base_indexer_toolkit.py +454 -110
  177. alita_sdk/tools/bitbucket/__init__.py +27 -19
  178. alita_sdk/tools/bitbucket/api_wrapper.py +285 -27
  179. alita_sdk/tools/bitbucket/cloud_api_wrapper.py +5 -5
  180. alita_sdk/tools/browser/__init__.py +41 -16
  181. alita_sdk/tools/browser/crawler.py +3 -1
  182. alita_sdk/tools/browser/utils.py +15 -6
  183. alita_sdk/tools/carrier/__init__.py +18 -17
  184. alita_sdk/tools/carrier/backend_reports_tool.py +8 -4
  185. alita_sdk/tools/carrier/excel_reporter.py +8 -4
  186. alita_sdk/tools/chunkers/__init__.py +3 -1
  187. alita_sdk/tools/chunkers/code/codeparser.py +1 -1
  188. alita_sdk/tools/chunkers/sematic/json_chunker.py +2 -1
  189. alita_sdk/tools/chunkers/sematic/markdown_chunker.py +97 -6
  190. alita_sdk/tools/chunkers/sematic/proposal_chunker.py +1 -1
  191. alita_sdk/tools/chunkers/universal_chunker.py +270 -0
  192. alita_sdk/tools/cloud/aws/__init__.py +11 -7
  193. alita_sdk/tools/cloud/azure/__init__.py +11 -7
  194. alita_sdk/tools/cloud/gcp/__init__.py +11 -7
  195. alita_sdk/tools/cloud/k8s/__init__.py +11 -7
  196. alita_sdk/tools/code/linter/__init__.py +9 -8
  197. alita_sdk/tools/code/loaders/codesearcher.py +3 -2
  198. alita_sdk/tools/code/sonar/__init__.py +20 -13
  199. alita_sdk/tools/code_indexer_toolkit.py +199 -0
  200. alita_sdk/tools/confluence/__init__.py +21 -14
  201. alita_sdk/tools/confluence/api_wrapper.py +197 -58
  202. alita_sdk/tools/confluence/loader.py +14 -2
  203. alita_sdk/tools/custom_open_api/__init__.py +11 -5
  204. alita_sdk/tools/elastic/__init__.py +10 -8
  205. alita_sdk/tools/elitea_base.py +546 -64
  206. alita_sdk/tools/figma/__init__.py +11 -8
  207. alita_sdk/tools/figma/api_wrapper.py +352 -153
  208. alita_sdk/tools/github/__init__.py +17 -17
  209. alita_sdk/tools/github/api_wrapper.py +9 -26
  210. alita_sdk/tools/github/github_client.py +81 -12
  211. alita_sdk/tools/github/schemas.py +2 -1
  212. alita_sdk/tools/github/tool.py +5 -1
  213. alita_sdk/tools/gitlab/__init__.py +18 -13
  214. alita_sdk/tools/gitlab/api_wrapper.py +224 -80
  215. alita_sdk/tools/gitlab_org/__init__.py +13 -10
  216. alita_sdk/tools/google/bigquery/__init__.py +13 -13
  217. alita_sdk/tools/google/bigquery/tool.py +5 -1
  218. alita_sdk/tools/google_places/__init__.py +20 -11
  219. alita_sdk/tools/jira/__init__.py +21 -11
  220. alita_sdk/tools/jira/api_wrapper.py +315 -168
  221. alita_sdk/tools/keycloak/__init__.py +10 -8
  222. alita_sdk/tools/localgit/__init__.py +8 -3
  223. alita_sdk/tools/localgit/local_git.py +62 -54
  224. alita_sdk/tools/localgit/tool.py +5 -1
  225. alita_sdk/tools/memory/__init__.py +38 -14
  226. alita_sdk/tools/non_code_indexer_toolkit.py +7 -2
  227. alita_sdk/tools/ocr/__init__.py +10 -8
  228. alita_sdk/tools/openapi/__init__.py +281 -108
  229. alita_sdk/tools/openapi/api_wrapper.py +883 -0
  230. alita_sdk/tools/openapi/tool.py +20 -0
  231. alita_sdk/tools/pandas/__init__.py +18 -11
  232. alita_sdk/tools/pandas/api_wrapper.py +40 -45
  233. alita_sdk/tools/pandas/dataframe/generator/base.py +3 -1
  234. alita_sdk/tools/postman/__init__.py +10 -11
  235. alita_sdk/tools/postman/api_wrapper.py +19 -8
  236. alita_sdk/tools/postman/postman_analysis.py +8 -1
  237. alita_sdk/tools/pptx/__init__.py +10 -10
  238. alita_sdk/tools/qtest/__init__.py +21 -14
  239. alita_sdk/tools/qtest/api_wrapper.py +1784 -88
  240. alita_sdk/tools/rally/__init__.py +12 -10
  241. alita_sdk/tools/report_portal/__init__.py +22 -16
  242. alita_sdk/tools/salesforce/__init__.py +21 -16
  243. alita_sdk/tools/servicenow/__init__.py +20 -16
  244. alita_sdk/tools/servicenow/api_wrapper.py +1 -1
  245. alita_sdk/tools/sharepoint/__init__.py +16 -14
  246. alita_sdk/tools/sharepoint/api_wrapper.py +179 -39
  247. alita_sdk/tools/sharepoint/authorization_helper.py +191 -1
  248. alita_sdk/tools/sharepoint/utils.py +8 -2
  249. alita_sdk/tools/slack/__init__.py +11 -7
  250. alita_sdk/tools/sql/__init__.py +21 -19
  251. alita_sdk/tools/sql/api_wrapper.py +71 -23
  252. alita_sdk/tools/testio/__init__.py +20 -13
  253. alita_sdk/tools/testrail/__init__.py +12 -11
  254. alita_sdk/tools/testrail/api_wrapper.py +214 -46
  255. alita_sdk/tools/utils/__init__.py +28 -4
  256. alita_sdk/tools/utils/content_parser.py +182 -62
  257. alita_sdk/tools/utils/text_operations.py +254 -0
  258. alita_sdk/tools/vector_adapters/VectorStoreAdapter.py +83 -27
  259. alita_sdk/tools/xray/__init__.py +17 -14
  260. alita_sdk/tools/xray/api_wrapper.py +58 -113
  261. alita_sdk/tools/yagmail/__init__.py +8 -3
  262. alita_sdk/tools/zephyr/__init__.py +11 -7
  263. alita_sdk/tools/zephyr_enterprise/__init__.py +15 -9
  264. alita_sdk/tools/zephyr_enterprise/api_wrapper.py +30 -15
  265. alita_sdk/tools/zephyr_essential/__init__.py +15 -10
  266. alita_sdk/tools/zephyr_essential/api_wrapper.py +297 -54
  267. alita_sdk/tools/zephyr_essential/client.py +6 -4
  268. alita_sdk/tools/zephyr_scale/__init__.py +12 -8
  269. alita_sdk/tools/zephyr_scale/api_wrapper.py +39 -31
  270. alita_sdk/tools/zephyr_squad/__init__.py +11 -7
  271. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/METADATA +184 -37
  272. alita_sdk-0.3.562.dist-info/RECORD +450 -0
  273. alita_sdk-0.3.562.dist-info/entry_points.txt +2 -0
  274. alita_sdk/tools/bitbucket/tools.py +0 -304
  275. alita_sdk-0.3.257.dist-info/RECORD +0 -343
  276. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/WHEEL +0 -0
  277. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/licenses/LICENSE +0 -0
  278. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/top_level.txt +0 -0
@@ -2,15 +2,62 @@ import builtins
2
2
  import json
3
3
  import logging
4
4
  import re
5
- from pydantic import create_model, Field
5
+ from pydantic import create_model, Field, Json
6
6
  from typing import Tuple, TypedDict, Any, Optional, Annotated
7
7
  from langchain_core.messages import AnyMessage
8
- from langchain_core.prompts import PromptTemplate
9
- from langgraph.graph import MessagesState, add_messages
8
+ from langgraph.graph import add_messages
9
+
10
+ from ...runtime.langchain.constants import ELITEA_RS, PRINTER_NODE_RS
10
11
 
11
12
  logger = logging.getLogger(__name__)
12
13
 
13
14
 
15
+ def extract_text_from_completion(completion) -> str:
16
+ """Extract text content from LLM completion, handling both string and list formats.
17
+
18
+ For thinking-enabled models (like Claude with extended thinking), completion.content
19
+ can be a list of content blocks. This function extracts only the text blocks and
20
+ concatenates them into a single string.
21
+
22
+ Args:
23
+ completion: LLM completion object with content attribute
24
+
25
+ Returns:
26
+ str: Extracted text content (never a list)
27
+ """
28
+ if not hasattr(completion, 'content'):
29
+ return ""
30
+
31
+ content = completion.content
32
+
33
+ # Handle list of content blocks (Anthropic extended thinking format)
34
+ if isinstance(content, list):
35
+ text_blocks = []
36
+
37
+ for block in content:
38
+ if isinstance(block, dict):
39
+ block_type = block.get('type', '')
40
+ if block_type == 'text':
41
+ text_blocks.append(block.get('text', ''))
42
+ elif block_type == 'thinking':
43
+ # Skip thinking blocks - we only want the actual text response
44
+ continue
45
+ elif hasattr(block, 'type'):
46
+ # Handle object format
47
+ if block.type == 'text':
48
+ text_blocks.append(getattr(block, 'text', ''))
49
+ # Skip thinking blocks
50
+
51
+ return '\n\n'.join(text_blocks) if text_blocks else ""
52
+
53
+ # Handle simple string content
54
+ elif isinstance(content, str):
55
+ return content
56
+
57
+ # Fallback
58
+ return str(content) if content else ""
59
+
60
+
14
61
  def _find_json_bounds(json_string: str) -> Tuple[int, int] | Tuple[None, None]:
15
62
  stack = []
16
63
  json_start = None
@@ -121,6 +168,8 @@ def parse_type(type_str):
121
168
  """Parse a type string into an actual Python type."""
122
169
  try:
123
170
  # Evaluate the type string using builtins and imported modules
171
+ if type_str == 'number':
172
+ type_str = 'int'
124
173
  return eval(type_str, {**vars(builtins), **globals()})
125
174
  except Exception as e:
126
175
  print(f"Error parsing type: {e}")
@@ -128,16 +177,23 @@ def parse_type(type_str):
128
177
 
129
178
 
130
179
  def create_state(data: Optional[dict] = None):
131
- state_dict = {'input': str, 'router_output': str} # Always include router_output
180
+ state_dict = {'input': str, 'messages': 'list[str]', 'router_output': str,
181
+ ELITEA_RS: str, PRINTER_NODE_RS: str} # Always include router_output
182
+ types_dict = {}
132
183
  if not data:
133
184
  data = {'messages': 'list[str]'}
134
185
  for key, value in data.items():
135
186
  # support of old & new UI
136
187
  value = value['type'] if isinstance(value, dict) else value
188
+ value = 'str' if value == 'string' else value # normalize string type (old state support)
137
189
  if key == 'messages':
138
190
  state_dict[key] = Annotated[list[AnyMessage], add_messages]
139
- elif value in ['str', 'int', 'float', 'bool', 'list', 'dict', 'number']:
191
+ elif value in ['str', 'int', 'float', 'bool', 'list', 'dict', 'number', 'dict']:
140
192
  state_dict[key] = parse_type(value)
193
+
194
+ state_dict["state_types"] = types_dict # Default value for state_types
195
+ types_dict["state_types"] = dict
196
+ logger.debug(f"Created state: {state_dict}")
141
197
  return TypedDict('State', state_dict)
142
198
 
143
199
  def create_typed_dict_from_yaml(data):
@@ -170,16 +226,54 @@ def propagate_the_input_mapping(input_mapping: dict[str, dict], input_variables:
170
226
  var_dict = create_params(input_variables, source)
171
227
 
172
228
  if value['type'] == 'fstring':
173
- input_data[key] = value['value'].format(**var_dict)
229
+ try:
230
+ input_data[key] = value['value'].format(**var_dict)
231
+ except KeyError as e:
232
+ logger.error(f"KeyError in fstring formatting for key '{key}'. Attempt to find proper data in state.\n{e}")
233
+ try:
234
+ # search for variables in state if not found in var_dict
235
+ input_data[key] = safe_format(value['value'], state)
236
+ except KeyError as no_var_exception:
237
+ logger.error(f"KeyError in fstring formatting for key '{key}' with state data.\n{no_var_exception}")
238
+ # leave value as is if still not found (could be a constant string marked as fstring by mistake)
239
+ input_data[key] = value['value']
174
240
  elif value['type'] == 'fixed':
175
241
  input_data[key] = value['value']
176
242
  else:
177
243
  input_data[key] = source.get(value['value'], "")
178
244
  return input_data
179
245
 
246
+ def safe_format(template, mapping):
247
+ """Format a template string using a mapping, leaving placeholders unchanged if keys are missing."""
248
+
249
+ def replacer(match):
250
+ key = match.group(1)
251
+ return str(mapping.get(key, f'{{{key}}}'))
252
+ return re.sub(r'\{(\w+)\}', replacer, template)
180
253
 
181
254
  def create_pydantic_model(model_name: str, variables: dict[str, dict]):
182
255
  fields = {}
183
256
  for var_name, var_data in variables.items():
184
- fields[var_name] = (parse_type(var_data['type']), Field(description=var_data.get('description', None)))
185
- return create_model(model_name, **fields)
257
+ if 'default' in var_data:
258
+ # allow user to define if it is required or not
259
+ fields[var_name] = (parse_pydantic_type(var_data['type']),
260
+ Field(description=var_data.get('description', None), default=var_data.get('default')))
261
+ else:
262
+ fields[var_name] = (parse_pydantic_type(var_data['type']), Field(description=var_data.get('description', None)))
263
+ return create_model(model_name, **fields)
264
+
265
+ def parse_pydantic_type(type_name: str):
266
+ """
267
+ Helper function to parse type names into Python types.
268
+ Extend this function to handle custom types like 'dict' -> Json[Any].
269
+ """
270
+ type_mapping = {
271
+ 'str': str,
272
+ 'int': int,
273
+ 'float': float,
274
+ 'bool': bool,
275
+ 'dict': Json[Any], # Map 'dict' to Pydantic's Json type
276
+ 'list': list,
277
+ 'any': Any
278
+ }
279
+ return type_mapping.get(type_name, Any)
@@ -105,8 +105,7 @@ class PreloadedChatModel(BaseChatModel): # pylint: disable=R0903
105
105
  model_name: str = ""
106
106
  max_tokens: Optional[int] = 256
107
107
  temperature: Optional[float] = 0.9
108
- top_p: Optional[float] = 0.9
109
- top_k: Optional[int] = 20
108
+ reasoning_effort: Optional[str] = None
110
109
  token_limit: Optional[int] = 1024
111
110
 
112
111
  _local_streams: Any = PrivateAttr()
@@ -252,8 +251,7 @@ class PreloadedChatModel(BaseChatModel): # pylint: disable=R0903
252
251
  "return_full_text": False,
253
252
  "temperature": self.temperature,
254
253
  "do_sample": True,
255
- "top_k": self.top_k,
256
- "top_p": self.top_p,
254
+ "reasoning_effort": self.reasoning_effort
257
255
  }
258
256
  #
259
257
  try:
@@ -302,8 +300,6 @@ class PreloadedChatModel(BaseChatModel): # pylint: disable=R0903
302
300
  "return_full_text": False,
303
301
  "temperature": self.temperature,
304
302
  "do_sample": True,
305
- "top_k": self.top_k,
306
- "top_p": self.top_p,
307
303
  }
308
304
  #
309
305
  while True:
@@ -0,0 +1,61 @@
1
+ """
2
+ Models for MCP (Model Context Protocol) configuration.
3
+ Following MCP specification for remote HTTP servers only.
4
+ """
5
+
6
+ from typing import Optional, List, Dict, Any
7
+ from pydantic import BaseModel, Field, validator
8
+ from urllib.parse import urlparse
9
+
10
+
11
+ class McpConnectionConfig(BaseModel):
12
+ """
13
+ MCP connection configuration for remote HTTP servers.
14
+ Based on https://modelcontextprotocol.io/specification/2025-06-18
15
+ """
16
+
17
+ url: str = Field(description="MCP server HTTP URL (http:// or https://)")
18
+ headers: Optional[Dict[str, str]] = Field(
19
+ default=None,
20
+ description="HTTP headers for the connection (JSON object)"
21
+ )
22
+ session_id: Optional[str] = Field(
23
+ default=None,
24
+ description="MCP session ID for stateful SSE servers (managed by client)"
25
+ )
26
+
27
+ @validator('url')
28
+ def validate_url(cls, v):
29
+ """Validate URL is HTTP/HTTPS."""
30
+ if not v:
31
+ raise ValueError("URL cannot be empty")
32
+
33
+ parsed = urlparse(v)
34
+ if parsed.scheme not in ['http', 'https']:
35
+ raise ValueError("URL must use http:// or https:// scheme for remote MCP servers")
36
+
37
+ if not parsed.netloc:
38
+ raise ValueError("URL must include host and port")
39
+
40
+ return v
41
+
42
+
43
+ class McpToolkitConfig(BaseModel):
44
+ """Configuration for a single remote MCP server toolkit."""
45
+
46
+ server_name: str = Field(description="MCP server name/identifier")
47
+ connection: McpConnectionConfig = Field(description="MCP connection configuration")
48
+ timeout: int = Field(default=60, description="Request timeout in seconds", ge=1, le=3600)
49
+ selected_tools: List[str] = Field(default_factory=list, description="Specific tools to enable (empty = all)")
50
+ enable_caching: bool = Field(default=True, description="Enable tool schema caching")
51
+ cache_ttl: int = Field(default=300, description="Cache TTL in seconds", ge=60, le=3600)
52
+
53
+
54
+ class McpToolMetadata(BaseModel):
55
+ """Metadata about an MCP tool."""
56
+
57
+ name: str = Field(description="Tool name")
58
+ description: str = Field(description="Tool description")
59
+ server: str = Field(description="Source server name")
60
+ input_schema: Dict[str, Any] = Field(description="Tool input schema")
61
+ enabled: bool = Field(default=True, description="Whether tool is enabled")
@@ -0,0 +1,91 @@
1
+ """
2
+ Skills Registry system for alita_sdk.
3
+
4
+ This package provides a comprehensive skills registry system that supports
5
+ both graph-based and agent-based skills with isolated execution and
6
+ callback support.
7
+
8
+ Key Components:
9
+ - models: Core data models and types
10
+ - discovery: Skill discovery from filesystem
11
+ - registry: Thread-safe registry service
12
+ - executor: Skill execution with isolation
13
+ - callbacks: Event system for execution transparency
14
+
15
+ Usage:
16
+ from alita_sdk.runtime.skills import get_default_registry
17
+
18
+ registry = get_default_registry()
19
+ skills = registry.list()
20
+ skill = registry.get("my_skill")
21
+
22
+ # Execute skill through SkillRouterTool or direct execution
23
+ """
24
+
25
+ from .models import (
26
+ SkillMetadata,
27
+ SkillType,
28
+ SkillSource,
29
+ ExecutionMode,
30
+ SkillStatus,
31
+ SkillEventType,
32
+ ExecutionConfig,
33
+ ResultsConfig,
34
+ SkillInputSchema,
35
+ SkillOutputSchema,
36
+ SkillExecutionResult,
37
+ SkillOutputFile,
38
+ SkillEvent,
39
+ SkillValidationError,
40
+ SkillExecutionError
41
+ )
42
+
43
+ from .discovery import SkillDiscovery
44
+ from .registry import SkillsRegistry, get_default_registry, reset_default_registry
45
+ from .executor import SkillExecutor
46
+ from .input_builder import SkillInputBuilder
47
+ from .callbacks import (
48
+ SkillCallback, CallbackManager, LoggingCallback, ProgressCallback,
49
+ FileCallback, SkillLangChainCallback, CallbackEmitter,
50
+ create_default_callbacks, create_debug_callbacks
51
+ )
52
+
53
+ __all__ = [
54
+ # Core models
55
+ "SkillMetadata",
56
+ "SkillType",
57
+ "SkillSource",
58
+ "ExecutionMode",
59
+ "SkillStatus",
60
+ "SkillEventType",
61
+ "ExecutionConfig",
62
+ "ResultsConfig",
63
+ "SkillInputSchema",
64
+ "SkillOutputSchema",
65
+ "SkillExecutionResult",
66
+ "SkillOutputFile",
67
+ "SkillEvent",
68
+
69
+ # Exceptions
70
+ "SkillValidationError",
71
+ "SkillExecutionError",
72
+
73
+ # Services
74
+ "SkillDiscovery",
75
+ "SkillsRegistry",
76
+ "get_default_registry",
77
+ "reset_default_registry",
78
+ "SkillExecutor",
79
+ "SkillInputBuilder",
80
+
81
+ # Callbacks
82
+ "SkillCallback",
83
+ "CallbackManager",
84
+ "LoggingCallback",
85
+ "ProgressCallback",
86
+ "FileCallback",
87
+ "SkillLangChainCallback",
88
+ "CallbackEmitter",
89
+ "create_default_callbacks",
90
+ "create_debug_callbacks"
91
+ ]