chatbit-api / test_streaming.py
Seounghyup's picture
Add streaming API endpoint for Android app
9026aea
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
ChatBIA Streaming API ν…ŒμŠ€νŠΈ ν΄λΌμ΄μ–ΈνŠΈ
"""
import requests
import json
import sys
import io
if sys.platform == 'win32':
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
def test_streaming_chat(base_url: str, message: str, mode: str = "bsl"):
"""
슀트리밍 μ±„νŒ… ν…ŒμŠ€νŠΈ
Args:
base_url: API μ„œλ²„ URL (예: http://localhost:8000)
message: μ‚¬μš©μž λ©”μ‹œμ§€
mode: "bsl" λ˜λŠ” "general"
"""
url = f"{base_url}/chat/stream"
payload = {
"message": message,
"mode": mode,
"max_tokens": 512,
"temperature": 0.7
}
print(f"πŸ”„ μš”μ²­ 전솑: {message}")
print(f"πŸ“‘ λͺ¨λ“œ: {mode}")
print("=" * 60)
try:
# 슀트리밍 μš”μ²­
response = requests.post(
url,
json=payload,
stream=True, # μ€‘μš”: 슀트리밍 ν™œμ„±ν™”
headers={
"Content-Type": "application/json",
"Accept": "text/event-stream"
},
timeout=120 # 2λΆ„ νƒ€μž„μ•„μ›ƒ (μΆ©λΆ„νžˆ κΈ΄ μ‹œκ°„)
)
if response.status_code != 200:
print(f"❌ 였λ₯˜: {response.status_code}")
print(response.text)
return
print("βœ… 응닡 μˆ˜μ‹  쀑...\n")
full_text = ""
token_count = 0
# SSE 슀트림 읽기
for line in response.iter_lines():
if line:
line_str = line.decode('utf-8')
# SSE ν˜•μ‹: "data: {json}"
if line_str.startswith("data: "):
data_str = line_str[6:] # "data: " 제거
try:
data = json.loads(data_str)
# μ—λŸ¬ 체크
if "error" in data:
print(f"\n❌ μ„œλ²„ 였λ₯˜: {data['error']}")
break
# 토큰 좜λ ₯
if not data.get("done", False):
token = data.get("token", "")
print(token, end="", flush=True)
full_text += token
token_count = data.get("token_count", token_count)
else:
# μ™„λ£Œ
print(f"\n\nβœ… μ™„λ£Œ!")
print(f"πŸ“Š 토큰 수: {data.get('token_count', token_count)}")
print(f"🎯 λͺ¨λ“œ: {data.get('mode', mode)}")
break
except json.JSONDecodeError as e:
print(f"\n⚠️ JSON νŒŒμ‹± 였λ₯˜: {e}")
print(f" 원본: {data_str}")
print("\n" + "=" * 60)
print(f"전체 응닡 길이: {len(full_text)} κΈ€μž")
except requests.exceptions.Timeout:
print("❌ νƒ€μž„μ•„μ›ƒ 였λ₯˜: μ„œλ²„ 응닡이 λ„ˆλ¬΄ λŠλ¦½λ‹ˆλ‹€.")
except requests.exceptions.ConnectionError:
print("❌ μ—°κ²° 였λ₯˜: μ„œλ²„μ— μ—°κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€.")
except Exception as e:
print(f"❌ μ˜ˆμƒμΉ˜ λͺ»ν•œ 였λ₯˜: {e}")
def test_regular_chat(base_url: str, message: str, mode: str = "bsl"):
"""
일반 (λΉ„μŠ€νŠΈλ¦¬λ°) μ±„νŒ… ν…ŒμŠ€νŠΈ
"""
url = f"{base_url}/chat"
payload = {
"message": message,
"mode": mode,
"max_tokens": 512,
"temperature": 0.7
}
print(f"πŸ”„ 일반 μš”μ²­ 전솑: {message}")
print(f"πŸ“‘ λͺ¨λ“œ: {mode}")
print("=" * 60)
try:
response = requests.post(url, json=payload, timeout=60)
if response.status_code == 200:
result = response.json()
print("βœ… 응닡:\n")
print(result["response"])
print(f"\nπŸ“Š 토큰 수: {result['tokens']}")
else:
print(f"❌ 였λ₯˜: {response.status_code}")
print(response.text)
except Exception as e:
print(f"❌ 였λ₯˜: {e}")
if __name__ == "__main__":
# 둜컬 ν…ŒμŠ€νŠΈ
BASE_URL = "http://localhost:8000"
# Hugging Face Spaces ν…ŒμŠ€νŠΈ (배포 ν›„)
# BASE_URL = "https://your-username-chatbia-server.hf.space"
print("=" * 60)
print("ChatBIA Streaming API ν…ŒμŠ€νŠΈ")
print("=" * 60)
# ν…ŒμŠ€νŠΈ 1: 슀트리밍 μ±„νŒ… (BSL λͺ¨λ“œ)
print("\n[ν…ŒμŠ€νŠΈ 1] 슀트리밍 μ±„νŒ… - BSL λͺ¨λ“œ\n")
test_streaming_chat(
BASE_URL,
"5μ²œλ§Œμ› μ„€λΉ„μ˜ 감가상각 κ³„μ‚°ν•΄μ€˜. λ‚΄μš©μ—°μˆ˜λŠ” 10년이고 μž”μ‘΄κ°€μΉ˜λŠ” 10%μ•Ό.",
mode="bsl"
)
print("\n" + "=" * 60 + "\n")
# ν…ŒμŠ€νŠΈ 2: 슀트리밍 μ±„νŒ… (일반 λͺ¨λ“œ)
print("\n[ν…ŒμŠ€νŠΈ 2] 슀트리밍 μ±„νŒ… - 일반 λͺ¨λ“œ\n")
test_streaming_chat(
BASE_URL,
"νšŒκ³„μ—μ„œ 감가상각이 뭐야?",
mode="general"
)
print("\n" + "=" * 60 + "\n")
# ν…ŒμŠ€νŠΈ 3: 일반 μ±„νŒ… (λΉ„μŠ€νŠΈλ¦¬λ°) - λΉ„κ΅μš©
print("\n[ν…ŒμŠ€νŠΈ 3] 일반 μ±„νŒ… (λΉ„μŠ€νŠΈλ¦¬λ°) - λΉ„κ΅μš©\n")
test_regular_chat(
BASE_URL,
"μ•ˆλ…•ν•˜μ„Έμš”!",
mode="bsl"
)