Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions dspy/adapters/types/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class QA(dspy.Signature):
file_data: str | None = None
file_id: str | None = None
filename: str | None = None
mime_type: str | None = None

model_config = pydantic.ConfigDict(
frozen=True,
Expand All @@ -47,6 +48,7 @@ def validate_input(cls, values: Any) -> Any:
"file_data": values.file_data,
"file_id": values.file_id,
"filename": values.filename,
"mime_type": values.mime_type,
}

if isinstance(values, dict):
Expand All @@ -65,6 +67,8 @@ def format(self) -> list[dict[str, Any]]:
file_dict["file_id"] = self.file_id
if self.filename:
file_dict["filename"] = self.filename
if self.mime_type:
file_dict["format"] = self.mime_type

return [{"type": "file", "file": file_dict}]
except Exception as e:
Expand All @@ -88,6 +92,8 @@ def __repr__(self):
parts.append(f"file_id='{self.file_id}'")
if self.filename is not None:
parts.append(f"filename='{self.filename}'")
if self.mime_type is not None:
parts.append(f"mime_type='{self.mime_type}'")
return f"File({', '.join(parts)})"

@classmethod
Expand Down Expand Up @@ -134,9 +140,15 @@ def from_bytes(
return cls(file_data=file_data, filename=filename)

@classmethod
def from_file_id(cls, file_id: str, filename: str | None = None) -> "File":
"""Create a File from an uploaded file ID."""
return cls(file_id=file_id, filename=filename)
def from_file_id(cls, file_id: str, filename: str | None = None, mime_type: str | None = None) -> "File":
"""Create a File from an uploaded file ID.

Args:
file_id: The uploaded file ID
filename: Optional filename
mime_type: Optional MIME type (passed as 'format' to the API)
"""
return cls(file_id=file_id, filename=filename, mime_type=mime_type)


def encode_file_to_dict(file_input: Any) -> dict:
Expand All @@ -157,6 +169,8 @@ def encode_file_to_dict(file_input: Any) -> dict:
result["file_id"] = file_input.file_id
if file_input.filename is not None:
result["filename"] = file_input.filename
if file_input.mime_type is not None:
result["format"] = file_input.mime_type
return result

elif isinstance(file_input, str):
Expand Down