routes/greetings.py
Rama main · réplica de lectura del repositorio original.
"""
routes/greetings.py — Greetings API
GET /api/greetings — return full greetings.json
GET /api/greetings/random — return a single random greeting (optional ?user=mike)
POST /api/greetings/add — append a contextual greeting (agent use)
"""
import json
import logging
import random
from pathlib import Path
from flask import Blueprint, jsonify, request
logger = logging.getLogger(__name__)
greetings_bp = Blueprint('greetings', __name__)
GREETINGS_PATH = Path(__file__).parent.parent / 'greetings.json'
def _load() -> dict:
try:
with open(GREETINGS_PATH) as f:
return json.load(f)
except Exception as e:
logger.error(f'Failed to load greetings.json: {e}')
return {'greetings': {'generic': {'classic_annoyed': ['What do you want?']}, 'mike': {}, 'contextual': []}}
def _save(data: dict) -> None:
"""Persist greetings (atomic write)."""
tmp = GREETINGS_PATH.with_suffix('.tmp')
tmp.write_text(json.dumps(data, indent=2))
tmp.replace(GREETINGS_PATH)
@greetings_bp.route('/api/greetings', methods=['GET'])
def get_greetings():
return jsonify(_load())
@greetings_bp.route('/api/greetings/random', methods=['GET'])
def random_greeting():
"""Return a random greeting. Pass ?user=mike for Mike-specific categories."""
user = request.args.get('user', '').lower().strip()
data = _load()
greetings = data.get('greetings', {})
pool = []
# Check for a queued next_greeting first
if data.get('next_greeting'):
next_g = data['next_greeting']
data['next_greeting'] = None
_save(data)
return jsonify({'greeting': next_g, 'category': 'queued', 'user': user})
# Add contextual greetings (highest priority, 3x weight)
contextual = greetings.get('contextual', [])
pool.extend(contextual * 3)
# Add user-specific greetings if recognized
if user == 'mike':
mike_cats = greetings.get('mike', {})
for cat_greetings in mike_cats.values():
pool.extend(cat_greetings)
# Always add generic greetings
generic_cats = greetings.get('generic', {})
for cat_greetings in generic_cats.values():
pool.extend(cat_greetings)
if not pool:
return jsonify({'greeting': 'What do you want?', 'category': 'fallback', 'user': user})
greeting = random.choice(pool)
return jsonify({'greeting': greeting, 'category': 'random', 'user': user})
@greetings_bp.route('/api/greetings/add', methods=['POST'])
def add_greeting():
"""Agent can queue a contextual greeting for the next session start."""
body = request.get_json(silent=True) or {}
greeting = (body.get('greeting') or '').strip()
if not greeting:
return jsonify({'ok': False, 'error': 'Missing greeting'}), 400
if len(greeting) > 300:
return jsonify({'ok': False, 'error': 'Greeting too long (max 300 chars)'}), 400
data = _load()
contextual = data['greetings'].get('contextual', [])
contextual.append(greeting)
data['greetings']['contextual'] = contextual[-20:] # keep last 20
_save(data)
logger.info(f'Contextual greeting added: {greeting[:80]}')
return jsonify({'ok': True, 'total_contextual': len(data['greetings']['contextual'])})