计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
anth-migration-deep-dive【效率与协作】Migrate to Claude API from OpenAI, Gemini, or other LLM providers. Use when switching from GPT-4 to Claude, migrating from Text Completions, or building a multi-provider abstraction layer. Trigger with phrases like "migrate to claude", "openai to anthropic", "switch from gpt to claude", "multi-provider llm".
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: anth-migration-deep-dive description: 'Migrate to Claude API from OpenAI, Gemini, or other LLM providers.
Use when switching from GPT-4 to Claude, migrating from Text Completions,
or building a multi-provider abstraction layer.
Trigger with phrases like "migrate to claude", "openai to anthropic",
"switch from gpt to claude", "multi-provider llm".
' allowed-tools: Read, Write, Edit, Bash(npm:*), Grep version: 1.7.0 license: MIT author: Jeremy Longshore jeremy@intentsolutions.io tags:
Migration strategies for switching to Claude from OpenAI, Google, or other LLM providers, including API mapping, prompt translation, and multi-provider abstraction.
| OpenAI | Anthropic | Notes |
|---|---|---|
openai.ChatCompletion.create() | anthropic.messages.create() | Different response shape |
model: "gpt-4" | model: "claude-sonnet-4-20250514" | Different model IDs |
messages: [{role, content}] | messages: [{role, content}] | Same format |
functions / tools | tools | Similar but different schema key names |
function_call | tool_choice | Different naming |
response.choices[0].message.content | response.content[0].text | Different access path |
stream: true → yields chunks | stream: true → SSE events | Different event format |
System message in messages[] | system parameter (separate) | Claude separates system prompt |
n (multiple completions) | Not supported | Use multiple requests |
logprobs | Not supported | N/A |
# === OpenAI ===
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are helpful."},
{"role": "user", "content": "Hello"}
],
max_tokens=1024,
temperature=0.7
)
text = response.choices[0].message.content
# === Anthropic ===
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-20250514",
system="You are helpful.", # System prompt is separate
messages=[
{"role": "user", "content": "Hello"}
],
max_tokens=1024, # Required (not optional)
temperature=0.7
)
text = response.content[0].text
# OpenAI tools format
openai_tools = [{
"type": "function",
"function": {
"name": "get_weather",
"parameters": {"type": "object", "properties": {"city": {"type": "string"}}}
}
}]
# Anthropic tools format — flatter structure
anthropic_tools = [{
"name": "get_weather",
"description": "Get weather for a city", # Required in Anthropic
"input_schema": {"type": "object", "properties": {"city": {"type": "string"}}}
}]
from abc import ABC, abstractmethod
class LLMProvider(ABC):
@abstractmethod
def complete(self, prompt: str, system: str = "", **kwargs) -> str: ...
class AnthropicProvider(LLMProvider):
def __init__(self):
import anthropic
self.client = anthropic.Anthropic()
def complete(self, prompt: str, system: str = "", **kwargs) -> str:
msg = self.client.messages.create(
model=kwargs.get("model", "claude-sonnet-4-20250514"),
max_tokens=kwargs.get("max_tokens", 1024),
system=system,
messages=[{"role": "user", "content": prompt}]
)
return msg.content[0].text
class OpenAIProvider(LLMProvider):
def __init__(self):
from openai import OpenAI
self.client = OpenAI()
def complete(self, prompt: str, system: str = "", **kwargs) -> str:
messages = []
if system:
messages.append({"role": "system", "content": system})
messages.append({"role": "user", "content": prompt})
resp = self.client.chat.completions.create(
model=kwargs.get("model", "gpt-4"),
messages=messages,
max_tokens=kwargs.get("max_tokens", 1024)
)
return resp.choices[0].message.content
messages[] to system parameter.choices[0].message.content → .content[0].text)max_tokens explicit (required in Anthropic, optional in OpenAI)system parameter, make max_tokens explicit, and validate alternating message roles and tool schemas before calling the target provider.Return a migration receipt containing source/target provider classes, adapter version, mapped capabilities, fixture and comparison counts, aggregate parity metrics, canary decision, rollback reference, and cleanup/retention status. Redact all prompt, completion, tool, account, and credential values.
Replay a synthetic fixture with one system instruction, one user turn, and a no-op get_weather tool through both adapters. Record fixture_count=1; tool_side_effects=0; source_status=pass; target_status=pass; content_logged=0; canary=approved, while comparing content through an access-controlled evaluator rather than the receipt.
For advanced debugging, see anth-advanced-troubleshooting.