Result models
Every object the SDK returns, with its Pydantic definition and a link to the source. Generated from the shipped package, so it cannot drift.
Every result the SDK returns, generated from pictograph 1.69.67.
Definitions are collapsed - open one for its fields and a link to the source at v1.69.67.
What each call returns
| Call | Returns |
|---|---|
client.annotation_comments.create() |
AnnotationComment AnnotationComment |
client.annotation_comments.delete() |
None |
client.annotation_comments.list() |
Sequence[AnnotationComment] AnnotationComment |
client.annotation_comments.resolve() |
AnnotationComment AnnotationComment |
client.annotation_comments.update() |
AnnotationComment AnnotationComment |
client.annotations.bulk_save() |
BulkSaveResult |
client.annotations.delete() |
DeleteResult |
client.annotations.delete_class() |
DeleteClassResult |
client.annotations.get() |
list[Annotation] |
client.annotations.import_coco() |
AnnotationImportReport AnnotationImportReport |
client.annotations.import_pascal_voc() |
AnnotationImportReport AnnotationImportReport |
client.annotations.import_yolo() |
AnnotationImportReport AnnotationImportReport |
client.annotations.merge_class() |
MergeClassResult |
client.annotations.rename_class() |
RenameClassResult |
client.annotations.save() |
SaveResult |
client.api_keys.create() |
CreatedApiKey CreatedApiKey |
client.api_keys.delete() |
None |
client.api_keys.get() |
ApiKey ApiKey |
client.api_keys.list() |
list[ApiKey] ApiKey |
client.api_keys.update() |
ApiKey ApiKey |
client.auto_annotate.batch() |
BatchJob BatchJob |
client.auto_annotate.box() |
PromptResult PromptResult |
client.auto_annotate.cancel_batch() |
BatchJob BatchJob |
client.auto_annotate.dataset() |
AnnotateReport AnnotateReport |
client.auto_annotate.get_batch() |
BatchJob BatchJob |
client.auto_annotate.point() |
PromptResult PromptResult |
client.auto_annotate.quote() |
BatchQuote BatchQuote |
client.auto_annotate.text() |
PromptResult PromptResult |
client.auto_annotate.wait_for_batch() |
BatchJob BatchJob |
client.batch.copy() |
BatchResult BatchResult |
client.batch.delete() |
BatchResult BatchResult |
client.batch.move() |
BatchResult BatchResult |
client.batch.update() |
BatchResult BatchResult |
client.connectors.cancel_import() |
ImportJob ImportJob |
client.connectors.check_limits() |
LimitCheckResult LimitCheckResult |
client.connectors.get_import() |
ImportJob ImportJob |
client.connectors.import_() |
ImportJob ImportJob |
client.connectors.validate() |
ValidationResult ValidationResult |
client.connectors.wait_for_import() |
ImportJob ImportJob |
client.credits.balance() |
CreditBalance CreditBalance |
client.credits.estimate() |
CreditEstimate CreditEstimate |
client.credits.history() |
list[CreditLedgerEntry] |
client.credits.iter() |
OffsetPager[CreditLedgerEntry] |
client.credits.usage_by_operation() |
UsageByOperation |
client.datasets.archive() |
Dataset Dataset |
client.datasets.as_pytorch() |
PictographTorchDataset |
client.datasets.create() |
Dataset Dataset |
client.datasets.delete() |
dict[str, Any] |
client.datasets.download() |
DownloadReport |
client.datasets.freeze() |
DatasetStorageTransition DatasetStorageTransition |
client.datasets.get() |
Dataset Dataset |
client.datasets.insights() |
DatasetInsights DatasetInsights |
client.datasets.iter() |
OffsetPager[Dataset] Dataset |
client.datasets.list() |
list[Dataset] Dataset |
client.datasets.near_duplicates() |
NearDuplicatesResult NearDuplicatesResult |
client.datasets.restore() |
DatasetStorageTransition DatasetStorageTransition |
client.datasets.storage_status() |
DatasetStorageStatus DatasetStorageStatus |
client.datasets.unarchive() |
Dataset Dataset |
client.datasets.update() |
Dataset Dataset |
client.datasets.wait_for_storage() |
DatasetStorageStatus DatasetStorageStatus |
client.deployments.bulk_delete() |
BulkDeleteResult BulkDeleteResult |
client.deployments.bulk_pause() |
BulkActionResult BulkActionResult |
client.deployments.bulk_resume() |
BulkActionResult BulkActionResult |
client.deployments.compute_options() |
Sequence[DeploymentComputeOption] |
client.deployments.connect() |
DeploymentClient[Any] |
client.deployments.create() |
CreatedDeployment CreatedDeployment |
client.deployments.delete() |
None |
client.deployments.get() |
Deployment Deployment |
client.deployments.iter() |
OffsetPager[Deployment] Deployment |
client.deployments.list() |
list[Deployment] Deployment |
client.deployments.pause() |
Deployment Deployment |
client.deployments.quote() |
DeploymentQuote DeploymentQuote |
client.deployments.resume() |
Deployment Deployment |
client.directories.create() |
Directory Directory |
client.directories.delete() |
None |
client.directories.list() |
Sequence[Directory] Directory |
client.directories.rename() |
Directory Directory |
client.directories.stats() |
DirectoryStats DirectoryStats |
client.directories.tree() |
Sequence[DirectoryTreeNode] |
client.exports.bulk_delete() |
BulkDeleteResult BulkDeleteResult |
client.exports.create() |
Export Export |
client.exports.delete() |
None |
client.exports.download() |
Path |
client.exports.download_by_id() |
Path |
client.exports.get() |
Export Export |
client.exports.get_by_id() |
Export Export |
client.exports.iter() |
OffsetPager[Export] Export |
client.exports.list() |
list[Export] Export |
client.exports.wait_for_completion() |
Export Export |
client.images.assign_splits() |
dict[str, int] |
client.images.augment() |
AugmentReport AugmentReport |
client.images.bulk_tag() |
int |
client.images.bulk_upload() |
BulkUploadResult |
client.images.delete() |
None |
client.images.download() |
Path |
client.images.download_bundle() |
Path |
client.images.get() |
Image Image |
client.images.iter() |
OffsetPager[Image] Image |
client.images.list() |
list[Image] Image |
client.images.review() |
ImageStatus |
client.images.set_split() |
ImageSplit |
client.images.tile() |
TileReport TileReport |
client.images.upload() |
Image Image |
client.images.upload_from_directory() |
UploadReport UploadReport |
client.model_evaluations.cancel() |
ModelEvaluation ModelEvaluation |
client.model_evaluations.create() |
ModelEvaluation ModelEvaluation |
client.model_evaluations.evaluate() |
ModelEvaluation ModelEvaluation |
client.model_evaluations.get() |
ModelEvaluation ModelEvaluation |
client.model_evaluations.iter() |
OffsetPager[ModelEvaluation] ModelEvaluation |
client.model_evaluations.list() |
list[ModelEvaluation] ModelEvaluation |
client.model_evaluations.wait_for_completion() |
ModelEvaluation ModelEvaluation |
client.models.bulk_delete() |
BulkDeleteResult BulkDeleteResult |
client.models.delete() |
None |
client.models.download() |
Path |
client.models.download_file() |
Path |
client.models.files() |
ModelFileManifest ModelFileManifest |
client.models.fork() |
Model Model |
client.models.get() |
Model Model |
client.models.get_by_name() |
Model Model |
client.models.iter() |
OffsetPager[Model] Model |
client.models.list() |
list[Model] Model |
client.models.load() |
AnyModel |
client.models.predict() |
ModelPredictResult ModelPredictResult |
client.models.set_current_version() |
ModelVersionsPayload ModelVersionsPayload |
client.models.update() |
Model Model |
client.models.versions() |
ModelVersionsPayload ModelVersionsPayload |
client.notifications.delete() |
None |
client.notifications.list() |
list[Notification] |
client.notifications.mark_all_read() |
int |
client.notifications.mark_read() |
None |
client.notifications.unread_count() |
int |
client.organizations.invite() |
OrganizationInvite OrganizationInvite |
client.organizations.list_invites() |
list[OrganizationInvite] OrganizationInvite |
client.organizations.list_members() |
list[OrganizationMember] |
client.organizations.me() |
Organization Organization |
client.organizations.remove_member() |
None |
client.organizations.revoke_invite() |
None |
client.organizations.update() |
Organization Organization |
client.organizations.update_member_role() |
dict[str, Any] |
client.search.by_similarity() |
list[SimilarImage] |
client.search.by_tag() |
list[TaggedImage] |
client.tasks.contributions() |
TaskContributions TaskContributions |
client.tasks.iter() |
OffsetPager[Task] |
client.tasks.list() |
list[Task] |
client.training.bulk_cancel() |
BulkActionResult BulkActionResult |
client.training.cancel() |
TrainingRun TrainingRun |
client.training.create() |
TrainingRun TrainingRun |
client.training.get() |
TrainingRun TrainingRun |
client.training.iter() |
OffsetPager[TrainingRun] TrainingRun |
client.training.list() |
list[TrainingRun] TrainingRun |
client.training.wait_for_completion() |
TrainingRun TrainingRun |
client.video.extract_frames() |
VideoExtractionJob VideoExtractionJob |
client.video.get_extraction() |
VideoExtractionJob VideoExtractionJob |
client.video.probe() |
VideoMetadata VideoMetadata |
client.video.upload() |
VideoUploadInfo VideoUploadInfo |
client.video.wait_for_extraction() |
VideoExtractionJob VideoExtractionJob |
client.webhooks.create() |
CreatedWebhookEndpoint CreatedWebhookEndpoint |
client.webhooks.delete() |
None |
client.webhooks.deliveries() |
Sequence[WebhookDelivery] |
client.webhooks.event_types() |
list[str] |
client.webhooks.get() |
WebhookEndpoint WebhookEndpoint |
client.webhooks.list() |
Sequence[WebhookEndpoint] WebhookEndpoint |
client.webhooks.replay() |
None |
client.webhooks.rotate_secret() |
CreatedWebhookEndpoint CreatedWebhookEndpoint |
client.webhooks.test() |
dict[str, Any] |
client.webhooks.update() |
WebhookEndpoint WebhookEndpoint |
client.workflows.bulk_cancel_runs() |
BulkActionResult BulkActionResult |
client.workflows.bulk_delete() |
BulkDeleteResult BulkDeleteResult |
client.workflows.cancel_run() |
None |
client.workflows.create() |
Workflow Workflow |
client.workflows.delete() |
None |
client.workflows.get() |
Workflow Workflow |
client.workflows.get_run() |
WorkflowRun WorkflowRun |
client.workflows.list() |
Sequence[Workflow] Workflow |
client.workflows.run() |
WorkflowRunCreated WorkflowRunCreated |
client.workflows.update() |
Workflow Workflow |
client.workflows.wait_for_run() |
WorkflowRun WorkflowRun |
Models
AnnotateReport · 8 fields · Outcome of an AutoAnnotate.dataset call.
class AnnotateReport(BaseModel):
dataset_name: str
images_attempted: int = 0
images_processed: int = 0
images_skipped: int = 0
images_capped: int = 0
annotations_added: int = 0
failures: list[AnnotationFailure] = []
job_id: str | None = None
AnnotationComment · 11 fields · One comment on an annotation.
class AnnotationComment(BaseModel):
id: str
annotation_id: str
body: str
resolved: bool = False
created_at: datetime | None = None
updated_at: datetime | None = None
user_id: str | None = None
author_name: str | None = None
author_username: str | None = None
author_avatar_url: str | None = None
is_mine: bool = False
AnnotationImportReport · 6 fields · Outcome of an Annotations.import_coco / `import_pascal_voc` / `import_yolo` call.
class AnnotationImportReport(BaseModel):
dataset_name: str
images_matched: int = 0
images_saved: int = 0
annotations_saved: int = 0
unmatched_files: list[str] = []
failures: list[AnnotationImportFailure] = []
ApiKey · 10 fields · API key metadata returned by list/get/update endpoints.
class ApiKey(BaseModel):
id: str
organization_id: str
name: str
key_prefix: str
role: Literal['viewer', 'member', 'admin', 'owner']
rate_limit: int
is_active: bool
last_used_at: datetime | None = None
expires_at: datetime | None = None
created_at: datetime
AugmentReport · 8 fields · Outcome of an Images.augment run.
class AugmentReport(BaseModel):
source: str
target: str
source_images: int = 0
originals_copied: int = 0
variants_created: int = 0
annotations_written: int = 0
skipped_empty: int = 0
failures: list[AugmentFailure] = []
BatchJob · 10 fields · Snapshot of an auto-annotate batch job's progress.
class BatchJob(BaseModel):
job_id: str
status: Literal['pending', 'running', 'completed', 'failed', 'cancelled']
progress: int = 0
total_images: int = 0
processed_images: int = 0
total_annotations_added: int = 0
failed_images: int = 0
error_message: str | None = None
estimated_credits: int | None = None
completed_at: datetime | None = None
BatchQuote · 8 fields · What a batch job WOULD cost - the same deposit `batch()` would take.
class BatchQuote(BaseModel):
total_images: int
estimated_credits: int
sahi_tiles: int = 0
containers: int = 0
remaining_credits: int = 0
sufficient: bool = True
max_images: int = 5000
exceeds_max_images: bool = False
BatchResult · 6 fields · Outcome of a batch operation.
class BatchResult(BaseModel):
success: bool
processed: int
failed: list[BatchFailure] = []
affected_directories: list[str] = []
renamed: int = 0
operation: str | None = None
BulkActionResult · 3 fields · Result of a server-side bulk state-change (e.g. pause/resume).
class BulkActionResult(BaseModel):
succeeded: list[str] = []
not_found: list[str] = []
count: int = 0
BulkDeleteResult · 3 fields · Result of a server-side bulk delete (one chunked, org-scoped call).
class BulkDeleteResult(BaseModel):
succeeded: list[str] = []
not_found: list[str] = []
count: int = 0
CreatedApiKey · 8 fields · Response from ApiKeys.create - includes the secret one time only.
class CreatedApiKey(BaseModel):
api_key: str
key_id: str
key_prefix: str
name: str
role: Literal['viewer', 'member', 'admin', 'owner']
rate_limit: int
expires_at: datetime | None = None
created_at: datetime
CreatedDeployment · 2 fields · Create response - carries the one-time plaintext bearer token.
class CreatedDeployment(BaseModel):
deployment: Deployment
auth_token: str
CreatedWebhookEndpoint · 2 fields · Create / rotate response - carries the one-time signing secret.
class CreatedWebhookEndpoint(BaseModel):
endpoint: WebhookEndpoint
secret: str
CreditBalance · 11 fields · Current compute-credit state for an organization (USD, stored as µUSD).
class CreditBalance(BaseModel):
included_allowance_micro_usd: int = 0
included_remaining_micro_usd: int = 0
budget_micro_usd: int = 0
period_spend_micro_usd: int = 0
period_overage_micro_usd: int = 0
budget_remaining_micro_usd: int = 0
period_start: datetime | None = None
credits_reset_at: datetime | None = None
credits_remaining: int = 0
credits_monthly_allowance: int = 0
recent_history: list[CreditLedgerEntry] = []
CreditEstimate · 11 fields · Estimated cost of a planned operation (USD, stored as µUSD), plus an affordability check.
class CreditEstimate(BaseModel):
operation: str
unit: str
quantity: int
micro_usd_per_unit: int = 0
total_micro_usd: int = 0
remaining_micro_usd: int = 0
sufficient: bool = False
credits_per_unit: int = 0
total_credits: int = 0
minimum: int = 0
credits_remaining: int = 0
Dataset · 17 fields · A Pictograph dataset - a group of images sharing an annotation config.
class Dataset(BaseModel):
id: str
organization_id: str | None = None
name: str
description: str | None = None
annotation_types: list[str] = ['bbox']
classes: list[DatasetClass] = []
image_count: int = 0
completed_image_count: int = 0
archived_image_count: int = 0
total_size: int = 0
is_public: bool = False
is_archived: bool = False
archived_at: datetime | None = None
storage_class: str = 'standard'
images: list[Image] | None = None
created_at: datetime
updated_at: datetime | None = None
DatasetInsights · 13 fields · Dataset Health / Insights - headline totals, class balance, and more.
class DatasetInsights(BaseModel):
total_images: int = 0
total_annotations: int = 0
annotated_images: int = 0
unannotated_images: int = 0
avg_annotations_per_image: float = 0.0
total_bytes: int = 0
status_counts: InsightsStatusCounts = InsightsStatusCounts(new=0, annotate=0, review=0, complete=0)
class_annotation_counts: dict[str, int] = {}
class_image_counts: dict[str, int] = {}
type_counts: dict[str, int] = {}
annotation_density: dict[str, int] = {}
dimensions: InsightsDimensions = InsightsDimensions(min_width=None, max_width=None, avg_width=None, min_height=None, max_height=None, avg_height=None, orientation=InsightsOrientation(landscape=0, portrait=0, square=0), sizes=[], distinct_size_count=0, images_with_dimensions=0, images_missing_dimensions=0)
model_confidence: ModelConfidence | None = None
DatasetStorageStatus · 7 fields · Cold-storage state of a dataset (`GET /developer/datasets/{id}/storage`).
class DatasetStorageStatus(BaseModel):
storage_class: str = 'standard'
storage_state: str = 'idle'
cold_since: datetime | None = None
cold_bytes: int = 0
cold_image_count: int = 0
storage_job_id: str | None = None
restore_estimate: DatasetRestoreEstimate | None = None
DatasetStorageTransition · 3 fields · Acknowledgement that a freeze/restore background job started.
class DatasetStorageTransition(BaseModel):
job_id: str
storage_state: str
quoted_micro_usd: int | None = None
Deployment · 19 fields · A live (or provisioning) model inference deployment.
class Deployment(BaseModel):
id: str
organization_id: str
model_id: str
name: str
status: Literal['provisioning', 'active', 'paused', 'failed', 'terminated']
compute_type: Literal['cpu', 'gpu']
gpu_type: Optional[Literal['t4', 'l4', 'a10g', 'a100']] = None
min_containers: int
max_containers: int
scaledown_window: int
endpoint_url: str | None = None
auth_token_prefix: str | None = None
inference_config: dict[str, Any] = {}
cost_rate_per_min: int = 0
cost_per_hour: int | None = None
accrued_cost_credits: int = 0
uptime_seconds: int = 0
created_at: datetime | None = None
started_at: datetime | None = None
DeploymentQuote · 5 fields · Cost quote for a deployment, before creating it. All amounts are already-marked-up micro-USD (1 USD = 1_000_000 µUSD).
class DeploymentQuote(BaseModel):
rate_per_min_micro_usd: int
cost_per_hour_micro_usd: int
cost_per_day_micro_usd: int
scale_to_zero: bool
billing_note: str
Directory · 10 fields · A single virtual directory in a dataset.
class Directory(BaseModel):
id: str
dataset_id: str
organization_id: str | None = None
name: str
parent_directory_id: str | None = None
full_path: str
image_count: int = 0
created_by: str | None = None
created_at: datetime | None = None
updated_at: datetime | None = None
DirectoryStats · 4 fields · Aggregate image statistics for a directory (and, by default, its subdirectories).
class DirectoryStats(BaseModel):
total_directories: int
total_images: int
total_size_bytes: int
directories_by_status: dict[str, int] = {}
Export · 17 fields · A dataset export - produced asynchronously, downloaded as a ZIP.
class Export(BaseModel):
id: str
dataset_id: str
dataset_name: str
name: str
format: Literal['pictograph', 'darwin', 'coco', 'yolo', 'yolo_obb', 'yolo_pose', 'dota', 'pascal_voc', 'cvat', 'datumaro', 'labelme', 'csv']
include_images: bool = False
class_filter: list[str] | None = None
status_filter: str | None = None
status: Literal['pending', 'processing', 'completed', 'failed']
error_message: str | None = None
file_size: int | None = None
image_count: int | None = None
annotation_count: int | None = None
created_at: datetime
expires_at: datetime | None = None
download_url: str | None = None
organization_id: str | None = None
Image · 18 fields · An image within a Pictograph dataset.
class Image(BaseModel):
id: str
dataset_id: str | None = None
filename: str
status: Literal['new', 'annotate', 'review', 'complete'] = 'new'
split: Optional[Literal['train', 'val', 'test']] = None
annotation_count: int = 0
min_confidence: float | None = None
file_size: int = 0
width: int | None = None
height: int | None = None
content_type: str | None = None
directory_path: str | None = None
tags: list[str] = []
is_archived: bool = False
image_url: str | None = None
thumbnail_url: str | None = None
annotation_url: str | None = None
created_at: datetime
ImportJob · 8 fields · Snapshot of an import operation - totals + per-dataset breakdown.
class ImportJob(BaseModel):
import_id: str
status: Literal['processing', 'completed', 'error', 'cancelled']
progress: float = 0.0
total_images: int = 0
imported_images: int = 0
failed_images: int = 0
current_dataset: str = ''
datasets: list[DatasetImportProgress] = []
LimitCheckResult · 8 fields · Outcome of Connectors.check_limits.
class LimitCheckResult(BaseModel):
allowed: bool
current_images: int
image_limit: int
images_after_import: int
current_storage_bytes: int
storage_limit_bytes: int
storage_after_import_bytes: int
exceeded: Optional[Literal['images', 'storage', 'both']] = None
Model · 17 fields · A trained computer vision model.
class Model(BaseModel):
id: str
organization_id: str
name: str
description: str | None = None
model_type: Literal['object_detection', 'semantic_segmentation', 'instance_segmentation', 'classification', 'keypoint_detection']
architecture: str | None = None
visibility: Literal['private', 'public']
status: Literal['training', 'ready', 'failed', 'archived']
metrics: dict[str, Any] | None = None
class_mapping: dict[str, Any] | None = None
training_config: dict[str, Any] | None = None
version: str = '1.0.0'
parent_model_id: str | None = None
forked_from_model_id: str | None = None
precision: Literal['fp32', 'fp16'] = 'fp32'
created_at: datetime
updated_at: datetime
ModelEvaluation · 22 fields · A model-evaluation run + its metric summary.
class ModelEvaluation(BaseModel):
id: str
organization_id: str
model_id: str
dataset_id: str
export_id: str | None = None
status: Literal['pending', 'running', 'completed', 'failed', 'cancelled']
progress: int = 0
iou_threshold: float = 0.5
confidence_threshold: float = 0.5
total_images: int = 0
evaluated_images: int = 0
failed_images: int = 0
overall_metrics: EvalOverallMetrics | None = None
per_class_metrics: list[EvalClassMetrics] | None = None
confusion_matrix: EvalConfusionMatrix | None = None
worst_images: list[EvalWorstImage] | None = None
config: dict[str, Any] | None = None
error_message: str | None = None
created_at: datetime | None = None
updated_at: datetime | None = None
started_at: datetime | None = None
completed_at: datetime | None = None
ModelFileManifest · 3 fields · A model's complete version + file manifest (`models.files`).
class ModelFileManifest(BaseModel):
versions: list[ModelVersionEntry] = []
files: list[ModelFileEntry] = []
pinned_version_id: str | None = None
ModelPredictResult · 6 fields · Result of a remote single-image test inference (`models.predict`).
class ModelPredictResult(BaseModel):
success: bool = True
annotations: list[dict[str, Any]] = []
tags: list[str] = []
tag_scores: list[float] = []
model_type: Optional[Literal['object_detection', 'semantic_segmentation', 'instance_segmentation', 'classification', 'keypoint_detection']] = None
inference_seconds: float = 0.0
ModelVersionsPayload · 4 fields · `models.versions` - the version list plus promote state.
class ModelVersionsPayload(BaseModel):
versions: list[ModelVersionEntry] = []
current_version_id: str | None = None
pinned_version_id: str | None = None
latest_version_id: str | None = None
NearDuplicatesResult · 11 fields · Near-duplicate clusters for a dataset + headline data-curation counts.
class NearDuplicatesResult(BaseModel):
groups: list[DuplicateGroup] = []
group_count: int = 0
duplicate_image_count: int = 0
redundant_count: int = 0
analyzed: int = 0
total_images: int = 0
sample_limit: int = 0
sample_capped: bool = False
pairs_capped: bool = False
threshold: float = 0.0
directory_path: str | None = None
Organization · 16 fields · Organization metadata + tier limits + credit balance.
class Organization(BaseModel):
id: str
name: str
slug: str
description: str | None = None
is_public: bool | None = None
subscription_tier: Literal['free', 'core', 'pro', 'team', 'enterprise']
credits_remaining: int
credits_monthly_allowance: int
credits_reset_at: datetime | None = None
max_users: int
max_images: int
max_storage_bytes: int
member_count: int
pending_invite_count: int
created_at: datetime
updated_at: datetime
OrganizationInvite · 8 fields · A pending / accepted / expired / revoked invite.
class OrganizationInvite(BaseModel):
id: str
organization_id: str
email: str
role: Literal['admin', 'member', 'viewer']
status: Literal['pending', 'accepted', 'expired', 'revoked']
invited_by: str | None = None
expires_at: datetime
created_at: datetime
PromptResult · 4 fields · Outcome of a single SAM3 prompt (point / box / text).
class PromptResult(BaseModel):
status: Literal['success', 'no_detection', 'below_threshold']
annotations: list[Annotation] = []
score: float | None = None
inference_time: float | None = None
TaskContributions · 6 fields · Per-annotator contribution breakdown for a task, with rollup totals.
class TaskContributions(BaseModel):
task_id: str
contributors: list[TaskContribution]
contributor_count: int
total_images: int
images_complete: int
total_active_seconds: int
TileReport · 7 fields · Outcome of an Images.tile run.
class TileReport(BaseModel):
source: str
target: str
source_images: int = 0
tiles_created: int = 0
empty_tiles: int = 0
annotations_written: int = 0
failures: list[TileFailure] = []
TrainingRun · 21 fields · A single training job.
class TrainingRun(BaseModel):
id: str
organization_id: str
name: str
dataset_id: str | None = None
export_id: str | None = None
model_id: str | None = None
pipeline_type: Literal['yolox', 'sm_pytorch', 'classification', 'rfdetr_detection', 'rfdetr_segmentation', 'rfdetr_keypoint']
gpu_type: Optional[Literal['a10g', 'a100', 'h100', 'auto']] = None
status: Literal['pending', 'queued', 'running', 'completed', 'failed', 'cancelled']
progress: int = 0
current_epoch: int = 0
total_epochs: int | None = None
metrics: dict[str, Any] = {}
config: dict[str, Any] = {}
eta_seconds: int | None = None
training_time_seconds: int | None = None
error_message: str | None = None
started_at: datetime | None = None
completed_at: datetime | None = None
created_at: datetime
created_by: str | None = None
UploadReport · 5 fields · Outcome of an Images.upload_from_directory call.
class UploadReport(BaseModel):
dataset_name: str
images_attempted: int = 0
images_uploaded: int = 0
images_skipped: int = 0
failures: list[UploadFailure] = []
ValidationResult · 4 fields · Outcome of Connectors.validate.
class ValidationResult(BaseModel):
valid: bool
workspace: str = ''
datasets: list[RemoteDataset] = []
error: str | None = None
VideoExtractionJob · 9 fields · Snapshot of a frame-extraction job.
class VideoExtractionJob(BaseModel):
job_id: str
status: Literal['processing', 'complete', 'failed']
progress: int = 0
frames_extracted: int = 0
total_frames: int = 0
error: str | None = None
directory_path: str | None = None
warning: str | None = None
image_ids: list[str] | None = None
VideoMetadata · 5 fields · Probe result for an uploaded video.
class VideoMetadata(BaseModel):
duration_seconds: float
native_fps: float
width: int
height: int
frame_count: int
VideoUploadInfo · 3 fields · Signed URL + temporary storage path returned by `upload-url`.
class VideoUploadInfo(BaseModel):
upload_url: str
gcs_path: str
gcs_uri: str
WebhookEndpoint · 13 fields · A registered outbound webhook destination.
class WebhookEndpoint(BaseModel):
id: str
organization_id: str
url: str
description: str | None = None
event_types: list[str] = []
enabled: bool = True
secret_version: int = 1
secret_prefix: str | None = None
consecutive_failures: int = 0
disabled_reason: str | None = None
auth_header_names: list[str] | None = None
last_delivery_at: datetime | None = None
created_at: datetime | None = None
Workflow · 10 fields · A saved node-graph workflow.
class Workflow(BaseModel):
id: str
organization_id: str
name: str
description: str | None = None
graph: dict[str, Any] = {}
template_key: str | None = None
status: Literal['draft', 'ready', 'archived'] = 'draft'
last_run_id: str | None = None
created_at: datetime | None = None
updated_at: datetime | None = None
WorkflowRun · 16 fields · One execution of a workflow over a source.
class WorkflowRun(BaseModel):
id: str
organization_id: str
workflow_id: str
status: Literal['queued', 'processing', 'completed', 'error', 'cancelled']
progress: float = 0.0
frames_total: int | None = None
frames_done: int = 0
sample_fps: float | None = None
step_results: dict[str, Any] = {}
artifacts: list[dict[str, Any]] = []
warnings: list[str] = []
deposit_micro_usd: int = 0
final_micro_usd: int | None = None
error: str | None = None
created_at: datetime | None = None
completed_at: datetime | None = None
WorkflowRunCreated · 2 fields · Run response - the new run id + `deposit_micro_usd`, which is the un-charged pre-run ESTIMATE. Workflows bill ONCE, on success, from measured GPU time; a failed or cancelled run is free. The field name is kept for wire-compat.
class WorkflowRunCreated(BaseModel):
run_id: str
deposit_micro_usd: int = 0