convex-agents-context
skillCustomizes what information the LLM receives for each generation. Use this to control message history, implement RAG context injection, search across threads, and provide custom context.
apm::install
apm install @majiayu000/convex-agents-contextapm::skill.md
---
name: "Convex Agents Context"
description: "Customizes what information the LLM receives for each generation. Use this to control message history, implement RAG context injection, search across threads, and provide custom context."
---
## Purpose
By default, the Agent includes recent messages as context. This skill covers customizing that behavior for advanced patterns like cross-thread search, memory injection, summarization, and filtering.
## When to Use This Skill
- Limiting context window to prevent token overflow
- Searching across multiple threads for relevant context
- Injecting memories or user profiles into every prompt
- Summarizing long conversations before continuing
- Filtering out sensitive or irrelevant messages
- Adding few-shot examples to guide LLM
## Configure Default Context Options
```typescript
const myAgent = new Agent(components.agent, {
name: "My Agent",
languageModel: openai.chat("gpt-4o-mini"),
contextOptions: {
recentMessages: 50,
excludeToolMessages: true,
searchOptions: {
limit: 10,
textSearch: true,
vectorSearch: false,
},
},
});
```
## Override Context Per Call
```typescript
export const generateWithCustomContext = action({
args: { threadId: v.string(), prompt: v.string() },
handler: async (ctx, { threadId, prompt }) => {
const result = await myAgent.generateText(
ctx,
{ threadId },
{ prompt },
{
contextOptions: {
recentMessages: 20,
searchOptions: {
limit: 5,
textSearch: true,
vectorSearch: true,
},
},
}
);
return result.text;
},
});
```
## Search Across Threads
```typescript
export const generateWithCrossThreadContext = action({
args: { threadId: v.string(), userId: v.string(), prompt: v.string() },
handler: async (ctx, { threadId, userId, prompt }) => {
const result = await myAgent.generateText(
ctx,
{ threadId, userId },
{ prompt },
{
contextOptions: {
searchOtherThreads: true,
searchOptions: {
limit: 15,
textSearch: true,
vectorSearch: true,
},
},
}
);
return result.text;
},
});
```
## Custom Context Handler
Completely customize context:
```typescript
const myAgent = new Agent(components.agent, {
name: "My Agent",
languageModel: openai.chat("gpt-4o-mini"),
contextHandler: async (ctx, args) => {
const userMemories = await getUserMemories(ctx, args.userId);
const examples = getExamples();
return [
...userMemories,
...examples,
...args.search,
...args.recent,
...args.inputMessages,
];
},
});
```
## Fetch Context Manually
Get context without calling LLM:
```typescript
import { fetchContextWithPrompt } from "@convex-dev/agent";
export const getContextForPrompt = action({
args: { threadId: v.string(), prompt: v.string() },
handler: async (ctx, { threadId, prompt }) => {
const { messages } = await fetchContextWithPrompt(ctx, components.agent, {
threadId,
prompt,
contextOptions: {
recentMessages: 20,
searchOptions: { limit: 10, textSearch: true },
},
});
return messages;
},
});
```
## Key Principles
- **Default context is sufficient**: Most use cases work with defaults
- **Search improves relevance**: Enable for long conversations
- **userId required for cross-thread**: Provide when searching multiple threads
- **Context handlers are powerful**: Use for memories, examples, special formatting
- **Recent messages take precedence**: Used after search in context order
## Next Steps
- See **rag** for knowledge base context injection
- See **fundamentals** for agent setup
- See **rate-limiting** for token management