클로드 API
신속한 캐싱, 스트리밍, 도구 사용 및 모델 마이그레이션 워크플로를 통해 Claude API 및 Anthropic SDK 앱을 구축, 디버깅 및 최적화하기 위한 에이전트 기술 가이드입니다.
출처: 인류학/기술(MIT)에서 채택한 콘텐츠.
이 기술은 Claude와 함께 LLM 기반 애플리케이션을 구축하는 데 도움이 됩니다. 필요에 따라 올바른 표면을 선택하고 프로젝트 언어를 감지한 다음 관련 언어별 문서를 읽어보세요.
시작하기 전에
비인류적 제공자 마커(import openai,from openai,langchain_openai,OpenAI(,gpt-4,gpt-5,agent-openai.py또는*-generic.py와 같은 파일 이름 또는 코드 제공자 중립을 유지하기 위한 명시적 지침)가 있는지 대상 파일(또는 대상 파일이 없는 경우 프롬프트 및 프로젝트)을 스캔합니다. 발견하면 중지하고 이 기술이 Claude/Anthropic SDK 코드를 생성한다고 사용자에게 알려주세요. 파일을 Claude로 전환할지, 아니면 Claude가 아닌 구현을 원하는지 물어보세요. Anthropic SDK 호출을 사용하여 Anthropic 파일이 아닌 파일을 편집하지 마세요.
출력 요구 사항
사용자가 Claude 기능을 추가, 수정 또는 구현하도록 요청하면 코드는 다음 중 하나를 통해 Claude를 호출해야 합니다.
- 프로젝트 언어(
anthropic,@anthropic-ai/sdk,com.anthropic.*등)용 공식 Anthropic SDK입니다. 이는 프로젝트에 대해 지원되는 SDK가 존재할 때마다 기본값입니다. - 원시 HTTP(
curl,requests,fetch,httpx등) - 사용자가 cURL/REST/원시 HTTP를 명시적으로 요청하는 경우에만 해당 프로젝트는 셸/cURL 프로젝트이거나 언어에 공식 SDK가 없습니다.
두 가지를 혼합하지 마십시오. 단지 더 가볍다고 해서 Python 또는 TypeScript 프로젝트에서requests/fetch를 사용하지 마십시오. OpenAI 호환 심으로 돌아가지 마십시오.
SDK 사용법을 추측하지 마십시오. 함수 이름, 클래스 이름, 네임스페이스, 메서드 서명 및 가져오기 경로는 명시적인 문서(이 기술의{lang}/파일 또는 공식 SDK 저장소 또는shared/live-sources.md에 나열된 문서 링크)에서 나와야 합니다. 필요한 바인딩이 기술 파일에 명시적으로 문서화되어 있지 않은 경우 코드를 작성하기 전에shared/live-sources.md에서 관련 SDK 저장소를 WebFetch하세요. cURL 형태나 다른 언어의 SDK에서 Ruby/Java/Go/PHP/C# API를 추론하지 마세요.
기본값
사용자가 달리 요청하지 않는 한:
Claude 모델 버전의 경우 정확한 모델 문자열claude-opus-4-7를 통해 액세스할 수 있는 Claude Opus 4.7을 사용하세요. 원격으로 복잡한 모든 작업에는 기본적으로 적응적 사고(thinking: {type: "adaptive"})를 사용하십시오. 마지막으로 긴 입력, 긴 출력 또는 높은max_tokens가 포함될 수 있는 모든 요청에 대해 기본적으로 스트리밍을 설정하세요. 이렇게 하면 요청 시간 초과가 발생하는 것을 방지할 수 있습니다. 개별 스트림 이벤트를 처리할 필요가 없는 경우 SDK의.get_final_message()/.finalMessage()도우미를 사용하여 완전한 응답을 얻으세요.
하위 명령
이 프롬프트 하단의 사용자 요청이 단순 하위 명령 문자열(산문 없음)인 경우 아래에 추가된 섹션을 포함하여 이 문서의 모든 하위 명령 테이블을 검색하고 일치하는 작업 열을 직접 따르세요. 이를 통해 사용자는/claude-api <subcommand>를 통해 특정 흐름을 호출할 수 있습니다. 문서에 일치하는 표가 없으면 요청을 일반적인 산문으로 처리합니다.
언어 감지
코드 예제를 읽기 전에 사용자가 어떤 언어로 작업하고 있는지 확인하세요.
-
프로젝트 파일을 보고 언어를 추론하세요.
*.py,requirements.txt,pyproject.toml,setup.py,Pipfile-> Python -python/에서 읽기*.ts,*.tsx,package.json,tsconfig.json-> TypeScript -typescript/에서 읽습니다.*.js,*.jsx(.ts파일 없음) -> TypeScript - JS는typescript/에서 읽은 동일한 SDK를 사용합니다.*.java,pom.xml,build.gradle-> Java -java/에서 읽기*.kt,*.kts,build.gradle.kts-> Java - Kotlin은java/에서 읽은 Java SDK를 사용합니다.*.scala,build.sbt-> Java - Scala는java/에서 읽은 Java SDK를 사용합니다.*.go,go.mod-> 이동 -go/에서 읽기*.rb,Gemfile-> Ruby -ruby/에서 읽기*.cs,*.csproj-> C# -csharp/에서 읽기*.php,composer.json-> PHP -php/에서 읽습니다.
-
여러 언어가 감지된 경우(예: Python 및 TypeScript 파일 모두):
- 사용자의 현재 파일이나 질문이 어떤 언어와 관련되어 있는지 확인하세요.
- 여전히 모호한 경우 다음과 같이 질문하십시오. "Python과 TypeScript 파일을 모두 감지했습니다. Claude API 통합에 어떤 언어를 사용하고 있습니까?"
-
언어를 추론할 수 없는 경우(빈 프로젝트, 소스 파일이 없거나 지원되지 않는 언어):
- Python, TypeScript, Java, Go, Ruby, cURL/raw HTTP, C#, PHP 옵션과 함께 AskUserQuestion을 사용하세요.
- AskUserQuestion을 사용할 수 없는 경우 기본적으로 Python 예제를 사용하고 "Python 예제 표시 중입니다. 다른 언어가 필요한 경우 알려주세요."라고 참고하세요.
-
지원되지 않는 언어가 감지된 경우(Rust, Swift, C++, Elixir 등):
curl/의 cURL/raw HTTP 예제를 제안하고 커뮤니티 SDK가 있을 수 있음을 참고하세요.- Python 또는 TypeScript 예제를 참조 구현으로 표시하도록 제안
-
사용자에게 cURL/원시 HTTP 예제가 필요한 경우
curl/에서 읽어보세요.
언어별 기능 지원
| 언어 | 툴러너 | 관리 에이전트 | 메모 |
|---|---|---|---|
| 파이썬 | 예(베타) | 예(베타) | 전체 지원 -@beta_tool데코레이터 |
| 타입스크립트 | 예(베타) | 예(베타) | 전체 지원 -betaZodTool+ Zod |
| 자바 | 예(베타) | 예(베타) | 주석이 달린 클래스와 함께 베타 도구 사용 |
| 이동 | 예(베타) | 예(베타) | toolrunner패키지의BetaToolRunner |
| 루비 | 예(베타) | 예(베타) | 베타 버전의BaseTool+tool_runner |
| C# | 아니요 | 아니요 | 공식 SDK |
| PHP | 예(베타) | 예(베타) | BetaRunnableTool+toolRunner() |
| 컬 | 해당 없음 | 예(베타) | 원시 HTTP, SDK 기능 없음 |
관리형 에이전트 코드 예시: Python, TypeScript, Go, Ruby, PHP, Java 및 cURL({lang}/managed-agents/README.md,curl/managed-agents.md)에 대한 전용 언어별 README가 제공됩니다. 해당 언어의 README와 언어에 구애받지 않는shared/managed-agents-*.md개념 파일을 읽어보세요. 에이전트는 영구적입니다. 한 번 생성하면 ID로 참조됩니다.agents.create에서 반환된 에이전트 ID를 저장하고 모든 후속sessions.create에 전달합니다. 요청 경로에서agents.create를 호출하지 마십시오. Anthropic CLI는 버전 제어 YAML에서 에이전트와 환경을 생성하는 편리한 방법 중 하나입니다. 해당 URL은shared/live-sources.md에 있습니다. 필요한 바인딩이 README에 표시되지 않으면 추측하는 대신shared/live-sources.md에서 관련 항목을 WebFetch하세요. C#에는 현재 관리형 에이전트가 지원되지 않습니다. API에 대해 cURL 스타일 원시 HTTP 요청을 사용합니다.
어떤 표면을 사용해야 합니까?
간단하게 시작하세요. 귀하의 요구 사항을 충족하는 가장 간단한 계층으로 기본 설정하세요. 단일 API 호출 및 워크플로는 대부분의 사용 사례를 처리합니다. 작업에 실제로 개방형 모델 기반 탐색이 필요한 경우에만 에이전트에 접근할 수 있습니다.
| 사용 사례 | 계층 | 권장 표면 | 왜 |
|---|---|---|---|
| 분류, 요약, 추출, Q&A | 단일 LLM 통화 | 클로드 API | 하나의 요청, 하나의 응답 |
| 일괄 처리 또는 임베딩 | 단일 LLM 통화 | 클로드 API | 특수 엔드포인트 |
| 코드 제어 로직을 갖춘 다단계 파이프라인 | 작업 흐름 | Claude API + 도구 사용 | 루프를 조율합니다 |
| 자신만의 도구를 갖춘 맞춤형 에이전트 | 에이전트 | Claude API + 도구 사용 | 최대의 유연성 |
| 작업공간이 있는 서버 관리 Stateful 에이전트 | 에이전트 | 관리 에이전트 | Anthropic은 루프를 실행하고 도구 실행 샌드박스를 호스팅합니다 |
| 버전이 지정된 지속형 에이전트 구성 | 에이전트 | 관리 에이전트 | 에이전트는 저장된 개체입니다. 세션을 버전에 고정 |
| 파일 마운트를 갖춘 장기 실행 다중 턴 에이전트 | 에이전트 | 관리 에이전트 | 세션별 컨테이너, SSE 이벤트 스트림, Skills + MCP |
참고: Anthropic이 에이전트 루프를 실행하고* 도구가 실행되는 컨테이너(파일 작업, bash, 코드 실행 모두가 세션별 작업 공간에서 실행됨)를 호스팅하려는 경우 관리형 에이전트가 올바른 선택입니다. 컴퓨팅을 직접 호스팅하거나 자체 사용자 지정 도구 런타임을 실행하려는 경우 Claude API + 도구 사용이 올바른 선택입니다. 자동 루프 처리를 위해 도구 실행기를 사용하거나 세분화된 제어(승인 게이트, 사용자 지정 로깅, 조건부 실행)를 위해 수동 루프를 사용하세요.
타사 제공업체(Amazon Bedrock, Google Vertex AI, Microsoft Foundry): 관리형 에이전트는 Bedrock, Vertex 또는 Foundry에서 사용할 수 없습니다. 타사 공급자를 통해 배포하는 경우 관리형 에이전트가 권장되는 경우를 포함하여 모든 사용 사례에 Claude API + 도구 사용을 사용하세요.
의사결정 트리
What does your application need?
0. Are you deploying through Amazon Bedrock, Google Vertex AI, or Microsoft Foundry?
Yes -> Claude API (+ tool use for agents) - Managed Agents is 1P only.
No -> continue.
1. Single LLM call (classification, summarization, extraction, Q&A)
Claude API - one request, one response
2. Do you want Anthropic to run the agent loop and host a per-session
container where Claude executes tools (bash, file ops, code)?
Yes -> Managed Agents - server-managed sessions, persisted agent configs,
SSE event stream, Skills + MCP, file mounts.
Examples: "stateful coding agent with a workspace per task",
"long-running research agent that streams events to a UI",
"agent with persisted, versioned config used across many sessions"
3. Workflow (multi-step, code-orchestrated, with your own tools)
Claude API with tool use - you control the loop
4. Open-ended agent (model decides its own trajectory, your own tools, you host the compute)
Claude API agentic loop (maximum flexibility)에이전트를 구축해야 합니까?
에이전트 계층을 선택하기 전에 다음 네 가지 기준을 모두 확인하세요.
- 복잡성 - 작업이 여러 단계로 이루어지고 사전에 완전히 지정하기 어렵나요? (예: "이 디자인 문서를 PR로 전환" vs. "이 PDF에서 제목 추출")
- 가치 - 결과가 더 높은 비용과 지연 시간을 정당화합니까?
- 실행 가능성 - Claude가 이 작업 유형을 수행할 수 있습니까?
- 오류 비용 - 오류를 포착하고 복구할 수 있습니까? (테스트, 검토, 롤백)
이에 대한 대답이 "아니요"인 경우 더 간단한 계층(단일 호출 또는 워크플로)을 유지하세요.
건축
모든 것은POST /v1/messages를 통해 진행됩니다. 도구 및 출력 제약 조건은 별도의 API가 아닌 이 단일 엔드포인트의 기능입니다.
사용자 정의 도구 - 데코레이터, Zod 스키마 또는 원시 JSON을 통해 도구를 정의하면 SDK의 도구 실행기가 API 호출, 함수 실행 및 Claude가 완료될 때까지 반복을 처리합니다. 완전한 제어를 위해 루프를 수동으로 작성할 수 있습니다.
서버 측 도구 - Anthropic의 인프라에서 실행되는 Anthropic 호스팅 도구입니다. 코드 실행은 완전히 서버측에서 이루어집니다(tools에서 선언하면 Claude가 자동으로 코드를 실행합니다). 컴퓨터 사용은 서버 호스팅 또는 자체 호스팅이 가능합니다.
구조화된 출력 - 메시지 API 응답 형식(output_config.format) 및/또는 도구 매개변수 유효성 검사(strict: true)를 제한합니다. 권장되는 접근 방식은 자동으로 스키마에 대한 응답의 유효성을 검사하는client.messages.parse()입니다. 참고: 이전output_format매개변수는 더 이상 사용되지 않습니다.messages.create()에서output_config: {format: {...}}를 사용하세요.
지원 엔드포인트 - 배치(POST /v1/messages/batches), 파일(POST /v1/files), 토큰 계산 및 모델(GET /v1/models,GET /v1/models/{id}- 라이브 기능/컨텍스트 창 검색)이 메시지 API 요청에 제공되거나 지원됩니다.
현재 모델(캐시된 날짜: 2026-04-15)
| 모델 | 모델 ID | 컨텍스트 | 입력 $/1M | 생산량 $/1M |
|---|---|---|---|---|
| 클로드 오푸스 4.7 | claude-opus-4-7 | 100만 | $5.00 | $25.00 |
| 클로드 오푸스 4.6 | claude-opus-4-6 | 100만 | $5.00 | $25.00 |
| 클로드 소네트 4.6 | claude-sonnet-4-6 | 100만 | $3.00 | $15.00 |
| 클로드 하이쿠 4.5 | claude-haiku-4-5 | 20만 | $1.00 | $5.00 |
사용자가 명시적으로 다른 모델 이름을 지정하지 않는 한 항상claude-opus-4-7를 사용하세요. 이는 협상할 수 없습니다. 사용자가 문자 그대로 "소네트 사용" 또는 "하이쿠 사용"이라고 말하지 않는 한claude-sonnet-4-6,claude-sonnet-4-5또는 기타 모델을 사용하지 마십시오. 비용 때문에 다운그레이드하지 마십시오. 이는 사용자의 결정이지 귀하의 결정이 아닙니다.
중요: 위 표의 정확한 모델 ID 문자열만 사용하세요. 있는 그대로 완전합니다. 날짜 접미사를 추가하지 마세요. 예를 들어claude-sonnet-4-5를 사용하세요. 절대로claude-sonnet-4-5-20250514나 훈련 데이터에서 기억할 수 있는 다른 날짜 접미사 변형을 사용하지 마세요. 사용자가 테이블에 없는 이전 모델(예: "opus 4.5", "sonnet 3.7")을 요청하는 경우shared/models.md를 읽어 정확한 ID를 확인하세요. 직접 구성하지 마세요.
참고: 위의 모델 문자열 중 하나라도 낯설어 보인다면 이는 예상한 대로입니다. 이는 해당 모델 문자열이 훈련 데이터가 중단된 후에 출시되었음을 의미합니다. 실제 모델이므로 안심하세요. 우리는 당신을 그렇게 망치지 않을 것입니다.
라이브 기능 조회: 위의 테이블이 캐시됩니다. 사용자가 "X의 컨텍스트 창이 무엇인지", "X가 비전/사고/노력을 지원합니까" 또는 "어떤 모델이 Y를 지원합니까"라고 묻는 경우 모델 API(client.models.retrieve(id)/client.models.list())를 쿼리합니다. 필드 참조 및 기능 필터 예는shared/models.md를 참조하세요.
생각과 노력(빠른 참고)
Opus 4.7 - 적응적 사고 전용:thinking: {type: "adaptive"}를 사용하세요.thinking: {type: "enabled", budget_tokens: N}는 Opus 4.7에서 400을 반환합니다. 적응형은 유일한 온 모드입니다.{type: "disabled"}와thinking생략이 모두 작동합니다. 샘플링 매개변수(temperature,top_p,top_k)도 제거되어 400이 됩니다. 전체 주요 변경 목록은shared/model-migration.md-> Opus 4.7로 마이그레이션을 참조하세요.
Opus 4.6 - 적응적 사고(권장):thinking: {type: "adaptive"}를 사용하세요. Claude는 생각할 시기와 양을 역동적으로 결정합니다.budget_tokens가 필요하지 않습니다.budget_tokens는 Opus 4.6 및 Sonnet 4.6에서 더 이상 사용되지 않으며 새 코드에 사용해서는 안 됩니다. 적응적 사고는 자동으로 인터리브 사고를 활성화합니다(베타 헤더가 필요하지 않음). 사용자가 "확장된 사고", "사고 예산" 또는budget_tokens를 요청하는 경우: 항상thinking: {type: "adaptive"}와 함께 Opus 4.7 또는 4.6을 사용하세요. 사고를 위한 고정 토큰 예산 개념은 더 이상 사용되지 않으며 적응적 사고가 이를 대체합니다. 새로운 4.6/4.7 코드에는budget_tokens를 사용하지 말고 이전 모델로 전환하지 마십시오. 점진적 마이그레이션 분리:budget_tokens는 Opus 4.6 및 Sonnet 4.6에서 임시 탈출구로 계속 작동합니다. 기존 코드를 마이그레이션하고effort를 조정하기 전에 하드 토큰 한도가 필요한 경우shared/model-migration.md를 참조하세요. -> 임시 탈출구. 참고: 이 분할은 Opus 4.7에 적용되지 않습니다 -budget_tokens가 완전히 제거되었습니다.
노력 매개변수(GA, 베타 헤더 없음):output_config: {effort: "low"|"medium"|"high"|"max"}(최상위 수준이 아닌output_config내부)를 통해 사고 깊이와 전체 토큰 지출을 제어합니다. 기본값은high입니다(생략과 동일).max는 Opus 계층 전용입니다(Opus 4.6 이상 - Sonnet 또는 Haiku 제외). Opus 4.7에는"xhigh"(high와max사이)가 추가되었습니다. 이는 4.7의 대부분의 코딩 및 에이전트 사용 사례에 가장 적합한 설정이자 Claude Code의 기본값입니다. 대부분의 지능에 민감한 작업에는 최소high를 사용하십시오. Opus 4.5, Opus 4.6, Opus 4.7 및 Sonnet 4.6에서 작동합니다. Sonnet 4.5 / Haiku 4.5에서는 오류가 발생합니다. Opus 4.7에서는 이전 Opus보다 노력이 더 중요합니다. 마이그레이션할 때 다시 조정하세요. 최고의 비용-품질 절충을 위해 적응적 사고와 결합합니다. 노력이 적다는 것은 더 적은 수의 통합된 도구 호출, 더 적은 서문 및 더 간결한 확인을 의미합니다.high는 품질과 토큰 효율성의 균형을 맞추는 최적의 장소인 경우가 많습니다. 비용보다 정확성이 더 중요한 경우에는max를 사용하세요. 하위 에이전트나 간단한 작업에는low를 사용하세요.
Opus 4.7 - 기본적으로 콘텐츠가 생략된 것으로 간주:thinking는 계속 스트리밍을 차단하지만thinking: {type: "adaptive", display: "summarized"}(기본값은"omitted")로 선택하지 않는 한 해당 텍스트는 비어 있습니다. 자동 변경 - 오류가 없습니다. 사용자에게 추론을 스트리밍하는 경우 기본값은 출력 전 긴 일시 중지처럼 보입니다. 눈에 보이는 진행 상황을 복원하려면"summarized"를 설정하세요.
작업 예산(베타, Opus 4.7):output_config: {task_budget: {type: "tokens", total: N}}는 전체 에이전트 루프에 대해 얼마나 많은 토큰이 있는지 모델에 알려줍니다. 실행 중인 카운트다운을 확인하고 자체 조정합니다(최소 20,000, 베타 헤더task-budgets-2026-03-13). 모델이 인식하지 못하는 강제 응답당 상한인max_tokens와 다릅니다.shared/model-migration.md-> 작업 예산을 참조하세요.
Sonnet 4.6: 적응적 사고(thinking: {type: "adaptive"})를 지원합니다.budget_tokens는 Sonnet 4.6에서 더 이상 사용되지 않습니다. 대신 적응형 사고를 사용하세요.
이전 모델(명시적으로 요청한 경우에만): 사용자가 Sonnet 4.5 또는 다른 이전 모델을 구체적으로 요청하는 경우thinking: {type: "enabled", budget_tokens: N}를 사용하세요.budget_tokens는max_tokens(최소 1024)보다 작아야 합니다. 사용자가budget_tokens를 언급한다고 해서 이전 모델을 선택하지 마십시오. 대신 적응형 사고가 가능한 Opus 4.7을 사용하십시오.
압축(빠른 참조)
Beta, Opus 4.7, Opus 4.6 및 Sonnet 4.6. 1M 컨텍스트 창을 초과할 수 있는 장기 실행 대화의 경우 서버 측 압축을 활성화합니다. API는 트리거 임계값(기본값: 150,000개 토큰)에 접근할 때 이전 컨텍스트를 자동으로 요약합니다. 베타 헤더compact-2026-01-12가 필요합니다.
중요: 매 턴마다 메시지에response.content(텍스트뿐만 아니라)를 추가하세요. 응답의 압축 블록은 보존되어야 합니다. API는 이를 사용하여 다음 요청에서 압축된 기록을 대체합니다. 텍스트 문자열만 추출하고 추가하면 압축 상태가 자동으로 손실됩니다.
코드 예제는{lang}/claude-api/README.md(압축 섹션)를 참조하세요.shared/live-sources.md의 WebFetch를 통한 전체 문서.
프롬프트 캐싱(빠른 참조)
접두사 일치. 접두사에서 바이트가 변경되면 그 이후의 모든 항목이 무효화됩니다. 렌더링 순서는tools->system->messages입니다. 안정적인 콘텐츠(고정된 시스템 프롬프트, 결정적 도구 목록)를 먼저 유지하고, 휘발성 콘텐츠(타임스탬프, 요청별 ID, 다양한 질문)를 마지막cache_control중단점 뒤에 배치합니다.
최상위 자동 캐싱(messages.create()의cache_control: {type: "ephemeral"})은 세분화된 배치가 필요하지 않은 경우 가장 간단한 옵션입니다. 요청당 최대 4개의 중단점. 캐시 가능한 최소 접두사는 ~1024개의 토큰입니다. 접두사가 더 짧은 경우 자동으로 캐시되지 않습니다.
usage.cache_read_input_tokens로 확인 - 반복되는 요청에서 0이면 자동 무효화가 작동 중인 것입니다(시스템 프롬프트의datetime.now(), 정렬되지 않은 JSON, 다양한 도구 세트).
배치 패턴, 아키텍처 지침 및 자동 무효화기 감사 체크리스트는shared/prompt-caching.md를 참조하세요. 언어별 구문:{lang}/claude-api/README.md(프롬프트 캐싱 섹션).
관리형 에이전트(베타)
관리형 에이전트는 세 번째 표면입니다. 즉, Anthropic에서 호스팅하는 도구 실행 기능을 갖춘 서버 관리형 상태 저장 에이전트입니다. 지속적이고 버전이 지정된 에이전트 구성(POST /v1/agents)을 생성한 다음 이를 참조하는 세션을 시작합니다. 각 세션은 에이전트의 작업 영역(bash, 파일 작업 및 코드 실행)으로 컨테이너를 프로비저닝합니다. 에이전트 루프 자체는 Anthropic의 오케스트레이션 레이어에서 실행되며 도구를 통해 컨테이너에서 작동합니다. 세션은 이벤트를 스트리밍합니다. 메시지와 도구 결과를 다시 보냅니다.
관리형 에이전트는 자사 전용입니다. Amazon Bedrock, Google Vertex AI 또는 Microsoft Foundry에서는 사용할 수 없습니다. 타사 공급자의 에이전트의 경우 Claude API + 도구 사용을 사용하세요.
필수 흐름: 에이전트(한 번) -> 세션(실행할 때마다).model/system/tools는 세션이 아닌 에이전트에 라이브입니다. 전체 읽기 가이드, 베타 헤더 및 함정은shared/managed-agents-overview.md를 참조하세요.
베타 헤더:managed-agents-2026-04-01- SDK는 모든client.beta.{agents,environments,sessions,vaults,memory_stores}.*호출에 대해 이를 자동으로 설정합니다. Skills API는skills-2025-10-02를 사용하고 Files API는files-api-2025-04-14를 사용하지만/v1/skills및/v1/files이외의 엔드포인트에 대해서는 이를 명시적으로 전달할 필요가 없습니다.
하위 명령 -/claude-api <subcommand>로 직접 호출:
| 하위 명령 | 액션 |
|---|---|
managed-agents-onboard | 관리 에이전트를 처음부터 설정하는 과정을 사용자에게 안내합니다. 즉시shared/managed-agents-onboarding.md를 읽고 인터뷰 스크립트를 따르십시오. 멘탈 모델 -> 분기 파악 또는 탐색 -> 템플릿 구성 -> 세션 설정 -> 코드 생성. 요약하지 말고 인터뷰를 진행하세요. |
읽기 가이드:shared/managed-agents-overview.md로 시작한 다음 주제shared/managed-agents-*.md파일(코어, 환경, 도구, 이벤트, 결과, 멀티에이전트, 웹훅, 메모리, 클라이언트 패턴, 온보딩, API 참조)을 읽어보세요. Python, TypeScript, Go, Ruby, PHP 및 Java의 경우{lang}/managed-agents/README.md에서 코드 예제를 읽어보세요. cURL의 경우curl/managed-agents.md를 읽어보세요. 에이전트는 영구적입니다. 한 번 생성하면 ID로 참조됩니다.agents.create에서 반환된 에이전트 ID를 저장하고 모든 후속sessions.create에 전달합니다. 요청 경로에서agents.create를 호출하지 마십시오. Anthropic CLI는 버전 제어 YAML(shared/live-sources.md의 URL)에서 에이전트와 환경을 생성하는 편리한 방법 중 하나입니다. 필요한 바인딩이 README 언어에 표시되지 않으면 추측하는 대신shared/live-sources.md에서 관련 항목을 WebFetch하세요. C#에는 현재 관리형 에이전트가 지원되지 않습니다.curl/managed-agents.md의 원시 HTTP를 참조로 사용합니다.
사용자가 처음부터 관리 에이전트를 설정하려는 경우(예: "시작하는 방법", "에이전트 생성 과정 안내", "새 에이전트 설정"):shared/managed-agents-onboarding.md를 읽고 인터뷰를 실행합니다. 이는managed-agents-onboard하위 명령과 동일한 흐름입니다.
사용자가 "X에 대한 클라이언트 코드를 어떻게 작성합니까?"라고 묻는 경우:shared/managed-agents-client-patterns.md에 도달 - 무손실 스트림 재연결,processed_at대기/처리된 게이트, 인터럽트,tool_confirmation왕복, 올바른 유휴/종료 브레이크 게이트, 유휴 후 상태 경쟁, 스트림 우선 순서, 파일 마운트 문제, 사용자 정의 도구를 통해 호스트 측 자격 증명 유지 등을 다룹니다.
독서 가이드
언어를 감지한 후 사용자에게 필요한 사항에 따라 관련 파일을 읽습니다.
빠른 작업 참조
단일 텍스트 분류/요약/추출/Q&A:
-> 읽기 전용{lang}/claude-api/README.md
채팅 UI 또는 실시간 응답 표시:
->{lang}/claude-api/README.md+{lang}/claude-api/streaming.md읽기
장기 실행 대화(컨텍스트 창을 초과할 수 있음):
->{lang}/claude-api/README.md읽기 - 압축 섹션 참조
최신 모델(Opus 4.7 / Opus 4.6 / Sonnet 4.6)로 마이그레이션하거나 폐기된 모델 교체:
->shared/model-migration.md읽기
신속한 캐싱 / 캐싱 최적화 / "캐시 적중률이 낮은 이유는 무엇입니까?":
->shared/prompt-caching.md+{lang}/claude-api/README.md읽기(프롬프트 캐싱 섹션)
기능 호출/도구 사용/에이전트:
->{lang}/claude-api/README.md+shared/tool-use-concepts.md+{lang}/claude-api/tool-use.md읽기
에이전트 설계(도구 표면, 컨텍스트 관리, 캐싱 전략):
->shared/agent-design.md읽기
일괄 처리(지연 시간에 민감하지 않음):
->{lang}/claude-api/README.md+{lang}/claude-api/batches.md읽기
여러 요청에 걸친 파일 업로드:
->{lang}/claude-api/README.md+{lang}/claude-api/files-api.md읽기
관리형 에이전트(작업 영역이 있는 서버 관리형 Stateful 에이전트):
->shared/managed-agents-overview.md+ 나머지shared/managed-agents-*.md파일을 읽습니다. Python, TypeScript, Go, Ruby, PHP 및 Java의 경우{lang}/managed-agents/README.md에서 코드 예제를 읽어보세요. cURL의 경우curl/managed-agents.md를 읽어보세요. 에이전트는 영구적입니다. 한 번 생성하면 ID로 참조됩니다.agents.create에서 반환된 에이전트 ID를 저장하고 모든 후속sessions.create에 전달합니다. 요청 경로에서agents.create를 호출하지 마십시오. Anthropic CLI는 버전 제어 YAML(shared/live-sources.md의 URL)에서 에이전트와 환경을 생성하는 편리한 방법 중 하나입니다. 필요한 바인딩이 README 언어에 표시되지 않으면 추측하는 대신shared/live-sources.md에서 관련 항목을 WebFetch하세요. C#은 현재 관리형 에이전트를 지원하지 않습니다.curl/managed-agents.md의 원시 HTTP를 참조로 사용하세요.
Claude API(전체 파일 참조)
언어별 Claude API 폴더({language}/claude-api/)를 읽어보세요.
{language}/claude-api/README.md- 먼저 읽어보세요. 설치, 빠른 시작, 일반적인 패턴, 오류 처리.shared/tool-use-concepts.md- 사용자에게 함수 호출, 코드 실행, 메모리 또는 구조화된 출력이 필요할 때 읽습니다. 개념적 기초를 다룹니다.shared/agent-design.md- 에이전트를 설계할 때 읽어 보세요: bash 대 전용 도구, 프로그래밍 방식 도구 호출, 도구 검색/기술, 컨텍스트 편집 대 압축 대 메모리, 캐싱 원칙.{language}/claude-api/tool-use.md- 언어별 도구 사용 코드 예제(도구 실행기, 수동 루프, 코드 실행, 메모리, 구조화된 출력)를 읽어보세요.{language}/claude-api/streaming.md- 응답을 점진적으로 표시하는 채팅 UI 또는 인터페이스를 구축할 때 읽어보세요.{language}/claude-api/batches.md- 많은 요청을 오프라인으로 처리할 때 읽습니다(대기 시간에 민감하지 않음). 50% 비용으로 비동기식으로 실행됩니다.{language}/claude-api/files-api.md- 다시 업로드하지 않고 여러 요청에 걸쳐 동일한 파일을 보낼 때 읽습니다.shared/prompt-caching.md- 프롬프트 캐싱을 추가하거나 최적화할 때 읽어보세요. 접두사 안정성 디자인, 중단점 배치 및 자동으로 캐시를 무효화하는 안티 패턴을 다룹니다.shared/error-codes.md- HTTP 오류를 디버깅하거나 오류 처리를 구현할 때 읽습니다.shared/model-migration.md- 최신 모델로 업그레이드하거나, 폐기된 모델을 교체하거나,budget_tokens/미리 채우기 패턴을 현재 API로 변환할 때 읽어보세요.shared/live-sources.md- 최신 공식 문서를 가져오기 위한 WebFetch URL입니다.
참고: Java, Go, Ruby, C#, PHP, cURL의 경우 모든 기본 사항을 다루는 단일 파일이 있습니다. 필요에 따라 해당 파일과shared/tool-use-concepts.md및shared/error-codes.md를 읽으십시오.
참고: 관리되는 에이전트 파일 참조는 위의## Managed Agents (Beta)섹션을 참조하세요. 여기에는 모든shared/managed-agents-*.md파일과 언어별 README가 나열되어 있습니다.
WebFetch를 사용해야 하는 경우
다음과 같은 경우 WebFetch를 사용하여 최신 문서를 얻으세요.
- 사용자가 '최신' 또는 '현재' 정보를 요청합니다.
- 캐시된 데이터가 잘못된 것 같습니다.
- 사용자가 여기서 다루지 않은 기능에 대해 질문합니다.
실시간 문서 URL은shared/live-sources.md에 있습니다.
일반적인 함정
- 파일이나 콘텐츠를 API에 전달할 때 입력을 자르지 마세요. 콘텐츠가 너무 길어서 컨텍스트 창에 맞지 않는 경우 조용히 자르지 말고 사용자에게 알리고 옵션(청크, 요약 등)에 대해 논의하세요.
- Opus 4.7 생각: 적응형만 가능합니다.
thinking: {type: "enabled", budget_tokens: N}는 Opus 4.7에서 400을 반환합니다. -budget_tokens는temperature,top_p,top_k와 함께 완전히 제거되었습니다.thinking: {type: "adaptive"}를 사용하세요. - Opus 4.6 / Sonnet 4.6 생각:
thinking: {type: "adaptive"}사용 - 새로운 4.6 코드에budget_tokens를 사용하지 마십시오(Opus 4.6 및 Sonnet 4.6 모두에서 더 이상 사용되지 않습니다. 기존 코드의 점진적인 마이그레이션에 대해서는shared/model-migration.md의 전환 탈출구를 참조하세요. 이 분할은 Opus 4.7에 적용되지 않습니다). 이전 모델의 경우budget_tokens는max_tokens(최소 1024)보다 작아야 합니다. 잘못 입력하면 오류가 발생합니다. - 4.6/4.7 제품군 미리 채우기 제거됨: 보조 메시지 미리 채우기(마지막 보조 회전 미리 채우기)는 Opus 4.6, Opus 4.7 및 Sonnet 4.6에서 400 오류를 반환합니다. 대신 구조화된 출력(
output_config.format) 또는 시스템 프롬프트 지침을 사용하여 응답 형식을 제어하십시오. - 편집하기 전에 마이그레이션 범위 확인: 사용자가 특정 파일, 디렉터리 또는 파일 목록의 이름을 지정하지 않고 코드를 최신 Claude 모델로 마이그레이션하도록 요청하는 경우 먼저 적용할 범위를 묻습니다(전체 작업 디렉터리, 특정 하위 디렉터리 또는 특정 파일 집합). 사용자가 확인할 때까지 편집을 시작하지 마십시오. "내 코드베이스 마이그레이션", "내 프로젝트를 X로 이동", "Sonnet 4.6으로 업그레이드" 또는 "Opus 4.7로 마이그레이션"과 같은 명령형 표현은 여전히 모호합니다. 무엇을 해야 할지 알려주지만 어디서는 알려주지 않으므로 물어보세요. 프롬프트 이름이 정확한 파일, 특정 디렉터리 또는 명시적인 파일 목록일 때만 묻지 않고 진행합니다("
app.py마이그레이션", "services/아래의 모든 항목 마이그레이션", "a.py및b.py업데이트").shared/model-migration.md0단계를 참조하세요. max_tokens기본값:max_tokens를 낮추지 마십시오. 한도를 치면 생각 중간에 출력이 잘리고 재시도가 필요합니다. 스트리밍되지 않는 요청의 경우 기본값은~16000입니다(SDK HTTP 시간 초과 시 응답 유지). 스트리밍 요청의 경우 기본값은~64000입니다(시간 초과는 문제가 되지 않으므로 모델 공간을 제공합니다). 분류(~256), 비용 상한 또는 고의적인 출력 부족 등 확실한 이유가 있을 때만 가격을 낮추세요.- 128K 출력 토큰: Opus 4.6 및 Opus 4.7은 최대 128K
max_tokens를 지원하지만 SDK에서는 HTTP 시간 초과를 방지하기 위해 큰 값에 대한 스트리밍이 필요합니다..stream()를.get_final_message()/.finalMessage()와 함께 사용하세요. - 도구 호출 JSON 구문 분석(4.6/4.7 제품군): Opus 4.6, Opus 4.7 및 Sonnet 4.6은 도구 호출
input필드(예: 유니코드 또는 슬래시 이스케이프)에서 다른 JSON 문자열 이스케이프를 생성할 수 있습니다. 항상json.loads()/JSON.parse()를 사용하여 도구 입력을 구문 분석합니다. 직렬화된 입력에서 원시 문자열 일치를 수행하지 마십시오. - 구조화된 출력(모든 모델):
messages.create()에서 더 이상 사용되지 않는output_format매개변수 대신output_config: {format: {...}}를 사용합니다. 이는 4.6에만 해당되는 것이 아닌 일반적인 API 변경 사항입니다. - SDK 기능을 다시 구현하지 마세요. SDK는 높은 수준의 도우미를 제공하므로 처음부터 빌드하는 대신 이를 사용하세요. 특히:
new Promise()에서.on()이벤트를 래핑하는 대신stream.finalMessage()를 사용하십시오. 문자열 일치 오류 메시지 대신 형식화된 예외 클래스(Anthropic.RateLimitError등)를 사용합니다. 동등한 인터페이스를 재정의하는 대신 SDK 유형(Anthropic.MessageParam,Anthropic.Tool,Anthropic.Message등)을 사용하세요. - SDK 데이터 구조에 대한 사용자 지정 유형을 정의하지 마세요. SDK는 모든 API 개체에 대한 유형을 내보냅니다. 메시지에는
Anthropic.MessageParam, 도구 정의에는Anthropic.Tool, 도구 결과에는Anthropic.ToolUseBlock/Anthropic.ToolResultBlockParam, 응답에는Anthropic.Message를 사용합니다. 자신만의interface ChatMessage { role: string; content: unknown }를 정의하면 SDK가 이미 제공하는 기능이 중복되어 유형 안전성이 상실됩니다. - 보고서 및 문서 출력: 보고서, 문서 또는 시각화를 생성하는 작업의 경우 코드 실행 샌드박스에는
python-docx,python-pptx,matplotlib,pillow및pypdf가 사전 설치되어 있습니다. Claude는 형식화된 파일(DOCX, PDF, 차트)을 생성하고 파일 API를 통해 이를 반환할 수 있습니다. 일반 표준 출력 텍스트 대신 "보고서" 또는 "문서" 유형 요청의 경우 이를 고려하세요.
리소스 파일
라이센스.txt
바이너리 리소스
csharp/claude-api.md
바이너리 리소스
컬/examples.md
바이너리 리소스
컬/managed-agents.md
바이너리 리소스
이동/claude-api.md
바이너리 리소스
go/managed-agents/README.md
go/managed-agents/README.md 다운로드
바이너리 리소스
자바/claude-api.md
바이너리 리소스
자바/관리 에이전트/README.md
java/managed-agents/README.md 다운로드
바이너리 리소스
php/claude-api.md
바이너리 리소스
php/managed-agents/README.md
php/managed-agents/README.md 다운로드
바이너리 리소스
파이썬/claude-api/README.md
python/claude-api/README.md 다운로드
바이너리 리소스
파이썬/claude-api/batches.md
python/claude-api/batches.md 다운로드
# Message Batches API — Python
The Batches API (`POST /v1/messages/batches`) processes Messages API requests asynchronously at 50% of standard prices.
## Key Facts
- Up to 100,000 requests or 256 MB per batch
- Most batches complete within 1 hour; maximum 24 hours
- Results available for 29 days after creation
- 50% cost reduction on all token usage
- All Messages API features supported (vision, tools, caching, etc.)
---
## Create a Batch
```python
수입 인류
anthropic.types.message_create_params import MessageCreateParamsNonStreaming에서
anthropic.types.messages.batch_create_params 가져오기 요청에서
클라이언트 = Anthropic.Anthropic()
message_batch = client.messages.batches.create(
요청=[
요청(
custom_id="요청-1",
params=MessageCreateParamsNonStreaming(
모델="claude-opus-4-7",
max_tokens=16000,
message=[{"role": "user", "content": "기후 변화 영향 요약"}]
)
),
요청(
custom_id="요청-2",
params=MessageCreateParamsNonStreaming(
모델="claude-opus-4-7",
max_tokens=16000,
message=[{"role": "user", "content": "양자 컴퓨팅 기본 사항 설명"}]
)
),
]
)
print(f"배치 ID: {message_batch.id}")
print(f"상태: {message_batch.processing_status}")Poll for Completion
수입 시간
True인 동안:
배치 = client.messages.batches.retrieve(message_batch.id)
Batch.processing_status == "종료"인 경우:
휴식
print(f"상태: {batch.processing_status}, 처리 중: {batch.request_counts.processing}")
시간.수면(60)
print("배치 완료!")
print(f"성공: {batch.request_counts.succeeded}")
print(f"오류 발생: {batch.request_counts.errored}")Retrieve Results
Note: Examples below use match/case syntax, requiring Python 3.10+. For earlier versions, use if/elif chains instead.
client.messages.batches.results(message_batch.id)의 결과:
일치 결과.결과.유형:
사례 "성공":
msg = 결과.결과.메시지
text = next((b.type == "text"인 경우 msg.content의 b에 대한 b.text), "")
print(f"[{result.custom_id}] {텍스트[:100]}")
"오류가 발생했습니다":
result.result.error.type == "invalid_request"인 경우:
print(f"[{result.custom_id}] 유효성 검사 오류 - 요청을 수정하고 다시 시도하세요")
그 외:
print(f"[{result.custom_id}] 서버 오류 - 재시도해도 안전함")
사례 "취소":
print(f"[{result.custom_id}] 취소됨")
"만료됨"인 경우:
print(f"[{result.custom_id}] 만료됨 - 다시 제출")Cancel a Batch
취소됨 = client.messages.batches.cancel(message_batch.id)
print(f"상태: {cancelled.processing_status}") # "취소 중"Batch with Prompt Caching
공유 시스템 = [
{"type": "text", "text": "당신은 문학 분석가입니다."},
{
"유형": "텍스트",
"text": Large_document_text, # 모든 요청에서 공유됨
"cache_control": {"type": "임시"}
}
]
message_batch = client.messages.batches.create(
요청=[
요청(
custom_id=f"분석-{i}",
params=MessageCreateParamsNonStreaming(
모델="claude-opus-4-7",
max_tokens=16000,
시스템=shared_system,
메시지=[{"역할": "사용자", "콘텐츠": 질문}]
)
)
나는, 열거된 질문(질문)
]
)Full End-to-End Example
수입 인류
수입 시간
anthropic.types.message_create_params import MessageCreateParamsNonStreaming에서
anthropic.types.messages.batch_create_params 가져오기 요청에서
클라이언트 = Anthropic.Anthropic()
# 1. 요청 준비
items_to_classify = [
"제품 품질이 우수해요!",
"끔찍한 고객 서비스, 다시는 없을 것입니다.",
"괜찮아, 특별한 건 없어.",
]
요청 = [
요청(
custom_id=f"분류-{i}",
params=MessageCreateParamsNonStreaming(
모델="claude-haiku-4-5",
max_tokens=50,
메시지=[{
"역할": "사용자",
"content": f"긍정/부정/중립으로 분류(한 단어): {text}"
}]
)
)
i의 경우 enumerate(items_to_classify)의 텍스트
]
# 2. 배치 생성
배치 = client.messages.batches.create(요청=요청)
print(f"생성된 배치: {batch.id}")
# 3. 완료될 때까지 기다리기
True인 동안:
배치 = client.messages.batches.retrieve(batch.id)
Batch.processing_status == "종료"인 경우:
휴식
시간.수면(10)
# 4. 결과 수집
결과 = {}
client.messages.batches.results(batch.id)의 결과:
result.result.type == "성공"인 경우:
msg = 결과.결과.메시지
결과[result.custom_id] = next((b.type == "text"인 경우 msg.content의 b에 대한 b.text), "")
custom_id의 경우 sorted(results.items()) 분류:
인쇄(f"{custom_id}: {classification}")
### 파이썬/claude-api/files-api.md
[python/claude-api/files-api.md 다운로드](/skills/claude-api/python/claude-api/files-api.md)
```markdown
# Files API — Python
The Files API uploads files for use in Messages API requests. Reference files via `file_id` in content blocks, avoiding re-uploads across multiple API calls.
**Beta:** Pass `betas=["files-api-2025-04-14"]` in your API calls (the SDK sets the required header automatically).
## Key Facts
- Maximum file size: 500 MB
- Total storage: 100 GB per organization
- Files persist until deleted
- File operations (upload, list, delete) are free; content used in messages is billed as input tokens
- Not available on Amazon Bedrock or Google Vertex AI
---
## Upload a File
```python
수입 인류
클라이언트 = Anthropic.Anthropic()
업로드됨 = client.beta.files.upload(
file=("report.pdf", open("report.pdf", "rb"), "application/pdf"),
)
print(f"파일 ID: {uploaded.id}")
print(f"크기: {uploaded.size_bytes} 바이트")Use a File in Messages
PDF / Text Document
응답 = client.beta.messages.create(
모델="claude-opus-4-7",
max_tokens=16000,
메시지=[{
"역할": "사용자",
"콘텐츠": [
{"type": "text", "text": "이 보고서의 주요 결과를 요약합니다."},
{
"유형": "문서",
"소스": {"유형": "파일", "파일_ID": 업로드된.id},
"title": "4분기 보고서", # 선택 사항
"citations": {"enabled": True} # 선택 사항, 인용 활성화
}
]
}],
betas=["files-api-2025-04-14"],
)
response.content의 블록:
block.type == "텍스트"인 경우:
인쇄(블록.텍스트)Image
image_file = client.beta.files.upload(
file=("photo.png", open("photo.png", "rb"), "이미지/png"),
)
응답 = client.beta.messages.create(
모델="claude-opus-4-7",
max_tokens=16000,
메시지=[{
"역할": "사용자",
"콘텐츠": [
{"type": "text", "text": "이 이미지에는 무엇이 있나요?"},
{
"유형": "이미지",
"소스": {"유형": "파일", "파일_ID": 이미지_파일.id}
}
]
}],
betas=["files-api-2025-04-14"],
)Manage Files
List Files
파일 = client.beta.files.list()
files.data의 f에 대해:
print(f"{f.id}: {f.filename} ({f.size_bytes} 바이트)")Get File Metadata
file_info = client.beta.files.retrieve_metadata("file_011CNha8iCJcU1wXNR6q4V8w")
print(f"파일명: {file_info.filename}")
print(f"MIME 유형: {file_info.mime_type}")Delete a File
client.beta.files.delete("file_011CNha8iCJcU1wXNR6q4V8w")Download a File
Only files created by the code execution tool or skills can be downloaded (not user-uploaded files).
file_content = client.beta.files.download("file_011CNha8iCJcU1wXNR6q4V8w")
file_content.write_to_file("output.txt")Full End-to-End Example
Upload a document once, ask multiple questions about it:
수입 인류
클라이언트 = Anthropic.Anthropic()
# 1. 한번 업로드
업로드됨 = client.beta.files.upload(
file=("contract.pdf", open("contract.pdf", "rb"), "application/pdf"),
)
print(f"업로드됨: {uploaded.id}")
# 2. 동일한 file_id를 사용하여 여러 질문하기
질문 = [
"주요 이용약관은 무엇인가요?",
"해지 조항이 무엇인가요?",
"지불 일정을 요약합니다.",
]
질문에 대한 질문:
응답 = client.beta.messages.create(
모델="claude-opus-4-7",
max_tokens=16000,
메시지=[{
"역할": "사용자",
"콘텐츠": [
{"유형": "텍스트", "텍스트": 질문},
{
"유형": "문서",
"소스": {"유형": "파일", "파일_ID": 업로드된.id}
}
]
}],
betas=["files-api-2025-04-14"],
)
print(f"\nQ: {question}")
text = next((b.type == "text"인 경우 response.content의 b에 대한 b.text), "")
print(f"A: {text[:200]}")
# 3. 끝나면 정리하세요
client.beta.files.delete(업로드된.id)
### 파이썬/claude-api/streaming.md
[python/claude-api/streaming.md 다운로드](/skills/claude-api/python/claude-api/streaming.md)
```markdown
# Streaming — Python
## Quick Start
```python
client.messages.stream(
모델="claude-opus-4-7",
max_tokens=64000,
message=[{"role": "user", "content": "스토리 쓰기"}]
) 스트림으로:
stream.text_stream의 텍스트:
인쇄(텍스트, end="", 플러시=True)Async
async_client.messages.stream(
모델="claude-opus-4-7",
max_tokens=64000,
message=[{"role": "user", "content": "스토리 쓰기"}]
) 스트림으로:
stream.text_stream의 텍스트에 대한 비동기:
인쇄(텍스트, end="", 플러시=True)Handling Different Content Types
Claude may return text, thinking blocks, or tool use. Handle each appropriately:
Opus 4.7 / Opus 4.6: Use thinking: {type: "adaptive"}. On older models, use thinking: {type: "enabled", budget_tokens: N} instead.
client.messages.stream(
모델="claude-opus-4-7",
max_tokens=64000,
Thinking={"type": "적응형"},
message=[{"role": "user", "content": "이 문제 분석"}]
) 스트림으로:
스트림 내 이벤트의 경우:
event.type == "content_block_start"인 경우:
event.content_block.type == "생각"인 경우:
print("\n[생각 중...]")
elif event.content_block.type == "텍스트":
print("\n[응답:]")
elif event.type == "content_block_delta":
event.delta.type == "thinking_delta"인 경우:
인쇄(event.delta.thinking, end="", 플러시=True)
elif event.delta.type == "text_delta":
인쇄(event.delta.text, end="", 플러시=True)Streaming with Tool Use
The Python tool runner currently returns complete messages. Use streaming for individual API calls within a manual loop if you need per-token streaming with tools:
client.messages.stream(
모델="claude-opus-4-7",
max_tokens=64000,
도구=도구,
메시지=메시지
) 스트림으로:
stream.text_stream의 텍스트:
인쇄(텍스트, end="", 플러시=True)
응답 = stream.get_final_message()
# response.stop_reason == "tool_use"인 경우 도구 실행을 계속합니다.Getting the Final Message
client.messages.stream(
모델="claude-opus-4-7",
max_tokens=64000,
message=[{"role": "user", "content": "안녕하세요"}]
) 스트림으로:
stream.text_stream의 텍스트:
인쇄(텍스트, end="", 플러시=True)
# 스트리밍 후 전체 메시지 받기
final_message = stream.get_final_message()
print(f"\n\n사용된 토큰: {final_message.usage.output_tokens}")Streaming with Progress Updates
def stream_with_progress(클라이언트, **kwargs):
"""진행상황 업데이트에 대한 응답을 스트리밍합니다."""
total_tokens = 0
콘텐츠_부분 = []
client.messages.stream(**kwargs)을 스트림으로 사용:
스트림 내 이벤트의 경우:
event.type == "content_block_delta"인 경우:
event.delta.type == "text_delta"인 경우:
텍스트 = event.delta.text
content_parts.append(텍스트)
인쇄(텍스트, end="", 플러시=True)
elif event.type == "message_delta":
event.usage 및 event.usage.output_tokens가 None이 아닌 경우:
total_tokens = event.usage.output_tokens
final_message = stream.get_final_message()
print(f"\n\n[사용된 토큰: {total_tokens}]")
반환 "".join(content_parts)Error Handling in Streams
시도해 보세요:
client.messages.stream(
모델="claude-opus-4-7",
max_tokens=64000,
message=[{"role": "user", "content": "스토리 쓰기"}]
) 스트림으로:
stream.text_stream의 텍스트:
인쇄(텍스트, end="", 플러시=True)
anthropic.APIConnectionError를 제외하고:
print("\n연결이 끊어졌습니다. 다시 시도해 주세요.")
anthropic.RateLimitError 제외:
print("\n속도가 제한되어 있습니다. 잠시 기다렸다가 다시 시도하십시오.")
e로 anthropic.APIStatusError를 제외하고:
print(f"\nAPI 오류: {e.status_code}")Stream Event Types
| Event Type | Description | When it fires |
|---|---|---|
message_start | Contains message metadata | Once at the beginning |
content_block_start | New content block beginning | When a text/tool_use block starts |
content_block_delta | Incremental content update | For each token/chunk |
content_block_stop | Content block complete | When a block finishes |
message_delta | Message-level updates | Contains stop_reason, usage |
message_stop | Message complete | Once at the end |
Best Practices
- Always flush output — Use
flush=Trueto show tokens immediately - Handle partial responses — If the stream is interrupted, you may have incomplete content
- Track token usage — The
message_deltaevent contains usage information - Use timeouts — Set appropriate timeouts for your application
- Default to streaming — Use
.get_final_message()to get the complete response even when streaming, giving you timeout protection without needing to handle individual events
### 파이썬/claude-api/tool-use.md
[python/claude-api/tool-use.md 다운로드](/skills/claude-api/python/claude-api/tool-use.md)
_바이너리 리소스_
### 파이썬/관리 에이전트/README.md
[python/managed-agents/README.md 다운로드](/skills/claude-api/python/managed-agents/README.md)
_바이너리 리소스_
### 루비/claude-api.md
[ruby/claude-api.md 다운로드](/skills/claude-api/ruby/claude-api.md)
```markdown
# Claude API — Ruby
> **Note:** The Ruby SDK supports the Claude API. A tool runner is available in beta via `client.beta.messages.tool_runner()`. Agent SDK is not yet available for Ruby.
## Installation
```bash
보석 설치 인류학Client Initialization
"인류"가 필요하다
# 기본값(ANTHROPIC_API_KEY 환경 변수 사용)
클라이언트 = Anthropic::Client.new
# 명시적 API 키
클라이언트 = Anthropic::Client.new(api_key: "your-api-key")Basic Message Request
메시지 = client.messages.create(
모델::"claude-opus-4-7",
최대 토큰: 16000,
메시지: [
{ role: "user", content: "프랑스의 수도는 어디인가요?" }
]
)
# 콘텐츠는 다형성 블록 객체(TextBlock, ThinkingBlock,
# ToolUseBlock,...)..type은 기호입니다. "text"가 아닌:text와 비교해 보세요.
# .text는 TextBlock이 아닌 항목에 대해 NoMethodError를 발생시킵니다.
message.content.each는 |block|
block.type ==:text인 경우 block.text를 넣습니다.
끝Streaming
스트림 = client.messages.stream(
모델::"claude-opus-4-7",
최대_토큰: 64000,
메시지: [{ 역할: "사용자", 내용: "하이쿠 쓰기" }]
)
stream.text.each { |텍스트| 인쇄(텍스트) }Tool Use
The Ruby SDK supports tool use via raw JSON schema definitions and also provides a beta tool runner for automatic tool execution.
Tool Runner (Beta)
클래스 GetWeatherInput < Anthropic::BaseModel
필수:location, String, doc: "도시 및 주(예: 캘리포니아 주 샌프란시스코")
끝
클래스 GetWeather < Anthropic::BaseTool
doc "특정 위치의 현재 날씨 가져오기"
input_schema GetWeatherInput
데프 호출(입력)
"#{input.location}의 날씨는 맑고 화씨 22도입니다."
끝
끝
client.beta.messages.tool_runner(
모델::"claude-opus-4-7",
최대 토큰: 16000,
도구: [GetWeather.new],
message: [{ role: "user", content: "샌프란시스코 날씨는 어때?" }]
).each_message 할 |메시지|
message.content를 넣습니다.
끝Manual Loop
See the shared tool use concepts for the tool definition format and agentic loop pattern.
Prompt Caching
system_: (trailing underscore — avoids shadowing Kernel#system) takes an array of text blocks; set cache_control on the last block. Plain hashes work via the OrHash type alias. For placement patterns and the silent-invalidator audit checklist, see shared/prompt-caching.md.
메시지 = client.messages.create(
모델::"claude-opus-4-7",
최대 토큰: 16000,
시스템_: [
{ 유형: "텍스트", 텍스트: long_system_prompt, 캐시_제어: { 유형: "임시" } }
],
메시지: [{ 역할: "사용자", 내용: "핵심 사항 요약" }]
)For 1-hour TTL: cache_control: { type: "ephemeral", ttl: "1h" }. There's also a top-level cache_control: on messages.create that auto-places on the last cacheable block.
Verify hits via message.usage.cache_creation_input_tokens / message.usage.cache_read_input_tokens.
### 루비/관리 에이전트/README.md
[ruby/managed-agents/README.md 다운로드](/skills/claude-api/ruby/managed-agents/README.md)
_바이너리 리소스_
### 공유/에이전트-design.md
[shared/agent-design.md 다운로드](/skills/claude-api/shared/agent-design.md)
_바이너리 리소스_
### 공유/오류-codes.md
[shared/error-codes.md 다운로드](/skills/claude-api/shared/error-codes.md)
_바이너리 리소스_
### 공유/live-sources.md
[shared/live-sources.md 다운로드](/skills/claude-api/shared/live-sources.md)
_바이너리 리소스_
### 공유/관리-에이전트-api-reference.md
[shared/managed-agents-api-reference.md 다운로드](/skills/claude-api/shared/managed-agents-api-reference.md)
_바이너리 리소스_
### 공유/관리-에이전트-클라이언트-patterns.md
[shared/managed-agents-client-patterns.md 다운로드](/skills/claude-api/shared/managed-agents-client-patterns.md)
_바이너리 리소스_
### 공유/관리-에이전트-core.md
[shared/managed-agents-core.md 다운로드](/skills/claude-api/shared/managed-agents-core.md)
_바이너리 리소스_
### 공유/관리-에이전트-environments.md
[shared/managed-agents-environments.md 다운로드](/skills/claude-api/shared/managed-agents-environments.md)
_바이너리 리소스_
### 공유/관리-에이전트-events.md
[shared/managed-agents-events.md 다운로드](/skills/claude-api/shared/managed-agents-events.md)
_바이너리 리소스_
### 공유/관리 에이전트-memory.md
[shared/managed-agents-memory.md 다운로드](/skills/claude-api/shared/managed-agents-memory.md)
_바이너리 리소스_
### 공유/관리-에이전트-multiagent.md
[shared/managed-agents-multiagent.md 다운로드](/skills/claude-api/shared/managed-agents-multiagent.md)
_바이너리 리소스_
### 공유/관리-에이전트-onboarding.md
[shared/managed-agents-onboarding.md 다운로드](/skills/claude-api/shared/managed-agents-onboarding.md)
_바이너리 리소스_
### 공유/관리-에이전트-outcomes.md
[shared/managed-agents-outcomes.md 다운로드](/skills/claude-api/shared/managed-agents-outcomes.md)
_바이너리 리소스_
### 공유/관리-에이전트-overview.md
[shared/managed-agents-overview.md 다운로드](/skills/claude-api/shared/managed-agents-overview.md)
_바이너리 리소스_
### 공유/관리-에이전트-tools.md
[shared/managed-agents-tools.md 다운로드](/skills/claude-api/shared/managed-agents-tools.md)
_바이너리 리소스_
### 공유/관리-에이전트-webhooks.md
[shared/managed-agents-webhooks.md 다운로드](/skills/claude-api/shared/managed-agents-webhooks.md)
```markdown
# Managed Agents — Webhooks
Anthropic can POST to your HTTPS endpoint when a Managed Agents resource changes state — an alternative to holding an SSE stream or polling. Payloads are **thin** (event type + resource IDs only); on receipt, fetch the resource for current state. Every delivery is HMAC-signed.
> **Direction matters.** This page covers *Anthropic → you* notifications about session/vault state. It does **not** cover *third-party → you* webhooks that *trigger* a session (e.g. a GitHub push handler that calls `sessions.create()`) — that's ordinary application code on your side with no Anthropic-specific wire format.
---
## Register an endpoint (Console only)
Console → **Manage → Webhooks**. There is no programmatic endpoint-management API yet. Secret rotation is supported from the same page.
| Field | Constraint |
|---|---|
| URL | HTTPS on port 443, publicly resolvable hostname |
| Event types | Subscribe per `data.type` — you only receive subscribed types (plus test events) |
| Signing secret | `whsec_`-prefixed, 32 bytes, **shown once at creation** — store it |
---
## Verify the signature
Every delivery is HMAC-signed. **Use the SDK's `client.beta.webhooks.unwrap()`** — it verifies the signature, rejects payloads more than ~5 minutes old, and returns the parsed event. It reads the `whsec_` secret from `ANTHROPIC_WEBHOOK_SIGNING_KEY`.
```python
수입 인류
플라스크 가져오기 플라스크에서 요청
client = anthropic.Anthropic() # env에서 ANTHROPIC_WEBHOOK_SIGNING_KEY를 읽습니다.
앱 = 플라스크(__name__)
@app.route("/webhook",method=["POST"])
데프 웹훅():
시도해 보세요:
이벤트 = client.beta.webhooks.unwrap(
request.get_data(as_text=True),
헤더=dict(request.headers),
)
예외:
"잘못된 서명"을 반환합니다, 400
if event.id in visible_event_ids: # 중복 제거 재시도 — ID는 전송별이 아니라 이벤트별입니다.
"", 204 반환
see_event_ids.add(event.id)
event.data.type 일치:
케이스 "session.status_idled":
세션 = client.beta.sessions.retrieve(event.data.id)
inform_user(세션)
사례 "vault_credential.refresh_failed":
Alert_oncall(event.data.id)
"", 204 반환Pass the raw request body to unwrap() — frameworks that re-serialize JSON (Express .json(), Flask .get_json()) change the bytes and break the MAC. For other languages, look up the beta.webhooks.unwrap binding in the SDK repo (shared/live-sources.md); don't hand-roll verification.
Payload envelope
{
"유형": "이벤트",
"id": "event_01ABC...",
"created_at": "2026-03-18T14:05:22Z",
"데이터": {
"유형": "session.status_idled",
"id": "session_01XYZ...",
"organization_id": "8a3d2f1e-...",
"workspace_id": "c7b0e4d9-..."
}
}Switch on data.type, fetch the resource by data.id, return any 2xx to acknowledge. created_at is when the state transition happened, not when the webhook fired.
Supported data.type values
data.type | Fires when |
|---|---|
session.status_scheduled | Session created and ready to accept events |
session.status_run_started | Agent execution kicked off (every transition to running) |
session.status_idled | Agent awaiting input (tool approval, custom tool result, or next message) |
session.status_terminated | Session hit a terminal error |
session.thread_created | Multiagent: coordinator opened a new subagent thread |
session.thread_idled | Multiagent: a subagent thread is waiting for input |
session.outcome_evaluation_ended | Outcome grader finished one iteration |
vault.archived | Vault was archived |
vault.created | Vault was created |
vault.deleted | Vault was deleted |
vault_credential.archived | Vault credential was archived |
vault_credential.created | Vault credential was created |
vault_credential.deleted | Vault credential was deleted |
vault_credential.refresh_failed | MCP OAuth vault credential failed to refresh |
These are webhook data.type values — a separate namespace from SSE event types (session.status_idle, span.outcome_evaluation_end, etc. in shared/managed-agents-events.md). Don't reuse SSE constants in webhook handlers.
Delivery behavior & pitfalls
- No ordering guarantee.
session.status_idledmay arrive beforesession.outcome_evaluation_endedeven if the evaluation finished first. Sort by envelopecreated_atif order matters. - Retries carry the same
event.id. At least one retry on non-2xx. Dedupe onevent.id. - 3xx is failure. Redirects are not followed — update the URL in Console if your endpoint moves.
- Auto-disable after ~20 consecutive failed deliveries, or immediately if the hostname resolves to a private IP or returns a redirect. Re-enable manually in Console.
- Thin payload is intentional. Don't expect
stop_reason,outcome_evaluations, credential secrets, etc. on the webhook body — fetch the resource.
### 공유/모델-migration.md
[shared/model-migration.md 다운로드](/skills/claude-api/shared/model-migration.md)
_바이너리 리소스_
### 공유/models.md
[shared/models.md 다운로드](/skills/claude-api/shared/models.md)
_바이너리 리소스_
### 공유/프롬프트-caching.md
[shared/prompt-caching.md 다운로드](/skills/claude-api/shared/prompt-caching.md)
_바이너리 리소스_
### 공유/도구 사용-concepts.md
[shared/tool-use-concepts.md 다운로드](/skills/claude-api/shared/tool-use-concepts.md)
_바이너리 리소스_
### 타이프스크립트/claude-api/README.md
[typescript/claude-api/README.md 다운로드](/skills/claude-api/typescript/claude-api/README.md)
_바이너리 리소스_
### 타이프스크립트/claude-api/batches.md
[typescript/claude-api/batches.md 다운로드](/skills/claude-api/typescript/claude-api/batches.md)
```markdown
# Message Batches API — TypeScript
The Batches API (`POST /v1/messages/batches`) processes Messages API requests asynchronously at 50% of standard prices.
## Key Facts
- Up to 100,000 requests or 256 MB per batch
- Most batches complete within 1 hour; maximum 24 hours
- Results available for 29 days after creation
- 50% cost reduction on all token usage
- All Messages API features supported (vision, tools, caching, etc.)
---
## Create a Batch
```typescript
"@anthropic-ai/sdk"에서 Anthropic을 가져옵니다.
const 클라이언트 = 새로운 Anthropic();
const messageBatch = client.messages.batches.create({를 기다립니다.
요청: [
{
custom_id: "요청-1",
매개변수: {
모델: "claude-opus-4-7",
최대 토큰: 16000,
메시지: [
{ 역할: "사용자", 콘텐츠: "기후 변화 영향 요약" },
],
},
},
{
custom_id: "요청-2",
매개변수: {
모델: "claude-opus-4-7",
최대 토큰: 16000,
메시지: [
{ 역할: "사용자", 내용: "양자 컴퓨팅 기본 사항 설명" },
],
},
},
],
});
console.log(`Batch ID: ${messageBatch.id}`);
console.log(`Status: ${messageBatch.processing_status}`);Poll for Completion
배치하자;
동안 (참) {
배치 = client.messages.batches.retrieve(messageBatch.id)를 기다립니다.
if (batch.processing_status === "종료됨") break;
콘솔.로그(
`Status: ${batch.processing_status}, processing: ${batch.request_counts.processing}`,
);
새로운 약속을 기다리십시오((resolve) => setTimeout(resolve, 60_000));
}
console.log("배치 완료!");
console.log(`Succeeded: ${batch.request_counts.succeeded}`);
console.log(`Errored: ${batch.request_counts.errored}`);Retrieve Results
대기에 대한 (대기 client.messages.batches.results의 결과(
messageBatch.id,
)) {
스위치(result.result.type) {
사례 "성공":
콘솔.로그(
`[${result.custom_id}] ${result.result.message.content[0].text.slice(0, 100)}`,
);
부서지다;
"오류가 발생했습니다":
if (result.result.error.type === "invalid_request") {
console.log(`[${result.custom_id}] Validation error - fix and retry`);
} 그렇지 않으면 {
console.log(`[${result.custom_id}] Server error - safe to retry`);
}
부서지다;
"만료됨"인 경우:
console.log(`[${result.custom_id}] Expired - resubmit`);
부서지다;
}
}Cancel a Batch
const 취소됨 = client.messages.batches.cancel(messageBatch.id)를 기다립니다.
console.log(`Status: ${cancelled.processing_status}`); // "취소"
### 타이프스크립트/claude-api/files-api.md
[typescript/claude-api/files-api.md 다운로드](/skills/claude-api/typescript/claude-api/files-api.md)
```markdown
# Files API — TypeScript
The Files API uploads files for use in Messages API requests. Reference files via `file_id` in content blocks, avoiding re-uploads across multiple API calls.
**Beta:** Pass `betas: ["files-api-2025-04-14"]` in your API calls (the SDK sets the required header automatically).
## Key Facts
- Maximum file size: 500 MB
- Total storage: 100 GB per organization
- Files persist until deleted
- File operations (upload, list, delete) are free; content used in messages is billed as input tokens
- Not available on Amazon Bedrock or Google Vertex AI
---
## Upload a File
```typescript
"@anthropic-ai/sdk"에서 Anthropic, { toFile }을 가져옵니다.
"fs"에서 fs를 가져옵니다.
const 클라이언트 = 새로운 Anthropic();
const 업로드됨 = client.beta.files.upload({
파일: wait toFile(fs.createReadStream("report.pdf"), 정의되지 않음, {
유형: "응용 프로그램/pdf",
}),
베타: ["files-api-2025-04-14"],
});
console.log(`File ID: ${uploaded.id}`);
console.log(`Size: ${uploaded.size_bytes} bytes`);Use a File in Messages
PDF / Text Document
const 응답 = client.beta.messages.create({
모델: "claude-opus-4-7",
최대 토큰: 16000,
메시지: [
{
역할: "사용자",
내용: [
{ type: "text", text: "이 보고서의 주요 결과를 요약합니다." },
{
유형: "문서",
소스: { 유형: "파일", file_id: 업로드된.id },
title: "4분기 보고서",
인용: { 활성화됨: true },
},
],
},
],
베타: ["files-api-2025-04-14"],
});
console.log(response.content[0].text);Manage Files
List Files
const 파일 = client.beta.files.list({
베타: ["files-api-2025-04-14"],
});
for (files.data의 const f) {
console.log(`${f.id}: ${f.filename} (${f.size_bytes} bytes)`);
}Delete a File
client.beta.files.delete("file_011CNha8iCJcU1wXNR6q4V8w", {
베타: ["files-api-2025-04-14"],
});Download a File
const 응답 = client.beta.files.download(
"file_011CNha8iCJcU1wXNR6q4V8w",
{ 베타: ["files-api-2025-04-14"] },
);
const content = Buffer.from(응답을 기다리고 있습니다.arrayBuffer());
fs.promises.writeFile("output.txt", content)를 기다리십시오.
### typescript/claude-api/streaming.md
[typescript/claude-api/streaming.md 다운로드](/skills/claude-api/typescript/claude-api/streaming.md)
```markdown
# Streaming — TypeScript
## Quick Start
```typescript
const 스트림 = client.messages.stream({
모델: "claude-opus-4-7",
최대_토큰: 64000,
메시지: [{ 역할: "사용자", 콘텐츠: "스토리 쓰기" }],
});
대기(스트림의 상수 이벤트) {
만약 (
event.type === "content_block_delta" &&
event.delta.type === "text_delta"
) {
process.stdout.write(event.delta.text);
}
}Handling Different Content Types
Opus 4.7 / Opus 4.6: Use thinking: {type: "adaptive"}. On older models, use thinking: {type: "enabled", budget_tokens: N} instead.
const 스트림 = client.messages.stream({
모델: "claude-opus-4-7",
최대_토큰: 64000,
생각: { 유형: "적응형" },
메시지: [{ 역할: "사용자", 내용: "이 문제 분석" }],
});
대기(스트림의 상수 이벤트) {
스위치(event.type) {
사례 "content_block_start":
스위치(event.content_block.type) {
"생각"의 경우:
console.log("\n[생각중...]");
부서지다;
케이스 "텍스트":
console.log("\n[응답:]");
부서지다;
}
부서지다;
사례 "content_block_delta":
스위치(event.delta.type) {
사례 "thinking_delta":
process.stdout.write(event.delta.thinking);
부서지다;
사례 "text_delta":
process.stdout.write(event.delta.text);
부서지다;
}
부서지다;
}
}Streaming with Tool Use (Tool Runner)
Use the tool runner with stream: true. The outer loop iterates over tool runner iterations (messages), the inner loop processes stream events:
"@anthropic-ai/sdk"에서 Anthropic을 가져옵니다.
"@anthropic-ai/sdk/helpers/beta/zod"에서 { betaZodTool }을 가져옵니다.
"zod"에서 {z }를 가져옵니다.
const 클라이언트 = 새로운 Anthropic();
const getWeather = betaZodTool({
이름: "get_weather",
Description: "특정 위치의 현재 날씨 가져오기",
inputSchema: z.object({
위치: z.string().describe("도시 및 주(예: 캘리포니아 주 샌프란시스코"),
}),
실행: 비동기({ 위치 }) =>`72°F and sunny in ${location}`,
});
const 러너 = client.beta.messages.toolRunner({
모델: "claude-opus-4-7",
최대_토큰: 64000,
도구: [getWeather],
메시지: [
{ role: "user", content: "파리와 런던의 날씨는 어때?" },
],
스트림: 사실,
});
// 외부 루프: 각 도구 실행기 반복
대기(실행자의 const messageStream) {
// 내부 루프: 이 반복에 대한 스트림 이벤트
대기(messageStream의 const 이벤트) {
스위치(event.type) {
사례 "content_block_delta":
스위치(event.delta.type) {
사례 "text_delta":
process.stdout.write(event.delta.text);
부서지다;
"input_json_delta"의 경우:
// 스트리밍되는 도구 입력
휴식;
}
부서지다;
}
}
}Getting the Final Message
const 스트림 = client.messages.stream({
모델: "claude-opus-4-7",
최대_토큰: 64000,
메시지: [{ 역할: "사용자", 콘텐츠: "안녕하세요" }],
});
대기(스트림의 상수 이벤트) {
// 이벤트 처리...
}
const finalMessage = stream.finalMessage()를 기다립니다;
console.log(`Tokens used: ${finalMessage.usage.output_tokens}`);Stream Event Types
| Event Type | Description | When it fires |
|---|---|---|
message_start | Contains message metadata | Once at the beginning |
content_block_start | New content block beginning | When a text/tool_use block starts |
content_block_delta | Incremental content update | For each token/chunk |
content_block_stop | Content block complete | When a block finishes |
message_delta | Message-level updates | Contains stop_reason, usage |
message_stop | Message complete | Once at the end |
Best Practices
- Always flush output — Use
process.stdout.write()for immediate display - Handle partial responses — If the stream is interrupted, you may have incomplete content
- Track token usage — The
message_deltaevent contains usage information - Use
finalMessage()— Get the completeAnthropic.Messageobject even when streaming. Don't wrap.on()events innew Promise()—finalMessage()handles all completion/error/abort states internally - Buffer for web UIs — Consider buffering a few tokens before rendering to avoid excessive DOM updates
- Use
stream.on("text", ...)for deltas — Thetextevent provides just the delta string, simpler than manually filteringcontent_block_deltaevents - For agentic loops with streaming — See the Streaming Manual Loop section in tool-use.md for combining
stream()+finalMessage()with a tool-use loop
Raw SSE Format
If using raw HTTP (not SDKs), the stream returns Server-Sent Events:
이벤트: message_start
데이터: {"유형":"message_start","메시지":{"id":"msg_...","유형":"메시지",...}}
이벤트: content_block_start
데이터: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}
이벤트: content_block_delta
데이터: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Hello"}}
이벤트: content_block_stop
데이터: {"type":"content_block_stop","index":0}
이벤트: message_delta
데이터: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":12}}
이벤트: message_stop
데이터: {"type":"message_stop"}
### typescript/claude-api/tool-use.md
[typescript/claude-api/tool-use.md 다운로드](/skills/claude-api/typescript/claude-api/tool-use.md)
_바이너리 리소스_
### typescript/managed-agents/README.md
[typescript/managed-agents/README.md 다운로드](/skills/claude-api/typescript/managed-agents/README.md)
_바이너리 리소스_
## GitHub에서 보기
[GitHub에서 보기](https://github.com/anthropics/skills/tree/main/claude-api)
클로데스킬스 문서