따라 하는 가이드

OpenRouter의 Ox Alpha를 내 컴퓨터에서 실행하는 가장 쉬운 방법

Python·Windows 초보자도 따라 하는 10분 설치 튜토리얼

보너스 확인 기준 2026년 8월 22일 Python·Windows 초보자 10분

OpenRouter는 여러 회사의 AI 모델을 하나의 API 형식으로 호출할 수 있게 해 주는 중계 서비스입니다. 이 글에서는 OpenAI 호환 API를 이용해 stealth/ox-alpha 모델에 질문하고, 답변을 받아 화면에 출력하는 작은 프로그램을 만듭니다.

완성 후에는 터미널에서 다음처럼 실행할 수 있습니다.

python ox_alpha.py

그러면 프로그램이 Ox Alpha에 질문을 보내고 최종 답변을 출력합니다.

현재 OpenRouter 모델 페이지는 Ox Alpha를 무료 프리뷰 모델, 100만 토큰 문맥 길이를 가진 추론 모델로 소개하고 있습니다. 다만 프리뷰 모델은 가격·사용 한도·제공 여부가 바뀔 수 있으므로 실제 사용 전에는 Ox Alpha 모델 페이지를 다시 확인하십시오.

먼저 알아둘 핵심 세 가지

  1. OpenRouter 계정과 API 키가 필요합니다. API 키는 AI 서비스를 호출할 때 사용하는 비밀번호와 같습니다.
  2. API 키를 코드에 직접 적지 않습니다. 별도의 .env 파일에 저장하고, 이 파일은 GitHub에 올리지 않습니다.
  3. 민감한 정보를 입력하지 않습니다. Ox Alpha는 익명의 제3자 제공자가 운영하는 스텔스 프리뷰 모델입니다. OpenRouter의 현재 안내에 따르면 이 모델의 프롬프트와 응답은 제공자에게 보관됩니다. 학생 이름, 전화번호, 상담 기록, 성적표, 미공개 시험지, 주민등록번호 같은 개인정보·기밀자료는 보내지 마십시오.

전체 과정 한눈에 보기

OpenRouter 가입 → API 키 발급 → Python 프로젝트 생성 → 패키지 설치 → .env에 키 저장 → Ox Alpha 호출 → 답변 확인 순서입니다.

1단계: OpenRouter API 키 만들기

OpenRouter API Keys 페이지에 로그인합니다.

  1. Create Key를 누릅니다.
  2. 알아보기 쉬운 이름을 입력합니다. 예: ox-alpha-tutorial
  3. 필요하면 사용 한도를 설정합니다.
  4. 생성된 sk-or-v1-... 형태의 키를 복사합니다.
키 보관

API 키는 생성 직후 안전한 곳에 보관하십시오. 화면 공유, 블로그 캡처, GitHub 코드, 카카오톡 메시지에 실제 키가 노출되지 않도록 주의합니다. 노출되었다면 즉시 해당 키를 폐기하고 새로 발급하십시오.

여기까지 확인

키가 sk-or-v1-로 시작합니다.

2단계: Python 설치 확인하기

Windows

PowerShell을 열고 다음 명령을 입력합니다.

python --version

명령이 작동하지 않으면 다음도 시도합니다.

py --version

버전 번호가 나오지 않으면 Python 공식 다운로드 페이지에서 Python 3.10 이상을 설치하십시오. Windows 설치 화면에서는 Add Python to PATH를 반드시 체크하는 것이 좋습니다.

macOS·Linux

터미널에서 다음 명령을 입력합니다.

python3 --version

Python 3.10 이상의 버전 번호가 나오면 다음 단계로 이동합니다.

3단계: 프로젝트 폴더 만들기

Windows PowerShell

원문 한 줄에는 mkdir과 cd가 붙어 있었습니다. 아래처럼 두 명령을 차례로 입력하면 됩니다. 폴더 이름은 바꾸지 않습니다.

mkdir openrouter-ox-alpha
cd openrouter-ox-alpha

macOS·Linux

mkdir openrouter-ox-alpha
cd openrouter-ox-alpha

