Poe Server Bots를 사용하면 개발자는 Server-Sent Events (SSE) 기반의 표준화된 HTTP 프로토콜을 사용하여 외부 컴퓨팅 인프라, 사용자 지정 머신 러닝 모델 및 독점 로직을 Quora의 Poe 플랫폼에 직접 연결할 수 있습니다. 사용자 지정 시스템 프롬프트가 있는 Poe의 호스팅된 상용 모델에 의존하는 표준 프롬프트 봇과 달리, 서버 봇은 엔지니어링 팀에게 백엔드 추론 엔진, 비공개 가중치(private weights), 검색 증강 생성(RAG) 파이프라인 및 외부 API 통합에 대한 완전한 제어권을 제공합니다. 경량 fastapi_poe Python 라이브러리로 사용자 지정 모델을 래핑하고 공개적으로 접근할 수 있는 엔드포인트에 서비스를 배포함으로써 개발자는 독점적인 AI 도구를 웹, iOS, Android 및 데스크톱 앱을 통해 Poe의 글로벌 사용자 기반에 즉시 배포할 수 있습니다.
아키텍처 및 Poe Server Bot 프로토콜
Poe와 사용자 지정 백엔드 간의 통신은 HTTPS를 통한 비동기 클라이언트-서버 모델을 따릅니다. 사용자가 Poe의 서버 봇에 메시지를 보내면 Poe 인프라는 메시지 컨텍스트를 지정된 서버 엔드포인트로 HTTP POST 요청으로 전달합니다. 서버는 들어오는 페이로드를 처리하고 Server-Sent Events (SSE)를 사용하여 생성된 응답을 Poe로 스트리밍합니다. 이 아키텍처는 짧은 지연 시간을 보장하고 최종 사용자에게 실시간 토큰 스트리밍을 제공합니다.
프로토콜 사양은 몇 가지 이벤트 및 요청 유형을 표준화합니다:
QueryRequest: 스레드의 과거 메시지(query), 고유한 대화 식별자(conversation_id), 사용자 식별자(user_id), 메시지 메타데이터 및 클라이언트 기능을 포함한 전체 대화 컨텍스트를 포함합니다.PartialResponse: 서버에서 방출되는 원자적(atomic) 스트리밍 청크입니다. 각 부분 응답은 증분 텍스트, 데이터 페이로드 또는 상태 업데이트를 클라이언트에 제공합니다.SettingsRequest/SettingsResponse: 서버가 도입 인사말, 파일 첨부 권한, 제안된 답장 및 봇 간 쿼리에 대한 종속성 선언과 같은 봇 수준 구성을 Poe와 협상할 수 있도록 합니다.ReportFeedbackRequest및ReportErrorRequest: 사용자가 메시지를 평가하거나 클라이언트 측 전송 오류가 발생할 때 Poe에서 서버로 원격 분석 및 피드백 콜백을 제공합니다.
요청을 인증하고 승인되지 않은 트래픽으로부터 백엔드를 보호하기 위해 Poe는 Access Key를 발급합니다. 서버는 수신되는 모든 요청과 함께 전송되는 Authorization: Bearer <access_key> 헤더에 대해 이 키를 검증합니다.
| Component | Role in Server Bot Workflow | Key Configuration / Method |
|---|---|---|
fastapi_poe | FastAPI 및 Starlette 위에 Poe 프로토콜을 구현하는 Python SDK | fp.make_app(), fp.run() |
PoeBot | 봇 동작 및 이벤트 핸들러를 정의하는 기본 클래스 | get_response(), get_settings() |
| Poe Gateway | 사용자 입력을 릴레이하고 엔드포인트의 응답성을 확인합니다. | https://poe.com/create_bot?server=1 |
| Inference Server | 모델 가중치 호스팅 (예: vLLM, TGI, Ollama 또는 사용자 지정 PyTorch) | 비동기 스트리밍 생성기 |
| Access Key | Poe에서 들어오는 HTTP POST 호출을 인증합니다. | make_app()에 전달되는 시크릿 토큰 |
개발 환경 설정하기
공식 fastapi_poe 라이브러리는 규정을 준수하는 서버 봇을 구현하는 가장 빠른 경로를 제공합니다. HTTP 파싱, 이벤트 직렬화 및 인증을 확장 가능한 비동기 인터페이스로 추상화합니다.
먼저 Uvicorn과 같은 ASGI 서버와 함께 fastapi-poe를 설치합니다:
pip install fastapi-poe uvicorn
가장 단순한 형태의 서버 봇은 PoeBot을 서브클래싱하고 get_response 제너레이터를 구현합니다:
import fastapi_poe as fp
from typing import AsyncIterable
class EchoBot(fp.PoeBot):
async def get_response(
self, request: fp.QueryRequest
) -> AsyncIterable[fp.PartialResponse]:
last_message = request.query[-1].content
yield fp.PartialResponse(text=f"Received: {last_message}")
async def get_settings(
self, setting: fp.SettingsRequest
) -> fp.SettingsResponse:
return fp.SettingsResponse(
introduction_message="Welcome! This bot is running on a custom backend.",
allow_attachments=False
)
bot = EchoBot()
app = fp.make_app(bot, access_key="YOUR_SECRET_ACCESS_KEY")
if __name__ == "__main__":
fp.run(bot, access_key="YOUR_SECRET_ACCESS_KEY", port=8080)
로컬 프로토타이핑 중에 ngrok 또는 Cloudflare Tunnels와 같은 터널링 도구를 사용하여 로컬 포트(예: 8080)를 퍼블릭 인터넷에 노출할 수 있습니다:
ngrok http 8080
이렇게 하면 즉각적인 테스트를 위해 Poe의 봇 등록 인터페이스에 입력할 수 있는 임시 공개 HTTPS URL(예: https://abcdef123.ngrok-free.app)이 생성됩니다.
사용자 지정 모델 및 추론 파이프라인 배포
서버 봇을 사용자 지정 모델에 연결하려면 수신되는 QueryRequest 메시지를 추론 엔진에 연결하고 생성된 토큰을 PartialResponse 객체로 스트리밍 출력해야 합니다.
vLLM 또는 Hugging Face 추론 백엔드와 통합하기
전용 GPU 하드웨어에서 공개 가중치 모델(예: Llama 3, Mistral 또는 Qwen)을 실행할 때 vLLM 또는 Hugging Face Text Generation Inference (TGI)와 같이 최적화된 엔진을 통해 서비스하면 높은 처리량과 연속 배치 처리(continuous batching)가 제공됩니다.
다음 예제는 OpenAI 호환 vLLM 추론 서버에 요청을 전달하는 Poe 서버 봇을 보여줍니다:
import os
import fastapi_poe as fp
from openai import AsyncOpenAI
from typing import AsyncIterable
# Connect to local or remote vLLM endpoint
client = AsyncOpenAI(
base_url=os.environ.get("VLLM_BASE_URL", "http://localhost:8000/v1"),
api_key=os.environ.get("VLLM_API_KEY", "EMPTY"),
)
class CustomModelBot(fp.PoeBot):
async def get_response(
self, request: fp.QueryRequest
) -> AsyncIterable[fp.PartialResponse]:
# Convert Poe conversation history to chat messages
messages = []
for message in request.query:
role = "user" if message.role == "user" else "assistant"
messages.append({"role": role, "content": message.content})
try:
stream = await client.chat.completions.create(
model="meta-llama/Meta-Llama-3-8B-Instruct",
messages=messages,
stream=True,
temperature=0.7,
max_tokens=1024,
)
async for chunk in stream:
token = chunk.choices[0].delta.content
if token:
yield fp.PartialResponse(text=token)
except Exception as e:
yield fp.ErrorResponse(
text=f"An error occurred during inference: {str(e)}",
allow_retry=True
)
async def get_settings(
self, setting: fp.SettingsRequest
) -> fp.SettingsResponse:
return fp.SettingsResponse(
introduction_message="Powered by a custom open-source model running on dedicated infrastructure.",
enable_image_comprehension=False,
allow_attachments=False
)
bot = CustomModelBot()
app = fp.make_app(bot, access_key=os.environ.get("POE_ACCESS_KEY"))
다중 턴 컨텍스트 및 첨부 파일 처리
Poe는 request.query 배열에 전체 대화 기록을 연대순으로 전송합니다. 사용자 지정 모델에 제한된 컨텍스트 창이 있는 경우 서버 봇 로직은 토큰화 전에 이전 턴을 가지치기하거나 요약해야 합니다.
봇이 get_settings에서 allow_attachments=True를 활성화하면 파일 업로드(이미지, PDF, 텍스트 문서)가 request.query[-1].attachments에 나타납니다. 각 첨부 파일 개체에는 다운로드 URL과 MIME 유형이 포함되어 있어 백엔드에서 응답을 생성하기 전에 자산을 다운로드하거나, OCR을 수행하거나, 비전 인코딩을 실행하거나, 문서를 벡터 저장소에 임베드할 수 있습니다.
서버 봇 호스팅 옵션
Poe는 SSE 응답을 스트리밍할 수 있는 중단 없는 HTTPS 엔드포인트가 필요하므로 적절한 호스팅 플랫폼을 선택하는 것은 모델 크기, 컴퓨팅 요구 사항 및 예산에 따라 다릅니다.
Modal을 사용한 서버리스 GPU 배포
Modal은 Poe 서버 봇에 대한 일급 지원을 제공하여 개발자가 GPU 인프라를 코드로 정의하고 실제 실행 시간에 대해서만 비용을 지불할 수 있도록 합니다. Modal은 컨테이너 인스턴스를 0부터 자동으로 확장하고 HTTPS URL을 제공합니다.
프로덕션에 바로 사용할 수 있는 Modal 배포 스크립트:
import os
import modal
import fastapi_poe as fp
app = modal.App("poe-custom-model-bot")
# Define container environment with dependencies
image = (
modal.Image.debian_slim()
.pip_install("fastapi-poe", "openai")
)
@app.function(
image=image,
secrets=[modal.Secret.from_name("poe-custom-model-secrets")],
keep_warm=1, # Keeps one instance ready to prevent cold starts
)
@modal.asgi_app()
def fastapi_app():
from bot_implementation import CustomModelBot
bot = CustomModelBot()
return fp.make_app(bot, access_key=os.environ["POE_ACCESS_KEY"])
modal deploy app.py로 이 서비스를 배포하면 다음과 같은 영구적인 URL이 출력됩니다:
https://<organization>--poe-custom-model-bot-fastapi-app.modal.run.
클라우드 제공업체 (AWS, GCP, Render, Fly.io)의 컨테이너 호스팅
독점적인 추론 클러스터를 실행하거나 관리형 컨테이너 플랫폼을 활용하는 팀의 경우:
- 애플리케이션 도커화:
uvicorn app:app --host 0.0.0.0 --port 8080 --workers 4를 실행하는 경량 Dockerfile을 만듭니다. - 리버스 프록시 및 SSL: 수명이 긴 HTTP 연결과 청크 스트리밍 응답을 지원하는 수신 컨트롤러(예: AWS ALB, Cloudflare 또는 Nginx) 뒤에 배포합니다. 스트림 중간 연결 끊김을 방지하려면 프록시 시간 제한(예:
proxy_read_timeout)을 최소 300초로 설정해야 합니다. - 환경 시크릿: 컨테이너 환경 변수를 통해
POE_ACCESS_KEY및 추론 자격 증명을 안전하게 주입합니다.
Poe에서 봇 등록 및 구성하기
서버가 배포되고 공개 HTTPS를 통해 접근 가능하게 되면 Poe 플랫폼에서 등록을 완료합니다:
- poe.com/create_bot?server=1 로 이동합니다.
- 봇 핸들: 고유한 영숫자 식별자(예:
@MyCustomModel)를 선택합니다. 이것은 봇의 공개 링크를 형성합니다. - 봇 유형: "Server bot"이 선택되어 있는지 확인합니다.
- 서버 URL: 전체 공개 엔드포인트(예:
https://your-domain.com/또는 Modal 배포 URL)를 입력합니다. - 액세스 키 (Access Key): 서버의
fp.make_app()호출에 구성된 시크릿 토큰을 붙여넣습니다. Poe는 매 테스트 요청마다 이 토큰을 유효성 검사합니다. - 프로필 세부 정보: 사용자에게 표시되는 표시 이름, 설명, 아바타 및 시스템 지침을 설정합니다.
- 가시성: 봇을 비공개(본인 또는 지정된 팀원만 액세스 가능)로 유지할지 공개(Poe Explore 디렉토리에서 검색 가능)로 설정할지 선택합니다.
Create Bot을 클릭합니다. Poe는 엔드포인트에 SettingsRequest를 발행하여 즉시 연결성을 확인합니다. 서버가 유효한 응답을 반환하면 봇이 활성화됩니다.
수익화 및 컴퓨팅 포인트 경제학
Poe는 서버 봇에 대해 네이티브 크리에이터 수익화를 제공하여 사용자가 도구와 상호 작용할 때 개발자가 수익을 창출할 수 있도록 합니다.
메시지당 가격 및 봇 수익화 API
크리에이터는 봇 설정에서 메시지당 고정된 컴퓨팅 포인트 비용을 설정하거나 봇 수익화 API를 활용하여 사용량 기반의 동적 청구를 할 수 있습니다:
- 구독 수익 공유: 새 사용자가 봇과 상호 작용한 후 Poe를 구독하면 제휴 대금을 받습니다.
- 컴퓨팅 포인트 소비: 기존 Poe 구독자 또는 무료 사용자가 봇에 컴퓨팅 포인트를 사용하면 소비된 포인트에 비례하여 수익을 얻습니다.
- 가변 가격 지정: 모델이 예측할 수 없는 컴퓨팅 비용으로 작업(예: 고해상도 이미지 렌더링 또는 긴 컨텍스트 문서 분석)을 수행하는 경우
authorize_cost및capture_cost엔드포인트를 사용하여 가변 가격을 구성할 수 있습니다. 사용자는 고비용 작업이 실행되기 전에 명확한rate_card또는cost_label메시지를 받습니다.
# Setting dynamic rate cards in SettingsResponse
async def get_settings(self, setting: fp.SettingsRequest) -> fp.SettingsResponse:
return fp.SettingsResponse(
introduction_message="Professional analysis bot with dynamic compute points.",
cost_label="50-200 pts",
rate_card="* Base Query: 50 points\n* Extended Analysis: 150-200 points"
)
프로덕션 모범 사례
안정적인 서버 봇을 배포하려면 네트워크 변동성, 지연 시간 예산 및 운영 원격 분석을 해결해야 합니다:
- 즉각적인 스트리밍 구현: 사용자는 첫 번째 토큰이 빨리 나타날 때 지연 시간이 짧다고 인식합니다. 출력하기 전에 메모리에 전체 모델 생성 결과를 버퍼링하지 마십시오. 추론 백엔드에서 첫 번째 청크가 도착하는 즉시 토큰을 방출하기 시작합니다.
- 안전한 오류 복구 (Graceful Recovery): 모델 호출을 구조화된 예외 핸들러로 래핑합니다. 업스트림 GPU 작업자가 실패하면 명확한 설명과 함께
fp.ErrorResponse를 반환하고allow_retry=True를 설정하여 사용자가 앱을 다시 로드하지 않고 쿼리를 다시 트리거할 수 있도록 합니다. - 제안된 후속 조치: 응답이 끝날 때
fp.MetaResponse(suggested_replies=["Explain further", "Provide code sample"])를 통해 제안된 답장을 추가하여 참여도를 높이십시오. - 원격 분석 모니터링:
PoeBot클래스에on_feedback메서드를 구현하여 긍정적(좋아요) 및 부정적(싫어요) 평가를 Datadog, Prometheus 또는 Grafana와 같은 관측 가능성 플랫폼에 직접 기록합니다.