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.
Files changed (241) hide show
  1. {cocoindex-0.1.46 → cocoindex-0.1.48}/Cargo.lock +1 -1
  2. {cocoindex-0.1.46 → cocoindex-0.1.48}/Cargo.toml +1 -1
  3. {cocoindex-0.1.46 → cocoindex-0.1.48}/PKG-INFO +1 -1
  4. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/main.py +14 -12
  5. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding_qdrant/main.py +8 -10
  6. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/storages.py +9 -2
  7. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/factory_bases.rs +9 -3
  8. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/registration.rs +2 -2
  9. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/neo4j.rs +4 -3
  10. cocoindex-0.1.48/src/ops/storages/qdrant.rs +554 -0
  11. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/components.rs +10 -8
  12. cocoindex-0.1.46/src/ops/storages/qdrant.rs +0 -437
  13. {cocoindex-0.1.46 → cocoindex-0.1.48}/.cargo/config.toml +0 -0
  14. {cocoindex-0.1.46 → cocoindex-0.1.48}/.env.lib_debug +0 -0
  15. {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/ISSUE_TEMPLATE//360/237/220/233-bug-report.md" +0 -0
  16. {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/ISSUE_TEMPLATE//360/237/222/241-feature-request.md" +0 -0
  17. {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/scripts/update_version.sh +0 -0
  18. {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/workflows/CI.yml +0 -0
  19. {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/workflows/_test.yml +0 -0
  20. {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/workflows/docs.yml +0 -0
  21. {cocoindex-0.1.46 → cocoindex-0.1.48}/.github/workflows/release.yml +0 -0
  22. {cocoindex-0.1.46 → cocoindex-0.1.48}/.gitignore +0 -0
  23. {cocoindex-0.1.46 → cocoindex-0.1.48}/.vscode/settings.json +0 -0
  24. {cocoindex-0.1.46 → cocoindex-0.1.48}/CODE_OF_CONDUCT.md +0 -0
  25. {cocoindex-0.1.46 → cocoindex-0.1.48}/CONTRIBUTING.md +0 -0
  26. {cocoindex-0.1.46 → cocoindex-0.1.48}/LICENSE +0 -0
  27. {cocoindex-0.1.46 → cocoindex-0.1.48}/README.md +0 -0
  28. {cocoindex-0.1.46 → cocoindex-0.1.48}/dev/neo4j.yaml +0 -0
  29. {cocoindex-0.1.46 → cocoindex-0.1.48}/dev/postgres.yaml +0 -0
  30. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/.gitignore +0 -0
  31. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/README.md +0 -0
  32. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/about/community.md +0 -0
  33. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/about/contributing.md +0 -0
  34. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/ai/llm.mdx +0 -0
  35. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/basics.md +0 -0
  36. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/cli.mdx +0 -0
  37. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/custom_function.mdx +0 -0
  38. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/data_example.svg +0 -0
  39. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/data_types.mdx +0 -0
  40. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/flow_def.mdx +0 -0
  41. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/flow_example.svg +0 -0
  42. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/flow_methods.mdx +0 -0
  43. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/core/settings.mdx +0 -0
  44. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/getting_started/installation.md +0 -0
  45. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/getting_started/markdown_files.zip +0 -0
  46. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/getting_started/overview.md +0 -0
  47. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/getting_started/quickstart.md +0 -0
  48. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/ops/functions.md +0 -0
  49. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/ops/sources.md +0 -0
  50. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/ops/storages.md +0 -0
  51. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docs/query.mdx +0 -0
  52. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/docusaurus.config.ts +0 -0
  53. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/package.json +0 -0
  54. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/sidebars.ts +0 -0
  55. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/src/components/HomepageFeatures/index.tsx +0 -0
  56. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/src/components/HomepageFeatures/styles.module.css +0 -0
  57. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/src/css/custom.css +0 -0
  58. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/src/theme/Root.js +0 -0
  59. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/static/.nojekyll +0 -0
  60. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/static/img/docusaurus.png +0 -0
  61. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/static/img/favicon.ico +0 -0
  62. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/static/img/icon.svg +0 -0
  63. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/static/robots.txt +0 -0
  64. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/tsconfig.json +0 -0
  65. {cocoindex-0.1.46 → cocoindex-0.1.48}/docs/yarn.lock +0 -0
  66. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/amazon_s3_embedding/.env.example +0 -0
  67. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/amazon_s3_embedding/.gitignore +0 -0
  68. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/amazon_s3_embedding/README.md +0 -0
  69. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/amazon_s3_embedding/main.py +0 -0
  70. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/amazon_s3_embedding/pyproject.toml +0 -0
  71. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/code_embedding/.env +0 -0
  72. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/code_embedding/README.md +0 -0
  73. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/code_embedding/main.py +0 -0
  74. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/code_embedding/pyproject.toml +0 -0
  75. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/docs_to_knowledge_graph/.env +0 -0
  76. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/docs_to_knowledge_graph/README.md +0 -0
  77. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/docs_to_knowledge_graph/main.py +0 -0
  78. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/docs_to_knowledge_graph/pyproject.toml +0 -0
  79. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/.dockerignore +0 -0
  80. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/.env +0 -0
  81. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/README.md +0 -0
  82. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/compose.yaml +0 -0
  83. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/dockerfile +0 -0
  84. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/files/1810.04805v2.md +0 -0
  85. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/main.py +0 -0
  86. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/fastapi_server_docker/requirements.txt +0 -0
  87. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/gdrive_text_embedding/.env.example +0 -0
  88. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/gdrive_text_embedding/.gitignore +0 -0
  89. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/gdrive_text_embedding/README.md +0 -0
  90. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/gdrive_text_embedding/main.py +0 -0
  91. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/gdrive_text_embedding/pyproject.toml +0 -0
  92. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/.env +0 -0
  93. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/README.md +0 -0
  94. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/.gitignore +0 -0
  95. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/index.html +0 -0
  96. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/package-lock.json +0 -0
  97. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/package.json +0 -0
  98. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/src/App.jsx +0 -0
  99. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/src/main.jsx +0 -0
  100. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/src/style.css +0 -0
  101. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/frontend/vite.config.js +0 -0
  102. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/img/cat1.jpeg +0 -0
  103. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/img/dog1.jpeg +0 -0
  104. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/img/elephant1.jpg +0 -0
  105. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/img/giraffe.jpg +0 -0
  106. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/pyproject.toml +0 -0
  107. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/image_search/requirements.txt +0 -0
  108. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/.env +0 -0
  109. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/README.md +0 -0
  110. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/main.py +0 -0
  111. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/manuals/array.pdf +0 -0
  112. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/manuals/base64.pdf +0 -0
  113. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/manuals/copy.pdf +0 -0
  114. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/manuals/glob.pdf +0 -0
  115. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/manuals_llm_extraction/pyproject.toml +0 -0
  116. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/.env +0 -0
  117. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/README.md +0 -0
  118. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/main.py +0 -0
  119. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/pdf_files/1706.03762v7.pdf +0 -0
  120. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/pdf_files/1810.04805v2.pdf +0 -0
  121. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/pdf_files/rfc8259.pdf +0 -0
  122. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/pdf_embedding/pyproject.toml +0 -0
  123. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/.env +0 -0
  124. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/README.md +0 -0
  125. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/img/cocoinsight.png +0 -0
  126. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/img/neo4j.png +0 -0
  127. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/main.py +0 -0
  128. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p1.json +0 -0
  129. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p2.json +0 -0
  130. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p3.json +0 -0
  131. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p4.json +0 -0
  132. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p5.json +0 -0
  133. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p6.json +0 -0
  134. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p7.json +0 -0
  135. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p8.json +0 -0
  136. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/products/p9.json +0 -0
  137. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/product_recommendation/pyproject.toml +0 -0
  138. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/.env +0 -0
  139. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/README.md +0 -0
  140. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/Text_Embedding.ipynb +0 -0
  141. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/main.py +0 -0
  142. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/markdown_files/1706.03762v7.md +0 -0
  143. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/markdown_files/1810.04805v2.md +0 -0
  144. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/markdown_files/rfc8259.md +0 -0
  145. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding/pyproject.toml +0 -0
  146. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding_qdrant/.env +0 -0
  147. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding_qdrant/README.md +0 -0
  148. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding_qdrant/markdown_files/rfc8259.md +0 -0
  149. {cocoindex-0.1.46 → cocoindex-0.1.48}/examples/text_embedding_qdrant/pyproject.toml +0 -0
  150. {cocoindex-0.1.46 → cocoindex-0.1.48}/pyproject.toml +0 -0
  151. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/__init__.py +0 -0
  152. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/auth_registry.py +0 -0
  153. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/cli.py +0 -0
  154. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/convert.py +0 -0
  155. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/flow.py +0 -0
  156. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/functions.py +0 -0
  157. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/index.py +0 -0
  158. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/lib.py +0 -0
  159. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/llm.py +0 -0
  160. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/op.py +0 -0
  161. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/py.typed +0 -0
  162. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/query.py +0 -0
  163. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/runtime.py +0 -0
  164. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/setting.py +0 -0
  165. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/setup.py +0 -0
  166. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/sources.py +0 -0
  167. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/tests/__init__.py +0 -0
  168. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/tests/test_convert.py +0 -0
  169. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/typing.py +0 -0
  170. {cocoindex-0.1.46 → cocoindex-0.1.48}/python/cocoindex/utils.py +0 -0
  171. {cocoindex-0.1.46 → cocoindex-0.1.48}/ruff.toml +0 -0
  172. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/duration.rs +0 -0
  173. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/field_attrs.rs +0 -0
  174. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/json_schema.rs +0 -0
  175. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/mod.rs +0 -0
  176. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/schema.rs +0 -0
  177. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/spec.rs +0 -0
  178. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/base/value.rs +0 -0
  179. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/builder/analyzed_flow.rs +0 -0
  180. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/builder/analyzer.rs +0 -0
  181. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/builder/flow_builder.rs +0 -0
  182. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/builder/mod.rs +0 -0
  183. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/builder/plan.rs +0 -0
  184. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/db_tracking.rs +0 -0
  185. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/db_tracking_setup.rs +0 -0
  186. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/dumper.rs +0 -0
  187. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/evaluator.rs +0 -0
  188. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/indexing_status.rs +0 -0
  189. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/live_updater.rs +0 -0
  190. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/memoization.rs +0 -0
  191. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/mod.rs +0 -0
  192. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/query.rs +0 -0
  193. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/row_indexer.rs +0 -0
  194. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/source_indexer.rs +0 -0
  195. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/execution/stats.rs +0 -0
  196. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/lib.rs +0 -0
  197. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/lib_context.rs +0 -0
  198. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/llm/anthropic.rs +0 -0
  199. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/llm/gemini.rs +0 -0
  200. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/llm/mod.rs +0 -0
  201. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/llm/ollama.rs +0 -0
  202. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/llm/openai.rs +0 -0
  203. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/functions/extract_by_llm.rs +0 -0
  204. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/functions/mod.rs +0 -0
  205. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/functions/parse_json.rs +0 -0
  206. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/functions/split_recursively.rs +0 -0
  207. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/interface.rs +0 -0
  208. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/mod.rs +0 -0
  209. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/py_factory.rs +0 -0
  210. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/registry.rs +0 -0
  211. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/sdk.rs +0 -0
  212. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/sources/amazon_s3.rs +0 -0
  213. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/sources/google_drive.rs +0 -0
  214. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/sources/local_file.rs +0 -0
  215. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/sources/mod.rs +0 -0
  216. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/kuzu.rs +0 -0
  217. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/mod.rs +0 -0
  218. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/postgres.rs +0 -0
  219. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/shared/mod.rs +0 -0
  220. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/shared/property_graph.rs +0 -0
  221. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/ops/storages/shared/table_columns.rs +0 -0
  222. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/prelude.rs +0 -0
  223. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/py/convert.rs +0 -0
  224. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/py/mod.rs +0 -0
  225. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/server.rs +0 -0
  226. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/service/error.rs +0 -0
  227. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/service/flows.rs +0 -0
  228. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/service/mod.rs +0 -0
  229. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/service/search.rs +0 -0
  230. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/settings.rs +0 -0
  231. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/auth_registry.rs +0 -0
  232. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/db_metadata.rs +0 -0
  233. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/driver.rs +0 -0
  234. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/mod.rs +0 -0
  235. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/setup/states.rs +0 -0
  236. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/db.rs +0 -0
  237. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/fingerprint.rs +0 -0
  238. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/immutable.rs +0 -0
  239. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/mod.rs +0 -0
  240. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/retryable.rs +0 -0
  241. {cocoindex-0.1.46 → cocoindex-0.1.48}/src/utils/yaml_ser.rs +0 -0
@@ -993,7 +993,7 @@ dependencies = [
993
993
 
994
994
  [[package]]
995
995
  name = "cocoindex"
996
- version = "0.1.46"
996
+ version = "0.1.48"
997
997
  dependencies = [
998
998
  "anyhow",
999
999
  "async-openai",
@@ -2,7 +2,7 @@
2
2
  name = "cocoindex"
3
3
  # Version used for local development is always higher than others to take precedence.
4
4
  # Will be overridden for specific release versions.
5
- version = "0.1.46"
5
+ version = "0.1.48"
6
6
  edition = "2024"
7
7
 
8
8
  [profile.release]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cocoindex
3
- Version: 0.1.46
3
+ Version: 0.1.48
4
4
  Requires-Dist: sentence-transformers>=3.3.1
5
5
  Requires-Dist: click>=8.1.8
6
6
  Requires-Dist: rich>=14.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
- QDRANT_GRPC_URL = os.getenv("QDRANT_GRPC_URL", "http://localhost:6334/")
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(img_bytes: bytes) -> cocoindex.Vector[cocoindex.Float32, Literal[384]]:
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=QDRANT_GRPC_URL, prefer_grpc=True)
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="image_search",
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
- QDRANT_GRPC_URL = "http://localhost:6334"
8
- QDRANT_COLLECTION = "cocoindex"
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=QDRANT_GRPC_URL, prefer_grpc=True)
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
- grpc_url: str = "http://localhost:6334/"
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 = serde_json::from_value(key.clone())?;
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 = serde_json::from_value(key.clone())?;
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 = serde_json::from_value(key.clone())?;
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::{Arc, LazyLock, RwLock, RwLockReadGuard};
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
- Arc::new(storages::qdrant::Factory::default()).register(registry)?;
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
  }