The Pirate — Phase 1.a: conversational read-only media agent
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).
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
"""Pirate tools — read-only functions the LLM can call.
|
||||
|
||||
Each tool module exports a TOOLS list of dicts shaped for Anthropic tool use:
|
||||
{"name": str, "description": str, "input_schema": {...}, "read_only": True, "fn": callable}
|
||||
|
||||
The runtime loads all modules here and builds a combined catalog. The LLM picks
|
||||
which tool to call; the runtime executes it and returns the result as a tool message.
|
||||
"""
|
||||
|
||||
from . import sonarr, radarr, qbittorrent, storage
|
||||
|
||||
|
||||
def build_catalog():
|
||||
"""Return a list of all available tools across all modules."""
|
||||
catalog = []
|
||||
for mod in (sonarr, radarr, qbittorrent, storage):
|
||||
catalog.extend(getattr(mod, "TOOLS", []))
|
||||
return catalog
|
||||
|
||||
|
||||
def find_tool(name):
|
||||
for t in build_catalog():
|
||||
if t["name"] == name:
|
||||
return t
|
||||
return None
|
||||
Reference in New Issue
Block a user