Claude-code-plugins-plus clade-migration-deep-dive
install
source · Clone the upstream repo
git clone https://github.com/jeremylongshore/claude-code-plugins-plus-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/jeremylongshore/claude-code-plugins-plus-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/saas-packs/claude-pack/skills/clade-migration-deep-dive" ~/.claude/skills/jeremylongshore-claude-code-plugins-plus-clade-migration-deep-dive && rm -rf "$T"
manifest:
plugins/saas-packs/claude-pack/skills/clade-migration-deep-dive/SKILL.mdsource content
Migrate from OpenAI to Anthropic
Overview
Migrate from OpenAI/GPT to Anthropic/Claude. Covers the complete API mapping (endpoints, models, response shapes), SDK swap with before/after code, five key differences (max_tokens required, system as top-level param, alternating messages, response path, streaming events), and tool use migration.
API Mapping
| OpenAI | Anthropic | Notes |
|---|---|---|
| | Different request/response shape |
| | Different model IDs |
| | Different response path |
in messages array | as separate parameter | Claude uses top-level |
| System prompt: "Respond in JSON only" | No native JSON mode |
/ | (similar but different schema) | Input schema differences |
| N/A — use Voyage or Cohere | No embeddings API |
SDK Swap
Instructions
Step 1: Before (OpenAI)
import OpenAI from 'openai'; const openai = new OpenAI(); const response = await openai.chat.completions.create({ model: 'gpt-4o', messages: [ { role: 'system', content: 'You are helpful.' }, { role: 'user', content: 'Hello' }, ], }); console.log(response.choices[0].message.content);
Step 2: After (Anthropic)
import Anthropic from '@claude-ai/sdk'; const anthropic = new Anthropic(); const response = await anthropic.messages.create({ model: 'claude-sonnet-4-20250514', max_tokens: 1024, // Required (not optional like OpenAI) system: 'You are helpful.', // Separate from messages messages: [ { role: 'user', content: 'Hello' }, ], }); console.log(response.content[0].text);
Key Differences
is required — OpenAI defaults it, Anthropic requires itmax_tokens
is a top-level param — not a message in the arraysystem- First message must be
— can't start with assistantuser - Messages must alternate — no two user or two assistant messages in a row
- Response shape —
notcontent[0].textchoices[0].message.content - Streaming events — different event types and structure
Tool Use Migration
// OpenAI tool definition { type: 'function', function: { name: 'get_weather', parameters: { ... } } } // Anthropic tool definition { name: 'get_weather', input_schema: { ... } } // Flatter structure
Grep & Replace
# Find all OpenAI imports grep -rn "from 'openai'" --include="*.ts" . grep -rn "import OpenAI" --include="*.ts" . # Find response access patterns to update grep -rn "choices\[0\]" --include="*.ts" . grep -rn "message.content" --include="*.ts" . # May need updating
Output
- All
imports replaced withopenai@claude-ai/sdk - Response access patterns updated (
→choices[0].message.content
)content[0].text - System prompts moved from messages array to top-level
parametersystem
added to all API calls (required, not optional)max_tokens- Tool definitions restructured to Anthropic format
Error Handling
| Error | Cause | Solution |
|---|---|---|
| API Error | Check error type and status code | See |
Examples
See API Mapping table, Before/After SDK code, Key Differences list, Tool Use Migration, and Grep & Replace commands above.
Resources
Next Steps
See
clade-sdk-patterns for production Anthropic SDK patterns.
Prerequisites
- Existing OpenAI integration to migrate
- Access to codebase with search capability
- Test suite for comparing outputs between providers