Skip to content

Commit 373ed60

Browse files
suseriAtlanclaude
andcommitted
feat: add Agentic, Skill, and Context Repository typedefs
Adds Python SDK support for the new Agentic hierarchy introduced in atlanhq/models#1942 (TTD-105): Agentic supertype under Catalog, with Skill/SkillArtifact and ContextRepository/ContextArtifact concrete types plus a shared Artifact/Context base. - New assets under pyatlan/model/assets/core: agentic, artifact, skill, skill_artifact, context, context_repository, context_artifact. - Creators on the four concrete types use NanoID-based qualifiedName patterns: default/skill/{id}, default/context/{id}, and {parent_qn}/artifact/{kind}/{id} for artifacts. Artifact creators auto-populate the parent relationship ref. - New ContextLifecycleStatus enum (DRAFT/ACTIVE/DEPRECATED/ARCHIVED). - FileType enum bumped to match models 1.1 (adds yaml, sql). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent d5109e7 commit 373ed60

11 files changed

Lines changed: 831 additions & 0 deletions

File tree

pyatlan/model/assets/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,13 @@
181181
"BigqueryRoutine",
182182
"DatabricksVolume",
183183
"DatabricksVolumePath",
184+
"Agentic",
185+
"Artifact",
186+
"Skill",
187+
"SkillArtifact",
188+
"Context",
189+
"ContextRepository",
190+
"ContextArtifact",
184191
"IndistinctAsset",
185192
],
186193
"task": ["Task"],

pyatlan/model/assets/__init__.pyi

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,13 @@ __all__ = [
449449
"AzureEventHubConsumerGroup",
450450
"DynamoDBLocalSecondaryIndex",
451451
"DynamoDBGlobalSecondaryIndex",
452+
"Agentic",
453+
"Artifact",
454+
"Skill",
455+
"SkillArtifact",
456+
"Context",
457+
"ContextRepository",
458+
"ContextArtifact",
452459
"IndistinctAsset",
453460
]
454461

@@ -532,6 +539,7 @@ from .core.adf_dataflow import AdfDataflow
532539
from .core.adf_dataset import AdfDataset
533540
from .core.adf_linkedservice import AdfLinkedservice
534541
from .core.adf_pipeline import AdfPipeline
542+
from .core.agentic import Agentic
535543
from .core.airflow import Airflow
536544
from .core.airflow_dag import AirflowDag
537545
from .core.airflow_task import AirflowTask
@@ -541,6 +549,7 @@ from .core.app import App
541549
from .core.app_workflow_run import AppWorkflowRun
542550
from .core.application import Application
543551
from .core.application_field import ApplicationField
552+
from .core.artifact import Artifact
544553
from .core.asset import Asset
545554
from .core.atlan_app import AtlanApp
546555
from .core.atlan_app_tool import AtlanAppTool
@@ -556,6 +565,9 @@ from .core.calculation_view import CalculationView
556565
from .core.catalog import Catalog
557566
from .core.column import Column
558567
from .core.column_process import ColumnProcess
568+
from .core.context import Context
569+
from .core.context_artifact import ContextArtifact
570+
from .core.context_repository import ContextRepository
559571
from .core.cosmos_mongo_d_b import CosmosMongoDB
560572
from .core.cosmos_mongo_d_b_account import CosmosMongoDBAccount
561573
from .core.cosmos_mongo_d_b_collection import CosmosMongoDBCollection
@@ -670,6 +682,8 @@ from .core.semantic_dimension import SemanticDimension
670682
from .core.semantic_entity import SemanticEntity
671683
from .core.semantic_measure import SemanticMeasure
672684
from .core.semantic_model import SemanticModel
685+
from .core.skill import Skill
686+
from .core.skill_artifact import SkillArtifact
673687
from .core.snowflake import Snowflake
674688
from .core.snowflake_a_i_model_context import SnowflakeAIModelContext
675689
from .core.snowflake_a_i_model_version import SnowflakeAIModelVersion

