Ctrl K
ComunidadGuías…

routes/greetings.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""
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'])})