project-westside-ai-assistant updated 2026-03-30Vision
Nemo — an AI assistant that lives in GroupMe, enabling program admins (Marcus) to manage the Westside basketball program through natural language. Backed by Anthropic Haiku 4.5 with tool_use against basketball-api. Read-only V1, with a graduation path to write access based on interaction log analysis. Child project of Westside Basketball.
User Stories
| Key | Story Note | Role | Success Metric |
|---|---|---|---|
| read-ops | story-westside-ai-assistant-read-ops | Admin | Marcus can query player/team/payment data via GroupMe and get accurate answers |
| write-ops | story-westside-ai-assistant-write-ops | Admin | Marcus can update player info and manage teams via GroupMe with confirmation (future — not V1) |
| safety | story-westside-ai-assistant-safety | Admin | V1 is read-only. Write ops excluded. Bot locked to approved group. |
Future stories: Coach-level assistant with scoped permissions (spike #22).
Architecture
- Domain Model — GroupMe message → Nemo AI engine → basketball-api tool call → response
- Data Flow — GroupMe callback POST → Anthropic Haiku tool_use → cluster-internal HTTP → GroupMe bot post
- Deployment — FastAPI pod in k8s, Tailscale funnel, Keycloak service account (westside-ai-bot, admin role)
Key decisions:
- GroupMe bot callback (not polling) — real-time conversational response
- Anthropic Haiku 4.5 (cheapest model, ~$0.25/M input) — Ollama/qwen2.5:7b as zero-cost fallback (provider switch ticket #16)
- Cluster-internal basketball-api calls — no external network hop
- Keycloak service account with admin role — client credentials flow
- Modular tool registry (ticket #18) — tools as directories, auto-discovered, enabled/disabled via frontmatter
- Read-only V1 — write tools exist in codebase but disabled. Graduation via interaction log analysis.
Board
Status
Deployed and responding. Pod running in k8s, Haiku responding to GroupMe messages. Keycloak auth to basketball-api being validated. Test GroupMe group: "Westside AI Assistant - Test" (ID: 114069292).
Achieved: M1 (bot responds to messages). M2 in validation (read queries against basketball-api).
In progress: Repo restructure (#18), read-only lockdown (#20), interaction logging (#19/#21).
Backlog: Provider switch (#16), coach-level expansion (spike #22), secrets backup (pal-e-platform #253).
Milestones
- M1 (achieved): Bot receives message in test group and responds conversationally
- M2 (validating): Bot answers a read query ("list all players") correctly via basketball-api
- M3 (future): Bot executes a confirmed write ("update height") end-to-end
- M4 (future): Coach-level assistant in team GroupMe groups with scoped permissions
Repos
| Repo | Platform | Role | Status |
|---|---|---|---|
| westside-ai-assistant | Forgejo | Nemo AI assistant FastAPI service | Deployed — 7 PRs merged, pod running, Haiku responding |
| basketball-api | Forgejo | Consumed API (not modified) | Production |
| pal-e-services | Forgejo | Infra: namespace, Harbor, ArgoCD, Keycloak client | Applied |
| pal-e-deployments | Forgejo | Kustomize overlay | Merged |
| pal-e-platform | Forgejo | NetworkPolicies (keycloak + ollama) | Applied |
Infrastructure
- Namespace: westside-ai-assistant
- Funnel: https://westside-ai-assistant.tail5b443a.ts.net
- Harbor: westside-ai-assistant/api
- Keycloak client: westside-ai-bot (confidential, service account, admin role)
- GroupMe bot: "Westside Assistant" (bot_id: 96060d69c3efb7a4aca500cc7d, group: 114069292)
- Model: claude-haiku-4-5-20251001 (configurable via ANTHROPIC_MODEL env var)
- Ollama fallback: qwen2.5:7b pulled and ready in cluster Ollama pod