[ADDED] Implementar opción --type para actualizar un tipo específico de programador

🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Mauro Rosero P. 2025-03-12 12:43:26 -05:00
parent 87aaa2f814
commit 0e05c9312b
Signed by: mrosero
GPG key ID: 83BD2A5F674B7E26

View file

@ -421,6 +421,150 @@ def get_programmer_types():
'odoo' 'odoo'
] ]
def update_single_rate(programmer_type):
"""
Actualiza la tarifa para un tipo específico de programador.
"""
# Verificar que el tipo de programador sea válido
if programmer_type not in get_programmer_types():
logger.error(f"Tipo de programador no válido: {programmer_type}")
print(f"ERROR: Tipo de programador no válido: {programmer_type}")
print(f"Tipos válidos: {', '.join(get_programmer_types())}")
return False
# Obtener modelo configurado
model = get_ai_model()
logger.info(f"Usando modelo de IA: {model}")
# Verificar disponibilidad de la API
api_available = True
try:
# Intentar obtener la clave API (si falla, saltará una excepción)
get_perplexity_api_key()
except:
api_available = False
logger.warning("API de Perplexity no disponible. Se usarán valores predeterminados.")
# Crear la carpeta rates si no existe
os.makedirs(RATES_DIR, exist_ok=True)
# Si es bash, necesitamos primero obtener o actualizar la tarifa de devops
devops_rate = None
if programmer_type == 'bash':
logger.info("Actualizando tarifa de devops primero para calcular bash")
devops_rate_file = RATES_DIR / "devops.rate"
# Comprobar si existe un archivo de devops y si debemos actualizarlo
if devops_rate_file.exists():
# Leer la tarifa guardada de devops
try:
with open(devops_rate_file, 'r', encoding='utf-8') as f:
devops_rate = float(f.read().strip())
logger.info(f"Tarifa leída para devops: {devops_rate:.2f}")
except (FileNotFoundError, ValueError) as e:
logger.error(f"Error al leer tarifa de devops: {e}")
# Si hay error de lectura, intentamos actualizar la tarifa
devops_rate = None
# Si no existe o hubo error de lectura, actualizamos la tarifa de devops
if devops_rate is None:
prompt = generate_prompt_base('devops')
# Si la API está disponible, intentar consultarla
if api_available:
logger.info("Consultando tarifa para devops")
try:
# Consultar a Perplexity
devops_rate = query_perplexity(prompt, model)
if devops_rate is not None:
logger.info(f"Tarifa obtenida correctamente para devops: {devops_rate:.2f}")
else:
logger.error("No se pudo obtener la tarifa para devops")
except Exception as e:
logger.error(f"Error al consultar tarifa para devops: {e}")
time.sleep(2)
# Si la API falló o no está disponible, usar valor predeterminado
if devops_rate is None:
logger.warning("Usando valor predeterminado para devops")
devops_rate = get_default_rate('devops')
logger.info(f"Valor predeterminado para devops: {devops_rate:.2f}")
# Limitar a tarifas menores de 200 USD/hora
max_rate = 200.00
if devops_rate > max_rate:
logger.warning(f"Ajustando tarifa {devops_rate:.2f} al máximo permitido de {max_rate}")
devops_rate = max_rate
# Guardar el resultado en el archivo
with open(devops_rate_file, 'w', encoding='utf-8') as f:
f.write(f"{devops_rate:.2f}")
# Mostrar el resultado en la consola
result_message = f"Tarifa para devops: {devops_rate:.2f} USD/hora"
logger.info(f"Actualizado archivo {devops_rate_file} con valor: {devops_rate:.2f}")
show_result(result_message)
# Pequeña pausa para no sobrecargar la API
time.sleep(1)
# Ahora procesamos el tipo de programador solicitado
rate_file = RATES_DIR / f"{programmer_type}.rate"
# Caso especial para bash: calculamos como 0.4 veces la tarifa de devops
if programmer_type == 'bash' and devops_rate is not None:
logger.info(f"Calculando tarifa para bash como 0.4 * {devops_rate:.2f}")
rate = 0.4 * devops_rate
logger.info(f"Tarifa calculada para bash: {rate:.2f}")
else:
# Para otros tipos, procedemos como antes
prompt = generate_prompt_base(programmer_type)
# Variable para almacenar la tarifa
rate = None
# Si la API está disponible, intentar consultarla
if api_available:
logger.info(f"Consultando tarifa para {programmer_type}")
try:
# Consultar a Perplexity
rate = query_perplexity(prompt, model)
if rate is not None:
logger.info(f"Tarifa obtenida correctamente: {rate:.2f}")
else:
logger.error(f"No se pudo obtener la tarifa para {programmer_type}")
except Exception as e:
logger.error(f"Error al consultar tarifa para {programmer_type}: {e}")
# Pequeña pausa tras un error para evitar sobrecargar la API
time.sleep(2)
# Si la API falló o no está disponible, usar valor predeterminado
if rate is None:
logger.warning(f"Usando valor predeterminado para {programmer_type}")
rate = get_default_rate(programmer_type)
logger.info(f"Valor predeterminado: {rate:.2f}")
# Limitar a tarifas menores de 200 USD/hora
max_rate = 200.00
if rate > max_rate:
logger.warning(f"Ajustando tarifa {rate:.2f} al máximo permitido de {max_rate}")
rate = max_rate
# Guardar el resultado en el archivo - solo el valor numérico con dos decimales, sin salto de línea
with open(rate_file, 'w', encoding='utf-8') as f:
f.write(f"{rate:.2f}")
# Mostrar el resultado en la consola
result_message = f"Tarifa para {programmer_type}: {rate:.2f} USD/hora"
logger.info(f"Actualizado archivo {rate_file} con valor: {rate:.2f}")
show_result(result_message)
return True
def update_rate_files(): def update_rate_files():
""" """
Actualiza los archivos de tarifas con datos de Perplexity. Actualiza los archivos de tarifas con datos de Perplexity.
@ -684,6 +828,7 @@ if __name__ == "__main__":
parser.add_argument('-q', '--quiet', action='store_true', help='No mostrar resultados individuales') parser.add_argument('-q', '--quiet', action='store_true', help='No mostrar resultados individuales')
parser.add_argument('-v', '--verbose', action='store_true', help='Mostrar información detallada del proceso') parser.add_argument('-v', '--verbose', action='store_true', help='Mostrar información detallada del proceso')
parser.add_argument('-l', '--list', action='store_true', help='Listar todas las tarifas disponibles') parser.add_argument('-l', '--list', action='store_true', help='Listar todas las tarifas disponibles')
parser.add_argument('-t', '--type', help='Actualizar la tarifa para un tipo específico de programador')
args = parser.parse_args() args = parser.parse_args()
# Configurar nivel de log según parámetros # Configurar nivel de log según parámetros
@ -699,11 +844,6 @@ if __name__ == "__main__":
list_rate_files() list_rate_files()
sys.exit(0) sys.exit(0)
logger.info("Iniciando actualización de tarifas...")
if not args.quiet:
print("Actualizando tarifas...")
# Verificar e instalar pycountry si es necesario # Verificar e instalar pycountry si es necesario
pycountry_available = check_install_pycountry() pycountry_available = check_install_pycountry()
@ -714,11 +854,30 @@ if __name__ == "__main__":
logger.info("Usando lista interna para validación básica de códigos de país.") logger.info("Usando lista interna para validación básica de códigos de país.")
try: try:
# Actualizar los archivos de tarifas # Si se especifica un tipo de programador, actualizar solo ese tipo
if args.type:
logger.info(f"Actualizando tarifa para el tipo: {args.type}")
if not args.quiet:
print(f"Actualizando tarifa para {args.type}...")
success = update_single_rate(args.type)
if success and not args.quiet:
print(f"Tarifa para {args.type} actualizada exitosamente.")
elif not success:
sys.exit(1)
else:
# Actualizar todos los archivos de tarifas
logger.info("Iniciando actualización de tarifas...")
if not args.quiet:
print("Actualizando tarifas...")
update_rate_files() update_rate_files()
if not args.quiet: if not args.quiet:
print("Proceso de actualización de tarifas completado exitosamente.") print("Proceso de actualización de tarifas completado exitosamente.")
logger.info("Proceso de actualización de tarifas completado.") logger.info("Proceso de actualización de tarifas completado.")
except Exception as e: except Exception as e:
logger.error(f"Error durante la actualización de tarifas: {e}") logger.error(f"Error durante la actualización de tarifas: {e}")