Releases: atlanhq/atlan-python
Release list
v9.9.0
π New Features
-
Python 3.14 support: pyatlan now supports Python 3.14. The model layer's pydantic v1 compatibility shim was incompatible with Python 3.14's deferred-annotation semantics (PEP 649 / PEP 749) on pydantic 2.12.x β
AtlanClientfailed to import withConfigError: unable to infer type for attribute .... Bumping pydantic to 2.13.x restores the v1 compat layer on 3.14; no API changes. Verified across Python 3.9β3.14. -
New policy-action enums (
PersonaAIAction,AdminAction,TypeDefAction): Added topyatlan.model.enums, mirroring the Java SDK and matching the shape of the existingPersonaMetadataAction/DataAction.PersonaAIActioncovers the 18persona-ai-application-*/persona-ai-model-*Ranger slugs;AdminActionandTypeDefActioncover theadmin-*andtype-*/ relationship slugs β so tooling can convert raw Ranger policy-action slugs to their canonical enum names.
π₯ QOL Improvements
- pydantic bumped from
~=2.12.5to~=2.13.4(enables Python3.14support).
Full Changelog: 9.8.0...9.9.0
v9.8.0
π§ͺ Experimental:
Native App workflows (client.app)
This release previews a brand-new way to create and manage connector workflows directly from pyatlan β no hand-maintained package classes. It targets the native /v1/app* APIs and is experimental: the surface may change in a future release.
https://docs.atlan.com/product/capabilities/build-apps/sdks/python/apps
β¨ Highlights
AppClient β full app-workflow lifecycle (sync + async). Create, run, schedule, list, update, and delete workflows over the /v1/app* APIs.
- Resolve by name + idempotent create.
get_all(name=...)filters by exact workflow name, andcreate(...)is idempotent on a duplicate name β on the server's409it returns the existing workflow instead of erroring, so re-running a migration script is safe (create-or-reuse-by-name).
Typed app builders (pyatlan.model.apps) β one per connector. A fluent, UI-equivalent builder (e.g. BigqueryCrawler, SnowflakeCrawler, AtlanTableau, PostgresCrawler, β¦) that mirrors the "new app" wizard β Credential β Connection β Metadata.
from pyatlan.client.atlan import AtlanClient
from pyatlan.model.apps import BigqueryCrawler
client = AtlanClient()
response = (
BigqueryCrawler(client)
.service_account(email="...", service_account_json="...", project_id="...")
.connection(name="bigquery-prod", admin_roles=[client.role_cache.get_id_for_name("$admin")])
.include({"my_project": ["analytics", "sales"]})
.run(name="bigquery-prod")
)
print(response.slug, response.run_id) # persist `slug` for lifecycle opsβ οΈ Deprecations
WorkflowClient (client.workflow) and model.packages.* are deprecated and now emit a DeprecationWarning. They target the legacy workflow surface, which no longer runs on the latest Atlan tenants - use client.app instead.
Full Changelog: 9.7.6...9.8.0
v9.7.6
Bug Fixes π
Batch/AsyncBatchtracked lists now carry real identity (bothpyatlanandpyatlan_v9): the tracked lists (created/updated/partial_updated/restored) now carry each asset's realguidandqualified_name, so callers can match tracked items back to their inputs by either key. Previously non-glossary assets got a placeholder (negative) guid inpyatlan(or a missing/UNSETguid inpyatlan_v9) viatrim_to_required(), and glossary terms got the guid in place ofqualified_nameinpyatlan(or a missing/UNSETqualified_nameinpyatlan_v9) viaref_by_guid(), making the tracked items impossible to match back by guid or qualified_name. Tracking also now handlesAtlasGlossaryCategory(and types it correctly as a category): previously a category in the tracked path crashed__trackwithValueError("anchor.guid must be available"), because β likeAtlasGlossaryTermβ itstrim_to_required()requires the parent glossary anchor, which is absent in anAssetMutationResponse.
Full Changelog: 9.7.5...9.7.6
v9.7.5
Bug Fixes π
-
Count partial updates in
Batch/AsyncBatch: Successful partial updates β primitive-only attribute changes (e.g.user_descriptionalone) and any change touching a relationship (e.g. a glossary term'sanchor) β were never counted: they reportednum_updated: 0and were mislabeled asrestored, causing retry storms for callers that retry on "nothing updated" (notably the common glossary-term path). They are now reconciled from bothmutated_entities.PARTIAL_UPDATEand the top-levelpartial_updated_entities(de-duplicated by GUID) into newpartial_updated/num_partial_updatedtrackers. -
Fix
MutatedEntities.PARTIAL_UPDATEalias collision: the field was mistakenly declared withalias="DELETE", colliding with the realDELETEfield β so wirePARTIAL_UPDATEpayloads were dropped and deleted assets leaked intoassets_partially_updated(). Corrected toalias="PARTIAL_UPDATE".
Full Changelog: 9.7.4...9.7.5
v9.7.4
v9.7.3
π New Features
skillArtifactContentattribute onSkillArtifact: Adds theskill_artifact_content(skillArtifactContent) field toSkillArtifactin bothpyatlanandpyatlan_v9. The Atlas API returns this attribute on SkillArtifact entities but PyAtlan was silently dropping it (Config.extra = ignore). This unblocks the Atlan MCP server from surfacing skill.mdbody content viaget_asset/search_assetswithout needing a raw HTTP fallback. (#937)
π Bug Fixes
Connection.creatorvalidates connector_type slug (BLDX-1294):Connection.creatorandConnection.creator_async(both pyatlan and pyatlan_v9) now validateconnector_type.valueagainst^[a-z0-9-]+$β the same pattern the Atlan platform's server-side asset-import (RAB) path enforces. RaisesInvalidRequestError(ATLAN-PYTHON-400-079) on violation. Mirrors the Java SDK constraint. Root cause: a customer-createddev_cmdrconnection (underscore in slug) caused RAB to reject every asset-import referencing it, leaving phantomConnectionrows in Atlas. (#939)
Full Changelog: 9.7.2...9.7.3
v9.7.2
π New Features
- Add
AMAZON_MSKtoAtlanConnectorType: NewAMAZON_MSK = ("amazon-msk", AtlanConnectionCategory.EVENT_BUS)enum entry, matching the Java SDK. Removes the need for theextend_enumworkaround.
π Bug Fixes
DataProduct.creatornow defaultsdaap_visibilitytoPRIVATE: Mirrors the Atlan UI default. Fixes the marketplace Overview Assets tile rendering blank for products created via the SDK because the UI required bothdaapStatusanddaapVisibilityto be non-null. The earlier partial fix only setdaap_status. New optional overrides also exposed oncreator()/create():daap_visibility,daap_visibility_users,daap_visibility_groups,owner_users,owner_groups.DataProduct.creatordefaultsowner_usersto the calling user: When a client is passed, the creating user's username is used as the default owner, matching UI behavior.
Full Changelog: 9.7.1...9.7.2
v9.7.1
π Bug Fixes
DbtProcessandDbtColumnProcessnow extend the correct process parent: Atlas typedefs listDbtfirst insuperTypes, causing the class generator to pickDbtoverProcess/ColumnProcessas the Python superclass. This madeissubclass(cls, Process)returnFalse, causingatlan-publish-appto place dbt-process types in Batch 1 alongside their upstream entities and producing ATLAS-404 errors on everyinputs/outputslookup.
Full Changelog: 9.7.0...9.7.1
v9.7.0
New Features π
GENERIC_OPENLINEAGEconnector type: AddedAtlanConnectorType.GENERIC_OPENLINEAGE = ("generic-openlineage", AtlanConnectionCategory.ELT)so the SDK can target the marketplacegeneric-openlineage(GOLC) ingestion endpoint at/events/openlineage/generic-openlineage/api/v1/lineage. Mirrored inpyatlan_v9.OpenLineageEvent.emit()acceptsconnector_type:emit()andemit_async()now take an optionalconnector_typekwarg (defaulting toSPARK), matching the pattern already used byemit_raw()/emit_raw_async(). Removes the previous hardcoded SPARK assumption so callers can route events to any OpenLineage-compatible connector.
Bug Fixes π
DbtMeasureextendsSemanticMeasure, notDbt: The Atlas type hierarchy isDbtMeasure β SemanticMeasure β Semantic, but the generator pickedDbtas the Python parent because the typedef listssuperTypes=["Dbt", "SemanticMeasure"](Dbt first). This brokeatlan-publish-app's ordering graph βDbtSemanticModel β DbtMeasureedges were never created via thesemantic_measuresrelationship, causing publish to fail with ATLAS-404 onsemanticModellookup.
Experimental: pyatlan_v9 π§ͺ
- Generated latest typedef models.
Full Changelog: 9.6.0...9.7.0
v9.6.0
New Features π
- Deprecated Phosphor icon enum values: Added 11 deprecated Phosphor icon names (
PhActivity,PhCircleWavy*,PhFileDotted,PhFileSearch,PhFolderDotted,PhFolderSimpleDotted,PhPedestrian,PhTextBolder) toAtlanIconso the SDK can deserialize tag definitions that reference old icon names without failing.
Bug Fixes π
- httpcore connection pool deadlock fix: Fixed a production deadlock where concurrent
replace_custom_metadatacalls could hang indefinitely. Root cause: httpcore's connection pool filled with CLOSE_WAIT zombie sockets (nginx closed idle connections at 75s, httpcore didn't detect this) andpool=Nonetimeout meant threads waited forever. Fix addspool=30.0timeout,keepalive_expiry=30.0(< nginx 75s), andresponse.close()before retry sleep to release connection slots. Includesreset_http_session()for recovering degraded pools in long-running workflows.
QOL Improvements π₯
- Connection pool config extracted to constants:
_DEFAULT_POOL_LIMITSand_DEFAULT_POOL_TIMEOUT_SECONDSdefined once at module level instead of repeated 4 times across init, reset, max_retries, and timeout. - Trivy CI fix: Bumped Trivy from v0.69.0 (broken download) to v0.70.0.
Full Changelog: 9.5.0...9.6.0