이제 이 폴더 안에 다음 세 파일을 만들게 됩니다.

openrouter-ox-alpha/
├── .env
├── .gitignore
└── ox_alpha.py

VS Code를 사용한다면 이 폴더에서 다음 명령을 실행해 편집기를 열 수 있습니다.

code .

code 명령이 없어도 메모장이나 다른 텍스트 편집기를 사용하면 됩니다.

4단계: 가상환경 만들기

가상환경은 이 프로젝트에 필요한 Python 패키지만 따로 보관하는 작은 상자입니다. 다른 프로젝트와 패키지가 뒤섞이는 것을 막아 줍니다.

Windows PowerShell

python 명령을 사용할 수 있다면:

python -m venv .venv
.\.venv\Scripts\Activate.ps1

py 명령만 작동한다면:

py -m venv .venv
.\.venv\Scripts\Activate.ps1

실행 정책 오류가 나타나면 PowerShell 대신 명령 프롬프트를 열어 다음 명령을 사용해도 됩니다.

.venv\Scripts\activate.bat

macOS·Linux

python3 -m venv .venv
source .venv/bin/activate
여기까지 확인

성공하면 터미널 줄 앞에 (.venv)가 표시됩니다.

5단계: 필요한 패키지 설치하기

가상환경이 활성화된 상태에서 다음 명령을 실행합니다.

python -m pip install --upgrade pip
python -m pip install openai python-dotenv

macOS·Linux에서 python이 작동하지 않으면 python3로 바꾸십시오.

설치하는 패키지는 두 개입니다.

  • openai: OpenAI 호환 형식으로 OpenRouter API를 호출합니다.
  • python-dotenv: .env 파일에 보관한 API 키를 안전하게 불러옵니다.

6단계: API 키를 .env에 저장하기

프로젝트 폴더에 이름이 정확히 .env인 파일을 만들고 다음 한 줄을 입력합니다.

OPENROUTER_API_KEY=sk-or-v1-여기에_본인의_실제_키를_붙여넣으세요

주의할 점은 다음과 같습니다.

  • OPENROUTER_API_KEY 앞뒤에 공백을 넣지 않습니다.
  • 실제 키를 따옴표로 감쌀 필요는 없습니다.
  • 이 예시의 가짜 키를 그대로 사용하면 인증되지 않습니다.
  • Windows 메모장에서 저장할 때 파일명이 .env.txt가 되지 않았는지 확인합니다.

.gitignore 만들기

같은 폴더에 .gitignore 파일을 만들고 다음 내용을 입력합니다.

.env
.venv/
__pycache__/

이 파일은 Git이 API 키와 가상환경 폴더를 추적하지 않도록 막아 줍니다.

7단계: 첫 번째 요청 보내기

ox_alpha.py 파일을 만들고 다음 코드를 그대로 붙여넣습니다.

import os
from dotenv import load_dotenv
from openai import OpenAI

# 같은 폴더의 .env 파일을 읽습니다.
load_dotenv()

api_key = os.getenv("OPENROUTER_API_KEY")
if not api_key:
    raise RuntimeError(
        "OPENROUTER_API_KEY를 찾지 못했습니다. .env 파일명과 내용을 확인하세요."
    )

# OpenAI SDK가 OpenRouter 주소로 요청을 보내도록 설정합니다.
client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=api_key,
)

response = client.chat.completions.create(
    model="stealth/ox-alpha",
    messages=[
        {
            "role": "system",
            "content": "당신은 초보자에게 친절하게 설명하는 한국어 튜터입니다.",
        },
        {
            "role": "user",
            "content": "영어 단어 strawberry에는 r이 몇 개 있나요? 글자를 하나씩 세어 설명해 주세요.",
        },
    ],
    max_tokens=500,
    extra_body={
        "reasoning": {
            "enabled": True,
        }
    },
)

message = response.choices[0].message

# 모델·제공자에 따라 reasoning 또는 reasoning_details가 없거나,
# 요약·암호화된 형태로만 반환될 수 있습니다.
reasoning_details = getattr(message, "reasoning_details", None)
reasoning_text = getattr(message, "reasoning", None)

