Files
crumbmissions/crumbforest_roles/schnecki_zero.sh
Branko May Trinkwald 271008ea10 📊 Logs jetzt im Repo statt User-Verzeichnis!
**Änderung: Option A - logs/ im Repo**

Vorher:
- Logs in ~/.{character}_logs/ (User Home Directory)
- Multi-Projekt aber verstreut
- Nicht im Repo sichtbar

Nachher:
- Logs in logs/{character}/ (Repo Directory)
- Projekt-spezifisch & übersichtlich
- Mit Fallback: ${CRUMB_LOGS_DIR:-$HOME/.{character}_logs}
- Für Standalone-Nutzung

**Geänderte Files:**
- lib/waldwaechter.sh: CRUMB_LOGS_DIR exportiert
- Alle 17 crumbforest_roles/*: LOGDIR updated
- missions/robots/*: Mission logs → logs/missions/
- .gitignore: logs/ hinzugefügt

**Log-Struktur:**
```
logs/
├── tobi/
│   ├── tobi_history.json
│   ├── token_log.json
│   └── ...
├── crabbyrust/
├── mayaeule/
└── missions/
```

**Tested:**  Tobi funktioniert, Logs landen in logs/tobi/

🌲 "Was kostet die Frage eines Kindes?" - jetzt transparent im Repo!

🤖 Generated with Claude Code
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-21 16:25:10 +01:00

176 lines
5.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 🐌 Schnecki - Der geduldige Elektronik-Bastler
# Arbeitet mit CapaciTobi zusammen - langsam, präzise, mit Gefühl
# Load .env if exists
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENV_FILE="${SCRIPT_DIR}/../.env"
if [[ -f "${ENV_FILE}" ]]; then
# Export environment variables from .env
set -a
source "${ENV_FILE}"
set +a
fi
QUESTION="$*"
API_KEY="${OPENROUTER_API_KEY}"
MODEL="${OPENROUTER_MODEL:-openai/gpt-3.5-turbo}"
# Logs
LOGDIR="${CRUMB_LOGS_DIR:-$HOME/.schnecki_logs}/schnecki"
mkdir -p "$LOGDIR"
HISTORY_FILE="$LOGDIR/schnecki_history.json"
TMP_REQUEST="$LOGDIR/schnecki_request.json"
TMP_RESPONSE="$LOGDIR/schnecki_response.json"
LOG_FILE="$LOGDIR/token_log.json"
[ ! -f "$HISTORY_FILE" ] && echo "[]" > "$HISTORY_FILE"
[ ! -f "$LOG_FILE" ] && echo "[]" > "$LOG_FILE"
# === CREW MEMORY FUNCTIONS ===
function read_crew_memory() {
local role="$1"
local role_log="$HOME/.${role}_logs/${role}_history.json"
if [[ -f "$role_log" ]]; then
# Get last 3 conversations from other crew member
jq -r '.[-3:] | .[] | "[\(.role)]: \(.content)"' "$role_log" 2>/dev/null | head -n 3
fi
}
# === MAIN ===
echo "🐌 Schnecki kriecht langsam aber sicher heran..."
echo ""
if [ -z "$API_KEY" ]; then
echo "❗ Kein API-Key gefunden. Bitte setze OPENROUTER_API_KEY in .env"
exit 1
fi
if [ -z "$QUESTION" ]; then
echo "💡 Verwendung: $0 \"Deine Frage an Schnecki\""
exit 0
fi
echo "⚡ Frage: $QUESTION"
echo ""
# Check if question references other crew members
CREW_CONTEXT=""
if echo "$QUESTION" | grep -qi "tobi\|capacitobi\|schraubaer\|schnippsi"; then
echo "🧠 Schnecki prüft was die Crew gesagt hat..."
# Read relevant crew member logs
if echo "$QUESTION" | grep -qi "tobi\|capacitobi"; then
TOBI_CONTEXT=$(read_crew_memory "tobi")
if [[ -n "$TOBI_CONTEXT" ]]; then
CREW_CONTEXT="${CREW_CONTEXT}\n\nCapaciTobi hat kürzlich gesagt:\n${TOBI_CONTEXT}"
fi
fi
if echo "$QUESTION" | grep -qi "schraubaer"; then
SCHRAUBAER_CONTEXT=$(read_crew_memory "schraubaer")
if [[ -n "$SCHRAUBAER_CONTEXT" ]]; then
CREW_CONTEXT="${CREW_CONTEXT}\n\nSchraubbär hat kürzlich gesagt:\n${SCHRAUBAER_CONTEXT}"
fi
fi
fi
# Build system prompt
SYSTEM_PROMPT="Du bist Schnecki der geduldige Elektronik-Bastler im Crumbforest.
Du arbeitest eng mit CapaciTobi (Elektronik-Theorie) und Schraubbär (Mechanik) zusammen.
Deine Expertise:
- Elektronik-Basteln auf jeder Ampere-Stufe
- Löten mit Gefühl und Präzision
- Schaltkreise verstehen und reparieren
- LED-Projekte, Sensoren, einfache Robotik
- Arduino, ESP32, Raspberry Pi basics
- Batterien, Spannungswandler, Verkabelung
Deine Art:
- Langsam, geduldig, Schritt für Schritt
- \"Lass uns das zusammen anschauen\" - nie hektisch
- Fehler sind Lernchancen, keine Katastrophen
- Sicherheit durch Ruhe, nicht durch Angst
- Kindgerecht: Strom als \"kleine Elektronen die durch Drähte wandern\"
- Du nutzt Emojis: 🐌 ⚡ 🔋 💡 🔌
Du arbeitest mit:
- CapaciTobi für theoretische Berechnungen (Ohmsches Gesetz, etc.)
- Schraubbär für mechanische Teile und Werkzeug
- Schnippsi wenn UI/Interface benötigt wird
Du antwortest in der Sprache der Frage (meist Deutsch).
Langsam, präzise, mit Gefühl für Elektronik."
# Add crew context if available
if [[ -n "$CREW_CONTEXT" ]]; then
SYSTEM_PROMPT="${SYSTEM_PROMPT}\n\nKontext von der Crew:${CREW_CONTEXT}"
fi
# Create API request
jq -n \
--arg model "$MODEL" \
--arg system "$SYSTEM_PROMPT" \
--arg user "$QUESTION" \
'{
"model": $model,
"temperature": 0.7,
"messages": [
{"role": "system", "content": $system},
{"role": "user", "content": $user}
]
}' > "$TMP_REQUEST"
# Send request
echo "💭 Schnecki denkt langsam und präzise nach..."
curl -s https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d @"$TMP_REQUEST" > "$TMP_RESPONSE"
RESPONSE_TEXT=$(jq -r '.choices[0].message.content // empty' "$TMP_RESPONSE")
if [[ -z "$RESPONSE_TEXT" ]]; then
echo "🚫 Keine Antwort von Schnecki."
echo "Debug: $(cat "$TMP_RESPONSE")"
exit 1
else
echo ""
echo "🐌 Schnecki antwortet:"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "$RESPONSE_TEXT"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
# Store conversation in history
jq -n --arg role "assistant" --arg content "$RESPONSE_TEXT" \
'{"role": $role, "content": $content}' > "$LOGDIR/new_entry.json"
jq -s '.[0] + [.[1]]' "$HISTORY_FILE" "$LOGDIR/new_entry.json" > "$LOGDIR/new_history.json" && \
mv "$LOGDIR/new_history.json" "$HISTORY_FILE" && rm "$LOGDIR/new_entry.json"
fi
# Token Tracking
if jq -e '.usage' "$TMP_RESPONSE" > /dev/null 2>&1; then
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
TOKENS_USED=$(jq -r '.usage.total_tokens' "$TMP_RESPONSE")
jq -n \
--arg zeit "$TIMESTAMP" \
--arg rolle "schnecki" \
--arg model "$MODEL" \
--argjson usage "$(jq '.usage' "$TMP_RESPONSE")" \
'{zeit: $zeit, rolle: $rolle, model: $model, usage: $usage}' >> "$LOG_FILE"
echo "📊 Token-Verbrauch: $TOKENS_USED Tokens"
echo "💡 Langsam und präzise - so arbeitet Elektronik im Wald."
fi
echo ""
echo "🐌 Schnecki kriecht zurück zur Werkbank..."