Skip to content

Tags: cloudglue/cloudglue-python

Tags

v0.7.22

Toggle v0.7.22's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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 -->

v0.7.21

Toggle v0.7.21's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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.

v0.7.20

Toggle v0.7.20's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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 -->

v0.7.19

Toggle v0.7.19's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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 -->

v0.7.18

Toggle v0.7.18's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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 -->

v0.7.17

Toggle v0.7.17's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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 -->

v0.7.16

Toggle v0.7.16's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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 -->

v0.7.15

Toggle v0.7.15's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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 -->

v0.7.14

Toggle v0.7.14's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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 -->

v0.7.13

Toggle v0.7.13's commit message

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
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 -->