Commands Reference
Fresh 🌱Quick reference for common code patterns and commands.
Installation
bash
# Install fastapi-poe
pip install fastapi-poe
# Or with requirements.txt
pip install -r requirements.txtBasic Imports
python
import fastapi_poe as fp
import osAPI Key Setup
python
# From environment variable (recommended)
api_key = os.getenv("POE_API_KEY")
# Direct assignment (not recommended for production)
api_key = "your_api_key_here"Synchronous Query
python
message = fp.ProtocolMessage(role="user", content="Hello")
for partial in fp.get_bot_response_sync(
messages=[message],
bot_name="GPT-5",
api_key=api_key
):
print(partial, end="", flush=True)Asynchronous Query
python
import asyncio
async def query():
message = fp.ProtocolMessage(role="user", content="Hello")
async for partial in fp.get_bot_response(
messages=[message],
bot_name="GPT-5",
api_key=api_key
):
print(partial, end="", flush=True)
asyncio.run(query())Upload and Send File
python
# Synchronous
with open("document.pdf", "rb") as f:
attachment = fp.upload_file_sync(f, api_key=api_key)
message = fp.ProtocolMessage(
role="user",
content="Analyze this",
attachments=[attachment]
)
# Asynchronous
async def upload_and_query():
with open("document.pdf", "rb") as f:
attachment = await fp.upload_file(f, api_key=api_key)
message = fp.ProtocolMessage(
role="user",
content="Analyze this",
attachments=[attachment]
)Custom Parameters
python
# Claude with thinking budget
message = fp.ProtocolMessage(
role="user",
content="Explain quantum computing",
parameters={"thinking_budget": 12288}
)
# GPT with reasoning effort
message = fp.ProtocolMessage(
role="user",
content="Solve this problem",
parameters={"reasoning_effort": "high"}
)
# Image generation with aspect ratio
message = fp.ProtocolMessage(
role="user",
content="A cat in a hat",
parameters={"aspect_ratio": "4:3"}
)Conversation History
python
messages = [
fp.ProtocolMessage(role="user", content="Hello"),
fp.ProtocolMessage(role="assistant", content="Hi there!"),
fp.ProtocolMessage(role="user", content="What's the weather?")
]
for partial in fp.get_bot_response_sync(
messages=messages,
bot_name="GPT-5",
api_key=api_key
):
print(partial, end="", flush=True)OpenAI-Compatible API
python
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("POE_API_KEY"),
base_url="https://api.poe.com/v1",
)
response = client.chat.completions.create(
model="Claude-Opus-4.1",
messages=[{"role": "user", "content": "Hello"}],
)
print(response.choices[0].message.content)With Leaderboard Headers
python
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("POE_API_KEY"),
base_url="https://api.poe.com/v1",
)
response = client.chat.completions.create(
extra_headers={
"HTTP-Referer": "https://my-app.com",
"X-Title": "My App",
},
model="Claude-Opus-4.1",
messages=[{"role": "user", "content": "Hello"}],
)Error Handling
python
try:
for partial in fp.get_bot_response_sync(
messages=[message],
bot_name="GPT-5",
api_key=api_key
):
print(partial, end="", flush=True)
except Exception as e:
if "rate limit" in str(e).lower():
print("Rate limit exceeded. Wait 60 seconds.")
elif "insufficient" in str(e).lower():
print("Insufficient points in account.")
else:
print(f"Error: {e}")Rate Limiting Helper
python
import time
from collections import deque
class RateLimiter:
def __init__(self, max_requests=500, window=60):
self.max_requests = max_requests
self.window = window
self.requests = deque()
async def wait_if_needed(self):
now = time.time()
while self.requests and self.requests[0] < now - self.window:
self.requests.popleft()
if len(self.requests) >= self.max_requests:
sleep_time = self.window - (now - self.requests[0])
if sleep_time > 0:
await asyncio.sleep(sleep_time)
self.requests.append(time.time())Query Multiple Bots
python
import asyncio
async def query_all(bots, question, api_key):
tasks = []
for bot in bots:
message = fp.ProtocolMessage(role="user", content=question)
task = fp.get_bot_response(
messages=[message],
bot_name=bot,
api_key=api_key
)
tasks.append(task)
results = await asyncio.gather(*tasks)
return resultsComplete Client Class
python
import fastapi_poe as fp
import os
from typing import Optional, List
class PoeClient:
def __init__(self, api_key: Optional[str] = None):
self.api_key = api_key or os.getenv("POE_API_KEY")
def query_sync(
self,
message: str,
bot_name: str = "GPT-5",
parameters: Optional[dict] = None
) -> str:
msg = fp.ProtocolMessage(
role="user",
content=message,
parameters=parameters or {}
)
response = ""
for partial in fp.get_bot_response_sync(
messages=[msg],
bot_name=bot_name,
api_key=self.api_key
):
response += partial
return response
async def query(
self,
message: str,
bot_name: str = "GPT-5",
parameters: Optional[dict] = None
) -> str:
msg = fp.ProtocolMessage(
role="user",
content=message,
parameters=parameters or {}
)
response = ""
async for partial in fp.get_bot_response(
messages=[msg],
bot_name=bot_name,
api_key=self.api_key
):
response += partial
return responseEnvironment Variables
bash
# .env file
POE_API_KEY=your_api_key_here
# Load in Python
from dotenv import load_dotenv
load_dotenv()Common Patterns
Pattern: Streaming Response
python
response = ""
for partial in fp.get_bot_response_sync(...):
response += partial
print(partial, end="", flush=True)Pattern: Collect Full Response
python
response = ""
async for partial in fp.get_bot_response(...):
response += partial
# Use full responsePattern: With Retry
python
import time
def query_with_retry(message, bot_name, api_key, max_retries=3):
for attempt in range(max_retries):
try:
for partial in fp.get_bot_response_sync(
messages=[message],
bot_name=bot_name,
api_key=api_key
):
print(partial, end="", flush=True)
break
except Exception as e:
if attempt < max_retries - 1:
time.sleep(2 ** attempt) # Exponential backoff
else:
raiseNext: Troubleshooting