dao-ai 0.0.12__py3-none-any.whl → 0.0.14__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/agent_as_code.py CHANGED
@@ -1,14 +1,11 @@
1
1
  import sys
2
2
 
3
3
  import mlflow
4
- from langgraph.graph.state import CompiledStateGraph
5
4
  from loguru import logger
6
5
  from mlflow.models import ModelConfig
7
6
  from mlflow.pyfunc import ChatModel
8
7
 
9
8
  from dao_ai.config import AppConfig
10
- from dao_ai.graph import create_dao_ai_graph
11
- from dao_ai.models import create_agent
12
9
 
13
10
  mlflow.langchain.autolog()
14
11
 
@@ -20,8 +17,6 @@ log_level: str = config.app.log_level
20
17
  logger.remove()
21
18
  logger.add(sys.stderr, level=log_level)
22
19
 
23
- graph: CompiledStateGraph = create_dao_ai_graph(config=config)
24
-
25
- app: ChatModel = create_agent(graph)
20
+ app: ChatModel = config.as_chat_model()
26
21
 
27
22
  mlflow.models.set_model(app)
dao_ai/config.py CHANGED
@@ -351,12 +351,85 @@ class IndexModel(BaseModel, HasFullName, IsDatabricksResource):
351
351
  )
352
352
 
353
353
 
354
+ class GenieRoomModel(BaseModel, IsDatabricksResource):
355
+ model_config = ConfigDict(use_enum_values=True, extra="forbid")
356
+ name: str
357
+ description: Optional[str] = None
358
+ space_id: str
359
+
360
+ @property
361
+ def api_scopes(self) -> Sequence[str]:
362
+ return [
363
+ "dashboards.genie",
364
+ ]
365
+
366
+ def as_resource(self) -> DatabricksResource:
367
+ return DatabricksGenieSpace(
368
+ genie_space_id=self.space_id, on_behalf_of_user=self.on_behalf_of_user
369
+ )
370
+
371
+
372
+ class VolumeModel(BaseModel, HasFullName):
373
+ model_config = ConfigDict(use_enum_values=True, extra="forbid")
374
+ schema_model: Optional[SchemaModel] = Field(default=None, alias="schema")
375
+ name: str
376
+
377
+ @property
378
+ def full_name(self) -> str:
379
+ if self.schema_model:
380
+ return f"{self.schema_model.catalog_name}.{self.schema_model.schema_name}.{self.name}"
381
+ return self.name
382
+
383
+ def create(self, w: WorkspaceClient | None = None) -> None:
384
+ from dao_ai.providers.base import ServiceProvider
385
+ from dao_ai.providers.databricks import DatabricksProvider
386
+
387
+ provider: ServiceProvider = DatabricksProvider(w=w)
388
+ provider.create_volume(self)
389
+
390
+
391
+ class VolumePathModel(BaseModel, HasFullName):
392
+ model_config = ConfigDict(use_enum_values=True, extra="forbid")
393
+ volume: Optional[VolumeModel] = None
394
+ path: Optional[str] = None
395
+
396
+ @model_validator(mode="after")
397
+ def validate_path_or_volume(self):
398
+ if not self.volume and not self.path:
399
+ raise ValueError("Either 'volume' or 'path' must be provided")
400
+ return self
401
+
402
+ @property
403
+ def full_name(self) -> str:
404
+ if self.volume and self.volume.schema_model:
405
+ catalog_name: str = self.volume.schema_model.catalog_name
406
+ schema_name: str = self.volume.schema_model.schema_name
407
+ volume_name: str = self.volume.name
408
+ path = f"/{self.path}" if self.path else ""
409
+ return f"/Volumes/{catalog_name}/{schema_name}/{volume_name}{path}"
410
+ return self.path
411
+
412
+ def as_path(self) -> Path:
413
+ return Path(self.full_name)
414
+
415
+ def create(self, w: WorkspaceClient | None = None) -> None:
416
+ from dao_ai.providers.databricks import DatabricksProvider
417
+
418
+ if self.volume:
419
+ self.volume.create(w=w)
420
+
421
+ provider: DatabricksProvider = DatabricksProvider(w=w)
422
+ provider.create_path(self)
423
+
424
+
354
425
  class VectorStoreModel(BaseModel, IsDatabricksResource):