if reasoning_details:
    print("\n[추론 정보]")
    print(reasoning_details)
elif reasoning_text:
    print("\n[추론 정보]")
    print(reasoning_text)

print("\n[최종 답변]")
print(message.content)

코드가 하는 일

  • base_url을 OpenRouter 주소로 바꿉니다.
  • model="stealth/ox-alpha"로 사용할 모델을 지정합니다.
  • messages에 시스템 지침과 사용자의 질문을 넣습니다.
  • reasoning.enabled로 지원되는 범위 안에서 추론 기능을 활성화합니다.
  • 모델이 반환한 추론 정보가 있을 때만 출력하고, 마지막에 최종 답변을 출력합니다.

OpenRouter는 Chat Completions 요청 본문에 model, messages, stream, max_tokens, temperature, tools, response_format 등의 값을 받을 수 있습니다. 자세한 형식은 OpenRouter API Reference에서 확인할 수 있습니다.

8단계: 실행하기

프로젝트 폴더의 터미널에서 다음 명령을 실행합니다.

python ox_alpha.py

macOS·Linux에서 필요하면 다음처럼 실행합니다.

python3 ox_alpha.py
여기까지 확인

정상이라면 strawberry에 들어 있는 r의 개수를 설명하는 답변이 표시됩니다. strawberry의 글자는 s-t-r-a-w-b-e-r-r-y이므로 r은 세 개입니다.

9단계: 답변을 실시간 스트리밍으로 받기

기본 요청은 답변 전체가 완성될 때까지 기다렸다가 한 번에 출력합니다. 긴 답변을 글자 단위로 바로 보고 싶다면 스트리밍을 사용합니다.

새 파일 ox_alpha_stream.py를 만들고 다음 코드를 붙여넣습니다.

import os
from dotenv import load_dotenv
from openai import OpenAI

load_dotenv()

api_key = os.getenv("OPENROUTER_API_KEY")
if not api_key:
    raise RuntimeError(".env에서 OPENROUTER_API_KEY를 찾지 못했습니다.")

client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=api_key,
)

stream = client.chat.completions.create(
    model="stealth/ox-alpha",
    messages=[
        {
            "role": "user",
            "content": "회상 연습이 공부에 도움이 되는 이유를 중학생도 이해하게 설명해 주세요.",
        }
    ],
    max_tokens=800,
    stream=True,
    stream_options={"include_usage": True},
    extra_body={
        "reasoning": {
            "enabled": True,
        }
    },
)

print("\n[Ox Alpha 답변]\n")

for chunk in stream:
    if chunk.choices:
        content = chunk.choices[0].delta.content
        if content:
            print(content, end="", flush=True)

    # 사용량 정보가 포함된 마지막 청크가 오면 요약해서 보여 줍니다.
    if chunk.usage:
        print("\n\n[사용량]")
        print(chunk.usage.model_dump())

print()

실행합니다.

python ox_alpha_stream.py

stream=True를 넣으면 OpenRouter가 Server-Sent Events 방식으로 응답 조각을 차례로 보냅니다.

설치 없이 API 연결만 1분 만에 확인하기

Python 프로젝트를 만들기 전에 API 키와 모델이 작동하는지만 확인하고 싶다면 터미널에서 직접 요청할 수 있습니다.

macOS·Linux

현재 터미널 세션에 키를 등록합니다.

export OPENROUTER_API_KEY="sk-or-v1-본인의_실제_키"

그다음 요청합니다.

curl -N https://openrouter.ai/api/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -d '{
    "model": "stealth/ox-alpha",
    "stream": true,
    "messages": [
      {"role": "user", "content": "안녕하세요. 한 문장으로 자기소개해 주세요."}
    ]
  }'

Windows PowerShell

$env:OPENROUTER_API_KEY="sk-or-v1-본인의_실제_키"

PowerShell에서는 다음 명령으로 요청합니다.

$headers = @{
    "Authorization" = "Bearer $env:OPENROUTER_API_KEY"
    "Content-Type"  = "application/json"
}

