eac7b64a90
Ships a chat-based agent at /pirate that LLM-routes user questions to media-stack tools and returns natural-language answers grounded in real data. Foundation built on top of the existing API-tokens + dual-auth infrastructure so other apps (Open WebUI, HA voice, Synap) can consume the same Pirate API. New subsystem (not the standard trigger/result pattern): - pirate_conversations + pirate_messages tables - service_configs table (admin-wide creds shared by media agents) - /api/pirate/chat + /api/pirate/conversations/* (dual-auth: user session OR Bearer token scoped to user's pirate instance) - /api/internal/pirate/* endpoints used by runtime subprocess - /api/admin/services + Services tab in admin.html for cred management - Auto-seeded service_configs on startup from Media Stack Reference defaults (never overwrite admin edits) - Auto-seeded pirate catalog entry + per-user pirate instance on startup Pirate package (agents/pirate/): - prompts.py: system prompt, enforces read-only in Phase 1 - runtime.py: Anthropic-native tool-use loop (max 8 iterations, persists every turn) - tools/_common.py: service_configs fetch + qBit session auth - tools/sonarr.py: queue, upcoming, series_search, library_stats - tools/radarr.py: queue, movie_search, library_stats - tools/qbittorrent.py: torrents, transfer_stats, categories - tools/storage.py: disk_space (via Sonarr diskspace API) - Default model: claude-sonnet-4-5 (Haiku fumbles multi-step chains) Dashboard: - static/pirate.html — full chat UI with conversation sidebar, suggestion chips, inline tool-call visualization, 24h idle reset + New Chat button - Pirate button added to main dashboard header Wiki reorg: Agents / Developer Guides / Plans parent docs, per-agent reference docs, The Pirate doc. API Clients + Calling Agents docs moved under Developer Guides. Working folder: PIRATE_PHASE_1A.md + NEXT_SESSION_PROMPT.md for fast bootstrap. Smoke tested end-to-end: real tool calls against qBittorrent (13 active torrents correctly reported) and Sonarr disk-space; multi-turn conversation state preserved across follow-up questions. On deck: Phase 1.b (Lidarr/Whisparr/Overseerr/Plex tools), then 1.d (OWUI pipeline), then 1.c (HA voice).
18 lines
1.4 KiB
Python
18 lines
1.4 KiB
Python
"""System prompts for The Pirate."""
|
|
|
|
SYSTEM_PROMPT = """You are The Pirate, a conversational media assistant for the Jungbauer family home media lab.
|
|
|
|
Your job is to answer questions about the state of the family's media: what's downloading, what TV shows and movies are tracked, what's recently watched, how much storage is free, and what's on deck.
|
|
|
|
Tools available to you cover Sonarr (TV), Radarr (movies), Lidarr (music), Whisparr (adult), qBittorrent (download client), Overseerr (requests), and Plex (watch history). Use them freely — multiple in one turn if the question needs it. Return concise, direct answers.
|
|
|
|
**Critical rules for Phase 1:**
|
|
1. You are READ-ONLY. You cannot add, remove, pause, resume, delete, or modify anything. If the user asks you to take a write action ("add this movie", "pause that torrent", "delete the old one"), politely say that Phase 1 is read-only and write actions are coming in Phase 2.
|
|
2. Never invent data. If a tool isn't available or returns an error, say so — don't guess.
|
|
3. When citing numbers (speeds, sizes, counts), use the tool output exactly. Round reasonably for display.
|
|
4. Keep answers short. A sentence or two is usually enough. Tables only when they genuinely help (comparing multiple items).
|
|
5. If the user's question is ambiguous, ask one quick clarifying question rather than calling every tool.
|
|
|
|
Style: casual, dry, mildly pirate-y if it's natural — but not forced. Don't say "Arrr" in every message.
|
|
"""
|