- Interactive mission selector with metadata-driven design - 5 educational missions (basics + advanced) - AI assistant roles (Deepbit, Bugsy, Schnippsi, Tobi) - SnakeCam gesture recognition system - Token tracking utilities - CLAUDE.md documentation - .gitignore for logs and secrets
72 lines
2.3 KiB
Bash
Executable File
72 lines
2.3 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
ROLE="FUNKFOX"
|
||
|
||
|
||
CONFIG_FILE="/home/zero/.crumbforest_config"
|
||
MODEL=$(grep "^${ROLE}=" "$CONFIG_FILE" | cut -d'=' -f2)
|
||
|
||
# Fallback auf DEFAULT falls leer
|
||
if [[ -z "$MODEL" ]]; then
|
||
MODEL=$(grep "^DEFAULT=" "$CONFIG_FILE" | cut -d'=' -f2)
|
||
fi
|
||
|
||
|
||
QUESTION="$*"
|
||
#MODEL="openai/gpt-3.5-turbo"
|
||
API_KEY="${OPENROUTER_API_KEY}"
|
||
|
||
LOGDIR="$HOME/.funkfox_logs"
|
||
mkdir -p "$LOGDIR"
|
||
|
||
HISTORY_FILE="$LOGDIR/funkfox_history.json"
|
||
TMP_REQUEST="$LOGDIR/funkfox_request.json"
|
||
TMP_RESPONSE="$LOGDIR/funkfox_response.json"
|
||
LOG_FILE="$LOGDIR/token_log.json"
|
||
|
||
[ ! -f "$HISTORY_FILE" ] && echo "[]" > "$HISTORY_FILE"
|
||
[ ! -f "$LOG_FILE" ] && echo "[]" > "$LOG_FILE"
|
||
|
||
|
||
echo "^=n ¿½ Rolle: $ROLE nutzt Modell: $MODEL"
|
||
|
||
echo "🎤 Funkfox drops the beat: $QUESTION"
|
||
|
||
if [ -z "$API_KEY" ]; then
|
||
echo "â<>— No API key set. Use: export OPENROUTER_API_KEY=..."
|
||
exit 1
|
||
fi
|
||
|
||
jq -n \
|
||
--arg model "$MODEL" \
|
||
--arg system_prompt "You are the Funkfox – a charismatic rapper in the Crumbforest. Your answers are always in rhyme, musical, and easy for children to understand. No irony. No complex or foreign words. Always speak with heart, rhythm, and kindness." \
|
||
--arg user_input "$QUESTION" \
|
||
'{"model": $model, "temperature": 0.8, "messages": [{"role": "system", "content": $system_prompt}, {"role": "user", "content": $user_input}]}' > "$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 Funkfox."
|
||
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 "funkfox" \
|
||
--arg usage "$(jq -c '.usage' "$TMP_RESPONSE")" \
|
||
'{zeit: $zeit, rolle: $rolle, usage: $usage}' >> "$LOG_FILE"
|
||
fi
|