@mytechtoday/augment-extensions 0.1.2 → 0.4.0
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.
- package/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +42 -71
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +534 -70
- package/package.json +12 -3
|
@@ -0,0 +1,858 @@
|
|
|
1
|
+
# Vector Embeddings
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document covers vector embedding fundamentals, including embedding models (OpenAI, Cohere, sentence-transformers), embedding dimensions, chunking strategies, metadata storage, embedding updates, versioning, batch processing, and cost optimization.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What are Vector Embeddings?
|
|
10
|
+
|
|
11
|
+
### Definition
|
|
12
|
+
|
|
13
|
+
**Vector Embedding**: A numerical representation of data (text, images, audio) as a high-dimensional vector
|
|
14
|
+
|
|
15
|
+
**Key Concepts:**
|
|
16
|
+
- Converts unstructured data to structured vectors
|
|
17
|
+
- Captures semantic meaning in numerical form
|
|
18
|
+
- Similar items have similar embeddings (close in vector space)
|
|
19
|
+
- Enables mathematical operations on meaning
|
|
20
|
+
|
|
21
|
+
**Example:**
|
|
22
|
+
```
|
|
23
|
+
Text: "The cat sat on the mat"
|
|
24
|
+
Embedding: [0.234, -0.567, 0.891, ..., 0.123] # 1536 dimensions
|
|
25
|
+
|
|
26
|
+
Text: "A feline rested on the rug"
|
|
27
|
+
Embedding: [0.241, -0.553, 0.879, ..., 0.118] # Similar vector!
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### How Embeddings Work
|
|
31
|
+
|
|
32
|
+
**1. Training:**
|
|
33
|
+
- ML models trained on large datasets
|
|
34
|
+
- Learn to represent semantic meaning as vectors
|
|
35
|
+
- Similar meanings → similar vectors
|
|
36
|
+
|
|
37
|
+
**2. Generation:**
|
|
38
|
+
- Input data (text, image, etc.)
|
|
39
|
+
- Model processes input
|
|
40
|
+
- Outputs fixed-size vector
|
|
41
|
+
|
|
42
|
+
**3. Usage:**
|
|
43
|
+
- Store vectors in vector database
|
|
44
|
+
- Compare vectors using distance metrics
|
|
45
|
+
- Find similar items by vector similarity
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Embedding Models
|
|
50
|
+
|
|
51
|
+
### Popular Embedding Models
|
|
52
|
+
|
|
53
|
+
**OpenAI Embeddings**
|
|
54
|
+
- **Model**: `text-embedding-3-small`, `text-embedding-3-large`
|
|
55
|
+
- **Dimensions**: 1536 (small), 3072 (large)
|
|
56
|
+
- **Max Input**: 8191 tokens
|
|
57
|
+
- **Cost**: $0.02 / 1M tokens (small), $0.13 / 1M tokens (large)
|
|
58
|
+
- **Best for**: General-purpose text embeddings, high quality
|
|
59
|
+
- **API**: OpenAI API (requires API key)
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
from openai import OpenAI
|
|
63
|
+
|
|
64
|
+
client = OpenAI(api_key="your-api-key")
|
|
65
|
+
|
|
66
|
+
response = client.embeddings.create(
|
|
67
|
+
model="text-embedding-3-small",
|
|
68
|
+
input="Your text here"
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
embedding = response.data[0].embedding # 1536-dimensional vector
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Cohere Embeddings**
|
|
75
|
+
- **Model**: `embed-english-v3.0`, `embed-multilingual-v3.0`
|
|
76
|
+
- **Dimensions**: 1024 (default), configurable
|
|
77
|
+
- **Max Input**: 512 tokens
|
|
78
|
+
- **Cost**: $0.10 / 1M tokens
|
|
79
|
+
- **Best for**: Multilingual support, semantic search
|
|
80
|
+
- **API**: Cohere API (requires API key)
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
import cohere
|
|
84
|
+
|
|
85
|
+
co = cohere.Client("your-api-key")
|
|
86
|
+
|
|
87
|
+
response = co.embed(
|
|
88
|
+
texts=["Your text here"],
|
|
89
|
+
model="embed-english-v3.0",
|
|
90
|
+
input_type="search_document" # or "search_query"
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
embedding = response.embeddings[0] # 1024-dimensional vector
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Sentence Transformers (Open Source)**
|
|
97
|
+
- **Models**: `all-MiniLM-L6-v2`, `all-mpnet-base-v2`, `multi-qa-mpnet-base-dot-v1`
|
|
98
|
+
- **Dimensions**: 384 (MiniLM), 768 (mpnet)
|
|
99
|
+
- **Max Input**: 256-512 tokens (model-dependent)
|
|
100
|
+
- **Cost**: Free (self-hosted)
|
|
101
|
+
- **Best for**: Self-hosting, cost optimization, privacy
|
|
102
|
+
- **Library**: Hugging Face Transformers
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
from sentence_transformers import SentenceTransformer
|
|
106
|
+
|
|
107
|
+
model = SentenceTransformer('all-MiniLM-L6-v2')
|
|
108
|
+
|
|
109
|
+
embedding = model.encode("Your text here") # 384-dimensional vector
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Voyage AI**
|
|
113
|
+
- **Model**: `voyage-2`, `voyage-code-2`
|
|
114
|
+
- **Dimensions**: 1024
|
|
115
|
+
- **Max Input**: 16000 tokens
|
|
116
|
+
- **Cost**: $0.12 / 1M tokens
|
|
117
|
+
- **Best for**: Long documents, code embeddings
|
|
118
|
+
- **API**: Voyage AI API
|
|
119
|
+
|
|
120
|
+
**Google Vertex AI (PaLM)**
|
|
121
|
+
- **Model**: `textembedding-gecko`
|
|
122
|
+
- **Dimensions**: 768
|
|
123
|
+
- **Max Input**: 3072 tokens
|
|
124
|
+
- **Cost**: $0.025 / 1M tokens
|
|
125
|
+
- **Best for**: Google Cloud users
|
|
126
|
+
- **API**: Google Cloud Vertex AI
|
|
127
|
+
|
|
128
|
+
### Model Selection Criteria
|
|
129
|
+
|
|
130
|
+
| Model | Dimensions | Quality | Cost | Speed | Best For |
|
|
131
|
+
|-------|------------|---------|------|-------|----------|
|
|
132
|
+
| OpenAI (large) | 3072 | Highest | High | Medium | Production, high quality |
|
|
133
|
+
| OpenAI (small) | 1536 | High | Medium | Fast | Production, balanced |
|
|
134
|
+
| Cohere | 1024 | High | Medium | Fast | Multilingual, semantic search |
|
|
135
|
+
| Sentence Transformers | 384-768 | Medium | Free | Fast | Self-hosting, cost optimization |
|
|
136
|
+
| Voyage AI | 1024 | High | Medium | Medium | Long documents, code |
|
|
137
|
+
|
|
138
|
+
**Recommendation**:
|
|
139
|
+
- **Production**: OpenAI `text-embedding-3-small` (balanced quality/cost)
|
|
140
|
+
- **Self-hosted**: Sentence Transformers `all-mpnet-base-v2` (best quality)
|
|
141
|
+
- **Multilingual**: Cohere `embed-multilingual-v3.0`
|
|
142
|
+
- **Code**: Voyage AI `voyage-code-2`
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Embedding Dimensions
|
|
147
|
+
|
|
148
|
+
### Understanding Dimensions
|
|
149
|
+
|
|
150
|
+
**Dimension**: Number of values in the embedding vector
|
|
151
|
+
|
|
152
|
+
**Trade-offs:**
|
|
153
|
+
- **Higher dimensions** (1536, 3072):
|
|
154
|
+
- More expressive (capture more nuance)
|
|
155
|
+
- Better quality (more accurate similarity)
|
|
156
|
+
- Slower search (more computations)
|
|
157
|
+
- More storage (larger vectors)
|
|
158
|
+
|
|
159
|
+
- **Lower dimensions** (384, 768):
|
|
160
|
+
- Less expressive (less nuance)
|
|
161
|
+
- Lower quality (less accurate)
|
|
162
|
+
- Faster search (fewer computations)
|
|
163
|
+
- Less storage (smaller vectors)
|
|
164
|
+
|
|
165
|
+
### Dimension Recommendations
|
|
166
|
+
|
|
167
|
+
**Small datasets (< 100k documents):**
|
|
168
|
+
- Use higher dimensions (1536+)
|
|
169
|
+
- Quality > speed
|
|
170
|
+
- Storage cost is minimal
|
|
171
|
+
|
|
172
|
+
**Large datasets (> 1M documents):**
|
|
173
|
+
- Consider lower dimensions (384-768)
|
|
174
|
+
- Speed and storage matter
|
|
175
|
+
- Quality may still be acceptable
|
|
176
|
+
|
|
177
|
+
**Real-time applications:**
|
|
178
|
+
- Use lower dimensions (384-768)
|
|
179
|
+
- Latency is critical
|
|
180
|
+
- Batch pre-compute embeddings
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Chunking Strategies
|
|
185
|
+
|
|
186
|
+
### Why Chunking Matters
|
|
187
|
+
|
|
188
|
+
**Problem**: Documents are often too long for embedding models (max 512-8191 tokens)
|
|
189
|
+
|
|
190
|
+
**Solution**: Split documents into smaller chunks, embed each chunk separately
|
|
191
|
+
|
|
192
|
+
**Benefits:**
|
|
193
|
+
- Fit within model token limits
|
|
194
|
+
- More granular search (find specific sections)
|
|
195
|
+
- Better context matching
|
|
196
|
+
|
|
197
|
+
**Challenges:**
|
|
198
|
+
- Losing context across chunks
|
|
199
|
+
- Determining optimal chunk size
|
|
200
|
+
- Handling chunk boundaries
|
|
201
|
+
|
|
202
|
+
### Chunking Methods
|
|
203
|
+
|
|
204
|
+
**Method 1: Fixed-Size Chunking**
|
|
205
|
+
```python
|
|
206
|
+
def chunk_by_tokens(text, chunk_size=512, overlap=50):
|
|
207
|
+
"""Split text into fixed-size chunks with overlap"""
|
|
208
|
+
tokens = tokenize(text)
|
|
209
|
+
chunks = []
|
|
210
|
+
|
|
211
|
+
for i in range(0, len(tokens), chunk_size - overlap):
|
|
212
|
+
chunk = tokens[i:i + chunk_size]
|
|
213
|
+
chunks.append(detokenize(chunk))
|
|
214
|
+
|
|
215
|
+
return chunks
|
|
216
|
+
|
|
217
|
+
# Example
|
|
218
|
+
text = "Long document..."
|
|
219
|
+
chunks = chunk_by_tokens(text, chunk_size=512, overlap=50)
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Pros**: Simple, predictable chunk sizes
|
|
223
|
+
**Cons**: May split sentences/paragraphs awkwardly
|
|
224
|
+
|
|
225
|
+
**Method 2: Sentence-Based Chunking**
|
|
226
|
+
```python
|
|
227
|
+
def chunk_by_sentences(text, max_tokens=512):
|
|
228
|
+
"""Split text by sentences, group until max_tokens"""
|
|
229
|
+
sentences = split_into_sentences(text)
|
|
230
|
+
chunks = []
|
|
231
|
+
current_chunk = []
|
|
232
|
+
current_tokens = 0
|
|
233
|
+
|
|
234
|
+
for sentence in sentences:
|
|
235
|
+
sentence_tokens = count_tokens(sentence)
|
|
236
|
+
|
|
237
|
+
if current_tokens + sentence_tokens > max_tokens:
|
|
238
|
+
chunks.append(" ".join(current_chunk))
|
|
239
|
+
current_chunk = [sentence]
|
|
240
|
+
current_tokens = sentence_tokens
|
|
241
|
+
else:
|
|
242
|
+
current_chunk.append(sentence)
|
|
243
|
+
current_tokens += sentence_tokens
|
|
244
|
+
|
|
245
|
+
if current_chunk:
|
|
246
|
+
chunks.append(" ".join(current_chunk))
|
|
247
|
+
|
|
248
|
+
return chunks
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**Pros**: Preserves sentence boundaries
|
|
252
|
+
**Cons**: Variable chunk sizes
|
|
253
|
+
|
|
254
|
+
**Method 3: Paragraph-Based Chunking**
|
|
255
|
+
```python
|
|
256
|
+
def chunk_by_paragraphs(text, max_tokens=512):
|
|
257
|
+
"""Split text by paragraphs, group until max_tokens"""
|
|
258
|
+
paragraphs = text.split("\n\n")
|
|
259
|
+
chunks = []
|
|
260
|
+
current_chunk = []
|
|
261
|
+
current_tokens = 0
|
|
262
|
+
|
|
263
|
+
for para in paragraphs:
|
|
264
|
+
para_tokens = count_tokens(para)
|
|
265
|
+
|
|
266
|
+
if para_tokens > max_tokens:
|
|
267
|
+
# Split large paragraph by sentences
|
|
268
|
+
chunks.extend(chunk_by_sentences(para, max_tokens))
|
|
269
|
+
elif current_tokens + para_tokens > max_tokens:
|
|
270
|
+
chunks.append("\n\n".join(current_chunk))
|
|
271
|
+
current_chunk = [para]
|
|
272
|
+
current_tokens = para_tokens
|
|
273
|
+
else:
|
|
274
|
+
current_chunk.append(para)
|
|
275
|
+
current_tokens += para_tokens
|
|
276
|
+
|
|
277
|
+
if current_chunk:
|
|
278
|
+
chunks.append("\n\n".join(current_chunk))
|
|
279
|
+
|
|
280
|
+
return chunks
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**Pros**: Preserves logical structure
|
|
284
|
+
**Cons**: More complex, variable sizes
|
|
285
|
+
|
|
286
|
+
**Method 4: Semantic Chunking**
|
|
287
|
+
```python
|
|
288
|
+
def chunk_by_semantics(text, max_tokens=512):
|
|
289
|
+
"""Split text by semantic similarity"""
|
|
290
|
+
sentences = split_into_sentences(text)
|
|
291
|
+
embeddings = [embed(s) for s in sentences]
|
|
292
|
+
|
|
293
|
+
chunks = []
|
|
294
|
+
current_chunk = [sentences[0]]
|
|
295
|
+
|
|
296
|
+
for i in range(1, len(sentences)):
|
|
297
|
+
similarity = cosine_similarity(embeddings[i-1], embeddings[i])
|
|
298
|
+
|
|
299
|
+
if similarity < 0.7 or count_tokens(" ".join(current_chunk)) > max_tokens:
|
|
300
|
+
chunks.append(" ".join(current_chunk))
|
|
301
|
+
current_chunk = [sentences[i]]
|
|
302
|
+
else:
|
|
303
|
+
current_chunk.append(sentences[i])
|
|
304
|
+
|
|
305
|
+
if current_chunk:
|
|
306
|
+
chunks.append(" ".join(current_chunk))
|
|
307
|
+
|
|
308
|
+
return chunks
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**Pros**: Preserves semantic coherence
|
|
312
|
+
**Cons**: Expensive (requires embeddings), complex
|
|
313
|
+
|
|
314
|
+
### Chunking Best Practices
|
|
315
|
+
|
|
316
|
+
**Chunk Size:**
|
|
317
|
+
- **Small chunks (128-256 tokens)**: More granular, better for specific queries
|
|
318
|
+
- **Medium chunks (256-512 tokens)**: Balanced, good default
|
|
319
|
+
- **Large chunks (512-1024 tokens)**: More context, better for broad queries
|
|
320
|
+
|
|
321
|
+
**Overlap:**
|
|
322
|
+
- Use 10-20% overlap to preserve context across boundaries
|
|
323
|
+
- Example: 512 token chunks with 50 token overlap
|
|
324
|
+
|
|
325
|
+
**Metadata:**
|
|
326
|
+
- Store chunk metadata (document ID, chunk index, position)
|
|
327
|
+
- Enable reconstruction of original document
|
|
328
|
+
- Track chunk relationships
|
|
329
|
+
|
|
330
|
+
```python
|
|
331
|
+
# Example with metadata
|
|
332
|
+
chunks = [
|
|
333
|
+
{
|
|
334
|
+
"text": "First chunk...",
|
|
335
|
+
"embedding": [0.1, 0.2, ...],
|
|
336
|
+
"metadata": {
|
|
337
|
+
"document_id": "doc123",
|
|
338
|
+
"chunk_index": 0,
|
|
339
|
+
"total_chunks": 5,
|
|
340
|
+
"source": "article.pdf",
|
|
341
|
+
"page": 1
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
# ...
|
|
345
|
+
]
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Metadata Storage
|
|
351
|
+
|
|
352
|
+
### Why Store Metadata?
|
|
353
|
+
|
|
354
|
+
**Metadata**: Additional information stored with embeddings
|
|
355
|
+
|
|
356
|
+
**Benefits:**
|
|
357
|
+
- Filter search results (by date, category, author, etc.)
|
|
358
|
+
- Reconstruct original content
|
|
359
|
+
- Track embedding provenance
|
|
360
|
+
- Enable hybrid search
|
|
361
|
+
|
|
362
|
+
### Metadata Schema
|
|
363
|
+
|
|
364
|
+
**Essential Metadata:**
|
|
365
|
+
```python
|
|
366
|
+
{
|
|
367
|
+
"id": "unique-id",
|
|
368
|
+
"text": "Original text content",
|
|
369
|
+
"embedding": [0.1, 0.2, ...],
|
|
370
|
+
"metadata": {
|
|
371
|
+
# Source information
|
|
372
|
+
"source": "document.pdf",
|
|
373
|
+
"source_type": "pdf",
|
|
374
|
+
"url": "https://example.com/doc",
|
|
375
|
+
|
|
376
|
+
# Content information
|
|
377
|
+
"title": "Document Title",
|
|
378
|
+
"author": "John Doe",
|
|
379
|
+
"category": "technology",
|
|
380
|
+
"tags": ["ai", "ml", "nlp"],
|
|
381
|
+
|
|
382
|
+
# Temporal information
|
|
383
|
+
"created_at": "2024-01-15T10:00:00Z",
|
|
384
|
+
"updated_at": "2024-01-20T15:30:00Z",
|
|
385
|
+
"published_date": "2024-01-10",
|
|
386
|
+
|
|
387
|
+
# Chunking information
|
|
388
|
+
"chunk_index": 0,
|
|
389
|
+
"total_chunks": 5,
|
|
390
|
+
"chunk_size": 512,
|
|
391
|
+
|
|
392
|
+
# Embedding information
|
|
393
|
+
"embedding_model": "text-embedding-3-small",
|
|
394
|
+
"embedding_version": "1.0",
|
|
395
|
+
"embedding_date": "2024-01-15T10:00:00Z"
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
### Metadata Filtering
|
|
401
|
+
|
|
402
|
+
**Example: Filter by category and date**
|
|
403
|
+
```python
|
|
404
|
+
# Pinecone
|
|
405
|
+
results = index.query(
|
|
406
|
+
vector=query_embedding,
|
|
407
|
+
top_k=10,
|
|
408
|
+
filter={
|
|
409
|
+
"category": {"$eq": "technology"},
|
|
410
|
+
"published_date": {"$gte": "2024-01-01"}
|
|
411
|
+
}
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
# Weaviate
|
|
415
|
+
results = client.query.get("Document", ["text", "title"]) \
|
|
416
|
+
.with_near_vector({"vector": query_embedding}) \
|
|
417
|
+
.with_where({
|
|
418
|
+
"operator": "And",
|
|
419
|
+
"operands": [
|
|
420
|
+
{"path": ["category"], "operator": "Equal", "valueString": "technology"},
|
|
421
|
+
{"path": ["published_date"], "operator": "GreaterThanEqual", "valueString": "2024-01-01"}
|
|
422
|
+
]
|
|
423
|
+
}) \
|
|
424
|
+
.with_limit(10) \
|
|
425
|
+
.do()
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## Embedding Updates
|
|
431
|
+
|
|
432
|
+
### When to Update Embeddings
|
|
433
|
+
|
|
434
|
+
**Update embeddings when:**
|
|
435
|
+
- ✅ Content changes significantly
|
|
436
|
+
- ✅ Embedding model is upgraded
|
|
437
|
+
- ✅ Embedding quality is poor
|
|
438
|
+
- ✅ New metadata is added
|
|
439
|
+
|
|
440
|
+
**Don't update when:**
|
|
441
|
+
- ❌ Minor typo fixes
|
|
442
|
+
- ❌ Metadata-only changes
|
|
443
|
+
- ❌ Formatting changes
|
|
444
|
+
|
|
445
|
+
### Update Strategies
|
|
446
|
+
|
|
447
|
+
**Strategy 1: Full Reindex**
|
|
448
|
+
```python
|
|
449
|
+
def full_reindex(documents, index):
|
|
450
|
+
"""Re-embed all documents"""
|
|
451
|
+
for doc in documents:
|
|
452
|
+
embedding = embed(doc.text)
|
|
453
|
+
index.upsert(id=doc.id, vector=embedding, metadata=doc.metadata)
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
**Pros**: Clean, consistent
|
|
457
|
+
**Cons**: Expensive, time-consuming
|
|
458
|
+
|
|
459
|
+
**Strategy 2: Incremental Update**
|
|
460
|
+
```python
|
|
461
|
+
def incremental_update(changed_documents, index):
|
|
462
|
+
"""Update only changed documents"""
|
|
463
|
+
for doc in changed_documents:
|
|
464
|
+
embedding = embed(doc.text)
|
|
465
|
+
index.upsert(id=doc.id, vector=embedding, metadata=doc.metadata)
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
**Pros**: Efficient, fast
|
|
469
|
+
**Cons**: May have inconsistent embeddings (different models)
|
|
470
|
+
|
|
471
|
+
**Strategy 3: Versioned Embeddings**
|
|
472
|
+
```python
|
|
473
|
+
def versioned_update(documents, index, new_version):
|
|
474
|
+
"""Create new version of embeddings"""
|
|
475
|
+
for doc in documents:
|
|
476
|
+
embedding = embed(doc.text)
|
|
477
|
+
index.upsert(
|
|
478
|
+
id=f"{doc.id}_v{new_version}",
|
|
479
|
+
vector=embedding,
|
|
480
|
+
metadata={**doc.metadata, "version": new_version}
|
|
481
|
+
)
|
|
482
|
+
|
|
483
|
+
# Optionally delete old versions
|
|
484
|
+
# delete_old_versions(index, old_version)
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
**Pros**: Rollback capability, A/B testing
|
|
488
|
+
**Cons**: More storage, complex management
|
|
489
|
+
|
|
490
|
+
---
|
|
491
|
+
|
|
492
|
+
## Embedding Versioning
|
|
493
|
+
|
|
494
|
+
### Why Version Embeddings?
|
|
495
|
+
|
|
496
|
+
**Reasons:**
|
|
497
|
+
- Track which model generated embeddings
|
|
498
|
+
- Enable rollback if new model performs poorly
|
|
499
|
+
- A/B test different embedding models
|
|
500
|
+
- Maintain consistency across updates
|
|
501
|
+
|
|
502
|
+
### Versioning Schema
|
|
503
|
+
|
|
504
|
+
```python
|
|
505
|
+
{
|
|
506
|
+
"id": "doc123",
|
|
507
|
+
"text": "Document content",
|
|
508
|
+
"embedding": [0.1, 0.2, ...],
|
|
509
|
+
"metadata": {
|
|
510
|
+
"embedding_model": "text-embedding-3-small",
|
|
511
|
+
"embedding_version": "v2",
|
|
512
|
+
"embedding_date": "2024-01-15T10:00:00Z",
|
|
513
|
+
"previous_versions": ["v1"]
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### Version Migration
|
|
519
|
+
|
|
520
|
+
```python
|
|
521
|
+
def migrate_embeddings(index, old_version, new_version, new_model):
|
|
522
|
+
"""Migrate embeddings to new version"""
|
|
523
|
+
# Fetch all documents with old version
|
|
524
|
+
docs = index.fetch(filter={"embedding_version": old_version})
|
|
525
|
+
|
|
526
|
+
# Re-embed with new model
|
|
527
|
+
for doc in docs:
|
|
528
|
+
new_embedding = embed(doc.text, model=new_model)
|
|
529
|
+
|
|
530
|
+
# Update with new version
|
|
531
|
+
index.upsert(
|
|
532
|
+
id=doc.id,
|
|
533
|
+
vector=new_embedding,
|
|
534
|
+
metadata={
|
|
535
|
+
**doc.metadata,
|
|
536
|
+
"embedding_model": new_model,
|
|
537
|
+
"embedding_version": new_version,
|
|
538
|
+
"embedding_date": datetime.now().isoformat(),
|
|
539
|
+
"previous_versions": doc.metadata.get("previous_versions", []) + [old_version]
|
|
540
|
+
}
|
|
541
|
+
)
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
---
|
|
545
|
+
|
|
546
|
+
## Batch Processing
|
|
547
|
+
|
|
548
|
+
### Why Batch Process?
|
|
549
|
+
|
|
550
|
+
**Benefits:**
|
|
551
|
+
- Faster processing (parallel requests)
|
|
552
|
+
- Lower cost (batch discounts)
|
|
553
|
+
- Better resource utilization
|
|
554
|
+
- Reduced API rate limiting
|
|
555
|
+
|
|
556
|
+
### Batch Embedding
|
|
557
|
+
|
|
558
|
+
**Example with OpenAI:**
|
|
559
|
+
```python
|
|
560
|
+
from openai import OpenAI
|
|
561
|
+
|
|
562
|
+
client = OpenAI(api_key="your-api-key")
|
|
563
|
+
|
|
564
|
+
def batch_embed(texts, batch_size=100):
|
|
565
|
+
"""Embed texts in batches"""
|
|
566
|
+
embeddings = []
|
|
567
|
+
|
|
568
|
+
for i in range(0, len(texts), batch_size):
|
|
569
|
+
batch = texts[i:i + batch_size]
|
|
570
|
+
|
|
571
|
+
response = client.embeddings.create(
|
|
572
|
+
model="text-embedding-3-small",
|
|
573
|
+
input=batch
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
batch_embeddings = [item.embedding for item in response.data]
|
|
577
|
+
embeddings.extend(batch_embeddings)
|
|
578
|
+
|
|
579
|
+
return embeddings
|
|
580
|
+
|
|
581
|
+
# Usage
|
|
582
|
+
texts = ["Text 1", "Text 2", ..., "Text 1000"]
|
|
583
|
+
embeddings = batch_embed(texts, batch_size=100)
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
**Example with Sentence Transformers:**
|
|
587
|
+
```python
|
|
588
|
+
from sentence_transformers import SentenceTransformer
|
|
589
|
+
|
|
590
|
+
model = SentenceTransformer('all-MiniLM-L6-v2')
|
|
591
|
+
|
|
592
|
+
def batch_embed_local(texts, batch_size=32):
|
|
593
|
+
"""Embed texts in batches (local model)"""
|
|
594
|
+
embeddings = model.encode(
|
|
595
|
+
texts,
|
|
596
|
+
batch_size=batch_size,
|
|
597
|
+
show_progress_bar=True
|
|
598
|
+
)
|
|
599
|
+
return embeddings
|
|
600
|
+
|
|
601
|
+
# Usage
|
|
602
|
+
texts = ["Text 1", "Text 2", ..., "Text 10000"]
|
|
603
|
+
embeddings = batch_embed_local(texts, batch_size=32)
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
### Batch Upsert
|
|
607
|
+
|
|
608
|
+
```python
|
|
609
|
+
def batch_upsert(index, documents, batch_size=100):
|
|
610
|
+
"""Upsert documents in batches"""
|
|
611
|
+
for i in range(0, len(documents), batch_size):
|
|
612
|
+
batch = documents[i:i + batch_size]
|
|
613
|
+
|
|
614
|
+
# Prepare batch data
|
|
615
|
+
ids = [doc.id for doc in batch]
|
|
616
|
+
vectors = [doc.embedding for doc in batch]
|
|
617
|
+
metadata = [doc.metadata for doc in batch]
|
|
618
|
+
|
|
619
|
+
# Upsert batch
|
|
620
|
+
index.upsert(vectors=list(zip(ids, vectors, metadata)))
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
---
|
|
624
|
+
|
|
625
|
+
## Cost Optimization
|
|
626
|
+
|
|
627
|
+
### Embedding Cost Factors
|
|
628
|
+
|
|
629
|
+
**1. Model Selection:**
|
|
630
|
+
- OpenAI small: $0.02 / 1M tokens
|
|
631
|
+
- OpenAI large: $0.13 / 1M tokens
|
|
632
|
+
- Cohere: $0.10 / 1M tokens
|
|
633
|
+
- Sentence Transformers: Free (self-hosted)
|
|
634
|
+
|
|
635
|
+
**2. Token Count:**
|
|
636
|
+
- Longer texts = more tokens = higher cost
|
|
637
|
+
- Chunking strategy affects total tokens
|
|
638
|
+
|
|
639
|
+
**3. Update Frequency:**
|
|
640
|
+
- Frequent updates = higher cost
|
|
641
|
+
- Cache embeddings when possible
|
|
642
|
+
|
|
643
|
+
### Cost Optimization Strategies
|
|
644
|
+
|
|
645
|
+
**Strategy 1: Use Smaller Models**
|
|
646
|
+
```python
|
|
647
|
+
# Instead of text-embedding-3-large (expensive)
|
|
648
|
+
# Use text-embedding-3-small (cheaper, still good quality)
|
|
649
|
+
model = "text-embedding-3-small"
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
**Strategy 2: Self-Host Open Source Models**
|
|
653
|
+
```python
|
|
654
|
+
# Free (after infrastructure cost)
|
|
655
|
+
from sentence_transformers import SentenceTransformer
|
|
656
|
+
model = SentenceTransformer('all-MiniLM-L6-v2')
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
**Strategy 3: Cache Embeddings**
|
|
660
|
+
```python
|
|
661
|
+
import hashlib
|
|
662
|
+
import json
|
|
663
|
+
|
|
664
|
+
embedding_cache = {}
|
|
665
|
+
|
|
666
|
+
def embed_with_cache(text, model):
|
|
667
|
+
"""Cache embeddings to avoid re-computation"""
|
|
668
|
+
# Create cache key
|
|
669
|
+
cache_key = hashlib.md5(f"{model}:{text}".encode()).hexdigest()
|
|
670
|
+
|
|
671
|
+
# Check cache
|
|
672
|
+
if cache_key in embedding_cache:
|
|
673
|
+
return embedding_cache[cache_key]
|
|
674
|
+
|
|
675
|
+
# Generate embedding
|
|
676
|
+
embedding = embed(text, model)
|
|
677
|
+
|
|
678
|
+
# Store in cache
|
|
679
|
+
embedding_cache[cache_key] = embedding
|
|
680
|
+
|
|
681
|
+
return embedding
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
**Strategy 4: Batch Processing**
|
|
685
|
+
```python
|
|
686
|
+
# Batch requests for better throughput and potential discounts
|
|
687
|
+
embeddings = batch_embed(texts, batch_size=100)
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
**Strategy 5: Optimize Chunking**
|
|
691
|
+
```python
|
|
692
|
+
# Larger chunks = fewer embeddings = lower cost
|
|
693
|
+
# But balance with search quality
|
|
694
|
+
chunk_size = 512 # Instead of 256
|
|
695
|
+
```
|
|
696
|
+
|
|
697
|
+
### Cost Estimation
|
|
698
|
+
|
|
699
|
+
```python
|
|
700
|
+
def estimate_embedding_cost(num_documents, avg_tokens_per_doc, model="text-embedding-3-small"):
|
|
701
|
+
"""Estimate embedding cost"""
|
|
702
|
+
costs = {
|
|
703
|
+
"text-embedding-3-small": 0.02 / 1_000_000,
|
|
704
|
+
"text-embedding-3-large": 0.13 / 1_000_000,
|
|
705
|
+
"embed-english-v3.0": 0.10 / 1_000_000
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
total_tokens = num_documents * avg_tokens_per_doc
|
|
709
|
+
cost_per_token = costs.get(model, 0)
|
|
710
|
+
total_cost = total_tokens * cost_per_token
|
|
711
|
+
|
|
712
|
+
return {
|
|
713
|
+
"total_tokens": total_tokens,
|
|
714
|
+
"total_cost": total_cost,
|
|
715
|
+
"cost_per_document": total_cost / num_documents
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
# Example
|
|
719
|
+
estimate = estimate_embedding_cost(
|
|
720
|
+
num_documents=100_000,
|
|
721
|
+
avg_tokens_per_doc=500,
|
|
722
|
+
model="text-embedding-3-small"
|
|
723
|
+
)
|
|
724
|
+
print(f"Total cost: ${estimate['total_cost']:.2f}")
|
|
725
|
+
# Output: Total cost: $1.00
|
|
726
|
+
```
|
|
727
|
+
|
|
728
|
+
---
|
|
729
|
+
|
|
730
|
+
## Best Practices
|
|
731
|
+
|
|
732
|
+
### 1. Model Selection
|
|
733
|
+
|
|
734
|
+
✅ **DO:**
|
|
735
|
+
- Use OpenAI for production (high quality, reliable)
|
|
736
|
+
- Use Sentence Transformers for self-hosting (cost optimization)
|
|
737
|
+
- Use Cohere for multilingual (best multilingual support)
|
|
738
|
+
- Benchmark models on your data before choosing
|
|
739
|
+
|
|
740
|
+
❌ **DON'T:**
|
|
741
|
+
- Mix embeddings from different models in same index
|
|
742
|
+
- Choose model based on dimensions alone
|
|
743
|
+
- Ignore cost implications
|
|
744
|
+
- Skip model evaluation
|
|
745
|
+
|
|
746
|
+
### 2. Chunking
|
|
747
|
+
|
|
748
|
+
✅ **DO:**
|
|
749
|
+
- Use 256-512 token chunks as default
|
|
750
|
+
- Add 10-20% overlap between chunks
|
|
751
|
+
- Preserve sentence/paragraph boundaries
|
|
752
|
+
- Store chunk metadata (index, total chunks)
|
|
753
|
+
|
|
754
|
+
❌ **DON'T:**
|
|
755
|
+
- Use chunks larger than model max tokens
|
|
756
|
+
- Split mid-sentence without overlap
|
|
757
|
+
- Ignore chunk boundaries
|
|
758
|
+
- Forget to store chunk relationships
|
|
759
|
+
|
|
760
|
+
### 3. Metadata
|
|
761
|
+
|
|
762
|
+
✅ **DO:**
|
|
763
|
+
- Store original text with embeddings
|
|
764
|
+
- Include source, author, date, category
|
|
765
|
+
- Track embedding model and version
|
|
766
|
+
- Enable filtering by metadata
|
|
767
|
+
|
|
768
|
+
❌ **DON'T:**
|
|
769
|
+
- Store only embeddings without metadata
|
|
770
|
+
- Forget to version embeddings
|
|
771
|
+
- Ignore temporal information
|
|
772
|
+
- Skip source tracking
|
|
773
|
+
|
|
774
|
+
### 4. Updates
|
|
775
|
+
|
|
776
|
+
✅ **DO:**
|
|
777
|
+
- Version embeddings for rollback
|
|
778
|
+
- Update incrementally when possible
|
|
779
|
+
- Cache embeddings to avoid re-computation
|
|
780
|
+
- Monitor embedding quality over time
|
|
781
|
+
|
|
782
|
+
❌ **DON'T:**
|
|
783
|
+
- Re-embed everything for minor changes
|
|
784
|
+
- Mix old and new embeddings without versioning
|
|
785
|
+
- Ignore embedding drift
|
|
786
|
+
- Skip quality monitoring
|
|
787
|
+
|
|
788
|
+
### 5. Cost Optimization
|
|
789
|
+
|
|
790
|
+
✅ **DO:**
|
|
791
|
+
- Batch embed documents
|
|
792
|
+
- Cache embeddings
|
|
793
|
+
- Use appropriate model for use case
|
|
794
|
+
- Monitor and optimize token usage
|
|
795
|
+
|
|
796
|
+
❌ **DON'T:**
|
|
797
|
+
- Embed one document at a time
|
|
798
|
+
- Re-embed unnecessarily
|
|
799
|
+
- Use expensive models when cheaper ones suffice
|
|
800
|
+
- Ignore cost monitoring
|
|
801
|
+
|
|
802
|
+
---
|
|
803
|
+
|
|
804
|
+
## Common Pitfalls
|
|
805
|
+
|
|
806
|
+
### 1. Mixing Embedding Models
|
|
807
|
+
|
|
808
|
+
**Problem**: Using different models for indexing and querying
|
|
809
|
+
|
|
810
|
+
**Solution**: Use same model consistently
|
|
811
|
+
|
|
812
|
+
### 2. Poor Chunking
|
|
813
|
+
|
|
814
|
+
**Problem**: Chunks too large (exceed token limit) or too small (lose context)
|
|
815
|
+
|
|
816
|
+
**Solution**: Use 256-512 token chunks with overlap
|
|
817
|
+
|
|
818
|
+
### 3. Missing Metadata
|
|
819
|
+
|
|
820
|
+
**Problem**: Can't filter or reconstruct original content
|
|
821
|
+
|
|
822
|
+
**Solution**: Store comprehensive metadata with embeddings
|
|
823
|
+
|
|
824
|
+
### 4. No Versioning
|
|
825
|
+
|
|
826
|
+
**Problem**: Can't track which model generated embeddings
|
|
827
|
+
|
|
828
|
+
**Solution**: Version embeddings with model name and date
|
|
829
|
+
|
|
830
|
+
### 5. Inefficient Batch Processing
|
|
831
|
+
|
|
832
|
+
**Problem**: Embedding one document at a time (slow, expensive)
|
|
833
|
+
|
|
834
|
+
**Solution**: Batch embed documents (100+ at a time)
|
|
835
|
+
|
|
836
|
+
---
|
|
837
|
+
|
|
838
|
+
## Summary
|
|
839
|
+
|
|
840
|
+
**Key Takeaways:**
|
|
841
|
+
1. Choose embedding model based on quality, cost, and use case
|
|
842
|
+
2. Use 256-512 token chunks with 10-20% overlap
|
|
843
|
+
3. Store comprehensive metadata (source, author, date, version)
|
|
844
|
+
4. Version embeddings for rollback and consistency
|
|
845
|
+
5. Batch process for efficiency and cost optimization
|
|
846
|
+
6. Cache embeddings to avoid re-computation
|
|
847
|
+
|
|
848
|
+
**Model Recommendations:**
|
|
849
|
+
- **Production**: OpenAI `text-embedding-3-small`
|
|
850
|
+
- **Self-hosted**: Sentence Transformers `all-mpnet-base-v2`
|
|
851
|
+
- **Multilingual**: Cohere `embed-multilingual-v3.0`
|
|
852
|
+
- **Code**: Voyage AI `voyage-code-2`
|
|
853
|
+
|
|
854
|
+
**Next Steps:**
|
|
855
|
+
- See `vector-databases.md` for vector storage and search
|
|
856
|
+
- See `vector-indexing.md` for index optimization
|
|
857
|
+
- See `examples/vector-database-example.md` for complete implementation
|
|
858
|
+
|