Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
865a4f5
SK-3075: add Detect V2 to flowvault and skyvault SDKs
saileshwar-skyflow Oct 26, 2026
05b2e1d
SK-3075: fix generated version fallback and refresh API contract base…
saileshwar-skyflow Oct 26, 2026
8774fe4
SK-3075: make common detect tests unittest-compatible
saileshwar-skyflow Oct 26, 2026
fad619e
SK-3075: split detect DataSourceType into per-SDK DeidentifySourceTyp…
saileshwar-skyflow Nov 2, 2026
80d0d18
SK-3075: rename the Detect README section heading to "Detect"
saileshwar-skyflow Nov 3, 2026
56a66ec
SK-3076 add v1-deprecation warning (#288)
skyflow-bharti Nov 3, 2026
22d6b35
SK-3075: fix auth, version, and skyvault data-plane after codegen regen
saileshwar-skyflow Nov 3, 2026
1ccf503
SK-3075: refresh API contract baselines for DeidentifySourceType/Reid…
saileshwar-skyflow Nov 3, 2026
d4e8d51
Merge remote-tracking branch 'origin/main' into saileshwar/SK-3075-ad…
saileshwar-skyflow Nov 3, 2026
4c58420
SK-3075: update skyvault unit tests for the new-codegen data-plane an…
saileshwar-skyflow Nov 3, 2026
e13cffd
SK-3075: split detect RedactionLevel into a per-SDK rule (match Java)
saileshwar-skyflow Nov 3, 2026
893a976
SK-3075: fix common detect test for the RedactionLevel split
saileshwar-skyflow Nov 3, 2026
28905b7
SK-3075: make the skyvault sdist self-contained
saileshwar-skyflow Nov 3, 2026
12bdad5
SK-3075: regenerate skyvault files client for multipart file upload
saileshwar-skyflow Nov 4, 2026
deaa724
SK-3075: restore working skyvault generated version.py
saileshwar-skyflow Nov 4, 2026
4bb4129
SK-3075: re-trigger PR CI on the restored generated version.py
saileshwar-skyflow Nov 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/gitleaks-auto-redact.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ permissions:

jobs:
auto-redact:
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
# A fork PR's checkout token can't push back to someone else's fork -
# GitHub blocks that regardless of what token this job holds - so skip
# cleanly rather than fail noisily. This job only ever adds a
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/pr-flowvault.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ on:
jobs:
build:
name: Build
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v2
Expand All @@ -40,7 +40,7 @@ jobs:

test:
name: Unit Tests
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v2
Expand Down Expand Up @@ -85,7 +85,7 @@ jobs:

smoke:
name: Clean-install smoke test
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v2
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/shared-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ on:

jobs:
run-tests:
runs-on: ubuntu-latest
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -132,4 +132,7 @@ dmypy.json
# Misc
test.py
credentials.json
example.py
example.py

# Local-only detect sample runs (credentials + recorded outputs, never committed)
flowvault/samples/detect_api_local/
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ This repository hosts Skyflow's Python SDKs for integrating Skyflow into a Pytho

> **Install one per environment.** Both artifacts install under the same top-level `skyflow` import, so they cannot coexist in the same Python environment.

> Migrating from v1? See skyvault's **[Migration Guide](docs/migrate_to_v2.md)**. V1 is in maintenance mode and will reach End of Life on October 31, 2026.
> :warning: **skyflow-python v1 reached End of Life on October 31, 2026 and is no longer supported.** It will not receive any further security patches, bug fixes, or updates. Please upgrade to the latest skyflow-python v2 ([2.1.3](https://github.com/skyflowapi/skyflow-python/releases/tag/2.1.3)) using the **[Migration Guide](docs/migrate_to_v2.md)**.

## Repository layout

Expand Down
234 changes: 225 additions & 9 deletions common/generated/rest/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,239 @@

# isort: skip_file

from .types import GooglerpcStatus, ProtobufAny, V1GetAuthTokenResponse
from .errors import BadRequestError, NotFoundError, UnauthorizedError
from . import authentication
from .client import AsyncSkyflowAuth, SkyflowAuth
from .environment import SkyflowAuthEnvironment
from .version import __version__
import typing
from importlib import import_module

if typing.TYPE_CHECKING:
from .types import (
AudioV2,
AudioV2Bleep,
AudioV2OutputTranscription,
DeidentifyFileResponseV2,
DeidentifyStringResponseV2,
DeidentifyStringResponseV2DetectedEntity,
DeidentifyStringResponseV2EntityLocation,
Detect,
DetectConfigV2,
DetectConfigV2VaultType,
DetectCustomTypes,
DetectCustomTypesDeidentificationType,
DetectCustomTypesIncludePrefix,
DetectEntity,
DetectEntityDeidentificationType,
DetectEntityEntityType,
DetectEntityIncludePrefix,
DetectGuardrailsResponseV2,
DetectGuardrailsResponseV2Validation,
DetectObjectEntity,
DetectObjectEntityDeidentificationType,
DetectObjectEntityEntityType,
DetectReturnEntities,
DetectRunsResponseV2,
DetectRunsResponseV2OutputType,
DetectRunsResponseV2Status,
DocumentV2,
DocumentV2Pdf,
DocumentV2PdfProcessingMode,
EntityTransformation,
ErrorResponse,
ErrorResponseError,
FileMapping,
FileOutput,
FileOutputProcessedFileExtension,
FileOutputProcessedFileType,
GetAuthTokenResponse,
GetStsTokenResponse,
HttpCode,
ImageV2,
ImageV2MaskingMethod,
Media,
Metrics,
RedactionLevel,
RedactionLevelEntityName,
RedactionLevelRedactionType,
ReidentifyFileResponseV2,
ReidentifyFileResponseV2OutputType,
ReidentifyFileResponseV2Status,
ReidentifyStringResponseV2,
TransformationShiftDates,
)
from .errors import BadRequestError, InternalServerError, NotFoundError, UnauthorizedError
from . import authentication, files_v2, guardrails_v2, strings_v2, token_exchange
from ._default_clients import DefaultAioHttpClient, DefaultAsyncHttpxClient
from .client import AsyncSkyflowAuth, SkyflowAuth
from .environment import SkyflowAuthEnvironment
from .files_v2 import (
DeidentifyFileRequestV2DataFormat,
DeidentifyFileRequestV2DataSource,
ReidentifyFileRequestV2DataFormat,
ReidentifyFileRequestV2DataSource,
)
from .version import __version__
_dynamic_imports: typing.Dict[str, str] = {
"AsyncSkyflowAuth": ".client",
"AudioV2": ".types",
"AudioV2Bleep": ".types",
"AudioV2OutputTranscription": ".types",
"BadRequestError": ".errors",
"DefaultAioHttpClient": "._default_clients",
"DefaultAsyncHttpxClient": "._default_clients",
"DeidentifyFileRequestV2DataFormat": ".files_v2",
"DeidentifyFileRequestV2DataSource": ".files_v2",
"DeidentifyFileResponseV2": ".types",
"DeidentifyStringResponseV2": ".types",
"DeidentifyStringResponseV2DetectedEntity": ".types",
"DeidentifyStringResponseV2EntityLocation": ".types",
"Detect": ".types",
"DetectConfigV2": ".types",
"DetectConfigV2VaultType": ".types",
"DetectCustomTypes": ".types",
"DetectCustomTypesDeidentificationType": ".types",
"DetectCustomTypesIncludePrefix": ".types",
"DetectEntity": ".types",
"DetectEntityDeidentificationType": ".types",
"DetectEntityEntityType": ".types",
"DetectEntityIncludePrefix": ".types",
"DetectGuardrailsResponseV2": ".types",
"DetectGuardrailsResponseV2Validation": ".types",
"DetectObjectEntity": ".types",
"DetectObjectEntityDeidentificationType": ".types",
"DetectObjectEntityEntityType": ".types",
"DetectReturnEntities": ".types",
"DetectRunsResponseV2": ".types",
"DetectRunsResponseV2OutputType": ".types",
"DetectRunsResponseV2Status": ".types",
"DocumentV2": ".types",
"DocumentV2Pdf": ".types",
"DocumentV2PdfProcessingMode": ".types",
"EntityTransformation": ".types",
"ErrorResponse": ".types",
"ErrorResponseError": ".types",
"FileMapping": ".types",
"FileOutput": ".types",
"FileOutputProcessedFileExtension": ".types",
"FileOutputProcessedFileType": ".types",
"GetAuthTokenResponse": ".types",
"GetStsTokenResponse": ".types",
"HttpCode": ".types",
"ImageV2": ".types",
"ImageV2MaskingMethod": ".types",
"InternalServerError": ".errors",
"Media": ".types",
"Metrics": ".types",
"NotFoundError": ".errors",
"RedactionLevel": ".types",
"RedactionLevelEntityName": ".types",
"RedactionLevelRedactionType": ".types",
"ReidentifyFileRequestV2DataFormat": ".files_v2",
"ReidentifyFileRequestV2DataSource": ".files_v2",
"ReidentifyFileResponseV2": ".types",
"ReidentifyFileResponseV2OutputType": ".types",
"ReidentifyFileResponseV2Status": ".types",
"ReidentifyStringResponseV2": ".types",
"SkyflowAuth": ".client",
"SkyflowAuthEnvironment": ".environment",
"TransformationShiftDates": ".types",
"UnauthorizedError": ".errors",
"__version__": ".version",
"authentication": ".authentication",
"files_v2": ".files_v2",
"guardrails_v2": ".guardrails_v2",
"strings_v2": ".strings_v2",
"token_exchange": ".token_exchange",
}


def __getattr__(attr_name: str) -> typing.Any:
module_name = _dynamic_imports.get(attr_name)
if module_name is None:
raise AttributeError(f"No {attr_name} found in _dynamic_imports for module name -> {__name__}")
try:
module = import_module(module_name, __package__)
if module_name == f".{attr_name}":
return module
else:
return getattr(module, attr_name)
except ImportError as e:
raise ImportError(f"Failed to import {attr_name} from {module_name}: {e}") from e
except AttributeError as e:
raise AttributeError(f"Failed to get {attr_name} from {module_name}: {e}") from e


def __dir__():
lazy_attrs = list(_dynamic_imports.keys())
return sorted(lazy_attrs)


__all__ = [
"AsyncSkyflowAuth",
"AudioV2",
"AudioV2Bleep",
"AudioV2OutputTranscription",
"BadRequestError",
"GooglerpcStatus",
"DefaultAioHttpClient",
"DefaultAsyncHttpxClient",
"DeidentifyFileRequestV2DataFormat",
"DeidentifyFileRequestV2DataSource",
"DeidentifyFileResponseV2",
"DeidentifyStringResponseV2",
"DeidentifyStringResponseV2DetectedEntity",
"DeidentifyStringResponseV2EntityLocation",
"Detect",
"DetectConfigV2",
"DetectConfigV2VaultType",
"DetectCustomTypes",
"DetectCustomTypesDeidentificationType",
"DetectCustomTypesIncludePrefix",
"DetectEntity",
"DetectEntityDeidentificationType",
"DetectEntityEntityType",
"DetectEntityIncludePrefix",
"DetectGuardrailsResponseV2",
"DetectGuardrailsResponseV2Validation",
"DetectObjectEntity",
"DetectObjectEntityDeidentificationType",
"DetectObjectEntityEntityType",
"DetectReturnEntities",
"DetectRunsResponseV2",
"DetectRunsResponseV2OutputType",
"DetectRunsResponseV2Status",
"DocumentV2",
"DocumentV2Pdf",
"DocumentV2PdfProcessingMode",
"EntityTransformation",
"ErrorResponse",
"ErrorResponseError",
"FileMapping",
"FileOutput",
"FileOutputProcessedFileExtension",
"FileOutputProcessedFileType",
"GetAuthTokenResponse",
"GetStsTokenResponse",
"HttpCode",
"ImageV2",
"ImageV2MaskingMethod",
"InternalServerError",
"Media",
"Metrics",
"NotFoundError",
"ProtobufAny",
"RedactionLevel",
"RedactionLevelEntityName",
"RedactionLevelRedactionType",
"ReidentifyFileRequestV2DataFormat",
"ReidentifyFileRequestV2DataSource",
"ReidentifyFileResponseV2",
"ReidentifyFileResponseV2OutputType",
"ReidentifyFileResponseV2Status",
"ReidentifyStringResponseV2",
"SkyflowAuth",
"SkyflowAuthEnvironment",
"TransformationShiftDates",
"UnauthorizedError",
"V1GetAuthTokenResponse",
"__version__",
"authentication",
"files_v2",
"guardrails_v2",
"strings_v2",
"token_exchange",
]
32 changes: 32 additions & 0 deletions common/generated/rest/_default_clients.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# This file was auto-generated by Fern from our API Definition.

import typing

import httpx

SDK_DEFAULT_TIMEOUT = 60

try:
import httpx_aiohttp # type: ignore[import-not-found]
except ImportError:

class DefaultAioHttpClient(httpx.AsyncClient): # type: ignore
def __init__(self, **kwargs: typing.Any) -> None:
raise RuntimeError(
"To use the aiohttp client, install the aiohttp extra: pip install skyflow.generated.rest[aiohttp]"
)

else:

class DefaultAioHttpClient(httpx_aiohttp.HttpxAiohttpClient): # type: ignore
def __init__(self, **kwargs: typing.Any) -> None:
kwargs.setdefault("timeout", SDK_DEFAULT_TIMEOUT)
kwargs.setdefault("follow_redirects", True)
super().__init__(**kwargs)


class DefaultAsyncHttpxClient(httpx.AsyncClient):
def __init__(self, **kwargs: typing.Any) -> None:
kwargs.setdefault("timeout", SDK_DEFAULT_TIMEOUT)
kwargs.setdefault("follow_redirects", True)
super().__init__(**kwargs)
Loading
Loading