이 기능은 Zero Data Retention (ZDR)의 적용 대상입니다. 조직에 ZDR 계약이 체결되어 있는 경우, 이 기능을 통해 전송된 데이터는 API 응답이 반환된 후 저장되지 않습니다.
세분화된 도구 스트리밍은 모든 모델과 모든 플랫폼에서 사용할 수 있습니다. 이 기능은 버퍼링이나 JSON 검증 없이 도구 사용 매개변수 값의 스트리밍을 가능하게 하여, 대용량 매개변수를 수신하기 시작하는 데 걸리는 "latency"(지연 시간)를 줄입니다.
세분화된 도구 스트리밍을 사용할 때 유효하지 않거나 부분적인 JSON 입력을 받을 수 있습니다. 코드에서 이러한 엣지 케이스를 반드시 처리하세요.
세분화된 도구 스트리밍은 Claude API, AWS의 Claude Platform, Amazon Bedrock, Vertex AI, Microsoft Foundry에서 지원됩니다. 이를 사용하려면 세분화된 스트리밍을 활성화하려는 사용자 정의 도구에서 eager_input_streaming을 true로 설정하고, 요청에서 스트리밍을 활성화하세요.
다음은 API에서 세분화된 도구 스트리밍을 사용하는 방법의 예시입니다:
client = anthropic.Anthropic()
with client.messages.stream(
max_tokens=65536,
model="claude-opus-4-8",
tools=[
{
"name": "make_file",
"description": "Write text to a file",
"eager_input_streaming": True,
"input_schema": {
"type": "object",
"properties": {
"filename": {
"type": "string",
"description": "The filename to write text to",
},
"lines_of_text": {
"type": "array",
"description": "An array of lines of text to write to the file",
},
},
"required": ["filename", "lines_of_text"],
},
}
],
messages=[
{
"role": "user",
"content": "Can you write a long poem and make a file called poem.txt?",
}
],
) as stream:
final_message = stream.get_final_message()
print(f"Input tokens: {final_message.usage.input_tokens}")
print(f"Output tokens: {final_message.usage.output_tokens}")이 예시에서 세분화된 도구 스트리밍은 Claude가 lines_of_text 매개변수가 유효한 JSON인지 검증하기 위해 버퍼링하지 않고, 긴 시의 각 행을 make_file 도구 호출로 스트리밍할 수 있게 합니다. 즉, 전체 매개변수가 버퍼링되고 검증될 때까지 기다릴 필요 없이 매개변수가 도착하는 대로 스트림을 확인할 수 있습니다.
세분화된 도구 스트리밍을 사용하면 서버가 JSON 검증 버퍼링을 건너뛰기 때문에 도구 입력 청크가 더 빨리 도착하기 시작합니다. 그 부수 효과로 청크는 일반적으로 더 길고 토큰 중간에서 끊기는 경우가 더 적습니다.
세분화된 스트리밍은 버퍼링이나 JSON 검증 없이 매개변수를 전송하기 때문에, 결과 스트림이 유효한 JSON 문자열로 완료된다는 보장이 없습니다.
특히 중지 사유 max_tokens에 도달하면 스트림이 매개변수 중간에서 끝나 불완전할 수 있습니다. 일반적으로 max_tokens에 도달했을 때를 처리하기 위한 별도의 지원 코드를 작성해야 합니다.
tool_use 콘텐츠 블록이 스트리밍될 때, 초기 content_block_start 이벤트에는 input: {}(빈 객체)가 포함됩니다. 이는 플레이스홀더입니다. 실제 입력은 각각 partial_json 문자열 조각을 담고 있는 일련의 input_json_delta 이벤트로 도착합니다. 전체 입력을 조립하려면 이러한 조각들을 연결하고 블록이 닫힐 때 결과를 파싱하세요.
SDK가 누적기 헬퍼를 제공하는 경우(이 페이지의 첫 번째 예시에서 사용된 것처럼), 이 작업을 자동으로 처리해 줍니다. 수동 패턴은 헬퍼가 없는 SDK를 사용하거나, 블록이 닫히기 전에 부분 입력에 반응해야 할 때 사용합니다.
누적 규칙은 다음과 같습니다:
type: "tool_use"인 content_block_start에서 빈 문자열을 초기화합니다: input_json = ""type: "input_json_delta"인 각 content_block_delta마다 추가합니다: input_json += event.delta.partial_jsoncontent_block_stop에서 누적된 문자열을 파싱합니다: json.loads(input_json)초기 input: {}(객체)와 partial_json(문자열) 간의 타입 불일치는 의도된 설계입니다. 빈 객체는 콘텐츠 배열에서 슬롯을 표시하고, 델타 문자열이 실제 값을 구성합니다.
블록이 닫히기 전에 부분 입력에 반응해야 할 때(예: 진행률 표시기 렌더링) 수동 패턴을 사용하세요. 그렇지 않은 경우, 이 페이지의 첫 번째 예시에서 사용하는 것처럼 SDK의 누적기 헬퍼를 사용하는 것이 좋습니다.
세분화된 도구 스트리밍을 사용할 때 모델로부터 유효하지 않거나 불완전한 JSON을 받을 수 있습니다. 이 유효하지 않은 JSON을 오류 응답 블록으로 모델에 다시 전달해야 하는 경우, 적절한 처리를 위해 JSON 객체로 감쌀 수 있습니다(적절한 키를 사용하여). 예를 들면 다음과 같습니다:
{
"INVALID_JSON": "<your invalid json string>"
}이 접근 방식은 디버깅 목적으로 원본의 잘못된 형식의 데이터를 보존하면서 모델이 해당 콘텐츠가 유효하지 않은 JSON임을 이해하도록 돕습니다.
유효하지 않은 JSON을 감쌀 때, 래퍼 객체에서 유효한 JSON 구조를 유지하기 위해 유효하지 않은 JSON 문자열의 따옴표나 특수 문자를 적절히 이스케이프 처리하세요.
서버 전송 이벤트 및 스트림 이벤트 유형에 대한 전체 참조입니다.
도구를 실행하고 필요한 메시지 형식으로 결과를 반환합니다.
Anthropic 스키마 도구 및 해당 버전 문자열의 전체 디렉터리입니다.
Was this page helpful?
client = anthropic.Anthropic()
tool_inputs: dict[int, str] = {} # index -> accumulated JSON string
with client.messages.stream(
model="claude-opus-4-8",
max_tokens=1024,
tools=[
{
"name": "get_weather",
"description": "Get current weather for a city",
"eager_input_streaming": True,
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
}
],
messages=[{"role": "user", "content": "Weather in Paris?"}],
) as stream:
for event in stream:
match event.type:
case "content_block_start" if event.content_block.type == "tool_use":
tool_inputs[event.index] = ""
case "content_block_delta" if event.delta.type == "input_json_delta":
tool_inputs[event.index] += event.delta.partial_json
case "content_block_stop" if event.index in tool_inputs:
parsed = json.loads(tool_inputs[event.index])
print(f"Tool input: {parsed}")