dao-ai 0.1.6__py3-none-any.whl → 0.1.8__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.
- dao_ai/config.py +100 -31
- dao_ai/tools/mcp.py +60 -40
- {dao_ai-0.1.6.dist-info → dao_ai-0.1.8.dist-info}/METADATA +1 -1
- {dao_ai-0.1.6.dist-info → dao_ai-0.1.8.dist-info}/RECORD +7 -7
- {dao_ai-0.1.6.dist-info → dao_ai-0.1.8.dist-info}/WHEEL +0 -0
- {dao_ai-0.1.6.dist-info → dao_ai-0.1.8.dist-info}/entry_points.txt +0 -0
- {dao_ai-0.1.6.dist-info → dao_ai-0.1.8.dist-info}/licenses/LICENSE +0 -0
dao_ai/config.py
CHANGED
|
@@ -24,6 +24,7 @@ from databricks.sdk.credentials_provider import (
|
|
|
24
24
|
ModelServingUserCredentials,
|
|
25
25
|
)
|
|
26
26
|
from databricks.sdk.errors.platform import NotFound
|
|
27
|
+
from databricks.sdk.service.apps import App
|
|
27
28
|
from databricks.sdk.service.catalog import FunctionInfo, TableInfo
|
|
28
29
|
from databricks.sdk.service.dashboards import GenieSpace
|
|
29
30
|
from databricks.sdk.service.database import DatabaseInstance
|
|
@@ -147,7 +148,7 @@ class PrimitiveVariableModel(BaseModel, HasValue):
|
|
|
147
148
|
return str(value)
|
|
148
149
|
|
|
149
150
|
@model_validator(mode="after")
|
|
150
|
-
def validate_value(self) ->
|
|
151
|
+
def validate_value(self) -> Self:
|
|
151
152
|
if not isinstance(self.as_value(), (str, int, float, bool)):
|
|
152
153
|
raise ValueError("Value must be a primitive type (str, int, float, bool)")
|
|
153
154
|
return self
|
|
@@ -415,15 +416,44 @@ class SchemaModel(BaseModel, HasFullName):
|
|
|
415
416
|
|
|
416
417
|
|
|
417
418
|
class DatabricksAppModel(IsDatabricksResource, HasFullName):
|
|
419
|
+
"""
|
|
420
|
+
Configuration for a Databricks App resource.
|
|
421
|
+
|
|
422
|
+
The `name` is the unique instance name of the Databricks App within the workspace.
|
|
423
|
+
The `url` is dynamically retrieved from the workspace client by calling
|
|
424
|
+
`apps.get(name)` and returning the app's URL.
|
|
425
|
+
|
|
426
|
+
Example:
|
|
427
|
+
```yaml
|
|
428
|
+
resources:
|
|
429
|
+
apps:
|
|
430
|
+
my_app:
|
|
431
|
+
name: my-databricks-app
|
|
432
|
+
```
|
|
433
|
+
"""
|
|
434
|
+
|
|
418
435
|
model_config = ConfigDict(use_enum_values=True, extra="forbid")
|
|
419
436
|
name: str
|
|
420
|
-
|
|
437
|
+
"""The unique instance name of the Databricks App in the workspace."""
|
|
421
438
|
|
|
422
|
-
@
|
|
423
|
-
def
|
|
424
|
-
"""
|
|
425
|
-
|
|
426
|
-
|
|
439
|
+
@property
|
|
440
|
+
def url(self) -> str:
|
|
441
|
+
"""
|
|
442
|
+
Retrieve the URL of the Databricks App from the workspace.
|
|
443
|
+
|
|
444
|
+
Returns:
|
|
445
|
+
The URL of the deployed Databricks App.
|
|
446
|
+
|
|
447
|
+
Raises:
|
|
448
|
+
RuntimeError: If the app is not found or URL is not available.
|
|
449
|
+
"""
|
|
450
|
+
app: App = self.workspace_client.apps.get(self.name)
|
|
451
|
+
if app.url is None:
|
|
452
|
+
raise RuntimeError(
|
|
453
|
+
f"Databricks App '{self.name}' does not have a URL. "
|
|
454
|
+
"The app may not be deployed yet."
|
|
455
|
+
)
|
|
456
|
+
return app.url
|
|
427
457
|
|
|
428
458
|
@property
|
|
429
459
|
def full_name(self) -> str:
|
|
@@ -445,7 +475,7 @@ class TableModel(IsDatabricksResource, HasFullName):
|
|
|
445
475
|
name: Optional[str] = None
|
|
446
476
|
|
|
447
477
|
@model_validator(mode="after")
|
|
448
|
-
def validate_name_or_schema_required(self) ->
|
|
478
|
+
def validate_name_or_schema_required(self) -> Self:
|
|
449
479
|
if not self.name and not self.schema_model:
|
|
450
480
|
raise ValueError(
|
|
451
481
|
"Either 'name' or 'schema_model' must be provided for TableModel"
|
|
@@ -730,11 +760,20 @@ class FunctionModel(IsDatabricksResource, HasFullName):
|
|
|
730
760
|
|
|
731
761
|
|
|
732
762
|
class WarehouseModel(IsDatabricksResource):
|
|
733
|
-
model_config = ConfigDict()
|
|
734
|
-
name: str
|
|
763
|
+
model_config = ConfigDict(use_enum_values=True, extra="forbid")
|
|
764
|
+
name: Optional[str] = None
|
|
735
765
|
description: Optional[str] = None
|
|
736
766
|
warehouse_id: AnyVariable
|
|
737
767
|
|
|
768
|
+
_warehouse_details: Optional[GetWarehouseResponse] = PrivateAttr(default=None)
|
|
769
|
+
|
|
770
|
+
def _get_warehouse_details(self) -> GetWarehouseResponse:
|
|
771
|
+
if self._warehouse_details is None:
|
|
772
|
+
self._warehouse_details = self.workspace_client.warehouses.get(
|
|
773
|
+
id=value_of(self.warehouse_id)
|
|
774
|
+
)
|
|
775
|
+
return self._warehouse_details
|
|
776
|
+
|
|
738
777
|
@property
|
|
739
778
|
def api_scopes(self) -> Sequence[str]:
|
|
740
779
|
return [
|
|
@@ -755,10 +794,22 @@ class WarehouseModel(IsDatabricksResource):
|
|
|
755
794
|
self.warehouse_id = value_of(self.warehouse_id)
|
|
756
795
|
return self
|
|
757
796
|
|
|
797
|
+
@model_validator(mode="after")
|
|
798
|
+
def populate_name(self) -> Self:
|
|
799
|
+
"""Populate name from warehouse details if not provided."""
|
|
800
|
+
if self.warehouse_id and not self.name:
|
|
801
|
+
try:
|
|
802
|
+
warehouse_details = self._get_warehouse_details()
|
|
803
|
+
if warehouse_details.name:
|
|
804
|
+
self.name = warehouse_details.name
|
|
805
|
+
except Exception as e:
|
|
806
|
+
logger.debug(f"Could not fetch details from warehouse: {e}")
|
|
807
|
+
return self
|
|
808
|
+
|
|
758
809
|
|
|
759
810
|
class GenieRoomModel(IsDatabricksResource):
|
|
760
811
|
model_config = ConfigDict(use_enum_values=True, extra="forbid")
|
|
761
|
-
name: str
|
|
812
|
+
name: Optional[str] = None
|
|
762
813
|
description: Optional[str] = None
|
|
763
814
|
space_id: AnyVariable
|
|
764
815
|
|
|
@@ -967,15 +1018,17 @@ class GenieRoomModel(IsDatabricksResource):
|
|
|
967
1018
|
return self
|
|
968
1019
|
|
|
969
1020
|
@model_validator(mode="after")
|
|
970
|
-
def
|
|
971
|
-
"""Populate description from GenieSpace if not provided."""
|
|
972
|
-
if not self.description:
|
|
1021
|
+
def populate_name_and_description(self) -> Self:
|
|
1022
|
+
"""Populate name and description from GenieSpace if not provided."""
|
|
1023
|
+
if self.space_id and (not self.name or not self.description):
|
|
973
1024
|
try:
|
|
974
1025
|
space_details = self._get_space_details()
|
|
975
|
-
if space_details.
|
|
1026
|
+
if not self.name and space_details.title:
|
|
1027
|
+
self.name = space_details.title
|
|
1028
|
+
if not self.description and space_details.description:
|
|
976
1029
|
self.description = space_details.description
|
|
977
1030
|
except Exception as e:
|
|
978
|
-
logger.debug(f"Could not fetch
|
|
1031
|
+
logger.debug(f"Could not fetch details from Genie space: {e}")
|
|
979
1032
|
return self
|
|
980
1033
|
|
|
981
1034
|
|
|
@@ -1011,7 +1064,7 @@ class VolumePathModel(BaseModel, HasFullName):
|
|
|
1011
1064
|
path: Optional[str] = None
|
|
1012
1065
|
|
|
1013
1066
|
@model_validator(mode="after")
|
|
1014
|
-
def validate_path_or_volume(self) ->
|
|
1067
|
+
def validate_path_or_volume(self) -> Self:
|
|
1015
1068
|
if not self.volume and not self.path:
|
|
1016
1069
|
raise ValueError("Either 'volume' or 'path' must be provided")
|
|
1017
1070
|
return self
|
|
@@ -1853,6 +1906,7 @@ class McpFunctionModel(BaseFunctionModel, IsDatabricksResource):
|
|
|
1853
1906
|
headers: dict[str, AnyVariable] = Field(default_factory=dict)
|
|
1854
1907
|
args: list[str] = Field(default_factory=list)
|
|
1855
1908
|
# MCP-specific fields
|
|
1909
|
+
app: Optional[DatabricksAppModel] = None
|
|
1856
1910
|
connection: Optional[ConnectionModel] = None
|
|
1857
1911
|
functions: Optional[SchemaModel] = None
|
|
1858
1912
|
genie_room: Optional[GenieRoomModel] = None
|
|
@@ -1940,6 +1994,7 @@ class McpFunctionModel(BaseFunctionModel, IsDatabricksResource):
|
|
|
1940
1994
|
|
|
1941
1995
|
Returns the URL based on the configured source:
|
|
1942
1996
|
- If url is set, returns it directly
|
|
1997
|
+
- If app is set, retrieves URL from Databricks App via workspace client
|
|
1943
1998
|
- If connection is set, constructs URL from connection
|
|
1944
1999
|
- If genie_room is set, constructs Genie MCP URL
|
|
1945
2000
|
- If sql is set, constructs DBSQL MCP URL (serverless)
|
|
@@ -1952,6 +2007,7 @@ class McpFunctionModel(BaseFunctionModel, IsDatabricksResource):
|
|
|
1952
2007
|
- Vector Search: https://{host}/api/2.0/mcp/vector-search/{catalog}/{schema}
|
|
1953
2008
|
- UC Functions: https://{host}/api/2.0/mcp/functions/{catalog}/{schema}
|
|
1954
2009
|
- Connection: https://{host}/api/2.0/mcp/external/{connection_name}
|
|
2010
|
+
- Databricks App: Retrieved dynamically from workspace
|
|
1955
2011
|
"""
|
|
1956
2012
|
# Direct URL provided
|
|
1957
2013
|
if self.url:
|
|
@@ -1974,6 +2030,10 @@ class McpFunctionModel(BaseFunctionModel, IsDatabricksResource):
|
|
|
1974
2030
|
if self.sql:
|
|
1975
2031
|
return f"{workspace_host}/api/2.0/mcp/sql"
|
|
1976
2032
|
|
|
2033
|
+
# Databricks App
|
|
2034
|
+
if self.app:
|
|
2035
|
+
return self.app.url
|
|
2036
|
+
|
|
1977
2037
|
# Vector Search
|
|
1978
2038
|
if self.vector_search:
|
|
1979
2039
|
if (
|
|
@@ -1983,33 +2043,35 @@ class McpFunctionModel(BaseFunctionModel, IsDatabricksResource):
|
|
|
1983
2043
|
raise ValueError(
|
|
1984
2044
|
"vector_search must have an index with a schema (catalog/schema) configured"
|
|
1985
2045
|
)
|
|
1986
|
-
catalog: str = self.vector_search.index.schema_model.catalog_name
|
|
1987
|
-
schema: str = self.vector_search.index.schema_model.schema_name
|
|
2046
|
+
catalog: str = value_of(self.vector_search.index.schema_model.catalog_name)
|
|
2047
|
+
schema: str = value_of(self.vector_search.index.schema_model.schema_name)
|
|
1988
2048
|
return f"{workspace_host}/api/2.0/mcp/vector-search/{catalog}/{schema}"
|
|
1989
2049
|
|
|
1990
2050
|
# UC Functions MCP server
|
|
1991
2051
|
if self.functions:
|
|
1992
|
-
catalog: str = self.functions.catalog_name
|
|
1993
|
-
schema: str = self.functions.schema_name
|
|
2052
|
+
catalog: str = value_of(self.functions.catalog_name)
|
|
2053
|
+
schema: str = value_of(self.functions.schema_name)
|
|
1994
2054
|
return f"{workspace_host}/api/2.0/mcp/functions/{catalog}/{schema}"
|
|
1995
2055
|
|
|
1996
2056
|
raise ValueError(
|
|
1997
|
-
"No URL source configured. Provide one of: url, connection, genie_room, "
|
|
2057
|
+
"No URL source configured. Provide one of: url, app, connection, genie_room, "
|
|
1998
2058
|
"sql, vector_search, or functions"
|
|
1999
2059
|
)
|
|
2000
2060
|
|
|
2001
2061
|
@field_serializer("transport")
|
|
2002
|
-
def serialize_transport(self, value) -> str:
|
|
2062
|
+
def serialize_transport(self, value: TransportType) -> str:
|
|
2063
|
+
"""Serialize transport enum to string."""
|
|
2003
2064
|
if isinstance(value, TransportType):
|
|
2004
2065
|
return value.value
|
|
2005
2066
|
return str(value)
|
|
2006
2067
|
|
|
2007
2068
|
@model_validator(mode="after")
|
|
2008
|
-
def validate_mutually_exclusive(self) ->
|
|
2069
|
+
def validate_mutually_exclusive(self) -> Self:
|
|
2009
2070
|
"""Validate that exactly one URL source is provided."""
|
|
2010
2071
|
# Count how many URL sources are provided
|
|
2011
2072
|
url_sources: list[tuple[str, Any]] = [
|
|
2012
2073
|
("url", self.url),
|
|
2074
|
+
("app", self.app),
|
|
2013
2075
|
("connection", self.connection),
|
|
2014
2076
|
("genie_room", self.genie_room),
|
|
2015
2077
|
("sql", self.sql),
|
|
@@ -2025,13 +2087,13 @@ class McpFunctionModel(BaseFunctionModel, IsDatabricksResource):
|
|
|
2025
2087
|
if len(provided_sources) == 0:
|
|
2026
2088
|
raise ValueError(
|
|
2027
2089
|
"For STREAMABLE_HTTP transport, exactly one of the following must be provided: "
|
|
2028
|
-
"url, connection, genie_room, sql, vector_search, or functions"
|
|
2090
|
+
"url, app, connection, genie_room, sql, vector_search, or functions"
|
|
2029
2091
|
)
|
|
2030
2092
|
if len(provided_sources) > 1:
|
|
2031
2093
|
raise ValueError(
|
|
2032
2094
|
f"For STREAMABLE_HTTP transport, only one URL source can be provided. "
|
|
2033
2095
|
f"Found: {', '.join(provided_sources)}. "
|
|
2034
|
-
f"Please provide only one of: url, connection, genie_room, sql, vector_search, or functions"
|
|
2096
|
+
f"Please provide only one of: url, app, connection, genie_room, sql, vector_search, or functions"
|
|
2035
2097
|
)
|
|
2036
2098
|
|
|
2037
2099
|
if self.transport == TransportType.STDIO:
|
|
@@ -2043,18 +2105,25 @@ class McpFunctionModel(BaseFunctionModel, IsDatabricksResource):
|
|
|
2043
2105
|
return self
|
|
2044
2106
|
|
|
2045
2107
|
@model_validator(mode="after")
|
|
2046
|
-
def update_url(self) ->
|
|
2047
|
-
|
|
2108
|
+
def update_url(self) -> Self:
|
|
2109
|
+
"""Resolve AnyVariable to concrete value for URL."""
|
|
2110
|
+
if self.url is not None:
|
|
2111
|
+
resolved_value: Any = value_of(self.url)
|
|
2112
|
+
# Cast to string since URL must be a string
|
|
2113
|
+
self.url = str(resolved_value) if resolved_value else None
|
|
2048
2114
|
return self
|
|
2049
2115
|
|
|
2050
2116
|
@model_validator(mode="after")
|
|
2051
|
-
def update_headers(self) ->
|
|
2117
|
+
def update_headers(self) -> Self:
|
|
2118
|
+
"""Resolve AnyVariable to concrete values for headers."""
|
|
2052
2119
|
for key, value in self.headers.items():
|
|
2053
|
-
|
|
2120
|
+
resolved_value: Any = value_of(value)
|
|
2121
|
+
# Headers must be strings
|
|
2122
|
+
self.headers[key] = str(resolved_value) if resolved_value else ""
|
|
2054
2123
|
return self
|
|
2055
2124
|
|
|
2056
2125
|
@model_validator(mode="after")
|
|
2057
|
-
def validate_tool_filters(self) ->
|
|
2126
|
+
def validate_tool_filters(self) -> Self:
|
|
2058
2127
|
"""Validate tool filter configuration."""
|
|
2059
2128
|
from loguru import logger
|
|
2060
2129
|
|
dao_ai/tools/mcp.py
CHANGED
|
@@ -26,9 +26,9 @@ from loguru import logger
|
|
|
26
26
|
from mcp.types import CallToolResult, TextContent, Tool
|
|
27
27
|
|
|
28
28
|
from dao_ai.config import (
|
|
29
|
+
IsDatabricksResource,
|
|
29
30
|
McpFunctionModel,
|
|
30
31
|
TransportType,
|
|
31
|
-
value_of,
|
|
32
32
|
)
|
|
33
33
|
|
|
34
34
|
|
|
@@ -143,12 +143,54 @@ def _should_include_tool(
|
|
|
143
143
|
return True
|
|
144
144
|
|
|
145
145
|
|
|
146
|
+
def _get_auth_resource(function: McpFunctionModel) -> IsDatabricksResource:
|
|
147
|
+
"""
|
|
148
|
+
Get the IsDatabricksResource to use for authentication.
|
|
149
|
+
|
|
150
|
+
Follows a priority hierarchy:
|
|
151
|
+
1. Explicit resource with auth (app, connection, genie_room, vector_search, functions)
|
|
152
|
+
2. McpFunctionModel itself (which also inherits from IsDatabricksResource)
|
|
153
|
+
|
|
154
|
+
Returns the resource whose workspace_client should be used for authentication.
|
|
155
|
+
"""
|
|
156
|
+
# Check each possible resource source in priority order
|
|
157
|
+
# These resources may have their own auth configured
|
|
158
|
+
if function.app:
|
|
159
|
+
return function.app
|
|
160
|
+
if function.connection:
|
|
161
|
+
return function.connection
|
|
162
|
+
if function.genie_room:
|
|
163
|
+
return function.genie_room
|
|
164
|
+
if function.vector_search:
|
|
165
|
+
return function.vector_search
|
|
166
|
+
if function.functions:
|
|
167
|
+
# SchemaModel doesn't have auth - fall through to McpFunctionModel
|
|
168
|
+
pass
|
|
169
|
+
|
|
170
|
+
# Fall back to McpFunctionModel itself (it inherits from IsDatabricksResource)
|
|
171
|
+
return function
|
|
172
|
+
|
|
173
|
+
|
|
146
174
|
def _build_connection_config(
|
|
147
175
|
function: McpFunctionModel,
|
|
148
176
|
) -> dict[str, Any]:
|
|
149
177
|
"""
|
|
150
178
|
Build the connection configuration dictionary for MultiServerMCPClient.
|
|
151
179
|
|
|
180
|
+
Authentication Strategy:
|
|
181
|
+
-----------------------
|
|
182
|
+
For HTTP transport, authentication is handled consistently using
|
|
183
|
+
DatabricksOAuthClientProvider with the workspace_client from the appropriate
|
|
184
|
+
IsDatabricksResource. The auth resource is selected in this priority:
|
|
185
|
+
|
|
186
|
+
1. Nested resource (app, connection, genie_room, vector_search) if it has auth
|
|
187
|
+
2. McpFunctionModel itself (inherits from IsDatabricksResource)
|
|
188
|
+
|
|
189
|
+
This approach ensures:
|
|
190
|
+
- Consistent auth handling across all MCP sources
|
|
191
|
+
- Automatic token refresh for long-running connections
|
|
192
|
+
- Support for OBO, service principal, PAT, and ambient auth
|
|
193
|
+
|
|
152
194
|
Args:
|
|
153
195
|
function: The MCP function model configuration.
|
|
154
196
|
|
|
@@ -162,52 +204,30 @@ def _build_connection_config(
|
|
|
162
204
|
"transport": function.transport.value,
|
|
163
205
|
}
|
|
164
206
|
|
|
165
|
-
# For HTTP transport
|
|
166
|
-
|
|
167
|
-
from databricks_mcp import DatabricksOAuthClientProvider
|
|
207
|
+
# For HTTP transport, use DatabricksOAuthClientProvider with unified auth
|
|
208
|
+
from databricks_mcp import DatabricksOAuthClientProvider
|
|
168
209
|
|
|
169
|
-
|
|
170
|
-
|
|
210
|
+
# Get the resource to use for authentication
|
|
211
|
+
auth_resource = _get_auth_resource(function)
|
|
171
212
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
)
|
|
176
|
-
|
|
177
|
-
return {
|
|
178
|
-
"url": function.mcp_url,
|
|
179
|
-
"transport": "http",
|
|
180
|
-
"auth": auth_provider,
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
# For HTTP transport with headers-based authentication
|
|
184
|
-
headers: dict[str, str] = {
|
|
185
|
-
key: str(value_of(val)) for key, val in function.headers.items()
|
|
186
|
-
}
|
|
213
|
+
# Get workspace client from the auth resource
|
|
214
|
+
workspace_client = auth_resource.workspace_client
|
|
215
|
+
auth_provider = DatabricksOAuthClientProvider(workspace_client)
|
|
187
216
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
client_secret=value_of(function.client_secret),
|
|
198
|
-
pat=value_of(function.pat),
|
|
199
|
-
)
|
|
200
|
-
headers["Authorization"] = f"Bearer {provider.create_token()}"
|
|
201
|
-
logger.trace("Generated fresh authentication token")
|
|
202
|
-
except Exception as e:
|
|
203
|
-
logger.error("Failed to create fresh token", error=str(e))
|
|
204
|
-
else:
|
|
205
|
-
logger.trace("Using existing authentication token")
|
|
217
|
+
# Log which resource is providing auth
|
|
218
|
+
resource_name = (
|
|
219
|
+
getattr(auth_resource, "name", None) or auth_resource.__class__.__name__
|
|
220
|
+
)
|
|
221
|
+
logger.trace(
|
|
222
|
+
"Using DatabricksOAuthClientProvider for authentication",
|
|
223
|
+
auth_resource=resource_name,
|
|
224
|
+
resource_type=auth_resource.__class__.__name__,
|
|
225
|
+
)
|
|
206
226
|
|
|
207
227
|
return {
|
|
208
228
|
"url": function.mcp_url,
|
|
209
229
|
"transport": "http",
|
|
210
|
-
"
|
|
230
|
+
"auth": auth_provider,
|
|
211
231
|
}
|
|
212
232
|
|
|
213
233
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dao-ai
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.8
|
|
4
4
|
Summary: DAO AI: A modular, multi-agent orchestration framework for complex AI workflows. Supports agent handoff, tool integration, and dynamic configuration via YAML.
|
|
5
5
|
Project-URL: Homepage, https://github.com/natefleming/dao-ai
|
|
6
6
|
Project-URL: Documentation, https://natefleming.github.io/dao-ai
|
|
@@ -2,7 +2,7 @@ dao_ai/__init__.py,sha256=18P98ExEgUaJ1Byw440Ct1ty59v6nxyWtc5S6Uq2m9Q,1062
|
|
|
2
2
|
dao_ai/agent_as_code.py,sha256=xIlLDpPVfmDVzLvbdY_V_CrC4Jvj2ItCWJ-NzdrszTo,538
|
|
3
3
|
dao_ai/catalog.py,sha256=sPZpHTD3lPx4EZUtIWeQV7VQM89WJ6YH__wluk1v2lE,4947
|
|
4
4
|
dao_ai/cli.py,sha256=7LGrVDRgSBpznr8c8EksAhzPW_8NJ9h4St3DSpx-0z4,48196
|
|
5
|
-
dao_ai/config.py,sha256=
|
|
5
|
+
dao_ai/config.py,sha256=OSAsqb2Rxn3ghnM5Nq7-wh13DizHzWI_6cxuRuT4_j8,125773
|
|
6
6
|
dao_ai/graph.py,sha256=1-uQlo7iXZQTT3uU8aYu0N5rnhw5_g_2YLwVsAs6M-U,1119
|
|
7
7
|
dao_ai/logging.py,sha256=lYy4BmucCHvwW7aI3YQkQXKJtMvtTnPDu9Hnd7_O4oc,1556
|
|
8
8
|
dao_ai/messages.py,sha256=4ZBzO4iFdktGSLrmhHzFjzMIt2tpaL-aQLHOQJysGnY,6959
|
|
@@ -55,7 +55,7 @@ dao_ai/tools/agent.py,sha256=plIWALywRjaDSnot13nYehBsrHRpBUpsVZakoGeajOE,1858
|
|
|
55
55
|
dao_ai/tools/core.py,sha256=bRIN3BZhRQX8-Kpu3HPomliodyskCqjxynQmYbk6Vjs,3783
|
|
56
56
|
dao_ai/tools/email.py,sha256=A3TsCoQgJR7UUWR0g45OPRGDpVoYwctFs1MOZMTt_d4,7389
|
|
57
57
|
dao_ai/tools/genie.py,sha256=4e_5MeAe7kDzHbYeXuNPFbY5z8ci3ouj8l5254CZ2lA,8874
|
|
58
|
-
dao_ai/tools/mcp.py,sha256=
|
|
58
|
+
dao_ai/tools/mcp.py,sha256=ZNalYo2atZECatZjMT8w4mHEsaUZJQ_fsCjia7px1nc,18689
|
|
59
59
|
dao_ai/tools/memory.py,sha256=lwObKimAand22Nq3Y63tsv-AXQ5SXUigN9PqRjoWKes,1836
|
|
60
60
|
dao_ai/tools/python.py,sha256=jWFnZPni2sCdtd8D1CqXnZIPHnWkdK27bCJnBXpzhvo,1879
|
|
61
61
|
dao_ai/tools/search.py,sha256=cJ3D9FKr1GAR6xz55dLtRkjtQsI0WRueGt9TPDFpOxc,433
|
|
@@ -64,8 +64,8 @@ dao_ai/tools/sql.py,sha256=tKd1gjpLuKdQDyfmyYYtMiNRHDW6MGRbdEVaeqyB8Ok,7632
|
|
|
64
64
|
dao_ai/tools/time.py,sha256=tufJniwivq29y0LIffbgeBTIDE6VgrLpmVf8Qr90qjw,9224
|
|
65
65
|
dao_ai/tools/unity_catalog.py,sha256=AjQfW7bvV8NurqDLIyntYRv2eJuTwNdbvex1L5CRjOk,15534
|
|
66
66
|
dao_ai/tools/vector_search.py,sha256=oe2uBwl2TfeJIXPpwiS6Rmz7wcHczSxNyqS9P3hE6co,14542
|
|
67
|
-
dao_ai-0.1.
|
|
68
|
-
dao_ai-0.1.
|
|
69
|
-
dao_ai-0.1.
|
|
70
|
-
dao_ai-0.1.
|
|
71
|
-
dao_ai-0.1.
|
|
67
|
+
dao_ai-0.1.8.dist-info/METADATA,sha256=kbbCJVZAI-U3czxwWr9z36m14PQk8poQdzOB_6RRLII,16685
|
|
68
|
+
dao_ai-0.1.8.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
69
|
+
dao_ai-0.1.8.dist-info/entry_points.txt,sha256=Xa-UFyc6gWGwMqMJOt06ZOog2vAfygV_DSwg1AiP46g,43
|
|
70
|
+
dao_ai-0.1.8.dist-info/licenses/LICENSE,sha256=YZt3W32LtPYruuvHE9lGk2bw6ZPMMJD8yLrjgHybyz4,1069
|
|
71
|
+
dao_ai-0.1.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|