11import logging
22import re
3- from typing import Literal
3+ from typing import Literal , get_args
44
55from pydantic import JsonValue , model_validator
66from sqlmodel import Field , SQLModel
1818# object-typed dict. Provider strict-mode normalisation is a run-mode concern.
1919JSON_SCHEMA_OBJECT_TYPE = "object"
2020
21- IMAGE_COLUMN_TYPE = "image"
22- PDF_COLUMN_TYPE = "pdf"
23- VIDEO_COLUMN_TYPE = "video"
21+ AttachmentColumnType = Literal ["image" , "pdf" , "video" , "audio" ]
22+ ColumnType = Literal ["text" ] | AttachmentColumnType
2423# Input-column types carrying a media reference rather than prompt text.
25- ATTACHMENT_COLUMN_TYPES = ( IMAGE_COLUMN_TYPE , PDF_COLUMN_TYPE , VIDEO_COLUMN_TYPE )
24+ ATTACHMENT_COLUMN_TYPES = get_args ( AttachmentColumnType )
2625
27- AttachmentColumnType = Literal ["image" , "pdf" , "video" ]
28- ColumnType = Literal ["text" ] | AttachmentColumnType
26+ # Media column types a provider cannot take, so a config pairing them is rejected at save.
27+ UNSUPPORTED_COLUMN_TYPES_BY_PROVIDER : dict [str , tuple [str , ...]] = dict .fromkeys (
28+ (Provider .OPENAI , Provider .ANTHROPIC ), ("video" , "audio" )
29+ )
2930
3031# {column} placeholders in a submission template; the capture group is the column name.
3132PLACEHOLDER_RE = re .compile (r"\{(\w+)\}" )
@@ -51,8 +52,8 @@ class InputColumn(SQLModel):
5152
5253 @model_validator (mode = "after" )
5354 def _validate_video_format (self ):
54- if self .type == VIDEO_COLUMN_TYPE and self .format == "base64" :
55- raise ValueError ("A 'video ' input column must be url-format." )
55+ if self .type in ( "video" , "audio" ) and self .format == "base64" :
56+ raise ValueError (f "A '{ self . type } ' input column must be url-format." )
5657 return self
5758
5859
@@ -225,3 +226,26 @@ def _validate_submission_placeholders(self):
225226 f"{ ', ' .join (unknown )} "
226227 )
227228 return self
229+
230+ @model_validator (mode = "after" )
231+ def _validate_column_types_supported (self ):
232+ """Every stage's provider must accept each media column type in input_schema."""
233+ stage_providers = {"assessment" : self .assessment .provider }
234+ if self .pre_filters and self .pre_filters .topic_relevance :
235+ stage_providers [
236+ "pre_filter topic_relevance"
237+ ] = self .pre_filters .topic_relevance .provider
238+
239+ for stage , provider in stage_providers .items ():
240+ unsupported = UNSUPPORTED_COLUMN_TYPES_BY_PROVIDER .get (provider , ())
241+ offending = sorted (
242+ column
243+ for column , spec in self .input_schema .items ()
244+ if spec .type in unsupported
245+ )
246+ if offending :
247+ raise ValueError (
248+ f"{ stage } provider '{ provider } ' does not support "
249+ f"{ '/' .join (unsupported )} input columns: { ', ' .join (offending )} "
250+ )
251+ return self
0 commit comments