$body = @{
    model = "stealth/ox-alpha"
    messages = @(
        @{
            role = "user"
            content = "안녕하세요. 한 문장으로 자기소개해 주세요."
        }
    )
} | ConvertTo-Json -Depth 5

$response = Invoke-RestMethod `
    -Uri "https://openrouter.ai/api/v1/chat/completions" `
    -Method Post `
    -Headers $headers `
    -Body $body

$response.choices[0].message.content

PowerShell 예제는 이해하기 쉽게 비스트리밍 방식으로 작성했습니다.

TypeScript로 실행하고 싶은 경우

Python 대신 Node.js를 사용한다면 Node.js 공식 사이트에서 Node.js를 설치한 뒤 다음 순서로 진행합니다.

1. 프로젝트 만들기

mkdir openrouter-ox-alpha-ts
cd openrouter-ox-alpha-ts
npm init -y
npm install @openrouter/sdk dotenv

2. .env 만들기

OPENROUTER_API_KEY=sk-or-v1-여기에_본인의_실제_키를_붙여넣으세요

3. index.mjs 만들기

import "dotenv/config";
import { OpenRouter } from "@openrouter/sdk";

const apiKey = process.env.OPENROUTER_API_KEY;

if (!apiKey) {
  throw new Error(".env에서 OPENROUTER_API_KEY를 찾지 못했습니다.");
}

const openrouter = new OpenRouter({ apiKey });

const stream = await openrouter.chat.send({
  model: "stealth/ox-alpha",
  messages: [
    {
      role: "user",
      content: "영어 단어 strawberry에는 r이 몇 개 있나요?",
    },
  ],
  reasoning: {
    enabled: true,
  },
  stream: true,
});

for await (const chunk of stream) {
  const content = chunk.choices[0]?.delta?.content;
  if (content) {
    process.stdout.write(content);
  }

  if (chunk.usage) {
    console.log("\n\nUsage:", chunk.usage);
  }
}

4. 실행하기

node index.mjs

현재 공식 OpenRouter SDK 문서는 chat.send({ model, messages, ... }) 형식을 사용합니다. 모델 페이지의 자동 생성 예제에서 chat.send({ chatRequest: { ... } })처럼 보일 때는 설치된 SDK 버전과 문서 버전이 다른지 먼저 확인하십시오. 이 글의 예제는 2026년 8월 22일 기준 공식 Client SDK 문서의 형식에 맞췄습니다.

reasoning과 reasoning_details를 정확히 이해하기

reasoning을 활성화했다고 해서 모든 모델이 완전한 내부 사고 과정을 그대로 공개하는 것은 아닙니다.

추론 토큰은 일반적으로 출력 토큰 사용량에 포함됩니다. 유료 모델에서는 비용에 영향을 줄 수 있습니다.

따라서 사용자 화면에는 최종 답변을 기본으로 보여 주고, reasoning 데이터는 디버깅이나 고급 에이전트 구현에 필요한 경우에만 다루는 편이 안전합니다. 자세한 형식은 OpenRouter Reasoning Tokens 문서를 참고하십시오.

대화를 이어 갈 때

도구 호출을 포함한 고급 다중 턴 대화에서 모델이 reasoning_details를 반환했다면 다음 요청에 순서와 내용을 바꾸지 않고 그대로 포함해야 추론 문맥을 보존할 수 있습니다. 내용을 편집하거나 일부만 골라 넣으면 안 됩니다.

일반적인 단일 질문·답변 프로그램에서는 처음부터 이 기능을 구현할 필요가 없습니다.

세 가지 API 엔드포인트는 언제 쓰나

OpenRouter가 여러 호환 형식을 제공하더라도 한 요청에서 형식을 섞으면 안 됩니다.

엔드포인트형식초보자 권장 용도
POST /api/v1/chat/completionsOpenAI Chat Completions 호환이 튜토리얼처럼 일반 채팅을 만들 때
POST /api/v1/responsesOpenAI Responses API 호환이미 Responses API 기반 앱을 옮길 때
POST /api/v1/messagesAnthropic Messages API 호환이미 Anthropic 형식으로 만든 앱을 옮길 때

