Script-Time: KI für Neujahresgrüße

Script-Time: KI für Neujahresgrüße
Photo by Mohammad Rahmani / Unsplash

Es gibt ja immer Leute, mit denen man gerne den Kontakt aufrecht erhalten möchte, aber irgendwie findet man zu selten zusammen.

Vorstufe

Früher habe ich jedes Jahr eine Textkonserve an alle Bekannte verschickt. Diese musste ich aber, bevor das Jahr zuende ging, immer wieder neu verfassen. Schließlich sollte ja nicht immer der gleiche Gruß im Messenger erscheinen.

KI soll helfen

Nachdem ich bereits einiges in Zusammenhang mit Signal und KI gebastelt habe, wird auch dies wieder ein interessantes Projekt.

Script-Time: Signal-Chat-Bot Teil 2
Stabiler Signal-Bot mit Auswahl der Gesprächspartner und variabler Aufgabe

Ich habe daher eine Liste meiner Bekannten in ein Shellscript auf meinem Server hinterlegt. Zunächst die Telefonnummer, dann der Nickname und für mich in Klammern ein Hinweis, wer bei gleichen Vornamen wirklich gemeint ist.

Mit einem brauchbaren Prompt werden dann für jeden individuelle Chatnachrichten erstellt: Erstelle freundliche, aufheiternde Neujahresgrüße in maximal 100 Zeichen an $name für das Jahr $(date +%Y). Biete keine Alternativformulierungen oder sonstige Zusätze und stelle keine Gemeinsamkeiten oder Verpflichtungen her.

Auf keinen Fall darf die KI Verpflichtungen ankündigen, wie "Lass uns nächste Woche mal einen trinken gehen...". Bei alten Kollegen, die inzwischen in Canada arbeiten, wäre dies schnell endtarnt. Ich käme bestimmt nicht schnell auf ein Bier vorbei 🤣.

Die daraus entstandene Nachricht wird schließlich per Signal an den entsprechenden Kontakt geschickt.

Das Script

Und so sieht es nun aus:

#!/bin/bash

AI_MODEL=vanilj/Phi-4:latest # Mein bestes reasoning-model
AI_THREADS=16                # Das muss reichen :-)


# Liste der Kontakte mit Telefonnummern und Namen, die später für die Neujahresgrüße verwendet werden
echo "+4915123456789 Max (Max Imilian)  
+4915901234567 Anna (Anna Lyse)  
+4915201122334 Tom (Tom Ate)  
+4915112233445 Paul (Paul Ahner)  
+4915239876543 Peter (Peter Silie)
+34612345678 Mia (Mia Miga)  
+4915932109876 Max (Max Imilian)  
+4916012345678 Hei (Hei Zung)
+4915223344556 Theo (The Odor)
+4916185577442 Doc (Dr. Akula)
+4915123456790 Alex (Alexander Platz)
+4915209988776 Andreas (Andreas Kreuz)
+4915114455667 Harry (Harry Bo)
+4915231122337 Ann (Ann Geber)
+4915938765432 Heide (Heide Witzka)
+4916012348765 Ann (Ann Zug)
+4916189977553 Anna (Anna Bolika)
+4915236677884 Ann (Anna Nass)
+4915236534382 Anti (Anti Pasti)" |

while read contact
do

# Extract phone number and name from the contact list
NUMMER=$( echo $contact | cut -f 1 -d " " )
NAME=$( echo $contact | sed 's/^[^ ]* //;s/ (.*//' )

PROMPT="

Schreibe eine Neujahres-Nachricht für das Jahr $(date +%Y) an ${NAME}.

Diese Nachricht hat folgende Eigenschaften:
  - Sie besteht aus maximal 60 Zeichen.
  - Sie ist auf deutsch geschrieben.
  - Sie enthält den Namen und das Jahr.
  - Sie ist in Ich-Form und in familiären, persönlichen, aufheiternden, lockeren Ton geschrieben.
  - Die Anrede ist entweder 'Hi' oder 'Goude'
  - Sie enthält exakt zwei der folgenden Wünsche:
    - wertvolle Momente
    - Ruhe
    - schöne Erlebnisse
    - die nötige Gesundheit
  - Sie erwähnt nicht den Absender.
  - Sie stellt keine Gemeinsamkeiten zwischen dem Absender und ${NAME} her.
  - Sie enthält keine Formulierungen, wie 'möge', 'hoffentlich', 'bleib wie du bist' oder sonstige vergleichbare Formulierungen.