pyatlan/model/assets/core/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from .adf_dataset import AdfDataset
2020
from .adf_linkedservice import AdfLinkedservice
2121
from .adf_pipeline import AdfPipeline
22+
from .agentic import Agentic
2223
from .airflow import Airflow
2324
from .airflow_dag import AirflowDag
2425
from .airflow_task import AirflowTask
@@ -28,6 +29,7 @@
2829
from .app_workflow_run import AppWorkflowRun
2930
from .application import Application
3031
from .application_field import ApplicationField
32+
from .artifact import Artifact
3133
from .asset import Asset
3234
from .atlas_glossary import AtlasGlossary
3335
from .atlas_glossary_category import AtlasGlossaryCategory
@@ -40,6 +42,9 @@
4042
from .catalog import Catalog
4143
from .column import Column
4244
from .column_process import ColumnProcess
45+
from .context import Context
46+
from .context_artifact import ContextArtifact
47+
from .context_repository import ContextRepository
4348
from .cosmos_mongo_d_b import CosmosMongoDB
4449
from .cosmos_mongo_d_b_account import CosmosMongoDBAccount
4550
from .cosmos_mongo_d_b_collection import CosmosMongoDBCollection
@@ -153,6 +158,8 @@
153158
from .semantic_entity import SemanticEntity
154159
from .semantic_measure import SemanticMeasure
155160
from .semantic_model import SemanticModel
161+
from .skill import Skill
162+
from .skill_artifact import SkillArtifact
156163
from .snowflake import Snowflake
157164
from .snowflake_a_i_model_context import SnowflakeAIModelContext
158165
from .snowflake_a_i_model_version import SnowflakeAIModelVersion
@@ -362,3 +369,10 @@
362369
BigqueryRoutine.Attributes.update_forward_refs(**localns)
363370
DatabricksVolume.Attributes.update_forward_refs(**localns)
364371
DatabricksVolumePath.Attributes.update_forward_refs(**localns)
372+
Agentic.Attributes.update_forward_refs(**localns)
373+
Artifact.Attributes.update_forward_refs(**localns)
374+
Skill.Attributes.update_forward_refs(**localns)
375+
SkillArtifact.Attributes.update_forward_refs(**localns)
376+
Context.Attributes.update_forward_refs(**localns)
377+
ContextRepository.Attributes.update_forward_refs(**localns)
378+
ContextArtifact.Attributes.update_forward_refs(**localns)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
# Copyright 2025 Atlan Pte. Ltd.
3+
4+
5+
from __future__ import annotations
6+
7+
from typing import ClassVar, List
8+
9+
from pydantic.v1 import Field, validator
10+
11+
from .catalog import Catalog
12+
13+
14+
class Agentic(Catalog):
15+
"""Description"""
16+
17+
type_name: str = Field(default="Agentic", allow_mutation=False)
18+
19+
@validator("type_name")
20+
def validate_type_name(cls, v):
21+
if v != "Agentic":
22+
raise ValueError("must be Agentic")
23+
return v
24+
25+
def __setattr__(self, name, value):
26+
if name in Agentic._convenience_properties:
27+
return object.__setattr__(self, name, value)
28+
super().__setattr__(name, value)
29+
30+
_convenience_properties: ClassVar[List[str]] = []
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
# Copyright 2025 Atlan Pte. Ltd.
3+
4+
5+
from __future__ import annotations
6+
7+
from typing import ClassVar, List, Optional
8+
9+
from pydantic.v1 import Field, validator
10+
11+
from pyatlan.model.enums import FileType
12+
from pyatlan.model.fields.atlan_fields import KeywordField, RelationField, TextField
13+
14+
from .agentic import Agentic
15+
16+
17+
class Artifact(Agentic):
18+
"""Description"""
19+
20+
type_name: str = Field(default="Artifact", allow_mutation=False)
21+
22+
@validator("type_name")
23+
def validate_type_name(cls, v):
24+
if v != "Artifact":
25+
raise ValueError("must be Artifact")
26+
return v
27+
28+
def __setattr__(self, name, value):
29+
if name in Artifact._convenience_properties:
30+
return object.__setattr__(self, name, value)
31+
super().__setattr__(name, value)
32+
33+
ARTIFACT_VERSION: ClassVar[KeywordField] = KeywordField(
34+
"artifactVersion", "artifactVersion"
35+
)
36+
"""
37+
Version identifier for this artifact.
38+
"""
39+
FILE_TYPE: ClassVar[KeywordField] = KeywordField("fileType", "fileType")
40+
"""
41+
Type (extension) of the file.
42+
"""
43+
FILE_PATH: ClassVar[TextField] = TextField("filePath", "filePath")
44+
"""
45+
URL giving the online location where the file can be accessed.
46+
"""
47+
48+
FILE_ASSETS: ClassVar[RelationField] = RelationField("fileAssets")
49+
"""
50+
TBC
51+
"""
52+
53+
_convenience_properties: ClassVar[List[str]] = [
54+
"artifact_version",
55+
"file_type",
56+
"file_path",
57+
"file_assets",
58+
]
59+
60+
@property
61+
def artifact_version(self) -> Optional[str]:
62+
return None if self.attributes is None else self.attributes.artifact_version
63+
64+
@artifact_version.setter
65+
def artifact_version(self, artifact_version: Optional[str]):
66+
if self.attributes is None:
67+
self.attributes = self.Attributes()
68+
self.attributes.artifact_version = artifact_version
69+
70+
@property
71+
def file_type(self) -> Optional[FileType]:
72+
return None if self.attributes is None else self.attributes.file_type
73+
74+
@file_type.setter
75+
def file_type(self, file_type: Optional[FileType]):
76+
if self.attributes is None:
77+
self.attributes = self.Attributes()
78+
self.attributes.file_type = file_type
79+
80+
@property
81+
def file_path(self) -> Optional[str]:
82+
return None if self.attributes is None else self.attributes.file_path
83+
84+
@file_path.setter
85+
def file_path(self, file_path: Optional[str]):
86+
if self.attributes is None:
87+
self.attributes = self.Attributes()
88+
self.attributes.file_path = file_path
89+
90+
@property
91+
def file_assets(self) -> Optional[Asset]:
92+
return None if self.attributes is None else self.attributes.file_assets
93+
94+
@file_assets.setter
95+
def file_assets(self, file_assets: Optional[Asset]):
96+
if self.attributes is None:
97+
self.attributes = self.Attributes()
98+
self.attributes.file_assets = file_assets
99+
100+
class Attributes(Agentic.Attributes):
101+
artifact_version: Optional[str] = Field(default=None, description="")
102+
file_type: Optional[FileType] = Field(default=None, description="")
103+
file_path: Optional[str] = Field(default=None, description="")
104+
file_assets: Optional[Asset] = Field(
105+
default=None, description=""
106+
) # relationship
107+
108+
attributes: Artifact.Attributes = Field(
109+
default_factory=lambda: Artifact.Attributes(),
110+
description=(
111+
"Map of attributes in the instance and their values. "
112+
"The specific keys of this map will vary by type, "
113+
"so are described in the sub-types of this schema."
114+
),
115+
)
116+
117+
118+
from .asset import Asset # noqa: E402, F401
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
# Copyright 2025 Atlan Pte. Ltd.
3+
4+
5+
from __future__ import annotations
6+
7+
from typing import ClassVar, List, Optional
8+
9+
from pydantic.v1 import Field, validator
10+
11+
from pyatlan.model.fields.atlan_fields import KeywordField
12+
13+
from .agentic import Agentic
14+
15+
16+
class Context(Agentic):
17+
"""Description"""
18+
19+
type_name: str = Field(default="Context", allow_mutation=False)
20+
21+
@validator("type_name")
22+
def validate_type_name(cls, v):
23+
if v != "Context":
24+
raise ValueError("must be Context")
25+
return v
26+
27+
def __setattr__(self, name, value):
28+
if name in Context._convenience_properties:
29+
return object.__setattr__(self, name, value)
30+
super().__setattr__(name, value)
31+
32+
CONTEXT_REPOSITORY_QUALIFIED_NAME: ClassVar[KeywordField] = KeywordField(
33+
"contextRepositoryQualifiedName", "contextRepositoryQualifiedName"
34+
)
35+
"""
36+
Qualified name of the context repository to which this asset belongs.
37+
"""
38+
39+
_convenience_properties: ClassVar[List[str]] = [
40+
"context_repository_qualified_name",
41+
]
42+
43+
@property
44+
def context_repository_qualified_name(self) -> Optional[str]:
45+
return (
46+
None
47+
if self.attributes is None
48+
else self.attributes.context_repository_qualified_name
49+
)
50+
51+
@context_repository_qualified_name.setter
52+
def context_repository_qualified_name(
53+
self, context_repository_qualified_name: Optional[str]
54+
):
55+
if self.attributes is None:
56+
self.attributes = self.Attributes()
57+
self.attributes.context_repository_qualified_name = (
58+
context_repository_qualified_name
59+
)
60+
61+
class Attributes(Agentic.Attributes):
62+
context_repository_qualified_name: Optional[str] = Field(
63+
default=None, description=""
64+
)
65+
66+
attributes: Context.Attributes = Field(
67+
default_factory=lambda: Context.Attributes(),
68+
description=(
69+
"Map of attributes in the instance and their values. "
70+
"The specific keys of this map will vary by type, "
71+
"so are described in the sub-types of this schema."
72+
),
73+
)

0 commit comments

Comments
 (0)