mirror of
https://github.com/run-llama/llama_cloud_services.git
synced 2026-07-20 09:03:38 -04:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 23e636edce | |||
| e391485d05 | |||
| 6d74472cab |
@@ -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(
|
||||
|
||||
@@ -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
@@ -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
@@ -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'" },
|
||||
|
||||
Reference in New Issue
Block a user