355
426
  model_config = ConfigDict(use_enum_values=True, extra="forbid")
356
427
  embedding_model: Optional[LLMModel] = None
357
428
  index: Optional[IndexModel] = None
358
429
  endpoint: Optional[VectorSearchEndpoint] = None
359
430
  source_table: TableModel
431
+ source_path: Optional[VolumePathModel] = None
432
+ checkpoint_path: Optional[VolumePathModel] = None
360
433
  primary_key: Optional[str] = None
361
434
  columns: Optional[list[str]] = Field(default_factory=list)
362
435
  doc_uri: Optional[str] = None
@@ -448,43 +521,6 @@ class VectorStoreModel(BaseModel, IsDatabricksResource):
448
521
  provider.create_vector_store(self)
449
522
 
450
523
 
451
- class GenieRoomModel(BaseModel, IsDatabricksResource):
452
- model_config = ConfigDict(use_enum_values=True, extra="forbid")
453
- name: str
454
- description: Optional[str] = None
455
- space_id: str
456
-
457
- @property
458
- def api_scopes(self) -> Sequence[str]:
459
- return [
460
- "dashboards.genie",
461
- ]
462
-
463
- def as_resource(self) -> DatabricksResource:
464
- return DatabricksGenieSpace(
465
- genie_space_id=self.space_id, on_behalf_of_user=self.on_behalf_of_user
466
- )
467
-
468
-
469
- class VolumeModel(BaseModel, HasFullName):
470
- model_config = ConfigDict(use_enum_values=True, extra="forbid")
471
- schema_model: Optional[SchemaModel] = Field(default=None, alias="schema")
472
- name: str
473
-
474
- @property
475
- def full_name(self) -> str:
476
- if self.schema_model:
477
- return f"{self.schema_model.catalog_name}.{self.schema_model.schema_name}.{self.name}"
478
- return self.name
479
-
480
- def create(self, w: WorkspaceClient | None = None) -> None:
481
- from dao_ai.providers.base import ServiceProvider
482
- from dao_ai.providers.databricks import DatabricksProvider
483
-
484
- provider: ServiceProvider = DatabricksProvider(w=w)
485
- provider.create_volume(self)
486
-
487
-
488
524
  class FunctionModel(BaseModel, HasFullName, IsDatabricksResource):
489
525
  model_config = ConfigDict()
490
526
  schema_model: Optional[SchemaModel] = Field(default=None, alias="schema")
@@ -1093,6 +1129,8 @@ class EvaluationModel(BaseModel):
1093
1129
  model: LLMModel
1094
1130
  table: TableModel
1095
1131
  num_evals: int
1132
+ agent_description: Optional[str] = None
1133
+ question_guidelines: Optional[str] = None
1096
1134
  custom_inputs: dict[str, Any] = Field(default_factory=dict)
1097
1135
  guidelines: list[GuidelineModel] = Field(default_factory=list)
1098
1136
 
@@ -1107,21 +1145,6 @@ class DatasetFormat(str, Enum):
1107
1145
  EXCEL = "excel"
1108
1146
 
1109
1147
 
1110
- class VolumePathModel(BaseModel, HasFullName):
1111
- model_config = ConfigDict(use_enum_values=True, extra="forbid")
1112
- volume: VolumeModel
1113
- path: str
1114
-
1115
- @property
1116
- def full_name(self) -> str:
1117
- if self.volume.schema_model:
1118
- catalog_name: str = self.volume.schema_model.catalog_name
1119
- schema_name: str = self.volume.schema_model.schema_name
1120
- volume_name: str = self.volume.name
1121
- return f"/Volumes/{catalog_name}/{schema_name}/{volume_name}/{self.path}"
1122
- return f"/Volumes/{volume_name}/{self.path}"
1123
-
1124
-
1125
1148
  class DatasetModel(BaseModel):
1126
1149
  model_config = ConfigDict(use_enum_values=True, extra="forbid")
1127
1150
  table: Optional[TableModel] = None
@@ -1211,6 +1234,10 @@ class AppConfig(BaseModel):
1211
1234
  def initialize(self) -> None:
1212
1235
  from dao_ai.hooks.core import create_hooks
1213
1236
 
1237
+ if self.app and self.app.log_level:
1238
+ logger.remove()
1239
+ logger.add(sys.stderr, level=self.app.log_level)
1240
+
1214
1241
  logger.debug("Calling initialization hooks...")
1215
1242
  initialization_functions: Sequence[Callable[..., Any]] = create_hooks(
1216
1243
  self.app.initialization_hooks
@@ -54,6 +54,7 @@ from dao_ai.config import (
54
54
  UnityCatalogFunctionSqlModel,
55
55
  VectorStoreModel,
56
56
  VolumeModel,
57
+ VolumePathModel,
57
58
  WarehouseModel,
58
59
  )
59
60
  from dao_ai.models import get_latest_model_version
@@ -441,6 +442,12 @@ class DatabricksProvider(ServiceProvider):
441
442
  )
442
443
  return volume_info
443
444
 
445
+ def create_path(self, volume_path: VolumePathModel) -> Path:
446
+ path: Path = volume_path.full_name
447
+ logger.info(f"Creating volume path: {path}")
448
+ self.w.files.create_directory(path)
449
+ return path
450
+
444
451
  def create_dataset(self, dataset: DatasetModel) -> None:
445
452
  current_dir: Path = "file:///" / Path.cwd().relative_to("/")
446
453
 
