메인 콘텐츠로 건너뛰기
Anthropic Claude는 매우 강력한 AI 대화 시스템으로, 입력한 프롬프트에 따라 몇 초 만에 유창하고 자연스러운 응답을 생성할 수 있습니다. Claude Messages API는 Anthropic 공식 원주율 API 형식으로, OpenAI와 호환되는 형식(채팅 완료)과는 달리, Anthropic 고유의 요청 및 응답 구조를 채택하여 Claude의 독특한 능력인 다중 모드 콘텐츠 입력, 도구 호출, 심층 사고(확장된 사고) 등의 고급 기능을 더 잘 활용할 수 있습니다. 이 문서는 Claude Messages API 작업의 사용 프로세스를 주로 설명하며, 이를 통해 우리는 Anthropic 공식과 일치하는 원주율 인터페이스를 사용하여 Claude의 대화 기능을 호출할 수 있습니다.

신청 프로세스

Claude Messages API를 사용하려면 먼저 Claude Messages API 페이지에서 “Acquire” 버튼을 클릭하여 요청에 필요한 자격 증명을 얻을 수 있습니다: 로그인 또는 등록하지 않은 경우 자동으로 로그인 페이지로 리디렉션되어 등록 및 로그인을 초대합니다. 로그인 및 등록 후에는 자동으로 현재 페이지로 돌아옵니다. 첫 신청 시 무료 한도가 제공되어 해당 API를 무료로 사용할 수 있습니다.

기본 사용

Claude Messages API의 요청 경로는 /v1/messages로, Anthropic 공식 API와 일치합니다. 우리는 최소한 세 가지 필수 매개변수를 제공해야 합니다:
  • model: 사용할 Claude 모델을 선택합니다. 예: claude-opus-4-20250514, claude-sonnet-4-20250514 등.
  • messages: 입력 메시지 배열로, 각 메시지는 role(역할)과 content(내용)를 포함합니다. 여기서 roleuserassistant를 지원합니다.
  • max_tokens: 최대 출력 토큰 수로, 단일 응답의 길이를 제한하는 데 사용됩니다.
자주 사용되는 선택적 매개변수:
  • system: 시스템 프롬프트로, 모델의 행동과 역할을 설정하는 데 사용됩니다.
  • temperature: 생성의 무작위성으로, 0-1 사이의 값이며 값이 클수록 응답이 더 분산됩니다.
  • stream: 스트리밍 응답 사용 여부로, true로 설정하면 글자 단위로 반환되는 효과를 얻을 수 있습니다.
  • stop_sequences: 사용자 정의 중지 시퀀스로, 모델이 이러한 텍스트를 만나면 생성을 중지합니다.
  • top_p: 핵 샘플링 매개변수로, temperature와 함께 생성의 무작위성을 제어합니다.
  • top_k: 확률이 가장 높은 K개의 옵션 중에서만 샘플링합니다.
  • tools: 도구 정의로, 모델이 외부 함수를 호출할 수 있도록 합니다.
  • tool_choice: 모델이 제공된 도구를 사용하는 방법을 제어합니다.

cURL 예시

curl -X POST 'https://api.acedata.cloud/v1/messages' \
  -H 'accept: application/json' \
  -H 'authorization: Bearer {token}' \
  -H 'content-type: application/json' \
  -d '{
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "messages": [
      {
        "role": "user",
        "content": "Hello, Claude"
      }
    ]
  }'

Python 예시

import requests

url = "https://api.acedata.cloud/v1/messages"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "messages": [
        {"role": "user", "content": "Hello, Claude"}
    ]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())
호출 후 반환 결과는 다음과 같습니다:
{
  "id": "msg_013Zva2CMHLNnXjNJJKqJ2EF",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "Hi! My name is Claude. How can I help you today?"
    }
  ],
  "model": "claude-sonnet-4-20250514",
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 12,
    "output_tokens": 15
  }
}
반환 결과 필드 설명:
  • id: 이번 메시지의 고유 식별자입니다.
  • type: 항상 message입니다.
  • role: 항상 assistant입니다.
  • content: 응답 내용 배열로, 각 요소는 type(예: text)과 해당 내용을 포함합니다.
  • model: 요청을 처리한 모델 이름입니다.
  • stop_reason: 중지 이유로, 가능한 값은 end_turn(정상 종료), max_tokens(최대 길이에 도달), stop_sequence(중지 시퀀스에 도달), tool_use(도구 호출)입니다.
  • stop_sequence: 사용자 정의 중지 시퀀스에 의해 중지된 경우, 일치하는 중지 시퀀스 텍스트를 표시합니다.
  • usage: 토큰 사용 통계로, input_tokens(입력 토큰 수)와 output_tokens(출력 토큰 수)를 포함합니다.

시스템 프롬프트

