From 90761a9f789bb7628d4faf40ae900d93f16065b7 Mon Sep 17 00:00:00 2001 From: Sourabh Desai <sourabhdesai@gmail.com> Date: Mon, 17 Feb 2025 10:17:45 -0800 Subject: [PATCH] Image Metadata Test + Sync Implementation (#17844) * include some metadata when returning image node from llamacloud retriever * version bump * add tests + sync implementation --- .../indices/managed/llama_cloud/api_utils.py | 7 +++- .../pyproject.toml | 2 +- .../tests/data/Simple PDF Slides.pdf | Bin 0 -> 18270 bytes .../tests/test_indices_managed_llama_cloud.py | 35 +++++++++++++++++- 4 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/tests/data/Simple PDF Slides.pdf diff --git a/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/llama_index/indices/managed/llama_cloud/api_utils.py b/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/llama_index/indices/managed/llama_cloud/api_utils.py index e90b68b9a5..cb76bfaabc 100644 --- a/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/llama_index/indices/managed/llama_cloud/api_utils.py +++ b/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/llama_index/indices/managed/llama_cloud/api_utils.py @@ -171,8 +171,13 @@ def image_nodes_to_node_with_score( project_id=project_id, ) image_base64 = base64.b64encode(image_bytes).decode("utf-8") + image_node_metadata: Dict[str, Any] = { + "file_id": raw_image_node.node.file_id, + "page_index": raw_image_node.node.page_index, + } image_node_with_score = NodeWithScore( - node=ImageNode(image=image_base64), score=raw_image_node.score + node=ImageNode(image=image_base64, metadata=image_node_metadata), + score=raw_image_node.score, ) image_nodes.append(image_node_with_score) return image_nodes diff --git a/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/pyproject.toml b/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/pyproject.toml index 298588c94c..157905fb4c 100644 --- a/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/pyproject.toml +++ b/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/pyproject.toml @@ -34,7 +34,7 @@ exclude = ["**/BUILD"] license = "MIT" name = "llama-index-indices-managed-llama-cloud" readme = "README.md" -version = "0.6.6" +version = "0.6.7" [tool.poetry.dependencies] python = ">=3.9,<4.0" diff --git a/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/tests/data/Simple PDF Slides.pdf b/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/tests/data/Simple PDF Slides.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5cb1ad004311bbb3fd00293f664376b757936178 GIT binary patch literal 18270 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 literal 0 HcmV?d00001 diff --git a/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/tests/test_indices_managed_llama_cloud.py b/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/tests/test_indices_managed_llama_cloud.py index 09afc9de8f..be70b103c5 100644 --- a/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/tests/test_indices_managed_llama_cloud.py +++ b/llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/tests/test_indices_managed_llama_cloud.py @@ -5,13 +5,14 @@ from llama_cloud import ( PipelineFileCreate, ProjectCreate, CompositeRetrievalMode, + LlamaParseParameters, ) from llama_index.indices.managed.llama_cloud import ( LlamaCloudIndex, LlamaCloudCompositeRetriever, ) from llama_index.embeddings.openai import OpenAIEmbedding -from llama_index.core.schema import Document +from llama_index.core.schema import Document, ImageNode import os import pytest from uuid import uuid4 @@ -35,6 +36,7 @@ def remote_file() -> Tuple[str, str]: def _setup_empty_index( client: LlamaCloud, + multi_modal_index: bool = False, ) -> LlamaCloudIndex: # create project if it doesn't exist project_create = ProjectCreate(name=project_name) @@ -47,6 +49,7 @@ def _setup_empty_index( name="test_empty_index_" + str(uuid4()), embedding_config={"type": "OPENAI_EMBEDDING", "component": OpenAIEmbedding()}, transform_config=AutoTransformConfig(), + llama_parse_parameters=LlamaParseParameters(take_screenshot=multi_modal_index), ) return client.pipelines.upsert_pipeline( project_id=project.id, request=pipeline_create @@ -279,6 +282,36 @@ def test_index_from_documents(): assert "3" not in docs +@pytest.mark.skipif( + not base_url or not api_key, reason="No platform base url or api key set" +) +@pytest.mark.skipif(not openai_api_key, reason="No openai api key set") +@pytest.mark.integration() +def test_image_retrieval() -> None: + pipeline = _setup_empty_index( + LlamaCloud(token=api_key, base_url=base_url), multi_modal_index=True + ) + + index = LlamaCloudIndex( + name=pipeline.name, + project_name=project_name, + api_key=api_key, + base_url=base_url, + ) + + file_path = "llama-index-integrations/indices/llama-index-indices-managed-llama-cloud/tests/data/Simple PDF Slides.pdf" + file_id = index.upload_file(file_path, wait_for_ingestion=True) + + retriever = index.as_retriever(retrieve_image_nodes=True) + nodes = retriever.retrieve("1") + assert len(nodes) > 0 + + image_nodes = [n.node for n in nodes if isinstance(n.node, ImageNode)] + assert len(image_nodes) > 0 + assert all(n.metadata["file_id"] == file_id for n in image_nodes) + assert all(n.metadata["page_index"] >= 0 for n in image_nodes) + + @pytest.mark.skipif( not base_url or not api_key, reason="No platform base url or api key set" ) -- GitLab