[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:
parent
87aaa2f814
commit
0e05c9312b
1 changed files with 169 additions and 10 deletions
|
@ -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
|
||||||
update_rate_files()
|
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()
|
||||||
|
|
||||||
|
if not args.quiet:
|
||||||
|
print("Proceso de actualización de tarifas completado exitosamente.")
|
||||||
|
|
||||||
if not args.quiet:
|
|
||||||
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}")
|
||||||
|
|
Loading…
Reference in a new issue