Skip to content

feat: link_preview control for shareable assets (sync spec v0.7.10) - #70

Merged
kdr merged 1 commit into
mainfrom
kdr-link-preview
Jul 19, 2026
Merged

feat: link_preview control for shareable assets (sync spec v0.7.10)#70
kdr merged 1 commit into
mainfrom
kdr-link-preview

Conversation

@kdr

@kdr kdr commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

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

  • Package imports clean; request-model smoke checks (omitted → field absent from payload; 'full' passes through; invalid value raises a pydantic validation error)
  • 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

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.

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

Regenerated from spec v0.7.10 (cloudglue/cloudglue-api-spec#104) and
bumped to 0.7.17.

Generated:
- ShareableAsset gains a required link_preview ('none' | 'full') with
  enum validation; CreateShareableAssetRequest and
  UpdateShareableAssetRequest gain the optional field

Wrapper:
- Plumb link_preview through Share.create() and Share.update() (both
  build request models explicitly, so the field is otherwise
  unreachable) and document the private-share semantics: 'none' emits no
  Open Graph metadata, 'full' emits title, description, and thumbnail;
  public shares always emit full metadata

Verified against the live API: create defaults to 'none', create with
'full' is honored, update toggles and persists on read-back, list
responses carry the field, and invalid values are rejected by pydantic.
@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 288 files, which is 188 over the limit of 100.

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: b4f7b281-7d47-472d-8ca2-5fcd197a0f45

📥 Commits

Reviewing files that changed from the base of the PR and between bfeabe3 and e329ae4.

📒 Files selected for processing (288)
  • cloudglue/client/resources/share.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/dropbox_source_metadata.py
  • cloudglue/sdk/models/dropbox_source_metadata_media_info.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/gong_source_metadata.py
  • cloudglue/sdk/models/gong_source_metadata_parties_inner.py
  • cloudglue/sdk/models/gong_source_metadata_topics_inner.py
  • cloudglue/sdk/models/gong_source_metadata_trackers_inner.py
  • cloudglue/sdk/models/google_drive_source_metadata.py
  • cloudglue/sdk/models/google_drive_source_metadata_last_modifying_user.py
  • cloudglue/sdk/models/google_drive_source_metadata_owners_inner.py
  • cloudglue/sdk/models/google_drive_source_metadata_video_media_metadata.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/recall_source_metadata.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/models/zoom_source_metadata.py
  • cloudglue/sdk/models/zoom_source_metadata_recording_files_inner.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:

  • Review on demand using usage pricing
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch kdr-link-preview

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 July 18, 2026 16:38
@kdr
kdr merged commit f76b30e into main Jul 19, 2026
2 checks passed
@kdr
kdr deleted the kdr-link-preview branch July 19, 2026 02:32
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