Claude-skill-registry Convex Agents RAG
Implements Retrieval-Augmented Generation (RAG) patterns to enhance agents with custom knowledge bases. Use this when agents need to search through documents, retrieve context from a knowledge base, or ground responses in specific data.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/convex-agents-rag" ~/.claude/skills/majiayu000-claude-skill-registry-convex-agents-rag && rm -rf "$T"
manifest:
skills/data/convex-agents-rag/SKILL.mdsource content
Purpose
Enables agents to search through custom content and knowledge bases to provide accurate, context-grounded responses. RAG combines LLM capabilities with semantic search.
When to Use This Skill
- Agents need to reference a knowledge base or document collection
- Grounding answers in specific data (policies, product docs, etc.)
- Semantic search across custom content
- Building a search + generation system (FAQ, documentation, support)
- Reducing hallucinations by constraining responses to known information
- Managing user-specific or team-specific knowledge namespaces
Setup
Install and configure RAG in your
convex.config.ts:
import { defineApp } from "convex/server"; import agent from "@convex-dev/agent/convex.config"; import rag from "@convex-dev/rag/convex.config"; const app = defineApp(); app.use(agent); app.use(rag); export default app;
Add Content
Ingest documents into a namespace:
import { rag } from "@convex-dev/rag"; export const addContent = action({ args: { userId: v.string(), key: v.string(), text: v.string() }, handler: async (ctx, { userId, key, text }) => { const namespace = `user:${userId}`; await rag.addContent(ctx, components.rag, { namespace, key, text, filters: { filterNames: [filename] }, }); }, });
Search and Generate
Use RAG with agents:
export const answerWithContext = action({ args: { threadId: v.string(), userId: v.string(), question: v.string() }, handler: async (ctx, { threadId, userId, question }) => { const { thread } = await myAgent.continueThread(ctx, { threadId }); const context = await rag.search(ctx, components.rag, { namespace: `user:${userId}`, query: question, limit: 10, }); const augmentedPrompt = `# Context:\n\n${context.text}\n\n# Question:\n\n${question}`; const result = await thread.generateText({ prompt: augmentedPrompt }); return result.text; }, });
Key Principles
- Namespaces isolate data: Use
oruser:userId
for multi-tenant safetyteam:teamId - Hybrid search: Combine text and vector search for better results
- Filtering: Use
to target specific documentsfilterNames
Next Steps
- See fundamentals for basic agent setup
- See context for advanced context customization