Erstelle nur diese Nachricht und keine weiteren Erkärungen dazu.
"

# Berechne die Länge des PROMPT
PROMPT_LENGTH=$(echo -n "$PROMPT" | wc -w)

# Berechne den context_window-Wert (Annahme: 3 Token pro Wort)
CONTEXT_WINDOW=$((PROMPT_LENGTH * 3))


JSON_BODY=$(jq -n \
  --arg num_threads "${AI_THREADS}" \
  --arg num_ctx "${CONTEXT_WINDOW}" \
  --arg model "${AI_MODEL}" \
  --arg prompt "$PROMPT" \
  '{
    num_ctx: $num_ctx,
    model: $model,
    prompt: $prompt,
    stream: false
  }')

curl http://ai:11434/api/generate -d "$JSON_BODY" 2>/dev/null |
jq -r .response |
sed '/^$/d' # | signal-cli -u +491597654321 send --message-from-stdin $number

done

Ein Testlauf, ohne die Nachricht zu verschicken, liefert folgende Zeilen:

Hi Max, alles Gute für 2025! Ich wünsche dir viele wertvolle Momente und die nötige Gesundheit. 🎉💫
Hi Anna! Frohes 2025 mit wertvollen Momenten & der nötigen Gesundheit. 🎉❤
Hi Tom! Schöne Erlebnisse & wertvolle Momente für 2025! 🎉✨
Goude Paul! Im 2025 wünsch ich dir viele wertvolle Momente und die nötige Gesundheit. Prost! 🥂
Hi Peter! Wünsche dir 2025 wertvolle Momente und die nötige Gesundheit. Alles Gute! 🎉🍾
Hi Mia! Alles Gute für 2025 mit wertvollen Momenten und der nötigen Gesundheit. 🎉🍀✨
Hi Max! Auf wertvolle Momente & die nötige Gesundheit im 2025. 🎉🌟 Alles Liebe!
Hi Hei! Für 2025 wünsche ich dir viele schöne Erlebnisse, die nötige Gesundheit und jede Menge Spaß! 🎉🥳✨
Goude Theo! 2025 wünsch ich dir wertvolle Momente & die nötige Gesundheit. Frohes Neues! 🎉🌟
Hi Doc, 2025 bringt wertvolle Momente & schöne Erlebnisse! 🎉 Bleib gesund! 😊
Goude Alex, wünsch dir 2025 wertvolle Momente & die nötige Gesundheit! 🎉🍀
Hi Andreas! Alles Gute für 2025 mit wertvollen Momenten & der nötigen Gesundheit! 🎉🌟
Goude Harry! Ich wünsch dir 2025 viel Ruhe & wertvolle Momente. 🎉🌟
Hi Ann! Frohes Neues 2025. Möge es ruhig und voller wertvoller Momente sein! 🎉🌟
Goude Heide! 2025 bringe dir wertvolle Momente & die nötige Gesundheit. 🎉💖 Frohes Neues! 🥳
Goude Ann! 2025 bringt wertvolle Momente & schöne Erlebnisse. Frohes Neues! 🎉🌟
Hi Anna, wertvolle Momente und Gesundheit für 2025! 🎉🌟
Hi Ann, 2025 bringt dir wertvolle Momente & Gesundheit! 🎉💫
Hi Anti, frohes Neues 2025! Gesundheit & wertvolle Momente für dich. 😊🎉
...

Wenn vielleicht eine Gruppe alter Freunde irgendwo zusammen feiert, und sie bekommen alle eine Nachricht von mir, hält diese einem möglichen Vergleich stand und wirkt individuell verfasst.

Und wenn man es noch liebevoller und herzlicher haben möchte, kann man den Prompt entsprechend anpassen. Hier geht es mir aber vorrangig um frühere Kollegen.

Autostart

Um 0:00 am 1.1. jedes Jahres soll das Script automatisch gestartet werden. Das geht am einfachsten per Cronjob:

0    0   1   1   *  root  nice -n 19 /opt/check_newyeargreetings > /dev/null 2>&1

Fazit

Persönlich ist anders. Das sehe ich auch so.

Natürlich wäre es schöner, wenn ich die Nachricht wirklich selbst schicken würde. Aber ich bin kein Party-Typ. Ich genieße lieber ein Glas Wein in Ruhe. Vielleicht sind ein paar gleichgesinnte zu Besuch. Aber auch dann möchte ich nicht das Telefon zücken und über 60 Leuten einen Gruß schicken.

So kann ich entspannt auf das neue Jahr anstoßen.

Prost.