K-EXAONE 2.5 무료 API 파이썬 실습 전 이용 조건과 첫 호출

K-EXAONE 무료 API 소식을 보고 파이썬으로 시험해 보고 싶다면, 먼저 무료 제공과 이용 허락 범위를 따로 확인해야 합니다. K-EXAONE 무료 API는 개인의 비상업적 학습에 활용할 수 있지만, 영리 이용과 제품이나 서비스에 연결해 제3자가 호출하거나 입력하게 하는 이용은 허용 범위에서 제외됩니다. 아래 예제는 개인 학습을 위한 단일 요청이며, 실제 API 호출이나 응답 품질을 측정한 결과는 아닙니다.

인공지능신문의 공개 소식을 계기로, 실제 학습에 쓸지 판단할 조건과 응답 확인 순서를 정리했습니다.

현재 조건부터 판단하기

아래 내용은 2026-11-12에 확인한 공식 자료를 기준으로 하며, 이용 전에는 원문을 다시 확인하세요.

상황 판단과 확인할 자료
개인의 비상업적 학습 현재 무료로 안내된 API를 학습에 사용할 수 있습니다. 변경이력과 이용약관을 함께 확인하세요.
영리 목적 또는 제3자 연동 약관은 모델과 결과물의 영리 이용, 제품·서비스 연동으로 제3자가 호출하거나 입력하게 하는 이용을 금지합니다. 이런 용도라면 학습 예제를 그대로 적용하지 말고 최신 약관을 확인하세요.
제공 기간과 호출량 무료 종료일이나 모든 계정에 공통으로 보장되는 호출 횟수는 확인되지 않았습니다. 실제 계정의 제한과 응답 헤더를 확인하세요.
입력 정보 개인정보가 없는 합성 문장을 사용하고 민감한 실제 업무 자료는 입력하지 마세요. 개인정보처리방침에 따르면 선택 동의 여부에 따라 입력과 결과물의 이용·처리 방식이 달라집니다.

무료라는 말만으로 모든 활용이 허용되는 것은 아닙니다. 서비스 개선을 위한 이용기록 분석은 선택 동의이며 동의하지 않아도 이용할 수 있다고 호출 제한 문서는 설명합니다.

API 키와 파이썬 환경 준비

독자가 직접 플랫폼에 로그인해 API 키를 발급받고, 코드나 저장소에 키를 적지 않은 채 실행 환경의 EXAONE_API_KEY에 설정하세요. 공식 인증 안내는 Bearer 인증과 환경변수 등 안전한 키 관리를 안내합니다. 키를 브라우저나 공개 코드에 노출하지 않는 편이 좋습니다.

프로젝트 디렉터리에서 가상환경을 만들고 활성화한 다음 requests를 설치합니다. 다음 활성화 명령은 macOS와 Linux 셸 기준이며 Windows에서는 해당 환경의 활성화 명령을 사용하세요.

python3 -m venv .venv
source .venv/bin/activate
python -m pip install requests

환경변수 설정 방법은 사용하는 셸에 맞춰 선택하고, 실제 키 값은 공유하지 마세요. 환경변수가 읽히지 않을 때는 os.getenv() 확인 순서도 참고할 수 있습니다.

requests로 단일 호출하고 답변 확인하기

공식 API 명세의 엔드포인트와 모델 이름을 사용합니다. 아래 max_tokens와 timeout은 예제 값이며 권장 최적값이나 응답 시간 보장이 아닙니다. max_tokens에는 추론 과정이 포함되므로 최종 답변에 쓸 여유도 고려해야 합니다. reasoning_effort의 현재 허용값은 low, high, max입니다.

다음 코드를 파일에 저장해 실행하세요. 요청은 한 번만 보내며, 출력은 유효한 최종 답변의 message.content만 사용합니다.

import os
import requests

key = os.getenv("EXAONE_API_KEY")
if not key or not key.strip():
    raise SystemExit("EXAONE_API_KEY 환경변수가 비어 있거나 설정되지 않았습니다.")

url = "https://api.exaone.ai/v1/chat/completions"
payload = {
    "model": "k-exaone_v2.5",
    "messages": [{"role": "user", "content": "가상의 도서관 안내 문장을 짧게 작성해 주세요."}],
    "stream": False,
    "reasoning_effort": "low",
    "max_tokens": 4096,  # 학습용 예시 값
}
try:
    response = requests.post(
        url,
        headers={"Authorization": f"Bearer {key.strip()}"},
        json=payload,
        timeout=90,  # 초 단위 예시 값
    )
    response.raise_for_status()
except requests.HTTPError as exc:
    status = exc.response.status_code if exc.response is not None else "알 수 없음"
    raise SystemExit(f"HTTP 오류: {status}. 응답 상세와 제한 헤더를 확인하세요.")
except requests.RequestException as exc:
    raise SystemExit(f"요청 오류: {type(exc).__name__}")

try:
    data = response.json()
except ValueError:
    raise SystemExit("응답이 유효한 JSON이 아닙니다.")
choices = data.get("choices") if isinstance(data, dict) else None
if not isinstance(choices, list) or not choices or not isinstance(choices[0], dict):
    raise SystemExit("응답에 확인할 choices가 없습니다.")
choice = choices[0]
message = choice.get("message")
content = message.get("content") if isinstance(message, dict) else None
if not isinstance(content, str) or not content.strip():
    raise SystemExit("최종 답변이 비어 있습니다. 출력 예산과 응답을 확인하세요.")
if choice.get("finish_reason") != "stop":
    raise SystemExit("완료 사유가 stop이 아닙니다. 답변과 출력 예산을 확인하세요.")
print(content.strip())

HTTP 요청이 성공해도 응답이 유효한 최종 답변인지 별도로 확인해야 합니다. 이 예제는 JSON 구조와 choices, 비어 있지 않은 내용, 완료 사유를 차례로 살펴보고 조건이 맞지 않으면 출력하지 않습니다. 특히 finish_reason이 length이거나 내용이 비었다면 출력 예산과 응답을 살펴보세요. 이 확인은 답변 내용의 정확성까지 보증하지 않으므로 중요한 내용은 별도로 검증해야 합니다.

오류가 나면 어디부터 볼까

오류 코드 안내에 따르면 401은 키 누락이나 인증 실패를 확인할 신호입니다. 키가 올바르게 전달됐는지와 만료 여부를 살펴보세요. 이용약관은 키 유효기간을 발급일로부터 30일로 정하고, 90일 동안 로그인하지 않은 계정은 휴면 및 키 비활성화가 가능하다고 설명합니다.

429는 호출 제한을 확인할 신호입니다. 호출 제한 안내의 제한·잔여량 헤더를 확인하고, retry-after나 retry-after-ms가 없을 수도 있으므로 무한 재시도하지 마세요. 상태 코드만으로 원인을 단정하지 말고 응답의 result_code와 description을 확인하되, 키와 민감한 내용이 로그에 남지 않도록 주의하세요.

개인 학습에 맞는 조건이라면 합성 문장으로 요청 구조와 응답 검사를 익히는 데서 시작할 수 있습니다. 이후 응답을 프로그램에서 가공하려면 AI JSON 응답 검증의 선택 기준을 살펴보세요. 이용 조건이나 호출 제한이 바뀌었는지, 또는 답변을 업무 판단에 쓰기 전에 어떻게 검증할지도 다음에 확인할 질문입니다.

Leave a Comment