HOST
Python
1 つのクライアント。Flask、Django、FastAPI はルート wrapper。start_host_session が origin、token、expires_in、appearance を返す。
Python
1 つのクライアント。Flask、Django、FastAPI はルート wrapper。start_host_session が origin、token、expires_in、appearance を返す。
sveda-python-sdk、start_host_session、Flask、Django、FastAPI または stdlib で POST /sveda/session。
AGENT PROMPT
Paste into Cursor
Copy this into Cursor, Claude Code, or any coding agent. It installs Sveda against this stack using public packages.
Install Sveda into this Python project.
Read:
- https://sveda.dev/docs/hosts/python
- https://sveda.dev/docs/client
- https://sveda.dev/docs/deploy
- https://sveda.dev/llms.txt
Follow the numbered steps on the Python page. If unsure which frontend this repo uses, ask the user. 1. Run sveda-server
CORS origin is the Flask / Django / FastAPI URL (8012–8014 in the playground).
# ghcr.io/neresson/sveda-server:latest
# curl -fsSL https://raw.githubusercontent.com/neresson/sveda/main/deploy/compose.yaml -o compose.yaml && curl -fsSL https://raw.githubusercontent.com/neresson/sveda/main/deploy/compose.env -o .env && # Edit .env: a model key, SVEDA_EMBED_HOST_API_KEY, SVEDA_CORS_ORIGINS && && docker compose up -d && curl -s http://127.0.0.1:8787/sveda/ready
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: sveda
POSTGRES_PASSWORD: sveda
POSTGRES_DB: sveda
healthcheck:
test: ["CMD-SHELL", "pg_isready -U sveda -d sveda"]
interval: 5s
timeout: 3s
retries: 10
volumes:
- sveda-postgres:/var/lib/postgresql/data
redis:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 10
sveda-server:
image: ghcr.io/neresson/sveda-server:latest
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
ports:
- "8787:8787"
environment:
SVEDA_BIND: 0.0.0.0:8787
SVEDA_EMBED_ENABLED: "true"
SVEDA_DATABASE_URL: postgres://sveda:sveda@postgres:5432/sveda
SVEDA_REDIS_URL: redis://redis:6379
SVEDA_APP_KEY: ${SVEDA_APP_KEY:-dev-app-key-change-me}
SVEDA_ADMIN_API_KEY: ${SVEDA_ADMIN_API_KEY:-dev-admin-key-change-me}
SVEDA_EMBED_HOST_API_KEY: ${SVEDA_EMBED_HOST_API_KEY:-dev-host-key-change-me}
SVEDA_CORS_ORIGINS: ${SVEDA_CORS_ORIGINS:-*}
DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}
volumes:
sveda-postgres:# ghcr.io/neresson/sveda-server:latest
# curl -fsSL https://raw.githubusercontent.com/neresson/sveda/main/deploy/compose.yaml -o compose.yaml && curl -fsSL https://raw.githubusercontent.com/neresson/sveda/main/deploy/compose.env -o .env && # Edit .env: a model key, SVEDA_EMBED_HOST_API_KEY, SVEDA_CORS_ORIGINS && && docker compose up -d && curl -s http://127.0.0.1:8787/sveda/ready
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: sveda
POSTGRES_PASSWORD: sveda
POSTGRES_DB: sveda
healthcheck:
test: ["CMD-SHELL", "pg_isready -U sveda -d sveda"]
interval: 5s
timeout: 3s
retries: 10
volumes:
- sveda-postgres:/var/lib/postgresql/data
redis:
image: redis:7-alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 10
sveda-server:
image: ghcr.io/neresson/sveda-server:latest
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
ports:
- "8787:8787"
environment:
SVEDA_BIND: 0.0.0.0:8787
SVEDA_EMBED_ENABLED: "true"
SVEDA_DATABASE_URL: postgres://sveda:sveda@postgres:5432/sveda
SVEDA_REDIS_URL: redis://redis:6379
SVEDA_APP_KEY: ${SVEDA_APP_KEY:-dev-app-key-change-me}
SVEDA_ADMIN_API_KEY: ${SVEDA_ADMIN_API_KEY:-dev-admin-key-change-me}
SVEDA_EMBED_HOST_API_KEY: ${SVEDA_EMBED_HOST_API_KEY:-dev-host-key-change-me}
SVEDA_CORS_ORIGINS: ${SVEDA_CORS_ORIGINS:-*}
DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}
volumes:
sveda-postgres: 2. Install the Python SDK
Package name
sveda-python-sdk
(import sveda, httpx). Until it is on PyPI, install from the checkout next to your app.
pip install sveda-python-sdkpip install sveda-python-sdk
3. Env
SVEDA_CLIENT_BASE_URL=http://127.0.0.1:8787
SVEDA_CLIENT_HOST_API_KEY=replace-meSVEDA_CLIENT_BASE_URL=http://127.0.0.1:8787 SVEDA_CLIENT_HOST_API_KEY=replace-me
4. Mint helper
start_host_session
is the whole host contract. Frameworks only wrap it in a POST route.
Without Flask/Django/FastAPI, call it from any WSGI/ASGI handler.
Map the authenticated user to a named
policy
on mint when you need capability limits —
embed policies.
import os
from sveda import start_host_session
payload = start_host_session(
os.environ["SVEDA_CLIENT_BASE_URL"],
os.environ["SVEDA_CLIENT_HOST_API_KEY"],
"python-host",
)
# origin, token, expires_in, appearanceimport os
from sveda import start_host_session
payload = start_host_session(
os.environ["SVEDA_CLIENT_BASE_URL"],
os.environ["SVEDA_CLIENT_HOST_API_KEY"],
"python-host",
)
# origin, token, expires_in, appearance 5. Flask
Inject
sveda_origin
in a context processor. Hide chat buttons when it is empty.
@app.post("/sveda/session")
def sveda_session():
origin = os.environ.get("SVEDA_CLIENT_BASE_URL", "").rstrip("/")
key = os.environ.get("SVEDA_CLIENT_HOST_API_KEY", "")
if not origin or not key:
return jsonify({"message": "Set SVEDA_CLIENT_BASE_URL and SVEDA_CLIENT_HOST_API_KEY"}), 503
return jsonify(start_host_session(origin, key, "flask-playground"))@app.post("/sveda/session")
def sveda_session():
origin = os.environ.get("SVEDA_CLIENT_BASE_URL", "").rstrip("/")
key = os.environ.get("SVEDA_CLIENT_HOST_API_KEY", "")
if not origin or not key:
return jsonify({"message": "Set SVEDA_CLIENT_BASE_URL and SVEDA_CLIENT_HOST_API_KEY"}), 503
return jsonify(start_host_session(origin, key, "flask-playground")) 6. Django
Mark the session view
csrf_exempt
unless the layout already ships a CSRF meta tag (the host script will send
X-CSRF-TOKEN
when present).
# urls.py
path("sveda/session", views.sveda_session),
# views.py
@csrf_exempt
def sveda_session(request):
if request.method != "POST":
return HttpResponseNotAllowed(["POST"])
origin = os.environ.get("SVEDA_CLIENT_BASE_URL", "").rstrip("/")
key = os.environ.get("SVEDA_CLIENT_HOST_API_KEY", "")
if not origin or not key:
return JsonResponse(
{"message": "Set SVEDA_CLIENT_BASE_URL and SVEDA_CLIENT_HOST_API_KEY"},
status=503,
)
return JsonResponse(start_host_session(origin, key, "django-playground"))# urls.py
path("sveda/session", views.sveda_session),
# views.py
@csrf_exempt
def sveda_session(request):
if request.method != "POST":
return HttpResponseNotAllowed(["POST"])
origin = os.environ.get("SVEDA_CLIENT_BASE_URL", "").rstrip("/")
key = os.environ.get("SVEDA_CLIENT_HOST_API_KEY", "")
if not origin or not key:
return JsonResponse(
{"message": "Set SVEDA_CLIENT_BASE_URL and SVEDA_CLIENT_HOST_API_KEY"},
status=503,
)
return JsonResponse(start_host_session(origin, key, "django-playground")) 7. FastAPI
Jinja context processor can pass
sveda_origin
the same way Flask does.
@app.post("/sveda/session")
def sveda_session():
origin = os.environ.get("SVEDA_CLIENT_BASE_URL", "").rstrip("/")
key = os.environ.get("SVEDA_CLIENT_HOST_API_KEY", "")
if not origin or not key:
return JSONResponse(
{"message": "Set SVEDA_CLIENT_BASE_URL and SVEDA_CLIENT_HOST_API_KEY"},
status_code=503,
)
return JSONResponse(start_host_session(origin, key, "fastapi-playground"))@app.post("/sveda/session")
def sveda_session():
origin = os.environ.get("SVEDA_CLIENT_BASE_URL", "").rstrip("/")
key = os.environ.get("SVEDA_CLIENT_HOST_API_KEY", "")
if not origin or not key:
return JSONResponse(
{"message": "Set SVEDA_CLIENT_BASE_URL and SVEDA_CLIENT_HOST_API_KEY"},
status_code=503,
)
return JSONResponse(start_host_session(origin, key, "fastapi-playground")) 8. Page markup
Same buttons and module script on every Python host.
<html
lang="en"
data-sveda-origin="http://127.0.0.1:8787"
data-sveda-session="/sveda/session"
>
<body>
<button type="button" data-sveda-open="js">Open JS chat</button>
<button type="button" data-sveda-open="iframe">Open iframe chat</button>
<script type="module" src="/sveda-host.js"></script>
</body>
</html><html
lang="en"
data-sveda-origin="http://127.0.0.1:8787"
data-sveda-session="/sveda/session"
>
<body>
<button type="button" data-sveda-open="js">Open JS chat</button>
<button type="button" data-sveda-open="iframe">Open iframe chat</button>
<script type="module" src="/sveda-host.js"></script>
</body>
</html>