Skip to content

feat: support participants in describe (sync spec 0.7.7) - #65

Merged
kdr merged 1 commit into
mainfrom
feat/describe-participants
Jun 22, 2026
Merged

feat: support participants in describe (sync spec 0.7.7)#65
kdr merged 1 commit into
mainfrom
feat/describe-participants

Conversation

@kdr

@kdr kdr commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

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

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 dicts 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.


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.

Reviewed by Cursor Bugbot for commit a811769. Bugbot is set up for automated code reviews on this repo. Configure here.

Exposes the new optional `participants` field on `client.describe.create` /
`client.describe.run` (synced from spec 0.7.7 / cloudglue-api-spec#101). When
provided, speaker naming is constrained to that cast — uploaded files (which
carry no connector participant metadata) get roster-corrected speaker labels
instead of open-vocabulary guesses; connector files (e.g. Grain) populate it
automatically.

- cloudglue/client/resources/describe.py: add `participants` param to create()
  and run(); accept dicts or NewDescribeAllOfParticipants and thread into the
  NewDescribe request.
- Regenerated low-level SDK from the spec (+ new NewDescribeAllOfParticipants
  model) + version bump.
@coderabbitai

coderabbitai Bot commented Jun 22, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 275 files, which is 125 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: e343144c-785d-4c72-b7df-398731d552b5

📥 Commits

Reviewing files that changed from the base of the PR and between 7bb9819 and a811769.

📒 Files selected for processing (275)
  • cloudglue/client/resources/describe.py
  • cloudglue/sdk/README.md
  • cloudglue/sdk/__init__.py
  • cloudglue/sdk/api/chat_api.py
  • cloudglue/sdk/api/collections_api.py
  • cloudglue/sdk/api/data_connectors_api.py
  • cloudglue/sdk/api/deep_search_api.py
  • cloudglue/sdk/api/describe_api.py
  • cloudglue/sdk/api/extract_api.py
  • cloudglue/sdk/api/face_detection_api.py
  • cloudglue/sdk/api/face_match_api.py
  • cloudglue/sdk/api/file_segments_api.py
  • cloudglue/sdk/api/files_api.py
  • cloudglue/sdk/api/frames_api.py
  • cloudglue/sdk/api/response_api.py
  • cloudglue/sdk/api/search_api.py
  • cloudglue/sdk/api/segmentations_api.py
  • cloudglue/sdk/api/segments_api.py
  • cloudglue/sdk/api/share_api.py
  • cloudglue/sdk/api/tags_api.py
  • cloudglue/sdk/api/thumbnails_api.py
  • cloudglue/sdk/api/transcribe_api.py
  • cloudglue/sdk/api/webhooks_api.py
  • cloudglue/sdk/api_client.py
  • cloudglue/sdk/configuration.py
  • cloudglue/sdk/exceptions.py
  • cloudglue/sdk/models/__init__.py
  • cloudglue/sdk/models/add_collection_file.py
  • cloudglue/sdk/models/add_you_tube_collection_file.py
  • cloudglue/sdk/models/chapter.py
  • cloudglue/sdk/models/chat_completion_list.py
  • cloudglue/sdk/models/chat_completion_list_data_inner.py
  • cloudglue/sdk/models/chat_completion_list_data_inner_choices_inner.py
  • cloudglue/sdk/models/chat_completion_list_data_inner_usage.py
  • cloudglue/sdk/models/chat_completion_payload.py
  • cloudglue/sdk/models/chat_completion_request.py
  • cloudglue/sdk/models/chat_completion_request_filter.py
  • cloudglue/sdk/models/chat_completion_request_filter_file_inner.py
  • cloudglue/sdk/models/chat_completion_request_filter_metadata_inner.py
  • cloudglue/sdk/models/chat_completion_request_filter_video_info_inner.py
  • cloudglue/sdk/models/chat_completion_response.py
  • cloudglue/sdk/models/chat_completion_response_choices_inner.py
  • cloudglue/sdk/models/chat_completion_response_choices_inner_citations_inner.py
  • cloudglue/sdk/models/chat_completion_response_choices_inner_citations_inner_all_of_end_time.py
  • cloudglue/sdk/models/chat_completion_response_choices_inner_citations_inner_all_of_relevant_sources_inner.py
  • cloudglue/sdk/models/chat_completion_response_choices_inner_citations_inner_all_of_start_time.py
  • cloudglue/sdk/models/chat_completion_response_usage.py
  • cloudglue/sdk/models/chat_message.py
  • cloudglue/sdk/models/collection.py
  • cloudglue/sdk/models/collection_delete.py
  • cloudglue/sdk/models/collection_describe_config.py
  • cloudglue/sdk/models/collection_entities_list.py
  • cloudglue/sdk/models/collection_entities_list_data_inner.py
  • cloudglue/sdk/models/collection_entities_list_data_inner_data.py
  • cloudglue/sdk/models/collection_entities_list_data_inner_data_segment_entities_inner.py
  • cloudglue/sdk/models/collection_extract_config.py
  • cloudglue/sdk/models/collection_face_detection_config.py
  • cloudglue/sdk/models/collection_face_detection_config_frame_extraction_config.py
  • cloudglue/sdk/models/collection_face_detection_config_frame_extraction_config_uniform_config.py
  • cloudglue/sdk/models/collection_face_detection_config_thumbnails_config.py
  • cloudglue/sdk/models/collection_file.py
  • cloudglue/sdk/models/collection_file_delete.py
  • cloudglue/sdk/models/collection_file_list.py
  • cloudglue/sdk/models/collection_file_segmentation.py
  • cloudglue/sdk/models/collection_list.py
  • cloudglue/sdk/models/collection_media_descriptions_list.py
  • cloudglue/sdk/models/collection_media_descriptions_list_data_inner.py
  • cloudglue/sdk/models/collection_media_descriptions_list_data_inner_data.py
  • cloudglue/sdk/models/collection_rich_transcripts_list.py
  • cloudglue/sdk/models/collection_rich_transcripts_list_data_inner.py
  • cloudglue/sdk/models/collection_rich_transcripts_list_data_inner_data.py
  • cloudglue/sdk/models/collection_transcribe_config.py
  • cloudglue/sdk/models/collection_update.py
  • cloudglue/sdk/models/create_deep_search_request.py
  • cloudglue/sdk/models/create_deep_search_request_knowledge_base.py
  • cloudglue/sdk/models/create_file_frame_extraction_request.py
  • cloudglue/sdk/models/create_file_segmentation_request.py
  • cloudglue/sdk/models/create_response_request.py
  • cloudglue/sdk/models/create_response_request_input.py
  • cloudglue/sdk/models/create_shareable_asset_request.py
  • cloudglue/sdk/models/create_video_tag_request.py
  • cloudglue/sdk/models/data_connector.py
  • cloudglue/sdk/models/data_connector_file.py
  • cloudglue/sdk/models/data_connector_file_list.py
  • cloudglue/sdk/models/data_connector_file_metadata.py
  • cloudglue/sdk/models/data_connector_list.py
  • cloudglue/sdk/models/deep_search.py
  • cloudglue/sdk/models/deep_search_error.py
  • cloudglue/sdk/models/deep_search_kb_collections.py
  • cloudglue/sdk/models/deep_search_kb_default.py
  • cloudglue/sdk/models/deep_search_kb_files.py
  • cloudglue/sdk/models/deep_search_list.py
  • cloudglue/sdk/models/deep_search_list_item.py
  • cloudglue/sdk/models/deep_search_result.py
  • cloudglue/sdk/models/deep_search_search_query_plan.py
  • cloudglue/sdk/models/deep_search_usage.py
  • cloudglue/sdk/models/default_segmentation_config.py
  • cloudglue/sdk/models/delete_deep_search_result.py
  • cloudglue/sdk/models/delete_describe200_response.py
  • cloudglue/sdk/models/delete_extract200_response.py
  • cloudglue/sdk/models/delete_face_detection200_response.py
  • cloudglue/sdk/models/delete_face_match200_response.py
  • cloudglue/sdk/models/delete_frame_extraction200_response.py
  • cloudglue/sdk/models/delete_response_result.py
  • cloudglue/sdk/models/delete_segmentation200_response.py
  • cloudglue/sdk/models/delete_segments200_response.py
  • cloudglue/sdk/models/delete_shareable_asset200_response.py
  • cloudglue/sdk/models/delete_tag200_response.py
  • cloudglue/sdk/models/describe.py
  • cloudglue/sdk/models/describe_config.py
  • cloudglue/sdk/models/describe_data.py
  • cloudglue/sdk/models/describe_data_all_of_segment_summary_inner.py
  • cloudglue/sdk/models/describe_describe_config.py
  • cloudglue/sdk/models/describe_list.py
  • cloudglue/sdk/models/describe_output.py
  • cloudglue/sdk/models/describe_output_part.py
  • cloudglue/sdk/models/detected_face.py
  • cloudglue/sdk/models/entity_backed_knowledge_config.py
  • cloudglue/sdk/models/entity_collection_config.py
  • cloudglue/sdk/models/error.py
  • cloudglue/sdk/models/extract.py
  • cloudglue/sdk/models/extract_chapters_inner.py
  • cloudglue/sdk/models/extract_data.py
  • cloudglue/sdk/models/extract_data_segment_entities_inner.py
  • cloudglue/sdk/models/extract_extract_config.py
  • cloudglue/sdk/models/extract_list.py
  • cloudglue/sdk/models/extract_shots_inner.py
  • cloudglue/sdk/models/face_bounding_box.py
  • cloudglue/sdk/models/face_detection.py
  • cloudglue/sdk/models/face_detection_data.py
  • cloudglue/sdk/models/face_detection_list_response.py
  • cloudglue/sdk/models/face_detection_list_response_all_of_data.py
  • cloudglue/sdk/models/face_detection_request.py
  • cloudglue/sdk/models/face_group_result.py
  • cloudglue/sdk/models/face_match.py
  • cloudglue/sdk/models/face_match_data.py
  • cloudglue/sdk/models/face_match_list_response.py
  • cloudglue/sdk/models/face_match_list_response_all_of_data.py
  • cloudglue/sdk/models/face_match_request.py
  • cloudglue/sdk/models/face_match_result.py
  • cloudglue/sdk/models/face_search_result.py
  • cloudglue/sdk/models/file.py
  • cloudglue/sdk/models/file_delete.py
  • cloudglue/sdk/models/file_entities.py
  • cloudglue/sdk/models/file_face_detections.py
  • cloudglue/sdk/models/file_face_detections_faces_inner.py
  • cloudglue/sdk/models/file_face_detections_faces_inner_face_bounding_box.py
  • cloudglue/sdk/models/file_list.py
  • cloudglue/sdk/models/file_media_info.py
  • cloudglue/sdk/models/file_search_result.py
  • cloudglue/sdk/models/file_segment.py
  • cloudglue/sdk/models/file_segment_list_response.py
  • cloudglue/sdk/models/file_segmentation_config.py
  • cloudglue/sdk/models/file_update.py
  • cloudglue/sdk/models/file_video_info.py
  • cloudglue/sdk/models/frame_extraction.py
  • cloudglue/sdk/models/frame_extraction_config.py
  • cloudglue/sdk/models/frame_extraction_data.py
  • cloudglue/sdk/models/frame_extraction_data_frames_inner.py
  • cloudglue/sdk/models/frame_extraction_list.py
  • cloudglue/sdk/models/frame_extraction_list_data_inner.py
  • cloudglue/sdk/models/frame_extraction_thumbnails_config.py
  • cloudglue/sdk/models/frame_extraction_uniform_config.py
  • cloudglue/sdk/models/grain_source_metadata.py
  • cloudglue/sdk/models/grain_source_metadata_ai_action_items_inner.py
  • cloudglue/sdk/models/grain_source_metadata_ai_action_items_inner_assignee.py
  • cloudglue/sdk/models/grain_source_metadata_ai_summary.py
  • cloudglue/sdk/models/grain_source_metadata_calendar_event.py
  • cloudglue/sdk/models/grain_source_metadata_hubspot.py
  • cloudglue/sdk/models/grain_source_metadata_meeting_type.py
  • cloudglue/sdk/models/grain_source_metadata_participants_inner.py
  • cloudglue/sdk/models/grain_source_metadata_teams_inner.py
  • cloudglue/sdk/models/keyframe_config.py
  • cloudglue/sdk/models/knowledge_base_collections.py
  • cloudglue/sdk/models/knowledge_base_default.py
  • cloudglue/sdk/models/knowledge_base_files.py
  • cloudglue/sdk/models/list_video_tags_response.py
  • cloudglue/sdk/models/media_description.py
  • cloudglue/sdk/models/narrative_config.py
  • cloudglue/sdk/models/new_collection.py
  • cloudglue/sdk/models/new_collection_describe_config.py
  • cloudglue/sdk/models/new_collection_extract_config.py
  • cloudglue/sdk/models/new_collection_face_detection_config.py
  • cloudglue/sdk/models/new_collection_transcribe_config.py
  • cloudglue/sdk/models/new_describe.py
  • cloudglue/sdk/models/new_describe_all_of_participants.py
  • cloudglue/sdk/models/new_extract.py
  • cloudglue/sdk/models/new_segments.py
  • cloudglue/sdk/models/new_transcribe.py
  • cloudglue/sdk/models/pagination_response.py
  • cloudglue/sdk/models/response.py
  • cloudglue/sdk/models/response_annotation.py
  • cloudglue/sdk/models/response_error.py
  • cloudglue/sdk/models/response_input_content.py
  • cloudglue/sdk/models/response_input_message.py
  • cloudglue/sdk/models/response_knowledge_base.py
  • cloudglue/sdk/models/response_list.py
  • cloudglue/sdk/models/response_list_item.py
  • cloudglue/sdk/models/response_output_content.py
  • cloudglue/sdk/models/response_output_message.py
  • cloudglue/sdk/models/response_tool_definition.py
  • cloudglue/sdk/models/response_usage.py
  • cloudglue/sdk/models/rich_transcript.py
  • cloudglue/sdk/models/search_filter.py
  • cloudglue/sdk/models/search_filter_criteria.py
  • cloudglue/sdk/models/search_filter_file_inner.py
  • cloudglue/sdk/models/search_filter_metadata_inner.py
  • cloudglue/sdk/models/search_filter_video_info_inner.py
  • cloudglue/sdk/models/search_request.py
  • cloudglue/sdk/models/search_request_source_image.py
  • cloudglue/sdk/models/search_response.py
  • cloudglue/sdk/models/search_response_list.py
  • cloudglue/sdk/models/search_response_list_data_inner.py
  • cloudglue/sdk/models/search_response_results_inner.py
  • cloudglue/sdk/models/search_tag_response.py
  • cloudglue/sdk/models/segment.py
  • cloudglue/sdk/models/segment_describe.py
  • cloudglue/sdk/models/segment_describe_data.py
  • cloudglue/sdk/models/segment_describe_json_data.py
  • cloudglue/sdk/models/segment_describe_list_response.py
  • cloudglue/sdk/models/segment_describe_markdown_data.py
  • cloudglue/sdk/models/segment_describe_output_entry.py
  • cloudglue/sdk/models/segment_describe_speech_entry.py
  • cloudglue/sdk/models/segment_group_result.py
  • cloudglue/sdk/models/segment_search_result.py
  • cloudglue/sdk/models/segment_search_result_keyframes_inner.py
  • cloudglue/sdk/models/segment_search_result_scene_text_inner.py
  • cloudglue/sdk/models/segment_search_result_speech_inner.py
  • cloudglue/sdk/models/segment_search_result_visual_description_inner.py
  • cloudglue/sdk/models/segmentation.py
  • cloudglue/sdk/models/segmentation_config.py
  • cloudglue/sdk/models/segmentation_data.py
  • cloudglue/sdk/models/segmentation_data_segments_inner.py
  • cloudglue/sdk/models/segmentation_list.py
  • cloudglue/sdk/models/segmentation_list_item.py
  • cloudglue/sdk/models/segmentation_manual_config.py
  • cloudglue/sdk/models/segmentation_manual_config_segments_inner.py
  • cloudglue/sdk/models/segmentation_shot_detector_config.py
  • cloudglue/sdk/models/segmentation_uniform_config.py
  • cloudglue/sdk/models/segments.py
  • cloudglue/sdk/models/segments_list.py
  • cloudglue/sdk/models/segments_list_item.py
  • cloudglue/sdk/models/shareable_asset.py
  • cloudglue/sdk/models/shareable_asset_list_response.py
  • cloudglue/sdk/models/shot.py
  • cloudglue/sdk/models/shot_config.py
  • cloudglue/sdk/models/source_image.py
  • cloudglue/sdk/models/source_metadata.py
  • cloudglue/sdk/models/source_metadata_response.py
  • cloudglue/sdk/models/speech_output_part.py
  • cloudglue/sdk/models/sync_data_connector_file_request.py
  • cloudglue/sdk/models/sync_file_from_url_request.py
  • cloudglue/sdk/models/thumbnail.py
  • cloudglue/sdk/models/thumbnail_list.py
  • cloudglue/sdk/models/thumbnails_config.py
  • cloudglue/sdk/models/transcribe.py
  • cloudglue/sdk/models/transcribe_data.py
  • cloudglue/sdk/models/transcribe_data_all_of_segment_summary_inner.py
  • cloudglue/sdk/models/transcribe_list.py
  • cloudglue/sdk/models/transcribe_transcribe_config.py
  • cloudglue/sdk/models/update_describe_request.py
  • cloudglue/sdk/models/update_file_segment_request.py
  • cloudglue/sdk/models/update_shareable_asset_request.py
  • cloudglue/sdk/models/update_video_tag_request.py
  • cloudglue/sdk/models/video_tag.py
  • cloudglue/sdk/models/webhook.py
  • cloudglue/sdk/models/webhook_create_request.py
  • cloudglue/sdk/models/webhook_delete_response.py
  • cloudglue/sdk/models/webhook_events.py
  • cloudglue/sdk/models/webhook_list.py
  • cloudglue/sdk/models/webhook_update_request.py
  • cloudglue/sdk/models/word_timestamp.py
  • cloudglue/sdk/rest.py
  • pyproject.toml
  • spec

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/describe-participants

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@kdr
kdr requested a review from amyxst June 22, 2026 22:26
@kdr
kdr merged commit 7b92968 into main Jun 22, 2026
2 checks passed
@kdr
kdr deleted the feat/describe-participants branch June 22, 2026 22:34
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