# 스트리밍 채팅 CLI 빠른 시작 > Kiln의 응답을 토큰 단위로 실시간 출력하는 터미널 채팅 클라이언트를 만듭니다. Source: https://kiln.bricksum.com/docs/ko/cookbook/streaming-chat-cli ## 목표 전체 응답을 기다리지 않고, Kiln의 응답을 토큰 단위로 실시간 출력하는 터미널 채팅 클라이언트를 만듭니다. ## 결과물 실행 가능한 Python 스크립트 chat.py입니다. 대화 기록을 유지하고, 입력한 줄을 새 user 턴으로 보내며, 생성되는 assistant 응답을 터미널에 실시간으로 출력합니다. ## 에이전트에게 붙여넣을 프롬프트 **prompt** ```text 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의 유일한 의존성입니다. **pip** ```bash pip install openai ``` ## 2. chat.py 작성 아래 스크립트를 저장하세요. 입력을 한 줄씩 읽어 user 턴으로 보내고, 전체 응답을 기다리지 않고 각 delta를 스트리밍으로 출력합니다. **chat.py** ```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.py ``` **expected output** ```text 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) 올린 뒤 다시 물어보세요. ## 다음 단계 - [스트리밍](https://kiln.bricksum.com/docs/ko/streaming) — SSE 이벤트 형식, keepalive 주석, 마지막 청크에 cost가 더해지는 방식 - [툴 호출, 처음부터 끝까지](https://kiln.bricksum.com/docs/ko/cookbook/tool-calling) — 같은 클라이언트에 대화 중 호출할 수 있는 툴을 추가하기 참고 이 페이지의 스니펫은 2026-09-21에 openai 3.16.2 (Python 3.14.7) 환경에서 Kiln API로 직접 실행해 확인했습니다. 확인하지 않은 부분: 자동 스니펫 점검 도구는 이 대화형 스크립트에 입력을 넣을 수 없어, 위와 같은 인터프리터·SDK 버전으로 gpt-oss-120b에서 직접 실행해 확인했습니다. 스크립트는 이제 qwen3-32b을 사용하며, 이 모델로는 아직 실행하지 않았습니다.