cocoindex 0.1.46__tar.gz → 0.1.48__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cocoindex-0.1.46 → cocoindex-0.1.48}/Cargo.lock +1 -1
- {cocoindex-0.1.46 → cocoindex-0.1.48}/Cargo.toml +1 -1
- {cocoindex-0.1.46 → cocoindex-0.1.48}/PKG-INFO +1 -1
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/main.py +14 -12
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding_qdrant/main.py +8 -10
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/storages.py +9 -2
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/factory_bases.rs +9 -3
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/registration.rs +2 -2
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/neo4j.rs +4 -3
- cocoindex-0.1.48/src/ops/storages/qdrant.rs +554 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/components.rs +10 -8
- cocoindex-0.1.46/src/ops/storages/qdrant.rs +0 -437
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.cargo/config.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.env.lib_debug +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/ISSUE_TEMPLATE//360/237/220/233-bug-report.md" +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/ISSUE_TEMPLATE//360/237/222/241-feature-request.md" +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/scripts/update_version.sh +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/workflows/CI.yml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/workflows/_test.yml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/workflows/docs.yml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/workflows/release.yml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.gitignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/.vscode/settings.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/CODE_OF_CONDUCT.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/CONTRIBUTING.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/LICENSE +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/dev/neo4j.yaml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/dev/postgres.yaml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/.gitignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/about/community.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/about/contributing.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/ai/llm.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/basics.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/cli.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/custom_function.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/data_example.svg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/data_types.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/flow_def.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/flow_example.svg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/flow_methods.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/settings.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/getting_started/installation.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/getting_started/markdown_files.zip +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/getting_started/overview.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/getting_started/quickstart.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/ops/functions.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/ops/sources.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/ops/storages.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/query.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docusaurus.config.ts +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/package.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/sidebars.ts +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/src/components/HomepageFeatures/index.tsx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/src/components/HomepageFeatures/styles.module.css +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/src/css/custom.css +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/src/theme/Root.js +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/static/.nojekyll +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/static/img/docusaurus.png +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/static/img/favicon.ico +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/static/img/icon.svg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/static/robots.txt +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/tsconfig.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/yarn.lock +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/amazon_s3_embedding/.env.example +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/amazon_s3_embedding/.gitignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/amazon_s3_embedding/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/amazon_s3_embedding/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/amazon_s3_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/code_embedding/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/code_embedding/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/code_embedding/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/code_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/docs_to_knowledge_graph/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/docs_to_knowledge_graph/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/docs_to_knowledge_graph/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/docs_to_knowledge_graph/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/.dockerignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/compose.yaml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/dockerfile +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/files/1810.04805v2.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/requirements.txt +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/gdrive_text_embedding/.env.example +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/gdrive_text_embedding/.gitignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/gdrive_text_embedding/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/gdrive_text_embedding/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/gdrive_text_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/.gitignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/index.html +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/package-lock.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/package.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/src/App.jsx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/src/main.jsx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/src/style.css +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/vite.config.js +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/img/cat1.jpeg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/img/dog1.jpeg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/img/elephant1.jpg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/img/giraffe.jpg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/requirements.txt +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/manuals/array.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/manuals/base64.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/manuals/copy.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/manuals/glob.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/pdf_files/1706.03762v7.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/pdf_files/1810.04805v2.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/pdf_files/rfc8259.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/img/cocoinsight.png +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/img/neo4j.png +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p1.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p2.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p3.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p4.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p5.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p6.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p7.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p8.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p9.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/Text_Embedding.ipynb +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/markdown_files/1706.03762v7.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/markdown_files/1810.04805v2.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/markdown_files/rfc8259.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding_qdrant/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding_qdrant/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding_qdrant/markdown_files/rfc8259.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding_qdrant/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/__init__.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/auth_registry.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/cli.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/convert.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/flow.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/functions.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/index.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/lib.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/llm.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/op.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/py.typed +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/query.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/runtime.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/setting.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/setup.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/sources.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/tests/__init__.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/tests/test_convert.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/typing.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/utils.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/ruff.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/duration.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/field_attrs.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/json_schema.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/schema.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/spec.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/value.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/builder/analyzed_flow.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/builder/analyzer.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/builder/flow_builder.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/builder/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/builder/plan.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/db_tracking.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/db_tracking_setup.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/dumper.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/evaluator.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/indexing_status.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/live_updater.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/memoization.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/query.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/row_indexer.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/source_indexer.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/stats.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/lib.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/lib_context.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/llm/anthropic.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/llm/gemini.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/llm/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/llm/ollama.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/llm/openai.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/functions/extract_by_llm.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/functions/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/functions/parse_json.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/functions/split_recursively.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/interface.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/py_factory.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/registry.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/sdk.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/sources/amazon_s3.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/sources/google_drive.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/sources/local_file.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/sources/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/kuzu.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/postgres.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/shared/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/shared/property_graph.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/shared/table_columns.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/prelude.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/py/convert.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/py/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/server.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/service/error.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/service/flows.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/service/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/service/search.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/settings.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/auth_registry.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/db_metadata.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/driver.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/states.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/db.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/fingerprint.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/immutable.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/retryable.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/yaml_ser.rs +0 -0
@@ -12,13 +12,16 @@ from fastapi import FastAPI, Query
|
|
12
12
|
from fastapi.middleware.cors import CORSMiddleware
|
13
13
|
from fastapi.staticfiles import StaticFiles
|
14
14
|
from qdrant_client import QdrantClient
|
15
|
+
from typing import Any
|
15
16
|
|
16
17
|
from PIL import Image
|
17
18
|
from transformers import CLIPModel, CLIPProcessor
|
18
19
|
|
19
20
|
|
20
|
-
|
21
|
+
QDRANT_URL = os.getenv("QDRANT_URL", "http://localhost:6334/")
|
22
|
+
QDRANT_COLLECTION = "ImageSearch"
|
21
23
|
CLIP_MODEL_NAME = "openai/clip-vit-large-patch14"
|
24
|
+
CLIP_MODEL_DIMENSION = 768
|
22
25
|
|
23
26
|
|
24
27
|
@functools.cache
|
@@ -40,7 +43,9 @@ def embed_query(text: str) -> list[float]:
|
|
40
43
|
|
41
44
|
|
42
45
|
@cocoindex.op.function(cache=True, behavior_version=1, gpu=True)
|
43
|
-
def embed_image(
|
46
|
+
def embed_image(
|
47
|
+
img_bytes: bytes,
|
48
|
+
) -> cocoindex.Vector[cocoindex.Float32, Literal[CLIP_MODEL_DIMENSION]]:
|
44
49
|
"""
|
45
50
|
Convert image to embedding using CLIP model.
|
46
51
|
"""
|
@@ -56,7 +61,7 @@ def embed_image(img_bytes: bytes) -> cocoindex.Vector[cocoindex.Float32, Literal
|
|
56
61
|
@cocoindex.flow_def(name="ImageObjectEmbedding")
|
57
62
|
def image_object_embedding_flow(
|
58
63
|
flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope
|
59
|
-
):
|
64
|
+
) -> None:
|
60
65
|
data_scope["images"] = flow_builder.add_source(
|
61
66
|
cocoindex.sources.LocalFile(
|
62
67
|
path="img", included_patterns=["*.jpg", "*.jpeg", "*.png"], binary=True
|
@@ -73,14 +78,11 @@ def image_object_embedding_flow(
|
|
73
78
|
filename=img["filename"],
|
74
79
|
embedding=img["embedding"],
|
75
80
|
)
|
81
|
+
|
76
82
|
img_embeddings.export(
|
77
83
|
"img_embeddings",
|
78
|
-
cocoindex.storages.Qdrant(
|
79
|
-
collection_name="image_search",
|
80
|
-
grpc_url=QDRANT_GRPC_URL,
|
81
|
-
),
|
84
|
+
cocoindex.storages.Qdrant(collection_name=QDRANT_COLLECTION),
|
82
85
|
primary_key_fields=["id"],
|
83
|
-
setup_by_user=True,
|
84
86
|
)
|
85
87
|
|
86
88
|
|
@@ -99,11 +101,11 @@ app.mount("/img", StaticFiles(directory="img"), name="img")
|
|
99
101
|
|
100
102
|
# --- CocoIndex initialization on startup ---
|
101
103
|
@app.on_event("startup")
|
102
|
-
def startup_event():
|
104
|
+
def startup_event() -> None:
|
103
105
|
load_dotenv()
|
104
106
|
cocoindex.init()
|
105
107
|
# Initialize Qdrant client
|
106
|
-
app.state.qdrant_client = QdrantClient(url=
|
108
|
+
app.state.qdrant_client = QdrantClient(url=QDRANT_URL, prefer_grpc=True)
|
107
109
|
app.state.live_updater = cocoindex.FlowLiveUpdater(image_object_embedding_flow)
|
108
110
|
app.state.live_updater.start()
|
109
111
|
|
@@ -112,13 +114,13 @@ def startup_event():
|
|
112
114
|
def search(
|
113
115
|
q: str = Query(..., description="Search query"),
|
114
116
|
limit: int = Query(5, description="Number of results"),
|
115
|
-
):
|
117
|
+
) -> Any:
|
116
118
|
# Get the embedding for the query
|
117
119
|
query_embedding = embed_query(q)
|
118
120
|
|
119
121
|
# Search in Qdrant
|
120
122
|
search_results = app.state.qdrant_client.search(
|
121
|
-
collection_name=
|
123
|
+
collection_name=QDRANT_COLLECTION,
|
122
124
|
query_vector=("embedding", query_embedding),
|
123
125
|
limit=limit,
|
124
126
|
)
|
@@ -1,11 +1,10 @@
|
|
1
1
|
from dotenv import load_dotenv
|
2
2
|
from qdrant_client import QdrantClient
|
3
|
-
from qdrant_client.http.models import Filter, FieldCondition, MatchValue
|
4
3
|
import cocoindex
|
5
4
|
|
6
5
|
# Define Qdrant connection constants
|
7
|
-
|
8
|
-
QDRANT_COLLECTION = "
|
6
|
+
QDRANT_URL = "http://localhost:6334"
|
7
|
+
QDRANT_COLLECTION = "TextEmbedding"
|
9
8
|
|
10
9
|
|
11
10
|
@cocoindex.transform_flow()
|
@@ -26,7 +25,7 @@ def text_to_embedding(
|
|
26
25
|
@cocoindex.flow_def(name="TextEmbeddingWithQdrant")
|
27
26
|
def text_embedding_flow(
|
28
27
|
flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope
|
29
|
-
):
|
28
|
+
) -> None:
|
30
29
|
"""
|
31
30
|
Define an example flow that embeds text into a vector database.
|
32
31
|
"""
|
@@ -57,17 +56,14 @@ def text_embedding_flow(
|
|
57
56
|
|
58
57
|
doc_embeddings.export(
|
59
58
|
"doc_embeddings",
|
60
|
-
cocoindex.storages.Qdrant(
|
61
|
-
collection_name=QDRANT_COLLECTION, grpc_url=QDRANT_GRPC_URL
|
62
|
-
),
|
59
|
+
cocoindex.storages.Qdrant(collection_name=QDRANT_COLLECTION),
|
63
60
|
primary_key_fields=["id"],
|
64
|
-
setup_by_user=True,
|
65
61
|
)
|
66
62
|
|
67
63
|
|
68
|
-
def _main():
|
64
|
+
def _main() -> None:
|
69
65
|
# Initialize Qdrant client
|
70
|
-
client = QdrantClient(url=
|
66
|
+
client = QdrantClient(url=QDRANT_URL, prefer_grpc=True)
|
71
67
|
|
72
68
|
# Run queries in a loop to demonstrate the query capabilities.
|
73
69
|
while True:
|
@@ -87,6 +83,8 @@ def _main():
|
|
87
83
|
for result in search_results:
|
88
84
|
score = result.score
|
89
85
|
payload = result.payload
|
86
|
+
if payload is None:
|
87
|
+
continue
|
90
88
|
print(f"[{score:.3f}] {payload['filename']}")
|
91
89
|
print(f" {payload['text']}")
|
92
90
|
print("---")
|
@@ -16,13 +16,20 @@ class Postgres(op.StorageSpec):
|
|
16
16
|
table_name: str | None = None
|
17
17
|
|
18
18
|
|
19
|
+
@dataclass
|
20
|
+
class QdrantConnection:
|
21
|
+
"""Connection spec for Qdrant."""
|
22
|
+
|
23
|
+
grpc_url: str
|
24
|
+
api_key: str | None = None
|
25
|
+
|
26
|
+
|
19
27
|
@dataclass
|
20
28
|
class Qdrant(op.StorageSpec):
|
21
29
|
"""Storage powered by Qdrant - https://qdrant.tech/."""
|
22
30
|
|
23
31
|
collection_name: str
|
24
|
-
|
25
|
-
api_key: str | None = None
|
32
|
+
connection: AuthEntryReference[QdrantConnection] | None = None
|
26
33
|
|
27
34
|
|
28
35
|
@dataclass
|
@@ -309,6 +309,12 @@ pub trait StorageFactoryBase: ExportTargetFactory + Send + Sync + 'static {
|
|
309
309
|
Vec<(Self::Key, Self::SetupState)>,
|
310
310
|
)>;
|
311
311
|
|
312
|
+
/// Deserialize the setup key from a JSON value.
|
313
|
+
/// You can override this method to provide a custom deserialization logic, e.g. to perform backward compatible deserialization.
|
314
|
+
fn deserialize_setup_key(key: serde_json::Value) -> Result<Self::Key> {
|
315
|
+
Ok(serde_json::from_value(key)?)
|
316
|
+
}
|
317
|
+
|
312
318
|
/// Will not be called if it's setup by user.
|
313
319
|
/// It returns an error if the target only supports setup by user.
|
314
320
|
async fn check_setup_status(
|
@@ -421,7 +427,7 @@ impl<T: StorageFactoryBase> ExportTargetFactory for T {
|
|
421
427
|
existing_states: setup::CombinedState<serde_json::Value>,
|
422
428
|
auth_registry: &Arc<AuthRegistry>,
|
423
429
|
) -> Result<Box<dyn setup::ResourceSetupStatus>> {
|
424
|
-
let key: T::Key =
|
430
|
+
let key: T::Key = Self::deserialize_setup_key(key.clone())?;
|
425
431
|
let desired_state: Option<T::SetupState> = desired_state
|
426
432
|
.map(|v| serde_json::from_value(v.clone()))
|
427
433
|
.transpose()?;
|
@@ -438,12 +444,12 @@ impl<T: StorageFactoryBase> ExportTargetFactory for T {
|
|
438
444
|
}
|
439
445
|
|
440
446
|
fn describe_resource(&self, key: &serde_json::Value) -> Result<String> {
|
441
|
-
let key: T::Key =
|
447
|
+
let key: T::Key = Self::deserialize_setup_key(key.clone())?;
|
442
448
|
StorageFactoryBase::describe_resource(self, &key)
|
443
449
|
}
|
444
450
|
|
445
451
|
fn normalize_setup_key(&self, key: &serde_json::Value) -> Result<serde_json::Value> {
|
446
|
-
let key: T::Key =
|
452
|
+
let key: T::Key = Self::deserialize_setup_key(key.clone())?;
|
447
453
|
Ok(serde_json::to_value(key)?)
|
448
454
|
}
|
449
455
|
|
@@ -3,7 +3,7 @@ use super::{
|
|
3
3
|
storages,
|
4
4
|
};
|
5
5
|
use anyhow::Result;
|
6
|
-
use std::sync::{
|
6
|
+
use std::sync::{LazyLock, RwLock, RwLockReadGuard};
|
7
7
|
|
8
8
|
fn register_executor_factories(registry: &mut ExecutorFactoryRegistry) -> Result<()> {
|
9
9
|
let reqwest_client = reqwest::Client::new();
|
@@ -17,7 +17,7 @@ fn register_executor_factories(registry: &mut ExecutorFactoryRegistry) -> Result
|
|
17
17
|
functions::extract_by_llm::Factory.register(registry)?;
|
18
18
|
|
19
19
|
storages::postgres::Factory::default().register(registry)?;
|
20
|
-
|
20
|
+
storages::qdrant::register(registry)?;
|
21
21
|
storages::kuzu::register(registry, reqwest_client)?;
|
22
22
|
|
23
23
|
storages::neo4j::Factory::new().register(registry)?;
|
@@ -696,6 +696,7 @@ impl components::SetupOperator for SetupComponentOperator {
|
|
696
696
|
type Key = ComponentKey;
|
697
697
|
type State = ComponentState;
|
698
698
|
type SetupState = SetupState;
|
699
|
+
type Context = ();
|
699
700
|
|
700
701
|
fn describe_key(&self, key: &Self::Key) -> String {
|
701
702
|
format!("{} {}", key.kind.describe(), key.name)
|
@@ -724,7 +725,7 @@ impl components::SetupOperator for SetupComponentOperator {
|
|
724
725
|
current == desired
|
725
726
|
}
|
726
727
|
|
727
|
-
async fn create(&self, state: &ComponentState) -> Result<()> {
|
728
|
+
async fn create(&self, state: &ComponentState, _context: &Self::Context) -> Result<()> {
|
728
729
|
let graph = self.graph_pool.get_graph(&self.conn_spec).await?;
|
729
730
|
let key = state.key();
|
730
731
|
let qualifier = CORE_ELEMENT_MATCHER_VAR;
|
@@ -762,7 +763,7 @@ impl components::SetupOperator for SetupComponentOperator {
|
|
762
763
|
Ok(graph.run(query).await?)
|
763
764
|
}
|
764
765
|
|
765
|
-
async fn delete(&self, key: &ComponentKey) -> Result<()> {
|
766
|
+
async fn delete(&self, key: &ComponentKey, _context: &Self::Context) -> Result<()> {
|
766
767
|
let graph = self.graph_pool.get_graph(&self.conn_spec).await?;
|
767
768
|
let query = neo4rs::query(&format!(
|
768
769
|
"DROP {kind} {name} IF EXISTS",
|
@@ -1131,7 +1132,7 @@ impl StorageFactoryBase for Factory {
|
|
1131
1132
|
}
|
1132
1133
|
}
|
1133
1134
|
|
1134
|
-
apply_component_changes(components).await?;
|
1135
|
+
apply_component_changes(components, &()).await?;
|
1135
1136
|
Ok(())
|
1136
1137
|
}
|
1137
1138
|
}
|