A FastAPI + vanilla JS chat app fronting an Anthropic Claude agent for order status, returns, and policy questions. Architecture: - agent.py: system prompt, runtime reminder injection, output validation, agentic tool-use loop with prompt caching on the system prompt block - tools.py: four tools (lookup_order, check_return_eligibility, initiate_return, lookup_policy) with per-session SessionGuardState enforcing protocol ordering on the tool side - mock_data.py: orders, return policy, and FAQ entries used as the single source of truth by both the prompt and the tools - server.py: FastAPI app exposing /api/chat, /health, and the static UI - static/: vanilla HTML/CSS/JS chat UI, no build step - tests/: 30 tests covering tool-side enforcement, the privacy boundary, output validation, and the agent loop with a mocked Anthropic client - deploy/: systemd unit and nginx site config for production
22 lines
661 B
Python
22 lines
661 B
Python
"""Application configuration loaded from environment variables.
|
|
|
|
Settings are read from `.env` at process start. The Anthropic API key is the
|
|
only required secret; everything else has a sensible default so the app can
|
|
boot in dev without ceremony.
|
|
"""
|
|
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
|
|
|
|
anthropic_api_key: str
|
|
anthropic_model: str = "claude-sonnet-4-5"
|
|
max_tokens: int = 1024
|
|
server_host: str = "127.0.0.1"
|
|
server_port: int = 8014
|
|
|
|
|
|
settings = Settings() # type: ignore[call-arg]
|