Skip to content

SK-3118: FlowDB support for Python SDK (skyflow-flowvault) + module segregation - #276

Open
saileshwar-skyflow wants to merge 19 commits into
mainfrom
saileshwar/SK-3118-flowdb-support-python-sdk
Open

SK-3118: FlowDB support for Python SDK (skyflow-flowvault) + module segregation#276
saileshwar-skyflow wants to merge 19 commits into
mainfrom
saileshwar/SK-3118-flowdb-support-python-sdk

Conversation

@saileshwar-skyflow

Copy link
Copy Markdown
Collaborator

Summary

Adds FlowDB (Flow DB vault) support to the Python SDK as a new published package, skyflow-flowvault, and segregates the repo into independently-built modules.

Modules

  • common/ — shared insert/validation/logging/auth logic.
  • skyvault/ — the existing Privacy DB SDK (published as skyflow), renamed from v2/.
  • flowvault/ — new Flow DB SDK (published as skyflow-flowvault), built on the regenerated Fern REST client.

flowvault operations

  • Unary: insert, get (single- and multi-table), update, delete, detokenize, query — all returning a unified records list with normalized tokens / hashed_data / metadata.
  • Bulk: bulk_insert / bulk_detokenize (sync + async) with env-var-driven batching and concurrency, order-preserving indexing, and records_to_retry() / tokens_to_retry() helpers.
  • Typed request/response data classes (InsertRequestRecord, UpsertOptions, ColumnRedaction, bulk request/response/summary types).

Docs & samples (Java-style layout)

  • Thin root README.md router → per-module comprehensive READMEs (flowvault/README.md, skyvault/README.md).
  • Each setup.py reads its own module README for the PyPI long_description.
  • Per-module samples/ trees (samples excluded from wheel + sdist via find_packages(exclude=[...]) and MANIFEST.in prune samples).
  • flowvault/CONTRACT_SHAPES.md request/response JSON reference.

Build / CI

  • Module-aware ci-scripts (bump_version.sh, current_module_version.sh).
  • .github/workflows updated for per-module builds (adds pr.yml, pr-flowvault.yml; retires beta-release.yml, ci.yml).

Testing

  • flowvault unit tests pass (incl. large-payload batching/indexing).
  • v3 contract suite passes.
  • Verified samples are absent from the built wheel and sdist, and that each module's PyPI long_description resolves to its own README.

🤖 Generated with Claude Code

saileshwar-skyflow and others added 13 commits July 7, 2026 16:31
…lowdb (v3) insert support

