Compare commits

...

3 Commits

Author SHA1 Message Date
Adrian Lyjak 23e636edce py 3.9 2025-08-14 10:40:11 -04:00
Adrian Lyjak e391485d05 bump version 2025-08-14 10:32:08 -04:00
Adrian Lyjak 6d74472cab Handle extract run error field 2025-08-14 10:31:45 -04:00
5 changed files with 48 additions and 16 deletions
@@ -223,10 +223,12 @@ def parse_extracted_field_metadata(
k: _parse_extracted_field_metadata_recursive(v)
for k, v in field_metadata.items()
if k not in _METADATA_FIELDS_SIBLING_TO_LEAF
and k not in _ADDITIONAL_ROOT_METADATA_FIELDS
}
_METADATA_FIELDS_SIBLING_TO_LEAF = {"reasoning"}
_ADDITIONAL_ROOT_METADATA_FIELDS = {"error"}
def _parse_extracted_field_metadata_recursive(
@@ -417,11 +419,14 @@ class ExtractedData(BaseModel, Generic[ExtractedT]):
"""
file_id = file_id or result.file.id
file_name = file_name or result.file.name
job_id = result.job_id
job_field_metadata = result.extraction_metadata.get("field_metadata", {})
errors = job_field_metadata.get("error", None)
if not isinstance(errors, str):
errors = None
try:
field_metadata = parse_extracted_field_metadata(
result.extraction_metadata.get("field_metadata", {})
)
field_metadata = parse_extracted_field_metadata(job_field_metadata)
except ValidationError:
field_metadata = {}
@@ -430,11 +435,15 @@ class ExtractedData(BaseModel, Generic[ExtractedT]):
return cls.create(
data=data,
status=status,
field_metadata=field_metadata,
field_metadata=job_field_metadata,
file_id=file_id,
file_name=file_name,
file_hash=file_hash,
metadata=metadata or {},
metadata={
**({"field_errors": errors} if errors else {}),
"job_id": job_id,
**(metadata or {}),
},
)
except ValidationError as e:
invalid_item = ExtractedData[Dict[str, Any]].create(
+2 -2
View File
@@ -11,13 +11,13 @@ dev = [
[project]
name = "llama-parse"
version = "0.6.58"
version = "0.6.59"
description = "Parse files into RAG-Optimized formats."
authors = [{name = "Logan Markewich", email = "logan@llamaindex.ai"}]
requires-python = ">=3.9,<4.0"
readme = "README.md"
license = "MIT"
dependencies = ["llama-cloud-services>=0.6.58"]
dependencies = ["llama-cloud-services>=0.6.59"]
[project.scripts]
llama-parse = "llama_parse.cli.main:parse"
+1 -1
View File
@@ -19,7 +19,7 @@ dev = [
[project]
name = "llama-cloud-services"
version = "0.6.58"
version = "0.6.59"
description = "Tailored SDK clients for LlamaCloud services."
authors = [{name = "Logan Markewich", email = "logan@runllama.ai"}]
requires-python = ">=3.9,<4.0"
@@ -24,8 +24,8 @@ from llama_cloud_services.beta.agent_data.schema import (
# Test data models
class Person(BaseModel):
name: str
age: int
email: str
age: Optional[int] = None
email: Optional[str] = None
class Company(BaseModel):
@@ -405,6 +405,7 @@ def create_file(
def create_extract_run(
id: str = "extract-123",
job_id: str = "job-123",
data: Dict[str, Any] = {"name": "John Doe", "age": 30, "email": "john@example.com"},
extraction_metadata: Dict[str, Any] = {
"name": {
@@ -423,6 +424,7 @@ def create_extract_run(
return ExtractRun.parse_obj(
{
"id": id,
"job_id": job_id,
"data": data,
"extraction_metadata": {
"field_metadata": extraction_metadata,
@@ -501,10 +503,9 @@ def test_extracted_data_from_extraction_result_invalid_data():
# Create ExtractRun with data that doesn't match Person schema
extract_run = create_extract_run(
data={
"name": "Valid Name",
"missing_name": "Valid Name",
"age": "not_a_number",
"missing_email": True,
}, # Invalid age, missing email
}, # Invalid age, missing name
extraction_metadata={
"name": {"confidence": 0.9},
},
@@ -523,9 +524,8 @@ def test_extracted_data_from_extraction_result_invalid_data():
assert isinstance(invalid_data, ExtractedData)
assert invalid_data.status == "error"
assert invalid_data.data == {
"name": "Valid Name",
"missing_name": "Valid Name",
"age": "not_a_number",
"missing_email": True,
}
assert invalid_data.file_id == "error-file"
assert invalid_data.file_name == "bad_data.pdf"
@@ -590,3 +590,26 @@ def test_full_parse_nested_dimensions():
assert result.field_metadata == expected
parsed = ExtractedData.model_validate_json(result.model_dump_json())
assert parsed.field_metadata == expected
def test_parses_field_metadata_with_error_field():
extract_run = create_extract_run(
extraction_metadata={
"name": {
"confidence": 0.95,
"citation": [{"page": 1, "matching_text": "John Smith"}],
},
"error": "This is an error",
},
)
parsed = ExtractedData.from_extraction_result(extract_run, Person)
assert parsed.field_metadata == {
"name": ExtractedFieldMetadata(
confidence=0.95,
citation=[FieldCitation(page=1, matching_text="John Smith")],
),
}
assert parsed.metadata.get("field_errors") == "This is an error"
assert parsed.metadata.get("job_id") == "job-123"
Generated
+1 -1
View File
@@ -1596,7 +1596,7 @@ wheels = [
[[package]]
name = "llama-cloud-services"
version = "0.6.58"
version = "0.6.59"
source = { editable = "." }
dependencies = [
{ name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },