SKILL.md
Claude Architecture Variants
Overview
Five architecture patterns for Claude-powered applications: Chatbot (stateless API wrapper), RAG (retrieval-augmented generation with vector search), Agent (tool use loop), Content Pipeline (batch processing), and Evaluation (using Claude as a judge). Each includes complete code and a comparison table.
1. Chatbot (Stateless API Wrapper)
Simplest pattern — proxy Claude with a system prompt.
// api/chat.ts
export async function POST(req: Request) {
const { messages } = await req.json();
const response = await client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 2048,
system: 'You are a helpful assistant for our SaaS product.',
messages,
stream: true,
});
return new Response(response.toReadableStream());
}
Best for: Customer support, Q&A, simple conversational interfaces.
2. RAG (Retrieval-Augmented Generation)
Fetch relevant context, inject into prompt, generate grounded answer.
async function ragQuery(question: string) {
// 1. Embed the question (use Voyage, OpenAI, or Cohere — not Anthropic)
const embedding = await embeddingClient.embed(question);
// 2. Search vector DB for relevant chunks
const chunks = await vectorDb.query(embedding, { topK: 5 });
// 3. Send to Claude with context
const message = await client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 2048,
system: `Answer based on the provided context. If the context doesn't contain the answer, say so.`,
messages: [{
role: 'user',
content: `Context:\n${chunks.map(c => c.text).join('\n---\n')}\n\nQuestion: ${question}`,
}],
});
return message.content[0].text;
}
Best for: Documentation Q&A, knowledge bases, support with source citations.
3. Agent (Tool Use Loop)
Claude decides which tools to call, you execute them, loop until done.
async function agentLoop(userInput: string, tools: Anthropic.Tool[]) {
let messages: MessageParam[] = [{ role: 'user', content: userInput }];
while (true) {
const response = await client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 4096,
tools,
messages,
});
messages.push({ role: 'assistant', content: response.content });
if (response.stop_reason === 'end_turn') {
return response.content.find(b => b.type === 'text')?.text;
}
// Execute tools
const results = [];
for (const block of response.content) {
if (block.type === 'tool_use') {
const result = await executeTool(block.name, block.input);
results.push({ type: 'tool_result', tool_use_id: block.id, content: JSON.stringify(result) });
}
}
messages.push({ role: 'user', content: results });
}
}
