feat(agent): add llm assistant chat with api tools (task 88)

OpenAI-compatible client with mock fallback, tool-calling loop, and /assistant UI.

Tools map to /api/v1/ endpoints per ADR 0006 direct-tools decision.
This commit is contained in:
ginnoir
2026-07-04 19:46:09 -05:00
parent 04ae809e07
commit 4a924a4107
19 changed files with 956 additions and 6 deletions
+139
View File
@@ -0,0 +1,139 @@
import type { AgentToolDefinition } from "@/lib/llm";
export const AGENT_TOOLS: AgentToolDefinition[] = [
{
type: "function",
function: {
name: "list_lists",
description: "List household lists. Optionally filter by type such as shopping or tasks.",
parameters: {
type: "object",
properties: {
type: { type: "string", description: "List type filter, e.g. shopping or tasks" },
},
},
},
},
{
type: "function",
function: {
name: "list_list_items",
description: "List items on a specific list by list id.",
parameters: {
type: "object",
properties: {
listId: { type: "string", description: "UUID of the list" },
},
required: ["listId"],
},
},
},
{
type: "function",
function: {
name: "add_list_item",
description:
"Add an item to a list. Provide listId, or listType (e.g. shopping) to use the first matching list.",
parameters: {
type: "object",
properties: {
listId: { type: "string", description: "UUID of the list" },
listType: { type: "string", description: "List type when listId is unknown" },
text: { type: "string", description: "Item text" },
qty: { type: "string", description: "Optional quantity" },
},
required: ["text"],
},
},
},
{
type: "function",
function: {
name: "list_calendars",
description: "List calendars visible to the household.",
parameters: { type: "object", properties: {} },
},
},
{
type: "function",
function: {
name: "list_events",
description: "List calendar events in a date range (ISO 8601 from/to).",
parameters: {
type: "object",
properties: {
from: { type: "string", description: "Range start (ISO 8601)" },
to: { type: "string", description: "Range end (ISO 8601)" },
calendarIds: {
type: "string",
description: 'Comma-separated calendar UUIDs, or "all"',
},
},
required: ["from", "to"],
},
},
},
{
type: "function",
function: {
name: "create_event",
description: "Create a calendar event.",
parameters: {
type: "object",
properties: {
calendarId: { type: "string" },
title: { type: "string" },
startAt: { type: "string", description: "ISO 8601 start" },
endAt: { type: "string", description: "ISO 8601 end" },
allDay: { type: "boolean" },
location: { type: "string" },
notes: { type: "string" },
},
required: ["calendarId", "title", "startAt", "endAt"],
},
},
},
{
type: "function",
function: {
name: "list_notes",
description: "List household notes.",
parameters: { type: "object", properties: {} },
},
},
{
type: "function",
function: {
name: "create_note",
description: "Create a note with title and optional body.",
parameters: {
type: "object",
properties: {
title: { type: "string" },
body: { type: "string" },
pinned: { type: "boolean" },
},
required: ["title"],
},
},
},
{
type: "function",
function: {
name: "list_journal_entries",
description: "List the current user's journal entries (most recent first).",
parameters: {
type: "object",
properties: {
limit: { type: "number", description: "Max entries to return (default 20)" },
},
},
},
},
];
export const AGENT_SYSTEM_PROMPT = `You are the famapp household assistant. Help Matt and his wife manage calendar events, shopping and task lists, notes, and personal journal entries.
Use the provided tools to read and update data. Prefer calling tools instead of guessing. Be concise and friendly.
When adding shopping items, resolve the shopping list id via list_lists if needed. Use ISO 8601 datetimes for calendar tools.`;