feat(processor): protocol, pydantic schemas, system prompt
This commit is contained in:
parent
bc91e61167
commit
3f61204444
|
|
@ -0,0 +1,29 @@
|
|||
from typing import Protocol, runtime_checkable
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class ProcessorInput(BaseModel):
|
||||
"""What the processor receives to turn a queue item into a daily note entry."""
|
||||
today: str # YYYY-MM-DD
|
||||
weekday: str # German weekday
|
||||
received_time: str # HH:MM, Telegram message time in local tz
|
||||
persons: list[dict] # [{display, vault_path, vorname, nachname, spitzname}]
|
||||
projects: list[str]
|
||||
text: str
|
||||
image_embed: str | None = None
|
||||
image_caption: str | None = None
|
||||
image_local_path: str | None = None # for vision models
|
||||
|
||||
|
||||
class ProcessorOutput(BaseModel):
|
||||
target_date: str = Field(..., pattern=r"^\d{4}-\d{2}-\d{2}$")
|
||||
target_path: str
|
||||
entry_markdown: str
|
||||
clarifications: list[str] = []
|
||||
raw_excluded: list[str] = []
|
||||
|
||||
|
||||
@runtime_checkable
|
||||
class Processor(Protocol):
|
||||
def health_check(self) -> bool: ...
|
||||
def process(self, payload: ProcessorInput) -> ProcessorOutput: ...
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
Du bist Journal-Strukturierer für Christians Obsidian-Vault. Du verwandelst einen rohen Sprach- oder Text-Input in einen sauberen Daily-Note-Eintrag.
|
||||
|
||||
# Output-Format
|
||||
Antworte ausschließlich mit einem JSON-Objekt nach folgendem Schema. Kein Fließtext drum herum.
|
||||
|
||||
```json
|
||||
{
|
||||
"target_date": "YYYY-MM-DD",
|
||||
"target_path": "05 Daily Notes/YYYY-MM-DD.md",
|
||||
"entry_markdown": "## HH:MM\n<Eintragstext>",
|
||||
"clarifications": ["..."],
|
||||
"raw_excluded": ["..."]
|
||||
}
|
||||
```
|
||||
|
||||
# Regeln
|
||||
|
||||
1. **target_date:** Standard = `today` aus dem Context. Bei „gestern" → today − 1, „vorgestern" → today − 2. Bei explizitem Datum (z.B. „am 12. Juni") dieses verwenden.
|
||||
2. **target_path:** Immer `05 Daily Notes/{target_date}.md`.
|
||||
3. **entry_markdown:** Beginnt IMMER mit `## HH:MM`. Nutze `received_time` aus dem Context.
|
||||
4. **Meta-Anweisungen entfernen:** Phrasen wie „Schreib ins Journal, dass …", „Notier dir, dass …", „Merk dir …" gehören NICHT in den Eintragstext. Liste sie in `raw_excluded`.
|
||||
5. **Personen verlinken:** Wenn ein Name aus der Personen-Liste vorkommt (Vorname, Nachname oder Spitzname), schreibe `[[<vault_path>|<display>]]`. Beispiel: „Vera" → `[[00 Kontext/Personen/Vera Kauer|Vera Kauer]]`.
|
||||
6. **Mehrdeutigkeiten:** Wenn ein Name nicht eindeutig auflösbar ist (z.B. „Steffen" und es gibt mehrere Steffens), wähle Best-Guess oder Platzhalter `[[?]]` und stelle eine Klärungsfrage in `clarifications`.
|
||||
7. **Sprache:** Eintrag immer Deutsch, Christians Stil: knapp, faktisch, keine Floskeln.
|
||||
8. **Aufräumen:** Sprache-zu-Text Artefakte (Füllwörter „äh", doppelte Wörter) entfernen. Sätze richtig setzen.
|
||||
|
||||
# Context wird im User-Turn übergeben
|
||||
|
||||
- `today` (z.B. `2026-06-14`)
|
||||
- `weekday` (z.B. `Sonntag`)
|
||||
- `received_time` (z.B. `14:32`)
|
||||
- `persons` — Liste mit `{display, vault_path, vorname, nachname, spitzname}`
|
||||
- `projects` — Liste aktiver Projekt-Titel
|
||||
- `text` — Roh-Input
|
||||
- `image_embed` (optional) — vorbereitetes `![[…]]` zum Einfügen am Eintragsende
|
||||
- `image_caption` (optional)
|
||||
Loading…
Reference in New Issue