claude-code-sdk
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseClaude Code SDK Integration
Claude Code SDK 集成
Overview
概述
Claude Code SDK () 是 Anthropic 官方提供的 Python 套件,用於在應用程式中整合 Claude AI Agent 功能。它支援 OAuth 認證(透過 )和 API Key 認證,讓開發者可以利用 Claude Max/Pro 訂閱或 API 計費方案。這個 SDK 是建立 AI-powered 應用程式的關鍵工具,特別適合需要程式碼生成、檔案操作、或多輪對話的場景。
claude-code-sdkclaude loginClaude Code SDK () 是 Anthropic 官方提供的 Python 库,用于在应用中集成 Claude AI Agent 功能。它支持 OAuth 认证(通过 )和 API Key 认证,让开发者可以利用 Claude Max/Pro 订阅或 API 计费方案。这个 SDK 是建立 AI 驱动应用的关键工具,特别适合需要代码生成、文件操作、或多轮对话的场景。
claude-code-sdkclaude loginKey Concepts
核心概念
認證方式
认证方式
Description: Claude Code SDK 支援兩種認證方式
Key Features:
- OAuth 認證: 使用 後存儲在
claude login的憑證~/.claude/ - API Key 認證: 透過 環境變數
ANTHROPIC_API_KEY
Use Cases:
- OAuth:個人開發、有 Max/Pro 訂閱的用戶
- API Key:生產環境、需要計量計費的服務
说明: Claude Code SDK 支持两种认证方式
核心特性:
- OAuth 认证: 使用 后存储在
claude login的凭证~/.claude/ - API Key 认证: 透过 环境变量
ANTHROPIC_API_KEY
适用场景:
- OAuth:个人开发、拥有 Max/Pro 订阅的用户
- API Key:生产环境、需要计量计费的服务
SDK 核心 API
SDK 核心 API
Description: 函數是主要的非同步介面
Key Features:
query()- 非同步迭代器回傳訊息
- 支援 streaming 和完整回應
- 可配置工具權限和執行限制
Use Cases: 程式碼生成、檔案操作、研究任務、唯讀分析
说明: 函数是主要的异步接口
核心特性:
query()- 异步迭代器返回消息
- 支持 streaming 和完整响应
- 可配置工具权限和执行限制
适用: 代码生成、文件操作、研究任务、只读分析
工具類型 (ToolType)
工具类型 (ToolType)
Description: SDK 支援多種內建工具
Key Features:
- ,
READ,WRITE- 檔案操作EDIT - - 終端命令執行
BASH - ,
GLOB- 檔案搜尋GREP - - 網頁抓取
WEB_FETCH
说明: SDK 支持多种内置工具
核心特性:
- ,
READ,WRITE- 文件操作EDIT - - 终端命令执行
BASH - ,
GLOB- 文件搜索GREP - - 网页抓取
WEB_FETCH
Best Practices
最佳实践
- 雙重認證檢查
- 同時支援 OAuth 和 API Key
- 優先使用 OAuth(免費使用 Max/Pro 配額)
- API Key 作為後備方案
python
def check_auth_status() -> dict:
status = {
'api_key_set': bool(os.environ.get('ANTHROPIC_API_KEY')),
'oauth_logged_in': False,
}
# 檢查 OAuth 登入狀態
claude_dir = os.path.expanduser('~/.claude')
if os.path.exists(claude_dir):
auth_files = ['credentials.json', 'settings.json', '.credentials.json']
for auth_file in auth_files:
if os.path.exists(os.path.join(claude_dir, auth_file)):
status['oauth_logged_in'] = True
break
# 只需要其中一種認證
status['auth_available'] = status['api_key_set'] or status['oauth_logged_in']
return status- 增加 Buffer Size
- 預設 buffer 太小,處理大型回應會出錯
- 建議增加到 50MB
python
try:
from claude_code_sdk._internal.transport import subprocess_cli
subprocess_cli._MAX_BUFFER_SIZE = 50 * 1024 * 1024 # 50MB
except Exception as e:
print(f"Failed to patch SDK buffer size: {e}")- 使用 Singleton Pattern
- 避免重複初始化
- 共享狀態和配置
python
_claude_service: Optional['ClaudeCodeService'] = None
def get_claude_code() -> 'ClaudeCodeService':
global _claude_service
if _claude_service is None:
_claude_service = ClaudeCodeService()
return _claude_service- 預設配置模式
- 依據使用場景限制工具權限
- 降低風險,提升安全性
python
@dataclass
class AgentConfig:
allowed_tools: List[str]
max_turns: int = 30
cwd: Optional[str] = None
@classmethod
def coding(cls) -> 'AgentConfig':
"""開發模式:完整權限"""
return cls(
allowed_tools=['Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep'],
max_turns=50
)
@classmethod
def research(cls) -> 'AgentConfig':
"""研究模式:可上網"""
return cls(
allowed_tools=['Read', 'Glob', 'Grep', 'WebFetch'],
max_turns=20
)
@classmethod
def readonly(cls) -> 'AgentConfig':
"""唯讀模式:最安全"""
return cls(
allowed_tools=['Read', 'Glob', 'Grep'],
max_turns=10
)- 双重认证检查
- 同时支持 OAuth 和 API Key
- 优先使用 OAuth(免费使用 Max/Pro 配额)
- API Key 作为后备方案
python
def check_auth_status() -> dict:
status = {
'api_key_set': bool(os.environ.get('ANTHROPIC_API_KEY')),
'oauth_logged_in': False,
}
# 检查 OAuth 登录状态
claude_dir = os.path.expanduser('~/.claude')
if os.path.exists(claude_dir):
auth_files = ['credentials.json', 'settings.json', '.credentials.json']
for auth_file in auth_files:
if os.path.exists(os.path.join(claude_dir, auth_file)):
status['oauth_logged_in'] = True
break
# 只需要其中一种认证
status['auth_available'] = status['api_key_set'] or status['oauth_logged_in']
return status- 增加 Buffer Size
- 预设 buffer 太小,处理大型回应会出错
- 建议增加到 50MB
python
try:
from claude_code_sdk._internal.transport import subprocess_cli
subprocess_cli._MAX_BUFFER_SIZE = 50 * 1024 * 1024 # 50MB
except Exception as e:
print(f"Failed to patch SDK buffer size: {e}")- 使用 Singleton Pattern
- 避免重复初始化
- 共享状态和配置
python
_claude_service: Optional['ClaudeCodeService'] = None
def get_claude_code() -> 'ClaudeCodeService':
global _claude_service
if _claude_service is None:
_claude_service = ClaudeCodeService()
return _claude_service- 预设配置模式
- 依据使用场景限制工具权限
- 降低风险,提升安全性
python
@dataclass
class AgentConfig:
allowed_tools: List[str]
max_turns: int = 30
cwd: Optional[str] = None
@classmethod
def coding(cls) -> 'AgentConfig':
"""开发模式:完整权限"""
return cls(
allowed_tools=['Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep'],
max_turns=50
)
@classmethod
def research(cls) -> 'AgentConfig':
"""研究模式:可上网"""
return cls(
allowed_tools=['Read', 'Glob', 'Grep', 'WebFetch'],
max_turns=20
)
@classmethod
def readonly(cls) -> 'AgentConfig':
"""只读模式:最安全"""
return cls(
allowed_tools=['Read', 'Glob', 'Grep'],
max_turns=10
)Common Pitfalls
常见误区
Pitfall 1: 直接在前端呼叫 SDK
误区1: 直接在前端调用 SDK
- Problem: claude-code-sdk 是 Python 套件,無法在瀏覽器中運行
- Solution: 必須建立後端 API 服務
- Example:
python
undefined- 问题: claude-code-sdk 是 Python 库,无法在浏览器中运行
- 解决方案: 必须搭建后端 API 服务
- Example:
python
undefined❌ 錯誤:嘗試在前端使用
❌ 错误:尝试在前端使用
JavaScript 無法直接使用 Python SDK
JavaScript 无法直接使用 Python SDK
✅ 正確:建立 FastAPI 後端
✅ 正确:搭建 FastAPI 后端
from fastapi import FastAPI
from claude_code_sdk import query
app = FastAPI()
@app.post("/api/generate")
async def generate(prompt: str):
result = []
async for msg in query(prompt=prompt):
result.append(msg)
return {"result": result}
undefinedfrom fastapi import FastAPI
from claude_code_sdk import query
app = FastAPI()
@app.post("/api/generate")
async def generate(prompt: str):
result = []
async for msg in query(prompt=prompt):
result.append(msg)
return {"result": result}
undefinedPitfall 2: 忘記處理非同步
误区2: 忘记处理异步
- Problem: SDK 是非同步的,忘記 await 會導致錯誤
- Solution: 使用 async/await 或 asyncio
python
undefined- 问题: SDK 是异步的,忘记 await 会导致错误
- 解决方案: 使用 async/await 或 asyncio
python
undefined❌ 錯誤
❌ 错误
def run_sync():
for msg in query(prompt="Hello"): # TypeError
print(msg)
def run_sync():
for msg in query(prompt="Hello"): # TypeError
print(msg)
✅ 正確
✅ 正确
async def run_async():
async for msg in query(prompt="Hello"):
print(msg)
undefinedasync def run_async():
async for msg in query(prompt="Hello"):
print(msg)
undefinedPitfall 3: 混淆 Claude API 和 Claude Code SDK
误区3: 混淆 Claude API 和 Claude Code SDK
- Problem:
- Claude API (套件) - 直接 HTTP API,需要 API Key
anthropic - Claude Code SDK () - Agent 功能,支援 OAuth
claude-code-sdk
- Claude API (
- Solution: 根據需求選擇正確的套件
| 特性 | Claude API | Claude Code SDK |
|---|---|---|
| 認證 | API Key only | OAuth + API Key |
| 功能 | 純對話 | Agent (檔案/終端操作) |
| 計費 | API 用量計費 | Max/Pro 訂閱可用 |
| 套件 | | |
- 问题:
- Claude API (库) - 直接 HTTP API,需要 API Key
anthropic - Claude Code SDK () - Agent 功能,支持 OAuth
claude-code-sdk
- Claude API (
- 解决方案: 根据需求选择正确的库
| 特性 | Claude API | Claude Code SDK |
|---|---|---|
| 认证 | 仅 API Key | OAuth + API Key |
| 功能 | 纯对话 | Agent (文件/终端操作) |
| 计费 | API 用量计费 | 可使用 Max/Pro 订阅 |
| 库 | | |
Patterns & Anti-Patterns
模式与反模式
Patterns (Do This)
推荐模式(应遵循)
完整的服務封裝:
python
from dataclasses import dataclass, field
from typing import AsyncIterator, Optional, List, Dict, Any
from claude_code_sdk import query, ClaudeCodeOptions, AssistantMessage, TextBlock
@dataclass
class ClaudeCodeService:
"""Claude Code 服務封裝"""
async def run(self, prompt: str, config: Optional[AgentConfig] = None) -> Dict[str, Any]:
"""執行並收集完整結果"""
options = ClaudeCodeOptions(
allowed_tools=config.allowed_tools if config else None,
max_turns=config.max_turns if config else 30,
cwd=config.cwd
)
result_texts = []
tool_calls = []
async for message in query(prompt=prompt, options=options):
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
result_texts.append(block.text)
return {
'status': 'success',
'result': '\n'.join(result_texts),
'tool_calls': tool_calls
}
async def stream(self, prompt: str, config: Optional[AgentConfig] = None) -> AsyncIterator[dict]:
"""串流執行,即時回傳"""
options = ClaudeCodeOptions(
allowed_tools=config.allowed_tools if config else None,
max_turns=config.max_turns if config else 30
)
async for message in query(prompt=prompt, options=options):
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
yield {'type': 'text', 'content': block.text}FastAPI 串流端點:
python
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import json
app = FastAPI()
@app.post("/api/agent/stream")
async def agent_stream(prompt: str):
async def event_generator():
service = ClaudeCodeService()
async for msg in service.stream(prompt):
yield f"data: {json.dumps(msg)}\n\n"
yield "data: [DONE]\n\n"
return StreamingResponse(
event_generator(),
media_type="text/event-stream"
)完整的服务封装:
python
from dataclasses import dataclass, field
from typing import AsyncIterator, Optional, List, Dict, Any
from claude_code_sdk import query, ClaudeCodeOptions, AssistantMessage, TextBlock
@dataclass
class ClaudeCodeService:
"""Claude Code 服务封装"""
async def run(self, prompt: str, config: Optional[AgentConfig] = None) -> Dict[str, Any]:
"""执行并收集完整结果"""
options = ClaudeCodeOptions(
allowed_tools=config.allowed_tools if config else None,
max_turns=config.max_turns if config else 30,
cwd=config.cwd
)
result_texts = []
tool_calls = []
async for message in query(prompt=prompt, options=options):
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
result_texts.append(block.text)
return {
'status': 'success',
'result': '\n'.join(result_texts),
'tool_calls': tool_calls
}
async def stream(self, prompt: str, config: Optional[AgentConfig] = None) -> AsyncIterator[dict]:
"""流式执行,即时返回"""
options = ClaudeCodeOptions(
allowed_tools=config.allowed_tools if config else None,
max_turns=config.max_turns if config else 30
)
async for message in query(prompt=prompt, options=options):
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
yield {'type': 'text', 'content': block.text}FastAPI 流式端点:
python
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import json
app = FastAPI()
@app.post("/api/agent/stream")
async def agent_stream(prompt: str):
async def event_generator():
service = ClaudeCodeService()
async for msg in service.stream(prompt):
yield f"data: {json.dumps(msg)}\n\n"
yield "data: [DONE]\n\n"
return StreamingResponse(
event_generator(),
media_type="text/event-stream"
)Anti-Patterns (Avoid This)
反模式(应避免)
python
undefinedpython
undefined❌ 不要在每次請求都建立新服務
❌ 不要在每次请求都建立新服务
@app.post("/api/generate")
async def bad_generate(prompt: str):
service = ClaudeCodeService() # 每次都新建
return await service.run(prompt)
@app.post("/api/generate")
async def bad_generate(prompt: str):
service = ClaudeCodeService() # 每次都新建
return await service.run(prompt)
❌ 不要忽略錯誤處理
❌ 不要忽略错误处理
async def bad_run(prompt: str):
async for msg in query(prompt=prompt): # 可能拋出異常
print(msg)
async def bad_run(prompt: str):
async for msg in query(prompt=prompt): # 可能抛出异常
print(msg)
❌ 不要給予過多權限
❌ 不要给予过多权限
config = AgentConfig(
allowed_tools=['Read', 'Write', 'Edit', 'Bash', 'WebFetch'], # 全開
max_turns=100 # 太多
)
undefinedconfig = AgentConfig(
allowed_tools=['Read', 'Write', 'Edit', 'Bash', 'WebFetch'], # 全开
max_turns=100 # 太多
)
undefinedTools & Resources
工具与资源
| Tool | Purpose | Link |
|---|---|---|
| claude-code-sdk | 官方 Python SDK | |
| Claude Code CLI | 命令列工具 | |
| FastAPI | 後端框架 | fastapi.tiangolo.com |
| 工具 | 用途 | 链接 |
|---|---|---|
| claude-code-sdk | 官方 Python SDK | |
| Claude Code CLI | 命令行工具 | |
| FastAPI | 后端框架 | fastapi.tiangolo.com |
Decision Guide
决策指南
Use Claude Code SDK when:
- 需要 Agent 功能(檔案操作、終端命令)
- 想使用 Max/Pro 訂閱而非 API 計費
- 建立需要多輪互動的 AI 應用
- 需要串流即時回應
Consider alternatives when:
- 只需要簡單對話 → 使用 套件
anthropic - 純前端應用 → 使用 +
anthropicanthropic-dangerous-direct-browser-access - 不需要 Agent 功能 → 使用標準 Claude API
在以下场景使用 Claude Code SDK:
- 需要 Agent 功能(文件操作、终端命令)
- 想使用 Max/Pro 订阅而非 API 计费
- 建立需要多轮互动的 AI 应用
- 需要流式即时响应
在以下场景考虑替代方案:
- 只需要简单对话 → 使用 库
anthropic - 纯前端应用 → 使用 +
anthropicanthropic-dangerous-direct-browser-access - 不需要 Agent 功能 → 使用标准 Claude API
Examples
示例
Example 1: 完整後端服務
示例1: 完整后端服务
Context: 建立一個可以利用 Claude Max 訂閱的後端 API
Implementation:
python
undefined场景: 搭建一个可以利用 Claude Max 订阅的后端 API
实现:
python
undefinedbackend/main.py
backend/main.py
import os
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
import json
from claude_code_sdk import query, ClaudeCodeOptions, AssistantMessage, TextBlock
app = FastAPI()
import os
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
import json
from claude_code_sdk import query, ClaudeCodeOptions, AssistantMessage, TextBlock
app = FastAPI()
CORS 設定
CORS 设置
app.add_middleware(
CORSMiddleware,
allow_origins=[""],
allow_methods=[""],
allow_headers=["*"],
)
class GenerateRequest(BaseModel):
prompt: str
max_turns: int = 30
def check_auth():
"""檢查認證狀態"""
api_key = bool(os.environ.get('ANTHROPIC_API_KEY'))
oauth = os.path.exists(os.path.expanduser('~/.claude/credentials.json'))
return api_key or oauth
@app.get("/api/health")
async def health():
return {
"status": "ok",
"auth_available": check_auth()
}
@app.post("/api/generate")
async def generate(request: GenerateRequest):
if not check_auth():
raise HTTPException(401, "請先執行 claude login 或設置 ANTHROPIC_API_KEY")
options = ClaudeCodeOptions(max_turns=request.max_turns)
results = []
async for message in query(prompt=request.prompt, options=options):
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
results.append(block.text)
return {"result": "\n".join(results)}@app.post("/api/stream")
async def stream(request: GenerateRequest):
if not check_auth():
raise HTTPException(401, "未認證")
async def event_generator():
options = ClaudeCodeOptions(max_turns=request.max_turns)
async for message in query(prompt=request.prompt, options=options):
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
yield f"data: {json.dumps({'text': block.text})}\n\n"
yield "data: [DONE]\n\n"
return StreamingResponse(event_generator(), media_type="text/event-stream")if name == "main":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
**requirements.txt**:fastapi>=0.100.0
uvicorn>=0.23.0
claude-code-sdk>=0.1.0
python-dotenv>=1.0.0
**Explanation**: 這個後端會自動檢測 OAuth 或 API Key 認證,支援一般請求和串流回應。app.add_middleware(
CORSMiddleware,
allow_origins=[""],
allow_methods=[""],
allow_headers=["*"],
)
class GenerateRequest(BaseModel):
prompt: str
max_turns: int = 30
def check_auth():
"""检查认证状态"""
api_key = bool(os.environ.get('ANTHROPIC_API_KEY'))
oauth = os.path.exists(os.path.expanduser('~/.claude/credentials.json'))
return api_key or oauth
@app.get("/api/health")
async def health():
return {
"status": "ok",
"auth_available": check_auth()
}
@app.post("/api/generate")
async def generate(request: GenerateRequest):
if not check_auth():
raise HTTPException(401, "请先执行 claude login 或设置 ANTHROPIC_API_KEY")
options = ClaudeCodeOptions(max_turns=request.max_turns)
results = []
async for message in query(prompt=request.prompt, options=options):
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
results.append(block.text)
return {"result": "\n".join(results)}@app.post("/api/stream")
async def stream(request: GenerateRequest):
if not check_auth():
raise HTTPException(401, "未认证")
async def event_generator():
options = ClaudeCodeOptions(max_turns=request.max_turns)
async for message in query(prompt=request.prompt, options=options):
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
yield f"data: {json.dumps({'text': block.text})}\n\n"
yield "data: [DONE]\n\n"
return StreamingResponse(event_generator(), media_type="text/event-stream")if name == "main":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
**requirements.txt**:fastapi>=0.100.0
uvicorn>=0.23.0
claude-code-sdk>=0.1.0
python-dotenv>=1.0.0
**说明**: 这个后端会自动检测 OAuth 或 API Key 认证,支持一般请求和流式回应。Example 2: 前端整合
示例2: 前端整合
Context: 前端呼叫後端 API
Implementation:
javascript
// 一般請求
async function generate(prompt) {
const response = await fetch('http://localhost:8000/api/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ prompt })
});
const data = await response.json();
return data.result;
}
// 串流請求
async function streamGenerate(prompt, onChunk) {
const response = await fetch('http://localhost:8000/api/stream', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ prompt })
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ') && line !== 'data: [DONE]') {
const data = JSON.parse(line.slice(6));
onChunk(data.text);
}
}
}
}场景: 前端呼叫后端 API
实现:
javascript
// 一般请求
async function generate(prompt) {
const response = await fetch('http://localhost:8000/api/generate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ prompt })
});
const data = await response.json();
return data.result;
}
// 流式请求
async function streamGenerate(prompt, onChunk) {
const response = await fetch('http://localhost:8000/api/stream', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ prompt })
});
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
const chunk = decoder.decode(value);
const lines = chunk.split('\n');
for (const line of lines) {
if (line.startsWith('data: ') && line !== 'data: [DONE]') {
const data = JSON.parse(line.slice(6));
onChunk(data.text);
}
}
}
}Example 3: Docker 部署
示例3: Docker 部署
Context: 容器化部署包含 Claude Code CLI
Implementation:
dockerfile
undefined场景: 容器化部署包含 Claude Code CLI 的服务
实现:
dockerfile
undefinedDockerfile
Dockerfile
FROM python:3.11-slim
FROM python:3.11-slim
安裝 Node.js (Claude Code CLI 需要)
安装 Node.js (Claude Code CLI 需要)
RUN apt-get update && apt-get install -y curl &&
curl -fsSL https://deb.nodesource.com/setup_20.x | bash - &&
apt-get install -y nodejs &&
rm -rf /var/lib/apt/lists/*
curl -fsSL https://deb.nodesource.com/setup_20.x | bash - &&
apt-get install -y nodejs &&
rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y curl &&
curl -fsSL https://deb.nodesource.com/setup_20.x | bash - &&
apt-get install -y nodejs &&
rm -rf /var/lib/apt/lists/*
curl -fsSL https://deb.nodesource.com/setup_20.x | bash - &&
apt-get install -y nodejs &&
rm -rf /var/lib/apt/lists/*
安裝 Claude Code CLI
安装 Claude Code CLI
RUN npm install -g @anthropic-ai/claude-code
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
```yamlRUN npm install -g @anthropic-ai/claude-code
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
```yamldocker-compose.yml
docker-compose.yml
version: '3.8'
services:
backend:
build: .
ports:
- "8000:8000"
environment:
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
volumes:
- ~/.claude:/root/.claude:ro # 掛載 OAuth 憑證
undefinedversion: '3.8'
services:
backend:
build: .
ports:
- "8000:8000"
environment:
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
volumes:
- ~/.claude:/root/.claude:ro # 挂载 OAuth 凭证
undefinedRelated Skills
相关技能
- [[api-design]] - 設計 REST API 端點
- [[backend]] - Python/FastAPI 後端開發
- [[devops-cicd]] - Docker 部署和 CI/CD
- [[security-practices]] - API 認證和安全
- [[api-design]] - 设计 REST API 端点
- [[backend]] - Python/FastAPI 后端开发
- [[devops-cicd]] - Docker 部署和 CI/CD
- [[security-practices]] - API 认证和安全