KRITISCHES SICHERHEITSUPDATE für alle 17 Waldwächter-Scripts. Problem behoben: - Token-Budget wurde nur angezeigt, aber NICHT durchgesetzt - Kinder konnten unbegrenzt API-Calls machen → Kostenrisiko Implementierung: 1. check_token_budget() Funktion in lib/waldwaechter.sh - Berechnet täglichen Token-Verbrauch - Vergleicht mit DAILY_TOKEN_BUDGET aus .env - Budget = 0 oder leer → unbegrenzt - Budget überschritten → freundliche Blockierung 2. Budget-Check in ALLEN 17 Waldwächter-Scripts: - Prüfung VOR jedem API-Call - Kinderfreundliche Nachricht bei Limit - Warnung bei knappem Budget Philosophie: "Was kostet die Frage eines Kindes?" → Im Wald unbezahlbar, im System achtsam begrenzt. Scripts aktualisiert: ✅ mayaeule, deepbit, bugsy, schnippsi, templatus, tobi ✅ schraubaer, schnecki, dumbosql, funkfox, taichitaube ✅ snakepy, pepperphp, crabbyrust, spider, vektor, asciimonster Test-Ergebnisse: - Syntax-Check: 17/17 bestanden - Funktionstest: Budget-Enforcement funktioniert - Unbegrenzt-Modus: funktioniert - Limit-Modus: blockiert korrekt 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
61 lines
2.0 KiB
Bash
Executable File
61 lines
2.0 KiB
Bash
Executable File
#!/bin/bash
|
||
QUESTION="$*"
|
||
MODEL="openai/gpt-3.5-turbo"
|
||
API_KEY="${OPENROUTER_API_KEY}"
|
||
|
||
LOGDIR="${CRUMB_LOGS_DIR:-$HOME/.deepbit_logs}/deepbit"
|
||
mkdir -p "$LOGDIR"
|
||
|
||
HISTORY_FILE="$LOGDIR/deepbit_history.json"
|
||
TMP_REQUEST="$LOGDIR/deepbit_request.json"
|
||
TMP_RESPONSE="$LOGDIR/deepbit_response.json"
|
||
LOG_FILE="$LOGDIR/token_log.json"
|
||
|
||
[ ! -f "$HISTORY_FILE" ] && echo "[]" > "$HISTORY_FILE"
|
||
[ ! -f "$LOG_FILE" ] && echo "[]" > "$LOG_FILE"
|
||
|
||
echo "🌍 Deepbit responds based on language of input: $QUESTION"
|
||
|
||
if [ -z "$API_KEY" ]; then
|
||
echo "❗ No API key set. Use: export OPENROUTER_API_KEY=..."
|
||
exit 1
|
||
fi
|
||
|
||
# 💰 Prüfe Token-Budget (Kinderschutz)
|
||
if ! check_token_budget "deepbit"; then
|
||
exit 1
|
||
fi
|
||
|
||
jq -n \
|
||
--arg model "$MODEL" \
|
||
--arg system_prompt "You are Deepbit – a poetic octopus who explains Bash shell concepts to children using loops, images, and metaphors. Respond in the language the question is asked." \
|
||
--arg user "$QUESTION" \
|
||
'{"model": $model, "temperature": 0.5, "messages": [{"role": "system", "content": $system_prompt}, {"role": "user", "content": $user}]}' > "$TMP_REQUEST"
|
||
|
||
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 "🚫 No response from model."
|
||
exit 1
|
||
else
|
||
echo -e "$RESPONSE_TEXT"
|
||
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" && \
|
||
cp "$LOGDIR/new_history.json" "$HISTORY_FILE" && rm "$LOGDIR/new_history.json"
|
||
fi
|
||
|
||
if jq -e '.usage' "$TMP_RESPONSE" > /dev/null; then
|
||
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")
|
||
jq -n \
|
||
--arg zeit "$TIMESTAMP" \
|
||
--arg rolle "deepbit" \
|
||
--arg usage "$(jq -c '.usage' "$TMP_RESPONSE")" \
|
||
'{zeit: $zeit, rolle: $rolle, usage: $usage}' >> "$LOG_FILE"
|
||
fi
|