Claude Messages API는 system 필드를 통해 시스템 프롬프트를 설정하여 모델의 행동, 역할 및 맥락을 정의할 수 있습니다.

Python 예시

import requests

url = "https://api.acedata.cloud/v1/messages"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "system": "당신은 전문적인 중국어 번역 도우미입니다. 사용자가 입력한 영어를 중국어로 번역해 주세요.",
    "messages": [
        {"role": "user", "content": "The quick brown fox jumps over the lazy dog."}
    ]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())
system 프롬프트를 설정함으로써 Claude의 역할과 행동 방식을 정확하게 제어할 수 있습니다.

스트리밍 응답

이 인터페이스는 스트리밍 응답도 지원하며, stream 매개변수를 true로 설정하면 단계적으로 반환되는 효과를 얻을 수 있어 웹 페이지에서 글자 단위로 표시하는 데 매우 적합합니다.

Python 예시

import requests

url = "https://api.acedata.cloud/v1/messages"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "stream": True,
    "messages": [
        {"role": "user", "content": "Hello, Claude"}
    ]
}

response = requests.post(url, json=payload, headers=headers, stream=True)
for line in response.iter_lines():
    if line:
        print(line.decode("utf-8"))
스트리밍 응답은 Server-Sent Events (SSE) 형식으로 반환되며, 각 행은 event:data:로 시작합니다. 스트리밍 이벤트 유형은 다음과 같습니다:
  • message_start: 메시지 시작, 메시지의 기본 정보와 모델 이름을 포함합니다.
  • content_block_start: 콘텐츠 블록 시작.
  • content_block_delta: 콘텐츠 블록 증분 업데이트로, 새로 생성된 텍스트 조각을 포함합니다.
  • content_block_stop: 콘텐츠 블록 종료.
  • message_delta: 메시지 수준의 증분 업데이트로, stop_reason과 최종 usage 정보를 포함합니다.
  • message_stop: 메시지 종료.
출력 효과는 다음과 같습니다:
event: message_start
data: {"type":"message_start","message":{"id":"msg_01XFDUDYJgAACzvnptvVoYEL","type":"message","role":"assistant","content":[],"model":"claude-sonnet-4-20250514","stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":12,"output_tokens":0}}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"안녕하세요"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"! 제 이름은"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" 클로드입니다. 오늘 무엇을 도와드릴까요?"}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"output_tokens":15}}

event: message_stop
data: {"type":"message_stop"}
볼 수 있듯이, 스트리밍 응답에서 content_block_delta 이벤트는 단계적으로 생성된 텍스트 내용을 포함하고 있으며, 모든 text_delta를 연결하여 전체 응답을 얻을 수 있습니다.

JavaScript 예제

const options = {
  method: "POST",
  headers: {
    accept: "application/json",
    authorization: "Bearer {token}",
    "content-type": "application/json",
  },
  body: JSON.stringify({
    model: "claude-sonnet-4-20250514",
    max_tokens: 1024,
    stream: true,
    messages: [{ role: "user", content: "안녕하세요, 클로드" }],
  }),
};

const response = await fetch("https://api.acedata.cloud/v1/messages", options);
const reader = response.body.getReader();
const decoder = new TextDecoder();

while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  console.log(decoder.decode(value));
}

다중 회화

다중 회화 기능을 통합하려면 messages 배열에 userassistant 역할의 메시지를 번갈아 배치하고 이전 대화 기록을 함께 전달해야 합니다.

Python 예제

import requests

url = "https://api.acedata.cloud/v1/messages"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "messages": [
        {"role": "user", "content": "안녕하세요, 제 이름은 앨리스입니다."},
        {"role": "assistant", "content": "안녕하세요 앨리스! 만나서 반갑습니다. 오늘 무엇을 도와드릴까요?"},
        {"role": "user", "content": "내 이름이 뭐죠?"}
    ]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())
반환 결과는 다음과 같습니다:
{
  "id": "msg_01Y1wfQmd89g968TVbFu57Yc",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "당신의 이름은 앨리스입니다, 방금 말씀하신 대로요!"
    }
  ],
  "model": "claude-sonnet-4-20250514",
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 40,
    "output_tokens": 14
  }
}
messages에 전체 대화 기록을 전달함으로써, 클로드는 맥락을 결합하여 정확한 답변을 할 수 있습니다.

심층 사고 모델

클로드는 Extended Thinking(심층 사고) 기능을 지원하여 모델이 응답하기 전에 내부 추론을 수행하여 복잡한 문제 처리의 정확성을 높일 수 있습니다. 이 기능을 사용할 때는 thinking 매개변수를 전달해야 합니다.

Python 예제

import requests

