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.
- alita_sdk/cli/__init__.py +10 -0
- alita_sdk/cli/__main__.py +17 -0
- alita_sdk/cli/agent/__init__.py +5 -0
- alita_sdk/cli/agent/default.py +258 -0
- alita_sdk/cli/agent_executor.py +155 -0
- alita_sdk/cli/agent_loader.py +215 -0
- alita_sdk/cli/agent_ui.py +228 -0
- alita_sdk/cli/agents.py +3601 -0
- alita_sdk/cli/callbacks.py +647 -0
- alita_sdk/cli/cli.py +168 -0
- alita_sdk/cli/config.py +306 -0
- alita_sdk/cli/context/__init__.py +30 -0
- alita_sdk/cli/context/cleanup.py +198 -0
- alita_sdk/cli/context/manager.py +731 -0
- alita_sdk/cli/context/message.py +285 -0
- alita_sdk/cli/context/strategies.py +289 -0
- alita_sdk/cli/context/token_estimation.py +127 -0
- alita_sdk/cli/formatting.py +182 -0
- alita_sdk/cli/input_handler.py +419 -0
- alita_sdk/cli/inventory.py +1073 -0
- alita_sdk/cli/mcp_loader.py +315 -0
- alita_sdk/cli/toolkit.py +327 -0
- alita_sdk/cli/toolkit_loader.py +85 -0
- alita_sdk/cli/tools/__init__.py +43 -0
- alita_sdk/cli/tools/approval.py +224 -0
- alita_sdk/cli/tools/filesystem.py +1751 -0
- alita_sdk/cli/tools/planning.py +389 -0
- alita_sdk/cli/tools/terminal.py +414 -0
- alita_sdk/community/__init__.py +72 -12
- alita_sdk/community/inventory/__init__.py +236 -0
- alita_sdk/community/inventory/config.py +257 -0
- alita_sdk/community/inventory/enrichment.py +2137 -0
- alita_sdk/community/inventory/extractors.py +1469 -0
- alita_sdk/community/inventory/ingestion.py +3172 -0
- alita_sdk/community/inventory/knowledge_graph.py +1457 -0
- alita_sdk/community/inventory/parsers/__init__.py +218 -0
- alita_sdk/community/inventory/parsers/base.py +295 -0
- alita_sdk/community/inventory/parsers/csharp_parser.py +907 -0
- alita_sdk/community/inventory/parsers/go_parser.py +851 -0
- alita_sdk/community/inventory/parsers/html_parser.py +389 -0
- alita_sdk/community/inventory/parsers/java_parser.py +593 -0
- alita_sdk/community/inventory/parsers/javascript_parser.py +629 -0
- alita_sdk/community/inventory/parsers/kotlin_parser.py +768 -0
- alita_sdk/community/inventory/parsers/markdown_parser.py +362 -0
- alita_sdk/community/inventory/parsers/python_parser.py +604 -0
- alita_sdk/community/inventory/parsers/rust_parser.py +858 -0
- alita_sdk/community/inventory/parsers/swift_parser.py +832 -0
- alita_sdk/community/inventory/parsers/text_parser.py +322 -0
- alita_sdk/community/inventory/parsers/yaml_parser.py +370 -0
- alita_sdk/community/inventory/patterns/__init__.py +61 -0
- alita_sdk/community/inventory/patterns/ast_adapter.py +380 -0
- alita_sdk/community/inventory/patterns/loader.py +348 -0
- alita_sdk/community/inventory/patterns/registry.py +198 -0
- alita_sdk/community/inventory/presets.py +535 -0
- alita_sdk/community/inventory/retrieval.py +1403 -0
- alita_sdk/community/inventory/toolkit.py +173 -0
- alita_sdk/community/inventory/toolkit_utils.py +176 -0
- alita_sdk/community/inventory/visualize.py +1370 -0
- alita_sdk/configurations/__init__.py +11 -0
- alita_sdk/configurations/ado.py +148 -2
- alita_sdk/configurations/azure_search.py +1 -1
- alita_sdk/configurations/bigquery.py +1 -1
- alita_sdk/configurations/bitbucket.py +94 -2
- alita_sdk/configurations/browser.py +18 -0
- alita_sdk/configurations/carrier.py +19 -0
- alita_sdk/configurations/confluence.py +130 -1
- alita_sdk/configurations/delta_lake.py +1 -1
- alita_sdk/configurations/figma.py +76 -5
- alita_sdk/configurations/github.py +65 -1
- alita_sdk/configurations/gitlab.py +81 -0
- alita_sdk/configurations/google_places.py +17 -0
- alita_sdk/configurations/jira.py +103 -0
- alita_sdk/configurations/openapi.py +111 -0
- alita_sdk/configurations/postman.py +1 -1
- alita_sdk/configurations/qtest.py +72 -3
- alita_sdk/configurations/report_portal.py +115 -0
- alita_sdk/configurations/salesforce.py +19 -0
- alita_sdk/configurations/service_now.py +1 -12
- alita_sdk/configurations/sharepoint.py +167 -0
- alita_sdk/configurations/sonar.py +18 -0
- alita_sdk/configurations/sql.py +20 -0
- alita_sdk/configurations/testio.py +101 -0
- alita_sdk/configurations/testrail.py +88 -0
- alita_sdk/configurations/xray.py +94 -1
- alita_sdk/configurations/zephyr_enterprise.py +94 -1
- alita_sdk/configurations/zephyr_essential.py +95 -0
- alita_sdk/runtime/clients/artifact.py +21 -4
- alita_sdk/runtime/clients/client.py +458 -67
- alita_sdk/runtime/clients/mcp_discovery.py +342 -0
- alita_sdk/runtime/clients/mcp_manager.py +262 -0
- alita_sdk/runtime/clients/sandbox_client.py +352 -0
- alita_sdk/runtime/langchain/_constants_bkup.py +1318 -0
- alita_sdk/runtime/langchain/assistant.py +183 -43
- alita_sdk/runtime/langchain/constants.py +647 -1
- alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py +315 -3
- alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +209 -31
- alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py +1 -1
- alita_sdk/runtime/langchain/document_loaders/AlitaJSONLinesLoader.py +77 -0
- alita_sdk/runtime/langchain/document_loaders/AlitaJSONLoader.py +10 -3
- alita_sdk/runtime/langchain/document_loaders/AlitaMarkdownLoader.py +66 -0
- alita_sdk/runtime/langchain/document_loaders/AlitaPDFLoader.py +79 -10
- alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py +52 -15
- alita_sdk/runtime/langchain/document_loaders/AlitaPythonLoader.py +9 -0
- alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py +1 -4
- alita_sdk/runtime/langchain/document_loaders/AlitaTextLoader.py +15 -2
- alita_sdk/runtime/langchain/document_loaders/ImageParser.py +30 -0
- alita_sdk/runtime/langchain/document_loaders/constants.py +189 -41
- alita_sdk/runtime/langchain/interfaces/llm_processor.py +4 -2
- alita_sdk/runtime/langchain/langraph_agent.py +407 -92
- alita_sdk/runtime/langchain/utils.py +102 -8
- alita_sdk/runtime/llms/preloaded.py +2 -6
- alita_sdk/runtime/models/mcp_models.py +61 -0
- alita_sdk/runtime/skills/__init__.py +91 -0
- alita_sdk/runtime/skills/callbacks.py +498 -0
- alita_sdk/runtime/skills/discovery.py +540 -0
- alita_sdk/runtime/skills/executor.py +610 -0
- alita_sdk/runtime/skills/input_builder.py +371 -0
- alita_sdk/runtime/skills/models.py +330 -0
- alita_sdk/runtime/skills/registry.py +355 -0
- alita_sdk/runtime/skills/skill_runner.py +330 -0
- alita_sdk/runtime/toolkits/__init__.py +28 -0
- alita_sdk/runtime/toolkits/application.py +14 -4
- alita_sdk/runtime/toolkits/artifact.py +24 -9
- alita_sdk/runtime/toolkits/datasource.py +13 -6
- alita_sdk/runtime/toolkits/mcp.py +780 -0
- alita_sdk/runtime/toolkits/planning.py +178 -0
- alita_sdk/runtime/toolkits/skill_router.py +238 -0
- alita_sdk/runtime/toolkits/subgraph.py +11 -6
- alita_sdk/runtime/toolkits/tools.py +314 -70
- alita_sdk/runtime/toolkits/vectorstore.py +11 -5
- alita_sdk/runtime/tools/__init__.py +24 -0
- alita_sdk/runtime/tools/application.py +16 -4
- alita_sdk/runtime/tools/artifact.py +367 -33
- alita_sdk/runtime/tools/data_analysis.py +183 -0
- alita_sdk/runtime/tools/function.py +100 -4
- alita_sdk/runtime/tools/graph.py +81 -0
- alita_sdk/runtime/tools/image_generation.py +218 -0
- alita_sdk/runtime/tools/llm.py +1013 -177
- alita_sdk/runtime/tools/loop.py +3 -1
- alita_sdk/runtime/tools/loop_output.py +3 -1
- alita_sdk/runtime/tools/mcp_inspect_tool.py +284 -0
- alita_sdk/runtime/tools/mcp_remote_tool.py +181 -0
- alita_sdk/runtime/tools/mcp_server_tool.py +3 -1
- alita_sdk/runtime/tools/planning/__init__.py +36 -0
- alita_sdk/runtime/tools/planning/models.py +246 -0
- alita_sdk/runtime/tools/planning/wrapper.py +607 -0
- alita_sdk/runtime/tools/router.py +2 -1
- alita_sdk/runtime/tools/sandbox.py +375 -0
- alita_sdk/runtime/tools/skill_router.py +776 -0
- alita_sdk/runtime/tools/tool.py +3 -1
- alita_sdk/runtime/tools/vectorstore.py +69 -65
- alita_sdk/runtime/tools/vectorstore_base.py +163 -90
- alita_sdk/runtime/utils/AlitaCallback.py +137 -21
- alita_sdk/runtime/utils/mcp_client.py +492 -0
- alita_sdk/runtime/utils/mcp_oauth.py +361 -0
- alita_sdk/runtime/utils/mcp_sse_client.py +434 -0
- alita_sdk/runtime/utils/mcp_tools_discovery.py +124 -0
- alita_sdk/runtime/utils/streamlit.py +41 -14
- alita_sdk/runtime/utils/toolkit_utils.py +28 -9
- alita_sdk/runtime/utils/utils.py +48 -0
- alita_sdk/tools/__init__.py +135 -37
- alita_sdk/tools/ado/__init__.py +2 -2
- alita_sdk/tools/ado/repos/__init__.py +15 -19
- alita_sdk/tools/ado/repos/repos_wrapper.py +12 -20
- alita_sdk/tools/ado/test_plan/__init__.py +26 -8
- alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +56 -28
- alita_sdk/tools/ado/wiki/__init__.py +27 -12
- alita_sdk/tools/ado/wiki/ado_wrapper.py +114 -40
- alita_sdk/tools/ado/work_item/__init__.py +27 -12
- alita_sdk/tools/ado/work_item/ado_wrapper.py +95 -11
- alita_sdk/tools/advanced_jira_mining/__init__.py +12 -8
- alita_sdk/tools/aws/delta_lake/__init__.py +14 -11
- alita_sdk/tools/aws/delta_lake/tool.py +5 -1
- alita_sdk/tools/azure_ai/search/__init__.py +13 -8
- alita_sdk/tools/base/tool.py +5 -1
- alita_sdk/tools/base_indexer_toolkit.py +454 -110
- alita_sdk/tools/bitbucket/__init__.py +27 -19
- alita_sdk/tools/bitbucket/api_wrapper.py +285 -27
- alita_sdk/tools/bitbucket/cloud_api_wrapper.py +5 -5
- alita_sdk/tools/browser/__init__.py +41 -16
- alita_sdk/tools/browser/crawler.py +3 -1
- alita_sdk/tools/browser/utils.py +15 -6
- alita_sdk/tools/carrier/__init__.py +18 -17
- alita_sdk/tools/carrier/backend_reports_tool.py +8 -4
- alita_sdk/tools/carrier/excel_reporter.py +8 -4
- alita_sdk/tools/chunkers/__init__.py +3 -1
- alita_sdk/tools/chunkers/code/codeparser.py +1 -1
- alita_sdk/tools/chunkers/sematic/json_chunker.py +2 -1
- alita_sdk/tools/chunkers/sematic/markdown_chunker.py +97 -6
- alita_sdk/tools/chunkers/sematic/proposal_chunker.py +1 -1
- alita_sdk/tools/chunkers/universal_chunker.py +270 -0
- alita_sdk/tools/cloud/aws/__init__.py +11 -7
- alita_sdk/tools/cloud/azure/__init__.py +11 -7
- alita_sdk/tools/cloud/gcp/__init__.py +11 -7
- alita_sdk/tools/cloud/k8s/__init__.py +11 -7
- alita_sdk/tools/code/linter/__init__.py +9 -8
- alita_sdk/tools/code/loaders/codesearcher.py +3 -2
- alita_sdk/tools/code/sonar/__init__.py +20 -13
- alita_sdk/tools/code_indexer_toolkit.py +199 -0
- alita_sdk/tools/confluence/__init__.py +21 -14
- alita_sdk/tools/confluence/api_wrapper.py +197 -58
- alita_sdk/tools/confluence/loader.py +14 -2
- alita_sdk/tools/custom_open_api/__init__.py +11 -5
- alita_sdk/tools/elastic/__init__.py +10 -8
- alita_sdk/tools/elitea_base.py +546 -64
- alita_sdk/tools/figma/__init__.py +11 -8
- alita_sdk/tools/figma/api_wrapper.py +352 -153
- alita_sdk/tools/github/__init__.py +17 -17
- alita_sdk/tools/github/api_wrapper.py +9 -26
- alita_sdk/tools/github/github_client.py +81 -12
- alita_sdk/tools/github/schemas.py +2 -1
- alita_sdk/tools/github/tool.py +5 -1
- alita_sdk/tools/gitlab/__init__.py +18 -13
- alita_sdk/tools/gitlab/api_wrapper.py +224 -80
- alita_sdk/tools/gitlab_org/__init__.py +13 -10
- alita_sdk/tools/google/bigquery/__init__.py +13 -13
- alita_sdk/tools/google/bigquery/tool.py +5 -1
- alita_sdk/tools/google_places/__init__.py +20 -11
- alita_sdk/tools/jira/__init__.py +21 -11
- alita_sdk/tools/jira/api_wrapper.py +315 -168
- alita_sdk/tools/keycloak/__init__.py +10 -8
- alita_sdk/tools/localgit/__init__.py +8 -3
- alita_sdk/tools/localgit/local_git.py +62 -54
- alita_sdk/tools/localgit/tool.py +5 -1
- alita_sdk/tools/memory/__init__.py +38 -14
- alita_sdk/tools/non_code_indexer_toolkit.py +7 -2
- alita_sdk/tools/ocr/__init__.py +10 -8
- alita_sdk/tools/openapi/__init__.py +281 -108
- alita_sdk/tools/openapi/api_wrapper.py +883 -0
- alita_sdk/tools/openapi/tool.py +20 -0
- alita_sdk/tools/pandas/__init__.py +18 -11
- alita_sdk/tools/pandas/api_wrapper.py +40 -45
- alita_sdk/tools/pandas/dataframe/generator/base.py +3 -1
- alita_sdk/tools/postman/__init__.py +10 -11
- alita_sdk/tools/postman/api_wrapper.py +19 -8
- alita_sdk/tools/postman/postman_analysis.py +8 -1
- alita_sdk/tools/pptx/__init__.py +10 -10
- alita_sdk/tools/qtest/__init__.py +21 -14
- alita_sdk/tools/qtest/api_wrapper.py +1784 -88
- alita_sdk/tools/rally/__init__.py +12 -10
- alita_sdk/tools/report_portal/__init__.py +22 -16
- alita_sdk/tools/salesforce/__init__.py +21 -16
- alita_sdk/tools/servicenow/__init__.py +20 -16
- alita_sdk/tools/servicenow/api_wrapper.py +1 -1
- alita_sdk/tools/sharepoint/__init__.py +16 -14
- alita_sdk/tools/sharepoint/api_wrapper.py +179 -39
- alita_sdk/tools/sharepoint/authorization_helper.py +191 -1
- alita_sdk/tools/sharepoint/utils.py +8 -2
- alita_sdk/tools/slack/__init__.py +11 -7
- alita_sdk/tools/sql/__init__.py +21 -19
- alita_sdk/tools/sql/api_wrapper.py +71 -23
- alita_sdk/tools/testio/__init__.py +20 -13
- alita_sdk/tools/testrail/__init__.py +12 -11
- alita_sdk/tools/testrail/api_wrapper.py +214 -46
- alita_sdk/tools/utils/__init__.py +28 -4
- alita_sdk/tools/utils/content_parser.py +182 -62
- alita_sdk/tools/utils/text_operations.py +254 -0
- alita_sdk/tools/vector_adapters/VectorStoreAdapter.py +83 -27
- alita_sdk/tools/xray/__init__.py +17 -14
- alita_sdk/tools/xray/api_wrapper.py +58 -113
- alita_sdk/tools/yagmail/__init__.py +8 -3
- alita_sdk/tools/zephyr/__init__.py +11 -7
- alita_sdk/tools/zephyr_enterprise/__init__.py +15 -9
- alita_sdk/tools/zephyr_enterprise/api_wrapper.py +30 -15
- alita_sdk/tools/zephyr_essential/__init__.py +15 -10
- alita_sdk/tools/zephyr_essential/api_wrapper.py +297 -54
- alita_sdk/tools/zephyr_essential/client.py +6 -4
- alita_sdk/tools/zephyr_scale/__init__.py +12 -8
- alita_sdk/tools/zephyr_scale/api_wrapper.py +39 -31
- alita_sdk/tools/zephyr_squad/__init__.py +11 -7
- {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/METADATA +184 -37
- alita_sdk-0.3.562.dist-info/RECORD +450 -0
- alita_sdk-0.3.562.dist-info/entry_points.txt +2 -0
- alita_sdk/tools/bitbucket/tools.py +0 -304
- alita_sdk-0.3.257.dist-info/RECORD +0 -343
- {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/WHEEL +0 -0
- {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/licenses/LICENSE +0 -0
- {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
|
|
9
|
-
|
|
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, '
|
|
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
|
-
|
|
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
|
-
|
|
185
|
-
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
+
]
|