@@ -51,7 +51,9 @@ def create_vector_search_tool(
51
51
 
52
52
  vector_search_tool: BaseTool = VectorSearchRetrieverTool(
53
53
  name=name,
54
+ tool_name=name,
54
55
  description=description,
56
+ tool_description=description,
55
57
  index_name=index_name,
56
58
  columns=columns,
57
59
  **search_parameters,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dao-ai
3
- Version: 0.0.12
3
+ Version: 0.0.14
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
@@ -38,7 +38,7 @@ Requires-Dist: langgraph>=0.6.5
38
38
  Requires-Dist: langmem>=0.0.29
39
39
  Requires-Dist: loguru>=0.7.3
40
40
  Requires-Dist: mcp>=1.9.1
41
- Requires-Dist: mlflow>=3.1.1
41
+ Requires-Dist: mlflow>=3.3.2
42
42
  Requires-Dist: nest-asyncio>=1.6.0
43
43
  Requires-Dist: openevals>=0.0.19
44
44
  Requires-Dist: openpyxl>=3.1.5
@@ -1,9 +1,9 @@
1
1
  dao_ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- dao_ai/agent_as_code.py,sha256=WjBUJzHMAEX7joMaQGgBgnofiKxjJjdQEVsBJ4VSkPA,655
2
+ dao_ai/agent_as_code.py,sha256=rMWMC0nabtABHPD5H-Yy9ej7QNebLnXfvlZPiwrthoE,457
3
3
  dao_ai/catalog.py,sha256=sPZpHTD3lPx4EZUtIWeQV7VQM89WJ6YH__wluk1v2lE,4947
4
4
  dao_ai/chat_models.py,sha256=uhwwOTeLyHWqoTTgHrs4n5iSyTwe4EQcLKnh3jRxPWI,8626
5
5
  dao_ai/cli.py,sha256=Aez2TQW3Q8Ho1IaIkRggt0NevDxAAVPjXkePC5GPJF0,20429
6
- dao_ai/config.py,sha256=vT3CYFmTDzxc7zSLIat4B5vt-Q4Su-tl3BvFVbkXQIo,44197
6
+ dao_ai/config.py,sha256=VyHqkW1UMQJ0fzyme1fV_3fi_6wDmKRQeCrx881fDQ4,45173
7
7
  dao_ai/graph.py,sha256=rIm6cLsWwViB3L1dIZp9qc-U-JgFNB5ngEi22Y3iVGQ,7806
8
8
  dao_ai/guardrails.py,sha256=-Qh0f_2Db9t4Nbrrx9FM7tnpqShjMoyxepZ0HByItfU,4027
9
9
  dao_ai/messages.py,sha256=tRZQTeb5YFKu8cm1xeaCkKhidq-0tdzncNEzVePvits,6806
@@ -22,7 +22,7 @@ dao_ai/memory/core.py,sha256=K45iCEFbqJCVxMi4m3vmBJi4c6TQ-UtKGzyugDTkPP0,4141
22
22
  dao_ai/memory/postgres.py,sha256=YILzA7xtqawPAOLFaGG_i17zW7cQxXTzTD8yd-ipe8k,12480
23
23
  dao_ai/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  dao_ai/providers/base.py,sha256=-fjKypCOk28h6vioPfMj9YZSw_3Kcbi2nMuAyY7vX9k,1383
25
- dao_ai/providers/databricks.py,sha256=vV11SptrzIBEQQyiUqrysMfdpKKPrhVPvUVeEOQxx0o,27684
25
+ dao_ai/providers/databricks.py,sha256=XRPOqwF5SeA9rPAOWMg2gSMC7lw31BI5VI_4K0KIOqo,27931
26
26
  dao_ai/tools/__init__.py,sha256=ye6MHaJY7tUnJ8336YJiLxuZr55zDPNdOw6gm7j5jlc,1103
27
27
  dao_ai/tools/agent.py,sha256=_XMz6HtrybpVthhRyStADechF6vXLFyK97i01XTBhtw,1868
28
28
  dao_ai/tools/core.py,sha256=Kei33S8vrmvPOAyrFNekaWmV2jqZ-IPS1QDSvU7RZF0,1984
@@ -32,9 +32,9 @@ dao_ai/tools/mcp.py,sha256=rUeodCfGFXSvW-byTW9gsO6QI-p5SZkAP8ZFCFzREY0,4400
32
32
  dao_ai/tools/python.py,sha256=XcQiTMshZyLUTVR5peB3vqsoUoAAy8gol9_pcrhddfI,1831
33
33
  dao_ai/tools/time.py,sha256=Y-23qdnNHzwjvnfkWvYsE7PoWS1hfeKy44tA7sCnNac,8759
34
34
  dao_ai/tools/unity_catalog.py,sha256=PXfLj2EgyQgaXq4Qq3t25AmTC4KyVCF_-sCtg6enens,1404
35
- dao_ai/tools/vector_search.py,sha256=kLveW-JGwc4IbJ7fKclJFmDXhP3h5XBrjljgab2tRD4,2559
36
- dao_ai-0.0.12.dist-info/METADATA,sha256=20Ysj-78vWn6m64Bw0_OWjjGXNwiFDSV8ORbpcwLr_8,41338
37
- dao_ai-0.0.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
38
- dao_ai-0.0.12.dist-info/entry_points.txt,sha256=Xa-UFyc6gWGwMqMJOt06ZOog2vAfygV_DSwg1AiP46g,43
39
- dao_ai-0.0.12.dist-info/licenses/LICENSE,sha256=YZt3W32LtPYruuvHE9lGk2bw6ZPMMJD8yLrjgHybyz4,1069
40
- dao_ai-0.0.12.dist-info/RECORD,,
35
+ dao_ai/tools/vector_search.py,sha256=EDYQs51zIPaAP0ma1D81wJT77GQ-v-cjb2XrFVWfWdg,2621
36
+ dao_ai-0.0.14.dist-info/METADATA,sha256=jQdUAv02pr4wXZdMUJ9L_TksHGTCu4X_vrBKwvzIp4A,41338
37
+ dao_ai-0.0.14.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
38
+ dao_ai-0.0.14.dist-info/entry_points.txt,sha256=Xa-UFyc6gWGwMqMJOt06ZOog2vAfygV_DSwg1AiP46g,43
39
+ dao_ai-0.0.14.dist-info/licenses/LICENSE,sha256=YZt3W32LtPYruuvHE9lGk2bw6ZPMMJD8yLrjgHybyz4,1069
40
+ dao_ai-0.0.14.dist-info/RECORD,,