zilmate 1.8.0 → 1.8.5
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/.agents/skills/copywriting/SKILL.md +252 -0
- package/.agents/skills/copywriting/evals/evals.json +111 -0
- package/.agents/skills/copywriting/references/copy-frameworks.md +344 -0
- package/.agents/skills/copywriting/references/natural-transitions.md +272 -0
- package/.agents/skills/firecrawl-deep-research/SKILL.md +108 -0
- package/.agents/skills/shadcn/SKILL.md +267 -0
- package/.agents/skills/shadcn/agents/openai.yml +5 -0
- package/.agents/skills/shadcn/assets/shadcn-small.png +0 -0
- package/.agents/skills/shadcn/assets/shadcn.png +0 -0
- package/.agents/skills/shadcn/cli.md +290 -0
- package/.agents/skills/shadcn/customization.md +209 -0
- package/.agents/skills/shadcn/evals/evals.json +47 -0
- package/.agents/skills/shadcn/mcp.md +105 -0
- package/.agents/skills/shadcn/registry.md +277 -0
- package/.agents/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/.agents/skills/shadcn/rules/composition.md +195 -0
- package/.agents/skills/shadcn/rules/forms.md +192 -0
- package/.agents/skills/shadcn/rules/icons.md +101 -0
- package/.agents/skills/shadcn/rules/styling.md +162 -0
- package/.agents/skills/tavily-research/SKILL.md +100 -0
- package/.agents/skills/upstash/SKILL.md +48 -0
- package/.agents/skills/upstash/upstash-box-js/overview.md +243 -0
- package/.agents/skills/upstash/upstash-box-py/overview.md +275 -0
- package/.agents/skills/upstash/upstash-cli/overview.md +138 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/callbacks.md +147 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/deduplication.md +86 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/dlq.md +164 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/multi-region/summary.md +388 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/multi-region/verify-multi-region-setup.ts +388 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/local-development.md +106 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/publishing-messages.md +144 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/queues-and-flow-control.md +148 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/schedules.md +177 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/url-groups.md +127 -0
- package/.agents/skills/upstash/upstash-qstash-js/overview.md +81 -0
- package/.agents/skills/upstash/upstash-qstash-js/verification/platform-specific/nextjs.md +171 -0
- package/.agents/skills/upstash/upstash-qstash-js/verification/receiver.md +213 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/algorithms.md +84 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/features.md +117 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/methods-getting-started.md +77 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/overview.md +26 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/pricing-cost.md +146 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/traffic-protection.md +77 -0
- package/.agents/skills/upstash/upstash-redis-js/advanced-features/auto-pipeline.md +49 -0
- package/.agents/skills/upstash/upstash-redis-js/advanced-features/pipeline-and-transactions.md +42 -0
- package/.agents/skills/upstash/upstash-redis-js/advanced-features/scripting.md +124 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/hashes.md +71 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/json.md +133 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/lists.md +72 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/sets.md +90 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/sorted-sets.md +126 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/streams.md +196 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/strings.md +73 -0
- package/.agents/skills/upstash/upstash-redis-js/migrations/from-ioredis.md +163 -0
- package/.agents/skills/upstash/upstash-redis-js/migrations/from-redis-node.md +205 -0
- package/.agents/skills/upstash/upstash-redis-js/overview.md +183 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/caching.md +58 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/distributed-locks.md +130 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/leaderboard.md +134 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/rate-limiting.md +187 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/session-management.md +217 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/batching-operations.md +76 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/data-serialization.md +134 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/error-handling.md +118 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/pipeline-optimization.md +105 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/redis-replicas.md +14 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/ttl-expiration.md +32 -0
- package/.agents/skills/upstash/upstash-redis-js/search/adapters.md +99 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/aggregating.md +234 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/aliases.md +76 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/index-management.md +124 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/querying.md +315 -0
- package/.agents/skills/upstash/upstash-redis-js/search/overview.md +155 -0
- package/.agents/skills/upstash/upstash-redis-start/overview.md +71 -0
- package/.agents/skills/upstash/upstash-search-js/overview.md +48 -0
- package/.agents/skills/upstash/upstash-search-js/quick-start.md +158 -0
- package/.agents/skills/upstash/upstash-search-js/sdk-overview.md +158 -0
- package/.agents/skills/upstash/upstash-vector-js/features/filtering-and-metadata.md +82 -0
- package/.agents/skills/upstash/upstash-vector-js/features/index-structure.md +193 -0
- package/.agents/skills/upstash/upstash-vector-js/features/namespaces.md +32 -0
- package/.agents/skills/upstash/upstash-vector-js/overview.md +44 -0
- package/.agents/skills/upstash/upstash-vector-js/sdk-methods.md +210 -0
- package/.agents/skills/upstash/upstash-workflow-js/agents.md +248 -0
- package/.agents/skills/upstash/upstash-workflow-js/basics/client.md +180 -0
- package/.agents/skills/upstash/upstash-workflow-js/basics/context.md +230 -0
- package/.agents/skills/upstash/upstash-workflow-js/basics/serve.md +70 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/flow-control.md +145 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/invoke.md +97 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/retries-failures-reliability.md +239 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/wait-for-event.md +97 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/webhooks.md +79 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/local-dev.md +177 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/middleware.md +166 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/migrations.md +201 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/realtime.md +186 -0
- package/.agents/skills/upstash/upstash-workflow-js/overview.md +55 -0
- package/.agents/skills/upstash/upstash-workflow-js/rest-api.md +156 -0
- package/.agents/skills/upstash/upstash-workflow-js/troubleshooting.md +201 -0
- package/.agents/skills/upstash-box-js/SKILL.md +248 -0
- package/.agents/skills/upstash-box-py/SKILL.md +280 -0
- package/.agents/skills/upstash-cli/SKILL.md +143 -0
- package/.agents/skills/upstash-qstash-js/SKILL.md +86 -0
- package/.agents/skills/upstash-qstash-js/advanced/callbacks.md +147 -0
- package/.agents/skills/upstash-qstash-js/advanced/deduplication.md +86 -0
- package/.agents/skills/upstash-qstash-js/advanced/dlq.md +164 -0
- package/.agents/skills/upstash-qstash-js/advanced/multi-region/summary.md +388 -0
- package/.agents/skills/upstash-qstash-js/advanced/multi-region/verify-multi-region-setup.ts +388 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/local-development.md +106 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/publishing-messages.md +144 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/queues-and-flow-control.md +148 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/schedules.md +177 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/url-groups.md +127 -0
- package/.agents/skills/upstash-qstash-js/verification/platform-specific/nextjs.md +171 -0
- package/.agents/skills/upstash-qstash-js/verification/receiver.md +213 -0
- package/.agents/skills/upstash-ratelimit-js/SKILL.md +31 -0
- package/.agents/skills/upstash-ratelimit-js/algorithms.md +84 -0
- package/.agents/skills/upstash-ratelimit-js/features.md +117 -0
- package/.agents/skills/upstash-ratelimit-js/methods-getting-started.md +77 -0
- package/.agents/skills/upstash-ratelimit-js/pricing-cost.md +146 -0
- package/.agents/skills/upstash-ratelimit-js/traffic-protection.md +77 -0
- package/.agents/skills/upstash-redis-js/SKILL.md +188 -0
- package/.agents/skills/upstash-redis-js/advanced-features/auto-pipeline.md +49 -0
- package/.agents/skills/upstash-redis-js/advanced-features/pipeline-and-transactions.md +42 -0
- package/.agents/skills/upstash-redis-js/advanced-features/scripting.md +124 -0
- package/.agents/skills/upstash-redis-js/data-structures/hashes.md +71 -0
- package/.agents/skills/upstash-redis-js/data-structures/json.md +133 -0
- package/.agents/skills/upstash-redis-js/data-structures/lists.md +72 -0
- package/.agents/skills/upstash-redis-js/data-structures/sets.md +90 -0
- package/.agents/skills/upstash-redis-js/data-structures/sorted-sets.md +126 -0
- package/.agents/skills/upstash-redis-js/data-structures/streams.md +196 -0
- package/.agents/skills/upstash-redis-js/data-structures/strings.md +73 -0
- package/.agents/skills/upstash-redis-js/migrations/from-ioredis.md +163 -0
- package/.agents/skills/upstash-redis-js/migrations/from-redis-node.md +205 -0
- package/.agents/skills/upstash-redis-js/patterns/caching.md +58 -0
- package/.agents/skills/upstash-redis-js/patterns/distributed-locks.md +130 -0
- package/.agents/skills/upstash-redis-js/patterns/leaderboard.md +134 -0
- package/.agents/skills/upstash-redis-js/patterns/rate-limiting.md +187 -0
- package/.agents/skills/upstash-redis-js/patterns/session-management.md +217 -0
- package/.agents/skills/upstash-redis-js/performance/batching-operations.md +76 -0
- package/.agents/skills/upstash-redis-js/performance/data-serialization.md +134 -0
- package/.agents/skills/upstash-redis-js/performance/error-handling.md +118 -0
- package/.agents/skills/upstash-redis-js/performance/pipeline-optimization.md +105 -0
- package/.agents/skills/upstash-redis-js/performance/redis-replicas.md +14 -0
- package/.agents/skills/upstash-redis-js/performance/ttl-expiration.md +32 -0
- package/.agents/skills/upstash-redis-js/search/adapters.md +99 -0
- package/.agents/skills/upstash-redis-js/search/commands/aggregating.md +234 -0
- package/.agents/skills/upstash-redis-js/search/commands/aliases.md +76 -0
- package/.agents/skills/upstash-redis-js/search/commands/index-management.md +124 -0
- package/.agents/skills/upstash-redis-js/search/commands/querying.md +315 -0
- package/.agents/skills/upstash-redis-js/search/overview.md +155 -0
- package/.agents/skills/upstash-redis-start/SKILL.md +76 -0
- package/.agents/skills/upstash-search-js/SKILL.md +53 -0
- package/.agents/skills/upstash-search-js/quick-start.md +158 -0
- package/.agents/skills/upstash-search-js/sdk-overview.md +158 -0
- package/.agents/skills/upstash-vector-js/SKILL.md +49 -0
- package/.agents/skills/upstash-vector-js/features/filtering-and-metadata.md +82 -0
- package/.agents/skills/upstash-vector-js/features/index-structure.md +193 -0
- package/.agents/skills/upstash-vector-js/features/namespaces.md +32 -0
- package/.agents/skills/upstash-vector-js/sdk-methods.md +210 -0
- package/.agents/skills/upstash-workflow-js/SKILL.md +60 -0
- package/.agents/skills/upstash-workflow-js/agents.md +248 -0
- package/.agents/skills/upstash-workflow-js/basics/client.md +180 -0
- package/.agents/skills/upstash-workflow-js/basics/context.md +230 -0
- package/.agents/skills/upstash-workflow-js/basics/serve.md +70 -0
- package/.agents/skills/upstash-workflow-js/features/flow-control.md +145 -0
- package/.agents/skills/upstash-workflow-js/features/invoke.md +97 -0
- package/.agents/skills/upstash-workflow-js/features/retries-failures-reliability.md +239 -0
- package/.agents/skills/upstash-workflow-js/features/wait-for-event.md +97 -0
- package/.agents/skills/upstash-workflow-js/features/webhooks.md +79 -0
- package/.agents/skills/upstash-workflow-js/how-to/local-dev.md +177 -0
- package/.agents/skills/upstash-workflow-js/how-to/middleware.md +166 -0
- package/.agents/skills/upstash-workflow-js/how-to/migrations.md +201 -0
- package/.agents/skills/upstash-workflow-js/how-to/realtime.md +186 -0
- package/.agents/skills/upstash-workflow-js/rest-api.md +156 -0
- package/.agents/skills/upstash-workflow-js/troubleshooting.md +201 -0
- package/dist/agents/coding.agent.d.ts +185 -42
- package/dist/agents/coding.agent.d.ts.map +1 -1
- package/dist/agents/coding.agent.js +42 -5
- package/dist/agents/coding.agent.js.map +1 -1
- package/dist/agents/manager.d.ts +216 -41
- package/dist/agents/manager.d.ts.map +1 -1
- package/dist/agents/manager.js +103 -140
- package/dist/agents/manager.js.map +1 -1
- package/dist/agents/security.agent.d.ts +3 -3
- package/dist/agents/swarm/development/lead.d.ts +3 -0
- package/dist/agents/swarm/development/lead.d.ts.map +1 -0
- package/dist/agents/swarm/development/lead.js +24 -0
- package/dist/agents/swarm/development/lead.js.map +1 -0
- package/dist/agents/swarm/main.d.ts +69 -0
- package/dist/agents/swarm/main.d.ts.map +1 -1
- package/dist/agents/swarm/main.js +65 -11
- package/dist/agents/swarm/main.js.map +1 -1
- package/dist/agents/swarm/registry.d.ts +2 -1
- package/dist/agents/swarm/registry.d.ts.map +1 -1
- package/dist/agents/swarm/registry.js +225 -95
- package/dist/agents/swarm/registry.js.map +1 -1
- package/dist/cli/composer.d.ts.map +1 -1
- package/dist/cli/composer.js +85 -30
- package/dist/cli/composer.js.map +1 -1
- package/dist/cli/confirm.d.ts +2 -2
- package/dist/cli/confirm.d.ts.map +1 -1
- package/dist/cli/confirm.js +373 -4
- package/dist/cli/confirm.js.map +1 -1
- package/dist/cli/doctor.d.ts +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +47 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/format.d.ts +4 -0
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +352 -65
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +80 -2
- package/dist/cli/interactive.js.map +1 -1
- package/dist/cli/menu.d.ts.map +1 -1
- package/dist/cli/menu.js +93 -83
- package/dist/cli/menu.js.map +1 -1
- package/dist/cli/render.d.ts.map +1 -1
- package/dist/cli/render.js +2 -1
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +262 -27
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/swarm.d.ts.map +1 -1
- package/dist/cli/swarm.js +13 -10
- package/dist/cli/swarm.js.map +1 -1
- package/dist/cli/theme.d.ts +7 -1
- package/dist/cli/theme.d.ts.map +1 -1
- package/dist/cli/theme.js +4 -16
- package/dist/cli/theme.js.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +27 -4
- package/dist/cli/update.js.map +1 -1
- package/dist/config/env.d.ts +3 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +22 -2
- package/dist/config/env.js.map +1 -1
- package/dist/config/models.d.ts +1 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +17 -1
- package/dist/config/models.js.map +1 -1
- package/dist/documents/pdf.d.ts.map +1 -1
- package/dist/documents/pdf.js +282 -22
- package/dist/documents/pdf.js.map +1 -1
- package/dist/documents/slides.d.ts.map +1 -1
- package/dist/documents/slides.js +160 -30
- package/dist/documents/slides.js.map +1 -1
- package/dist/index.js +73 -18
- package/dist/index.js.map +1 -1
- package/dist/memory/history.js +1 -1
- package/dist/observability/doctor.d.ts.map +1 -1
- package/dist/observability/doctor.js +3 -0
- package/dist/observability/doctor.js.map +1 -1
- package/dist/runtime/progress.d.ts +5 -1
- package/dist/runtime/progress.d.ts.map +1 -1
- package/dist/runtime/progress.js.map +1 -1
- package/dist/runtime/swarm.d.ts +1 -1
- package/dist/runtime/swarm.d.ts.map +1 -1
- package/dist/runtime/swarm.js +19 -3
- package/dist/runtime/swarm.js.map +1 -1
- package/dist/runtime/tool-utils.d.ts +2 -0
- package/dist/runtime/tool-utils.d.ts.map +1 -1
- package/dist/runtime/tool-utils.js +91 -0
- package/dist/runtime/tool-utils.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +16 -0
- package/dist/skills/loader.js.map +1 -1
- package/dist/test-call.d.ts +2 -0
- package/dist/test-call.d.ts.map +1 -0
- package/dist/test-call.js +29 -0
- package/dist/test-call.js.map +1 -0
- package/dist/test-manager-call.d.ts +2 -0
- package/dist/test-manager-call.d.ts.map +1 -0
- package/dist/test-manager-call.js +138 -0
- package/dist/test-manager-call.js.map +1 -0
- package/dist/test-manager-filtered.d.ts +2 -0
- package/dist/test-manager-filtered.d.ts.map +1 -0
- package/dist/test-manager-filtered.js +130 -0
- package/dist/test-manager-filtered.js.map +1 -0
- package/dist/test-mcp-call.d.ts +2 -0
- package/dist/test-mcp-call.d.ts.map +1 -0
- package/dist/test-mcp-call.js +103 -0
- package/dist/test-mcp-call.js.map +1 -0
- package/dist/tools/composio.tool.d.ts +1 -1
- package/dist/tools/composio.tool.d.ts.map +1 -1
- package/dist/tools/composio.tool.js +7 -16
- package/dist/tools/composio.tool.js.map +1 -1
- package/dist/tools/daytona-browser.tool.js +1 -1
- package/dist/tools/daytona-browser.tool.js.map +1 -1
- package/dist/tools/executive.tool.d.ts +40 -0
- package/dist/tools/executive.tool.d.ts.map +1 -0
- package/dist/tools/executive.tool.js +74 -0
- package/dist/tools/executive.tool.js.map +1 -0
- package/dist/tools/filesystem.tool.d.ts +183 -40
- package/dist/tools/filesystem.tool.d.ts.map +1 -1
- package/dist/tools/filesystem.tool.js +564 -111
- package/dist/tools/filesystem.tool.js.map +1 -1
- package/dist/tools/mcp.tool.d.ts +56 -0
- package/dist/tools/mcp.tool.d.ts.map +1 -0
- package/dist/tools/mcp.tool.js +285 -0
- package/dist/tools/mcp.tool.js.map +1 -0
- package/dist/tools/osint.tool.d.ts +4 -4
- package/dist/tools/pentest.tool.d.ts +2 -2
- package/dist/tools/setup-assistant.tool.d.ts +1 -1
- package/dist/tools/setup-assistant.tool.js +1 -1
- package/dist/tools/setup-assistant.tool.js.map +1 -1
- package/dist/workspace/paths.d.ts +1 -0
- package/dist/workspace/paths.d.ts.map +1 -1
- package/dist/workspace/paths.js +3 -4
- package/dist/workspace/paths.js.map +1 -1
- package/package.json +8 -4
- package/scripts/postinstall.mjs +19 -4
- package/scripts/release-github.mjs +11 -11
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upstash-search-js
|
|
3
|
+
description: Skills covering Upstash Search quick starts, core concepts, and TypeScript/JavaScript SDK usage. Use when a user asks how to get started, how indexing works, or how to use the TS client.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Upstash Search Documentation
|
|
7
|
+
|
|
8
|
+
## Quick Start
|
|
9
|
+
|
|
10
|
+
Install the TS SDK:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
npm install @upstash/search
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Create a client and perform a simple upsert + search:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
import { Search } from "@upstash/search";
|
|
20
|
+
|
|
21
|
+
const client = new Search({ url: process.env.UPSTASH_SEARCH_REST_URL, token: process.env.UPSTASH_SEARCH_REST_TOKEN });
|
|
22
|
+
const index = client.index("my-index");
|
|
23
|
+
|
|
24
|
+
await index.upsert({ id: "1", content: { text: "hello world" } });
|
|
25
|
+
const results = await index.search({ query: "hello" });
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Basic steps:
|
|
29
|
+
- Create an index
|
|
30
|
+
- Insert or update documents
|
|
31
|
+
- Run searches or filtered queries
|
|
32
|
+
|
|
33
|
+
## Other Skill Files
|
|
34
|
+
|
|
35
|
+
### sdk-overview
|
|
36
|
+
Provides detailed documentation for all TypeScript SDK commands. Includes:
|
|
37
|
+
- delete: Deleting documents
|
|
38
|
+
- fetch: Retrieving a document
|
|
39
|
+
- info: Index info
|
|
40
|
+
- range: Range queries
|
|
41
|
+
- reset: Clearing an index
|
|
42
|
+
- search: Search queries
|
|
43
|
+
- upsert: Adding/updating documents
|
|
44
|
+
- getting-started: Setup steps for the SDK
|
|
45
|
+
|
|
46
|
+
### quick-start
|
|
47
|
+
Provides a fast, end-to-end workflow for creating a Search database, adding documents, and querying them. Covers essential concepts including:
|
|
48
|
+
- Creating a database and storing credentials
|
|
49
|
+
- Adding documents with content and metadata
|
|
50
|
+
- Understanding content vs metadata (searchability and filterability)
|
|
51
|
+
- Performing searches with optional reranking
|
|
52
|
+
- Filtering syntax with SQL-like or structured filters
|
|
53
|
+
- Common pitfalls and best practices
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Quick Start: Upstash Search
|
|
2
|
+
|
|
3
|
+
This Skill gives agents a fast, end‑to‑end workflow for creating a Search database, adding documents, and querying them. It also summarizes key concepts like **content vs metadata**, **filters**, and **reranking** so agents can use Search correctly.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Create a Database
|
|
8
|
+
1. Open the **Vector** tab → **Create → Search Database**.
|
|
9
|
+
2. Provide a name (e.g., `product-search`) and region.
|
|
10
|
+
3. Select a plan.
|
|
11
|
+
|
|
12
|
+
Agents should store:
|
|
13
|
+
- `UPSTASH_SEARCH_REST_URL`
|
|
14
|
+
- `UPSTASH_SEARCH_REST_TOKEN`
|
|
15
|
+
|
|
16
|
+
These values are required when constructing a Search client.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Add Documents
|
|
21
|
+
Documents consist of:
|
|
22
|
+
- **id**: unique identifier
|
|
23
|
+
- **content** *(required)*: indexed and searchable
|
|
24
|
+
- **metadata** *(optional)*: **not searchable**, but retrievable and filterable
|
|
25
|
+
|
|
26
|
+
### TypeScript / Python Example
|
|
27
|
+
```ts
|
|
28
|
+
import { Search } from "@upstash/search";
|
|
29
|
+
const client = new Search({
|
|
30
|
+
url: process.env.UPSTASH_SEARCH_REST_URL,
|
|
31
|
+
token: process.env.UPSTASH_SEARCH_REST_TOKEN
|
|
32
|
+
});
|
|
33
|
+
const index = client.index("movies");
|
|
34
|
+
await index.upsert([
|
|
35
|
+
{
|
|
36
|
+
id: "star-wars",
|
|
37
|
+
content: { title: "Star Wars", genre: "sci-fi", category: "classic" },
|
|
38
|
+
metadata: { director: "George Lucas" }
|
|
39
|
+
}
|
|
40
|
+
]);
|
|
41
|
+
```
|
|
42
|
+
```python
|
|
43
|
+
from upstash_search import Search
|
|
44
|
+
client = Search(url=URL, token=TOKEN)
|
|
45
|
+
index = client.index("movies")
|
|
46
|
+
index.upsert(documents=[{
|
|
47
|
+
"id": "movie-0",
|
|
48
|
+
"content": {
|
|
49
|
+
"title": "Star Wars",
|
|
50
|
+
"overview": "Sci-fi space opera",
|
|
51
|
+
"genre": "sci-fi",
|
|
52
|
+
"category": "classic",
|
|
53
|
+
},
|
|
54
|
+
"metadata": {"poster": "https://poster.link/starwars.jpg"}
|
|
55
|
+
}])
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Content vs Metadata (Essential Concepts)
|
|
61
|
+
- **Content**
|
|
62
|
+
- Required
|
|
63
|
+
- Indexed and searchable
|
|
64
|
+
- Can be used in filters
|
|
65
|
+
- Ideal for textual and semantic data
|
|
66
|
+
|
|
67
|
+
- **Metadata**
|
|
68
|
+
- Optional
|
|
69
|
+
- Not indexed → **cannot be searched**
|
|
70
|
+
- Still **filterable** using `@metadata.key`
|
|
71
|
+
- Used for contextual / reference fields
|
|
72
|
+
|
|
73
|
+
Example:
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"content": { "title": "Star Wars", "genre": "sci-fi" },
|
|
77
|
+
"metadata": { "director": "George Lucas", "sku": "SW-001" }
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Search
|
|
84
|
+
Searching supports semantic + keyword hybrid search, optional reranking, and filters.
|
|
85
|
+
|
|
86
|
+
### TypeScript / Python Example
|
|
87
|
+
```ts
|
|
88
|
+
const res = await index.search({ query: "space opera", limit: 2, reranking: true });
|
|
89
|
+
```
|
|
90
|
+
```python
|
|
91
|
+
scores = index.search(query="space opera", limit=2, reranking=True)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Filtering
|
|
97
|
+
Filters restrict results using SQL‑like syntax or structured filters (TypeScript only). Both **content fields** and **metadata fields** can be used.
|
|
98
|
+
|
|
99
|
+
**Metadata fields require `@metadata.` prefix**.
|
|
100
|
+
|
|
101
|
+
### Example (String Filters)
|
|
102
|
+
```ts
|
|
103
|
+
await index.search({
|
|
104
|
+
query: "sony headphones",
|
|
105
|
+
filter: "warehouse_location = 'A3-15' AND @metadata.supplier_id = 'SUP-123'"
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Example (Type‑safe Filters, TS SDK)
|
|
110
|
+
```ts
|
|
111
|
+
await index.search({
|
|
112
|
+
query: "sony headphones",
|
|
113
|
+
filter: {
|
|
114
|
+
AND: [
|
|
115
|
+
{ category: { equals: "Electronics" } },
|
|
116
|
+
{ "@metadata.count": { greaterThanOrEquals: 3 } }
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Common operators:
|
|
123
|
+
- equals, not equals
|
|
124
|
+
- <, <=, >, >=
|
|
125
|
+
- glob / not glob
|
|
126
|
+
- in / not in
|
|
127
|
+
- contains / not contains (arrays)
|
|
128
|
+
- has field / has not field
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Reranking
|
|
133
|
+
Reranking reorders results using a high‑accuracy model.
|
|
134
|
+
|
|
135
|
+
- Disabled by default (`false`)
|
|
136
|
+
- When `true`, improves relevance but costs $1 per 1K reranked items
|
|
137
|
+
|
|
138
|
+
Example:
|
|
139
|
+
```ts
|
|
140
|
+
await index.search({ query: "space opera", reranking: true });
|
|
141
|
+
```
|
|
142
|
+
```python
|
|
143
|
+
index.search(query="space opera", reranking=True)
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Use when:
|
|
147
|
+
- Precision is critical
|
|
148
|
+
- Results require more semantic depth
|
|
149
|
+
- Queries are ambiguous or conceptual
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Common Pitfalls
|
|
154
|
+
- Missing **content** field → upsert fails.
|
|
155
|
+
- Metadata fields are **not searchable**.
|
|
156
|
+
- Metadata must be prefixed as `@metadata.key` in filters.
|
|
157
|
+
- Filters may return fewer than `topK` results if too selective.
|
|
158
|
+
- Indexes are created automatically on first `upsert`.
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# SDK Overview
|
|
2
|
+
|
|
3
|
+
This skill provides a concise but complete reference for using the Upstash Search TypeScript SDK. It focuses on practical usage patterns, common pitfalls, and efficient examples that combine multiple commands. Use this skill whenever interacting with the Upstash Search SDK, generating agents that must query, mutate, or paginate search indexes.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Client Initialization
|
|
8
|
+
|
|
9
|
+
You must configure a Search client using either environment variables or a config object.
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { Search } from "@upstash/search";
|
|
13
|
+
|
|
14
|
+
// Option 1: with explicit config
|
|
15
|
+
const client = new Search({
|
|
16
|
+
url: process.env.UPSTASH_SEARCH_REST_URL!,
|
|
17
|
+
token: process.env.UPSTASH_SEARCH_REST_TOKEN!
|
|
18
|
+
});
|
|
19
|
+
const index = client.index("movies");
|
|
20
|
+
|
|
21
|
+
// Option 2: using fromEnv (Node.js platform only)
|
|
22
|
+
// The constructor will automatically read from process.env if url/token not provided
|
|
23
|
+
const client2 = new Search({}); // reads UPSTASH_SEARCH_REST_URL and UPSTASH_SEARCH_REST_TOKEN
|
|
24
|
+
const index2 = client2.index("movies");
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Type-safe usage:
|
|
28
|
+
```ts
|
|
29
|
+
type Content = { title: string, genre: string };
|
|
30
|
+
type Metadata = { year: number };
|
|
31
|
+
const indexTyped = client.index<Content, Metadata>("movies");
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Upsert (add or update documents)
|
|
37
|
+
|
|
38
|
+
Pitfalls:
|
|
39
|
+
- Document structure must match the index schema.
|
|
40
|
+
- Content/metadata types are enforced when using generics.
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
// Single
|
|
44
|
+
await index.upsert({
|
|
45
|
+
id: "star-wars",
|
|
46
|
+
content: { title: "Star Wars", genre: "sci-fi" },
|
|
47
|
+
metadata: { year: 1977 }
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Multiple
|
|
51
|
+
await index.upsert([
|
|
52
|
+
{ id: "inception", content: { title: "Inception", genre: "action" }, metadata: { year: 2010 } },
|
|
53
|
+
{ id: "matrix", content: { title: "The Matrix", genre: "sci-fi" }, metadata: { year: 1999 } },
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
// Update
|
|
57
|
+
await index.upsert({ id: "star-wars", content: { title: "A New Hope" } });
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Fetch (retrieve documents)
|
|
63
|
+
|
|
64
|
+
Pitfalls:
|
|
65
|
+
- Returns null for IDs not found.
|
|
66
|
+
- Supports prefix matching.
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
// By IDs
|
|
70
|
+
const docs = await index.fetch({ ids: ["star-wars", "inception"] });
|
|
71
|
+
|
|
72
|
+
// By prefix
|
|
73
|
+
const sciFi = await index.fetch({ prefix: "star-" });
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Delete (IDs, prefix, or filter)
|
|
79
|
+
|
|
80
|
+
Pitfalls:
|
|
81
|
+
- **Filter deletion is O(N)** and slow on large indexes.
|
|
82
|
+
- Prefix deletion removes *all* matching documents.
|
|
83
|
+
|
|
84
|
+
```ts
|
|
85
|
+
// ID list
|
|
86
|
+
await index.delete(["star-wars", "inception"]);
|
|
87
|
+
|
|
88
|
+
// Single ID
|
|
89
|
+
await index.delete("star-wars");
|
|
90
|
+
|
|
91
|
+
// Prefix
|
|
92
|
+
await index.delete({ prefix: "star-" });
|
|
93
|
+
|
|
94
|
+
// Filter — expensive
|
|
95
|
+
await index.delete({ filter: "age > 30" });
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Search (AI‑powered)
|
|
101
|
+
|
|
102
|
+
Pitfalls:
|
|
103
|
+
- Default `limit = 5`.
|
|
104
|
+
- Scores are 0–1.
|
|
105
|
+
- Use filters to restrict by document fields.
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
// Basic
|
|
109
|
+
const results = await index.search({ query: "space opera", limit: 3 });
|
|
110
|
+
|
|
111
|
+
// With reranking
|
|
112
|
+
await index.search({ query: "space opera", limit: 3, reranking: true });
|
|
113
|
+
|
|
114
|
+
// With filter
|
|
115
|
+
await index.search({ query: "space", filter: "category = 'classic'" });
|
|
116
|
+
|
|
117
|
+
// Adjust semantic vs keyword weighting
|
|
118
|
+
await index.search({ query: "robots", semanticWeight: 0.2 });
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Range (cursor pagination)
|
|
124
|
+
|
|
125
|
+
Pitfalls:
|
|
126
|
+
- Stateless: you must pass all parameters every call.
|
|
127
|
+
- `cursor = "0"` for the first request.
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
let cursor = "0";
|
|
131
|
+
while (cursor !== "") {
|
|
132
|
+
const res = await index.range({ cursor, limit: 2, prefix: "test-" });
|
|
133
|
+
cursor = res.nextCursor;
|
|
134
|
+
console.log(res.documents);
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Reset (delete all documents)
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
await index.reset(); // "Success"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Info (index or database level)
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
// Index-level
|
|
152
|
+
const indexInfo = await index.info();
|
|
153
|
+
// { documentCount, pendingDocumentCount }
|
|
154
|
+
|
|
155
|
+
// Database-level
|
|
156
|
+
const dbInfo = await client.info();
|
|
157
|
+
// { documentCount, pendingDocumentCount, diskSize, indexes: {...} }
|
|
158
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upstash-vector-js
|
|
3
|
+
description: Skills for Upstash Vector features, TypeScript/JavaScript SDK usage, and integrations. Use when users ask how to work with Vector, its TS SDK, features, or supported frameworks.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Vector Documentation Skill
|
|
7
|
+
|
|
8
|
+
## Quick Start
|
|
9
|
+
|
|
10
|
+
Vector is a high‑performance vector database for storing, querying, and managing vector embeddings.
|
|
11
|
+
|
|
12
|
+
Basic workflow:
|
|
13
|
+
|
|
14
|
+
- Install the Vector TS SDK.
|
|
15
|
+
- Connect to a Vector instance.
|
|
16
|
+
- Upsert vectors, query them, and manage namespaces.
|
|
17
|
+
|
|
18
|
+
Example (TypeScript):
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { Index } from "@upstash/vector";
|
|
22
|
+
const index = new Index({
|
|
23
|
+
url: process.env.UPSTASH_VECTOR_REST_URL!,
|
|
24
|
+
token: process.env.UPSTASH_VECTOR_REST_TOKEN!,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
await index.upsert([{ id: "1", vector: [0.1, 0.2], metadata: { tag: "example" } }]);
|
|
28
|
+
|
|
29
|
+
const results = await index.query({
|
|
30
|
+
vector: [0.1, 0.2],
|
|
31
|
+
topK: 5,
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
For full usage, refer to the linked skill files below.
|
|
36
|
+
|
|
37
|
+
## Other Skill Files
|
|
38
|
+
|
|
39
|
+
### TS SDK Reference
|
|
40
|
+
|
|
41
|
+
- `sdk-methods`: Explains SDK commands: delete, fetch, info, query, range, reset, resumable-query, upsert
|
|
42
|
+
|
|
43
|
+
### Features
|
|
44
|
+
|
|
45
|
+
- `features/namespaces`: Explains namespaces and dataset organization.
|
|
46
|
+
- `features/index-structure`: Covers hybrid and sparse index structures.
|
|
47
|
+
- `features/filtering-and-metadata`: Details metadata storage and server-side filtering.
|
|
48
|
+
|
|
49
|
+
Use these files for deeper guidance on SDK usage, advanced configurations, algorithms, and integrations.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Vector Feature: Filtering and Metadata
|
|
2
|
+
|
|
3
|
+
Upstash Vector supports attaching metadata and optional data to vectors. Metadata is structured JSON used for filtering; data is unstructured content returned in responses but not filterable.
|
|
4
|
+
|
|
5
|
+
Filtering uses a SQL‑like syntax and supports nested objects, array indexing, glob patterns, and boolean logic. The system applies both in‑filtering and post‑filtering according to a filtering budget, so highly selective filters may return fewer results than `topK`.
|
|
6
|
+
|
|
7
|
+
## Setting Metadata and Data
|
|
8
|
+
|
|
9
|
+
You can upsert vectors with metadata and optional data. Metadata is any JSON structure; data is typically raw text.
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { Index } from "@upstash/vector";
|
|
13
|
+
|
|
14
|
+
const index = new Index({ url: "...", token: "..." });
|
|
15
|
+
|
|
16
|
+
await index.upsert([
|
|
17
|
+
{
|
|
18
|
+
id: "v0",
|
|
19
|
+
vector: [0.1, 0.2],
|
|
20
|
+
metadata: { city: "Istanbul", population: 15460000 },
|
|
21
|
+
data: "Istanbul info",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: "v1",
|
|
25
|
+
data: "Upstash is a serverless data platform.",
|
|
26
|
+
},
|
|
27
|
+
]);
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Querying with Metadata Filters
|
|
31
|
+
|
|
32
|
+
Include metadata in results and apply filters using SQL‑like expressions.
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
await index.query({
|
|
36
|
+
vector: [0.9, 0.3],
|
|
37
|
+
topK: 5,
|
|
38
|
+
includeMetadata: true,
|
|
39
|
+
filter: "population >= 1000000 AND geography.continent = 'Asia'",
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Supported Operators
|
|
44
|
+
|
|
45
|
+
- Equality: `=`, `!=`
|
|
46
|
+
- Numeric comparators: `<`, `<=`, `>`, `>=`
|
|
47
|
+
- Set membership: `IN`, `NOT IN`
|
|
48
|
+
- Array tests: `CONTAINS`, `NOT CONTAINS`
|
|
49
|
+
- Field existence: `HAS FIELD`, `HAS NOT FIELD`
|
|
50
|
+
- Glob string matching: `GLOB`, `NOT GLOB`
|
|
51
|
+
|
|
52
|
+
Glob wildcards: `*`, `?`, `[]`, `[^]`.
|
|
53
|
+
|
|
54
|
+
### Boolean Logic
|
|
55
|
+
|
|
56
|
+
Use `AND` and `OR`, with parentheses for grouping. `AND` has higher precedence than `OR`.
|
|
57
|
+
|
|
58
|
+
### Nested Objects and Arrays
|
|
59
|
+
|
|
60
|
+
- Access nested fields: `economy.currency`, `geography.coordinates.latitude`.
|
|
61
|
+
- Index arrays: `industries[0]` or from end: `industries[#-1]`.
|
|
62
|
+
|
|
63
|
+
Example:
|
|
64
|
+
|
|
65
|
+
```SQL
|
|
66
|
+
economy.major_industries CONTAINS 'Tourism' AND geography.coordinates.latitude >= 35
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Retrieving Metadata and Data
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
// query
|
|
73
|
+
await index.query({
|
|
74
|
+
vector: [0.9, 0.3],
|
|
75
|
+
topK: 5,
|
|
76
|
+
includeMetadata: true,
|
|
77
|
+
includeData: true,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// range
|
|
81
|
+
await index.range({ cursor: "0", limit: 3, includeMetadata: true });
|
|
82
|
+
```
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Vector Feature: Index Structure
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Upstash Vector supports three major index structures:
|
|
6
|
+
|
|
7
|
+
- **Dense indexes**: semantic matching via dense embeddings.
|
|
8
|
+
- **Sparse indexes**: exact/near-exact token and feature matching.
|
|
9
|
+
- **Hybrid indexes**: combine dense + sparse results, optionally reranked.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Key Concepts
|
|
14
|
+
|
|
15
|
+
### Sparse Vectors
|
|
16
|
+
|
|
17
|
+
- High‑dimensional, mostly‑zero representations.
|
|
18
|
+
- Represented as two equal‑length arrays:
|
|
19
|
+
- `indices`: int32 positions of non‑zero elements
|
|
20
|
+
- `values`: float32 values
|
|
21
|
+
- Upstash limit: **max 1,000 non‑zero entries per sparse vector**.
|
|
22
|
+
- Useful for exact token/word matching (BM25, SPLADE, etc.).
|
|
23
|
+
|
|
24
|
+
### Hybrid Vectors
|
|
25
|
+
|
|
26
|
+
- Combine dense semantic vectors with sparse exact‑match vectors.
|
|
27
|
+
- Hybrid queries run both dense + sparse search and fuse results.
|
|
28
|
+
- Require **both** components (`vector` and `sparseVector`).
|
|
29
|
+
|
|
30
|
+
### Fusion Algorithms
|
|
31
|
+
|
|
32
|
+
- **RRF (default)**: ranking‑based, simple, robust, ignores score magnitudes.
|
|
33
|
+
- **DBSF**: normalizes scores using distribution statistics; more sensitive to score ranges.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Common Pitfalls
|
|
38
|
+
|
|
39
|
+
- **Hybrid upserts require both dense and sparse vectors**; omitting either fails.
|
|
40
|
+
- **Indexes with embedding models (dense, sparse or both)** let you upsert/query using text; indexes without embedding models do not.
|
|
41
|
+
- In Hybrin indexes, dense‑only or sparse‑only querying is allowed, but **fusion happens only when both are provided**.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Usage with Embedding Models
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
await index.upsert([
|
|
49
|
+
{
|
|
50
|
+
id: "t1",
|
|
51
|
+
data: "Upstash Vector provides sparse models.",
|
|
52
|
+
},
|
|
53
|
+
]);
|
|
54
|
+
|
|
55
|
+
const results = await index.query({
|
|
56
|
+
data: "Upstash Vector",
|
|
57
|
+
topK: 5,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
import { WeightingStrategy } from "@upstash/vector";
|
|
61
|
+
await index.query({
|
|
62
|
+
data: "Upstash Vector",
|
|
63
|
+
weightingStrategy: WeightingStrategy.IDF,
|
|
64
|
+
});
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Sparse Index Usage
|
|
68
|
+
|
|
69
|
+
### Upserting Sparse Vectors
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
await index.upsert([
|
|
73
|
+
{
|
|
74
|
+
id: "x1",
|
|
75
|
+
sparseVector: {
|
|
76
|
+
indices: [1, 2, 3],
|
|
77
|
+
values: [0.1, 0.2, 0.3],
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
]);
|
|
81
|
+
|
|
82
|
+
const results = await index.query({
|
|
83
|
+
sparseVector: {
|
|
84
|
+
indices: [3, 5],
|
|
85
|
+
values: [0.3, 0.5],
|
|
86
|
+
},
|
|
87
|
+
topK: 5,
|
|
88
|
+
includeMetadata: true,
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- Scores use **inner product**, matching only overlapping indices.
|
|
93
|
+
- Results may be fewer than `top_k` if no overlapping dims exist.
|
|
94
|
+
|
|
95
|
+
## Hybrid Index Usage
|
|
96
|
+
|
|
97
|
+
### Upserting Dense + Sparse
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
await index.upsert([
|
|
101
|
+
{
|
|
102
|
+
id: "h1",
|
|
103
|
+
vector: [0.1, 0.5],
|
|
104
|
+
sparseVector: {
|
|
105
|
+
indices: [1, 2],
|
|
106
|
+
values: [0.1, 0.2],
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
]);
|
|
110
|
+
|
|
111
|
+
const results = await index.query({
|
|
112
|
+
vector: [0.5, 0.4],
|
|
113
|
+
sparseVector: {
|
|
114
|
+
indices: [3, 5],
|
|
115
|
+
values: [0.3, 0.5],
|
|
116
|
+
},
|
|
117
|
+
topK: 5,
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
import { FusionAlgorithm } from "@upstash/vector";
|
|
121
|
+
await index.query({
|
|
122
|
+
vector: [0.5, 0.4],
|
|
123
|
+
sparseVector: {
|
|
124
|
+
indices: [2, 3],
|
|
125
|
+
values: [0.1, 0.2],
|
|
126
|
+
},
|
|
127
|
+
fusionAlgorithm: FusionAlgorithm.RRF, // or FusionAlgorithm.DBSF
|
|
128
|
+
});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Custom Reranking
|
|
134
|
+
|
|
135
|
+
Sometimes RRF/DBSF is insufficient (e.g., using bge‑reranker-v2-m3). Query dense and sparse portions separately and rerank in your own model.
|
|
136
|
+
|
|
137
|
+
### Custom Rerank (vector input)
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
// Dense-only
|
|
141
|
+
const dense = await index.query({
|
|
142
|
+
vector: [0.5, 0.4],
|
|
143
|
+
topK: 5,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
// Sparse-only
|
|
147
|
+
const sparse = await index.query({
|
|
148
|
+
sparseVector: {
|
|
149
|
+
indices: [3, 5],
|
|
150
|
+
values: [0.3, 0.5],
|
|
151
|
+
},
|
|
152
|
+
topK: 5,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// Custom rerank dense + sparse...
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Custom Rerank (text input with hosted models)
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
import { QueryMode } from "@upstash/vector";
|
|
162
|
+
|
|
163
|
+
const dense = await index.query({
|
|
164
|
+
data: "Upstash Vector",
|
|
165
|
+
queryMode: QueryMode.DENSE,
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
const sparse = await index.query({
|
|
169
|
+
data: "Upstash Vector",
|
|
170
|
+
queryMode: QueryMode.SPARSE,
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Rerank...
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Agent Implementation Notes
|
|
179
|
+
|
|
180
|
+
- Always check whether the index supports **hosted embeddings** before using `data=` fields.
|
|
181
|
+
- Use `await index.info()` to check: if `denseIndex?.embeddingModel` or `sparseIndex?.embeddingModel` exists, the index supports text-based embeddings via the `data` field.
|
|
182
|
+
- Example:
|
|
183
|
+
```ts
|
|
184
|
+
const info = await index.info();
|
|
185
|
+
const hasDenseEmbedding = !!info.denseIndex?.embeddingModel;
|
|
186
|
+
const hasSparseEmbedding = !!info.sparseIndex?.embeddingModel;
|
|
187
|
+
```
|
|
188
|
+
- For hybrid indexes:
|
|
189
|
+
- Always provide _both_ `vector` and `sparseVector` unless intentionally querying only one modality.
|
|
190
|
+
- For reranking workflows:
|
|
191
|
+
- Use dense-only + sparse-only queries, never hybrid queries (as fusion is already applied).
|
|
192
|
+
- When building sparse vectors manually:
|
|
193
|
+
- Ensure indices are sorted, unique, and below the model dimension.
|