url = "https://api.acedata.cloud/v1/messages"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 16000,
    "thinking": {
        "type": "enabled",
        "budget_tokens": 10000
    },
    "messages": [
        {"role": "user", "content": "30도 사인의 값은 무엇인가요? 당신의 추론을 보여주세요."}
    ]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())
반환 결과는 다음과 같습니다:
{
  "id": "msg_018J4YaRoGHtbsTVb4Vvz7oH",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "thinking",
      "thinking": "사용자가 30도의 사인을 묻고 있습니다. 이것은 기본적인 삼각법 질문입니다.\n\n30-60-90 삼각형에서, 변의 비율은 1:√3:2입니다.\n\n30° 각도에 대해:\n- 대변은 1입니다.\n- 빗변은 2입니다.\n- 따라서 sin(30°) = 대변/빗변 = 1/2 = 0.5"
    },
    {
      "type": "text",
      "text": "30도의 사인은 **1/2** 또는 **0.5**입니다.\n\n이것은 기본적인 삼각법 값 중 하나입니다. 30-60-90 삼각형에서 변의 비율은 1:√3:2이며, 30° 각도에 대한 대변의 길이는 1이고 빗변의 길이는 2이므로 sin(30°) = 1/2가 됩니다."
    }
  ],
  "model": "claude-sonnet-4-20250514",
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 28,
    "output_tokens": 239
  }
}
볼 수 있듯이, content 배열에는 두 개의 내용 블록이 포함되어 있습니다:
  • type: "thinking": 모델의 내부 사고 과정으로, 추론 단계를 보여줍니다.
  • type: "text": 최종 답변 결과입니다.
주의 사항:
  • thinking을 사용할 때, max_tokensbudget_tokens보다 커야 합니다. 왜냐하면 budget_tokens는 사고 과정에 할당된 토큰 예산이기 때문입니다.
  • budget_tokens가 클수록 모델이 더 깊이 있는 추론을 할 수 있는 공간이 커지며, 복잡한 문제를 처리하는 데 적합합니다.

시각 모델

클로드는 다중 모달 입력을 지원하여 텍스트와 이미지를 동시에 처리할 수 있습니다. Messages API에서 content를 배열 형식으로 설정하고 이미지 내용 블록을 전달하면 시각적 기능을 사용할 수 있습니다.

Base64 인코딩 이미지를 사용하기

import base64
import requests

url = "https://api.acedata.cloud/v1/messages"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

# 이미지 읽기 및 인코딩
with open("image.png", "rb") as f:
    image_data = base64.standard_b64encode(f.read()).decode("utf-8")

payload = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": "image/png",
                        "data": image_data
                    }
                },
                {
                    "type": "text",
                    "text": "이 이미지에는 무엇이 있나요?"
                }
            ]
        }
    ]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

URL 이미지를 사용하기

import requests

url = "https://api.acedata.cloud/v1/messages"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "url",
                        "url": "https://cdn.acedata.cloud/ueugot.png"
                    }
                },
                {
                    "type": "text",
                    "text": "이 이미지에는 무엇이 있나요?"
                }
            ]
        }
    ]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

cURL 예시

curl -X POST 'https://api.acedata.cloud/v1/messages' \
  -H 'accept: application/json' \
  -H 'authorization: Bearer {token}' \
  -H 'content-type: application/json' \
  -d '{
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "image",
            "source": {
              "type": "url",
              "url": "https://cdn.acedata.cloud/ueugot.png"
            }
          },
          {
            "type": "text",
            "text": "이 이미지에는 무엇이 있나요?"
          }
        ]
      }
    ]
  }'
지원되는 이미지 형식에는 image/jpeg, image/png, image/gif, image/webp가 포함됩니다. 반환 결과 예시:
{
  "id": "msg_01NCrxpZmV17bhQJJRQEFEb9",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "이 이미지는 AI 채팅 완성 서비스로 보이는 API 요청 구성 인터페이스를 보여줍니다. 인터페이스에는 모델 선택, 메시지, 스트림 모드 및 최대 토큰 설정을 위한 매개변수가 포함되어 있습니다."
    }
  ],
  "model": "claude-sonnet-4-20250514",
  "stop_reason": "end_turn",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 1570,
    "output_tokens": 52
  }
}

도구 호출 (Tool Use)

Claude Messages API는 도구 호출 기능을 원래 지원하며, 모델이 필요할 때 미리 정의된 도구/함수를 호출할 수 있습니다.

Python 예시

import requests

url = "https://api.acedata.cloud/v1/messages"

headers = {
    "accept": "application/json",
    "authorization": "Bearer {token}",
    "content-type": "application/json"
}

payload = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "tools": [
        {
            "name": "get_weather",
            "description": "주어진 위치의 현재 날씨를 가져옵니다.",
            "input_schema": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "도시와 주, 예: 샌프란시스코, CA"
                    }
                },
                "required": ["location"]
            }
        }
    ],
    "messages": [
        {"role": "user", "content": "샌프란시스코의 날씨는 어떤가요?"}
    ]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())
