Tags: cloudglue/cloudglue-python
Tags
feat: metadata imports API (sync spec v0.7.17) (#75) ## Summary Syncs the SDK to spec **v0.7.17** (cloudglue/cloudglue-api-spec#110) and bumps the package to **0.7.22**. One feature: **bulk metadata imports** — saved definitions that list a data connector's source files and import each one's source metadata into a metadata collection (no media download, no credits), with run history, modes, caps, and cancellation. ### Generated (cloudglue/sdk) - New `MetadataImportsApi` with the six operations over `/collections/{collection_id}/imports` (create/list/get/delete definitions, trigger run, cancel run) - New models: `MetadataImport`, `MetadataImportDetail` (definition + one page of run history), `MetadataImportList`, `MetadataImportDelete`, `MetadataImportRun`, `MetadataImportRunProgress`, `MetadataImportFilterSet`, `CreateMetadataImportRequest`, `CreateMetadataImportRunRequest` - Spec submodule → v0.7.17 ### Wrapper (cloudglue/client) - New `client.metadata_imports` resource: `create` (full definition surface — `filters`, `default_mode`, `delete_missing`, `rate_limit`, `start`, `max_files`, `include_thumbnails`), `list`, `get` (pages run history via `limit`/`offset`), `delete`, `run` (per-run overrides, 409 when a run is already active in the collection), `cancel_run` - Filter dicts use the wire key `from` (aliased to `var_from` on the pydantic model); docstrings carry the spec's semantics: append vs refresh, delete-missing sweep scope, capped runs never sweep, per-connector rate-limit clamping - Top-level re-exports: `MetadataImport`, `MetadataImportDetail`, `MetadataImportList`, `MetadataImportRun`, `MetadataImportRunProgress`, `MetadataImportFilterSet` Entirely additive — no existing wrapper methods or models change. ## Test plan - [x] Package imports clean; `CreateMetadataImportRequest` round-trips the `from` filter alias; nested `latest_run.progress` parses; `client.metadata_imports` wired - [x] Live battery against **production** — **11/11** (evidence in `~/Downloads/cloudglue-v0.7.17-sdk-test-results.md`, matching JS battery 11/11): throwaway metadata collection + google-drive import with `max_files=3`; create(`start=False`) saves definition only; list/get; run trigger; concurrent trigger 409; capped run completes with `listed=3 queued=3 indexed=3 failed=0`; append rerun skips all 3; `get(limit=1)` pages run history; cancel lands as `cancelled`; delete then get 404; collection deleted at cleanup — account left clean <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Additive client/SDK change with low regression risk, but refresh runs with delete_missing can remove collection files previously brought in by that import—callers should understand that behavior. > > **Overview** > Adds **bulk metadata imports** for metadata collections: saved jobs that page a data connector and import source metadata into the collection (no media download), with OpenAPI **0.7.17** codegen plus a `client.metadata_imports` wrapper. > > The high-level client exposes `create`, `list`, `get`, `delete`, `run`, and `cancel_run`, including connector filters, append/refresh modes, optional `delete_missing` on refresh, rate limits, `max_files`, and `include_thumbnails`. `run` surfaces **409** when another import run is already active on the same collection. Related types are re-exported from the top-level `cloudglue` package. > > Existing APIs and wrapper resources are unchanged; this is additive SDK surface. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 7ff523a. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
feat: player link previews, entities collection search, and deep sear… …ch auto scope (sync spec v0.7.16) (#74) ## Summary Syncs the SDK to spec **v0.7.16** (cloudglue/cloudglue-api-spec#109) and bumps the package to **0.7.21**. Two themes: 1. **Entities and metadata collections become first-class search sources** — direct search, deep-search KBs, and Response API KBs all accept them, deep search gains an **auto scope** mode (response `scope` is now nullable — None = the planner chose scopes per search plan), and `CollectionFile` gains `searchable_status`. 2. **Shares gain the `player` link-preview level and instant-clip windows** — `link_preview` widens to `none | full | player` ('player' lets a private share play inline when unfurled by the Cloudglue Slack app), and `GET /share/{id}` accepts `clip_start`/`clip_end` so the returned `stream_url` plays only that window. ### Generated (cloudglue/sdk) - `CollectionFile.searchable_status` (`pending`/`processing`/`completed`/`failed`) - `DeepSearch.scope` / `DeepSearchListItem.scope` nullable (None = auto) - Broadened collection-type acceptance + `doc_lexical` over entity docs (doc-level) - `link_preview` enum widened to `'none' | 'full' | 'player'` on `ShareableAsset`, `CreateShareableAssetRequest`, `UpdateShareableAssetRequest` (validators + descriptions) - `ShareApi.get_shareable_asset` gains `clip_start` / `clip_end` query params ### Wrapper (cloudglue/client) - `Share.get` now plumbs `clip_start` / `clip_end` through to the generated client (new query params don't flow automatically) - `Share.create` / `Share.update` docstrings document the `'player'` level, its anyone-in-the-channel playback caveat, and downgrade revocation - Deep search: docs only — `deep_search.create` already defaulted `scope=None` so auto mode works as-is; docstrings document auto vs explicit scope semantics (metadata + file-level entities → `file`, segment-level entities → `segment`) and the accepted collection types ## Test plan - [x] Package imports clean; `player` accepted by all three shareable-asset models, bogus enum values still rejected; `Share.get` signature carries the clip params - [x] Live battery against **production**, entities half — **7/7 on 2026-08-04, re-run 7/7 on 2026-08-12 at branch tip `69c9c44`** (evidence in `~/Downloads/cloudglue-v0.7.16-sdk-test-results.md`): `searchable_status` enum values on entities + media-descriptions listings; segment search over an entities collection returns results; file-scope over a segment-level entities collection 400s; auto deep search over a mixed KB completes with `scope=None` and results mixing segment+file types; explicit scope still completes and is echoed; `nimbus-002-preview` accepts an entities-collection KB while `nimbus-001` 400s. Created response deleted at cleanup. - [x] Live battery against **production**, share half — **9/9** (evidence in `~/Downloads/cloudglue-v0.7.16-share-player-clip-test-results.md`): private share created with `link_preview='player'` and round-tripped through get/list response validation; update lifecycle `player → full → player` echoed; clip window `[2, 8]` verified via the Mux playback-token JWT claims (`asset_start_time=2`, `asset_end_time=8`) while the full-asset read carries no clip claims; `clip_start` without `clip_end` and `clip_end <= clip_start` both 400; created share deleted at cleanup. ## Release note Old SDK versions (≤ 0.7.20) reject `'player'` in response validation, so any customer who opts a share into "Playable in Slack" breaks their own `get`/`list` calls until they upgrade — release this promptly now that the backend accepts `'player'` in production.
feat: Query API for SQL over extracted entities (sync spec v0.7.15) (#73 ) ## Summary Syncs the SDK to spec **v0.7.15** (cloudglue/cloudglue-api-spec#107) and bumps the package to **0.7.20**. The headline is the new **Query API** — read-only SQL (or natural language) over the structured data extracted from collections, against the `files`/`entities`/`segment_entities` virtual tables — plus query-call output items on the Response API and an ephemeral `thumbnail_url` on data-connector file listings. ### Generated (cloudglue/sdk) - New `QueryApi`: `run_query`, `list_queries`, `get_query_schema`, `get_query`, `cancel_query_export` + all Query models - `Response.output` items: `oneOf` message | function_call | query_call - `DataConnectorFile.thumbnail_url` (nullable, ephemeral signed provider preview) ### Wrapper (cloudglue/client) - New `cg.query` resource: `run` (sql or natural-language), `get_schema(collections)` (joins IDs into the comma-separated param), `list`, `get`, `cancel`, and `wait_for_ready` for background exports — registered in `client/main.py` and `resources/__init__` ## Test plan - [x] Package imports clean; `cg.query` wired with all six methods - [x] Live battery against **staging** — **12/12** (evidence in `~/Downloads/cloudglue-v0.7.15-sdk-test-results.md`): schema introspection lists the three virtual tables + per-collection fields; SQL `SELECT COUNT(*)` returns inline rows with scan-stat usage; natural-language query returns the compiled SQL; `dry_run` validates without rows; non-SELECT and face-analysis-collection requests 400; list omits rows while get replays them; background CSV export cancels cleanly; gong/recall listings parse with the optional `thumbnail_url` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Mostly additive OpenAPI regeneration plus a thin client wrapper; no auth or breaking changes to existing resources. > > **Overview** > Regenerates the Python SDK for **OpenAPI 0.7.15** and exposes structured querying on the high-level `Cloudglue` client via **`cg.query`**. > > **Query API** adds read-only SQL (or natural-language questions compiled to SQL) over collection extraction virtual tables (`files`, `entities`, `segment_entities`), with schema introspection, stored runs, list/get, background exports (cancel + poll), and dry-run. The hand-written **`Query`** resource mirrors the generated `QueryApi` with `run`, `get_schema`, `list`, `get`, `cancel`, and `wait_for_ready`, wired through `client/main.py`. > > Smaller spec-driven updates: **`Response.output`** can include **`query_call`** (and related models) alongside messages and function calls; **`DataConnectorFile`** gains optional ephemeral **`thumbnail_url`**; **`sync_file_source_metadata`** docs note iconik poster keyframe thumbnail backfill when missing. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 464c047. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
feat: enable_metadata_mode for entity extraction (sync spec v0.7.12) (#… …72) ## Summary Syncs the SDK to spec **v0.7.12** (cloudglue/cloudglue-api-spec#106) and bumps the package to **0.7.19**. Adds `enable_metadata_mode` to extraction configs: entities are extracted from the file's **metadata document** (filename, file details, user metadata, connector source metadata) instead of the media content — file-level entities only, flat 1 credit per file, works on metadata-only files without ingesting media, mutually exclusive with `enable_transcript_mode`. ### Generated (cloudglue/sdk) - `NewExtract`, `ExtractExtractConfig`, and both entities-collection `extract_config` variants gain the flag ### Wrapper (cloudglue/client) - `extract.create()` / `extract.run()` construct `NewExtract` with explicit kwargs, so the flag needed plumbing — added `enable_metadata_mode` **and** `enable_transcript_mode` (the latter existed in the API but was never exposed by the wrapper; the two are documented together as mutually exclusive) - `collections.create()` passes `extract_config` as a dict (flows automatically); docstring now documents the new mode ## Test plan - [x] Package imports clean; `create`/`run` signature smoke-tests; `NewExtract` payload carries the flag - [x] Live battery — **6/6** (evidence in `~/Downloads/cloudglue-v0.7.12-sdk-test-results.md`): metadata-mode extract via `extract.run` on a **metadata-only** grain file completes with entities mirroring its connector source metadata (`{"title": "Amy / KDR", "platform": "grain", "participants": [...]}`, `segment_entities` empty); `enable_metadata_mode`+`enable_transcript_mode` returns 400; an entities collection with `extract_config.enable_metadata_mode` extracts the same from a connector URL. Job + collection deleted at cleanup. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Additive API surface and client kwargs with no changes to default extraction behavior; main risk is callers enabling conflicting modes, which the API rejects with 400. > > **Overview** > Syncs the generated SDK to **OpenAPI v0.7.12** and bumps the package to **0.7.19**, adding **`enable_metadata_mode`** on entity extraction so jobs can pull structured entities from a file’s metadata document (filename, file details, user metadata, connector source metadata) instead of media—file-level only, flat 1 credit per file, suitable for metadata-only files without ingesting video. > > The high-level **`extract.create()`** and **`extract.run()`** wrappers now forward **`enable_metadata_mode`** and also expose **`enable_transcript_mode`**, which existed in the API but was not previously passed through; the two modes are documented as mutually exclusive. **`collections.create()`** documents **`extract_config.enable_metadata_mode`**; the dict-based `extract_config` path picks up the new field via the regenerated models. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 53b04a4. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
feat: iconik connector, metadata collections, and source metadata sea… …rch (sync spec v0.7.11) (#71) ## Summary Syncs the SDK to spec **v0.7.11** (cloudglue/cloudglue-api-spec#105) and bumps the package to **0.7.18**. > **Branch note:** the local working checkout this started from was based 9 commits behind main (it predated the v0.7.9/v0.7.10 syncs), so this branch was rebuilt from `origin/main` with the regenerated `cloudglue/sdk` tree carried over intact. The version is 0.7.18 (next after the released 0.7.17). ### Generated (cloudglue/sdk) - `IconikSourceMetadata`; the `SourceMetadata` oneOf and connector/source enums now cover **iconik** - New `sync_file_source_metadata` endpoint (`POST /files/{file_id}/sync`) - `include_metadata` on describe/transcribe get+list, collection media-description/rich-transcript listings, and segmentation describes; `Describe`/`Transcribe` responses gain a `file` object - `SearchFilter.source_metadata` + the `doc_lexical` search modality - `metadata` collection type ### Wrapper (cloudglue/client + package) - `files.sync_source_metadata(file_id)` — new endpoint, unreachable without a wrapper method - `include_metadata` plumbed through describe/transcribe/segmentations/collections methods (9 endpoints — these pass kwargs explicitly, so new params need plumbing) - `Search.create_filter` gains `source_metadata_filters` (builds `SearchFilterCriteria` entries; documented JSON-path examples per connector) - `collection_type` docstrings cover `'metadata'` (and fix a stale filter-enum doc) - `IconikSourceMetadata` re-exported at the package top level - Data-connector docstrings: per-connector `from`/`to` + `title_search` matrices and sync/lookup support updated for iconik ## Test plan - [x] Package imports clean; signature smoke-tests for all 9 `include_metadata` methods + `sync_source_metadata`; `create_filter(source_metadata_filters=…)` serializes to the correct wire shape - [x] Live battery — **14/14** (full evidence in `~/Downloads/cloudglue-v0.7.11-sdk-test-results.md`): iconik listing/per-file metadata/`isinstance(IconikSourceMetadata)` lookup/native title_search; metadata collection created + grain & iconik **URLs** indexed without processing (then deleted); `sync_source_metadata` refreshes both providers with typed variants; `doc_lexical` search with a `source_metadata.title` filter finds exactly the grain file and a negative filter excludes it; `include_metadata` toggles file metadata on describe get/list <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Large generated SDK surface plus new search/indexing and connector sync paths; behavior is additive and documented, but touches search filters and file metadata refresh used across integrations. > > **Overview** > Syncs the Python client to **OpenAPI v0.7.11**, adding **Iconik** as a data connector and expanding metadata-only indexing and search over connector `source_metadata`. > > **Iconik & connectors:** New `IconikSourceMetadata` is exported at the package root. Data-connector docs and listing filters now treat Iconik like other OAuth sources (`from`/`to`, full-text `title_search`, `iconik://asset/<id>` URIs, populated `source_metadata` on sync/lookup). > > **Metadata collections & refresh:** Collection docs describe a new **`metadata`** type that indexes connector/user metadata without media processing. **`files.sync_source_metadata(file_id)`** (`POST /files/{file_id}/sync`) re-fetches live connector metadata and re-indexes metadata collections when applicable. > > **Search & responses:** `Search.create_filter` accepts **`source_metadata_filters`** (JSON paths on connector metadata, file scope). Describe/transcribe/collection transcript & media-description APIs gain optional **`include_metadata`** on get/list (and segmentation describe lists), wired through the high-level client where kwargs are explicit. > > The bulk of the diff is regenerated **`cloudglue/sdk`** (models, query params, `SearchFilter.source_metadata`, version bump 0.7.10 → 0.7.11). > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 6c1617a. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
feat: link_preview control for shareable assets (sync spec v0.7.10) (#70 ) ## Summary Syncs the SDK to spec **v0.7.10** (cloudglue/cloudglue-api-spec#104) and bumps the package to **0.7.17**. Adds `link_preview`, which lets callers opt private shares into rich Open Graph metadata for unfurl bots (Slack, iMessage, etc.). Values are `'none'` (API default — today's no-preview behavior) and `'full'` (title, description, thumbnail tags). Public shares always emit full metadata regardless. ### Generated (cloudglue/sdk) - `ShareableAsset` gains a **required** `link_preview` with enum validation - `CreateShareableAssetRequest` / `UpdateShareableAssetRequest` gain the optional field ### Wrapper (cloudglue/client) - `Share.create()` and `Share.update()` construct request models explicitly, so `link_preview` would otherwise be unreachable — added the kwarg to both with docstrings covering the private-vs-public semantics - Omitting it passes `None`, which `to_dict(exclude_none=True)` drops from the payload, so the server default applies (same pattern as `visibility`) ## Test plan - [x] Package imports clean; request-model smoke checks (omitted → field absent from payload; `'full'` passes through; invalid value raises a pydantic validation error) - [x] Live API round-trip (creates private shares, deletes everything it creates — verified zero residue): create without the field defaults to `'none'`; create with `'full'` is honored; update toggles to `'full'` and back, persisting on read-back; list responses carry the field; an invalid enum value is rejected client-side — **7/7 checks passed** <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Additive API surface and wrapper parameters with defaults; no auth or breaking changes beyond a new required field on `ShareableAsset` responses from the spec. > > **Overview** > Syncs the generated SDK to **OpenAPI 0.7.10** and bumps the published package to **0.7.17**. > > Adds **`link_preview`** (`'none'` | `'full'`) for shareable assets so callers can control whether **private** share URLs emit Open Graph metadata for unfurl bots. `'none'` keeps the prior no-preview behavior (API default); `'full'` exposes title, description, and thumbnail tags. **Public** shares always emit full preview metadata regardless of this setting. > > The high-level **`Share.create()`** and **`Share.update()`** wrappers now accept **`link_preview`** and forward it into the generated request models (omitting it leaves the field out of the payload so the server default applies). Generated models **`CreateShareableAssetRequest`**, **`UpdateShareableAssetRequest`**, and **`ShareableAsset`** include the new field with enum validation. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit e329ae4. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
feat: data connector source metadata for all providers (sync spec v0.… …7.9) (#68) ## Summary Syncs the SDK to spec **v0.7.9** (cloudglue/cloudglue-api-spec#103) and bumps the package to **0.7.16**. ### Generated (cloudglue/sdk) - New `ZoomSourceMetadata`, `RecallSourceMetadata`, `GoogleDriveSourceMetadata`, `DropboxSourceMetadata`, and `GongSourceMetadata` models; `SourceMetadata` is now a oneOf discriminated on `source_type` across all six connectors, with required fields loosened to `source_type` + the provider's primary id (everything else nullable/optional) - Updated data-connector endpoint docs: per-connector `from`/`to` + `title_search` support, filtered-pagination contract, 501 now only for s3/gcs, 502 on unvalidatable upstream responses ### Wrapper (cloudglue/client + package) - Top-level `cloudglue` package re-exports the `SourceMetadata` family (all six variants) and `SourceMetadataResponse` for isinstance checks on `source_metadata.actual_instance` - `DataConnectors` docstrings refreshed: accurate per-connector filter support matrix on `list_files`, per-file provider metadata note, filtered-pagination guidance (keep paging until `next_page_token` is None), source-metadata support for all six connectors (previously documented as Grain-only) ## Test plan - [x] Package imports clean; minimal `{source_type, <provider id>}` objects parse for the new variants (loosened-required contract) - [x] Live API battery (read-only, all six connectors connected): `list_files` returns per-file provider metadata with matching `source_type`; `get_source_metadata` 200s and `actual_instance` parses to the matching model class for grain/zoom/recall/google-drive/dropbox/gong; Dropbox folder drill via `path`; `title_search` verified on google-drive (native, folders exempt) and gong (matched while listing) — 20/20 checks passed <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Mostly OpenAPI-regenerated models and docstring updates; additive exports and looser Grain field requirements are backward-compatible for typical clients. > > **Overview** > Bumps the generated client to OpenAPI **0.7.9** and surfaces **provider source metadata** for Grain, Zoom, Recall, Google Drive, Dropbox, and Gong end-to-end in the Python package. > > **Models & exports:** Adds typed `*SourceMetadata` models (plus nested types) and expands `SourceMetadata` to a six-way `source_type` discriminated union. `GrainSourceMetadata` now only requires `source_type` + `grain_recording_id` (other fields nullable). The top-level `cloudglue` package re-exports `SourceMetadata`, `SourceMetadataResponse`, and all six variant classes. > > **Data connectors API surface:** Generated and hand-written docs now describe `get_source_metadata` for all six connectors (501 only for S3/GCS, 502 on bad upstream validation), per-file `metadata` on `list_files`, broader shared `from`/`to` and `title_search` support per connector, filter-bound `page_token`s, and filtered pagination (short/empty pages while `has_more` is true). `sync_file` docs note `source_metadata` is populated for those six providers. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 8c946bb. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
feat: image file support (sync spec v0.7.8) (#66) ## Summary Syncs the SDK to API spec **v0.7.8**, which adds **image** as a supported media type. The change is additive — no new endpoints or parameters. - Regenerated the low-level SDK from spec v0.7.8: - `media_type` enum gains `image`; `media_info` width/height now cover images - `POST /files` accepts video, audio, **or image** uploads - `describe` / `extract` `url` accept public direct image URLs - Updated high-level wrapper docstrings to reflect image support: `files.upload`, `files.sync_from_url`, `describe.create/run`, `extract.create/run`. Images are processed at the **file level only** (no segmentation). ## Testing Verified end-to-end against a live account: image upload (returns `media_type=image` with width/height), and describe/extract over both an uploaded `cloudglue://` URI and a public direct image URL; `sync_from_url` also materializes a direct image URL. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Additive spec sync and docstring updates with no runtime logic changes in the high-level client beyond generated SDK types. > > **Overview** > Syncs the Python client to **OpenAPI v0.7.8** and bumps the package to **0.7.15**, adding **image** as a first-class media type alongside video and audio. > > The regenerated SDK reflects **image** on `File.media_type`, widens `FileMediaInfo` for image dimensions, and updates upload/describe/extract request docs to allow image uploads, `cloudglue://` image URIs, and public JPEG/PNG/WebP URLs. High-level wrappers (`files.upload`, `files.sync_from_url`, `describe.create`/`run`, `extract.create`/`run`) now document that **images are handled at file level only**—segmentation and segment-thumbnail options do not apply. > > No new endpoints or client parameters; behavior is additive documentation and generated types aligned with the backend spec. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit d94b134. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
feat: support participants in describe (sync spec 0.7.7) (#65) Exposes the new optional **`participants`** field on `client.describe.create` / `client.describe.run`, synced from spec **0.7.7** (cloudglue/cloudglue-api-spec#101). Bumps version `0.7.13 → 0.7.14` and regenerates the low-level SDK (adds the `NewDescribeAllOfParticipants` model). ## Why Describe normally guesses speaker names open-vocabulary. When `participants` is supplied, naming is **closed-set**: transcript speaker labels only use one of those names (or a generic `Speaker N`), never an invented name. Intended for **uploaded files**, which (unlike data-connector files such as Grain) carry no participant metadata; connector files get it populated automatically. ## API ```python client.describe.create( url="cloudglue://files/<id>", enable_speech=True, participants=[ {"name": "Alice Smith", "scope": "internal"}, {"name": "Bob Jones", "scope": "external"}, # scope free-form, optional ], ) ``` ## Change - `cloudglue/client/resources/describe.py` — add `participants` to `create()` and `run()`; accept `dict`s or `NewDescribeAllOfParticipants` and thread into the `NewDescribe` request. - Regenerated `cloudglue/sdk/` from the spec (+ new `new_describe_all_of_participants.py`) + version bump. ## Verified against prod (`.venv/bin/python test_py.py`, raw upload) `client.describe.create(..., participants=[{"name":"Michael Bressler","scope":"external"}])`: - Response echoes `describe_config.participants: [{"name": "Michael Bressler", "scope": "external"}]`. - Speakers: `Michael Bressler` resolves; the other (un-rostered) guest and anchors fall back to `Speaker 1/2/4` — nothing invented. - Cache-hit the equivalent JS-SDK job (`3674389f…`), confirming both SDKs send the same canonicalized payload. > Note: depends on cloudglue-api-spec#101 (the `spec` submodule points at that commit) — merge that first. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Backward-compatible optional API field plus generated SDK sync; behavior change only when callers pass `participants`. > > **Overview** > Adds optional **`participants`** to **`client.describe.create`** and **`client.describe.run`**, synced from OpenAPI **0.7.7**. Callers can pass a list of `{"name", "scope"}` dicts (or SDK models); the client normalizes them and sends them on **`NewDescribe`** so describe jobs can **restrict diarized speaker labels** to those names or generic `Speaker N`, instead of invented names—mainly for **uploaded files** without connector metadata. > > The low-level **`cloudglue/sdk`** is regenerated (new **`NewDescribeAllOfParticipants`**, **`participants`** on **`NewDescribe`** / **`DescribeDescribeConfig`**), API doc version strings move **0.7.6 → 0.7.7**, and the package version is bumped **0.7.13 → 0.7.14**. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit a811769. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
Support shorter shots (spec v0.7.6) (#64) ## Summary - Bumps the API spec submodule to v0.7.6 ([cloudglue-api-spec](https://github.com/cloudglue/cloudglue-api-spec) commit `7a89fb0`, "Support shorter shots") and regenerates the low-level SDK. Shot-based segmentation now accepts fractional durations with a 0.6s floor (previously integer-only, 1s minimum), and the API default minimum shot length is now 0.6s. - Client wrapper: `Segments.create_shot_config` duration params widened from `int` to `Union[int, float]`, and `min_duration_seconds` default changed from `1` to `0.6` to track the new API default (note: behavioral change for callers relying on the old implicit 1s minimum). `Segmentations.create_shot_detector_config` already accepted floats — docstring range updated to 0.6–600. - SDK version bumped to 0.7.13. ## Test plan - [x] `Segments.create_shot_config()` default builds with `min_duration_seconds=0.6` - [x] Explicit floats validate: `create_shot_config(min_duration_seconds=0.75, max_duration_seconds=10.5)` and `create_shot_detector_config(detector="adaptive", min_seconds=0.6)` - [x] Values below the floor are rejected: `min_duration_seconds=0.5` raises `ValidationError` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes default minimum shot length and request validation for segmentation jobs; callers using implicit defaults may get shorter segments, and values between 0.6–1s behave differently than before. > > **Overview** > Aligns the Python client with **OpenAPI 0.7.6** so shot-based segmentation can use **sub-second minimum lengths** (floor **0.6s**, was **1s**) and **fractional** min/max durations. > > The high-level **Segments** helper updates **`create_shot_config`**: duration args are **`Union[int, float]`**, default **`min_duration_seconds` is 0.6** (was 1), and docs reflect **0.6–600**. **`Segmentations.create_shot_detector_config`** only updates the **`min_seconds`** doc range to **0.6–600**; it already accepted floats. > > Regenerated **`cloudglue.sdk`** models (**`ShotConfig`**, **`SegmentationShotDetectorConfig`**) match the new validation and defaults. Package version is **0.7.13**; most other SDK files only bump the embedded API version string. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit ba4815f. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
PreviousNext