alita-sdk 0.3.140b2__tar.gz → 0.3.140b3__tar.gz

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 (120) hide show
  1. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/PKG-INFO +1 -1
  2. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/pyproject.toml +1 -1
  3. alita_sdk-0.3.140b3/src/alita_sdk/tools/mcp_server_tool.py +101 -0
  4. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk.egg-info/PKG-INFO +1 -1
  5. alita_sdk-0.3.140b2/src/alita_sdk/tools/mcp_server_tool.py +0 -81
  6. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/LICENSE +0 -0
  7. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/README.md +0 -0
  8. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/requirements.txt +0 -0
  9. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/setup.cfg +0 -0
  10. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/__init__.py +0 -0
  11. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/__init__.py +0 -0
  12. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/agents/__init__.py +0 -0
  13. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/agents/llamaAgentParser.py +0 -0
  14. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/clients/__init__.py +0 -0
  15. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/clients/artifact.py +0 -0
  16. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/clients/client.py +0 -0
  17. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/clients/datasource.py +0 -0
  18. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/clients/prompt.py +0 -0
  19. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/__init__.py +0 -0
  20. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/analysis/__init__.py +0 -0
  21. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/analysis/ado_analyse/__init__.py +0 -0
  22. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/analysis/ado_analyse/api_wrapper.py +0 -0
  23. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/analysis/github_analyse/__init__.py +0 -0
  24. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/analysis/github_analyse/api_wrapper.py +0 -0
  25. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/analysis/gitlab_analyse/__init__.py +0 -0
  26. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/analysis/gitlab_analyse/api_wrapper.py +0 -0
  27. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/analysis/jira_analyse/__init__.py +0 -0
  28. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/analysis/jira_analyse/api_wrapper.py +0 -0
  29. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/browseruse/__init__.py +0 -0
  30. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/browseruse/api_wrapper.py +0 -0
  31. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/community/utils.py +0 -0
  32. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/__init__.py +0 -0
  33. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/agents/__init__.py +0 -0
  34. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/agents/xml_chat.py +0 -0
  35. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/assistant.py +0 -0
  36. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/chat_message_template.py +0 -0
  37. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/constants.py +0 -0
  38. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaBDDScenariosLoader.py +0 -0
  39. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaCSVLoader.py +0 -0
  40. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaConfluenceLoader.py +0 -0
  41. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaDirectoryLoader.py +0 -0
  42. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaDocxMammothLoader.py +0 -0
  43. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaExcelLoader.py +0 -0
  44. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaGitRepoLoader.py +0 -0
  45. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaImageLoader.py +0 -0
  46. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaJiraLoader.py +0 -0
  47. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaQtestLoader.py +0 -0
  48. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/AlitaTableLoader.py +0 -0
  49. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/__init__.py +0 -0
  50. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/constants.py +0 -0
  51. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/document_loaders/utils.py +0 -0
  52. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/indexer.py +0 -0
  53. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/interfaces/__init__.py +0 -0
  54. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/interfaces/kwextractor.py +0 -0
  55. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/interfaces/llm_processor.py +0 -0
  56. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/interfaces/loaders.py +0 -0
  57. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/interfaces/splitters.py +0 -0
  58. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/langraph_agent.py +0 -0
  59. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/mixedAgentParser.py +0 -0
  60. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/mixedAgentRenderes.py +0 -0
  61. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/retrievers/AlitaRetriever.py +0 -0
  62. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/retrievers/VectorstoreRetriever.py +0 -0
  63. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/retrievers/__init__.py +0 -0
  64. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/__init__.py +0 -0
  65. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/bdd_parser/__init__.py +0 -0
  66. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/bdd_parser/bdd_exceptions.py +0 -0
  67. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/bdd_parser/bdd_parser.py +0 -0
  68. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/bdd_parser/feature_types.py +0 -0
  69. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/bdd_parser/parser.py +0 -0
  70. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/git.py +0 -0
  71. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/log.py +0 -0
  72. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/quota.py +0 -0
  73. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/state.py +0 -0
  74. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/utils.py +0 -0
  75. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/tools/vector.py +0 -0
  76. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/langchain/utils.py +0 -0
  77. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/llamaindex/assistant.py +0 -0
  78. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/llms/__init__.py +0 -0
  79. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/llms/alita.py +0 -0
  80. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/llms/preloaded.py +0 -0
  81. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/toolkits/__init__.py +0 -0
  82. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/toolkits/application.py +0 -0
  83. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/toolkits/artifact.py +0 -0
  84. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/toolkits/datasource.py +0 -0
  85. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/toolkits/prompt.py +0 -0
  86. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/toolkits/subgraph.py +0 -0
  87. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/toolkits/tools.py +0 -0
  88. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/toolkits/vectorstore.py +0 -0
  89. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/__init__.py +0 -0
  90. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/agent.py +0 -0
  91. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/application.py +0 -0
  92. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/artifact.py +0 -0
  93. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/datasource.py +0 -0
  94. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/echo.py +0 -0
  95. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/function.py +0 -0
  96. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/indexer_tool.py +0 -0
  97. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/llm.py +0 -0
  98. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/loop.py +0 -0
  99. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/loop_output.py +0 -0
  100. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/pgvector_search.py +0 -0
  101. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/prompt.py +0 -0
  102. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/router.py +0 -0
  103. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/tool.py +0 -0
  104. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/tools/vectorstore.py +0 -0
  105. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/utils/AlitaCallback.py +0 -0
  106. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/utils/__init__.py +0 -0
  107. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/utils/evaluate.py +0 -0
  108. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/utils/logging.py +0 -0
  109. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/utils/save_dataframe.py +0 -0
  110. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/utils/streamlit.py +0 -0
  111. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk/utils/utils.py +0 -0
  112. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk.egg-info/SOURCES.txt +0 -0
  113. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk.egg-info/dependency_links.txt +0 -0
  114. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk.egg-info/requires.txt +0 -0
  115. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/alita_sdk.egg-info/top_level.txt +0 -0
  116. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/tests/__init__.py +0 -0
  117. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/tests/test_ado_analysis.py +0 -0
  118. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/tests/test_github_analysis.py +0 -0
  119. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/tests/test_gitlab_analysis.py +0 -0
  120. {alita_sdk-0.3.140b2 → alita_sdk-0.3.140b3}/src/tests/test_jira_analysis.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.140b2
3
+ Version: 0.3.140b3
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
  Project-URL: Homepage, https://projectalita.ai
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "alita_sdk"
7
- version = "0.3.140-beta2"
7
+ version = "0.3.140-beta3"
8
8
  description = "SDK for building langchain agents using resources from Alita"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,101 @@
1
+ import uuid
2
+ from logging import getLogger
3
+ from typing import Any, Type, Literal, Optional, Union, List
4
+
5
+ from langchain_core.tools import BaseTool
6
+ from pydantic import BaseModel, Field, create_model, EmailStr, constr
7
+
8
+ logger = getLogger(__name__)
9
+
10
+
11
+ class McpServerTool(BaseTool):
12
+ name: str
13
+ description: str
14
+ args_schema: Optional[Type[BaseModel]] = None
15
+ return_type: str = "str"
16
+ client: Any
17
+ server: str
18
+ tool_timeout_sec: int = 60
19
+
20
+
21
+ @staticmethod
22
+ def create_pydantic_model_from_schema(schema: dict):
23
+ def parse_type(field: dict, name: str = "Field") -> Any:
24
+ if "allOf" in field:
25
+ merged = {}
26
+ required = set()
27
+ for idx, subschema in enumerate(field["allOf"]):
28
+ sub_type = parse_type(subschema, f"{name}AllOf{idx}")
29
+ if hasattr(sub_type, "__fields__"):
30
+ merged.update({k: (v.outer_type_, v.default) for k, v in sub_type.__fields__.items()})
31
+ required.update({k for k, v in sub_type.__fields__.items() if v.required})
32
+ if merged:
33
+ return create_model(f"{name}AllOf", **merged)
34
+ return Any
35
+ if "anyOf" in field or "oneOf" in field:
36
+ key = "anyOf" if "anyOf" in field else "oneOf"
37
+ types = [parse_type(sub, f"{name}{key.capitalize()}{i}") for i, sub in enumerate(field[key])]
38
+ # Check for null type
39
+ if any(sub.get("type") == "null" for sub in field[key]):
40
+ non_null_types = [parse_type(sub, f"{name}{key.capitalize()}{i}")
41
+ for i, sub in enumerate(field[key]) if sub.get("type") != "null"]
42
+ if len(non_null_types) == 1:
43
+ return Optional[non_null_types[0]]
44
+ return Union[tuple(types)]
45
+ t = field.get("type")
46
+ if isinstance(t, list):
47
+ if "null" in t:
48
+ non_null = [x for x in t if x != "null"]
49
+ if len(non_null) == 1:
50
+ field = dict(field)
51
+ field["type"] = non_null[0]
52
+ return Optional[parse_type(field, name)]
53
+ return Any
54
+ return Any
55
+ if t == "string":
56
+ if "enum" in field:
57
+ return Literal[tuple(field["enum"])]
58
+ if field.get("format") == "email":
59
+ return EmailStr
60
+ if "pattern" in field:
61
+ return constr(regex=field["pattern"])
62
+ return str
63
+ if t == "integer":
64
+ return int
65
+ if t == "number":
66
+ return float
67
+ if t == "boolean":
68
+ return bool
69
+ if t == "object":
70
+ return McpServerTool.create_pydantic_model_from_schema(field)
71
+ if t == "array":
72
+ items = field.get("items", {})
73
+ return List[parse_type(items, name + "Item")]
74
+ return Any
75
+
76
+ properties = schema.get("properties", {})
77
+ required = set(schema.get("required", []))
78
+ fields = {}
79
+ for name, prop in properties.items():
80
+ typ = parse_type(prop, name.capitalize())
81
+ default = prop.get("default", ... if name in required else None)
82
+ field_args = {}
83
+ if "description" in prop:
84
+ field_args["description"] = prop["description"]
85
+ if "format" in prop:
86
+ field_args["format"] = prop["format"]
87
+ fields[name] = (typ, Field(default, **field_args))
88
+ return create_model("DynamicModel", **fields)
89
+
90
+ def _run(self, *args, **kwargs):
91
+ call_data = {
92
+ "server": self.server,
93
+ "tool_timeout_sec": self.tool_timeout_sec,
94
+ "tool_call_id": str(uuid.uuid4()),
95
+ "params": {
96
+ "name": self.name,
97
+ "arguments": kwargs
98
+ }
99
+ }
100
+
101
+ return self.client.mcp_tool_call(call_data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alita_sdk
3
- Version: 0.3.140b2
3
+ Version: 0.3.140b3
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
  Project-URL: Homepage, https://projectalita.ai
@@ -1,81 +0,0 @@
1
- import uuid
2
- from logging import getLogger
3
- from typing import Any, Type, Literal, Optional
4
-
5
- from langchain_core.tools import BaseTool
6
- from pydantic import BaseModel, Field, create_model
7
-
8
- logger = getLogger(__name__)
9
-
10
-
11
- class McpServerTool(BaseTool):
12
- name: str
13
- description: str
14
- args_schema: Optional[Type[BaseModel]] = None
15
- return_type: str = "str"
16
- client: Any
17
- server: str
18
- tool_timeout_sec: int = 60
19
-
20
-
21
- @staticmethod
22
- def create_pydantic_model_from_schema(schema: dict):
23
- fields = {}
24
- for field_name, field_info in schema['properties'].items():
25
- field_type = None
26
-
27
- if 'type' in field_info:
28
- field_type = field_info['type']
29
- elif 'allOf' in field_info or 'anyOf' in field_info:# ADO-MCP wit_update_work_item, testplan_add_test_cases_to_suite
30
- field_type = 'array'
31
-
32
- field_description = field_info.get('description', '')
33
- if field_type == 'string':
34
- if 'enum' in field_info:
35
- field_type = Literal[tuple(field_info['enum'])]
36
- else:
37
- field_type = str
38
- elif field_type == 'integer':
39
- field_type = int
40
- elif field_type == 'number':
41
- field_type = float
42
- elif field_type == 'boolean':
43
- field_type = bool
44
- elif field_type == 'object':#Dict[str, Any] - for tool start_browser in selenium mcp
45
- nested_model = McpServerTool.create_pydantic_model_from_schema(field_info) if 'properties' in field_info else dict# for tool build_run_build in ADO-MCP
46
- field_type = nested_model
47
- elif field_type == 'array':
48
- item_schema = field_info['items'] if 'items' in field_info else (field_info.get('allOf', field_info.get('anyOf', [{'type': None}]))[-1])# ADO-MCP wit_update_work_item, testplan_add_test_cases_to_suite
49
- item_type = McpServerTool.create_pydantic_model_from_schema(item_schema) if item_schema['type'] == 'object' else (
50
- str if item_schema['type'] == 'string' else # support enum
51
- int if item_schema['type'] == 'integer' else
52
- float if item_schema['type'] == 'number' else
53
- bool if item_schema['type'] == 'boolean' else
54
- list if item_schema['type'] == 'array' else# ADO-MCP testplan_add_test_cases_to_suite
55
- str if item_schema['type'] == 'null' else#for mcp-atlassian
56
- None
57
- )
58
- if item_type is None:
59
- raise ValueError(f"Unsupported array item type: {item_schema['type']}")
60
- field_type = list[item_type]
61
- else:
62
- raise ValueError(f"Unsupported field type: {field_type}")
63
-
64
- if field_name in schema.get('required', []):
65
- fields[field_name] = (field_type, Field(..., description=field_description))
66
- else:
67
- fields[field_name] = (Optional[field_type], Field(None, description=field_description))
68
- return create_model('DynamicModel', **fields)
69
-
70
- def _run(self, *args, **kwargs):
71
- call_data = {
72
- "server": self.server,
73
- "tool_timeout_sec": self.tool_timeout_sec,
74
- "tool_call_id": str(uuid.uuid4()),
75
- "params": {
76
- "name": self.name,
77
- "arguments": kwargs
78
- }
79
- }
80
-
81
- return self.client.mcp_tool_call(call_data)
File without changes
File without changes
File without changes