mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 19:41:09 +02:00
fix(brain): companion can now actually list tasks instead of hallucinating
Two fixes for the chat where the user asked "show my tasks" and the LLM responded with "I don't have direct access to a dynamic task list": 1. New list_tasks tool with title/dueDate/priority for each task, filterable by open/completed/overdue/today/all (default: open). The message field returns a markdown bullet list so the LLM can pass it through directly. 2. System prompt rewritten to explicitly tell the LLM: - WHEN to call which tool (concrete examples for common questions) - "Erfinde keine Daten" — don't make up info, call a tool - Tool format must be JUST the JSON block, no preamble Common questions now have explicit mappings: - "Welche Tasks?" → list_tasks - "Wie viel Wasser?" → get_drink_progress - "Welche Termine heute?" → get_todays_events Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
daa5aaf0a1
commit
77d455a18d
2 changed files with 74 additions and 7 deletions
|
|
@ -88,26 +88,34 @@ Du hast Zugriff auf die Daten und Aktionen des Nutzers ueber verschiedene Module
|
|||
|
||||
${context}
|
||||
|
||||
## Verfuegbare Aktionen
|
||||
## Verfuegbare Tools
|
||||
|
||||
${toolList}
|
||||
|
||||
## Tool-Aufruf Format
|
||||
## Tool-Aufruf Format — WICHTIG
|
||||
|
||||
Wenn du eine Aktion ausfuehren willst, antworte mit einem JSON-Block:
|
||||
**Du MUSST Tools nutzen wenn der Nutzer Daten sehen oder etwas tun will.**
|
||||
|
||||
Wenn der Nutzer fragt:
|
||||
- "Welche Tasks habe ich?" → \`list_tasks\` aufrufen
|
||||
- "Wie viel Wasser?" → \`get_drink_progress\` aufrufen
|
||||
- "Erstell mir einen Task X" → \`create_task\` aufrufen
|
||||
- "Log 200ml Wasser" → \`log_drink\` aufrufen
|
||||
- "Welche Termine heute?" → \`get_todays_events\` aufrufen
|
||||
|
||||
Tool-Aufruf in genau diesem Format (NUR JSON, keine Erklaerung davor):
|
||||
\`\`\`tool
|
||||
{"name": "tool_name", "params": {"key": "value"}}
|
||||
\`\`\`
|
||||
|
||||
Du kannst pro Antwort EINEN Tool-Aufruf machen. Nach dem Ergebnis kannst du weiter antworten.
|
||||
Wenn du keine Aktion ausfuehren willst, antworte einfach mit Text.
|
||||
Nach dem Tool-Ergebnis bekommst du die Daten zurueck und kannst dem Nutzer antworten.
|
||||
|
||||
## Verhalten
|
||||
|
||||
- Antworte auf Deutsch
|
||||
- Sei kurz und hilfreich
|
||||
- Nutze die Kontext-Daten um relevante Vorschlaege zu machen
|
||||
- Wenn der Nutzer etwas loggen will, nutze das passende Tool
|
||||
- **Erfinde keine Daten** — wenn du Listen oder Werte brauchst, RUFE EIN TOOL AUF
|
||||
- Wenn der Nutzer etwas loggen oder erstellen will, nutze das passende Tool
|
||||
- Ermutige den Nutzer bei Fortschritt und Streaks`;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -70,4 +70,63 @@ export const todoTools: ModuleTool[] = [
|
|||
};
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'list_tasks',
|
||||
module: 'todo',
|
||||
description:
|
||||
'Listet Tasks mit Titel, Faelligkeit und Prioritaet auf. Nutze diese, wenn der Nutzer fragt welche Tasks er hat oder eine Liste sehen will.',
|
||||
parameters: [
|
||||
{
|
||||
name: 'filter',
|
||||
type: 'string',
|
||||
description: 'Welche Tasks zeigen',
|
||||
required: false,
|
||||
enum: ['open', 'completed', 'overdue', 'today', 'all'],
|
||||
},
|
||||
{
|
||||
name: 'limit',
|
||||
type: 'number',
|
||||
description: 'Maximale Anzahl (default: 20)',
|
||||
required: false,
|
||||
},
|
||||
],
|
||||
async execute(params) {
|
||||
const all = await taskTable.toArray();
|
||||
const active = all.filter((t) => !t.deletedAt);
|
||||
const decrypted = await decryptRecords<LocalTask>('tasks', active);
|
||||
const tasks = decrypted.map(toTask);
|
||||
|
||||
const filter = (params.filter as string) ?? 'open';
|
||||
const today = new Date().toISOString().split('T')[0];
|
||||
let filtered = tasks;
|
||||
if (filter === 'open') filtered = tasks.filter((t) => !t.isCompleted);
|
||||
else if (filter === 'completed') filtered = tasks.filter((t) => t.isCompleted);
|
||||
else if (filter === 'overdue')
|
||||
filtered = tasks.filter(
|
||||
(t) => !t.isCompleted && t.dueDate != null && (t.dueDate as string) < today
|
||||
);
|
||||
else if (filter === 'today')
|
||||
filtered = tasks.filter((t) => !t.isCompleted && (t.dueDate as string) === today);
|
||||
|
||||
const limit = (params.limit as number) ?? 20;
|
||||
const list = filtered.slice(0, limit).map((t) => ({
|
||||
id: t.id,
|
||||
title: t.title,
|
||||
dueDate: t.dueDate,
|
||||
priority: t.priority,
|
||||
isCompleted: t.isCompleted,
|
||||
}));
|
||||
|
||||
return {
|
||||
success: true,
|
||||
data: list,
|
||||
message:
|
||||
list.length === 0
|
||||
? `Keine ${filter} Tasks`
|
||||
: list
|
||||
.map((t) => `• ${t.title}${t.dueDate ? ` (faellig ${t.dueDate})` : ''}`)
|
||||
.join('\n'),
|
||||
};
|
||||
},
|
||||
},
|
||||
];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue