digitalkin 0.3.2.dev25__py3-none-any.whl → 0.3.2.dev27__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.
- digitalkin/__version__.py +1 -1
- digitalkin/models/module/setup_types.py +9 -7
- digitalkin/models/module/tool_cache.py +6 -4
- digitalkin/models/module/tool_reference.py +34 -46
- {digitalkin-0.3.2.dev25.dist-info → digitalkin-0.3.2.dev27.dist-info}/METADATA +1 -1
- {digitalkin-0.3.2.dev25.dist-info → digitalkin-0.3.2.dev27.dist-info}/RECORD +9 -9
- {digitalkin-0.3.2.dev25.dist-info → digitalkin-0.3.2.dev27.dist-info}/WHEEL +0 -0
- {digitalkin-0.3.2.dev25.dist-info → digitalkin-0.3.2.dev27.dist-info}/licenses/LICENSE +0 -0
- {digitalkin-0.3.2.dev25.dist-info → digitalkin-0.3.2.dev27.dist-info}/top_level.txt +0 -0
digitalkin/__version__.py
CHANGED
|
@@ -399,7 +399,9 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
|
|
|
399
399
|
logger.info("ToolReference '%s' has no selected tools, skipping", field_name)
|
|
400
400
|
return
|
|
401
401
|
|
|
402
|
-
tools_to_resolve = [
|
|
402
|
+
tools_to_resolve = [
|
|
403
|
+
setup_id for setup_id in tool_ref.selected_tools if setup_id and setup_id not in resolved_tools
|
|
404
|
+
]
|
|
403
405
|
|
|
404
406
|
if not tools_to_resolve:
|
|
405
407
|
logger.info("All tools for '%s' already cached", field_name)
|
|
@@ -501,8 +503,8 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
|
|
|
501
503
|
if field_value is None:
|
|
502
504
|
continue
|
|
503
505
|
if isinstance(field_value, ToolReference):
|
|
504
|
-
for
|
|
505
|
-
tool_module_info = self.resolved_tools.get(
|
|
506
|
+
for setup_id in field_value.selected_tools:
|
|
507
|
+
tool_module_info = self.resolved_tools.get(setup_id)
|
|
506
508
|
if tool_module_info:
|
|
507
509
|
cache.add(tool_module_info)
|
|
508
510
|
elif isinstance(field_value, BaseModel):
|
|
@@ -521,8 +523,8 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
|
|
|
521
523
|
"""
|
|
522
524
|
for item in items:
|
|
523
525
|
if isinstance(item, ToolReference):
|
|
524
|
-
for
|
|
525
|
-
tool_module_info = self.resolved_tools.get(
|
|
526
|
+
for setup_id in item.selected_tools:
|
|
527
|
+
tool_module_info = self.resolved_tools.get(setup_id)
|
|
526
528
|
if tool_module_info:
|
|
527
529
|
cache.add(tool_module_info)
|
|
528
530
|
elif isinstance(item, BaseModel):
|
|
@@ -537,8 +539,8 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
|
|
|
537
539
|
"""
|
|
538
540
|
for item in mapping.values():
|
|
539
541
|
if isinstance(item, ToolReference):
|
|
540
|
-
for
|
|
541
|
-
tool_module_info = self.resolved_tools.get(
|
|
542
|
+
for setup_id in item.selected_tools:
|
|
543
|
+
tool_module_info = self.resolved_tools.get(setup_id)
|
|
542
544
|
if tool_module_info:
|
|
543
545
|
cache.add(tool_module_info)
|
|
544
546
|
elif isinstance(item, BaseModel):
|
|
@@ -120,7 +120,8 @@ class ToolCache(BaseModel):
|
|
|
120
120
|
|
|
121
121
|
async def module_info_to_tool_module_info(
|
|
122
122
|
module_info: ModuleInfo,
|
|
123
|
-
|
|
123
|
+
setup_id: str,
|
|
124
|
+
tool_name: str,
|
|
124
125
|
communication: "CommunicationStrategy",
|
|
125
126
|
*,
|
|
126
127
|
llm_format: bool = True,
|
|
@@ -132,7 +133,8 @@ async def module_info_to_tool_module_info(
|
|
|
132
133
|
|
|
133
134
|
Args:
|
|
134
135
|
module_info: Module info from registry.
|
|
135
|
-
|
|
136
|
+
setup_id: Setup ID of the selected tool.
|
|
137
|
+
tool_name: Name of the tool.
|
|
136
138
|
communication: Communication strategy for gRPC calls.
|
|
137
139
|
llm_format: Use LLM-friendly schema format.
|
|
138
140
|
|
|
@@ -161,8 +163,8 @@ async def module_info_to_tool_module_info(
|
|
|
161
163
|
documentation=module_info.documentation,
|
|
162
164
|
status=module_info.status,
|
|
163
165
|
tools=tools,
|
|
164
|
-
setup_id=
|
|
165
|
-
tool_name=
|
|
166
|
+
setup_id=setup_id,
|
|
167
|
+
tool_name=tool_name,
|
|
166
168
|
)
|
|
167
169
|
|
|
168
170
|
|
|
@@ -2,52 +2,38 @@
|
|
|
2
2
|
|
|
3
3
|
from typing import Annotated
|
|
4
4
|
|
|
5
|
-
from pydantic import AfterValidator, BaseModel, Field
|
|
5
|
+
from pydantic import AfterValidator, BaseModel, BeforeValidator, Field
|
|
6
6
|
from pydantic.annotated_handlers import GetJsonSchemaHandler
|
|
7
7
|
from pydantic.json_schema import JsonSchemaValue
|
|
8
8
|
from pydantic_core import CoreSchema
|
|
9
9
|
|
|
10
|
-
from digitalkin.models.module.tool_cache import
|
|
11
|
-
SelectedTool,
|
|
12
|
-
ToolModuleInfo,
|
|
13
|
-
module_info_to_tool_module_info,
|
|
14
|
-
)
|
|
10
|
+
from digitalkin.models.module.tool_cache import ToolModuleInfo, module_info_to_tool_module_info
|
|
15
11
|
from digitalkin.services.communication.communication_strategy import CommunicationStrategy
|
|
16
12
|
from digitalkin.services.registry import RegistryStrategy
|
|
17
13
|
|
|
18
14
|
|
|
19
15
|
class ToolReference(BaseModel):
|
|
20
|
-
"""Tool selection
|
|
16
|
+
"""Tool selection containing setup IDs."""
|
|
21
17
|
|
|
22
|
-
selected_tools: list[
|
|
23
|
-
setup_ids: list[str] = Field(default=[], description="Setup IDs for the user to choose from.")
|
|
24
|
-
module_ids: list[str] = Field(default=[], description="Module IDs for the user to choose from.")
|
|
25
|
-
tag_ids: list[str] = Field(default=[], description="Tag IDs for the user to choose from.")
|
|
26
|
-
categories: list[str] = Field(default=[], description="Categories for the user to choose from.")
|
|
27
|
-
max_tools: int = Field(default=0, description="Maximum tools to select. 0 for unlimited.")
|
|
28
|
-
min_tools: int = Field(default=0, description="Minimum tools to select. 0 for no minimum.")
|
|
18
|
+
selected_tools: list[str] = Field(default=[], description="Setup IDs of selected tools.")
|
|
29
19
|
|
|
30
20
|
async def resolve(self, registry: RegistryStrategy, communication: CommunicationStrategy) -> list[ToolModuleInfo]:
|
|
31
|
-
"""Resolve
|
|
21
|
+
"""Resolve selected tools using the registry.
|
|
32
22
|
|
|
33
23
|
Args:
|
|
34
24
|
registry: Registry service for module discovery.
|
|
35
25
|
communication: Communication service for module schemas.
|
|
36
26
|
|
|
37
27
|
Returns:
|
|
38
|
-
List of ToolModuleInfo
|
|
28
|
+
List of ToolModuleInfo for resolved tools.
|
|
39
29
|
"""
|
|
40
30
|
resolved: list[ToolModuleInfo] = []
|
|
41
|
-
for
|
|
42
|
-
setup = registry.get_setup(
|
|
31
|
+
for setup_id in self.selected_tools:
|
|
32
|
+
setup = registry.get_setup(setup_id)
|
|
43
33
|
if setup and setup.module_id:
|
|
44
34
|
info = registry.discover_by_id(setup.module_id)
|
|
45
|
-
tool.slug = tool.setup_id
|
|
46
|
-
tool.module_id = setup.module_id
|
|
47
|
-
tool.name = setup.name
|
|
48
35
|
if info:
|
|
49
|
-
resolved.append(await module_info_to_tool_module_info(info,
|
|
50
|
-
|
|
36
|
+
resolved.append(await module_info_to_tool_module_info(info, setup_id, setup.name, communication))
|
|
51
37
|
return resolved
|
|
52
38
|
|
|
53
39
|
|
|
@@ -72,38 +58,29 @@ class _ToolReferenceInputSchema:
|
|
|
72
58
|
|
|
73
59
|
def __get_pydantic_json_schema__( # noqa: PLW3201
|
|
74
60
|
self,
|
|
75
|
-
|
|
76
|
-
|
|
61
|
+
_schema: CoreSchema,
|
|
62
|
+
_handler: GetJsonSchemaHandler,
|
|
77
63
|
) -> JsonSchemaValue:
|
|
78
|
-
"""Generate JSON schema for ToolReference
|
|
79
|
-
|
|
80
|
-
Args:
|
|
81
|
-
schema: The core schema from Pydantic.
|
|
82
|
-
handler: Handler to generate JSON schema from core schema.
|
|
64
|
+
"""Generate JSON schema as array for UI, hiding ToolReference complexity.
|
|
83
65
|
|
|
84
66
|
Returns:
|
|
85
|
-
JSON schema
|
|
67
|
+
JSON schema as array with ui:widget toolSelect.
|
|
86
68
|
"""
|
|
87
|
-
json_schema =
|
|
88
|
-
|
|
69
|
+
json_schema: dict[str, object] = {
|
|
70
|
+
"type": "array",
|
|
71
|
+
"items": {"type": "string"},
|
|
72
|
+
}
|
|
73
|
+
if self.max_tools > 0:
|
|
74
|
+
json_schema["maxItems"] = self.max_tools
|
|
75
|
+
if self.min_tools > 0:
|
|
76
|
+
json_schema["minItems"] = self.min_tools
|
|
77
|
+
json_schema["ui:widget"] = "toolSelect"
|
|
78
|
+
json_schema["ui:options"] = {
|
|
89
79
|
"setupIds": self.setup_ids,
|
|
90
80
|
"moduleIds": self.module_ids,
|
|
91
81
|
"tagIds": self.tag_ids,
|
|
92
82
|
"categories": self.categories,
|
|
93
83
|
}
|
|
94
|
-
if self.max_tools > 0:
|
|
95
|
-
ui_options["maxTools"] = self.max_tools
|
|
96
|
-
if self.min_tools > 0:
|
|
97
|
-
ui_options["minTools"] = self.min_tools
|
|
98
|
-
json_schema["ui:options"] = ui_options
|
|
99
|
-
json_schema["ui:widget"] = "toolSelect"
|
|
100
|
-
if self.max_tools > 0 or self.min_tools > 0:
|
|
101
|
-
resolved = handler.resolve_ref_schema(json_schema)
|
|
102
|
-
selected_tools_schema = resolved["properties"]["selected_tools"]
|
|
103
|
-
if self.max_tools > 0:
|
|
104
|
-
selected_tools_schema["maxItems"] = self.max_tools
|
|
105
|
-
if self.min_tools > 0:
|
|
106
|
-
selected_tools_schema["minItems"] = self.min_tools
|
|
107
84
|
return json_schema
|
|
108
85
|
|
|
109
86
|
|
|
@@ -129,6 +106,16 @@ def tool_reference_input(
|
|
|
129
106
|
Annotated type for use in Pydantic models.
|
|
130
107
|
"""
|
|
131
108
|
|
|
109
|
+
def convert_to_tool_reference(v: object) -> ToolReference | object:
|
|
110
|
+
"""Convert list of setup IDs to ToolReference.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
ToolReference if input is list, otherwise original value.
|
|
114
|
+
"""
|
|
115
|
+
if isinstance(v, list):
|
|
116
|
+
return ToolReference(selected_tools=v)
|
|
117
|
+
return v
|
|
118
|
+
|
|
132
119
|
def validate_tools_count(v: ToolReference) -> ToolReference:
|
|
133
120
|
"""Validate selected_tools count against min/max constraints.
|
|
134
121
|
|
|
@@ -149,6 +136,7 @@ def tool_reference_input(
|
|
|
149
136
|
|
|
150
137
|
return Annotated[ # type: ignore[return-value]
|
|
151
138
|
ToolReference,
|
|
139
|
+
BeforeValidator(convert_to_tool_reference),
|
|
152
140
|
AfterValidator(validate_tools_count),
|
|
153
141
|
_ToolReferenceInputSchema(
|
|
154
142
|
setup_ids=setup_ids,
|
|
@@ -7,7 +7,7 @@ base_server/mock/__init__.py,sha256=YZFT-F1l_TpvJYuIPX-7kTeE1CfOjhx9YmNRXVoi-jQ,
|
|
|
7
7
|
base_server/mock/mock_pb2.py,sha256=sETakcS3PAAm4E-hTCV1jIVaQTPEAIoVVHupB8Z_k7Y,1843
|
|
8
8
|
base_server/mock/mock_pb2_grpc.py,sha256=BbOT70H6q3laKgkHfOx1QdfmCS_HxCY4wCOX84YAdG4,3180
|
|
9
9
|
digitalkin/__init__.py,sha256=7LLBAba0th-3SGqcpqFO-lopWdUkVLKzLZiMtB-mW3M,162
|
|
10
|
-
digitalkin/__version__.py,sha256=
|
|
10
|
+
digitalkin/__version__.py,sha256=Sgoi_BWPmZPvGJPS33B9mfXeua1Gp0L_nfAmYARTdBE,196
|
|
11
11
|
digitalkin/logger.py,sha256=8ze_tjt2G6mDTuQcsf7-UTXWP3UHZ7LZVSs_iqF4rX4,4685
|
|
12
12
|
digitalkin/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
digitalkin/core/__init__.py,sha256=FJRcJ-B1Viyn-38L8XpOpZ8KOnf1I7PCDOAmKXLQhqc,71
|
|
@@ -55,9 +55,9 @@ digitalkin/models/module/base_types.py,sha256=oIylVNqo0idTFj4dRgCt7P19daNZ-AlvgC
|
|
|
55
55
|
digitalkin/models/module/module.py,sha256=k0W8vfJJFth8XdDzkHm32SyTuSf3h2qF0hSrxAfGF1s,956
|
|
56
56
|
digitalkin/models/module/module_context.py,sha256=kwaAobsA82Du6L0XH9Is9u6Qj1rEjhYqVk00FonMaw4,12087
|
|
57
57
|
digitalkin/models/module/module_types.py,sha256=C9azCNBk76xMa-Mww8_6AiwQR8MLAsEyUOvBYxytovI,739
|
|
58
|
-
digitalkin/models/module/setup_types.py,sha256=
|
|
59
|
-
digitalkin/models/module/tool_cache.py,sha256=
|
|
60
|
-
digitalkin/models/module/tool_reference.py,sha256=
|
|
58
|
+
digitalkin/models/module/setup_types.py,sha256=Jh6zkSoKTdRTU2YsSoLGrVquLcYHvSeFUX9jpEiZyLU,19268
|
|
59
|
+
digitalkin/models/module/tool_cache.py,sha256=xCOH2tr7MN0-b3B_8If3mZvoingJsJB4M032ajfdmIA,6623
|
|
60
|
+
digitalkin/models/module/tool_reference.py,sha256=wX1DZFGiuZqcarxtb1TqlE0YVFxsYZb1sEQY249zj3w,5143
|
|
61
61
|
digitalkin/models/module/utility.py,sha256=gnbYfWpXGbomUI0fWf7T-Qm_VvT-LXDv1OuA9zObwVg,5589
|
|
62
62
|
digitalkin/models/services/__init__.py,sha256=jhfVw6egq0OcHmos_fypH9XFehbHTBw09wluVFVFEyw,226
|
|
63
63
|
digitalkin/models/services/cost.py,sha256=9PXvd5RrIk9vCrRjcUGQ9ZyAokEbwLg4s0RfnE-aLP4,1616
|
|
@@ -123,7 +123,7 @@ digitalkin/utils/dynamic_schema.py,sha256=y5csxjuqVHjWDpnTUzxbcUuI_wou9-ibRVHQlB
|
|
|
123
123
|
digitalkin/utils/llm_ready_schema.py,sha256=JjMug_lrQllqFoanaC091VgOqwAd-_YzcpqFlS7p778,2375
|
|
124
124
|
digitalkin/utils/package_discover.py,sha256=sa6Zp5Kape1Zr4iYiNrnZxiHDnqM06ODk6yfWHom53w,13465
|
|
125
125
|
digitalkin/utils/schema_splitter.py,sha256=f1RGzs0wSRPn8oydO9Ojo8mYTF4TFDkRFeGUt5jbPt4,11132
|
|
126
|
-
digitalkin-0.3.2.
|
|
126
|
+
digitalkin-0.3.2.dev27.dist-info/licenses/LICENSE,sha256=Ies4HFv2r2hzDRakJYxk3Y60uDFLiG-orIgeTpstnIo,20327
|
|
127
127
|
modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
128
|
modules/archetype_with_tools_module.py,sha256=kJkVhAFWG0aDDqzupOXOnV3l8j3z5bEdWos_6Z9rUP8,7303
|
|
129
129
|
modules/cpu_intensive_module.py,sha256=GZlirQDZdYuXrI46sv1q4RNAHZjL4EptHVQTvgK9zz8,8363
|
|
@@ -138,7 +138,7 @@ monitoring/digitalkin_observability/prometheus.py,sha256=gDmM9ySaVwPAe7Yg84pLxmE
|
|
|
138
138
|
monitoring/tests/test_metrics.py,sha256=ugnYfAwqBPO6zA8z4afKTlyBWECTivacYSN-URQCn2E,5856
|
|
139
139
|
services/filesystem_module.py,sha256=U4dgqtuDadaXz8PJ1d_uQ_1EPncBqudAQCLUICF9yL4,7421
|
|
140
140
|
services/storage_module.py,sha256=Wz2MzLvqs2D_bnBBgtnujYcAKK2V2KFMk8K21RoepSE,6972
|
|
141
|
-
digitalkin-0.3.2.
|
|
142
|
-
digitalkin-0.3.2.
|
|
143
|
-
digitalkin-0.3.2.
|
|
144
|
-
digitalkin-0.3.2.
|
|
141
|
+
digitalkin-0.3.2.dev27.dist-info/METADATA,sha256=0nBhEu0M24hxgr0lnD2D4RS6FxNAYixq7GecX1h0fpg,29725
|
|
142
|
+
digitalkin-0.3.2.dev27.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
143
|
+
digitalkin-0.3.2.dev27.dist-info/top_level.txt,sha256=AYVIesKrO0jnedQ-Muog9JBehG81WeTCNeOFoJgwsgE,51
|
|
144
|
+
digitalkin-0.3.2.dev27.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|