Restructures the repo into three build variants sharing a bundled common/
module (SK-2938 Option C): v2 (today's SDK, behavior-preserving) and a new
v3 built on the flowservice/flowdb API, insert-only this round.

common/
- Shared credential resolution, vault-URL resolution, and bearer-token
  fetch/cache/expiry logic (VaultController, BaseVaultClient), enums,
  errors, service_account, and generic validators.
- VaultController declares insert/get/update/delete/query/detokenize as
  abstract methods (Java-interface-style); v2 and v3 each provide their
  own concrete/stub implementations.

v2
- Relocated from the repo root via git mv; public API unchanged (same
  class names, signatures, import paths). Vault is now a backward-compatible
  alias for the internal PdbVaultController class.
- Fixed a latent bug where v2's own Env enum failed cross-class comparisons
  against common's Env; both now share one definition.

v3 (skyflow-flowvault, starting at 1.0.0)
- New InsertRequest/InsertRecord/Upsert/InsertResponse types, FlowVaultController,
  and VaultClient targeting the flowservice REST API.
- Insert validation ported from Java's v3 Validations.java: table/upsert
  must live in exactly one place (request-level or per-record, matching
  in both), 10k record cap, empty key/value checks.
- InsertResponse mirrors Java's v3 shape (summary/success/errors) as plain
  dicts, each result tagged with its index in the original record list
  (stable across batch boundaries).
- Structured per-record error parsing from the backend's actual error
  body, plus x-request-id propagation onto error entries.
- Batching via INSERT_BATCH_SIZE (default 50, max 1000), sequential,
  isolate-and-continue on a failing batch.
- Vault URL resolution uses v3's own skyvault.skyflowapis.* domain for
  all four envs (DEV/SANDBOX/STAGE/PROD), confirmed to differ from v2's
  vault.skyflowapis.* domain.

CI/CD
- shared-tests.yml and shared-build-and-deploy.yml now take a `variant`
  input and scope every step to v2/ or v3/ via working-directory.
- main.yml, ci.yml, beta-release.yml, internal-release.yml, and
  release.yml matrix over both variants. v3 releases are distinguished
  from v2's via a flowvault- tag/branch prefix (flowvault-1.0.0,
  flowvault-release/*) so a release trigger is never ambiguous between
  the two independently-versioned packages; v2's existing bare-semver
  tags are untouched.
- Fixed ruff.toml/.codespellrc still excluding a pre-split "skyflow/generated"
  path that no longer existed after the relocation.
- Fixed a bump_version.sh sed collision with a comment that happened to
  contain the literal text "__version__ = ...".
- Added a common/ test job to main.yml/ci.yml.

Note: v3/samples/ and the root samples/ folder are deliberately excluded
from this branch/commit -- local working copies there contain
credentials used for live testing against a real vault and must not be
pushed.

Tests: common 36, v3 65, v2 426 (2 pre-existing unrelated fixture
failures), tests/contract passing for both variants.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Distribution name was already skyflow-flowvault (setup.py) but the
importable package stayed skyflow, colliding with v2's skyflow
import name if both are ever installed in the same environment.
Rename the v3 directory to flowvault and its package to
skyflow_flowvault to match the distribution name and remove the
collision. generated/ content is left untouched (Fern-owned).
…d base insert response

Consolidates duplicated logic between v2 (PDB) and flowvault per architecture
review: shared validation (vault config, credentials, log level), LogLevel/Logger,
and insert field/table validation now live in common with per-variant message
injection; adds BaseInsertResponse alongside BaseInsertRequest so each variant's
InsertRequest/InsertResponse can extend a common base while keeping its own shape.
Also fixes flowvault's insert() response shape (drop redundant 'data'/'table',
flatten tokens, errors=None when empty) and a stale SDK_VERSION drift bug.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…insert()

Splits BaseSkyflow, BaseVaultController, and BaseVaultClient into a pure
interface (ISkyflow/IVaultController/IVaultClient, declaring the contract via
ABC + abstractmethod) plus a base class implementing the shared logic, so
future variant-specific overrides have a clear contract to satisfy. Also adds
type hints to insert() at every layer (BaseInsertRequest/BaseInsertResponse in
the abstract method, each variant's own InsertRequest/InsertResponse in their
concrete override), and renames base_vault.py to base_vault_controller.py to
match its class name.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…shape, add types

BaseInsertRequest's shared field is now named values (matching PDB's
terminology) instead of records, and table/values are required rather than
defaulted; each variant's InsertRequest forwards them explicitly. Removes
flowvault's Upsert class in favor of a plain dict (now typed via a TypedDict)
to match the rest of flowvault's dict-based request shape, and adds return
type hints to every method on v2's VaultController to match insert's.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
BaseSkyflow implements every ISkyflow abstract method, so ABC alone doesn't
block instantiating it directly -- only make_skyflow_class-produced
subclasses should be constructed. Raises SkyflowError with a new
SkyflowMessages entry instead of a raw NotImplementedError, matching how
every other SDK error is raised.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
CI workflows (ci.yml, main.yml, release.yml, beta-release.yml,
internal-release.yml) still referenced the pre-rename v3/ directory, so every
flowvault CI job failed outright. Threads a package-name (skyflow vs
skyflow_flowvault) through shared-tests.yml/shared-build-and-deploy.yml/
bump_version.sh, since those hardcoded the skyflow package name too -- a real
release would've bumped the wrong version file. Also fixes common/setup.py's
missing python-dotenv dependency (test-common CI job installs only this file's
declared deps), and removes the empty-value insert tests now that empty/null
field values are explicitly allowed rather than rejected.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… noise

flowvault/requirements.txt was missing coverage, so the v3 test job's
`python -m coverage run` step failed outright with "No module named
coverage" once the workflow correctly pointed at flowvault. Also excludes
**/generated/** (Fern-owned) from semgrep, since the generated REST clients
trip its secret-detection heuristics on parameter names like `token`, and
fixes a real semgrep finding: shared-build-and-deploy.yml interpolated
${{ }} context values directly into a run: shell block instead of routing
them through env: first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…e positives

test-common never ran coverage or uploaded to Codecov, so common/ (which grew
substantially this session) was invisible to Codecov's patch/project checks.
Adds a coverage run + Codecov upload step matching v2/flowvault's pattern.
Also fixes .semgreprules/customRule.yml's check-sensitive-info regex: an
optional quote-capture group let its own backreference match empty string,
so any `keyword: value` matched regardless of quoting -- tightened to require
an actual quoted literal and exclude self-referential values (e.g. TOKEN =
'token'), which eliminates 28 false positives without any inline suppressions.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…tion/detect structurally absent when unsupported

Renames ISkyflow -> BaseSkyflow (pure interface) and the old BaseSkyflow ->
BaseSkyflowImpl (concrete). Moves connection/detect support into
ConnectionCapable/DetectCapable interfaces + ConnectionMixin/DetectMixin in a
new common/client/utils/_utils.py, conditionally composed into a variant's
Skyflow class by make_skyflow_class() so unsupported variants (e.g. flowvault)
genuinely lack .connection()/.detect() (AttributeError) instead of raising
NotImplementedError from a present-but-guarded method.

Also fixes two review-flagged bugs: adding a vault/connection config with a
duplicate id to an already-built client now raises SkyflowError instead of
silently overwriting the existing entry, and update_connection_config no
longer risks a bare KeyError on a missing connection_id. Extracts the
Builder's raw NotImplementedError string literals into named constants.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
… common

Main advanced with the 2.1.3 release and SK-3039 (read the token roles/context
from credentials, not the vault config, and validate them). Those changes
landed on the old root-level `skyflow/` tree, which this branch has split into
`common/` + `skyvault/`, so they are re-applied where that logic now lives:

- common/utils/validations: add validate_token_options (roles/context checks,
  broadened context types, role-element validation) and call it from
  validate_credentials.
- common/vault/base_vault_client.get_bearer_token: validate token options and
  build role_ids/ctx from credentials instead of config.
- common/service_account._validate_and_resolve_ctx: take a messages param so
  delegated skyvault errors keep skyvault's SDK version in their text.
- skyvault validations delegate validate_token_options to common; skyvault
  bumped to 2.1.3 (setup.py + _version.py).
- SK-3039 client tests ported to common/tests/vault/test_base_vault_client.py
  (patch targets -> common.vault.base_vault_client) and the skyvault
  end-to-end tests repointed accordingly.
- shared-build-and-deploy.yml: keep module `ref` input alongside main's
  SK-2986 admin-token comment.
- flowvault bulk response: extract retryable-HTTP-code literals into constants
  (clears ruff PLR2004 that was failing CI).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Semgrep OSS found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

saileshwar-skyflow and others added 2 commits September 1, 2026 19:01
The shared per-module test loop aborted on the first module (common) and
`bash -e` then skipped skyvault and flowvault, so their tests never ran on a
PR. Two fixes:

- Add the repo root to PYTHONPATH for the test run. common/ is imported as a
  namespace package (common.vault has no __init__), so its own wheel can't be
  imported as `common`; resolving from the source tree fixes discovery for all
  modules.
- Run every module even if one fails and fail the job only at the end, so one
  module never hides the others' results.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Fern-generated REST clients are not hand-written and were dragging module
coverage down (failing Codecov) and producing 82 of 83 Semgrep code-scanning
alerts.

- codecov.yml: ignore **/generated/**.
- Add .coveragerc omit for */generated/* to common, skyvault and flowvault so
  generated code is not measured (flowvault 96.6%, common 86.6% after).
- semgrep.yml: pass --exclude generated so the SARIF upload no longer flags
  generated code.
- shared-build-and-deploy.yml: use the built-in $GITHUB_ACTOR env var instead
  of interpolating ${{ github.actor }} in a run step (the remaining Semgrep
  shell-injection finding).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread .github/workflows/shared-build-and-deploy.yml Fixed
…v targets

- shared-build-and-deploy.yml: route inputs/steps-outputs/github.ref_name
  through an env: block so no untrusted ${{ }} is interpolated in the run:
  script (clears the last Semgrep run-shell-injection alert).
- codecov.yml: the base's auto-target is 99.75% (mature v2 code), which a large
  PR adding new flowvault/common code can't hit; allow a 5% project threshold
  and an 85% patch target so codecov reflects real, healthy coverage
  (project 95.4%, patch 90.6%) instead of blocking on the inherited target.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@saileshwar-skyflow
saileshwar-skyflow force-pushed the saileshwar/SK-3118-flowdb-support-python-sdk branch from 4f7502d to 8ef7674 Compare September 1, 2026 17:28
Port the Java SDK's japicmp contract gate to Python using griffe (static API
analysis), for both published packages:

- ci-scripts/contract/griffe_contract.py: builds each package's public-API
  surface from an explicit module allowlist (mirrors Java's <includes>;
  excludes generated/ and internal utils helpers) and dumps/checks it against a
  committed baseline. Removed/changed entries are breaking, added entries are
  new surface; any drift fails.
- Committed baselines skyvault/api-report/skyflow.api.json (358 members) and
  flowvault/api-report/skyflow_flowvault.api.json (153).
- ci-scripts/contract-snapshot-update.sh: regenerate baselines after an
  intentional public API change.
- .github/workflows/contract-tests.yml: per-module matrix gate (fail-fast
  false), a skyvault-only guard `griffe check skyflow -a skyflow==2.1.3` (no
  breaking changes vs the released skyflow), and a PR comment showing the
  baseline diff when it changes.
- Add griffe[pypi] to each module's dev extras.

Verified skyvault's public surface has no breaking changes vs released
skyflow 2.1.3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

Public API contract change (flowvault)

This PR changes flowvault/api-report/skyflow_flowvault.api.json (the approved public API contract for skyflow_flowvault). Review the surface change below:

diff --git a/flowvault/api-report/skyflow_flowvault.api.json b/flowvault/api-report/skyflow_flowvault.api.json
new file mode 100644
index 0000000..f550c4a
--- /dev/null
+++ b/flowvault/api-report/skyflow_flowvault.api.json
@@ -0,0 +1,155 @@
+{
+  "skyflow_flowvault.Env": "class (Enum)",
+  "skyflow_flowvault.Env.DEV": "attr = 'DEV'",
+  "skyflow_flowvault.Env.PROD": "attr = 'PROD'",
+  "skyflow_flowvault.Env.SANDBOX": "attr = 'SANDBOX'",
+  "skyflow_flowvault.Env.STAGE": "attr = 'STAGE'",
+  "skyflow_flowvault.LogLevel": "class (Enum)",
+  "skyflow_flowvault.LogLevel.DEBUG": "attr = 1",
+  "skyflow_flowvault.LogLevel.ERROR": "attr = 4",
+  "skyflow_flowvault.LogLevel.INFO": "attr = 2",
+  "skyflow_flowvault.LogLevel.OFF": "attr = 5",
+  "skyflow_flowvault.LogLevel.WARN": "attr = 3",
+  "skyflow_flowvault.Skyflow": "attr",
+  "skyflow_flowvault.client.Skyflow": "attr",
+  "skyflow_flowvault.error.SkyflowError": "class (Exception)",
+  "skyflow_flowvault.error.SkyflowError.__init__": "def (self, message, http_code, request_id = None, grpc_code = None, http_status = None, details = None)",
+  "skyflow_flowvault.error.SkyflowError.details": "attr",
+  "skyflow_flowvault.error.SkyflowError.grpc_code": "attr",
+  "skyflow_flowvault.error.SkyflowError.http_code": "attr",
+  "skyflow_flowvault.error.SkyflowError.http_status": "attr",
+  "skyflow_flowvault.error.SkyflowError.message": "attr",
+  "skyflow_flowvault.error.SkyflowError.request_id": "attr",
+  "skyflow_flowvault.service_account.generate_bearer_token": "def (credentials_file_path, options = None, logger = None)",
+  "skyflow_flowvault.service_account.generate_bearer_token_from_creds": "def (credentials, options = None, logger = None)",
+  "skyflow_flowvault.service_account.generate_signed_data_tokens": "def (credentials_file_path, options)",
+  "skyflow_flowvault.service_account.generate_signed_data_tokens_from_creds": "def (credentials, options)",
+  "skyflow_flowvault.service_account.is_expired": "def (token, logger = None)",
+  "skyflow_flowvault.utils.enums.EnvUrls": "class (Enum)",
+  "skyflow_flowvault.utils.enums.EnvUrls.DEV": "attr = 'skyvault.skyflowapis.dev'",
+  "skyflow_flowvault.utils.enums.EnvUrls.PROD": "attr = 'skyvault.skyflowapis.com'",
+  "skyflow_flowvault.utils.enums.EnvUrls.SANDBOX": "attr = 'skyvault.skyflowapis-preview.com'",
+  "skyflow_flowvault.utils.enums.EnvUrls.STAGE": "attr = 'skyvault.skyflowapis.tech'",
+  "skyflow_flowvault.utils.enums.UpsertType": "class (Enum)",
+  "skyflow_flowvault.utils.enums.UpsertType.REPLACE": "attr = 'REPLACE'",
+  "skyflow_flowvault.utils.enums.UpsertType.UPDATE": "attr = 'UPDATE'",
+  "skyflow_flowvault.vault.controller.VaultController": "class (BaseVaultController)",
+  "skyflow_flowvault.vault.controller.VaultController.__init__": "def (self, vault_client)",
+  "skyflow_flowvault.vault.controller.VaultController.bulk_detokenize": "def (self, request: BulkDetokenizeRequest) -> BulkDetokenizeResponse",
+  "skyflow_flowvault.vault.controller.VaultController.bulk_detokenize_async": "def (self, request: BulkDetokenizeRequest) -> BulkDetokenizeResponse",
+  "skyflow_flowvault.vault.controller.VaultController.bulk_insert": "def (self, request: BulkInsertRequest) -> BulkInsertResponse",
+  "skyflow_flowvault.vault.controller.VaultController.bulk_insert_async": "def (self, request: BulkInsertRequest) -> BulkInsertResponse",
+  "skyflow_flowvault.vault.controller.VaultController.delete": "def (self, request: DeleteRequest) -> DeleteResponse",
+  "skyflow_flowvault.vault.controller.VaultController.detokenize": "def (self, request: DetokenizeRequest) -> DetokenizeResponse",
+  "skyflow_flowvault.vault.controller.VaultController.get": "def (self, request: GetRequest) -> GetResponse",
+  "skyflow_flowvault.vault.controller.VaultController.insert": "def (self, request: InsertRequest) -> InsertResponse",
+  "skyflow_flowvault.vault.controller.VaultController.query": "def (self, request: QueryRequest) -> QueryResponse",
+  "skyflow_flowvault.vault.controller.VaultController.update": "def (self, request: UpdateRequest) -> UpdateResponse",
+  "skyflow_flowvault.vault.data.BulkDetokenizeRequest": "class ()",
+  "skyflow_flowvault.vault.data.BulkDetokenizeRequest.__init__": "def (self, tokens: list, token_group_redactions: list = None)",
+  "skyflow_flowvault.vault.data.BulkDetokenizeRequest.token_group_redactions": "attr",
+  "skyflow_flowvault.vault.data.BulkDetokenizeRequest.tokens": "attr",
+  "skyflow_flowvault.vault.data.BulkDetokenizeResponse": "class ()",
+  "skyflow_flowvault.vault.data.BulkDetokenizeResponse.__init__": "def (self, summary = None, records = None, _original_tokens = None)",
+  "skyflow_flowvault.vault.data.BulkDetokenizeResponse.records": "attr",
+  "skyflow_flowvault.vault.data.BulkDetokenizeResponse.summary": "attr",
+  "skyflow_flowvault.vault.data.BulkDetokenizeResponse.tokens_to_retry": "def (self)",
+  "skyflow_flowvault.vault.data.BulkInsertRecord": "class ()",
+  "skyflow_flowvault.vault.data.BulkInsertRecord.__init__": "def (self, data: dict, table: str = None, upsert: UpsertOptions = None)",
+  "skyflow_flowvault.vault.data.BulkInsertRecord.data": "attr",
+  "skyflow_flowvault.vault.data.BulkInsertRecord.table": "attr",
+  "skyflow_flowvault.vault.data.BulkInsertRecord.upsert": "attr",
+  "skyflow_flowvault.vault.data.BulkInsertRequest": "class ()",
+  "skyflow_flowvault.vault.data.BulkInsertRequest.__init__": "def (self, records: List[BulkInsertRecord], table: str = None, upsert: UpsertOptions = None)",
+  "skyflow_flowvault.vault.data.BulkInsertRequest.records": "attr",
+  "skyflow_flowvault.vault.data.BulkInsertRequest.table": "attr",
+  "skyflow_flowvault.vault.data.BulkInsertRequest.upsert": "attr",
+  "skyflow_flowvault.vault.data.BulkInsertResponse": "class ()",
+  "skyflow_flowvault.vault.data.BulkInsertResponse.__init__": "def (self, summary = None, records = None, _original_records = None)",
+  "skyflow_flowvault.vault.data.BulkInsertResponse.records": "attr",
+  "skyflow_flowvault.vault.data.BulkInsertResponse.records_to_retry": "def (self)",
+  "skyflow_flowvault.vault.data.BulkInsertResponse.summary": "attr",
+  "skyflow_flowvault.vault.data.BulkSummary": "class ()",
+  "skyflow_flowvault.vault.data.BulkSummary.__init__": "def (self, total_records = 0, total_inserted = 0, total_failed = 0)",
+  "skyflow_flowvault.vault.data.BulkSummary.total_failed": "attr",
+  "skyflow_flowvault.vault.data.BulkSummary.total_inserted": "attr",
+  "skyflow_flowvault.vault.data.BulkSummary.total_records": "attr",
+  "skyflow_flowvault.vault.data.ColumnRedaction": "class ()",
+  "skyflow_flowvault.vault.data.ColumnRedaction.__init__": "def (self, column_name: str, redaction: str = None)",
+  "skyflow_flowvault.vault.data.ColumnRedaction.column_name": "attr",
+  "skyflow_flowvault.vault.data.ColumnRedaction.redaction": "attr",
+  "skyflow_flowvault.vault.data.DeleteRequest": "class ()",
+  "skyflow_flowvault.vault.data.DeleteRequest.__init__": "def (self, table: str, ids: list = None, unique_values: list = None)",
+  "skyflow_flowvault.vault.data.DeleteRequest.ids": "attr",
+  "skyflow_flowvault.vault.data.DeleteRequest.table": "attr",
+  "skyflow_flowvault.vault.data.DeleteRequest.unique_values": "attr",
+  "skyflow_flowvault.vault.data.DeleteResponse": "class ()",
+  "skyflow_flowvault.vault.data.DeleteResponse.__init__": "def (self, records = None)",
+  "skyflow_flowvault.vault.data.DeleteResponse.records": "attr",
+  "skyflow_flowvault.vault.data.DetokenizeRequest": "class ()",
+  "skyflow_flowvault.vault.data.DetokenizeRequest.__init__": "def (self, tokens: list, token_group_redactions: list = None)",
+  "skyflow_flowvault.vault.data.DetokenizeRequest.token_group_redactions": "attr",
+  "skyflow_flowvault.vault.data.DetokenizeRequest.tokens": "attr",
+  "skyflow_flowvault.vault.data.DetokenizeResponse": "class ()",
+  "skyflow_flowvault.vault.data.DetokenizeResponse.__init__": "def (self, records = None)",
+  "skyflow_flowvault.vault.data.DetokenizeResponse.records": "attr",
+  "skyflow_flowvault.vault.data.DetokenizeSummary": "class ()",
+  "skyflow_flowvault.vault.data.DetokenizeSummary.__init__": "def (self, total_tokens = 0, total_detokenized = 0, total_failed = 0)",
+  "skyflow_flowvault.vault.data.DetokenizeSummary.total_detokenized": "attr",
+  "skyflow_flowvault.vault.data.DetokenizeSummary.total_failed": "attr",
+  "skyflow_flowvault.vault.data.DetokenizeSummary.total_tokens": "attr",
+  "skyflow_flowvault.vault.data.GetRecordRequest": "class ()",
+  "skyflow_flowvault.vault.data.GetRecordRequest.__init__": "def (self, table: str, ids: list = None, columns: list = None, column_redactions: List[ColumnRedaction] = None, unique_values: list = None)",
+  "skyflow_flowvault.vault.data.GetRecordRequest.column_redactions": "attr",
+  "skyflow_flowvault.vault.data.GetRecordRequest.columns": "attr",
+  "skyflow_flowvault.vault.data.GetRecordRequest.ids": "attr",
+  "skyflow_flowvault.vault.data.GetRecordRequest.table": "attr",
+  "skyflow_flowvault.vault.data.GetRecordRequest.unique_values": "attr",
+  "skyflow_flowvault.vault.data.GetRequest": "class ()",
+  "skyflow_flowvault.vault.data.GetRequest.__init__": "def (self, table: str = None, ids: list = None, unique_values: list = None, columns: list = None, column_redactions: List[ColumnRedaction] = None, limit: int = None, offset: int = None, records: list = None)",
+  "skyflow_flowvault.vault.data.GetRequest.column_redactions": "attr",
+  "skyflow_flowvault.vault.data.GetRequest.columns": "attr",
+  "skyflow_flowvault.vault.data.GetRequest.ids": "attr",
+  "skyflow_flowvault.vault.data.GetRequest.limit": "attr",
+  "skyflow_flowvault.vault.data.GetRequest.offset": "attr",
+  "skyflow_flowvault.vault.data.GetRequest.records": "attr",
+  "skyflow_flowvault.vault.data.GetRequest.table": "attr",
+  "skyflow_flowvault.vault.data.GetRequest.unique_values": "attr",
+  "skyflow_flowvault.vault.data.GetResponse": "class ()",
+  "skyflow_flowvault.vault.data.GetResponse.__init__": "def (self, records = None)",
+  "skyflow_flowvault.vault.data.GetResponse.records": "attr",
+  "skyflow_flowvault.vault.data.InsertRequest": "class ()",
+  "skyflow_flowvault.vault.data.InsertRequest.__init__": "def (self, records: List[InsertRequestRecord], table_name: str = None, upsert: UpsertOptions = None)",
+  "skyflow_flowvault.vault.data.InsertRequest.records": "attr",
+  "skyflow_flowvault.vault.data.InsertRequest.table_name": "attr",
+  "skyflow_flowvault.vault.data.InsertRequest.upsert": "attr",
+  "skyflow_flowvault.vault.data.InsertRequestRecord": "class ()",
+  "skyflow_flowvault.vault.data.InsertRequestRecord.__init__": "def (self, data: dict, table_name: str = None, tokens: dict = None, upsert: UpsertOptions = None)",
+  "skyflow_flowvault.vault.data.InsertRequestRecord.data": "attr",
+  "skyflow_flowvault.vault.data.InsertRequestRecord.table_name": "attr",
+  "skyflow_flowvault.vault.data.InsertRequestRecord.tokens": "attr",
+  "skyflow_flowvault.vault.data.InsertRequestRecord.upsert": "attr",
+  "skyflow_flowvault.vault.data.InsertResponse": "class ()",
+  "skyflow_flowvault.vault.data.InsertResponse.__init__": "def (self, records = None)",
+  "skyflow_flowvault.vault.data.InsertResponse.records": "attr",
+  "skyflow_flowvault.vault.data.QueryRequest": "class ()",
+  "skyflow_flowvault.vault.data.QueryRequest.__init__": "def (self, query: str)",
+  "skyflow_flowvault.vault.data.QueryRequest.query": "attr",
+  "skyflow_flowvault.vault.data.QueryResponse": "class ()",
+  "skyflow_flowvault.vault.data.QueryResponse.__init__": "def (self, records = None, metadata = None)",
+  "skyflow_flowvault.vault.data.QueryResponse.metadata": "attr",
+  "skyflow_flowvault.vault.data.QueryResponse.records": "attr",
+  "skyflow_flowvault.vault.data.UpdateRequest": "class ()",
+  "skyflow_flowvault.vault.data.UpdateRequest.__init__": "def (self, records: list, table_name: str = None, update_type = None)",
+  "skyflow_flowvault.vault.data.UpdateRequest.records": "attr",
+  "skyflow_flowvault.vault.data.UpdateRequest.table_name": "attr",
+  "skyflow_flowvault.vault.data.UpdateRequest.update_type": "attr",
+  "skyflow_flowvault.vault.data.UpdateResponse": "class ()",
+  "skyflow_flowvault.vault.data.UpdateResponse.__init__": "def (self, records = None, errors = None)",
+  "skyflow_flowvault.vault.data.UpdateResponse.errors": "attr",
+  "skyflow_flowvault.vault.data.UpdateResponse.records": "attr",
+  "skyflow_flowvault.vault.data.UpsertOptions": "class ()",
+  "skyflow_flowvault.vault.data.UpsertOptions.__init__": "def (self, unique_columns: list = None, update_type = None)",
+  "skyflow_flowvault.vault.data.UpsertOptions.unique_columns": "attr",
+  "skyflow_flowvault.vault.data.UpsertOptions.update_type": "attr"
+}

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

Public API contract change (skyvault)

This PR changes skyvault/api-report/skyflow.api.json (the approved public API contract for skyflow). Review the surface change below:

diff --git a/skyvault/api-report/skyflow.api.json b/skyvault/api-report/skyflow.api.json
new file mode 100644
index 0000000..0f28168
--- /dev/null
+++ b/skyvault/api-report/skyflow.api.json
@@ -0,0 +1,360 @@
+{
+  "skyflow.Env": "class (Enum)",
+  "skyflow.Env.DEV": "attr = 'DEV'",
+  "skyflow.Env.PROD": "attr = 'PROD'",
+  "skyflow.Env.SANDBOX": "attr = 'SANDBOX'",
+  "skyflow.Env.STAGE": "attr = 'STAGE'",
+  "skyflow.LogLevel": "class (Enum)",
+  "skyflow.LogLevel.DEBUG": "attr = 1",
+  "skyflow.LogLevel.ERROR": "attr = 4",
+  "skyflow.LogLevel.INFO": "attr = 2",
+  "skyflow.LogLevel.OFF": "attr = 5",
+  "skyflow.LogLevel.WARN": "attr = 3",
+  "skyflow.Skyflow": "attr",
+  "skyflow.client.Skyflow": "attr",
+  "skyflow.error.SkyflowError": "class (Exception)",
+  "skyflow.error.SkyflowError.__init__": "def (self, message, http_code, request_id = None, grpc_code = None, http_status = None, details = None)",
+  "skyflow.error.SkyflowError.details": "attr",
+  "skyflow.error.SkyflowError.grpc_code": "attr",
+  "skyflow.error.SkyflowError.http_code": "attr",
+  "skyflow.error.SkyflowError.http_status": "attr",
+  "skyflow.error.SkyflowError.message": "attr",
+  "skyflow.error.SkyflowError.request_id": "attr",
+  "skyflow.service_account.generate_bearer_token": "def (credentials_file_path, options = None, logger = None)",
+  "skyflow.service_account.generate_bearer_token_from_creds": "def (credentials, options = None, logger = None)",
+  "skyflow.service_account.generate_signed_data_tokens": "def (credentials_file_path, options)",
+  "skyflow.service_account.generate_signed_data_tokens_from_creds": "def (credentials, options)",
+  "skyflow.service_account.is_expired": "def (token, logger = None)",
+  "skyflow.utils.enums.ContentType": "class (Enum)",
+  "skyflow.utils.enums.ContentType.FORMDATA": "attr = 'multipart/form-data'",
+  "skyflow.utils.enums.ContentType.HTML": "attr = 'text/html'",
+  "skyflow.utils.enums.ContentType.JSON": "attr = 'application/json'",
+  "skyflow.utils.enums.ContentType.PLAINTEXT": "attr = 'text/plain'",
+  "skyflow.utils.enums.ContentType.URLENCODED": "attr = 'application/x-www-form-urlencoded'",
+  "skyflow.utils.enums.ContentType.XML": "attr = 'text/xml'",
+  "skyflow.utils.enums.DetectEntities": "class (Enum)",
+  "skyflow.utils.enums.DetectEntities.ACCOUNT_NUMBER": "attr = 'account_number'",
+  "skyflow.utils.enums.DetectEntities.AGE": "attr = 'age'",
+  "skyflow.utils.enums.DetectEntities.ALL": "attr = 'all'",
+  "skyflow.utils.enums.DetectEntities.BANK_ACCOUNT": "attr = 'bank_account'",
+  "skyflow.utils.enums.DetectEntities.BLOOD_TYPE": "attr = 'blood_type'",
+  "skyflow.utils.enums.DetectEntities.CONDITION": "attr = 'condition'",
+  "skyflow.utils.enums.DetectEntities.CORPORATE_ACTION": "attr = 'corporate_action'",
+  "skyflow.utils.enums.DetectEntities.CREDIT_CARD": "attr = 'credit_card'",
+  "skyflow.utils.enums.DetectEntities.CREDIT_CARD_EXPIRATION": "attr = 'credit_card_expiration'",
+  "skyflow.utils.enums.DetectEntities.CVV": "attr = 'cvv'",
+  "skyflow.utils.enums.DetectEntities.DATE": "attr = 'date'",
+  "skyflow.utils.enums.DetectEntities.DATE_INTERVAL": "attr = 'date_interval'",
+  "skyflow.utils.enums.DetectEntities.DAY": "attr = 'day'",
+  "skyflow.utils.enums.DetectEntities.DOB": "attr = 'dob'",
+  "skyflow.utils.enums.DetectEntities.DOSE": "attr = 'dose'",
+  "skyflow.utils.enums.DetectEntities.DRIVER_LICENSE": "attr = 'driver_license'",
+  "skyflow.utils.enums.DetectEntities.DRUG": "attr = 'drug'",
+  "skyflow.utils.enums.DetectEntities.DURATION": "attr = 'duration'",
+  "skyflow.utils.enums.DetectEntities.EFFECT": "attr = 'effect'",
+  "skyflow.utils.enums.DetectEntities.EMAIL_ADDRESS": "attr = 'email_address'",
+  "skyflow.utils.enums.DetectEntities.EVENT": "attr = 'event'",
+  "skyflow.utils.enums.DetectEntities.FILENAME": "attr = 'filename'",
+  "skyflow.utils.enums.DetectEntities.FINANCIAL_METRIC": "attr = 'financial_metric'",
+  "skyflow.utils.enums.DetectEntities.GENDER": "attr = 'gender'",
+  "skyflow.utils.enums.DetectEntities.HEALTHCARE_NUMBER": "attr = 'healthcare_number'",
+  "skyflow.utils.enums.DetectEntities.INJURY": "attr = 'injury'",
+  "skyflow.utils.enums.DetectEntities.IP_ADDRESS": "attr = 'ip_address'",
+  "skyflow.utils.enums.DetectEntities.LANGUAGE": "attr = 'language'",
+  "skyflow.utils.enums.DetectEntities.LOCATION": "attr = 'location'",
+  "skyflow.utils.enums.DetectEntities.LOCATION_ADDRESS": "attr = 'location_address'",
+  "skyflow.utils.enums.DetectEntities.LOCATION_ADDRESS_STREET": "attr = 'location_address_street'",
+  "skyflow.utils.enums.DetectEntities.LOCATION_CITY": "attr = 'location_city'",
+  "skyflow.utils.enums.DetectEntities.LOCATION_COORDINATE": "attr = 'location_coordinate'",
+  "skyflow.utils.enums.DetectEntities.LOCATION_COUNTRY": "attr = 'location_country'",
+  "skyflow.utils.enums.DetectEntities.LOCATION_STATE": "attr = 'location_state'",
+  "skyflow.utils.enums.DetectEntities.LOCATION_ZIP": "attr = 'location_zip'",
+  "skyflow.utils.enums.DetectEntities.MARITAL_STATUS": "attr = 'marital_status'",
+  "skyflow.utils.enums.DetectEntities.MEDICAL_CODE": "attr = 'medical_code'",
+  "skyflow.utils.enums.DetectEntities.MEDICAL_PROCESS": "attr = 'medical_process'",
+  "skyflow.utils.enums.DetectEntities.MONEY": "attr = 'money'",
+  "skyflow.utils.enums.DetectEntities.MONTH": "attr = 'month'",
+  "skyflow.utils.enums.DetectEntities.NAME": "attr = 'name'",
+  "skyflow.utils.enums.DetectEntities.NAME_FAMILY": "attr = 'name_family'",
+  "skyflow.utils.enums.DetectEntities.NAME_GIVEN": "attr = 'name_given'",
+  "skyflow.utils.enums.DetectEntities.NAME_MEDICAL_PROFESSIONAL": "attr = 'name_medical_professional'",
+  "skyflow.utils.enums.DetectEntities.NUMERICAL_PII": "attr = 'numerical_pii'",
+  "skyflow.utils.enums.DetectEntities.OCCUPATION": "attr = 'occupation'",
+  "skyflow.utils.enums.DetectEntities.ORGANIZATION": "attr = 'organization'",
+  "skyflow.utils.enums.DetectEntities.ORGANIZATION_ID": "attr = 'organization_id'",
+  "skyflow.utils.enums.DetectEntities.ORGANIZATION_MEDICAL_FACILITY": "attr = 'organization_medical_facility'",
+  "skyflow.utils.enums.DetectEntities.ORIGIN": "attr = 'origin'",
+  "skyflow.utils.enums.DetectEntities.PASSPORT_NUMBER": "attr = 'passport_number'",
+  "skyflow.utils.enums.DetectEntities.PASSWORD": "attr = 'password'",
+  "skyflow.utils.enums.DetectEntities.PHONE_NUMBER": "attr = 'phone_number'",
+  "skyflow.utils.enums.DetectEntities.PHYSICAL_ATTRIBUTE": "attr = 'physical_attribute'",
+  "skyflow.utils.enums.DetectEntities.POLITICAL_AFFILIATION": "attr = 'political_affiliation'",
+  "skyflow.utils.enums.DetectEntities.PRODUCT": "attr = 'product'",
+  "skyflow.utils.enums.DetectEntities.PROJECT": "attr = 'project'",
+  "skyflow.utils.enums.DetectEntities.RELIGION": "attr = 'religion'",
+  "skyflow.utils.enums.DetectEntities.ROUTING_NUMBER": "attr = 'routing_number'",
+  "skyflow.utils.enums.DetectEntities.SEXUALITY": "attr = 'sexuality'",
+  "skyflow.utils.enums.DetectEntities.SSN": "attr = 'ssn'",
+  "skyflow.utils.enums.DetectEntities.STATISTICS": "attr = 'statistics'",
+  "skyflow.utils.enums.DetectEntities.TIME": "attr = 'time'",
+  "skyflow.utils.enums.DetectEntities.TREND": "attr = 'trend'",
+  "skyflow.utils.enums.DetectEntities.URL": "attr = 'url'",
+  "skyflow.utils.enums.DetectEntities.USERNAME": "attr = 'username'",
+  "skyflow.utils.enums.DetectEntities.VEHICLE_ID": "attr = 'vehicle_id'",
+  "skyflow.utils.enums.DetectEntities.YEAR": "attr = 'year'",
+  "skyflow.utils.enums.DetectEntities.ZODIAC_SIGN": "attr = 'zodiac_sign'",
+  "skyflow.utils.enums.DetectOutputTranscriptions": "class (Enum)",
+  "skyflow.utils.enums.DetectOutputTranscriptions.DIARIZED_TRANSCRIPTION": "attr = 'diarized_transcription'",
+  "skyflow.utils.enums.DetectOutputTranscriptions.MEDICAL_DIARIZED_TRANSCRIPTION": "attr = 'medical_diarized_transcription'",
+  "skyflow.utils.enums.DetectOutputTranscriptions.MEDICAL_TRANSCRIPTION": "attr = 'medical_transcription'",
+  "skyflow.utils.enums.DetectOutputTranscriptions.PLAINTEXT_TRANSCRIPTION": "attr = 'plaintext_transcription'",
+  "skyflow.utils.enums.DetectOutputTranscriptions.TRANSCRIPTION": "attr = 'transcription'",
+  "skyflow.utils.enums.Env": "class (Enum)",
+  "skyflow.utils.enums.Env.DEV": "attr = 'DEV'",
+  "skyflow.utils.enums.Env.PROD": "attr = 'PROD'",
+  "skyflow.utils.enums.Env.SANDBOX": "attr = 'SANDBOX'",
+  "skyflow.utils.enums.Env.STAGE": "attr = 'STAGE'",
+  "skyflow.utils.enums.EnvUrls": "class (Enum)",
+  "skyflow.utils.enums.EnvUrls.DEV": "attr = 'vault.skyflowapis.dev'",
+  "skyflow.utils.enums.EnvUrls.PROD": "attr = 'vault.skyflowapis.com'",
+  "skyflow.utils.enums.EnvUrls.SANDBOX": "attr = 'vault.skyflowapis-preview.com'",
+  "skyflow.utils.enums.EnvUrls.STAGE": "attr = 'vault.skyflowapis.tech'",
+  "skyflow.utils.enums.LogLevel": "class (Enum)",
+  "skyflow.utils.enums.LogLevel.DEBUG": "attr = 1",
+  "skyflow.utils.enums.LogLevel.ERROR": "attr = 4",
+  "skyflow.utils.enums.LogLevel.INFO": "attr = 2",
+  "skyflow.utils.enums.LogLevel.OFF": "attr = 5",
+  "skyflow.utils.enums.LogLevel.WARN": "attr = 3",
+  "skyflow.utils.enums.MaskingMethod": "class (Enum)",
+  "skyflow.utils.enums.MaskingMethod.BLACKBOX": "attr = 'blackbox'",
+  "skyflow.utils.enums.MaskingMethod.BLUR": "attr = 'blur'",
+  "skyflow.utils.enums.RedactionType": "class (Enum)",
+  "skyflow.utils.enums.RedactionType.DEFAULT": "attr = 'DEFAULT'",
+  "skyflow.utils.enums.RedactionType.MASKED": "attr = 'MASKED'",
+  "skyflow.utils.enums.RedactionType.PLAIN_TEXT": "attr = 'PLAIN_TEXT'",
+  "skyflow.utils.enums.RedactionType.REDACTED": "attr = 'REDACTED'",
+  "skyflow.utils.enums.RequestMethod": "class (Enum)",
+  "skyflow.utils.enums.RequestMethod.DELETE": "attr = 'DELETE'",
+  "skyflow.utils.enums.RequestMethod.GET": "attr = 'GET'",
+  "skyflow.utils.enums.RequestMethod.NONE": "attr = 'NONE'",
+  "skyflow.utils.enums.RequestMethod.POST": "attr = 'POST'",
+  "skyflow.utils.enums.RequestMethod.PUT": "attr = 'PUT'",
+  "skyflow.utils.enums.TokenMode": "class (Enum)",
+  "skyflow.utils.enums.TokenMode.DISABLE": "attr = 'DISABLE'",
+  "skyflow.utils.enums.TokenMode.ENABLE": "attr = 'ENABLE'",
+  "skyflow.utils.enums.TokenMode.ENABLE_STRICT": "attr = 'ENABLE_STRICT'",
+  "skyflow.utils.enums.TokenType": "class (Enum)",
+  "skyflow.utils.enums.TokenType.ENTITY_ONLY": "attr = 'entity_only'",
+  "skyflow.utils.enums.TokenType.ENTITY_UNIQUE_COUNTER": "attr = 'entity_unq_counter'",
+  "skyflow.utils.enums.TokenType.VAULT_TOKEN": "attr = 'vault_token'",
+  "skyflow.vault.connection.InvokeConnectionRequest": "class ()",
+  "skyflow.vault.connection.InvokeConnectionRequest.__init__": "def (self, method, body = None, path_params = None, query_params = None, headers = None)",
+  "skyflow.vault.connection.InvokeConnectionRequest.body": "attr",
+  "skyflow.vault.connection.InvokeConnectionRequest.headers": "attr",
+  "skyflow.vault.connection.InvokeConnectionRequest.method": "attr",
+  "skyflow.vault.connection.InvokeConnectionRequest.path_params": "attr",
+  "skyflow.vault.connection.InvokeConnectionRequest.query_params": "attr",
+  "skyflow.vault.connection.InvokeConnectionResponse": "class ()",
+  "skyflow.vault.connection.InvokeConnectionResponse.__init__": "def (self, data = None, metadata = None, errors = None)",
+  "skyflow.vault.connection.InvokeConnectionResponse.data": "attr",
+  "skyflow.vault.connection.InvokeConnectionResponse.errors": "attr",
+  "skyflow.vault.connection.InvokeConnectionResponse.metadata": "attr",
+  "skyflow.vault.controller.Connection": "class ()",
+  "skyflow.vault.controller.Connection.__init__": "def (self, vault_client)",
+  "skyflow.vault.controller.Connection.invoke": "def (self, request: InvokeConnectionRequest)",
+  "skyflow.vault.controller.Detect": "class ()",
+  "skyflow.vault.controller.Detect.__init__": "def (self, vault_client)",
+  "skyflow.vault.controller.Detect.deidentify_file": "def (self, request: DeidentifyFileRequest)",
+  "skyflow.vault.controller.Detect.deidentify_text": "def (self, request: DeidentifyTextRequest) -> DeidentifyTextResponse",
+  "skyflow.vault.controller.Detect.get_detect_run": "def (self, request: GetDetectRunRequest)",
+  "skyflow.vault.controller.Detect.reidentify_text": "def (self, request: ReidentifyTextRequest) -> ReidentifyTextResponse",
+  "skyflow.vault.controller.Vault": "attr",
+  "skyflow.vault.controller.VaultController": "class (BaseVaultController)",
+  "skyflow.vault.controller.VaultController.__init__": "def (self, vault_client)",
+  "skyflow.vault.controller.VaultController.delete": "def (self, request: DeleteRequest) -> DeleteResponse",
+  "skyflow.vault.controller.VaultController.detokenize": "def (self, request: DetokenizeRequest) -> DetokenizeResponse",
+  "skyflow.vault.controller.VaultController.get": "def (self, request: GetRequest) -> GetResponse",
+  "skyflow.vault.controller.VaultController.insert": "def (self, request: InsertRequest) -> InsertResponse",
+  "skyflow.vault.controller.VaultController.query": "def (self, request: QueryRequest) -> QueryResponse",
+  "skyflow.vault.controller.VaultController.tokenize": "def (self, request: TokenizeRequest) -> TokenizeResponse",
+  "skyflow.vault.controller.VaultController.update": "def (self, request: UpdateRequest) -> UpdateResponse",
+  "skyflow.vault.controller.VaultController.upload_file": "def (self, request: FileUploadRequest) -> FileUploadResponse",
+  "skyflow.vault.data.DeleteRequest": "class ()",
+  "skyflow.vault.data.DeleteRequest.__init__": "def (self, table, ids)",
+  "skyflow.vault.data.DeleteRequest.ids": "attr",
+  "skyflow.vault.data.DeleteRequest.table": "attr",
+  "skyflow.vault.data.DeleteResponse": "class ()",
+  "skyflow.vault.data.DeleteResponse.__init__": "def (self, deleted_ids = None, errors = None)",
+  "skyflow.vault.data.DeleteResponse.deleted_ids": "attr",
+  "skyflow.vault.data.DeleteResponse.errors": "attr",
+  "skyflow.vault.data.FileUploadRequest": "class ()",
+  "skyflow.vault.data.FileUploadRequest.__init__": "def (self, table: str, args = (), column_name: Optional[str] = None, skyflow_id: Optional[str] = None, file_path: Optional[str] = None, base64: Optional[str] = None, file_object: Optional[BinaryIO] = None, file_name: Optional[str] = None)",
+  "skyflow.vault.data.FileUploadRequest.base64": "attr",
+  "skyflow.vault.data.FileUploadRequest.column_name": "attr",
+  "skyflow.vault.data.FileUploadRequest.file_name": "attr",
+  "skyflow.vault.data.FileUploadRequest.file_object": "attr",
+  "skyflow.vault.data.FileUploadRequest.file_path": "attr",
+  "skyflow.vault.data.FileUploadRequest.skyflow_id": "attr",
+  "skyflow.vault.data.FileUploadRequest.table": "attr",
+  "skyflow.vault.data.FileUploadResponse": "class ()",
+  "skyflow.vault.data.FileUploadResponse.__init__": "def (self, skyflow_id, errors)",
+  "skyflow.vault.data.FileUploadResponse.errors": "attr",
+  "skyflow.vault.data.FileUploadResponse.skyflow_id": "attr",
+  "skyflow.vault.data.GetRequest": "class ()",
+  "skyflow.vault.data.GetRequest.__init__": "def (self, table, ids = None, redaction_type = None, return_tokens = False, fields = None, offset = None, limit = None, download_url = None, column_name = None, column_values = None)",
+  "skyflow.vault.data.GetRequest.column_name": "attr",
+  "skyflow.vault.data.GetRequest.column_values": "attr",
+  "skyflow.vault.data.GetRequest.download_url": "attr",
+  "skyflow.vault.data.GetRequest.fields": "attr",
+  "skyflow.vault.data.GetRequest.ids": "attr",
+  "skyflow.vault.data.GetRequest.limit": "attr",
+  "skyflow.vault.data.GetRequest.offset": "attr",
+  "skyflow.vault.data.GetRequest.redaction_type": "attr",
+  "skyflow.vault.data.GetRequest.return_tokens": "attr",
+  "skyflow.vault.data.GetRequest.table": "attr",
+  "skyflow.vault.data.GetResponse": "class ()",
+  "skyflow.vault.data.GetResponse.__init__": "def (self, data = None, errors = None)",
+  "skyflow.vault.data.GetResponse.data": "attr",
+  "skyflow.vault.data.GetResponse.errors": "attr",
+  "skyflow.vault.data.InsertRequest": "class (BaseInsertRequest)",
+  "skyflow.vault.data.InsertRequest.__init__": "def (self, table: str, values: list, tokens: list = None, upsert: str = None, homogeneous: bool = False, token_mode: TokenMode = TokenMode.DISABLE, return_tokens: bool = True, continue_on_error: bool = False)",
+  "skyflow.vault.data.InsertRequest.continue_on_error": "attr",
+  "skyflow.vault.data.InsertRequest.homogeneous": "attr",
+  "skyflow.vault.data.InsertRequest.return_tokens": "attr",
+  "skyflow.vault.data.InsertRequest.token_mode": "attr",
+  "skyflow.vault.data.InsertRequest.tokens": "attr",
+  "skyflow.vault.data.InsertResponse": "class (BaseInsertResponse)",
+  "skyflow.vault.data.QueryRequest": "class ()",
+  "skyflow.vault.data.QueryRequest.__init__": "def (self, query)",
+  "skyflow.vault.data.QueryRequest.query": "attr",
+  "skyflow.vault.data.QueryResponse": "class ()",
+  "skyflow.vault.data.QueryResponse.__init__": "def (self)",
+  "skyflow.vault.data.QueryResponse.errors": "attr",
+  "skyflow.vault.data.QueryResponse.fields": "attr",
+  "skyflow.vault.data.UpdateRequest": "class ()",
+  "skyflow.vault.data.UpdateRequest.__init__": "def (self, table, data, tokens = None, return_tokens = False, token_mode = TokenMode.DISABLE)",
+  "skyflow.vault.data.UpdateRequest.data": "attr",
+  "skyflow.vault.data.UpdateRequest.return_tokens": "attr",
+  "skyflow.vault.data.UpdateRequest.table": "attr",
+  "skyflow.vault.data.UpdateRequest.token_mode": "attr",
+  "skyflow.vault.data.UpdateRequest.tokens": "attr",
+  "skyflow.vault.data.UpdateResponse": "class ()",
+  "skyflow.vault.data.UpdateResponse.__init__": "def (self, updated_field = None, errors = None)",
+  "skyflow.vault.data.UpdateResponse.errors": "attr",
+  "skyflow.vault.data.UpdateResponse.updated_field": "attr",
+  "skyflow.vault.data.UploadFileRequest": "class ()",
+  "skyflow.vault.data.UploadFileRequest.__init__": "def (self)",
+  "skyflow.vault.detect.Bleep": "class ()",
+  "skyflow.vault.detect.Bleep.__init__": "def (self, gain: Optional[float] = None, frequency: Optional[float] = None, start_padding: Optional[float] = None, stop_padding: Optional[float] = None)",
+  "skyflow.vault.detect.Bleep.frequency": "attr",
+  "skyflow.vault.detect.Bleep.gain": "attr",
+  "skyflow.vault.detect.Bleep.start_padding": "attr",
+  "skyflow.vault.detect.Bleep.stop_padding": "attr",
+  "skyflow.vault.detect.DateTransformation": "class ()",
+  "skyflow.vault.detect.DateTransformation.__init__": "def (self, max_days: int, min_days: int, entities: List[DetectEntities])",
+  "skyflow.vault.detect.DateTransformation.entities": "attr",
+  "skyflow.vault.detect.DateTransformation.max": "attr",
+  "skyflow.vault.detect.DateTransformation.min": "attr",
+  "skyflow.vault.detect.DeidentifyFileRequest": "class ()",
+  "skyflow.vault.detect.DeidentifyFileRequest.__init__": "def (self, file = None, entities: Optional[List[DetectEntities]] = None, allow_regex_list: Optional[List[str]] = None, restrict_regex_list: Optional[List[str]] = None, token_format: Optional[TokenFormat] = None, transformations: Optional[Transformations] = None, output_processed_image: Optional[bool] = None, output_ocr_text: Optional[bool] = None, masking_method: Optional[MaskingMethod] = None, pixel_density: Optional[Union[int, float]] = None, max_resolution: Optional[Union[int, float]] = None, output_processed_audio: Optional[bool] = None, output_transcription: Optional[DetectOutputTranscriptions] = None, bleep: Optional[Bleep] = None, output_directory: Optional[str] = None, wait_time: Optional[Union[int, float]] = None)",
+  "skyflow.vault.detect.DeidentifyFileRequest.allow_regex_list": "attr: Optional[List[str]]",
+  "skyflow.vault.detect.DeidentifyFileRequest.bleep": "attr: Optional[Bleep]",
+  "skyflow.vault.detect.DeidentifyFileRequest.entities": "attr: Optional[List[DetectEntities]]",
+  "skyflow.vault.detect.DeidentifyFileRequest.file": "attr: FileInput",
+  "skyflow.vault.detect.DeidentifyFileRequest.masking_method": "attr: Optional[MaskingMethod]",
+  "skyflow.vault.detect.DeidentifyFileRequest.max_resolution": "attr: Optional[Union[int, float]]",
+  "skyflow.vault.detect.DeidentifyFileRequest.output_directory": "attr: Optional[str]",
+  "skyflow.vault.detect.DeidentifyFileRequest.output_ocr_text": "attr: Optional[bool]",
+  "skyflow.vault.detect.DeidentifyFileRequest.output_processed_audio": "attr: Optional[bool]",
+  "skyflow.vault.detect.DeidentifyFileRequest.output_processed_image": "attr: Optional[bool]",
+  "skyflow.vault.detect.DeidentifyFileRequest.output_transcription": "attr: Optional[DetectOutputTranscriptions]",
+  "skyflow.vault.detect.DeidentifyFileRequest.pixel_density": "attr: Optional[Union[int, float]]",
+  "skyflow.vault.detect.DeidentifyFileRequest.restrict_regex_list": "attr: Optional[List[str]]",
+  "skyflow.vault.detect.DeidentifyFileRequest.token_format": "attr: Optional[TokenFormat]",
+  "skyflow.vault.detect.DeidentifyFileRequest.transformations": "attr: Optional[Transformations]",
+  "skyflow.vault.detect.DeidentifyFileRequest.wait_time": "attr: Optional[Union[int, float]]",
+  "skyflow.vault.detect.DeidentifyFileResponse": "class ()",
+  "skyflow.vault.detect.DeidentifyFileResponse.__init__": "def (self, file_base64: Optional[str] = None, file: Optional[io.BytesIO] = None, type: Optional[str] = None, extension: Optional[str] = None, word_count: Optional[int] = None, char_count: Optional[int] = None, size_in_kb: Optional[float] = None, duration_in_seconds: Optional[float] = None, page_count: Optional[int] = None, slide_count: Optional[int] = None, entities: Optional[list] = None, run_id: Optional[str] = None, status: Optional[str] = None, errors: Optional[list] = None)",
+  "skyflow.vault.detect.DeidentifyFileResponse.char_count": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.duration_in_seconds": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.entities": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.errors": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.extension": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.file": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.file_base64": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.page_count": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.run_id": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.size_in_kb": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.slide_count": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.status": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.type": "attr",
+  "skyflow.vault.detect.DeidentifyFileResponse.word_count": "attr",
+  "skyflow.vault.detect.DeidentifyTextRequest": "class ()",
+  "skyflow.vault.detect.DeidentifyTextRequest.__init__": "def (self, text: str, entities: Optional[List[DetectEntities]] = None, allow_regex_list: Optional[List[str]] = None, restrict_regex_list: Optional[List[str]] = None, token_format: Optional[TokenFormat] = None, transformations: Optional[Transformations] = None)",
+  "skyflow.vault.detect.DeidentifyTextRequest.allow_regex_list": "attr",

saileshwar-skyflow and others added 2 commits September 2, 2026 00:10
griffe 2.2.0 requires Python >= 3.10, so `pip install griffe==2.2.0` failed on
the 3.9 runner. griffe analyses the SDK source statically, so the analyzer's
Python version is independent of the SDK's own >= 3.9 support and can be 3.10.
Also mark the `griffe` dev extra `python_version >= "3.10"` so a 3.9 dev install
does not fail.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Java's contract test compares only against the committed baseline, never a
published release, so remove the skyvault-only `griffe check -a skyflow==2.1.3`
step and the SKYVAULT_RELEASE bump it needed. The committed baseline is the
contract for both modules. Current skyvault was verified to have no breaking
changes vs released skyflow 2.1.3. Drop the now-unneeded griffe pypi extra.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants