cocoindex 0.1.46__tar.gz → 0.1.47__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.47}/Cargo.lock +1 -1
- {cocoindex-0.1.46 → cocoindex-0.1.47}/Cargo.toml +1 -1
- {cocoindex-0.1.46 → cocoindex-0.1.47}/PKG-INFO +1 -1
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/main.py +15 -8
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding_qdrant/main.py +12 -7
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/storages.py +9 -2
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/factory_bases.rs +9 -3
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/registration.rs +2 -2
- cocoindex-0.1.47/src/ops/storages/qdrant.rs +543 -0
- cocoindex-0.1.46/src/ops/storages/qdrant.rs +0 -437
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.cargo/config.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.env.lib_debug +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.github/ISSUE_TEMPLATE//360/237/220/233-bug-report.md" +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.github/ISSUE_TEMPLATE//360/237/222/241-feature-request.md" +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.github/scripts/update_version.sh +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.github/workflows/CI.yml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.github/workflows/_test.yml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.github/workflows/docs.yml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.github/workflows/release.yml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.gitignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/.vscode/settings.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/CODE_OF_CONDUCT.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/CONTRIBUTING.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/LICENSE +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/dev/neo4j.yaml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/dev/postgres.yaml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/.gitignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/about/community.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/about/contributing.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/ai/llm.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/core/basics.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/core/cli.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/core/custom_function.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/core/data_example.svg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/core/data_types.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/core/flow_def.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/core/flow_example.svg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/core/flow_methods.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/core/settings.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/getting_started/installation.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/getting_started/markdown_files.zip +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/getting_started/overview.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/getting_started/quickstart.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/ops/functions.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/ops/sources.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/ops/storages.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docs/query.mdx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/docusaurus.config.ts +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/package.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/sidebars.ts +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/src/components/HomepageFeatures/index.tsx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/src/components/HomepageFeatures/styles.module.css +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/src/css/custom.css +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/src/theme/Root.js +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/static/.nojekyll +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/static/img/docusaurus.png +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/static/img/favicon.ico +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/static/img/icon.svg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/static/robots.txt +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/tsconfig.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/docs/yarn.lock +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/amazon_s3_embedding/.env.example +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/amazon_s3_embedding/.gitignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/amazon_s3_embedding/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/amazon_s3_embedding/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/amazon_s3_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/code_embedding/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/code_embedding/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/code_embedding/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/code_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/docs_to_knowledge_graph/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/docs_to_knowledge_graph/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/docs_to_knowledge_graph/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/docs_to_knowledge_graph/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/fastapi_server_docker/.dockerignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/fastapi_server_docker/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/fastapi_server_docker/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/fastapi_server_docker/compose.yaml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/fastapi_server_docker/dockerfile +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/fastapi_server_docker/files/1810.04805v2.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/fastapi_server_docker/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/fastapi_server_docker/requirements.txt +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/gdrive_text_embedding/.env.example +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/gdrive_text_embedding/.gitignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/gdrive_text_embedding/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/gdrive_text_embedding/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/gdrive_text_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/frontend/.gitignore +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/frontend/index.html +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/frontend/package-lock.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/frontend/package.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/frontend/src/App.jsx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/frontend/src/main.jsx +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/frontend/src/style.css +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/frontend/vite.config.js +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/img/cat1.jpeg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/img/dog1.jpeg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/img/elephant1.jpg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/img/giraffe.jpg +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/image_search/requirements.txt +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/manuals_llm_extraction/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/manuals_llm_extraction/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/manuals_llm_extraction/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/manuals_llm_extraction/manuals/array.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/manuals_llm_extraction/manuals/base64.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/manuals_llm_extraction/manuals/copy.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/manuals_llm_extraction/manuals/glob.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/manuals_llm_extraction/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/pdf_embedding/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/pdf_embedding/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/pdf_embedding/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/pdf_embedding/pdf_files/1706.03762v7.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/pdf_embedding/pdf_files/1810.04805v2.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/pdf_embedding/pdf_files/rfc8259.pdf +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/pdf_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/img/cocoinsight.png +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/img/neo4j.png +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/products/p1.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/products/p2.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/products/p3.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/products/p4.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/products/p5.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/products/p6.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/products/p7.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/products/p8.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/products/p9.json +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/product_recommendation/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding/Text_Embedding.ipynb +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding/main.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding/markdown_files/1706.03762v7.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding/markdown_files/1810.04805v2.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding/markdown_files/rfc8259.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding_qdrant/.env +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding_qdrant/README.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding_qdrant/markdown_files/rfc8259.md +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/examples/text_embedding_qdrant/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/pyproject.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/__init__.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/auth_registry.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/cli.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/convert.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/flow.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/functions.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/index.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/lib.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/llm.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/op.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/py.typed +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/query.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/runtime.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/setting.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/setup.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/sources.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/tests/__init__.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/tests/test_convert.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/typing.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/python/cocoindex/utils.py +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/ruff.toml +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/base/duration.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/base/field_attrs.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/base/json_schema.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/base/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/base/schema.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/base/spec.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/base/value.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/builder/analyzed_flow.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/builder/analyzer.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/builder/flow_builder.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/builder/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/builder/plan.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/db_tracking.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/db_tracking_setup.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/dumper.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/evaluator.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/indexing_status.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/live_updater.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/memoization.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/query.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/row_indexer.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/source_indexer.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/execution/stats.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/lib.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/lib_context.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/llm/anthropic.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/llm/gemini.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/llm/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/llm/ollama.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/llm/openai.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/functions/extract_by_llm.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/functions/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/functions/parse_json.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/functions/split_recursively.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/interface.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/py_factory.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/registry.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/sdk.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/sources/amazon_s3.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/sources/google_drive.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/sources/local_file.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/sources/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/storages/kuzu.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/storages/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/storages/neo4j.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/storages/postgres.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/storages/shared/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/storages/shared/property_graph.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/ops/storages/shared/table_columns.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/prelude.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/py/convert.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/py/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/server.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/service/error.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/service/flows.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/service/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/service/search.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/settings.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/setup/auth_registry.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/setup/components.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/setup/db_metadata.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/setup/driver.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/setup/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/setup/states.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/utils/db.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/utils/fingerprint.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/utils/immutable.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/utils/mod.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/utils/retryable.rs +0 -0
- {cocoindex-0.1.46 → cocoindex-0.1.47}/src/utils/yaml_ser.rs +0 -0
@@ -17,8 +17,10 @@ from PIL import Image
|
|
17
17
|
from transformers import CLIPModel, CLIPProcessor
|
18
18
|
|
19
19
|
|
20
|
-
|
20
|
+
QDRANT_URL = os.getenv("QDRANT_URL", "http://localhost:6334/")
|
21
|
+
QDRANT_COLLECTION = "cocoindex_image_search"
|
21
22
|
CLIP_MODEL_NAME = "openai/clip-vit-large-patch14"
|
23
|
+
CLIP_MODEL_DIMENSION = 768
|
22
24
|
|
23
25
|
|
24
26
|
@functools.cache
|
@@ -40,7 +42,9 @@ def embed_query(text: str) -> list[float]:
|
|
40
42
|
|
41
43
|
|
42
44
|
@cocoindex.op.function(cache=True, behavior_version=1, gpu=True)
|
43
|
-
def embed_image(
|
45
|
+
def embed_image(
|
46
|
+
img_bytes: bytes,
|
47
|
+
) -> cocoindex.Vector[cocoindex.Float32, Literal[CLIP_MODEL_DIMENSION]]:
|
44
48
|
"""
|
45
49
|
Convert image to embedding using CLIP model.
|
46
50
|
"""
|
@@ -56,7 +60,7 @@ def embed_image(img_bytes: bytes) -> cocoindex.Vector[cocoindex.Float32, Literal
|
|
56
60
|
@cocoindex.flow_def(name="ImageObjectEmbedding")
|
57
61
|
def image_object_embedding_flow(
|
58
62
|
flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope
|
59
|
-
):
|
63
|
+
) -> None:
|
60
64
|
data_scope["images"] = flow_builder.add_source(
|
61
65
|
cocoindex.sources.LocalFile(
|
62
66
|
path="img", included_patterns=["*.jpg", "*.jpeg", "*.png"], binary=True
|
@@ -73,14 +77,17 @@ def image_object_embedding_flow(
|
|
73
77
|
filename=img["filename"],
|
74
78
|
embedding=img["embedding"],
|
75
79
|
)
|
80
|
+
|
81
|
+
qdrant_conn = cocoindex.add_auth_entry(
|
82
|
+
"Qdrant", cocoindex.storages.QdrantConnection(url=QDRANT_URL)
|
83
|
+
)
|
76
84
|
img_embeddings.export(
|
77
85
|
"img_embeddings",
|
78
86
|
cocoindex.storages.Qdrant(
|
79
|
-
|
80
|
-
|
87
|
+
connection=qdrant_conn,
|
88
|
+
collection_name=QDRANT_COLLECTION,
|
81
89
|
),
|
82
90
|
primary_key_fields=["id"],
|
83
|
-
setup_by_user=True,
|
84
91
|
)
|
85
92
|
|
86
93
|
|
@@ -103,7 +110,7 @@ def startup_event():
|
|
103
110
|
load_dotenv()
|
104
111
|
cocoindex.init()
|
105
112
|
# Initialize Qdrant client
|
106
|
-
app.state.qdrant_client = QdrantClient(url=
|
113
|
+
app.state.qdrant_client = QdrantClient(url=QDRANT_URL, prefer_grpc=True)
|
107
114
|
app.state.live_updater = cocoindex.FlowLiveUpdater(image_object_embedding_flow)
|
108
115
|
app.state.live_updater.start()
|
109
116
|
|
@@ -118,7 +125,7 @@ def search(
|
|
118
125
|
|
119
126
|
# Search in Qdrant
|
120
127
|
search_results = app.state.qdrant_client.search(
|
121
|
-
collection_name=
|
128
|
+
collection_name=QDRANT_COLLECTION,
|
122
129
|
query_vector=("embedding", query_embedding),
|
123
130
|
limit=limit,
|
124
131
|
)
|
@@ -4,8 +4,8 @@ from qdrant_client.http.models import Filter, FieldCondition, MatchValue
|
|
4
4
|
import cocoindex
|
5
5
|
|
6
6
|
# Define Qdrant connection constants
|
7
|
-
|
8
|
-
QDRANT_COLLECTION = "
|
7
|
+
QDRANT_URL = "http://localhost:6334"
|
8
|
+
QDRANT_COLLECTION = "cocoindex_text_embedding"
|
9
9
|
|
10
10
|
|
11
11
|
@cocoindex.transform_flow()
|
@@ -26,7 +26,7 @@ def text_to_embedding(
|
|
26
26
|
@cocoindex.flow_def(name="TextEmbeddingWithQdrant")
|
27
27
|
def text_embedding_flow(
|
28
28
|
flow_builder: cocoindex.FlowBuilder, data_scope: cocoindex.DataScope
|
29
|
-
):
|
29
|
+
) -> None:
|
30
30
|
"""
|
31
31
|
Define an example flow that embeds text into a vector database.
|
32
32
|
"""
|
@@ -55,19 +55,22 @@ def text_embedding_flow(
|
|
55
55
|
text_embedding=chunk["embedding"],
|
56
56
|
)
|
57
57
|
|
58
|
+
qdrant_conn = cocoindex.add_auth_entry(
|
59
|
+
"Qdrant", cocoindex.storages.QdrantConnection(url=QDRANT_URL)
|
60
|
+
)
|
58
61
|
doc_embeddings.export(
|
59
62
|
"doc_embeddings",
|
60
63
|
cocoindex.storages.Qdrant(
|
61
|
-
|
64
|
+
connection=qdrant_conn,
|
65
|
+
collection_name=QDRANT_COLLECTION,
|
62
66
|
),
|
63
67
|
primary_key_fields=["id"],
|
64
|
-
setup_by_user=True,
|
65
68
|
)
|
66
69
|
|
67
70
|
|
68
|
-
def _main():
|
71
|
+
def _main() -> None:
|
69
72
|
# Initialize Qdrant client
|
70
|
-
client = QdrantClient(url=
|
73
|
+
client = QdrantClient(url=QDRANT_URL, prefer_grpc=True)
|
71
74
|
|
72
75
|
# Run queries in a loop to demonstrate the query capabilities.
|
73
76
|
while True:
|
@@ -87,6 +90,8 @@ def _main():
|
|
87
90
|
for result in search_results:
|
88
91
|
score = result.score
|
89
92
|
payload = result.payload
|
93
|
+
if payload is None:
|
94
|
+
continue
|
90
95
|
print(f"[{score:.3f}] {payload['filename']}")
|
91
96
|
print(f" {payload['text']}")
|
92
97
|
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
|
+
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
|
|
31
|
+
connection: AuthEntryReference[QdrantConnection]
|
23
32
|
collection_name: str
|
24
|
-
grpc_url: str = "http://localhost:6334/"
|
25
|
-
api_key: str | 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)?;
|