처음 시작한다면 https://openrouter.ai/api/v1/chat/completions 하나만 익히면 충분합니다.

선택 사항: 앱 이름을 OpenRouter에 표시하기

다음 헤더는 인증에 필수는 아닙니다.

OpenAI Python SDK에서 사용하려면 클라이언트를 다음처럼 만들 수 있습니다.

client = OpenAI(
    base_url="https://openrouter.ai/api/v1",
    api_key=api_key,
    default_headers={
        "HTTP-Referer": "https://example.com",
        "X-OpenRouter-Title": "My Ox Alpha App",
    },
)

개인 연습이라면 두 헤더를 생략해도 됩니다.

자주 발생하는 오류와 해결법

오류뜻해결 방법
400 Bad Request요청 JSON이나 매개변수가 잘못됨쉼표·따옴표·모델명·messages 구조를 확인합니다.
401 UnauthorizedAPI 키가 없거나 잘못됨.env 파일명과 키를 확인하고 유출된 키는 재발급합니다.
402 Payment Required크레딧이나 계정 사용 조건 문제OpenRouter 크레딧·계정 상태·모델의 현재 가격을 확인합니다.
404 Not Found모델명 또는 엔드포인트를 찾지 못함stealth/ox-alpha의 현재 제공 여부와 철자를 확인합니다.
429 Too Many Requests요청 한도 초과잠시 기다린 뒤 재시도하고 Retry-After 헤더가 있으면 따릅니다.
502·503·529상위 모델 제공자 장애 또는 과부하잠시 뒤 재시도하거나 다른 모델을 임시 사용합니다.

OpenRouter의 현재 오류 코드 설명은 Errors and Debugging 문서에서 확인할 수 있습니다.

.env를 찾지 못할 때

다음을 확인하십시오.

현재 폴더를 확인하는 명령은 다음과 같습니다.

pwd

Windows PowerShell에서는 다음 명령도 사용할 수 있습니다.

Get-Location

PowerShell에서 가상환경이 활성화되지 않을 때

가장 쉬운 우회 방법은 명령 프롬프트에서 다음을 실행하는 것입니다.

.venv\Scripts\activate.bat

가상환경을 활성화하지 않고도 해당 가상환경의 Python을 직접 지정할 수 있습니다.

.\.venv\Scripts\python.exe ox_alpha.py

운영에 사용하기 전 체크리스트

핵심 매개변수 빠른 설명

이름역할초보자 권장 시작값
model사용할 모델 IDstealth/ox-alpha
messages시스템·사용자·AI의 대화 내용사용자 메시지 1개부터 시작
max_tokens답변 생성량의 상한짧은 답변 500~800
temperature답변의 다양성먼저 기본값 사용
stream답변을 조각별로 받을지 결정처음에는 False, UI에서는 True
reasoning지원 모델의 추론 동작 제어{"enabled": true}
tools모델이 호출할 함수 정의기초 호출 성공 후 학습
response_formatJSON 등 출력 형식 지정구조화 출력이 필요할 때 사용

temperature, top_p, top_k를 동시에 과도하게 조정하면 결과를 이해하기 어려워집니다. 처음에는 기본값으로 시작하고 하나씩 바꾸는 것이 좋습니다.

다음 단계

첫 요청이 성공했다면 다음 순서로 확장해 보십시오.

  1. input()으로 사용자의 질문을 받는 터미널 챗봇 만들기
  2. 대화 내용을 messages 배열에 누적해 다중 턴 대화 만들기
  3. response_format으로 JSON 출력 받기
  4. 함수 호출용 tools 추가하기
  5. Streamlit·Gradio·웹 앱에 연결하기
  6. 시간 초과, 재시도, 로깅, 사용량 제한 추가하기

가장 중요한 출발점은 단순합니다. 키를 안전하게 보관하고, 하나의 요청을 성공시킨 뒤, 기능을 하나씩 늘리십시오.

공식 자료