스트리밍 채팅 CLI 빠른 시작
목표
전체 응답을 기다리지 않고, Kiln의 응답을 토큰 단위로 실시간 출력하는 터미널 채팅 클라이언트를 만듭니다.
결과물
실행 가능한 Python 스크립트 chat.py입니다. 대화 기록을 유지하고, 입력한 줄을 새 user 턴으로 보내며, 생성되는 assistant 응답을 터미널에 실시간으로 출력합니다.
에이전트에게 붙여넣을 프롬프트
prompt
Write a Python CLI named chat.py that: reads KILN_API_KEY (required) and KILN_BASE_URL (optional, default "https://api.bricksum.com/v1") from the environment, creates an OpenAI client pointed at that base URL, keeps a `messages` list, and loops reading a line from stdin. Each line becomes a user message. Call client.chat.completions.create with model="qwen3-32b", stream=True and max_tokens=800, print chunk.choices[0].delta.content as each chunk arrives, then append the full reply as an assistant message only if it is non-empty. Exit the loop when the input is "exit".준비물
- Python 3.10 이상과 openai 패키지(pip install openai). 이 페이지를 검증한 openai 버전은 3.10 이상이 필요합니다. 3.9에서는 pip가 이전 메이저 버전을 조용히 설치합니다.
- 콘솔 → API 키에서 발급한 Kiln API 키를 KILN_API_KEY로 export.
1. SDK 설치
공식 OpenAI Python 클라이언트가 이 스트리밍 CLI의 유일한 의존성입니다.
bash
pip install openai2. chat.py 작성
아래 스크립트를 저장하세요. 입력을 한 줄씩 읽어 user 턴으로 보내고, 전체 응답을 기다리지 않고 각 delta를 스트리밍으로 출력합니다.
python
import os
from openai import OpenAI
client = OpenAI(
base_url=os.environ.get("KILN_BASE_URL", "https://api.bricksum.com/v1"),
api_key=os.environ["KILN_API_KEY"], # sk-bk-...
)
messages = []
print("Streaming chat CLI. Type 'exit' to quit.")
while True:
user_input = input("> ")
if user_input.strip().lower() == "exit":
break
messages.append({"role": "user", "content": user_input})
stream = client.chat.completions.create(
model="qwen3-32b",
messages=messages,
stream=True,
max_tokens=800,
)
reply = ""
for chunk in stream:
delta = chunk.choices[0].delta.content or ""
print(delta, end="", flush=True)
reply += delta
print()
if reply:
messages.append({"role": "assistant", "content": reply})3. 실행
키를 export한 뒤 스크립트를 실행하세요. 메시지를 입력하고 Enter를 누르면 응답이 실시간으로 출력됩니다. 종료하려면 exit을 입력하세요.
bash
export KILN_API_KEY="sk-bk-..."
python chat.pyexpected output
Streaming chat CLI. Type 'exit' to quit.
> Say hello in five words.
Hello there, nice meeting you!
> exit결과 확인
메시지를 보내고 응답이 한 번에 나타나지 않고 단어 단위로 출력되는지 확인하세요. 이어서 후속 메시지(예: "한 줄로 요약해줘")를 보내 응답이 첫 턴을 참조하는지 확인하세요. messages 목록이 대화 기록을 유지하고 있다는 증거입니다. 응답이 빈 줄로 나오면 모델이 텍스트를 쓰기 전에 reasoning으로 max_tokens 예산을 모두 쓴 것입니다(finish_reason "length"). chat.py의 max_tokens를 800보다 크게(예: 1600) 올린 뒤 다시 물어보세요.
다음 단계
- 스트리밍 — SSE 이벤트 형식, keepalive 주석, 마지막 청크에 cost가 더해지는 방식
- 툴 호출, 처음부터 끝까지 — 같은 클라이언트에 대화 중 호출할 수 있는 툴을 추가하기
참고
이 페이지의 스니펫은 2026-09-21에 openai 3.16.2 (Python 3.14.7) 환경에서 Kiln API로 직접 실행해 확인했습니다. 확인하지 않은 부분: 자동 스니펫 점검 도구는 이 대화형 스크립트에 입력을 넣을 수 없어, 위와 같은 인터프리터·SDK 버전으로 gpt-oss-120b에서 직접 실행해 확인했습니다. 스크립트는 이제 qwen3-32b을 사용하며, 이 모델로는 아직 실행하지 않았습니다.