Skip to main content

Minimal FastAPI backend for streaming AI chat over SSE (token/done/error), compatible with ai-chat-kit

Project description

fastapi-ai-chat

Minimal FastAPI backend for streaming AI chat over Server‑Sent Events (SSE).

It’s designed to be wire‑compatible with ai-chat-kit’s React FastAPI adapter:

  • POST /chat/stream returns text/event-stream
  • emits SSE events: token, done, error

Features

  • Token streaming over SSE: incremental token events + final done event (or error).
  • Provider routing by model name:
    • OpenAI for most models (default: gpt-4.1)
    • Anthropic for models starting with claude
    • Gemini for models starting with gemini
  • Mock streaming fallback: deterministic mock stream when no provider keys are configured (great for UI/dev).
  • Conversation persistence (optional): SQLite chat history + basic conversation CRUD endpoints.
  • CORS enabled: defaults to * for local dev (configurable).

Install

From PyPI:

python -m pip install "fastapi-ai-chat[server]"

Quickstart (run the example server)

cd Backend/fastapi-ai-chat
python -m uvicorn examples.server:app --reload --port 8000

Configuration (environment variables)

This library intentionally does not load .env files for you; it reads process env vars (or you can pass keys directly to create_app(...)).

  • Provider keys
    • OPENAI_API_KEY or FASTAPI_AI_CHAT_OPENAI_API_KEY
    • ANTHROPIC_API_KEY or FASTAPI_AI_CHAT_ANTHROPIC_API_KEY
    • GEMINI_API_KEY or FASTAPI_AI_CHAT_GEMINI_API_KEY
  • Persistence
    • FASTAPI_AI_CHAT_SQLITE_PATH (default: ./chat_history.sqlite3)
  • Optional provider base URL overrides
    • OPENAI_BASE_URL / FASTAPI_AI_CHAT_OPENAI_BASE_URL
    • ANTHROPIC_BASE_URL / FASTAPI_AI_CHAT_ANTHROPIC_BASE_URL
    • GEMINI_BASE_URL / FASTAPI_AI_CHAT_GEMINI_BASE_URL

Example use

1) Stream tokens (curl)

curl -N -X POST "http://localhost:8000/chat/stream" \
  -H "Content-Type: application/json" \
  -d '{
    "userId":"u1",
    "messages":[{"role":"user","content":"Hello streaming"}]
  }'

2) Pick a real model/provider

Send params.model in the request body:

  • OpenAI: gpt-4.1 (default if omitted)
  • Anthropic: claude-3-5-sonnet (or any model starting with claude)
  • Gemini: gemini-1.5-pro (or any model starting with gemini)

Example:

curl -N -X POST "http://localhost:8000/chat/stream" \
  -H "Content-Type: application/json" \
  -d '{
    "userId":"u1",
    "messages":[{"role":"user","content":"Write a haiku about SSE."}],
    "params":{"model":"gpt-4.1"}
  }'

If you don’t configure provider keys, the backend falls back to a deterministic mock stream unless a real model was explicitly requested via params.model.

3) Embed in your own FastAPI app

from fastapi_ai_chat import create_app

app = create_app(
    openai_api_key="...",  # or None / "" to disable OpenAI
    anthropic_api_key="...",
    gemini_api_key="...",
    sqlite_path="./chat_history.sqlite3",
    cors_allow_origins=["http://localhost:5173"],
)

API

Streaming protocol (SSE)

The server emits frames separated by a blank line (\n\n):

  • event: token with JSON: {"type":"token","token":"..."} (many times)
  • event: done with JSON:
    • {"type":"done","message":{"role":"assistant","content":"..."}, "provider":"...", "usage":{...}, "conversationId":"..."}
  • event: error with JSON: {"type":"error","error":{"message":"..."}}

Endpoints

  • POST /chat/stream: stream assistant tokens (SSE)
  • GET /chat/history?userId=...: get message history for a user
  • POST /chat/clear: clear a user’s history
  • GET /chat/conversations?userId=...: list conversations (SQLite mode)
  • GET /chat/conversation?userId=...&conversationId=...: fetch one conversation (SQLite mode)
  • POST /chat/conversation/create: create/ensure a conversation (SQLite mode)
  • POST /chat/conversation/delete: delete a conversation (SQLite mode)

Publish to PyPI (maintainers)

Build:

python -m pip install -U build twine
python -m build Backend/fastapi-ai-chat

Upload:

  • Recommended: PyPI Trusted Publishing
  • Or token-based:
python -m twine upload Backend/fastapi-ai-chat/dist/*

Author

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastapi_ai_chat-1.0.2.tar.gz (14.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fastapi_ai_chat-1.0.2-py3-none-any.whl (14.4 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_ai_chat-1.0.2.tar.gz.

File metadata

  • Download URL: fastapi_ai_chat-1.0.2.tar.gz
  • Upload date:
  • Size: 14.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.14

File hashes

Hashes for fastapi_ai_chat-1.0.2.tar.gz
Algorithm Hash digest
SHA256 9e7b8824abbc8bbe16b707d398cae01464c465d90524da2cf0e0380df68b6d2e
MD5 beb7b0eb919b1a9e2ecda14c7d20437e
BLAKE2b-256 c9b9a741320e361026d05842246312abeb4aa8200464458ed410d073a91b4f15

See more details on using hashes here.

File details

Details for the file fastapi_ai_chat-1.0.2-py3-none-any.whl.

File metadata

File hashes

Hashes for fastapi_ai_chat-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 f9093d8a2710e8726672104d6ac80b8efe3d7e8c397da4926dbab8c83f17cb7f
MD5 5ee6fc6d5af12786b07acea30bae03dc
BLAKE2b-256 0461de6b95eece1857336bef1c93bfe5e7301e73eeb92576c6fb3c9249747f22

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page