dograh/api/schemas/workflow_recording.py
Abhishek 7c245051d2
feat: add recording audio option in tool and node transitions (#232)
* feat: allow uploading recording as part of node transition

* feat: allow recordings in tool transitions

* chore: fix tests
2026-04-10 17:53:42 +05:30

119 lines
3.6 KiB
Python

"""Pydantic schemas for workflow recording operations."""
from datetime import datetime
from typing import Any, Dict, List, Optional
from pydantic import BaseModel, Field
class RecordingUploadResponseSchema(BaseModel):
"""Response schema with presigned upload URL."""
upload_url: str = Field(..., description="Presigned URL for uploading the audio")
recording_id: str = Field(..., description="Short unique recording ID")
storage_key: str = Field(..., description="Storage key where file will be uploaded")
class FileDescriptor(BaseModel):
"""Descriptor for a single file in a batch upload request."""
filename: str = Field(..., description="Original filename of the audio file")
mime_type: str = Field(
default="audio/wav", description="MIME type of the audio file"
)
file_size: int = Field(
...,
gt=0,
le=5_242_880,
description="File size in bytes (max 5MB)",
)
class BatchRecordingUploadRequestSchema(BaseModel):
"""Request schema for getting presigned upload URLs for one or more files."""
files: List[FileDescriptor] = Field(
..., min_length=1, max_length=20, description="List of files to upload"
)
class BatchRecordingUploadResponseSchema(BaseModel):
"""Response schema with presigned upload URLs."""
items: List[RecordingUploadResponseSchema] = Field(
..., description="Upload URLs for each file"
)
class RecordingCreateRequestSchema(BaseModel):
"""Request schema for creating a recording record after upload."""
recording_id: str = Field(..., description="Short recording ID from upload step")
tts_provider: Optional[str] = Field(
default=None, description="TTS provider (e.g. elevenlabs)"
)
tts_model: Optional[str] = Field(default=None, description="TTS model name")
tts_voice_id: Optional[str] = Field(
default=None, description="TTS voice identifier"
)
transcript: str = Field(
..., description="User-provided transcript of the recording"
)
storage_key: str = Field(..., description="Storage key from upload step")
metadata: Optional[Dict[str, Any]] = Field(
default=None, description="Optional metadata (file_size, duration, etc.)"
)
class RecordingResponseSchema(BaseModel):
"""Response schema for a single recording."""
id: int
recording_id: str
workflow_id: Optional[int] = None
organization_id: int
tts_provider: Optional[str] = None
tts_model: Optional[str] = None
tts_voice_id: Optional[str] = None
transcript: str
storage_key: str
storage_backend: str
metadata: Dict[str, Any]
created_by: int
created_at: datetime
is_active: bool
class BatchRecordingCreateRequestSchema(BaseModel):
"""Request schema for creating one or more recording records after upload."""
recordings: List[RecordingCreateRequestSchema] = Field(
..., min_length=1, max_length=20, description="List of recordings to create"
)
class BatchRecordingCreateResponseSchema(BaseModel):
"""Response schema for recording creation."""
recordings: List[RecordingResponseSchema] = Field(
..., description="Created recording records"
)
class RecordingUpdateRequestSchema(BaseModel):
"""Request schema for updating a recording's ID."""
recording_id: str = Field(
...,
min_length=1,
max_length=64,
pattern=r"^[a-zA-Z0-9_-]+$",
description="New descriptive recording ID (letters, numbers, hyphens, underscores only)",
)
class RecordingListResponseSchema(BaseModel):
"""Response schema for list of recordings."""
recordings: List[RecordingResponseSchema]
total: int