모델이 도구를 호출하기로 결정하면, 반환 결과의 content에는 tool_use 유형의 내용 블록이 포함됩니다:
{
  "id": "msg_01Aq9w938a90dw8q",
  "type": "message",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "샌프란시스코의 날씨를 확인해 보겠습니다."
    },
    {
      "type": "tool_use",
      "id": "toolu_01A09q90qw90lq917835lgs",
      "name": "get_weather",
      "input": {
        "location": "샌프란시스코, CA"
      }
    }
  ],
  "model": "claude-sonnet-4-20250514",
  "stop_reason": "tool_use",
  "stop_sequence": null,
  "usage": {
    "input_tokens": 120,
    "output_tokens": 68
  }
}
stop_reasontool_use인 경우, 모델이 도구를 호출해야 함을 나타냅니다. 이 결과를 받은 후, 도구 함수를 실행하고 결과를 tool_result 형식으로 모델에 다시 전달해야 합니다:
payload = {
    "model": "claude-sonnet-4-20250514",
    "max_tokens": 1024,
    "tools": [
        {
            "name": "get_weather",
            "description": "주어진 위치의 현재 날씨를 가져옵니다.",
            "input_schema": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "도시와 주, 예: 샌프란시스코, CA"
                    }
                },
                "required": ["location"]
            }
        }
    ],
    "messages": [
        {"role": "user", "content": "샌프란시스코의 날씨는 어떤가요?"},
        {
            "role": "assistant",
            "content": [
                {"type": "text", "text": "샌프란시스코의 날씨를 확인해 보겠습니다."},
                {"type": "tool_use", "id": "toolu_01A09q90qw90lq917835lgs", "name": "get_weather", "input": {"location": "샌프란시스코, CA"}}
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "tool_result",
                    "tool_use_id": "toolu_01A09q90qw90lq917835lgs",
                    "content": "맑음, 72°F"
                }
            ]
        }
    ]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())
모델은 도구에서 반환된 결과를 기반으로 최종 자연어 응답을 생성합니다.

Chat Completion API와의 차이점

Ace Data Cloud는 두 가지 Claude API 형식을 제공하며, 두 형식의 주요 차이점은 다음과 같습니다:
특성Messages API (/v1/messages)Chat Completion API (/v1/chat/completions)
형식Anthropic 원래 형식OpenAI 호환 형식
시스템 프롬프트독립적인 system 필드messagesrole: "system"을 통해 전달
응답 구조content 배열(다양한 유형 지원)choices 배열(포함된 message)
스트리밍 형식SSE 이벤트(다양한 이벤트 유형)SSE data
심층 사고원래 thinking 매개변수특별한 모델 이름으로 트리거(예: -thinking 접미사)
도구 호출원래 tools + input_schemaOpenAI 호환 functions 형식
토큰 통계input_tokens / output_tokensprompt_tokens / completion_tokens
시스템이 이미 OpenAI 형식의 API에 연결되어 있다면, Chat Completion API를 사용하여 원활하게 전환할 수 있습니다. Claude의 모든 원래 기능을 사용해야 하는 경우 Messages API를 사용하는 것이 좋습니다.

오류 처리

API를 호출할 때 오류가 발생하면, API는 해당 오류 코드와 정보를 반환합니다. 예를 들어:
  • 400 token_mismatched: 잘못된 요청, 누락되거나 잘못된 매개변수 때문일 수 있습니다.
  • 400 api_not_implemented: 잘못된 요청, 누락되거나 잘못된 매개변수 때문일 수 있습니다.
  • 401 invalid_token: 인증되지 않음, 잘못되었거나 누락된 인증 토큰.
  • 429 too_many_requests: 너무 많은 요청, 비율 제한을 초과했습니다.
  • 500 api_error: 내부 서버 오류, 서버에서 문제가 발생했습니다.

오류 응답 예시

{
  "error": {
    "code": "400",
    "message": "잘못된 요청입니다."
  }
}
{
  "success": false,
  "error": {
    "code": "api_error",
    "message": "가져오기 실패"
  },
  "trace_id": "2cf86e86-22a4-46e1-ac2f-032c0f2a4e89"
}

결론

이 문서를 통해 Claude Messages API를 사용하여 Anthropic 원본 형식으로 Claude의 대화 기능을 호출하는 방법을 이해하셨습니다. Messages API는 기본 대화, 시스템 프롬프트, 스트리밍 응답, 다중 회차 대화, 심층 사고, 시각적 이해 및 도구 호출 등 다양한 기능을 지원합니다. 질문이 있으시면 언제든지 기술 지원 팀에 문의해 주시기 바랍니다.