mirror of
https://github.com/run-llama/template-workflow-invoice-extraction.git
synced 2026-06-30 21:27:55 -04:00
Fix index-contract API, add fake tests for parsing/invoice templates (#270)
- extract-reconcile-invoice: index_contract.py called files.get_file / files.read_file_content / files.upload_file (v1 SDK surface removed in v2), breaking every Upload Contract click. Switched to files.list + files.get + files.create. - Added test_index_contract_workflow and test_metadata_workflow to exercise the full v2 surface (files.list, files.get, pipelines.upsert, pipelines.documents.upsert, configurations.retrieve). - document-parsing and invoice-extraction had only placeholder tests — wired up llama-cloud-fake and added parametrized tests covering every tier/mode. invoice-extraction's test drives the HIL step. - Bumped requires-python to >=3.12 on both (fake floor).
This commit is contained in:
+8
-1
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
|
||||
name = "invoice-extraction"
|
||||
version = "0.1.0"
|
||||
description = "A workflow that, given an invoice, extracts several key details using LlamaExtract"
|
||||
requires-python = ">=3.10"
|
||||
requires-python = ">=3.12"
|
||||
readme = "README.md"
|
||||
dependencies = [
|
||||
"llama-index-workflows>=2.16.0,<3.0.0",
|
||||
@@ -18,10 +18,17 @@ dev = [
|
||||
"hatch>=1.14.2",
|
||||
"pytest>=8.4.2",
|
||||
"pytest-asyncio>=1.3.0",
|
||||
"pytest-timeout>=2.3.1",
|
||||
"llama-cloud-fake>=0.1,<0.2",
|
||||
"ruff>=0.13.2",
|
||||
"ty>=0.0.2",
|
||||
]
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
timeout = 120
|
||||
timeout_method = "thread"
|
||||
asyncio_mode = "auto"
|
||||
|
||||
[tool.hatch.envs.default.scripts]
|
||||
format = "ruff format ."
|
||||
format-check = "ruff format --check ."
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
"""Pytest configuration: install the LlamaCloud fake server for all tests."""
|
||||
|
||||
import logging
|
||||
import sys
|
||||
|
||||
import pytest
|
||||
from llama_cloud_fake import FakeLlamaCloudServer
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
||||
handlers=[logging.StreamHandler(sys.stdout)],
|
||||
)
|
||||
|
||||
_fake = FakeLlamaCloudServer().install()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def fake() -> FakeLlamaCloudServer:
|
||||
return _fake
|
||||
Binary file not shown.
@@ -1,12 +0,0 @@
|
||||
"""Placeholder test file.
|
||||
|
||||
Replace this with actual tests for your project.
|
||||
"""
|
||||
|
||||
|
||||
def test_placeholder() -> None:
|
||||
"""Placeholder test that always passes.
|
||||
|
||||
Remove this test once you add real tests to your project.
|
||||
"""
|
||||
assert True
|
||||
@@ -0,0 +1,32 @@
|
||||
import pytest
|
||||
from invoice_extraction.workflow import (
|
||||
FeedbackRequiredEvent,
|
||||
HumanFeedbackEvent,
|
||||
workflow,
|
||||
)
|
||||
from llama_cloud_fake import FakeLlamaCloudServer
|
||||
|
||||
|
||||
@pytest.mark.parametrize("extraction_mode", ["base", "advanced", "premium"])
|
||||
async def test_invoice_extraction_workflow(
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
fake: FakeLlamaCloudServer,
|
||||
extraction_mode: str,
|
||||
) -> None:
|
||||
"""Exercise files.create + extract.create + wait_for_completion via the fake,
|
||||
then approve through the human-in-the-loop step."""
|
||||
monkeypatch.setenv("LLAMA_CLOUD_API_KEY", "fake-api-key")
|
||||
handler = workflow.run(
|
||||
path="tests/files/test.pdf",
|
||||
extraction_mode=extraction_mode,
|
||||
)
|
||||
feedback_event: FeedbackRequiredEvent | None = None
|
||||
async for ev in handler.stream_events():
|
||||
if isinstance(ev, FeedbackRequiredEvent):
|
||||
feedback_event = ev
|
||||
handler.ctx.send_event(HumanFeedbackEvent(approved=True))
|
||||
break
|
||||
result = await handler
|
||||
assert feedback_event is not None
|
||||
assert isinstance(feedback_event.extraction_result, str)
|
||||
assert result == feedback_event.extraction_result
|
||||
Reference in New Issue
Block a user