<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ChatGPT on KnightLi Blog</title>
        <link>https://knightli.com/es/tags/chatgpt/</link>
        <description>Recent content in ChatGPT on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>es</language>
        <lastBuildDate>Thu, 21 May 2026 08:33:14 +0800</lastBuildDate><atom:link href="https://knightli.com/es/tags/chatgpt/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Después de Google I/O, ¿conviene suscribirse a GPT o a Gemini? Comparativa para usuarios y desarrolladores</title>
        <link>https://knightli.com/es/2026/05/21/gpt-vs-gemini-subscription-after-google-io-2026/</link>
        <pubDate>Thu, 21 May 2026 08:33:14 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/21/gpt-vs-gemini-subscription-after-google-io-2026/</guid>
        <description>&lt;p&gt;Después de Google I/O 2026, elegir una suscripción de AI se volvió más complicado.&lt;/p&gt;
&lt;p&gt;Antes la decisión era más simple: para escribir, responder preguntas, programar y analizar archivos, la mayoría miraba primero ChatGPT; quienes usaban mucho Google Search, Android, Gmail, Docs o YouTube consideraban Gemini después. Ahora no es igual. En I/O, Google presentó Gemini 3.5 Flash, Gemini Omni, Antigravity 2.0, Gemini API Managed Agents, Google AI Studio y AI Ultra como parte de una misma historia de suscripción. Gemini dejó de ser solo una alternativa opcional y pasó a ser una línea competitiva fuerte.&lt;/p&gt;
&lt;p&gt;Este artículo no compara modelos con benchmarks abstractos. Responde una pregunta práctica: para usuarios normales, desarrolladores, creadores de contenido y empresas, ¿conviene suscribirse a GPT / ChatGPT o a Gemini / Google AI?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nota: los precios, cuotas, regiones y modelos disponibles cambian rápido. Este artículo fue escrito el 21 de mayo de 2026. Antes de suscribirte, revisa siempre las páginas actuales de OpenAI y Google.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;conclusión-rápida&#34;&gt;Conclusión rápida
&lt;/h2&gt;&lt;p&gt;Si solo quieres una suscripción principal, usa esta lógica:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Escritura diaria, preguntas, análisis de archivos, trabajo de oficina y uso mixto chino-inglés: prioriza ChatGPT Plus.&lt;/li&gt;
&lt;li&gt;Programación frecuente, uso de Codex, razonamiento complejo y tareas de código a nivel de proyecto: prioriza ChatGPT Plus / Pro y decide si subir de plan según la cuota.&lt;/li&gt;
&lt;li&gt;Uso intenso del ecosistema Google, Gmail, Docs, Drive, Android y Search: prioriza Gemini / Google AI Pro.&lt;/li&gt;
&lt;li&gt;Video, imágenes con AI, Google Flow, YouTube Shorts y Gemini Omni: prioriza Google AI Pro / Ultra.&lt;/li&gt;
&lt;li&gt;Antigravity, Gemini API Managed Agents y flujos desde AI Studio hacia Android: mira Google AI Pro / Ultra.&lt;/li&gt;
&lt;li&gt;Equipos empresariales: no compares solo planes personales; revisa Business / Enterprise, Workspace, permisos, auditoría y límites de datos.&lt;/li&gt;
&lt;li&gt;Presupuesto limitado: una suscripción principal de pago más la capa gratuita o API por uso de la otra plataforma suele ser mejor que dos planes avanzados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En una frase: GPT sigue siendo el asistente principal de productividad general y código; después de Google I/O, Gemini se parece más a una suite de AI de sistema dentro del ecosistema Google.&lt;/p&gt;
&lt;h2 id=&#34;qué-cambió-en-gemini-después-de-google-io&#34;&gt;Qué cambió en Gemini después de Google I/O
&lt;/h2&gt;&lt;p&gt;Google I/O 2026 hizo que el valor de Gemini ya no dependa solo de Gemini App.&lt;/p&gt;
&lt;p&gt;Cambios clave:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Gemini 3.5 Flash&lt;/code&gt;: Google lo posiciona como un modelo rápido para pasar de prompt a acción, orientado a flujos reales de Agent.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gemini Omni&lt;/code&gt;: crea contenido desde cualquier entrada; por ahora empieza con video y admite creación multimodal y edición iterativa en lenguaje natural.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google Antigravity 2.0&lt;/code&gt;: una agent-first development platform para orquestación de múltiples Agents y programación.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gemini API Managed Agents&lt;/code&gt;: permite crear Agents alojados que razonan, usan herramientas y ejecutan código mediante API.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google AI Studio&lt;/code&gt;: pasa de prompt playground a móvil, generación de apps nativas Android y exportación de proyectos a Antigravity.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google AI Ultra&lt;/code&gt;: nuevo plan de $100/mes después de I/O, dirigido a desarrolladores, líderes técnicos, trabajadores del conocimiento y creadores avanzados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Más importante aún, Google movió el uso de Gemini App desde límites diarios tradicionales de prompt hacia un modelo &lt;code&gt;compute-used&lt;/code&gt;. Las tareas complejas de video, código y contexto largo consumen más cuota; las tareas simples de texto consumen menos. La cuota se actualiza cada 5 horas hasta alcanzar el límite semanal.&lt;/p&gt;
&lt;p&gt;Esto muestra que Google quiere convertir la suscripción Gemini en una entrada empaquetada a &amp;ldquo;modelo + aplicación + creación + herramientas de desarrollo + ecosistema Google&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;para-quién-sirve-mejor-chatgpt--gpt-ahora&#34;&gt;Para quién sirve mejor ChatGPT / GPT ahora
&lt;/h2&gt;&lt;p&gt;ChatGPT sigue siendo muy fuerte, especialmente para quienes usan AI como herramienta diaria principal.&lt;/p&gt;
&lt;p&gt;Según la página actual de precios de OpenAI y su documentación de ayuda, ChatGPT Free ofrece capacidades básicas como GPT-5.5 Instant; Plus ofrece GPT-5.5 Thinking, más mensajes y cargas, mejor generación de imágenes, deep research, agent mode, proyectos, tareas, GPTs personalizados y uso ampliado de Codex; Pro ofrece límites más altos, GPT-5.5 Pro, más uso de Codex y la mayor capacidad de deep research y agent mode.&lt;/p&gt;
&lt;p&gt;Escenarios donde ChatGPT encaja mejor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Escritura, resúmenes, traducción y edición.&lt;/li&gt;
&lt;li&gt;Preguntas complejas y análisis estructurado.&lt;/li&gt;
&lt;li&gt;Carga de archivos, análisis de hojas de cálculo e informes de investigación.&lt;/li&gt;
&lt;li&gt;Preguntas de programación, revisión de código y sugerencias de refactorización.&lt;/li&gt;
&lt;li&gt;Uso de Codex para tareas de repositorio.&lt;/li&gt;
&lt;li&gt;Producción de contenido multilingüe.&lt;/li&gt;
&lt;li&gt;Usuarios que necesitan calidad y estabilidad de respuesta, pero no dependen mucho de productos Google.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para usuarios normales, ChatGPT Plus sigue siendo la suscripción principal más estable. Cubre muchos casos, tiene baja curva de aprendizaje y funciona bien tanto en chino como en inglés.&lt;/p&gt;
&lt;p&gt;Para desarrolladores, la clave de ChatGPT no es solo el chat, sino Codex. La documentación de OpenAI explica que Codex puede usarse con planes ChatGPT elegibles, y la cuota cambia según el plan. Si usas Codex con frecuencia para modificar código, PRs, refactorización o corrección de tests, debes incluir la cuota de Codex en la decisión.&lt;/p&gt;
&lt;h2 id=&#34;para-quién-sirve-mejor-gemini--google-ai-ahora&#34;&gt;Para quién sirve mejor Gemini / Google AI ahora
&lt;/h2&gt;&lt;p&gt;Después de Google I/O, la ventaja de Gemini es más clara: está más unido al ecosistema Google.&lt;/p&gt;
&lt;p&gt;Las suscripciones Google AI ya no son solo cuota de modelo dentro de Gemini App. También incluyen Gemini Omni, Google Flow, Antigravity, AI Studio, algunos beneficios de YouTube Premium / Lite y capacidades del ecosistema Workspace / Android / Search. Google también expandió AI Ultra a una línea de $100 y niveles superiores, destacando desarrolladores, líderes técnicos, trabajadores del conocimiento y creadores avanzados.&lt;/p&gt;
&lt;p&gt;Gemini encaja mejor si:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usas mucho Gmail, Docs, Drive, Sheets, Slides y Android.&lt;/li&gt;
&lt;li&gt;Quieres AI dentro de Google Search, YouTube y Workspace.&lt;/li&gt;
&lt;li&gt;Te interesan Gemini Omni, Google Flow, generación de video y edición de video.&lt;/li&gt;
&lt;li&gt;Quieres probar Antigravity, Gemini API Managed Agents y AI Studio mobile.&lt;/li&gt;
&lt;li&gt;Necesitas comprensión de documentos con contexto muy largo.&lt;/li&gt;
&lt;li&gt;Desarrollas apps del ecosistema Google, apps nativas Android o automatización de Workspace.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La ayuda oficial de Google indica que la ventana de contexto de Gemini Apps aumenta con la suscripción: 32K sin AI plan, 128K con AI Plus y 1 million con AI Pro y AI Ultra. AI Pro / Ultra también ofrece límites más altos, más funciones y algunas capacidades tempranas.&lt;/p&gt;
&lt;p&gt;Si tu entorno de trabajo ya vive en Google, el valor de Gemini aumenta. Si no, suscribirse a Gemini solo como &amp;ldquo;otro chatbot&amp;rdquo; puede no ser más rentable que ChatGPT.&lt;/p&gt;
&lt;h2 id=&#34;cómo-elegir-si-eres-usuario-normal&#34;&gt;Cómo elegir si eres usuario normal
&lt;/h2&gt;&lt;p&gt;El error más común es suscribirse a varias plataformas solo porque salió un modelo nuevo.&lt;/p&gt;
&lt;p&gt;La forma más racional es mirar primero tu caso principal.&lt;/p&gt;
&lt;p&gt;Si haces principalmente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Escribir artículos.&lt;/li&gt;
&lt;li&gt;Buscar información.&lt;/li&gt;
&lt;li&gt;Resumir.&lt;/li&gt;
&lt;li&gt;Leer PDF.&lt;/li&gt;
&lt;li&gt;Escribir correos.&lt;/li&gt;
&lt;li&gt;Mejorar un CV.&lt;/li&gt;
&lt;li&gt;Aprender idiomas.&lt;/li&gt;
&lt;li&gt;Preguntas diarias.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elige primero ChatGPT Plus. Es más general, tiene límites de tarea más claros y no exige una integración profunda con un ecosistema.&lt;/p&gt;
&lt;p&gt;Si haces principalmente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uso frecuente de Gmail / Docs / Drive / YouTube / Android.&lt;/li&gt;
&lt;li&gt;Quieres AI integrada directamente en Google.&lt;/li&gt;
&lt;li&gt;Quieres probar Gemini App, Daily Brief, Google Search AI y preguntas sobre contenido de YouTube.&lt;/li&gt;
&lt;li&gt;Necesitas leer documentos de Google con contexto largo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elige primero Google AI Pro.&lt;/p&gt;
&lt;p&gt;Si eres usuario ligero, empieza con las capas gratuitas de ambos servicios y paga solo cuando encuentres límites claros. No contrates un plan avanzado por algo que quizá uses.&lt;/p&gt;
&lt;h2 id=&#34;cómo-elegir-si-eres-desarrollador&#34;&gt;Cómo elegir si eres desarrollador
&lt;/h2&gt;&lt;p&gt;Hay dos grupos de desarrolladores.&lt;/p&gt;
&lt;p&gt;El primero usa AI sobre todo para preguntas de código, arreglar bugs, escribir scripts y leer repositorios. Para este grupo, conviene ChatGPT Plus / Pro + Codex.&lt;/p&gt;
&lt;p&gt;Razones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Codex está integrado con la cuenta de ChatGPT.&lt;/li&gt;
&lt;li&gt;ChatGPT es estable para explicar código, refactorizar, escribir tests y analizar errores.&lt;/li&gt;
&lt;li&gt;Plus cubre muchas tareas diarias de desarrollo.&lt;/li&gt;
&lt;li&gt;Pro encaja mejor con tareas frecuentes, largas y complejas sobre repositorios.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El segundo grupo desarrolla alrededor del ecosistema Google, plataformas Agent, Android, Workspace o Gemini API. Para este grupo, conviene Google AI Pro / Ultra.&lt;/p&gt;
&lt;p&gt;Razones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini 3.5 Flash es un modelo clave para flujos Agent después de Google I/O.&lt;/li&gt;
&lt;li&gt;Antigravity 2.0 es la plataforma agent-first de Google.&lt;/li&gt;
&lt;li&gt;Managed Agents permite crear Agents con herramientas y entorno Linux aislado mediante API.&lt;/li&gt;
&lt;li&gt;AI Studio conecta mejor con Android, Workspace y Antigravity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para un desarrollador full-stack, la combinación más práctica suele ser:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT Plus como herramienta principal para código y documentación diaria.&lt;/li&gt;
&lt;li&gt;Gemini gratuito o AI Pro para ecosistema Google, contexto largo y nuevas funciones de video / Agent.&lt;/li&gt;
&lt;li&gt;API por uso cuando haga falta; no confundas una suscripción personal con presupuesto de API de producción.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cómo-elegir-si-eres-creador-de-contenido&#34;&gt;Cómo elegir si eres creador de contenido
&lt;/h2&gt;&lt;p&gt;La elección depende del tipo de contenido.&lt;/p&gt;
&lt;p&gt;Si haces principalmente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copywriting.&lt;/li&gt;
&lt;li&gt;Títulos.&lt;/li&gt;
&lt;li&gt;Guiones.&lt;/li&gt;
&lt;li&gt;Artículos.&lt;/li&gt;
&lt;li&gt;Contenido gráfico y textual.&lt;/li&gt;
&lt;li&gt;Organización de materiales.&lt;/li&gt;
&lt;li&gt;Reescritura multilingüe.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ChatGPT Plus sigue siendo muy estable.&lt;/p&gt;
&lt;p&gt;Si haces principalmente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generación de video.&lt;/li&gt;
&lt;li&gt;Ideas para videos cortos.&lt;/li&gt;
&lt;li&gt;Imágenes con AI.&lt;/li&gt;
&lt;li&gt;YouTube Shorts.&lt;/li&gt;
&lt;li&gt;Flujos de Google Flow.&lt;/li&gt;
&lt;li&gt;Integración de materiales multimodales.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gemini / Google AI Pro o Ultra merece más atención. Después de I/O, Gemini Omni y Google Flow son las cartas principales de Google en creación.&lt;/p&gt;
&lt;p&gt;Si el presupuesto es limitado, contrata primero una herramienta principal de texto y usa la capa gratuita o una suscripción corta de la otra plataforma para probar video. Las cuotas, colas, duración, resolución y regiones de los modelos de video cambian rápido; no conviene planificar producción a largo plazo desde el primer día.&lt;/p&gt;
&lt;h2 id=&#34;cómo-elegir-para-empresas-y-equipos&#34;&gt;Cómo elegir para empresas y equipos
&lt;/h2&gt;&lt;p&gt;Las empresas no deben elegir como usuarios personales.&lt;/p&gt;
&lt;p&gt;Lo importante no es &amp;ldquo;qué modelo es más fuerte esta semana&amp;rdquo;, sino:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si los datos se usan para entrenamiento.&lt;/li&gt;
&lt;li&gt;Si hay SSO, MFA y RBAC.&lt;/li&gt;
&lt;li&gt;Si hay registros de auditoría.&lt;/li&gt;
&lt;li&gt;Si permite conectar conocimiento interno.&lt;/li&gt;
&lt;li&gt;Si se pueden controlar plugins, conectores y permisos de Agents.&lt;/li&gt;
&lt;li&gt;Si cumple requisitos de compliance.&lt;/li&gt;
&lt;li&gt;Si se integra con la suite de oficina existente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si la empresa ya usa mucho Google Workspace, vale la pena evaluar Gemini para empresas. Si el equipo ya construyó procesos alrededor de ChatGPT, Codex, OpenAI API y herramientas internas, OpenAI Business / Enterprise será más natural.&lt;/p&gt;
&lt;p&gt;Los equipos de ingeniería también deben evaluar por separado Codex, Antigravity, Gemini API Managed Agents, MCP, CI/CD, permisos de código, acceso a repositorios y auditoría.&lt;/p&gt;
&lt;h2 id=&#34;cuándo-necesitas-pro--ultra&#34;&gt;Cuándo necesitas Pro / Ultra
&lt;/h2&gt;&lt;p&gt;Mucha gente no necesita realmente un plan avanzado.&lt;/p&gt;
&lt;p&gt;Señales típicas de que necesitas ChatGPT Pro:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usas ChatGPT muchas horas al día.&lt;/li&gt;
&lt;li&gt;Los límites de Plus se quedan cortos con frecuencia.&lt;/li&gt;
&lt;li&gt;Usas Codex de forma intensiva.&lt;/li&gt;
&lt;li&gt;Ejecutas deep research, agent mode y razonamiento complejo con frecuencia.&lt;/li&gt;
&lt;li&gt;Necesitas modelos avanzados como GPT-5.5 Pro.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Señales típicas de que necesitas Google AI Ultra:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usas Gemini, Flow y Antigravity con frecuencia.&lt;/li&gt;
&lt;li&gt;Necesitas límites más altos de Gemini / Antigravity.&lt;/li&gt;
&lt;li&gt;Haces video, imágenes con AI o investigación con contexto largo.&lt;/li&gt;
&lt;li&gt;Dependes mucho del ecosistema Google y del acceso temprano a nuevas funciones.&lt;/li&gt;
&lt;li&gt;Necesitas Gemini Spark, Project Genie o beneficios de nivel superior.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si solo haces unas pocas preguntas al día, escribes artículos ocasionalmente o editas código de vez en cuando, Plus / Pro o AI Pro / Ultra quizá no sean necesarios.&lt;/p&gt;
&lt;h2 id=&#34;la-estrategia-más-barata&#34;&gt;La estrategia más barata
&lt;/h2&gt;&lt;p&gt;La combinación recomendada suele ser:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Elige primero una suscripción principal de pago.&lt;/li&gt;
&lt;li&gt;Usa la capa gratuita de la otra plataforma.&lt;/li&gt;
&lt;li&gt;Paga API por uso solo cuando realmente la necesites.&lt;/li&gt;
&lt;li&gt;Activa por meses las funciones de alto consumo como video, Agents y deep research; no las pagues todo el año a ciegas.&lt;/li&gt;
&lt;li&gt;Revisa cada mes: ¿realmente usaste la cuota?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Combinaciones comunes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Oficina general: ChatGPT Plus + capa gratuita de Gemini.&lt;/li&gt;
&lt;li&gt;Usuarios del ecosistema Google: Google AI Pro + capa gratuita de ChatGPT.&lt;/li&gt;
&lt;li&gt;Desarrolladores: ChatGPT Plus/Pro + Gemini API/AI Studio según necesidad.&lt;/li&gt;
&lt;li&gt;Creadores de video: Google AI Pro/Ultra + capa gratuita de ChatGPT o Plus.&lt;/li&gt;
&lt;li&gt;Equipos empresariales: no juntes planes personales; evalúa Business / Enterprise / Workspace directamente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;checklist-antes-de-suscribirte&#34;&gt;Checklist antes de suscribirte
&lt;/h2&gt;&lt;p&gt;Antes de pagar, confirma:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;¿Tu región admite el plan?&lt;/li&gt;
&lt;li&gt;¿El modelo que necesitas está incluido?&lt;/li&gt;
&lt;li&gt;¿Codex, Antigravity, Flow y Omni están realmente disponibles?&lt;/li&gt;
&lt;li&gt;¿Las funciones de video tienen restricciones de región, edad, cola o resolución?&lt;/li&gt;
&lt;li&gt;¿La API está incluida o se factura aparte?&lt;/li&gt;
&lt;li&gt;¿La carga de archivos, ventana de contexto, agent mode y deep research tienen límites?&lt;/li&gt;
&lt;li&gt;¿La configuración de privacidad cumple con tu proyecto?&lt;/li&gt;
&lt;li&gt;¿Ya tienes beneficios de Google One, Workspace, ChatGPT Business o una cuenta escolar / corporativa?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Especialmente importante: una suscripción personal no equivale a API gratuita, uso comercial ilimitado ni compliance empresarial.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;Después de Google I/O, Gemini es mucho más competitivo, sobre todo en video, multimodalidad, ecosistema Google, Android, AI Studio y Antigravity. Pero ChatGPT sigue siendo la opción general más estable, especialmente para escritura diaria, preguntas complejas, análisis de archivos, ayuda con código y flujos de Codex.&lt;/p&gt;
&lt;p&gt;La regla simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si no sabes cuál elegir: empieza con ChatGPT Plus.&lt;/li&gt;
&lt;li&gt;Si eres usuario intenso de Google: elige Google AI Pro.&lt;/li&gt;
&lt;li&gt;Si eres desarrollador frecuente: compara Codex y Antigravity contra tu flujo real.&lt;/li&gt;
&lt;li&gt;Si eres creador de video: mira primero Gemini Omni, Flow y Google AI Pro / Ultra.&lt;/li&gt;
&lt;li&gt;Si eres empresa: elige por compliance, permisos, auditoría y ecosistema de oficina existente, no por hype del modelo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Más suscripciones de AI no significan mejor resultado. Lo más rentable es definir un flujo principal y usar las otras plataformas como complemento, no abrir una suscripción larga después de cada keynote.&lt;/p&gt;
&lt;p&gt;Referencias:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://chatgpt.com/pricing/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI: ChatGPT Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11369540-using-codex-with-your-chatgpt-plan&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help: Using Codex with your ChatGPT plan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.google/products-and-platforms/products/google-one/google-ai-subscriptions/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Blog: Everything new in Google AI subscriptions from I/O 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.google/innovation-and-ai/technology/developers-tools/google-io-2026-developer-highlights/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Blog: I/O 2026 developer highlights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://support.google.com/gemini/answer/16275805&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Help: Gemini Apps limits and upgrades for Google AI subscribers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>¿Cómo evolucionaron los AI Agents? Guía completa de cinco generaciones, 2022-2026</title>
        <link>https://knightli.com/es/2026/05/16/ai-agent-evolution-2022-2026/</link>
        <pubDate>Sat, 16 May 2026 19:19:52 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/16/ai-agent-evolution-2022-2026/</guid>
        <description>&lt;p&gt;Los AI Agents no aparecieron de un día para otro.&lt;/p&gt;
&lt;p&gt;A finales de 2022, ChatGPT era principalmente una ventana de chat. Para 2026, los agentes empezaron a tener llamadas de herramientas, operaciones con archivos, control del ordenador, memoria a largo plazo, colaboración remota y ejecución persistente. En cuatro años pasaron de &amp;ldquo;modelos que responden preguntas&amp;rdquo; a &amp;ldquo;trabajadores digitales que empujan tareas&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Vistos en línea temporal, los AI Agents pasaron por unas cinco generaciones. Cada una resolvió una limitación de la anterior y creó nuevas burbujas y nuevos problemas de seguridad.&lt;/p&gt;
&lt;h2 id=&#34;resumen-cinco-generaciones-de-agents&#34;&gt;Resumen: cinco generaciones de Agents
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Etapa&lt;/th&gt;
          &lt;th&gt;Tiempo&lt;/th&gt;
          &lt;th&gt;Palabra clave&lt;/th&gt;
          &lt;th&gt;Cambio de capacidad&lt;/th&gt;
          &lt;th&gt;Problema central&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Generación 0&lt;/td&gt;
          &lt;td&gt;Finales de 2022 - inicio de 2023&lt;/td&gt;
          &lt;td&gt;Chat&lt;/td&gt;
          &lt;td&gt;Genera texto, pero no actúa&lt;/td&gt;
          &lt;td&gt;El modelo está separado del mundo real&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Generación 1&lt;/td&gt;
          &lt;td&gt;Mitad de 2023 - final de 2023&lt;/td&gt;
          &lt;td&gt;Tool calling&lt;/td&gt;
          &lt;td&gt;Produce llamadas estructuradas, conecta API y RAG&lt;/td&gt;
          &lt;td&gt;Ejecución abierta y pérdida de dirección&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Generación 2&lt;/td&gt;
          &lt;td&gt;Finales de 2023 - 2024&lt;/td&gt;
          &lt;td&gt;Workflows de ingeniería&lt;/td&gt;
          &lt;td&gt;Planificación, estado, reflexión y multi-agent&lt;/td&gt;
          &lt;td&gt;Workflows fáciles de copiar&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Generación 3&lt;/td&gt;
          &lt;td&gt;2024 - 2025&lt;/td&gt;
          &lt;td&gt;Computer Use&lt;/td&gt;
          &lt;td&gt;Ve pantallas y opera GUI&lt;/td&gt;
          &lt;td&gt;Permisos, seguridad y errores de operación&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Generación 4&lt;/td&gt;
          &lt;td&gt;2025 - 2026&lt;/td&gt;
          &lt;td&gt;MCP / Skills / persistencia&lt;/td&gt;
          &lt;td&gt;Red de herramientas, contexto largo y skills&lt;/td&gt;
          &lt;td&gt;La ejecución persistente amplía el riesgo&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Generación 5&lt;/td&gt;
          &lt;td&gt;Después de 2026&lt;/td&gt;
          &lt;td&gt;Loops y world models&lt;/td&gt;
          &lt;td&gt;Más memoria, validación y acción física&lt;/td&gt;
          &lt;td&gt;Gobernanza más difícil&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;finales-de-2022-generación-0-la-era-del-chat-de-chatgpt&#34;&gt;Finales de 2022: Generación 0, la era del chat de ChatGPT
&lt;/h2&gt;&lt;p&gt;La Generación 0 empieza con el lanzamiento de ChatGPT el 30 de noviembre de 2022.&lt;/p&gt;
&lt;p&gt;Todavía no era un Agent real. Tenía gran capacidad de lenguaje, pero estaba encerrado en una ventana de chat. Podía escribir Python, pero no ejecutarlo en tu ordenador. Podía planificar un viaje, pero no comprar billetes. Podía explicar cómo editar un archivo, pero no entrar en el sistema de archivos y modificarlo.&lt;/p&gt;
&lt;p&gt;Sus límites eran claros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;entender lenguaje natural;&lt;/li&gt;
&lt;li&gt;generar artículos, respuestas, código y planes;&lt;/li&gt;
&lt;li&gt;no acceder por sí mismo a datos recientes;&lt;/li&gt;
&lt;li&gt;no leer de forma estable documentos internos de empresa;&lt;/li&gt;
&lt;li&gt;no ejecutar acciones externas;&lt;/li&gt;
&lt;li&gt;no gestionar estado de tareas largas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El problema central era la desconexión entre capacidad del modelo y mundo real. Podía pensar y hablar, pero no actuar.&lt;/p&gt;
&lt;p&gt;Esta etapa también creó la primera burbuja: prompt engineers, mercados de plantillas, cursos y certificaciones. Los modelos tempranos sí eran sensibles al prompt, pero el mercado confundió un parche temporal con una ventaja duradera.&lt;/p&gt;
&lt;p&gt;Con modelos tipo GPT-4, system prompts, function calling y mejores valores por defecto, muchas plantillas perdieron escasez. El patrón se repitió después: una nueva capacidad crea una capa intermedia; la siguiente generación la incorpora; la capa intermedia desaparece.&lt;/p&gt;
&lt;h2 id=&#34;mitad-de-2023-generación-1-despierta-el-tool-calling&#34;&gt;Mitad de 2023: Generación 1, despierta el tool calling
&lt;/h2&gt;&lt;p&gt;La palabra clave de la Generación 1 es tool calling.&lt;/p&gt;
&lt;p&gt;En junio de 2023, OpenAI lanzó &lt;code&gt;function calling&lt;/code&gt;. Los desarrolladores podían describir nombres de funciones, usos, tipos de parámetros y &lt;code&gt;JSON Schema&lt;/code&gt;. Tras entender la petición del usuario, el modelo podía devolver una llamada JSON estructurada, que un sistema externo ejecutaba.&lt;/p&gt;
&lt;p&gt;El cambio arquitectónico fue enorme: el modelo pasó de ser un cerebro que solo habla a un cerebro que puede mover herramientas externas.&lt;/p&gt;
&lt;p&gt;Capacidades clave:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;elegir herramientas según la intención;&lt;/li&gt;
&lt;li&gt;producir argumentos estructurados;&lt;/li&gt;
&lt;li&gt;llamar API externas;&lt;/li&gt;
&lt;li&gt;devolver resultados al modelo para seguir razonando;&lt;/li&gt;
&lt;li&gt;usar RAG para acceder a conocimiento externo;&lt;/li&gt;
&lt;li&gt;formar personas tempranas con plugins y bases de conocimiento.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Al mismo tiempo, &lt;code&gt;RAG&lt;/code&gt; y las bases vectoriales se volvieron populares. Resolvieron el problema de información reciente, material privado e información interna. El sistema recupera fragmentos relevantes, los inyecta en el contexto y el modelo responde a partir de ellos.&lt;/p&gt;
&lt;p&gt;La estructura básica del Agent quedó así:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;quién eres: system prompt y persona;&lt;/li&gt;
&lt;li&gt;qué sabes: base de conocimiento, RAG, documentos privados;&lt;/li&gt;
&lt;li&gt;qué puedes hacer: function calling, plugins, API externas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La burbuja más visible fue AutoGPT. La idea era atractiva: el usuario da un objetivo amplio, y la IA descompone tareas, busca, escribe archivos, evalúa, itera y se detiene cuando cree haber terminado.&lt;/p&gt;
&lt;p&gt;Pero AutoGPT mostró pronto sus fallos. Le faltaban restricciones de estado, condiciones de parada y feedback fiable. Las tareas se desviaban, las API se llamaban con argumentos erróneos y los costes podían dispararse. La lección fue clara: herramientas más bucles infinitos no hacen un Agent de producción.&lt;/p&gt;
&lt;h2 id=&#34;finales-de-2023-a-2024-generación-2-workflows-de-ingeniería&#34;&gt;Finales de 2023 a 2024: Generación 2, workflows de ingeniería
&lt;/h2&gt;&lt;p&gt;El fracaso de AutoGPT enseñó que no basta con dejar improvisar al modelo. Las tareas complejas necesitan proceso.&lt;/p&gt;
&lt;p&gt;La Generación 2 trata de workflows de ingeniería. El Agent deja de ser una llamada al modelo y se convierte en un sistema con estado, control de flujo y evaluación.&lt;/p&gt;
&lt;p&gt;Capacidades clave:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;planificación: dividir objetivos grandes en pasos;&lt;/li&gt;
&lt;li&gt;gestión de estado: saber por dónde va la tarea;&lt;/li&gt;
&lt;li&gt;reflexión y revisión: generar, evaluar y corregir;&lt;/li&gt;
&lt;li&gt;orquestación de herramientas;&lt;/li&gt;
&lt;li&gt;intervención humana en puntos críticos;&lt;/li&gt;
&lt;li&gt;colaboración multi-agent.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El patrón típico es &lt;code&gt;ReAct&lt;/code&gt;, o &lt;code&gt;Reasoning + Acting&lt;/code&gt;. El modelo razona, llama una herramienta, observa el resultado y razona otra vez. Así cada paso tiene lógica auditable y feedback.&lt;/p&gt;
&lt;p&gt;La Generación 2 puso la capacidad del modelo dentro de un proceso controlable. Un buen workflow puede producir resultados más estables que una única llamada a un modelo grande.&lt;/p&gt;
&lt;p&gt;También apareció la burbuja de plataformas low-code para Agents. Interfaces visuales permitían combinar prompt, RAG, plugins y flujos. Bajaban la barrera de construcción, pero si un workflow puede copiarse barato, la plataforma tiene poco moat.&lt;/p&gt;
&lt;p&gt;Capturar demanda temprana no equivale a tener una defensa duradera.&lt;/p&gt;
&lt;h2 id=&#34;2024-a-2025-generación-3-computer-use-entra-en-interfaces-reales&#34;&gt;2024 a 2025: Generación 3, Computer Use entra en interfaces reales
&lt;/h2&gt;&lt;p&gt;La palabra clave de la Generación 3 es &lt;code&gt;Computer Use&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Antes, el tool calling dependía de API. Lo que el Agent podía hacer dependía de lo que alguien hubiera conectado. Pero muchas aplicaciones reales no tienen API limpias, abiertas o completas.&lt;/p&gt;
&lt;p&gt;Computer Use permite al modelo ver pantallas, hacer clic y operar GUI. La interfaz general del ordenador se convierte en herramienta.&lt;/p&gt;
&lt;p&gt;Capacidades clave:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reconocer contenido en pantalla;&lt;/li&gt;
&lt;li&gt;hacer clic, escribir texto y cambiar ventanas;&lt;/li&gt;
&lt;li&gt;operar web y software de escritorio;&lt;/li&gt;
&lt;li&gt;leer repositorios, editar archivos y ejecutar pruebas;&lt;/li&gt;
&lt;li&gt;revisar terminal y errores;&lt;/li&gt;
&lt;li&gt;acercarse a un asistente de ingeniería real.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto empujó al Agent de &amp;ldquo;usar herramientas conectadas&amp;rdquo; a &amp;ldquo;operar software como una persona&amp;rdquo;. También acercó los coding agents al flujo real: leer proyecto, cambiar código, correr pruebas y corregir por errores.&lt;/p&gt;
&lt;p&gt;Pero la frontera de confianza creció. Si la IA opera un ordenador, puede hacer clic mal, borrar archivos, enviar formularios o ser manipulada por texto de páginas, documentos o interfaces. Prompt injection pasa a ser un problema de archivos, permisos y seguridad del sistema.&lt;/p&gt;
&lt;p&gt;La lección de la Generación 3: cuanto más cerca esté el Agent de operaciones reales, más necesita sandbox, aprobaciones, rollback y mínimo privilegio.&lt;/p&gt;
&lt;h2 id=&#34;2025-a-2026-generación-4-mcp-skills-y-trabajadores-digitales-persistentes&#34;&gt;2025 a 2026: Generación 4, MCP, Skills y trabajadores digitales persistentes
&lt;/h2&gt;&lt;p&gt;La Generación 4 se centra en persistencia, conexión, memoria y especialización.&lt;/p&gt;
&lt;p&gt;El foco ya no es solo hacer mejor una tarea aislada. Los Agents empiezan a tener contexto a largo plazo, red de herramientas, skills profesionales y sentido del tiempo. Se parecen menos a un asistente de una conversación y más a un trabajador digital continuo.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MCP&lt;/code&gt; resuelve la conexión de herramientas. Permite conectar sistemas de archivos, bases de datos, navegadores, herramientas de diseño, gestión de proyectos y sistemas empresariales de forma más estándar. Cuando el protocolo se estabiliza, muchas capas intermedias de conexión se comprimen.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Skills&lt;/code&gt; resuelve el método profesional. Las herramientas dicen qué puede hacer el Agent; las skills dicen cómo debe hacerlo. Una buena skill no es solo un prompt: empaqueta flujo de dominio, restricciones, checks, errores comunes y orden de herramientas.&lt;/p&gt;
&lt;p&gt;Capacidades clave:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;memoria a largo plazo: preferencias, reglas de proyecto e historial;&lt;/li&gt;
&lt;li&gt;contexto de proyecto: repositorios, documentación y normas;&lt;/li&gt;
&lt;li&gt;red de herramientas: MCP, API, navegador y sistema de archivos;&lt;/li&gt;
&lt;li&gt;skills profesionales: métodos de tarea empaquetados;&lt;/li&gt;
&lt;li&gt;ejecución persistente: esperar, despertar, recordar y seguir;&lt;/li&gt;
&lt;li&gt;colaboración remota: aprobar y ajustar desde otros dispositivos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esta generación empieza a tener sensación de empleado: identidad, límites de responsabilidad, contexto largo, método profesional, sentido del tiempo, permisos de herramientas y capacidad de avanzar sin supervisión constante.&lt;/p&gt;
&lt;p&gt;Pero cuanto más se parece a un empleado, más se parece su radio de riesgo. Ejecución persistente, datos locales, secretos, llamadas a herramientas y tareas reales convierten la seguridad en un asunto central.&lt;/p&gt;
&lt;p&gt;Hay un punto especialmente importante: el texto también es superficie de ataque. Si un Agent lee y obedece Markdown, documentación, skill packs o páginas web, texto malicioso puede cambiar su conducta. Prompt injection se vuelve problema de supply chain, permisos y ejecución.&lt;/p&gt;
&lt;p&gt;La lección de la Generación 4: los Agents persistentes necesitan gobernanza, no solo capacidad.&lt;/p&gt;
&lt;h2 id=&#34;después-de-2026-generación-5-loops-memoria-interna-y-world-models&#34;&gt;Después de 2026: Generación 5, loops, memoria interna y world models
&lt;/h2&gt;&lt;p&gt;La Generación 5 todavía no es historia cerrada. Es una extrapolación de los cuatro años anteriores.&lt;/p&gt;
&lt;p&gt;Un Agent maduro necesita al menos tres loops:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;loop de ejecución: verificar tras cada acción, hacer rollback, corregir y reintentar;&lt;/li&gt;
&lt;li&gt;loop temporal: seguir objetivos largos entre varios ciclos de activación;&lt;/li&gt;
&lt;li&gt;loop cognitivo: distinguir información segura, suposiciones e información caducada.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La segunda dirección es memoria interna. Hasta ahora, gran parte de la memoria está fuera del modelo: RAG, vectores, historial, archivos locales, &lt;code&gt;memory.md&lt;/code&gt;. Si los modelos futuros soportan estado persistente entre sesiones, la memoria de los Agents se rediseñará.&lt;/p&gt;
&lt;p&gt;La tercera dirección son los world models. Muchos Agents actuales son reactivos: observar, responder, volver a observar. Las tareas de alto riesgo necesitan simular consecuencias antes de actuar.&lt;/p&gt;
&lt;p&gt;La cuarta dirección es embodiment. Las generaciones anteriores vivían sobre todo en espacio digital: API, pantallas, archivos, navegador, herramientas empresariales. El siguiente paso puede llevar la acción a robots, dispositivos, sistemas industriales e interfaces físicas.&lt;/p&gt;
&lt;p&gt;La Generación 5 tendrá que resolver cómo ejecutar tareas, entender consecuencias, gestionar estado largo y mantenerse fiable en un radio de riesgo mayor.&lt;/p&gt;
&lt;h2 id=&#34;seis-reglas-detrás-de-la-línea-temporal&#34;&gt;Seis reglas detrás de la línea temporal
&lt;/h2&gt;&lt;p&gt;Primera: la capacidad del modelo base sigue siendo el techo. Un Agent no es magia fuera del modelo, sino capacidad del modelo liberada mediante ingeniería.&lt;/p&gt;
&lt;p&gt;Segunda: la arquitectura de ingeniería amplifica el modelo. Planificación, verificación, reflexión, corrección, evaluación y permisos se acercan más a resultados entregables que una generación única.&lt;/p&gt;
&lt;p&gt;Tercera: los protocolos abiertos redistribuyen valor. Cuando MCP, Skills y contexto de proyecto se estabilizan, la competencia pasa de conectar herramientas a acumular capacidad real de dominio.&lt;/p&gt;
&lt;p&gt;Cuarta: la línea oculta es la ampliación de la confianza humano-máquina. Texto, API, workflows, ordenador y ejecución persistente amplían cada vez más el radio de riesgo.&lt;/p&gt;
&lt;p&gt;Quinta: cada accidente se convierte en regla para la siguiente generación. Los bucles de AutoGPT empujaron la orquestación; los fallos de vibe coding empujaron evaluación; los borrados en producción empujaron permisos mínimos y sandbox.&lt;/p&gt;
&lt;p&gt;Sexta: el ecosistema Agent alterna explosión y extinción. Las nuevas capacidades crean capas temporales; los modelos o plataformas las incorporan después. Confundir una ventana temporal con un moat es peligroso.&lt;/p&gt;
&lt;h2 id=&#34;el-moat-real&#34;&gt;El moat real
&lt;/h2&gt;&lt;p&gt;El moat real en AI Agents no es empaquetar primero una nueva capacidad.&lt;/p&gt;
&lt;p&gt;Hay tres moats más fiables.&lt;/p&gt;
&lt;p&gt;Primero, profundidad vertical. ¿Entiendes de verdad el flujo, riesgos, excepciones y responsabilidades de una industria?&lt;/p&gt;
&lt;p&gt;Segundo, data flywheel. ¿Puedes acumular feedback real de alta calidad y mejorar procesos, evaluación, fine-tuning y decisiones de producto?&lt;/p&gt;
&lt;p&gt;Tercero, confianza del usuario. ¿Te entregan trabajo de más valor, más largo y más riesgoso, o solo te usan como herramienta puntual?&lt;/p&gt;
&lt;p&gt;Cuando una plataforma o modelo base absorbe una capacidad, los productos que aún conservan procesos, feedback, límites de responsabilidad y confianza tienen más probabilidades de sobrevivir.&lt;/p&gt;
&lt;h2 id=&#34;cierre&#34;&gt;Cierre
&lt;/h2&gt;&lt;p&gt;De 2022 a 2026, la evolución de AI Agents no fue &amp;ldquo;modelos que chatean mejor&amp;rdquo;. Fue &amp;ldquo;humanos dispuestos a entregar más trabajo a la IA&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Un Agent maduro no es el sistema que más se atreve a ejecutar. Es el sistema que sabe cuándo ejecutar, cuándo verificar, cuándo pausar y cuándo pedir confirmación humana.&lt;/p&gt;
&lt;p&gt;Para juzgar si un producto Agent tiene valor a largo plazo, pregunta: cuando el próximo modelo o plataforma incorpore esta capacidad, ¿qué queda?&lt;/p&gt;
&lt;p&gt;Si la respuesta es proceso de dominio, datos reales, resultados verificables y confianza del usuario, puede haber valor duradero.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Acceso remoto móvil de Codex: sigue tareas de programación en Mac desde la app ChatGPT</title>
        <link>https://knightli.com/es/2026/05/16/codex-mobile-remote-access-chatgpt-app/</link>
        <pubDate>Sat, 16 May 2026 17:42:40 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/16/codex-mobile-remote-access-chatgpt-app/</guid>
        <description>&lt;p&gt;OpenAI llevó &lt;code&gt;Codex remote access&lt;/code&gt; a la app móvil de ChatGPT a mediados de mayo de 2026. La idea no es programar en el teléfono, sino seguir y dirigir Codex mientras trabaja en un Mac.&lt;/p&gt;
&lt;p&gt;Codex sigue leyendo el proyecto, ejecutando comandos, editando archivos y revisando pruebas en el ordenador. El móvil sirve para revisar progreso, responder preguntas, añadir instrucciones y aprobar acciones.&lt;/p&gt;
&lt;h2 id=&#34;qué-puede-hacer&#34;&gt;Qué puede hacer
&lt;/h2&gt;&lt;p&gt;Según la documentación de OpenAI, desde el móvil puedes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;iniciar nuevos threads en proyectos del host o continuar existentes;&lt;/li&gt;
&lt;li&gt;enviar instrucciones, responder preguntas y ajustar la dirección del trabajo;&lt;/li&gt;
&lt;li&gt;aprobar comandos y otras acciones;&lt;/li&gt;
&lt;li&gt;revisar salidas, diffs, resultados de pruebas, terminal y capturas;&lt;/li&gt;
&lt;li&gt;recibir notificaciones cuando Codex termina o necesita atención;&lt;/li&gt;
&lt;li&gt;cambiar entre hosts y threads conectados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No es solo una ventana de chat pequeña: conecta con el contexto real de trabajo de Codex en el host.&lt;/p&gt;
&lt;h2 id=&#34;requisitos&#34;&gt;Requisitos
&lt;/h2&gt;&lt;p&gt;Necesitas acceso a Codex en la misma cuenta y workspace de ChatGPT en el móvil y en el Mac. También necesitas la última app móvil de ChatGPT en iOS o Android.&lt;/p&gt;
&lt;p&gt;El host actualmente debe ser un Mac despierto, en línea, ejecutando Codex App y con la misma cuenta y workspace. La configuración móvil y el control del dispositivo requieren por ahora &lt;code&gt;Codex App for macOS&lt;/code&gt;; no se configuran desde Codex CLI ni desde la IDE Extension.&lt;/p&gt;
&lt;p&gt;Si tu cuenta usa MFA, SSO o passkey, debes completar ese flujo. En un workspace de ChatGPT, un administrador puede tener que habilitar Remote Control access.&lt;/p&gt;
&lt;h2 id=&#34;límites&#34;&gt;Límites
&lt;/h2&gt;&lt;p&gt;Primero, requiere un &lt;code&gt;macOS host&lt;/code&gt;. El teléfono se conecta a Codex App en un Mac, no directamente a Codex CLI, a la IDE Extension ni a cualquier equipo Linux / Windows.&lt;/p&gt;
&lt;p&gt;Segundo, el host debe estar en línea. El Mac debe permanecer despierto, conectado y con Codex App abierto. Si duerme, pierde red o cierra Codex, la sesión remota puede desconectarse.&lt;/p&gt;
&lt;p&gt;Tercero, la conexión usa QR. Debes abrir &lt;code&gt;Set up Codex mobile&lt;/code&gt; en el Mac, escanear el código y completar la vinculación en ChatGPT.&lt;/p&gt;
&lt;p&gt;Cuarto, las acciones remotas siguen pasando por aprobaciones. Antes de aprobar desde el móvil, conviene leer qué quiere hacer Codex, sobre todo si implica terminal, cambios de archivos, pruebas o acceso externo.&lt;/p&gt;
&lt;h2 id=&#34;cómo-conectarlo&#34;&gt;Cómo conectarlo
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Abre Codex en el Mac.&lt;/li&gt;
&lt;li&gt;Elige &lt;code&gt;Set up Codex mobile&lt;/code&gt; en la barra lateral.&lt;/li&gt;
&lt;li&gt;Codex activa el acceso remoto para ese host y muestra un QR.&lt;/li&gt;
&lt;li&gt;Escanea el QR con el teléfono para abrir el flujo en ChatGPT.&lt;/li&gt;
&lt;li&gt;Confirma la misma cuenta y workspace.&lt;/li&gt;
&lt;li&gt;Completa MFA, SSO o passkey si hace falta.&lt;/li&gt;
&lt;li&gt;El Mac aparecerá en Codex dentro del móvil.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Después puedes gestionar dispositivos en &lt;code&gt;Settings &amp;gt; Connections&lt;/code&gt; desde Codex en el Mac, y revisar opciones como mantener el equipo despierto, Computer Use o Chrome extension.&lt;/p&gt;
&lt;h2 id=&#34;para-qué-sirve-el-móvil&#34;&gt;Para qué sirve el móvil
&lt;/h2&gt;&lt;p&gt;El móvil sirve sobre todo para aprobar, corregir dirección y revisar resultados. Puedes aprobar comandos, añadir una instrucción cuando Codex se equivoca o falla una prueba, y mirar diffs, logs de terminal, pruebas y capturas sin volver al escritorio.&lt;/p&gt;
&lt;p&gt;El valor no es escribir código en el móvil, sino convertirlo en una consola ligera para tareas de ingeniería que siguen ejecutándose en el host.&lt;/p&gt;
&lt;h2 id=&#34;problemas-comunes&#34;&gt;Problemas comunes
&lt;/h2&gt;&lt;p&gt;Si el host no aparece, confirma que Codex App sigue abierto en el Mac, que &lt;code&gt;Allow other devices to connect&lt;/code&gt; está activado y que ambos dispositivos usan la misma cuenta y workspace.&lt;/p&gt;
&lt;p&gt;Si no aparece una solicitud de aprobación, abre Codex dentro de la app móvil de ChatGPT, vuelve a escanear el QR o reinicia la configuración desde el host. En equipos, revisa si el administrador habilitó Remote Control access.&lt;/p&gt;
&lt;p&gt;Si la sesión se desconecta, revisa si el Mac se durmió, perdió red o cerró Codex App. Si la autenticación bloquea la configuración, completa MFA, SSO o passkey primero.&lt;/p&gt;
&lt;h2 id=&#34;cuándo-conviene&#34;&gt;Cuándo conviene
&lt;/h2&gt;&lt;p&gt;Encaja bien si ejecutas tareas largas con Codex, necesitas aprobar comandos lejos del escritorio, gestionas varios proyectos o threads y usas Mac como máquina principal.&lt;/p&gt;
&lt;p&gt;Encaja peor si trabajas principalmente en Windows o Linux, solo usas Codex CLI o IDE Extension, esperas un entorno de desarrollo completo en el teléfono o tienes una red inestable.&lt;/p&gt;
&lt;h2 id=&#34;mi-lectura&#34;&gt;Mi lectura
&lt;/h2&gt;&lt;p&gt;El acceso remoto móvil de Codex no mueve el desarrollo al teléfono. Hace más manejables los momentos en los que Codex se detiene por aprobación, preguntas, fallos de pruebas o cambios de dirección.&lt;/p&gt;
&lt;p&gt;Si ya usas Codex intensivamente en Mac, merece la pena activarlo. Si solo haces preguntas de código ocasionales, su valor será menos evidente.&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help Center: ChatGPT Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/codex/remote-connections&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Developers: Codex Remote Connections&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Qué es ChatGPT File Library: almacenamiento, límites y privacidad</title>
        <link>https://knightli.com/es/2026/05/16/chatgpt-file-library-storage-limits-privacy/</link>
        <pubDate>Sat, 16 May 2026 17:40:14 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/16/chatgpt-file-library-storage-limits-privacy/</guid>
        <description>&lt;p&gt;&lt;code&gt;ChatGPT File Library&lt;/code&gt; es la biblioteca de archivos dentro de ChatGPT.&lt;/p&gt;
&lt;p&gt;Antes, un archivo subido a una conversación servía sobre todo para ese chat. Con File Library, los archivos que subes o que ChatGPT crea pueden guardarse en tu cuenta, encontrarse después, descargarse, eliminarse o reutilizarse en una nueva conversación.&lt;/p&gt;
&lt;p&gt;Esto convierte ChatGPT en un espacio de trabajo persistente, no solo en una ventana de chat temporal.&lt;/p&gt;
&lt;h2 id=&#34;disponibilidad-más-reciente&#34;&gt;Disponibilidad más reciente
&lt;/h2&gt;&lt;p&gt;Según las ChatGPT Release Notes del 14 de mayo de 2026, File Library se está ampliando a usuarios Free y Go, incluidos usuarios del Espacio Económico Europeo. OpenAI también añadió gestión de almacenamiento por plan.&lt;/p&gt;
&lt;p&gt;Hay un matiz: la página específica de File storage and Library todavía mostraba, al revisarla, una disponibilidad anterior. Por eso este artículo usa como referencia principal las Release Notes más recientes. Que aparezca en tu cuenta depende del despliegue, la región y la versión de la app.&lt;/p&gt;
&lt;h2 id=&#34;qué-archivos-guarda&#34;&gt;Qué archivos guarda
&lt;/h2&gt;&lt;p&gt;ChatGPT puede guardar archivos que subes o creas, por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;documentos;&lt;/li&gt;
&lt;li&gt;hojas de cálculo;&lt;/li&gt;
&lt;li&gt;presentaciones;&lt;/li&gt;
&lt;li&gt;PDF;&lt;/li&gt;
&lt;li&gt;imágenes;&lt;/li&gt;
&lt;li&gt;archivos generados por ChatGPT.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Las imágenes generadas siguen apareciendo en la pestaña Images. File Library funciona como un lugar central para gestionar archivos subidos y generados.&lt;/p&gt;
&lt;p&gt;Si sueles pedir a ChatGPT que analice PDF, ordene tablas, cree documentos o trabaje con presentaciones, evita subir lo mismo una y otra vez.&lt;/p&gt;
&lt;h2 id=&#34;añadir-archivos-a-un-chat-nuevo&#34;&gt;Añadir archivos a un chat nuevo
&lt;/h2&gt;&lt;p&gt;En clientes compatibles, abre el menú de adjuntos o añadir cerca del cuadro de entrada, elige &lt;code&gt;Add from library&lt;/code&gt; y selecciona el archivo.&lt;/p&gt;
&lt;p&gt;Las Release Notes también mencionan Library y Recent files en Web, iOS y Android, así que el móvil puede reutilizar archivos guardados o recientes.&lt;/p&gt;
&lt;h2 id=&#34;buscar-y-gestionar&#34;&gt;Buscar y gestionar
&lt;/h2&gt;&lt;p&gt;En la web, Library está en la barra lateral izquierda. Permite ver archivos subidos y generados, filtrar por tipo u origen y gestionar el almacenamiento.&lt;/p&gt;
&lt;p&gt;La página de ayuda menciona filtros como archivos subidos, archivos generados, imágenes, documentos, hojas de cálculo, presentaciones y PDF.&lt;/p&gt;
&lt;p&gt;La gestión de almacenamiento está en &lt;code&gt;Settings &amp;gt; Storage&lt;/code&gt;, y también puedes eliminar archivos directamente desde Library.&lt;/p&gt;
&lt;h2 id=&#34;capacidad-por-plan&#34;&gt;Capacidad por plan
&lt;/h2&gt;&lt;p&gt;Las Release Notes del 14 de mayo de 2026 indican:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Plan&lt;/th&gt;
          &lt;th&gt;Capacidad de File Library&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Free&lt;/td&gt;
          &lt;td&gt;500 MB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Go&lt;/td&gt;
          &lt;td&gt;4 GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Plus&lt;/td&gt;
          &lt;td&gt;20 GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Business&lt;/td&gt;
          &lt;td&gt;20 GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Pro&lt;/td&gt;
          &lt;td&gt;100 GB&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La capacidad incluye archivos subidos y archivos creados por ChatGPT, como documentos, hojas, presentaciones e imágenes.&lt;/p&gt;
&lt;h2 id=&#34;límites-por-archivo&#34;&gt;Límites por archivo
&lt;/h2&gt;&lt;p&gt;La ayuda de OpenAI enumera estos límites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;archivos subidos a GPT o conversaciones de ChatGPT: hasta 512 MB cada uno;&lt;/li&gt;
&lt;li&gt;documentos de texto: hasta 2 millones de tokens;&lt;/li&gt;
&lt;li&gt;CSV u hojas de cálculo: normalmente unos 50 MB, según el tamaño de las filas;&lt;/li&gt;
&lt;li&gt;imágenes: hasta 20 MB cada una.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estos límites son distintos de la capacidad total de la cuenta.&lt;/p&gt;
&lt;h2 id=&#34;borrar-y-descargar&#34;&gt;Borrar y descargar
&lt;/h2&gt;&lt;p&gt;Los archivos permanecen en tu cuenta hasta que los borras.&lt;/p&gt;
&lt;p&gt;Desde Library puedes seleccionar un archivo y usar borrar o el icono de papelera. La ayuda de OpenAI indica que los archivos eliminados se retiran de la cuenta inmediatamente y se programan para eliminación permanente de los sistemas de OpenAI en un plazo de 30 días, salvo excepciones de anonimización, seguridad u obligaciones legales.&lt;/p&gt;
&lt;p&gt;También puedes descargar archivos desde Library.&lt;/p&gt;
&lt;h2 id=&#34;temporary-chat-no-guarda-archivos&#34;&gt;Temporary Chat no guarda archivos
&lt;/h2&gt;&lt;p&gt;Los archivos subidos en Temporary Chat no se guardan en la cuenta ni en Library.&lt;/p&gt;
&lt;p&gt;File Library está pensado para reutilización a largo plazo. Temporary Chat encaja mejor para tareas temporales, sensibles o que no deberían dejar contexto persistente.&lt;/p&gt;
&lt;h2 id=&#34;datos-y-entrenamiento&#34;&gt;Datos y entrenamiento
&lt;/h2&gt;&lt;p&gt;La ayuda de OpenAI explica que archivos y chats siguen tus ajustes y controles de datos.&lt;/p&gt;
&lt;p&gt;Si Memory está activado, archivos y conversaciones pueden ayudar a ChatGPT a recordar información útil entre chats. En servicios de consumo, si &lt;code&gt;Improve the model for everyone&lt;/code&gt; está activado, OpenAI puede usar contenido enviado a ChatGPT, incluidos archivos subidos, para mejorar modelos. Se puede desactivar en &lt;code&gt;Settings &amp;gt; Data Controls&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;File Library no es una carpeta local: es una función de cuenta en la nube. Conviene pensar qué documentos son adecuados para subir.&lt;/p&gt;
&lt;h2 id=&#34;usos-recomendados&#34;&gt;Usos recomendados
&lt;/h2&gt;&lt;p&gt;Encaja bien para analizar PDF o informes de forma recurrente, reutilizar materiales de clase o reuniones, seguir editando documentos generados por ChatGPT, reutilizar la misma fuente en varios chats y convertir ChatGPT en un espacio ligero de trabajo documental.&lt;/p&gt;
&lt;p&gt;Encaja mal para documentos de identidad, contratos, historiales médicos, extractos financieros, copias de seguridad formales o documentos internos de empresa sin revisar antes los controles de datos.&lt;/p&gt;
&lt;h2 id=&#34;mi-lectura&#34;&gt;Mi lectura
&lt;/h2&gt;&lt;p&gt;El valor de ChatGPT File Library no es solo tener una lista de archivos. Cambia ChatGPT de una herramienta de conversación puntual a un espacio con materiales persistentes.&lt;/p&gt;
&lt;p&gt;Eso exige nuevos hábitos: limpiar archivos antiguos, vigilar la capacidad, distinguir chats normales de Temporary Chat y revisar Data Controls.&lt;/p&gt;
&lt;p&gt;Si usas ChatGPT a menudo con documentos, tablas y materiales de investigación, File Library ahorra tiempo. Si solo subes archivos sensibles de vez en cuando, úsalo con más cautela.&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/20001052-file-storage-and-library-in-chatgpt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help Center: File storage and Library in ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help Center: ChatGPT Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Los nuevos modelos de voz Realtime de OpenAI: GPT-Realtime-2, traducción en vivo y transcripción en streaming</title>
        <link>https://knightli.com/es/2026/05/09/openai-realtime-voice-models-gpt-realtime-2-translate-whisper/</link>
        <pubDate>Sat, 09 May 2026 10:58:47 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/09/openai-realtime-voice-models-gpt-realtime-2-translate-whisper/</guid>
        <description>&lt;p&gt;El 7 de mayo de 2026, OpenAI presentó una nueva generación de modelos de voz para la Realtime API. El objetivo no es solo que la IA suene más natural, sino que los agentes de voz puedan entender, razonar, llamar herramientas, traducir y transcribir durante una conversación en vivo.&lt;/p&gt;
&lt;p&gt;La actualización incluye tres modelos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt;: el modelo principal para agentes de voz en tiempo real, con mejor razonamiento, llamadas a herramientas y contexto más largo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPT-Realtime-Translate&lt;/code&gt;: un modelo de traducción de voz en vivo que admite más de 70 idiomas de entrada y 13 idiomas de salida.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt;: un modelo de voz a texto en streaming y baja latencia para subtítulos, notas de reuniones y flujos de trabajo en tiempo real.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si los primeros asistentes de voz eran más bien “pregunta una vez, responde una vez”, esta actualización se acerca más a una interfaz de voz que escucha y actúa al mismo tiempo.&lt;/p&gt;
&lt;h2 id=&#34;gpt-realtime-2-el-modelo-principal-para-agentes-de-voz&#34;&gt;GPT-Realtime-2: el modelo principal para agentes de voz
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt; está diseñado para interacciones de voz en vivo. No solo responde preguntas; debe mantener el contexto mientras el usuario habla, se corrige, interrumpe o añade restricciones, y llamar herramientas cuando sea necesario.&lt;/p&gt;
&lt;p&gt;Las capacidades destacadas oficialmente incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Frases breves antes de la respuesta, como “déjame comprobarlo”, para que el usuario sepa que el sistema está trabajando.&lt;/li&gt;
&lt;li&gt;Llamadas paralelas a herramientas para calendarios, búsqueda, pedidos, soporte y otros flujos con varias herramientas.&lt;/li&gt;
&lt;li&gt;Recuperación más natural cuando algo falla.&lt;/li&gt;
&lt;li&gt;Ventana de contexto ampliada de 32K a 128K para conversaciones más largas y tareas más complejas.&lt;/li&gt;
&lt;li&gt;Mejor retención de terminología especializada, nombres propios y vocabulario médico.&lt;/li&gt;
&lt;li&gt;Tono y entrega más controlables, por ejemplo respuestas tranquilas, empáticas, confirmatorias o enérgicas.&lt;/li&gt;
&lt;li&gt;reasoning effort ajustable: &lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt; y &lt;code&gt;xhigh&lt;/code&gt;, con &lt;code&gt;low&lt;/code&gt; como valor predeterminado.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto permite usar agentes de voz en productos más exigentes, no solo en preguntas y respuestas simples. Un agente de soporte puede escuchar mientras consulta un pedido; una app de viajes puede sugerir pasos tras un cambio de vuelo; una app inmobiliaria puede filtrar viviendas y programar visitas a partir de requisitos hablados.&lt;/p&gt;
&lt;h2 id=&#34;traducción-en-vivo-para-productos-de-voz-multilingües&#34;&gt;Traducción en vivo para productos de voz multilingües
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-Realtime-Translate&lt;/code&gt; está pensado para traducción de voz en tiempo real. Cada persona puede hablar en su idioma, mientras la otra escucha la traducción y ve la transcripción en vivo.&lt;/p&gt;
&lt;p&gt;Los casos de uso son claros:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Atención al cliente multilingüe.&lt;/li&gt;
&lt;li&gt;Ventas internacionales y preventa.&lt;/li&gt;
&lt;li&gt;Educación online y eventos en vivo.&lt;/li&gt;
&lt;li&gt;Reuniones internacionales y presentaciones.&lt;/li&gt;
&lt;li&gt;Localización de contenido para plataformas de video y creadores.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La dificultad de la traducción en vivo no es solo traducir bien. También requiere baja latencia, pausas naturales, conservación del tono, adaptación a acentos y manejo de vocabulario especializado. OpenAI enfatiza conversaciones entre idiomas que se sientan más naturales, en lugar de esperar a que termine un bloque completo antes de traducir.&lt;/p&gt;
&lt;h2 id=&#34;transcripción-en-streaming-la-voz-entra-antes-en-el-flujo-de-trabajo&#34;&gt;Transcripción en streaming: la voz entra antes en el flujo de trabajo
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt; es el nuevo modelo de voz a texto en streaming. Su valor está en convertir la voz en texto utilizable mientras ocurre, no después de que termina una grabación.&lt;/p&gt;
&lt;p&gt;Aplicaciones comunes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Subtítulos en vivo para reuniones.&lt;/li&gt;
&lt;li&gt;Subtítulos para clases y emisiones.&lt;/li&gt;
&lt;li&gt;Notas de reunión en tiempo real.&lt;/li&gt;
&lt;li&gt;Entrada de dictado continua para agentes de voz.&lt;/li&gt;
&lt;li&gt;Flujos posteriores en soporte, salud, contratación, ventas y otros escenarios de voz frecuentes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para un producto, la transcripción en streaming reduce el tiempo entre lo hablado y el texto accionable. Los subtítulos aparecen antes, las notas se generan durante la conversación y procesos como resúmenes, extracción de tareas o actualización del CRM pueden empezar antes.&lt;/p&gt;
&lt;h2 id=&#34;precios-y-disponibilidad&#34;&gt;Precios y disponibilidad
&lt;/h2&gt;&lt;p&gt;Los tres modelos ya están disponibles en la Realtime API. Los precios oficiales son:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Modelo&lt;/th&gt;
          &lt;th&gt;Precio&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Entrada de audio $32 / 1M tokens, entrada en caché $0.40 / 1M tokens, salida de audio $64 / 1M tokens&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPT-Realtime-Translate&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;$0.034 / minuto&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;$0.017 / minuto&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OpenAI también indica que la Realtime API admite EU Data Residency y está cubierta por sus compromisos de privacidad empresarial. Para empresas europeas o productos con requisitos de residencia de datos, es un punto que conviene evaluar por separado.&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-para-los-desarrolladores&#34;&gt;Qué significa para los desarrolladores
&lt;/h2&gt;&lt;p&gt;El cambio principal es que la voz empieza a pasar de ser una capa de entrada y salida a ser una capa de interacción del producto.&lt;/p&gt;
&lt;p&gt;Muchas funciones de voz anteriores convertían voz a texto y luego convertían la respuesta textual de nuevo a voz. La parte difícil está en el medio: entender la intención, gestionar interrupciones, mantener contexto, llamar herramientas, explicar qué está haciendo el sistema y recuperarse con naturalidad cuando algo falla.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt; intenta llevar más de esa capacidad directamente al modelo de voz en tiempo real. Para los desarrolladores, la pregunta no es solo la calidad de una respuesta, sino si el modelo puede sostener conversaciones largas y tareas de varios pasos.&lt;/p&gt;
&lt;p&gt;Productos especialmente interesantes para probar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agentes de voz para atención al cliente.&lt;/li&gt;
&lt;li&gt;Asistentes de voz en autos y móviles.&lt;/li&gt;
&lt;li&gt;Servicios de viajes, reservas, inmobiliaria, finanzas y otros donde se conversa mientras se consulta información.&lt;/li&gt;
&lt;li&gt;Herramientas de reuniones multilingües y comunicación internacional.&lt;/li&gt;
&lt;li&gt;Subtítulos en vivo, notas de reuniones y sistemas de control de calidad de llamadas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;seguridad-y-aviso-al-usuario&#34;&gt;Seguridad y aviso al usuario
&lt;/h2&gt;&lt;p&gt;OpenAI afirma que la Realtime API incluye varias capas de seguridad, como clasificadores activos sobre sesiones y la posibilidad de detener conversaciones que violen políticas. Los desarrolladores también pueden añadir sus propias barreras con Agents SDK.&lt;/p&gt;
&lt;p&gt;Un requisito fácil de pasar por alto es informar claramente cuando el usuario final interactúa con IA, salvo que el contexto ya lo haga evidente.&lt;/p&gt;
&lt;p&gt;Esto importa en soporte, ventas, educación, salud y escenarios similares. Cuanto más natural sea la voz, más importantes son los límites del producto: el usuario debe saber que habla con IA y entender qué acciones pueden grabarse, transcribirse o activar herramientas.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;La actualización de Realtime API de OpenAI lleva la voz en vivo de “puede escuchar y hablar” hacia “puede escuchar mientras trabaja en tareas”.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt; cubre agentes de voz más complejos, &lt;code&gt;GPT-Realtime-Translate&lt;/code&gt; cubre comunicación multilingüe en vivo y &lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt; cubre transcripción de baja latencia. Juntos cubren tres capacidades básicas de muchos productos de voz: conversación, traducción y transcripción.&lt;/p&gt;
&lt;p&gt;Si estás construyendo productos de soporte, automóvil, reuniones, educación, comunicación internacional o asistentes de voz móviles, vale la pena probar esta actualización. Lo importante no es solo si el modelo suena natural, sino cómo se comporta en conversaciones largas, interrupciones, llamadas a herramientas, recuperación de fallos y control de costes.&lt;/p&gt;
&lt;p&gt;Referencia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/advancing-voice-intelligence-with-new-models-in-the-api/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI: Advancing voice intelligence with new models in the API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Diferencias entre GPT-5.5, GPT-5.5 Instant, GPT-5.5 Thinking y GPT-5.5 Pro</title>
        <link>https://knightli.com/es/2026/05/07/gpt-5-5-instant-thinking-pro-differences/</link>
        <pubDate>Thu, 07 May 2026 21:59:33 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/07/gpt-5-5-instant-thinking-pro-differences/</guid>
        <description>&lt;p&gt;OpenAI ahora divide GPT-5.5 en niveles de uso más claros: &lt;code&gt;Instant&lt;/code&gt;, &lt;code&gt;Thinking&lt;/code&gt; y &lt;code&gt;Pro&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Muchas personas mezclan &lt;code&gt;GPT-5.5&lt;/code&gt;, &lt;code&gt;GPT-5.5 Instant&lt;/code&gt;, &lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; y &lt;code&gt;GPT-5.5 Pro&lt;/code&gt;. La explicación corta es esta: &lt;code&gt;GPT-5.5&lt;/code&gt; es el nombre general de esta generación de capacidades del modelo. &lt;code&gt;Instant&lt;/code&gt; es el modelo rápido para el día a día, &lt;code&gt;Thinking&lt;/code&gt; es el modo de razonamiento profundo y &lt;code&gt;Pro&lt;/code&gt; es un modo más pesado orientado a investigación.&lt;/p&gt;
&lt;h2 id=&#34;comparación-rápida&#34;&gt;Comparación rápida
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Nombre&lt;/th&gt;
          &lt;th&gt;Qué es&lt;/th&gt;
          &lt;th&gt;Casos adecuados&lt;/th&gt;
          &lt;th&gt;Velocidad/coste&lt;/th&gt;
          &lt;th&gt;Disponibilidad&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5&lt;/td&gt;
          &lt;td&gt;Nombre del modelo/familia principal GPT-5.5; en ChatGPT suele corresponder a la orientación de capacidades de GPT-5.5 Thinking&lt;/td&gt;
          &lt;td&gt;Trabajo complejo, código, investigación, análisis, uso de herramientas&lt;/td&gt;
          &lt;td&gt;Más pesado que Instant, pero más capaz&lt;/td&gt;
          &lt;td&gt;Plus, Pro, Business, Enterprise&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Instant&lt;/td&gt;
          &lt;td&gt;Modelo rápido predeterminado que reemplaza a GPT-5.3 Instant&lt;/td&gt;
          &lt;td&gt;Preguntas diarias, escritura, resúmenes, código ligero, consultas rápidas&lt;/td&gt;
          &lt;td&gt;El más rápido y eficiente en cuota&lt;/td&gt;
          &lt;td&gt;Despliegue gradual para todos los usuarios de ChatGPT&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Thinking&lt;/td&gt;
          &lt;td&gt;Modo de razonamiento profundo&lt;/td&gt;
          &lt;td&gt;Problemas difíciles, análisis de contexto largo, código complejo, investigación, tareas con muchos documentos&lt;/td&gt;
          &lt;td&gt;Más lento, pero con razonamiento más estable&lt;/td&gt;
          &lt;td&gt;Los usuarios de pago pueden seleccionarlo manualmente&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
          &lt;td&gt;Modo de investigación de mayor intensidad&lt;/td&gt;
          &lt;td&gt;Tareas de alto riesgo o alta precisión: derecho, negocios, educación, ciencia de datos, análisis científico&lt;/td&gt;
          &lt;td&gt;El más lento y pesado, orientado a calidad&lt;/td&gt;
          &lt;td&gt;Pro, Business, Enterprise, Edu&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Si solo quieres recordar una regla:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tareas rápidas del día a día&lt;/strong&gt;: usa &lt;code&gt;GPT-5.5 Instant&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Razonamiento complejo y análisis de código&lt;/strong&gt;: usa &lt;code&gt;GPT-5.5 Thinking&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trabajo especialmente difícil, importante o que requiere más rigor&lt;/strong&gt;: usa &lt;code&gt;GPT-5.5 Pro&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;qué-es-gpt-55&#34;&gt;Qué es GPT-5.5
&lt;/h2&gt;&lt;p&gt;Cuando se dice &lt;code&gt;GPT-5.5&lt;/code&gt; sin más, normalmente se habla de las capacidades generales de la generación GPT-5.5, no de un botón fijo.&lt;/p&gt;
&lt;p&gt;OpenAI posiciona GPT-5.5 como un modelo más fuerte para trabajo real. Sus mejoras se centran en:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;agentic coding;&lt;/li&gt;
&lt;li&gt;depuración de código complejo;&lt;/li&gt;
&lt;li&gt;investigación y síntesis de materiales;&lt;/li&gt;
&lt;li&gt;generación de documentos, hojas de cálculo y presentaciones;&lt;/li&gt;
&lt;li&gt;uso de computadora y trabajo entre herramientas;&lt;/li&gt;
&lt;li&gt;razonamiento sostenido y autocomprobación en tareas largas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En ChatGPT, el usuario no suele ver un botón genérico &lt;code&gt;GPT-5.5&lt;/code&gt;, sino opciones más concretas: &lt;code&gt;Instant&lt;/code&gt;, &lt;code&gt;Thinking&lt;/code&gt; y &lt;code&gt;Pro&lt;/code&gt;. Por eso, si alguien dice &amp;ldquo;estoy usando GPT-5.5&amp;rdquo;, conviene preguntar: ¿Instant, Thinking o Pro?&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-instant-predeterminado-rápido-y-diario&#34;&gt;GPT-5.5 Instant: predeterminado, rápido y diario
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; es el nuevo modelo rápido predeterminado. En la comunicación oficial de OpenAI, empieza a reemplazar a &lt;code&gt;GPT-5.3 Instant&lt;/code&gt;, se convierte en el modelo predeterminado de ChatGPT y se ofrece en la API como &lt;code&gt;chat-latest&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Es adecuado para:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;conversaciones diarias;&lt;/li&gt;
&lt;li&gt;preguntas rápidas;&lt;/li&gt;
&lt;li&gt;escritura normal;&lt;/li&gt;
&lt;li&gt;resumir artículos;&lt;/li&gt;
&lt;li&gt;reescribir correos;&lt;/li&gt;
&lt;li&gt;explicar código ligero;&lt;/li&gt;
&lt;li&gt;tablas y listas sencillas;&lt;/li&gt;
&lt;li&gt;tareas que no requieren razonamiento prolongado.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La ventaja principal de Instant es la velocidad y su disponibilidad predeterminada. No necesitas seleccionar manualmente un modo de razonamiento cada vez, ni pagar más latencia por preguntas normales.&lt;/p&gt;
&lt;p&gt;También cambia el estilo predeterminado: OpenAI destaca que GPT-5.5 Instant responde de forma más clara y concisa, con mayor personalización. Para usuarios normales, eso lo hace más adecuado como modelo abierto todo el día.&lt;/p&gt;
&lt;p&gt;La advertencia es que Instant no es el modo más potente. Para matemáticas complejas, código largo, diseño de arquitectura, análisis de múltiples archivos o investigación seria, puede cambiar automáticamente a Thinking, o quizá tengas que seleccionar Thinking manualmente.&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-thinking-el-modo-principal-para-tareas-complejas&#34;&gt;GPT-5.5 Thinking: el modo principal para tareas complejas
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; es el modo de razonamiento más adecuado para tareas complejas.&lt;/p&gt;
&lt;p&gt;Encaja con:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;depuración de código;&lt;/li&gt;
&lt;li&gt;diseño de arquitectura;&lt;/li&gt;
&lt;li&gt;razonamiento de varios pasos;&lt;/li&gt;
&lt;li&gt;análisis de documentos largos;&lt;/li&gt;
&lt;li&gt;organización de materiales académicos;&lt;/li&gt;
&lt;li&gt;simulación de escenarios de negocio;&lt;/li&gt;
&lt;li&gt;explicación de análisis de datos;&lt;/li&gt;
&lt;li&gt;tareas que requieren comparación, ponderación y verificación.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking dedica más tiempo al razonamiento. El Help Center de OpenAI indica que, cuando GPT-5.5 Thinking o GPT-5.5 Pro empiezan a razonar, pueden mostrar primero un breve preamble explicando lo que planean hacer. El usuario también puede añadir instrucciones mientras el modelo sigue thinking para ajustar la dirección antes.&lt;/p&gt;
&lt;p&gt;En ChatGPT, al elegir Thinking manualmente, también se puede ajustar el thinking time. Según la explicación oficial, los usuarios Plus y Business pueden usar &lt;code&gt;Standard&lt;/code&gt; y &lt;code&gt;Extended&lt;/code&gt;; los usuarios Pro tienen además opciones como &lt;code&gt;Light&lt;/code&gt; y &lt;code&gt;Heavy&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Mi interpretación: Thinking es la opción predeterminada para trabajar en serio. Si la tarea implica varios pasos, contexto largo o mayores requisitos de precisión, es más adecuado que Instant.&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-pro-nivel-de-investigación-más-pesado-y-más-riguroso&#34;&gt;GPT-5.5 Pro: nivel de investigación, más pesado y más riguroso
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Pro&lt;/code&gt; es el modo para problemas más difíciles y trabajos de mayor precisión.&lt;/p&gt;
&lt;p&gt;Es adecuado para:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;análisis de materiales legales;&lt;/li&gt;
&lt;li&gt;investigación de negocio;&lt;/li&gt;
&lt;li&gt;educación y diseño curricular;&lt;/li&gt;
&lt;li&gt;ciencia de datos;&lt;/li&gt;
&lt;li&gt;síntesis de literatura científica;&lt;/li&gt;
&lt;li&gt;revisión profunda antes de decisiones de alto riesgo;&lt;/li&gt;
&lt;li&gt;tareas con múltiples documentos, múltiples restricciones y múltiples rondas de verificación.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En el anuncio de GPT-5.5, OpenAI señala que los primeros evaluadores consideraron que GPT-5.5 Pro mejoraba frente a GPT-5.4 Pro en completitud, estructura, precisión, relevancia y utilidad, especialmente en negocios, derecho, educación y ciencia de datos.&lt;/p&gt;
&lt;p&gt;La desventaja también es clara: Pro es más lento y pesado, y no está pensado para cada pregunta pequeña. Se parece más a un revisor experto o socio de investigación que a una entrada diaria de chat.&lt;/p&gt;
&lt;p&gt;Además, Pro tiene limitaciones específicas de herramientas. El Help Center de OpenAI indica que Apps, Memory, Canvas y generación de imágenes no están disponibles en Pro. Si tu tarea necesita esas funciones de ChatGPT, quizá sea mejor usar Instant o Thinking.&lt;/p&gt;
&lt;h2 id=&#34;diferencias-de-soporte-de-herramientas&#34;&gt;Diferencias de soporte de herramientas
&lt;/h2&gt;&lt;p&gt;Según el Help Center de OpenAI, &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; y &lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; admiten herramientas comunes de ChatGPT, entre ellas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web search;&lt;/li&gt;
&lt;li&gt;Data analysis;&lt;/li&gt;
&lt;li&gt;Image analysis;&lt;/li&gt;
&lt;li&gt;File analysis;&lt;/li&gt;
&lt;li&gt;Canvas;&lt;/li&gt;
&lt;li&gt;Image generation;&lt;/li&gt;
&lt;li&gt;Memory;&lt;/li&gt;
&lt;li&gt;Custom Instructions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5 Pro&lt;/code&gt; se orienta más al razonamiento de investigación, pero no todas las herramientas de ChatGPT están disponibles. Presta especial atención:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apps no está disponible;&lt;/li&gt;
&lt;li&gt;Memory no está disponible;&lt;/li&gt;
&lt;li&gt;Canvas no está disponible;&lt;/li&gt;
&lt;li&gt;la generación de imágenes no está disponible.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por eso, al elegir modelo, no basta con preguntar &amp;ldquo;cuál es más inteligente&amp;rdquo;; también hay que mirar qué herramientas necesitas.&lt;/p&gt;
&lt;h2 id=&#34;diferencias-de-ventana-de-contexto&#34;&gt;Diferencias de ventana de contexto
&lt;/h2&gt;&lt;p&gt;El Help Center de OpenAI describe aproximadamente así las ventanas de contexto en ChatGPT:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Modo&lt;/th&gt;
          &lt;th&gt;Ventana de contexto&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Instant&lt;/td&gt;
          &lt;td&gt;Free: 16K; Plus/Business: 32K; Pro/Enterprise: 128K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Thinking&lt;/td&gt;
          &lt;td&gt;Normalmente 256K al seleccionarlo manualmente en planes de pago; hasta 400K en Pro&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Esto significa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;para conversaciones normales y documentos cortos, Instant basta;&lt;/li&gt;
&lt;li&gt;para trabajo con múltiples archivos, investigación de varias rondas y análisis de bases de código largas, Thinking es más adecuado;&lt;/li&gt;
&lt;li&gt;para tareas especialmente largas, complejas y de alta precisión, los usuarios Pro pueden aprovechar más contexto y razonamiento más pesado.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;cómo-elegir&#34;&gt;Cómo elegir
&lt;/h2&gt;&lt;h3 id=&#34;preguntas-diarias&#34;&gt;Preguntas diarias
&lt;/h3&gt;&lt;p&gt;Usa &lt;code&gt;GPT-5.5 Instant&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Es rápido, suficientemente inteligente y adecuado para preguntar, escribir y editar de forma rápida.&lt;/p&gt;
&lt;h3 id=&#34;escribir-resumir-y-editar-correos&#34;&gt;Escribir, resumir y editar correos
&lt;/h3&gt;&lt;p&gt;Empieza con &lt;code&gt;GPT-5.5 Instant&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si el artículo es largo, necesita reestructuración o requiere varias rondas de revisión, cambia a &lt;code&gt;GPT-5.5 Thinking&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;programación-y-depuración&#34;&gt;Programación y depuración
&lt;/h3&gt;&lt;p&gt;Para explicaciones simples de código, usa &lt;code&gt;Instant&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para depurar múltiples archivos, diseñar arquitectura o analizar errores complejos, usa &lt;code&gt;Thinking&lt;/code&gt;. Para problemas de ingeniería muy difíciles y prolongados, considera &lt;code&gt;Pro&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;investigación-y-análisis-de-materiales&#34;&gt;Investigación y análisis de materiales
&lt;/h3&gt;&lt;p&gt;Para organizar materiales normales, usa &lt;code&gt;Thinking&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para derecho, negocios, investigación científica y ciencia de datos, donde se necesita mayor precisión, &lt;code&gt;Pro&lt;/code&gt; es más adecuado.&lt;/p&gt;
&lt;h3 id=&#34;tareas-que-necesitan-generación-de-imágenes-canvas-o-memory&#34;&gt;Tareas que necesitan generación de imágenes, Canvas o Memory
&lt;/h3&gt;&lt;p&gt;Prioriza &lt;code&gt;Instant&lt;/code&gt; o &lt;code&gt;Thinking&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;No elijas &lt;code&gt;Pro&lt;/code&gt; por defecto, porque Pro no admite algunas herramientas de ChatGPT.&lt;/p&gt;
&lt;h2 id=&#34;conclusión-breve&#34;&gt;Conclusión breve
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; es el modelo predeterminado diario: rápido, claro, eficiente en cuota y adecuado para la mayoría de tareas comunes.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; es el modo principal para tareas complejas: código, investigación, documentos largos, análisis y razonamiento de varios pasos.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5 Pro&lt;/code&gt; es el modo de investigación de alta precisión: adecuado para tareas más difíciles, importantes y rigurosas, pero con más limitaciones de velocidad y herramientas.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5&lt;/code&gt; en sí es más bien el nombre general de esta generación. En la práctica, la elección real es si en ChatGPT seleccionas &lt;code&gt;Instant&lt;/code&gt;, &lt;code&gt;Thinking&lt;/code&gt; o &lt;code&gt;Pro&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;enlaces-relacionados&#34;&gt;Enlaces relacionados
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Anuncio de GPT-5.5 Instant: &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/gpt-5-5-instant/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/index/gpt-5-5-instant/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Anuncio de GPT-5.5: &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-gpt-5-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/index/introducing-gpt-5-5/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GPT-5.5 in ChatGPT Help Center: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11909943-gpt-53-and-gpt-55-in-chatgpt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/11909943-gpt-53-and-gpt-55-in-chatgpt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>En qué se diferencian los mecanismos de memoria de ChatGPT, Claude Code y Gemini</title>
        <link>https://knightli.com/es/2026/05/07/chatgpt-claude-code-gemini-memory-comparison/</link>
        <pubDate>Thu, 07 May 2026 14:47:17 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/07/chatgpt-claude-code-gemini-memory-comparison/</guid>
        <description>&lt;p&gt;La &amp;ldquo;memoria&amp;rdquo; se está volviendo cada vez más importante en los productos de IA. Marca el paso de conversaciones puntuales a colaboración de largo plazo: ya no necesitas volver a explicar tu contexto, repetir tus preferencias ni pedir al modelo que entienda el mismo proyecto una y otra vez.&lt;/p&gt;
&lt;p&gt;Pero memoria no significa lo mismo en todos los productos. &lt;code&gt;ChatGPT&lt;/code&gt;, &lt;code&gt;Claude Code&lt;/code&gt; y &lt;code&gt;Gemini&lt;/code&gt; intentan ayudar a la IA a recordar más tiempo, pero sus objetivos, lugares de almacenamiento, transparencia y casos de uso son muy distintos.&lt;/p&gt;
&lt;p&gt;Al 7 de mayo de 2026, se pueden entender aproximadamente como tres tipos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT se parece más a memoria de asistente personal.&lt;/li&gt;
&lt;li&gt;Claude Code se parece más a memoria de proyecto de ingeniería.&lt;/li&gt;
&lt;li&gt;Gemini se parece más a contexto del ecosistema Google.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;chatgpt-preferencias-de-largo-plazo-alrededor-de-la-persona&#34;&gt;ChatGPT: preferencias de largo plazo alrededor de la persona
&lt;/h2&gt;&lt;p&gt;La memoria de ChatGPT está diseñada principalmente para colaboración personal. Le importa quién eres, qué prefieres y en qué trabajas a lo largo del tiempo.&lt;/p&gt;
&lt;p&gt;OpenAI separa actualmente la memoria de ChatGPT en &lt;code&gt;saved memories&lt;/code&gt; y &lt;code&gt;chat history&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;saved memories&lt;/code&gt; son piezas importantes de información que ChatGPT guarda, como tu nombre, preferencias, objetivos, stack tecnológico habitual y hábitos de escritura. Puedes pedirle explícitamente que recuerde algo, y también puede guardar información de una conversación cuando cree que será útil más adelante.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;chat history&lt;/code&gt; permite a ChatGPT consultar conversaciones anteriores al responder. No significa que cada chat se convierta en una memoria permanente. Más bien, ChatGPT puede buscar en conversaciones pasadas contexto relevante cuando lo necesita.&lt;/p&gt;
&lt;p&gt;La lógica central de ChatGPT es: entender al mismo usuario entre sesiones.&lt;/p&gt;
&lt;p&gt;Ejemplos típicos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Mantén mis ejemplos de código concisos.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Uso principalmente Python y TypeScript.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Estoy escribiendo un blog Hugo sobre herramientas de IA.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Prefiero conclusiones primero y detalles después.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estas memorias no están ligadas a un solo proyecto. Siguen a la cuenta y a los hábitos de trabajo del usuario.&lt;/p&gt;
&lt;h2 id=&#34;memory-sources-hacer-más-visible-la-personalización&#34;&gt;Memory Sources: hacer más visible la personalización
&lt;/h2&gt;&lt;p&gt;OpenAI destacó &lt;code&gt;Memory sources&lt;/code&gt; en su actualización de mayo de 2026.&lt;/p&gt;
&lt;p&gt;El objetivo no es añadir otro tipo de memoria, sino mostrar al usuario qué fuentes consultó ChatGPT al personalizar una respuesta. Según los documentos de ayuda de OpenAI, Memory Sources puede mostrar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chats anteriores.&lt;/li&gt;
&lt;li&gt;Memorias guardadas.&lt;/li&gt;
&lt;li&gt;Instrucciones personalizadas.&lt;/li&gt;
&lt;li&gt;Archivos de la biblioteca de archivos.&lt;/li&gt;
&lt;li&gt;Correos de Gmail conectado.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La visibilidad de archivos y Gmail depende del plan, la región y el estado de conexión. OpenAI también dice que Memory sources puede no mostrar todos los factores que influyeron en una respuesta, pero ayuda a entender y gestionar la personalización.&lt;/p&gt;
&lt;p&gt;Esto importa. Cuanto más puede la IA &amp;ldquo;recordarte&amp;rdquo;, más necesitas saber qué usó para responder. De lo contrario, la personalización se vuelve una caja negra: parece conocerte, pero no sabes por qué.&lt;/p&gt;
&lt;p&gt;La ventaja de ChatGPT es su comprensión de preferencias personales entre sesiones y temas. El riesgo es que las memorias se vuelvan obsoletas, o que el usuario olvide que una memoria antigua sigue afectando respuestas. Vale la pena limpiar periódicamente memorias guardadas y chats antiguos.&lt;/p&gt;
&lt;h2 id=&#34;claude-code-alrededor-de-codebases-y-reglas-de-ingeniería&#34;&gt;Claude Code: alrededor de codebases y reglas de ingeniería
&lt;/h2&gt;&lt;p&gt;La memoria de Claude Code está más orientada a ingeniería. Le importan menos las preferencias cotidianas del usuario y más cómo debe modificarse este codebase.&lt;/p&gt;
&lt;p&gt;Claude Code tiene dos mecanismos de memoria que se confunden fácilmente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Memoria explícita del proyecto: &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Memoria automática del proyecto: Auto Memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; es el archivo de memoria de proyecto más básico y estable. Puede vivir en la raíz del proyecto o dentro de subdirectorios. Claude Code lee estos archivos como instrucciones de proyecto y reglas operativas.&lt;/p&gt;
&lt;p&gt;Buen contenido para &lt;code&gt;CLAUDE.md&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comandos comunes de build, test y lint.&lt;/li&gt;
&lt;li&gt;Reglas de estilo y nombres.&lt;/li&gt;
&lt;li&gt;Notas de arquitectura del proyecto.&lt;/li&gt;
&lt;li&gt;Límites de módulos y zonas de riesgo.&lt;/li&gt;
&lt;li&gt;Convenciones del equipo y flujo de commits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si &lt;code&gt;CLAUDE.md&lt;/code&gt; se guarda en el repositorio, puede versionarse con Git y compartirse como guía de agente para el equipo. Esto es completamente distinto de la memoria personal en la nube de ChatGPT.&lt;/p&gt;
&lt;h2 id=&#34;claude-code-auto-memory-acumular-experiencia-de-proyecto&#34;&gt;Claude Code Auto Memory: acumular experiencia de proyecto
&lt;/h2&gt;&lt;p&gt;Claude Code también tiene &lt;code&gt;Auto Memory&lt;/code&gt;. Su objetivo es permitir que Claude acumule conocimiento del proyecto entre sesiones sin obligar al usuario a escribir cada nota manualmente.&lt;/p&gt;
&lt;p&gt;Según la documentación de Claude Code, Auto Memory permite a Claude guardar notas mientras trabaja, como comandos de build, descubrimientos de depuración, notas de arquitectura, preferencias de estilo y hábitos de workflow. No guarda cada sesión, sino que decide qué puede ser útil más adelante.&lt;/p&gt;
&lt;p&gt;Un malentendido común es creer que Auto Memory escribe por defecto en &lt;code&gt;.claude/memory.md&lt;/code&gt; dentro de la raíz del proyecto. La documentación oficial dice que cada proyecto tiene su propio directorio de memoria bajo el home del usuario, con una ruta similar a:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/.claude/projects/&amp;lt;project&amp;gt;/memory/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;MEMORY.md&lt;/code&gt; carga las primeras 200 líneas o 25KB al inicio de cada conversación, mientras que el contenido detallado puede dividirse en otros archivos temáticos. Los archivos de Auto Memory son Markdown locales, y el usuario puede verlos, editarlos o borrarlos mediante &lt;code&gt;/memory&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Esto hace que la memoria de Claude Code se parezca más a una base local de conocimiento de proyecto. Está más cerca del codebase que la memoria personal de ChatGPT, y es más dinámica que un simple &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pero Auto Memory es local a la máquina. No sigue naturalmente al repositorio hacia otras máquinas o entornos cloud. Para reglas estables compartidas por el equipo, ponlas en el &lt;code&gt;CLAUDE.md&lt;/code&gt; del repositorio.&lt;/p&gt;
&lt;h2 id=&#34;gemini-alrededor-del-contexto-del-ecosistema-google&#34;&gt;Gemini: alrededor del contexto del ecosistema Google
&lt;/h2&gt;&lt;p&gt;La lógica de memoria de Gemini vuelve a ser distinta.&lt;/p&gt;
&lt;p&gt;Gemini también soporta información guardada y referencias a chats anteriores. Los documentos de ayuda de Google dicen que los usuarios pueden guardar información sobre vida, trabajo o preferencias, y Gemini puede consultar chats pasados antes de responder. Cuando usa esta información, la respuesta puede mostrar fuentes como &lt;code&gt;Your saved info&lt;/code&gt; o &lt;code&gt;Previous chats&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pero la diferenciación de Gemini no es solo &amp;ldquo;guardar unas preferencias&amp;rdquo;. Es la integración con el ecosistema Google.&lt;/p&gt;
&lt;p&gt;Con autorización del usuario y disponibilidad de funciones, Gemini puede acceder a contexto de apps conectadas de Google como Gmail, Google Drive, Docs y Sheets. Su ventaja no es hacer que el usuario le enseñe cada dato manualmente, sino convertir los datos existentes de la cuenta Google en contexto de trabajo buscable.&lt;/p&gt;
&lt;p&gt;Una diferencia típica:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT recuerda: &amp;ldquo;Últimamente he estado reparando una unidad de cinta LTO.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Gemini puede encontrar el correo de confirmación de compra en Gmail o leer notas de reparación desde Drive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto no significa que Gemini pueda leer todos los datos de Google sin condiciones. Depende del tipo de cuenta, región, permisos, apps conectadas, ajustes de Keep Activity y disponibilidad del producto. Las cuentas empresariales y escolares también pueden estar controladas por administradores de Google Workspace.&lt;/p&gt;
&lt;p&gt;Más exactamente, la memoria de Gemini es una combinación de información guardada, chats anteriores y datos conectados del ecosistema Google.&lt;/p&gt;
&lt;h2 id=&#34;diferencias-centrales&#34;&gt;Diferencias centrales
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Dimensión&lt;/th&gt;
          &lt;th&gt;ChatGPT&lt;/th&gt;
          &lt;th&gt;Claude Code&lt;/th&gt;
          &lt;th&gt;Gemini&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Objeto central&lt;/td&gt;
          &lt;td&gt;Persona y preferencias&lt;/td&gt;
          &lt;td&gt;Proyecto y codebase&lt;/td&gt;
          &lt;td&gt;Cuenta Google y datos del ecosistema&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Memoria típica&lt;/td&gt;
          &lt;td&gt;Preferencias, contexto personal, objetivos de largo plazo&lt;/td&gt;
          &lt;td&gt;Arquitectura, comandos, convenciones, experiencia de depuración&lt;/td&gt;
          &lt;td&gt;Información guardada, chats anteriores, contexto de Gmail/Drive/Docs&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Forma de almacenamiento&lt;/td&gt;
          &lt;td&gt;Memoria y contexto de chat en la cuenta OpenAI&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;MEMORY.md&lt;/code&gt;, archivos Markdown locales&lt;/td&gt;
          &lt;td&gt;Actividad de cuenta Google, información guardada, datos de apps conectadas&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Transparencia&lt;/td&gt;
          &lt;td&gt;Memory sources muestra parte de la fuente&lt;/td&gt;
          &lt;td&gt;Los archivos Markdown se pueden abrir y editar&lt;/td&gt;
          &lt;td&gt;Se gestiona con indicaciones de fuente, Gemini Apps Activity y ajustes Google&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Capacidad entre proyectos&lt;/td&gt;
          &lt;td&gt;Fuerte, sigue a la cuenta de usuario&lt;/td&gt;
          &lt;td&gt;Débil, principalmente sigue al proyecto o memoria local&lt;/td&gt;
          &lt;td&gt;Fuerte, depende de datos y permisos de Google&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Compartición en equipo&lt;/td&gt;
          &lt;td&gt;No adecuada para compartir directamente&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; puede compartirse por Git&lt;/td&gt;
          &lt;td&gt;Depende sobre todo de Workspace y permisos&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Mejor para&lt;/td&gt;
          &lt;td&gt;Preferencias personales y comportamiento de asistente a largo plazo&lt;/td&gt;
          &lt;td&gt;Proyectos de código largos y colaboración con agentes&lt;/td&gt;
          &lt;td&gt;Recuperación en Google Workspace y trabajo entre herramientas&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;cómo-elegir&#34;&gt;Cómo elegir
&lt;/h2&gt;&lt;p&gt;Si quieres que la IA recuerde quién eres, qué estilo prefieres y cómo sueles trabajar, la memoria de ChatGPT es más adecuada.&lt;/p&gt;
&lt;p&gt;Sirve para guardar preferencias personales como estilo de escritura, stack técnico, formato de respuesta, contexto profesional y dirección de proyectos de largo plazo. Su foco es reducir el coste de presentarte de nuevo para que cada conversación empiece más rápido.&lt;/p&gt;
&lt;p&gt;Si quieres que la IA recuerde cómo debe cambiarse un codebase, qué comandos funcionan y qué trampas evitar, Claude Code es más adecuado.&lt;/p&gt;
&lt;p&gt;Pon reglas estables en &lt;code&gt;CLAUDE.md&lt;/code&gt; para compartirlas con el equipo. Deja que Auto Memory ayude con experiencia dinámica. Las decisiones importantes deberían organizarse aún en documentación o &lt;code&gt;CLAUDE.md&lt;/code&gt;, no quedar solo en memoria automática local.&lt;/p&gt;
&lt;p&gt;Si la mayoría de tus materiales viven en Gmail, Drive, Docs y Sheets, el contexto de ecosistema de Gemini tiene ventaja.&lt;/p&gt;
&lt;p&gt;Es útil para encontrar correos antiguos, organizar documentos de Drive y conectar calendario y materiales de oficina. La clave al usar Gemini no es recordarle todo repetidamente en chat, sino asegurarse de que las conexiones de apps, permisos y ajustes de actividad relevantes estén correctos.&lt;/p&gt;
&lt;h2 id=&#34;una-división-práctica-del-trabajo&#34;&gt;Una división práctica del trabajo
&lt;/h2&gt;&lt;p&gt;Puedes dividirlos así:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT recuerda preferencias personales generales.&lt;/li&gt;
&lt;li&gt;Claude Code recuerda conocimiento de ingeniería para un repositorio.&lt;/li&gt;
&lt;li&gt;Gemini recupera materiales de tu ecosistema Google.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En otras palabras, ChatGPT es como un secretario personal, Claude Code como un ingeniero senior dentro del proyecto, y Gemini como un indexador de tu cuenta Google.&lt;/p&gt;
&lt;p&gt;No hay ganador absoluto. Tienen objetivos distintos.&lt;/p&gt;
&lt;p&gt;El mayor error es mezclarlos. Las preferencias personales no siempre pertenecen a la memoria de proyecto; la arquitectura del proyecto no siempre pertenece a la memoria personal en la nube; y recuperar datos del ecosistema Google no significa que el modelo te entienda de verdad a largo plazo.&lt;/p&gt;
&lt;h2 id=&#34;lectura-breve&#34;&gt;Lectura breve
&lt;/h2&gt;&lt;p&gt;La siguiente etapa de la memoria en IA no es simplemente &amp;ldquo;recordar más&amp;rdquo;. La memoria necesita capas, visibilidad y control.&lt;/p&gt;
&lt;p&gt;ChatGPT se centra en personalización entre sesiones. Claude Code se centra en continuidad de proyectos de código. Gemini se centra en contexto del ecosistema Google. Una buena colaboración de largo plazo con IA no pone toda la información en una sola caja negra; mantiene cada tipo de memoria en el lugar correcto.&lt;/p&gt;
&lt;p&gt;Pon preferencias personales en memoria personal, reglas de ingeniería en el codebase, y materiales históricos en los sistemas originales de documentos y correo. El trabajo de la IA es llamar el contexto correcto cuando hace falta, no mezclar todo en una sola pila.&lt;/p&gt;
&lt;h2 id=&#34;enlaces&#34;&gt;Enlaces
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;OpenAI Memory FAQ: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/8590148-memory-faq&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/8590148-memory-faq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ChatGPT Release Notes: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Claude Code Memory: &lt;a class=&#34;link&#34; href=&#34;https://code.claude.com/docs/en/memory&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://code.claude.com/docs/en/memory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gemini Saved info: &lt;a class=&#34;link&#34; href=&#34;https://support.google.com/gemini/answer/15637730&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://support.google.com/gemini/answer/15637730&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gemini Apps Privacy Hub: &lt;a class=&#34;link&#34; href=&#34;https://support.google.com/gemini/answer/13594961&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://support.google.com/gemini/answer/13594961&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Qué revelan las ChatGPT Release Notes sobre el ritmo de producto de OpenAI</title>
        <link>https://knightli.com/es/2026/05/07/chatgpt-release-notes-product-rhythm/</link>
        <pubDate>Thu, 07 May 2026 14:31:22 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/07/chatgpt-release-notes-product-rhythm/</guid>
        <description>&lt;p&gt;La página &lt;code&gt;ChatGPT Release Notes&lt;/code&gt; de OpenAI es una forma directa de observar el ritmo de producto de ChatGPT. La página registra de forma continua los cambios en modelos, funciones, seguridad de cuenta, integraciones de apps y experiencia de cliente.&lt;/p&gt;
&lt;p&gt;Al 7 de mayo de 2026, la página muestra la actualización más reciente como &amp;ldquo;ayer&amp;rdquo;, con las entradas nuevas concentradas el 5 de mayo de 2026. Pueden parecer actualizaciones normales, pero juntas muestran hacia dónde va ChatGPT: un modelo predeterminado más fiable, memoria más controlable, flujos de oficina más profundos y mayor seguridad de cuenta.&lt;/p&gt;
&lt;h2 id=&#34;primer-foco-reciente-las-fuentes-de-memoria-se-vuelven-visibles&#34;&gt;Primer foco reciente: las fuentes de memoria se vuelven visibles
&lt;/h2&gt;&lt;p&gt;La primera actualización del 5 de mayo trata sobre mejoras de memoria en ChatGPT.&lt;/p&gt;
&lt;p&gt;OpenAI dice que los usuarios Plus y Pro recibirán gradualmente respuestas más personalizadas y continuas. ChatGPT puede usar mejor chats anteriores, memorias guardadas, archivos disponibles y contexto de Gmail conectado para ofrecer sugerencias, recomendaciones y próximos pasos más adaptados.&lt;/p&gt;
&lt;p&gt;El valor de esta capacidad se vuelve claro en el uso prolongado. Si un usuario trabaja en un proyecto, escribe una serie de artículos, sigue un conjunto de correos o maneja repetidamente tareas similares, lo más molesto es volver a explicar el contexto cada vez. Una memoria más fuerte busca reducir esa repetición.&lt;/p&gt;
&lt;p&gt;Pero cuanto más fuerte se vuelve la memoria, más necesitan los usuarios saber qué contexto usó el modelo. Por eso OpenAI está introduciendo &lt;code&gt;memory sources&lt;/code&gt;. Los usuarios pueden ver memorias guardadas relevantes, chats anteriores, instrucciones personalizadas y, en ciertos casos, archivos y mensajes de Gmail referenciados debajo de una respuesta.&lt;/p&gt;
&lt;p&gt;Si la información está desactualizada, es inexacta o ya no es relevante, los usuarios pueden corregirla, eliminarla o marcarla como no relevante.&lt;/p&gt;
&lt;h2 id=&#34;la-personalización-no-es-solo-conocerte-mejor&#34;&gt;La personalización no es solo &amp;ldquo;conocerte mejor&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Cuando se habla de personalización en IA, la conversación suele centrarse solo en si el modelo entiende mejor al usuario. Pero una personalización sostenible debe responder tres preguntas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;¿Puede el usuario ver qué consultó el modelo?&lt;/li&gt;
&lt;li&gt;¿Puede editar o eliminar esa información?&lt;/li&gt;
&lt;li&gt;¿Puede apagar la memoria cuando no la necesita?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Las release notes dicen claramente que las fuentes de memoria solo se muestran dentro de la experiencia de la propia cuenta del usuario y no se exponen cuando se comparte un chat. Los usuarios también pueden borrar chats, usar chats temporales, desactivar la memoria, desconectar apps y gestionar si su contenido se usa para mejorar modelos.&lt;/p&gt;
&lt;p&gt;Esto muestra que OpenAI no solo está añadiendo capacidad de personalización. También está añadiendo superficies de control. Para un asistente de largo plazo, ese paso importa.&lt;/p&gt;
&lt;h2 id=&#34;segundo-foco-reciente-gpt-55-instant-se-vuelve-el-modelo-predeterminado&#34;&gt;Segundo foco reciente: GPT-5.5 Instant se vuelve el modelo predeterminado
&lt;/h2&gt;&lt;p&gt;Ese mismo día, OpenAI también empezó a desplegar &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; como nuevo modelo predeterminado de ChatGPT, reemplazando &lt;code&gt;GPT-5.3 Instant&lt;/code&gt; para todos los usuarios.&lt;/p&gt;
&lt;p&gt;Las release notes describen la actualización del modelo en términos prácticos: más preciso, más claro, más conciso, mejor en comprensión de imágenes y preguntas STEM, y mejor al decidir cuándo usar búsqueda web.&lt;/p&gt;
&lt;p&gt;Las actualizaciones del modelo predeterminado tienen mucho impacto. La mayoría de usuarios no cambia de modelo todos los días. La calidad de ChatGPT que perciben es la calidad del modelo predeterminado. Si el modelo predeterminado tiene menos alucinaciones, menos relleno y menos preguntas de seguimiento inútiles, la experiencia real mejora de forma visible.&lt;/p&gt;
&lt;p&gt;OpenAI también dice que GPT-5.5 Instant reduce el exceso de formato y el contenido decorativo innecesario. Puede parecer un detalle pequeño, pero está muy cerca del uso diario. Muchos usuarios no necesitan un ensayo totalmente estructurado. Necesitan una respuesta precisa, directa y accionable.&lt;/p&gt;
&lt;p&gt;Los usuarios de pago podrán seguir usando GPT-5.3 Instant durante tres meses antes de que se retire.&lt;/p&gt;
&lt;h2 id=&#34;tercer-foco-reciente-chatgpt-entra-en-excel-y-google-sheets&#34;&gt;Tercer foco reciente: ChatGPT entra en Excel y Google Sheets
&lt;/h2&gt;&lt;p&gt;La tercera actualización del 5 de mayo es el lanzamiento global de ChatGPT para Excel y Google Sheets.&lt;/p&gt;
&lt;p&gt;Esta función coloca ChatGPT en la barra lateral de Microsoft Excel y Google Sheets, permitiendo crear, actualizar y entender datos dentro de hojas de cálculo. Los escenarios oficiales incluyen trackers, presupuestos, fórmulas, archivos con varias pestañas, análisis de escenarios y limpieza de hojas.&lt;/p&gt;
&lt;p&gt;Esto muestra que ChatGPT no se queda dentro de una ventana de chat. Está entrando en los lugares donde los usuarios ya trabajan.&lt;/p&gt;
&lt;p&gt;Para usuarios de oficina, las hojas de cálculo son una superficie de trabajo muy común. Muchas empresas, equipos y personas guardan datos de negocio no en plataformas complejas de datos, sino en montones de archivos de Excel y Google Sheets. Si ChatGPT puede entender datos, escribir fórmulas, organizar varias hojas y explicar resultados junto a la hoja de cálculo, la barrera es mucho menor que copiar todo a una ventana de chat.&lt;/p&gt;
&lt;p&gt;OpenAI también recuerda a los usuarios que revisen los resultados antes de confiar en fórmulas o análisis. Es realista: la IA puede acelerar el trabajo con hojas de cálculo, pero no puede asumir toda la responsabilidad de decisiones financieras, operativas o de negocio.&lt;/p&gt;
&lt;h2 id=&#34;base-de-finales-de-abril-seguridad-y-selección-de-modelos&#34;&gt;Base de finales de abril: seguridad y selección de modelos
&lt;/h2&gt;&lt;p&gt;Mirando hacia atrás, la actualización &lt;code&gt;Advanced Account Security&lt;/code&gt; del 30 de abril también merece atención.&lt;/p&gt;
&lt;p&gt;Es una configuración de seguridad opcional para cuentas personales de ChatGPT. Cuando se activa, la cuenta usa métodos de inicio de sesión más fuertes, como passkeys o llaves de seguridad compatibles, y desactiva rutas más débiles como contraseña, códigos por email o SMS y recuperación de cuenta por email. También incluye claves de recuperación, sesiones activas más cortas, notificaciones de inicio de sesión y controles de gestión de sesión.&lt;/p&gt;
&lt;p&gt;Esto muestra que las cuentas de ChatGPT se están volviendo más importantes. A medida que archivos, memorias, conexiones de apps, correo, hojas de cálculo y proyectos de trabajo entran en ChatGPT, la seguridad de cuenta deja de ser solo un tema de login. Se relaciona con el contexto de trabajo de largo plazo del usuario.&lt;/p&gt;
&lt;p&gt;El 28 de abril, OpenAI también acercó la selección de modelos al compositor y movió los controles de &lt;code&gt;thinking effort&lt;/code&gt; para modelos Thinking y Pro al selector de modelos. Es un cambio típico de detalle de producto: a medida que crece el número de modelos, los usuarios necesitan una forma más fácil de elegir la herramienta correcta antes de enviar un mensaje.&lt;/p&gt;
&lt;h2 id=&#34;otra-dirección-de-finales-de-abril-respuestas-comunes-más-rápidas&#34;&gt;Otra dirección de finales de abril: respuestas comunes más rápidas
&lt;/h2&gt;&lt;p&gt;El 22 de abril, ChatGPT introdujo &lt;code&gt;Fast answers&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Esta función está pensada para consultas comunes de información. Cuando una pregunta no necesita personalización y ChatGPT tiene una respuesta de alta confianza, puede devolver resultados más rápido. Fast answers no usa chats anteriores ni memoria, y los usuarios pueden desactivarlas en la configuración de personalización.&lt;/p&gt;
&lt;p&gt;Puede parecer lo contrario de una memoria más fuerte, pero sigue la misma lógica de producto: distintas preguntas necesitan distintos tratamientos.&lt;/p&gt;
&lt;p&gt;Algunas preguntas necesitan contexto de largo plazo, como &amp;ldquo;ayúdame a continuar el plan de ese proyecto de la semana pasada&amp;rdquo;. Otras solo necesitan una respuesta rápida y precisa, como &amp;ldquo;cuáles son las Siete Maravillas del Mundo&amp;rdquo;. La primera necesita memoria y contexto; la segunda necesita velocidad y claridad. ChatGPT está separando esos caminos.&lt;/p&gt;
&lt;h2 id=&#34;el-ritmo-de-producto-está-cambiando&#34;&gt;El ritmo de producto está cambiando
&lt;/h2&gt;&lt;p&gt;Estas release notes muestran que las actualizaciones de ChatGPT ya no son solo lanzamientos de modelos.&lt;/p&gt;
&lt;p&gt;Ahora las actualizaciones cubren:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Calidad del modelo predeterminado.&lt;/li&gt;
&lt;li&gt;Memoria y personalización.&lt;/li&gt;
&lt;li&gt;Conexiones de apps y complementos de oficina.&lt;/li&gt;
&lt;li&gt;Seguridad de cuenta.&lt;/li&gt;
&lt;li&gt;Selección de modelos y puntos de entrada de interacción.&lt;/li&gt;
&lt;li&gt;Respuestas rápidas y experiencia móvil.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto significa que ChatGPT está pasando de ser un único producto de chat con IA a una plataforma de trabajo más completa. La capacidad del modelo sigue siendo importante, pero la experiencia de producto, la gestión de contexto, los puntos de entrada de herramientas, la seguridad de cuenta y las integraciones de terceros importan tanto como eso.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;Lo más interesante de estas ChatGPT Release Notes no es una actualización concreta, sino la dirección que forman juntas.&lt;/p&gt;
&lt;p&gt;OpenAI está haciendo que ChatGPT sea más rápido, más consciente del contexto, más presente en flujos de oficina y también más controlable y seguro. GPT-5.5 Instant mejora la calidad de respuesta predeterminada, memory sources explica la personalización, Excel y Google Sheets llevan ChatGPT a archivos de trabajo reales, y Advanced Account Security protege un uso de cuenta más pesado.&lt;/p&gt;
&lt;p&gt;De aquí en adelante, la competitividad de ChatGPT no dependerá solo de parámetros de modelo. También dependerá de si OpenAI puede organizar estas actualizaciones en una experiencia de producto estable y clara, en la que los usuarios estén dispuestos a confiar contexto de largo plazo.&lt;/p&gt;
&lt;h2 id=&#34;enlaces&#34;&gt;Enlaces
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ChatGPT Release Notes: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes%253F.ejs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/6825453-chatgpt-release-notes%253F.ejs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Actualización de ChatGPT Release Notes: fuentes de memoria, GPT-5.5 Instant y complementos para hojas de cálculo</title>
        <link>https://knightli.com/es/2026/05/07/chatgpt-release-notes-memory-gpt-5-5-sheets/</link>
        <pubDate>Thu, 07 May 2026 14:30:15 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/07/chatgpt-release-notes-memory-gpt-5-5-sheets/</guid>
        <description>&lt;p&gt;La página &lt;code&gt;ChatGPT Release Notes&lt;/code&gt; de OpenAI se actualizó a principios de mayo de 2026. El último grupo de cambios se concentra en tres cosas: memory sources y una personalización más fuerte en ChatGPT, &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; como nuevo modelo predeterminado, y el lanzamiento global de ChatGPT para Excel y Google Sheets.&lt;/p&gt;
&lt;p&gt;En conjunto, estas actualizaciones apuntan a una dirección clara: ChatGPT sigue moviéndose desde una entrada de chat hacia un asistente de trabajo más continuo, más personalizado y más nativo de las herramientas de oficina.&lt;/p&gt;
&lt;h2 id=&#34;memory-sources-hacen-más-transparente-la-personalización&#34;&gt;Memory sources hacen más transparente la personalización
&lt;/h2&gt;&lt;p&gt;La actualización más importante es &lt;code&gt;memory sources&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;OpenAI dice que los usuarios de ChatGPT Plus y Pro están empezando a recibir mejoras de memoria más fuertes. ChatGPT puede extraer mejor contexto relevante de chats anteriores, memorias guardadas, archivos disponibles y apps de Gmail conectadas para ofrecer ideas, recomendaciones y próximos pasos más adaptados.&lt;/p&gt;
&lt;p&gt;Esto significa que los usuarios no tienen que explicar una y otra vez el contexto del proyecto, preferencias, hábitos o materiales existentes en cada conversación nueva. Para escritura de largo plazo, planificación de proyectos, organización de investigación, aprendizaje y trabajo en equipo, la continuidad mejora.&lt;/p&gt;
&lt;p&gt;Pero cuanto más fuerte se vuelve la personalización, más importante se vuelve la transparencia. Por eso OpenAI introduce memory sources, para que los usuarios puedan ver qué información ayudó a personalizar una respuesta. Los usuarios pueden hacer clic en el icono Sources bajo una respuesta para ver memorias guardadas relevantes, chats anteriores e instrucciones personalizadas. Los usuarios Plus y Pro también pueden ver archivos de su biblioteca y correos referenciados de Gmail conectado.&lt;/p&gt;
&lt;p&gt;Si alguna información está desactualizada, no es relevante o es incorrecta, los usuarios pueden corregirla, eliminarla o marcarla como no relevante.&lt;/p&gt;
&lt;h2 id=&#34;el-control-de-memoria-sigue-siendo-la-clave&#34;&gt;El control de memoria sigue siendo la clave
&lt;/h2&gt;&lt;p&gt;OpenAI también señala que memory sources puede no mostrar todos los factores que dieron forma a una respuesta, y que seguirá mejorando la vista.&lt;/p&gt;
&lt;p&gt;Eso importa. Memory sources no es un &amp;ldquo;registro completo del pensamiento del modelo&amp;rdquo;. Es una interfaz de producto para entender el contexto personalizado. Mejora la visibilidad, pero no puede exponer por completo cada factor que influyó en una respuesta.&lt;/p&gt;
&lt;p&gt;Para privacidad y control, OpenAI dice que memory sources solo aparece dentro de la experiencia de la propia cuenta del usuario. Si un usuario comparte un chat, las fuentes no aparecen en el chat compartido. Los usuarios también pueden borrar chats, usar chats temporales que no usan ni actualizan memoria y no aparecen en el historial, desactivar la memoria, desconectar apps en cualquier momento y gestionar si su contenido se usa para mejorar modelos.&lt;/p&gt;
&lt;p&gt;Esto muestra que la personalización de ChatGPT sigue un camino más claro: hacer que el asistente conozca mejor al usuario, pero también darle formas de ver y gestionar por qué respondió de cierta manera.&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-instant-se-convierte-en-el-modelo-predeterminado&#34;&gt;GPT-5.5 Instant se convierte en el modelo predeterminado
&lt;/h2&gt;&lt;p&gt;Las release notes también confirman que &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; se está desplegando como nuevo modelo predeterminado de ChatGPT, reemplazando &lt;code&gt;GPT-5.3 Instant&lt;/code&gt; para todos los usuarios.&lt;/p&gt;
&lt;p&gt;La actualización del modelo predeterminado mejora varias áreas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Precisión.&lt;/li&gt;
&lt;li&gt;Claridad y concisión.&lt;/li&gt;
&lt;li&gt;Comprensión de imágenes.&lt;/li&gt;
&lt;li&gt;Respuestas STEM.&lt;/li&gt;
&lt;li&gt;Decidir cuándo usar búsqueda web.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI enfatiza que GPT-5.5 Instant es más fiable factual­mente, especialmente para prompts donde la precisión importa. También da respuestas más compactas y directas, reduce preguntas de seguimiento innecesarias y baja el ruido de exceso de formato y contenido decorativo.&lt;/p&gt;
&lt;p&gt;Para los usuarios, esto puede no ser tan visible como un nuevo botón, pero cambia la sensación de abrir ChatGPT cada día: menos desvíos, menos verbosidad y menos formato apilado sobre preguntas simples.&lt;/p&gt;
&lt;h2 id=&#34;la-personalización-y-el-modelo-predeterminado-ahora-trabajan-juntos&#34;&gt;La personalización y el modelo predeterminado ahora trabajan juntos
&lt;/h2&gt;&lt;p&gt;Para usuarios Plus y Pro en la web, GPT-5.5 Instant también puede usar con más eficacia contexto de chats anteriores, archivos y Gmail conectado.&lt;/p&gt;
&lt;p&gt;Esto forma parte de la misma dirección de producto que memory sources. El modelo no solo es &amp;ldquo;más inteligente&amp;rdquo;. También debería saber, cuando corresponde, en qué trabajaste antes, qué te importa y qué materiales ya proporcionaste. Al continuar un proyecto, escribir un plan, organizar información de correo o hacer sugerencias basadas en preferencias pasadas, ChatGPT puede hacer menos preguntas repetidas.&lt;/p&gt;
&lt;p&gt;Los usuarios de pago pueden seguir usando GPT-5.3 Instant durante tres meses mediante la configuración de modelos antes de que se retire.&lt;/p&gt;
&lt;h2 id=&#34;chatgpt-para-excel-y-google-sheets&#34;&gt;ChatGPT para Excel y Google Sheets
&lt;/h2&gt;&lt;p&gt;Otra actualización importante es el lanzamiento global de ChatGPT para Excel y Google Sheets.&lt;/p&gt;
&lt;p&gt;Lleva ChatGPT a una barra lateral dentro de Microsoft Excel y Google Sheets, para que los usuarios puedan crear, actualizar y entender datos en el lugar. OpenAI menciona casos de uso como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trackers.&lt;/li&gt;
&lt;li&gt;Presupuestos.&lt;/li&gt;
&lt;li&gt;Fórmulas.&lt;/li&gt;
&lt;li&gt;Archivos con varias pestañas.&lt;/li&gt;
&lt;li&gt;Trabajo de escenarios.&lt;/li&gt;
&lt;li&gt;Limpieza de hojas de cálculo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Donde esté disponible, también soporta Skills y apps.&lt;/p&gt;
&lt;p&gt;El significado es directo: muchos datos de oficina no viven en un sistema BI especializado. Viven en Excel y Google Sheets. Colocar ChatGPT en la barra lateral de la hoja es más natural que pedir a los usuarios copiar y pegar en una ventana de chat, y facilita entrar en flujos de trabajo reales.&lt;/p&gt;
&lt;h2 id=&#34;límites-de-uso-e-instalación&#34;&gt;Límites de uso e instalación
&lt;/h2&gt;&lt;p&gt;Las release notes dicen que los planes Free y Go incluyen uso limitado, mientras que Plus y Pro usan los mismos límites de uso agentic que Codex. Los usuarios pueden comprar créditos adicionales si necesitan superar los límites del plan.&lt;/p&gt;
&lt;p&gt;La instalación también es directa: instalar ChatGPT para Excel desde Microsoft Marketplace o ChatGPT desde Google Workspace Marketplace, y luego iniciar sesión con una cuenta de ChatGPT elegible.&lt;/p&gt;
&lt;p&gt;OpenAI también recuerda a los usuarios que revisen los resultados antes de confiar en fórmulas o análisis. Ese punto es importante. La IA puede acelerar el trabajo con hojas de cálculo, pero fórmulas, presupuestos, trabajo financiero y análisis de negocio aún necesitan revisión humana.&lt;/p&gt;
&lt;h2 id=&#34;patrón-reciente-de-actualizaciones&#34;&gt;Patrón reciente de actualizaciones
&lt;/h2&gt;&lt;p&gt;Mirando las release notes desde finales de abril hasta principios de mayo, la dirección de ChatGPT se vuelve más clara.&lt;/p&gt;
&lt;p&gt;El 30 de abril, OpenAI introdujo Advanced Account Security para cuentas personales de ChatGPT, añadiendo requisitos de inicio de sesión más fuertes y protecciones de cuenta, incluyendo passkeys, llaves de seguridad, claves de recuperación, sesiones más cortas y notificaciones de inicio de sesión.&lt;/p&gt;
&lt;p&gt;El 28 de abril, la selección de modelos se acercó al compositor, facilitando elegir un modelo antes de enviar un mensaje. Los controles de thinking effort para modelos Thinking y Pro también se movieron al selector de modelos.&lt;/p&gt;
&lt;p&gt;El 22 de abril, ChatGPT introdujo Fast answers para consultas comunes de información que no requieren personalización y donde el modelo tiene una respuesta de alta confianza. Fast answers no referencia chats anteriores ni memoria, y los usuarios pueden desactivarlas en la configuración de personalización.&lt;/p&gt;
&lt;p&gt;Todas estas actualizaciones sirven al mismo objetivo: hacer que ChatGPT funcione mejor para el uso frecuente de todos los días. Debe ser rápido cuando importa la velocidad, personalizado cuando importa el contexto, y ofrecer controles de seguridad y visibilidad cuando se necesitan.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;El punto de esta actualización de ChatGPT Release Notes no es una sola función. Es la forma continua que va tomando el producto.&lt;/p&gt;
&lt;p&gt;GPT-5.5 Instant mejora la calidad de la respuesta predeterminada. Memory sources hace más visible la personalización. Los complementos de Excel y Google Sheets colocan ChatGPT dentro de hojas de cálculo de oficina. Advanced Account Security y los cambios del selector de modelos fortalecen la protección de cuenta y el diseño de interacción.&lt;/p&gt;
&lt;p&gt;ChatGPT se está convirtiendo en una capa de trabajo de más largo plazo. Recuerda más contexto, entra en más herramientas y maneja más tareas diarias. Las siguientes preguntas son si la transparencia de personalización es lo bastante clara, si los complementos de oficina se mantienen estables en hojas complejas reales y si los usuarios pueden conservar un equilibrio sano entre comodidad y control.&lt;/p&gt;
&lt;h2 id=&#34;enlaces&#34;&gt;Enlaces
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ChatGPT Release Notes: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>GPT-5.5 Instant llega: el modelo predeterminado de ChatGPT se vuelve más preciso, breve y personal</title>
        <link>https://knightli.com/es/2026/05/07/gpt-5-5-instant-chatgpt-default-model/</link>
        <pubDate>Thu, 07 May 2026 14:28:40 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/07/gpt-5-5-instant-chatgpt-default-model/</guid>
        <description>&lt;p&gt;OpenAI lanzó &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; el 5 de mayo de 2026 y comenzó a desplegarlo como modelo predeterminado para todos los usuarios de ChatGPT.&lt;/p&gt;
&lt;p&gt;Las palabras clave de esta actualización no son &amp;ldquo;más grande&amp;rdquo; ni &amp;ldquo;más llamativa&amp;rdquo;. Están más cerca del uso diario: respuestas más precisas, respuestas más claras y cortas, un tono más natural y mejor uso del contexto que los usuarios ya compartieron. Para ChatGPT, los cambios en el modelo predeterminado importan especialmente porque afectan la experiencia que la mayoría de personas usa cada día.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-importa-el-modelo-predeterminado&#34;&gt;Por qué importa el modelo predeterminado
&lt;/h2&gt;&lt;p&gt;Instant es el modelo diario de ChatGPT. Muchos usuarios no cambian manualmente de modelo ni estudian las diferencias entre ellos. Su experiencia de ChatGPT es la calidad del modelo predeterminado.&lt;/p&gt;
&lt;p&gt;Por eso GPT-5.5 Instant no es solo otro nombre de modelo. Empuja hacia adelante la experiencia base. OpenAI dice que la actualización hace que las interacciones cotidianas sean más útiles y fluidas: mejores respuestas en distintos temas, conversaciones más compactas y mejor uso del contexto existente cuando corresponde.&lt;/p&gt;
&lt;p&gt;Este tipo de mejora es menos dramático que un gran lanzamiento multimodal, pero para cientos de millones de usuarios, un modelo predeterminado que comete menos errores, escribe menos de más y hace menos preguntas de seguimiento inútiles es un gran cambio de producto.&lt;/p&gt;
&lt;h2 id=&#34;menos-alucinaciones-y-respuestas-más-fiables&#34;&gt;Menos alucinaciones y respuestas más fiables
&lt;/h2&gt;&lt;p&gt;OpenAI coloca la precisión en primer lugar.&lt;/p&gt;
&lt;p&gt;En evaluaciones internas, OpenAI dice que GPT-5.5 Instant produjo 52,5% menos afirmaciones alucinadas que GPT-5.3 Instant en prompts de alto riesgo sobre medicina, derecho y finanzas. En conversaciones especialmente difíciles que los usuarios habían marcado por errores factuales, las afirmaciones inexactas se redujeron 37,3%.&lt;/p&gt;
&lt;p&gt;Estos números importan. Muestran que OpenAI no solo intenta hacer el modelo más fluido, sino que sigue reduciendo errores factuales. En áreas como medicina, derecho y finanzas, un modelo no puede limitarse a sonar convincente. Tiene que ser más cauteloso e inventar menos.&lt;/p&gt;
&lt;p&gt;Esto no significa que los usuarios deban tratar ChatGPT como reemplazo de asesoramiento profesional. Un modelo más preciso aún necesita verificación, fuentes y juicio humano en contextos de alto riesgo. Pero como experiencia de producto, una mayor fiabilidad factual en el modelo predeterminado reduce muchos riesgos cotidianos.&lt;/p&gt;
&lt;h2 id=&#34;mejor-rendimiento-en-tareas-diarias&#34;&gt;Mejor rendimiento en tareas diarias
&lt;/h2&gt;&lt;p&gt;GPT-5.5 Instant también mejora en tareas diarias.&lt;/p&gt;
&lt;p&gt;OpenAI menciona mejor análisis de fotos e imágenes subidas, respuestas STEM más fuertes y mejor criterio sobre cuándo usar búsqueda web. El último punto es importante. A muchos usuarios no les importa si internamente el modelo llama a una herramienta. Les importa que la respuesta sea actual, precisa y clara.&lt;/p&gt;
&lt;p&gt;Si el modelo puede decidir mejor qué preguntas necesitan búsqueda web y cuáles se pueden responder directamente, los usuarios no tienen que repetir &amp;ldquo;búscalo&amp;rdquo;. ChatGPT se siente más como un asistente proactivo que como una caja de chat esperando instrucciones explícitas.&lt;/p&gt;
&lt;p&gt;El ejemplo matemático de OpenAI también apunta en esa dirección. GPT-5.5 Instant acepta inicialmente una solución incorrecta, pero luego verifica el resultado, encuentra el error algebraico y resuelve la ecuación corregida. Lo importante no es que nunca se equivoque, sino que tiene más posibilidades de detectar y reparar un error durante el razonamiento.&lt;/p&gt;
&lt;h2 id=&#34;respuestas-más-cortas-no-menos-sustancia&#34;&gt;Respuestas más cortas, no menos sustancia
&lt;/h2&gt;&lt;p&gt;OpenAI también enfatiza que GPT-5.5 Instant da respuestas más compactas y directas, manteniendo contenido útil y el tono amable de ChatGPT.&lt;/p&gt;
&lt;p&gt;Esto importa para un modelo predeterminado. La fatiga con respuestas de IA muchas veces no viene de falta de información, sino de demasiada estructura, demasiada preparación y demasiado formato. Una pregunta simple puede convertirse en cinco encabezados y una docena de advertencias, lo cual se siente artificial.&lt;/p&gt;
&lt;p&gt;GPT-5.5 Instant busca reducir la verbosidad y el exceso de formato innecesarios, hacer menos preguntas de seguimiento sin necesidad y evitar ruido decorativo. Para trabajo diario de oficina, consejos de escritura, preguntas de vida y explicaciones rápidas, estos cambios suelen importar más que una puntuación de benchmark.&lt;/p&gt;
&lt;p&gt;Más corto no significa más superficial. Un buen modelo predeterminado debe juzgar si el usuario necesita una frase práctica, una explicación o un plan completo. GPT-5.5 Instant avanza hacia un criterio más estable en ese equilibrio.&lt;/p&gt;
&lt;h2 id=&#34;la-personalización-sigue-mejorando&#34;&gt;La personalización sigue mejorando
&lt;/h2&gt;&lt;p&gt;Otro hilo principal es la personalización.&lt;/p&gt;
&lt;p&gt;OpenAI dice que Instant ahora usa mejor, cuando está disponible, contexto de chats anteriores, archivos y Gmail conectado para hacer respuestas más relevantes. Decide cuándo la personalización extra puede mejorar una respuesta y busca conversaciones pasadas más rápido, para que los usuarios no tengan que repetir tanto contexto.&lt;/p&gt;
&lt;p&gt;Esto es valioso para usuarios de ChatGPT de largo plazo. Al planificar, escribir, elegir herramientas, organizar proyectos o continuar un flujo de trabajo, los usuarios quizá ya dieron preferencias, restricciones y contexto en chats anteriores. Si el modelo puede continuar de forma natural, reduce explicaciones repetidas.&lt;/p&gt;
&lt;p&gt;Pero la personalización debe venir con transparencia y control. De lo contrario, los usuarios no saben por qué el modelo menciona de repente una preferencia o qué memorias están dando forma a una respuesta.&lt;/p&gt;
&lt;h2 id=&#34;memory-sources-hace-más-visible-la-personalización&#34;&gt;Memory sources hace más visible la personalización
&lt;/h2&gt;&lt;p&gt;OpenAI también está introduciendo &lt;code&gt;memory sources&lt;/code&gt; en todos los modelos de ChatGPT.&lt;/p&gt;
&lt;p&gt;La función permite a los usuarios ver qué contexto se usó para personalizar una respuesta, como memorias guardadas o chats anteriores. Si algo está desactualizado, es inexacto o ya no se desea, los usuarios pueden eliminarlo o corregirlo.&lt;/p&gt;
&lt;p&gt;OpenAI también dice que memory sources no se muestra a otras personas cuando los usuarios comparten un chat. Los usuarios pueden borrar chats que no quieren que se citen, editar memorias guardadas en configuración o usar chats temporales que no usan ni actualizan memoria.&lt;/p&gt;
&lt;p&gt;Esto importa. Cuanto más personalizado se vuelve un asistente de IA, más necesita explicar &amp;ldquo;qué usé para responderte&amp;rdquo;. Memory sources quizá no muestre todos los factores, pero saca parte de la personalización de la caja negra.&lt;/p&gt;
&lt;h2 id=&#34;disponibilidad&#34;&gt;Disponibilidad
&lt;/h2&gt;&lt;p&gt;GPT-5.5 Instant se despliega desde el día del anuncio para todos los usuarios de ChatGPT, reemplazando GPT-5.3 Instant como modelo predeterminado. En la API, corresponde a &lt;code&gt;chat-latest&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Los usuarios de pago pueden seguir usando GPT-5.3 Instant durante tres meses mediante la configuración de modelos antes de que se retire.&lt;/p&gt;
&lt;p&gt;La personalización mejorada desde chats anteriores, archivos y Gmail conectado se despliega primero para usuarios Plus y Pro en la web, con soporte móvil más adelante. OpenAI planea expandirla a Free, Go, Business y Enterprise en las siguientes semanas. Memory sources se despliega en la web para planes de consumo de ChatGPT y llegará a móvil después. La disponibilidad de fuentes específicas de personalización puede variar por región.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;GPT-5.5 Instant es una mejora de la experiencia predeterminada de ChatGPT.&lt;/p&gt;
&lt;p&gt;No se trata solo de mayor capacidad del modelo. Ajusta precisión, densidad de respuesta, tono, uso de contexto y transparencia de personalización a la vez. Para usuarios comunes, el cambio más directo debería ser: menos relleno, menos errores factuales y mejor continuidad con su contexto.&lt;/p&gt;
&lt;p&gt;Para OpenAI, es otro paso en la evolución del asistente predeterminado. ChatGPT se vuelve menos una herramienta que empieza de cero cada vez y más un asistente de largo plazo que puede recordar preferencias, entender contexto, saber cuándo buscar y dejar que los usuarios gestionen esas fuentes de memoria.&lt;/p&gt;
&lt;h2 id=&#34;enlaces&#34;&gt;Enlaces
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Anuncio de OpenAI: &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/gpt-5-5-instant/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/index/gpt-5-5-instant/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Por que ChatGPT muestra &#39;This chat was flagged for possible cybersecurity risk&#39; y como actuar</title>
        <link>https://knightli.com/es/2026/05/06/chatgpt-cybersecurity-risk-flag/</link>
        <pubDate>Wed, 06 May 2026 00:17:00 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/06/chatgpt-cybersecurity-risk-flag/</guid>
        <description>&lt;p&gt;Al usar ChatGPT u otros modelos grandes, a veces aparece el aviso: &amp;ldquo;This chat was flagged for possible cybersecurity risk&amp;rdquo;. Esto significa que el sistema automatico de seguridad de la plataforma detecto que el contenido de la conversacion podria infringir las politicas de uso.&lt;/p&gt;
&lt;p&gt;A continuacion se analizan las causas habituales, el impacto real y las formas de manejarlo.&lt;/p&gt;
&lt;h2 id=&#34;por-que-se-marca&#34;&gt;Por que se marca
&lt;/h2&gt;&lt;h3 id=&#34;contenido-sensible-en-la-entrada&#34;&gt;Contenido sensible en la entrada
&lt;/h3&gt;&lt;p&gt;La conversacion puede contener contenido que el sistema interpreta como potencialmente danino, por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pedir generacion de codigo o scripts maliciosos.&lt;/li&gt;
&lt;li&gt;Analizar o explotar vulnerabilidades de red.&lt;/li&gt;
&lt;li&gt;Preguntar por actividades ilegales.&lt;/li&gt;
&lt;li&gt;Buscar instrucciones para eludir restricciones de seguridad.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;falsos-positivos&#34;&gt;Falsos positivos
&lt;/h3&gt;&lt;p&gt;Aunque la intencion sea un analisis de codigo legitimo o investigacion tecnica, el sistema puede interpretar terminos de ciberseguridad como un posible intento de ataque. Los modelos de revision de IA son sensibles a palabras clave, y la frontera entre discusion tecnica y conducta ofensiva no siempre se clasifica con precision.&lt;/p&gt;
&lt;h3 id=&#34;mecanismo-de-revision-de-la-plataforma&#34;&gt;Mecanismo de revision de la plataforma
&lt;/h3&gt;&lt;p&gt;El sistema escanea automaticamente el contenido de la conversacion para evaluar riesgos. En versiones mas recientes, como actualizaciones de abril de 2026, este tipo de aviso parece mas frecuente, lo que sugiere que la plataforma puede haber incorporado procesos externos de revision mas estrictos.&lt;/p&gt;
&lt;h2 id=&#34;impacto-del-aviso&#34;&gt;Impacto del aviso
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;La conversacion actual se termina&lt;/strong&gt;: la plataforma puede limitar o detener la generacion en ese chat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Registro de riesgo&lt;/strong&gt;: activar controles de riesgo muchas veces puede quedar registrado y, acumulado, afectar el estado de la cuenta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mayor sensibilidad&lt;/strong&gt;: los mecanismos de revision siguen endureciendose, por lo que las discusiones tecnicas chocan con mas facilidad contra el limite.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;como-manejarlo&#34;&gt;Como manejarlo
&lt;/h2&gt;&lt;h3 id=&#34;crear-un-chat-nuevo&#34;&gt;Crear un chat nuevo
&lt;/h3&gt;&lt;p&gt;La forma mas directa es abandonar la conversacion actual y hacer clic en &amp;ldquo;New Chat&amp;rdquo; para empezar una sesion nueva. El contexto anterior deja de arrastrarse y normalmente no vuelve a activar la misma revision.&lt;/p&gt;
&lt;h3 id=&#34;ajustar-el-prompt&#34;&gt;Ajustar el prompt
&lt;/h3&gt;&lt;p&gt;Revisa lo que escribiste antes, elimina palabras que puedan considerarse sensibles y formula la pregunta de forma mas neutral. Por ejemplo, cambia &amp;ldquo;como saltar cierta restriccion&amp;rdquo; por &amp;ldquo;cual es el principio de esa restriccion&amp;rdquo;, o &amp;ldquo;como escribir un script de ataque&amp;rdquo; por &amp;ldquo;que mecanismo suelen aprovechar este tipo de scripts&amp;rdquo;.&lt;/p&gt;
&lt;h3 id=&#34;no-intentar-eludirlo&#34;&gt;No intentar eludirlo
&lt;/h3&gt;&lt;p&gt;Evita forzar a la IA a responder preguntas rechazadas mediante prompt injection u otros trucos. Eso aumenta el riesgo de bloqueo de cuenta y suele ser contraproducente.&lt;/p&gt;
&lt;h3 id=&#34;confirmar-la-operacion-real&#34;&gt;Confirmar la operacion real
&lt;/h3&gt;&lt;p&gt;Si no estabas haciendo una operacion de alto riesgo, como analizar enlaces de phishing o escribir malware, probablemente se trate de una interpretacion erronea de conceptos tecnicos por parte del sistema. En ese caso puedes enviar feedback a la plataforma, aunque a corto plazo el efecto suele ser limitado.&lt;/p&gt;
&lt;h3 id=&#34;cuidar-la-privacidad&#34;&gt;Cuidar la privacidad
&lt;/h3&gt;&lt;p&gt;No subas informacion personal sensible ni secretos comerciales a analisis con IA. Aunque no active controles de riesgo, sigue existiendo riesgo de fuga de datos.&lt;/p&gt;
&lt;h2 id=&#34;recomendaciones-preventivas&#34;&gt;Recomendaciones preventivas
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;En discusiones tecnicas, describe el problema con terminos lo mas neutrales posible.&lt;/li&gt;
&lt;li&gt;Evita concentrar muchos temas sensibles dentro de una sola conversacion.&lt;/li&gt;
&lt;li&gt;Limpia periodicamente conversaciones historicas innecesarias.&lt;/li&gt;
&lt;li&gt;En cuentas importantes, evita tocar con frecuencia los bordes de las politicas de revision.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;&amp;ldquo;This chat was flagged for possible cybersecurity risk&amp;rdquo; suele ser activado por revision automatica y no necesariamente significa que la cuenta haya infringido reglas. La prioridad es clara: crear un chat nuevo, ajustar la redaccion y no forzar el limite. En el uso diario, cuidar la forma de preguntar evita la mayoria de activaciones.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Por que ChatGPT y Codex piden verificar el numero de telefono al iniciar sesion</title>
        <link>https://knightli.com/es/2026/05/05/chatgpt-codex-phone-verification-plus/</link>
        <pubDate>Tue, 05 May 2026 23:57:50 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/05/chatgpt-codex-phone-verification-plus/</guid>
        <description>&lt;p&gt;Algunos usuarios se encuentran con esta situacion: la cuenta de ChatGPT ya fue registrada correctamente, pero al iniciar sesion en ChatGPT o Codex el sistema vuelve a pedir verificar un numero de telefono. Esto resulta especialmente confuso en Codex: si la cuenta ya se registro, ¿por que el inicio de sesion de la herramienta exige telefono?&lt;/p&gt;
&lt;p&gt;Este tipo de problema suele estar relacionado con controles de riesgo de cuenta, abuso de cuotas gratuitas, entorno de red y politicas de seguridad. A continuacion se organizan las causas comunes y las formas de abordarlo.&lt;/p&gt;
&lt;h2 id=&#34;por-que-se-exige-verificar-telefono&#34;&gt;Por que se exige verificar telefono
&lt;/h2&gt;&lt;p&gt;La causa mas directa es un endurecimiento del control de riesgo.&lt;/p&gt;
&lt;p&gt;Despues de abrir Codex a usuarios, las cuotas gratuitas atraen a muchos usuarios reales, pero tambien a registros masivos y captacion automatizada de cuotas. Si alguien usa registradores para crear cuentas en lote y consumir esas cuotas, la plataforma tiende a endurecer la verificacion.&lt;/p&gt;
&lt;p&gt;Desde el lado del usuario, el resultado es que una cuenta que antes solo necesitaba correo o login de terceros de pronto exige agregar verificacion de telefono al iniciar sesion en ChatGPT o Codex.&lt;/p&gt;
&lt;p&gt;Esto no significa necesariamente que tu cuenta tenga un problema. Tambien puede indicar un entorno de inicio de sesion de mayor riesgo, por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uso de una salida de red compartida por muchos usuarios.&lt;/li&gt;
&lt;li&gt;Un rango de IP usado con frecuencia para registros o logins anormales.&lt;/li&gt;
&lt;li&gt;Cuenta recien creada que accede enseguida a herramientas de alto consumo.&lt;/li&gt;
&lt;li&gt;Cambios frecuentes de dispositivo, region o red.&lt;/li&gt;
&lt;li&gt;Comportamiento de cuenta gratuita parecido al de cuentas masivas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si recientemente hubo anomalias de cuenta, restricciones de inicio de sesion o bloqueos por error, tambien puede estar relacionado con una marca indirecta del entorno de red. Los nodos compartidos por muchas personas tienen un riesgo claramente mayor.&lt;/p&gt;
&lt;h2 id=&#34;por-que-codex-lo-activa-con-mas-facilidad&#34;&gt;Por que Codex lo activa con mas facilidad
&lt;/h2&gt;&lt;p&gt;Codex es distinto del chat normal. Se parece mas a una herramienta de desarrollo, puede implicar mayor consumo de recursos y es mas facil que cuentas masivas lo usen para gastar cuotas gratuitas.&lt;/p&gt;
&lt;p&gt;Por eso no es raro que la misma cuenta parezca normal en la pagina de ChatGPT, pero active verificacion de telefono en el flujo de inicio de sesion de Codex. Puede entenderse asi: distintos productos tienen entradas con distintas evaluaciones de riesgo.&lt;/p&gt;
&lt;p&gt;Para usuarios normales, esta verificacion normalmente no busca dificultar el uso individual, sino limitar el registro masivo y el abuso de cuotas gratuitas. Pero si el entorno de red no esta limpio, tambien puede haber falsos positivos.&lt;/p&gt;
&lt;h2 id=&#34;metodo-1-actualizar-a-plus&#34;&gt;Metodo 1: actualizar a Plus
&lt;/h2&gt;&lt;p&gt;Si usas ChatGPT o Codex de forma prolongada, la forma mas sencilla de manejarlo es actualizar a ChatGPT Plus.&lt;/p&gt;
&lt;p&gt;En la experiencia practica, las cuentas de pago suelen activar con menos frecuencia controles de abuso de cuotas que las cuentas gratuitas. Una cuenta Plus tambien es mas adecuada para usar Codex, modelos avanzados de ChatGPT y funciones de alta frecuencia de forma estable.&lt;/p&gt;
&lt;p&gt;Pero hay que recordar que actualizar a Plus no significa que nunca volvera a pedirse verificacion. Si despues de pagar aun se exige telefono, la causa frecuente sigue siendo el entorno de red.&lt;/p&gt;
&lt;p&gt;En ese caso conviene revisar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si estas usando una red compartida por muchos usuarios.&lt;/li&gt;
&lt;li&gt;Si la IP de salida cambia con frecuencia.&lt;/li&gt;
&lt;li&gt;Si usas desde hace tiempo proxies baratos o nodos publicos de baja calidad.&lt;/li&gt;
&lt;li&gt;Si en la misma red inician sesion muchas cuentas de OpenAI.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si es posible, iniciar sesion desde una red mas estable y limpia suele ser mas efectivo que repetir intentos.&lt;/p&gt;
&lt;h2 id=&#34;metodo-2-revisar-el-entorno-de-red&#34;&gt;Metodo 2: revisar el entorno de red
&lt;/h2&gt;&lt;p&gt;Muchos problemas de verificacion al iniciar sesion parecen problemas de cuenta, pero en esencia son problemas de red.&lt;/p&gt;
&lt;p&gt;Si una IP de salida es compartida por muchas personas, o se uso antes para registros masivos, logins anormales o solicitudes automatizadas, es mas facil que sea marcada. En ese caso, aunque seas un usuario normal, ChatGPT o Codex pueden pedir verificacion adicional.&lt;/p&gt;
&lt;p&gt;Puedes revisar estos puntos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Cambia a un entorno de red mas estable.&lt;/li&gt;
&lt;li&gt;Evita nodos publicos, baratos o compartidos por muchas personas.&lt;/li&gt;
&lt;li&gt;Reduce cambios frecuentes de region en poco tiempo.&lt;/li&gt;
&lt;li&gt;No cambies muchas cuentas dentro del mismo navegador.&lt;/li&gt;
&lt;li&gt;Si usas proxy, prioriza lineas mas estables y con menos abuso.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tambien puedes usar herramientas externas para evaluar el riesgo de la IP actual, pero esos resultados solo son referencia y no representan por completo el criterio interno de OpenAI.&lt;/p&gt;
&lt;h2 id=&#34;metodo-3-completar-la-verificacion-de-telefono&#34;&gt;Metodo 3: completar la verificacion de telefono
&lt;/h2&gt;&lt;p&gt;Si el sistema exige claramente verificacion de telefono, lo mas seguro es completarla como se pide.&lt;/p&gt;
&lt;p&gt;Conviene usar un numero propio que puedas conservar y recibir codigos a largo plazo. Asi, si despues aparece una verificacion de seguridad, recuperacion de acceso o alerta anormal, podras gestionarla.&lt;/p&gt;
&lt;p&gt;No se recomienda vincular una cuenta importante a numeros de origen desconocido, compartidos por muchas personas o que no puedas usar durante mucho tiempo. A corto plazo pueden pasar la verificacion, pero a largo plazo traen riesgos de recuperacion, auditoria de seguridad y segunda verificacion.&lt;/p&gt;
&lt;p&gt;Si usas una cuenta de trabajo, cuenta de equipo o cuenta de desarrollo de la que dependes a largo plazo, deberias evitar todavia mas los numeros temporales no controlados. La seguridad de la cuenta importa mas que ahorrar unos minutos.&lt;/p&gt;
&lt;h2 id=&#34;que-cuidar-al-actualizar-a-plus&#34;&gt;Que cuidar al actualizar a Plus
&lt;/h2&gt;&lt;p&gt;Si vas a actualizar a Plus, confirma primero varias cosas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La cuenta puede iniciar sesion con normalidad.&lt;/li&gt;
&lt;li&gt;El entorno de red es estable y no cambia de region frecuentemente.&lt;/li&gt;
&lt;li&gt;El metodo de pago es fiable; evita pagos de origen desconocido.&lt;/li&gt;
&lt;li&gt;Conserva comprobantes de pago y el correo de la cuenta.&lt;/li&gt;
&lt;li&gt;No prestes la cuenta para uso compartido por muchas personas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Muchos problemas de cuenta no vienen de Plus en si, sino de la red, el pago y los habitos de uso compartido antes y despues de actualizar. Una cuenta usada por muchas personas, con logins frecuentes desde lugares distintos y cambios constantes de entorno, puede activar verificaciones aunque sea de pago.&lt;/p&gt;
&lt;p&gt;Si solo pruebas ocasionalmente, una cuenta gratuita puede seguir sirviendo. Pero si ya usas Codex como herramienta diaria de desarrollo, Plus es mas adecuado para el uso estable a largo plazo.&lt;/p&gt;
&lt;h2 id=&#34;no-conviene-seguir-exprimiendo-cuotas-gratuitas&#34;&gt;No conviene seguir exprimiendo cuotas gratuitas
&lt;/h2&gt;&lt;p&gt;Las cuotas gratuitas de herramientas como Codex existen para que usuarios normales prueben y experimenten. Si muchas cuentas masivas consumen esas cuotas de forma continua, la plataforma solo puede aumentar la intensidad del control de riesgo.&lt;/p&gt;
&lt;p&gt;El resultado es que los usuarios normales tambien se ven afectados: iniciar sesion se vuelve mas molesto, aparecen mas verificaciones, aumentan los bloqueos por error y sube el coste de uso de la cuenta.&lt;/p&gt;
&lt;p&gt;Para quienes realmente usan Codex para escribir codigo, modificar proyectos y ejecutar tareas de ingenieria, es mejor ordenar la cuenta y el entorno de red que gastar tiempo evitando controles. A largo plazo, eso ahorra mas trabajo que registrar cuentas nuevas, cambiar nodos y resolver verificaciones una y otra vez.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;Cuando ChatGPT o Codex piden verificar un numero de telefono al iniciar sesion, normalmente esta relacionado con control de riesgo de cuenta, abuso de cuotas gratuitas y riesgo del entorno de red. No significa necesariamente que la cuenta haya infringido reglas, pero si indica que el entorno de login o el estado de la cuenta activo una verificacion superior.&lt;/p&gt;
&lt;p&gt;El orden de manejo puede ser simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Primero revisa la red y evita salidas compartidas o de alto riesgo.&lt;/li&gt;
&lt;li&gt;Si lo usas a largo plazo, considera actualizar a Plus.&lt;/li&gt;
&lt;li&gt;Si el sistema exige telefono, usa preferiblemente un numero que controles a largo plazo.&lt;/li&gt;
&lt;li&gt;Evita registros masivos, cuentas compartidas y cambios frecuentes de entorno.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La clave para usar herramientas de IA de forma estable no es saltarse verificaciones todo el tiempo, sino mantener normales la cuenta, la red y la forma de uso. Asi se reducen los problemas de inicio de sesion y tambien la probabilidad de falsos positivos posteriores.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>OpenAI presenta Advanced Account Security: una capa más fuerte para proteger cuentas de ChatGPT y Codex</title>
        <link>https://knightli.com/es/2026/05/01/openai-advanced-account-security/</link>
        <pubDate>Fri, 01 May 2026 06:15:29 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/05/01/openai-advanced-account-security/</guid>
        <description>&lt;p&gt;OpenAI presentó &lt;code&gt;Advanced Account Security&lt;/code&gt; el 30 de abril de 2026 como una opción de alta seguridad para cuentas de ChatGPT.&lt;/p&gt;
&lt;p&gt;Está pensada sobre todo para dos grupos: personas con mayor riesgo de ataques dirigidos, como periodistas, cargos electos, disidentes políticos o investigadores; y usuarios especialmente sensibles a la seguridad que quieren más protección para sus cuentas de ChatGPT y Codex.&lt;/p&gt;
&lt;p&gt;Una vez activada, la función protege no solo ChatGPT, sino también Codex cuando se accede con la misma cuenta.&lt;/p&gt;
&lt;h2 id=&#34;por-qué-las-cuentas-de-chatgpt-necesitan-más-seguridad&#34;&gt;Por qué las cuentas de ChatGPT necesitan más seguridad
&lt;/h2&gt;&lt;p&gt;Cada vez más personas usan ChatGPT para trabajo privado o de alto impacto. Una cuenta puede contener:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;preguntas personales y conversaciones largas;&lt;/li&gt;
&lt;li&gt;documentos de trabajo y contexto de proyectos;&lt;/li&gt;
&lt;li&gt;herramientas conectadas y flujos de trabajo;&lt;/li&gt;
&lt;li&gt;código y tareas de desarrollo en Codex;&lt;/li&gt;
&lt;li&gt;materiales empresariales, de investigación o de seguridad.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si una cuenta se compromete, el daño no se limita al historial de chat. Un atacante puede acceder a herramientas conectadas, ver contexto sensible o interferir con trabajo en curso.&lt;/p&gt;
&lt;p&gt;Por eso OpenAI no está añadiendo solo otra forma de inicio de sesión, sino un conjunto más estricto de protección de cuenta.&lt;/p&gt;
&lt;h2 id=&#34;qué-incluye-advanced-account-security&#34;&gt;Qué incluye Advanced Account Security
&lt;/h2&gt;&lt;p&gt;OpenAI coloca esta opción en la sección Security de ChatGPT web, donde el usuario puede activarla.&lt;/p&gt;
&lt;p&gt;Primero, el inicio de sesión se vuelve más fuerte.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Advanced Account Security&lt;/code&gt; requiere &lt;code&gt;passkeys&lt;/code&gt; o llaves físicas de seguridad y desactiva el inicio de sesión con contraseña. El objetivo es que la autenticación resistente al phishing sea el valor por defecto para quienes más la necesitan.&lt;/p&gt;
&lt;p&gt;Segundo, la recuperación de cuenta se vuelve más estricta.&lt;/p&gt;
&lt;p&gt;La recuperación tradicional suele depender de correo o SMS. Si un atacante controla el correo o el número del usuario, puede usarlo para restablecer la cuenta. Para reducir este riesgo, Advanced Account Security desactiva la recuperación por email y SMS y usa métodos más fuertes, como passkeys de respaldo, llaves de seguridad y claves de recuperación.&lt;/p&gt;
&lt;p&gt;Hay una contrapartida importante: después de activar la función, recuperar la cuenta depende mucho más de que el usuario guarde bien esos métodos. OpenAI indica explícitamente que, si los usuarios inscritos pierden sus métodos de recuperación, OpenAI Support no podrá recuperar la cuenta.&lt;/p&gt;
&lt;p&gt;Tercero, las sesiones son más cortas y más fáciles de gestionar.&lt;/p&gt;
&lt;p&gt;OpenAI reduce la duración de las sesiones para acortar la ventana de exposición si un dispositivo o sesión activa se ve comprometido. El usuario recibe alertas de inicio de sesión y puede revisar y gestionar sesiones activas en sus dispositivos.&lt;/p&gt;
&lt;p&gt;Cuarto, la exclusión de entrenamiento se activa automáticamente.&lt;/p&gt;
&lt;p&gt;Para quienes manejan información sensible, impedir que las conversaciones se usen para entrenar modelos es una opción de privacidad importante. Al activar Advanced Account Security, las conversaciones de esas cuentas no se usarán para entrenar modelos de OpenAI.&lt;/p&gt;
&lt;h2 id=&#34;colaboración-con-yubico&#34;&gt;Colaboración con Yubico
&lt;/h2&gt;&lt;p&gt;OpenAI también anunció una colaboración con Yubico para ofrecer un paquete personalizado de llaves de seguridad.&lt;/p&gt;
&lt;p&gt;Incluye:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;YubiKey C Nano&lt;/code&gt;: pensada para quedarse conectada al portátil y reducir fricción diaria;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;YubiKey C NFC&lt;/code&gt;: pensada como respaldo y para uso entre portátiles y móviles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI dice que también se pueden usar otras llaves físicas compatibles con FIDO o passkeys de software. La función no depende de un hardware concreto, sino de métodos resistentes al phishing.&lt;/p&gt;
&lt;h2 id=&#34;trusted-access-for-cyber-tendrá-que-activarlo&#34;&gt;Trusted Access for Cyber tendrá que activarlo
&lt;/h2&gt;&lt;p&gt;OpenAI también indica que los miembros individuales de &lt;code&gt;Trusted Access for Cyber&lt;/code&gt; que acceden a modelos de ciberseguridad más capaces y permisivos deberán activar Advanced Account Security desde el 1 de junio de 2026.&lt;/p&gt;
&lt;p&gt;Las organizaciones pueden cumplir de otra forma: certificando que su flujo de SSO ya usa autenticación resistente al phishing.&lt;/p&gt;
&lt;p&gt;La lógica es clara. Cuanto más potente es la capacidad del modelo, más fuerte debe ser la protección de cuenta, sobre todo en investigación de seguridad, análisis de vulnerabilidades y red teaming.&lt;/p&gt;
&lt;h2 id=&#34;quién-debería-considerarlo&#34;&gt;Quién debería considerarlo
&lt;/h2&gt;&lt;p&gt;No es una función necesaria para todo el mundo.&lt;/p&gt;
&lt;p&gt;Si usas ChatGPT solo para conversaciones comunes y no quieres gestionar recuperación estricta, puede tener sentido esperar.&lt;/p&gt;
&lt;p&gt;Pero estos usuarios deberían considerarla en serio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;personas que manejan materiales sensibles en ChatGPT;&lt;/li&gt;
&lt;li&gt;usuarios de Codex con repositorios privados;&lt;/li&gt;
&lt;li&gt;periodistas, profesionales públicos, investigadores, ejecutivos y otros usuarios de alto riesgo;&lt;/li&gt;
&lt;li&gt;profesionales de ciberseguridad;&lt;/li&gt;
&lt;li&gt;personas cómodas con passkeys o llaves físicas;&lt;/li&gt;
&lt;li&gt;usuarios preocupados por phishing, SIM swapping o toma de control del correo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Antes de activarla, conviene preparar passkeys de respaldo, llaves de seguridad y claves de recuperación, y guardarlas de forma segura.&lt;/p&gt;
&lt;h2 id=&#34;qué-significa-para-productos-de-ia&#34;&gt;Qué significa para productos de IA
&lt;/h2&gt;&lt;p&gt;Advanced Account Security no es una mejora del modelo, pero muestra que los productos de IA están entrando en usos de mayor riesgo.&lt;/p&gt;
&lt;p&gt;Cuando ChatGPT y Codex cargan flujos de trabajo, código, documentos, conectores empresariales y contexto de largo plazo, la cuenta ya no es solo una entrada a un chat. Es la llave de un entorno de trabajo con IA.&lt;/p&gt;
&lt;p&gt;Cuanto más se parecen estos productos a espacios personales de trabajo, más importantes se vuelven seguridad de cuenta, recuperación, sesiones y controles de datos de entrenamiento.&lt;/p&gt;
&lt;h2 id=&#34;conclusión&#34;&gt;Conclusión
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Advanced Account Security&lt;/code&gt; puede entenderse como un modo de alta seguridad para ChatGPT y Codex.&lt;/p&gt;
&lt;p&gt;Reduce el riesgo de toma de cuenta mediante inicio de sesión más fuerte, recuperación más estricta, sesiones más cortas, alertas y exclusión automática de entrenamiento. La contrapartida es que el usuario debe cuidar mejor sus métodos de recuperación: después de activarlo ya no existe recuperación tradicional por correo o SMS, y OpenAI Support no sirve como respaldo.&lt;/p&gt;
&lt;p&gt;Si ya usas ChatGPT o Codex para trabajo importante, especialmente con código privado, documentos sensibles o una identidad de alto riesgo, esta función merece atención.&lt;/p&gt;
&lt;p&gt;Referencia:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/advanced-account-security/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing Advanced Account Security - OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Cómo dividir tareas entre ChatGPT, Claude y Gemini: elección de uso diario, codificación y capacidades especiales</title>
        <link>https://knightli.com/es/2026/04/25/chatgpt-claude-gemini-task-selection/</link>
        <pubDate>Sat, 25 Apr 2026 10:51:19 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/25/chatgpt-claude-gemini-task-selection/</guid>
        <description>&lt;p&gt;Mucha gente ya no confía en un solo modelo. En cambio, alternan entre &amp;ldquo;ChatGPT&amp;rdquo;, &amp;ldquo;Claude&amp;rdquo; y &amp;ldquo;Gemini&amp;rdquo;. Eso hace que la pregunta sea mucho más práctica: &lt;strong&gt;¿qué tipo de tareas deberían asignarse a qué modelo?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Esto resulta confuso no porque los tres sean débiles, sino porque ahora son fuertes de diferentes maneras. Si aún así eliges basándose en un estándar vago como “cuál es más inteligente”, fácilmente puedes terminar eligiendo la herramienta equivocada.&lt;/p&gt;
&lt;p&gt;Si simplificamos primero la conclusión, queda más o menos así:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Para conversaciones diarias y tareas de propósito general, muchas personas comienzan con &lt;code&gt;ChatGPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Para la codificación de línea de comandos, la colaboración de contexto prolongado y la ejecución sostenida de tareas, &amp;ldquo;Claude&amp;rdquo; a menudo se siente más fluido.&lt;/li&gt;
&lt;li&gt;Cuando necesita integración del ecosistema de Google, búsqueda, puntos de entrada multimodales o ciertas capacidades a nivel de producto, &amp;ldquo;Gemini&amp;rdquo; tiende a destacar más.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dividámoslo en tres partes.&lt;/p&gt;
&lt;h2 id=&#34;1-conversaciones-diarias-por-qué-muchas-personas-todavía-abren-chatgpt-primero&#34;&gt;1. Conversaciones diarias: por qué muchas personas todavía abren &lt;code&gt;ChatGPT&lt;/code&gt; primero
&lt;/h2&gt;&lt;p&gt;Para la mayoría de los escenarios cotidianos, &amp;ldquo;ChatGPT&amp;rdquo; todavía se siente como el &amp;ldquo;punto de entrada predeterminado&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;No se trata de un único punto de referencia. Se trata de la experiencia general:&lt;br&gt;
cuando desea hacer una pregunta rápida, organizar sus pensamientos, redactar un borrador, crear una primera versión o resumir un material, &amp;ldquo;ChatGPT&amp;rdquo; generalmente se siente bastante equilibrado.&lt;/p&gt;
&lt;p&gt;Sus puntos fuertes suelen aparecer en algunos lugares:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Su estilo de respuesta es relativamente estable.&lt;/li&gt;
&lt;li&gt;La curva de aprendizaje es baja para los usuarios generales.&lt;/li&gt;
&lt;li&gt;La mayoría de las tareas amplias no requieren muchos ajustes adicionales&lt;/li&gt;
&lt;li&gt;El producto se siente pulido y funciona bien para el uso diario frecuente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Entonces, si tu tarea es algo como esto:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ayúdame a organizar un tema.&lt;/li&gt;
&lt;li&gt;Convertir una idea en contenido estructurado.&lt;/li&gt;
&lt;li&gt;Resumir un artículo extenso.&lt;/li&gt;
&lt;li&gt;Lluvia de ideas sobre varios enfoques&lt;/li&gt;
&lt;li&gt;Reescribir algo más claramente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Entonces, &amp;ldquo;ChatGPT&amp;rdquo; suele ser un lugar muy natural para empezar.&lt;/p&gt;
&lt;p&gt;Eso no significa que sea siempre la opción más sólida para cada tarea profesional. Esto significa que, para un uso amplio y de propósito general, a menudo se siente más como el espacio de trabajo predeterminado.&lt;/p&gt;
&lt;h2 id=&#34;2-codificación-de-línea-de-comandos-y-tareas-largas-por-qué-mucha-gente-se-inclina-por-claude&#34;&gt;2. Codificación de línea de comandos y tareas largas: por qué mucha gente se inclina por &lt;code&gt;Claude&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Una vez que una tarea pasa de &amp;ldquo;charlemos&amp;rdquo; a &amp;ldquo;seguiremos trabajando hasta terminar esto&amp;rdquo;, muchas personas empiezan a preferir &amp;ldquo;Claude&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Esto es especialmente cierto en escenarios como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Programación de línea de comandos&lt;/li&gt;
&lt;li&gt;Comprender el contexto de un gran proyecto.&lt;/li&gt;
&lt;li&gt;Coordinar ediciones en múltiples archivos.&lt;/li&gt;
&lt;li&gt;Depuración de largas cadenas de tareas.&lt;/li&gt;
&lt;li&gt;Leer código mientras se avanza constantemente una tarea&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En este tipo de trabajo, la clave no suele ser si una respuesta es especialmente impresionante. Se trata de si el modelo puede permanecer estable a lo largo de una cadena de trabajo más larga.&lt;/p&gt;
&lt;p&gt;La razón por la que a menudo se prefiere &amp;ldquo;Claude&amp;rdquo; no es que &amp;ldquo;diga una frase mejor que las demás&amp;rdquo;, sino que:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se mantiene mejor en tareas de contexto prolongado.&lt;/li&gt;
&lt;li&gt;Se siente más estable al leer archivos, registros y reglas continuamente&lt;/li&gt;
&lt;li&gt;Es más adecuado para avanzar gradualmente en trabajos de codificación complejos.&lt;/li&gt;
&lt;li&gt;En los flujos de trabajo de agentes y de línea de comandos, a menudo se lo trata como el modelo de trabajo principal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si está haciendo &amp;ldquo;codificación de vibración&amp;rdquo;, corrigiendo errores en la terminal, entendiendo la estructura del proyecto o cambiando características en varios archivos, las fortalezas de &amp;ldquo;Claude&amp;rdquo; tienden a mostrarse más claramente.
En pocas palabras, &amp;ldquo;Claude&amp;rdquo; se siente más como un modelo con el que trabajas para hacer las cosas, no simplemente como uno al que haces una pregunta y obtienes una respuesta.&lt;/p&gt;
&lt;h2 id=&#34;3-géminis-a-menudo-gana-no-compitiendo-frontalmente-en-todo&#34;&gt;3. &amp;ldquo;Géminis&amp;rdquo; a menudo gana no &amp;ldquo;compitiendo frontalmente en todo&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Cuando la gente habla de &amp;ldquo;Géminis&amp;rdquo;, a menudo formulan la pregunta de la siguiente manera: ¿es el más fuerte de los tres?&lt;/p&gt;
&lt;p&gt;Pero en el uso real, la pregunta más útil no suele ser esa. Es: &lt;strong&gt;¿en qué escenarios vale especialmente la pena sacarlo y usarlo a propósito?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;El valor de &amp;ldquo;Géminis&amp;rdquo; a menudo se muestra más claramente en estas direcciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Integración con el ecosistema de Google.&lt;/li&gt;
&lt;li&gt;Búsqueda y recopilación de información.&lt;/li&gt;
&lt;li&gt;Puntos de entrada multimodales&lt;/li&gt;
&lt;li&gt;Ciertos vínculos de características del lado del producto.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si su flujo de trabajo ya está cerca de la cadena de herramientas de Google, por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buscar&lt;/li&gt;
&lt;li&gt;Documentos&lt;/li&gt;
&lt;li&gt;Correo electrónico&lt;/li&gt;
&lt;li&gt;Uso del lado del navegador&lt;/li&gt;
&lt;li&gt;Puntos de entrada móviles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Entonces la conveniencia práctica de &amp;ldquo;Gemini&amp;rdquo; puede importar más que una simple comparación entre modelo y puntuación.&lt;/p&gt;
&lt;p&gt;En otras palabras, &amp;ldquo;Gemini&amp;rdquo; suele ser útil porque se integra en su flujo de trabajo de manera más natural, no solo porque puede o no vencer a otra persona en una sola respuesta.&lt;/p&gt;
&lt;h2 id=&#34;4-la-forma-útil-de-elegir-no-es-preguntar-quién-es-más-fuerte-sino-qué-tipo-de-tarea-tienes&#34;&gt;4. La forma útil de elegir no es preguntar quién es más fuerte, sino qué tipo de tarea tienes
&lt;/h2&gt;&lt;p&gt;Cuando la gente compara los tres modelos uno al lado del otro, la trampa más fácil es tratar de encontrar el “mejor” modelo.&lt;/p&gt;
&lt;p&gt;Pero las tareas reales varían demasiado:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Algunas son preguntas y respuestas únicas&lt;/li&gt;
&lt;li&gt;Algunas son conversaciones de larga duración.&lt;/li&gt;
&lt;li&gt;Algunos son proyectos de software.&lt;/li&gt;
&lt;li&gt;Algunos son recuperación de información.&lt;/li&gt;
&lt;li&gt;Algunos son procesamiento multimodal&lt;/li&gt;
&lt;li&gt;Algunos son colaboración en cadena de herramientas.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por lo tanto, el enfoque más eficaz suele ser ordenar por tipo de tarea:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si desea un asistente amplio y de alta frecuencia que funcione de inmediato, comience con &lt;code&gt;ChatGPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Si necesita contexto extenso, trabajo en la línea de comandos, colaboración en codificación y progreso constante en tareas complejas, pruebe primero con &amp;ldquo;Claude&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Si necesita ayuda del ecosistema de Google, búsqueda, puntos de entrada multimodal o ciertas integraciones de productos, preste especial atención a &amp;ldquo;Gemini&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ese tipo de división del trabajo está mucho más cerca del uso en el mundo real que obligar a un único campeón general.&lt;/p&gt;
&lt;h2 id=&#34;5-por-qué-muchos-usuarios-habituales-se-suscriben-a-los-tres&#34;&gt;5. Por qué muchos usuarios habituales se suscriben a los tres
&lt;/h2&gt;&lt;p&gt;Desde la perspectiva de un usuario ligero, pagar por los tres puede parecer redundante.&lt;br&gt;
Desde la perspectiva de un usuario intensivo, es más como asignar diferentes herramientas a diferentes trabajos.&lt;/p&gt;
&lt;p&gt;La razón es sencilla:&lt;br&gt;
Si las fortalezas de los tres modelos ya han comenzado a divergir claramente, entonces usarlos juntos no constituye realmente un gasto duplicado. Es una forma de reducir los costos de cambio y los costos de prueba y error.&lt;/p&gt;
&lt;p&gt;Por ejemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utilice &lt;code&gt;ChatGPT&lt;/code&gt; para la organización diaria y preguntas y respuestas generales&lt;/li&gt;
&lt;li&gt;Utilice &lt;code&gt;Claude&lt;/code&gt; para el trabajo de codificación principal.&lt;/li&gt;
&lt;li&gt;Utilice &lt;code&gt;Gemini&lt;/code&gt; para ciertos flujos de trabajo de búsqueda, multimodales o relacionados con Google&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La lógica de esta configuración no es fundamentalmente diferente de la de los diseñadores que instalan múltiples herramientas creativas o los desarrolladores que usan múltiples IDE.&lt;/p&gt;
&lt;h2 id=&#34;6-cuándo-no-debes-cambiar-de-modelo-con-demasiada-frecuencia&#34;&gt;6. Cuándo no debes cambiar de modelo con demasiada frecuencia
&lt;/h2&gt;&lt;p&gt;Eso sí, tener más modelos no siempre es mejor.&lt;/p&gt;
&lt;p&gt;Si todavía estás creando un flujo de trabajo estable, saltar demasiado pronto y con demasiada frecuencia entre tres modelos puede complicar aún más las cosas. Los problemas comunes incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Volver a explicar la misma tarea tres veces.&lt;/li&gt;
&lt;li&gt;Recibir diferentes sugerencias de diferentes modelos y luchar más para juzgarlas.&lt;/li&gt;
&lt;li&gt;Perder contexto y aumentar los costos de colaboración.&lt;/li&gt;
&lt;li&gt;Estancarse en la elección de herramientas antes de establecer sus propios límites de trabajo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Entonces, una forma más estable suele ser esta:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Asigne primero a cada modelo un escenario principal&lt;/li&gt;
&lt;li&gt;Úselo continuamente en ese escenario por un tiempo.&lt;/li&gt;
&lt;li&gt;Construya gradualmente sus propios hábitos de división del trabajo.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Eso hace que sea más fácil obtener experiencia reutilizable en lugar de quedarse para siempre en la etapa de &amp;ldquo;déjame probar esta hoy&amp;rdquo;.&lt;/p&gt;
&lt;h2 id=&#34;7-una-forma-sencilla-de-recordarlo&#34;&gt;7. Una forma sencilla de recordarlo
&lt;/h2&gt;&lt;p&gt;Si solo desea una versión práctica para recordar, puede utilizar esta división en lenguaje sencillo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ChatGPT&lt;/code&gt;: más parecido al asistente de uso general predeterminado&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Claude&lt;/code&gt;: más bien la opción principal para tareas largas y colaboración en codificación&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gemini&lt;/code&gt;: más bien la herramienta con mayores ventajas en la búsqueda, el trabajo multimodal y el ecosistema de Google&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esta no es una regla absoluta y no significa que los tres no puedan reemplazarse entre sí. Es simplemente un punto de partida más realista.&lt;/p&gt;
&lt;p&gt;Lo que realmente importa no es elegir el “modelo más fuerte del universo”, sino averiguarlo lo antes posible:&lt;br&gt;
&lt;strong&gt;Para el tipo de tarea que tienes por delante, ¿qué modelo ahorra más tiempo, cuesta menos esfuerzo mental y facilita la obtención de resultados?&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>OpenAI lanza GPT-5.5: codificaci贸n ag茅ntica, trabajo de conocimiento e investigaci贸n m谩s fuertes</title>
        <link>https://knightli.com/es/2026/04/24/openai-gpt-5-5-release/</link>
        <pubDate>Fri, 24 Apr 2026 08:39:56 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/24/openai-gpt-5-5-release/</guid>
        <description>&lt;p&gt;OpenAI publicó &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-gpt-5-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing GPT-5.5&lt;/a&gt; el 23 de abril de 2026. A juzgar por la página oficial, este lanzamiento no se trata solo de hacer que el modelo sea &amp;ldquo;más inteligente&amp;rdquo;; se trata más de si el modelo puede seguir ejecutando tareas complejas.&lt;/p&gt;
&lt;p&gt;OpenAI posiciona GPT-5.5 como un modelo más adecuado para el trabajo real. Se espera que no solo responda preguntas, sino que también escriba código, depure, investigue en línea, analice datos, cree documentos y hojas de cálculo, opere software y se mueva entre herramientas hasta que la tarea esté terminada.&lt;/p&gt;
&lt;p&gt;false&lt;/p&gt;
&lt;h2 id=&#34;1-dónde-es-más-fuerte-gpt-55&#34;&gt;1. Dónde es más fuerte GPT-5.5
&lt;/h2&gt;&lt;p&gt;La página de lanzamiento destaca repetidamente cuatro áreas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Codificación agentica&lt;/li&gt;
&lt;li&gt;Uso de la computadora y uso de herramientas&lt;/li&gt;
&lt;li&gt;Trabajo de conocimiento&lt;/li&gt;
&lt;li&gt;Asistencia en investigación científica temprana&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En otras palabras, GPT-5.5 está dirigido menos a preguntas y respuestas cortas y más a tareas de larga duración. Por ejemplo, un problema de ingeniería no es solo &amp;ldquo;¿cómo debe cambiarse este código?&amp;rdquo;; el modelo necesita entender la estructura del proyecto, localizar la causa de la falla, editar archivos relacionados, añadir pruebas, verificar resultados y reducir la solicitud de prompting repetida por parte del usuario.&lt;/p&gt;
&lt;p&gt;OpenAI también enfatiza que GPT-5.5 utiliza menos tokens en tareas de Codex. Esto es importante en la práctica porque los agentes de codificación pueden consumir tokens rápidamente una vez que comienzan a leer archivos, ejecutar comandos y arreglar bugs. Si un modelo puede completar la misma tarea en menos pasos, tanto el costo como el tiempo de espera disminuyen.&lt;/p&gt;
&lt;p&gt;false&lt;/p&gt;
&lt;h2 id=&#34;2-la-codificación-es-el-principal-escaparate&#34;&gt;2. La codificación es el principal escaparate
&lt;/h2&gt;&lt;p&gt;OpenAI llama a GPT-5.5 su modelo de codificación agentico más potente hasta la fecha.&lt;/p&gt;
&lt;p&gt;Los números públicos más destacados incluyen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Terminal-Bench 2.0&lt;/code&gt;: GPT-5.5 alcanza el &lt;code&gt;82.7%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SWE-Bench Pro&lt;/code&gt;: GPT-5.5 alcanza el &lt;code&gt;58.6%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Expert-SWE&lt;/code&gt; interno de OpenAI: GPT-5.5 también obtiene una puntuación más alta que GPT-5.4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estas evaluaciones tienen algo en común: están más cerca de flujos de trabajo de ingeniería reales que de preguntas de algoritmo aisladas. Terminal-Bench, en particular, implica operaciones de línea de comandos, planificación, prueba y error, coordinación de herramientas y verificación de múltiples pasos.&lt;/p&gt;
&lt;p&gt;Para los desarrolladores cotidianos, la implicación es directa: si un modelo puede asumir tareas más grandes depende de si puede mantener el contexto durante mucho tiempo, verificar sus propias suposiciones, saber cuándo ejecutar pruebas y entender qué más puede afectar un cambio.&lt;/p&gt;
&lt;p&gt;El valor de GPT-5.5 en Codex también se manifiesta principalmente en estos comportamientos. Se siente más como un colaborador que puede asumir parte de una tarea de ingeniería, en lugar de una herramienta que solo completa fragmentos de código.&lt;/p&gt;
&lt;p&gt;false&lt;/p&gt;
&lt;h2 id=&#34;3-el-trabajo-del-conocimiento-se-convierte-en-un-escenario-central&#34;&gt;3. El Trabajo del Conocimiento se Convierte en un Escenario Central
&lt;/h2&gt;&lt;p&gt;Más allá de la codificación, OpenAI está integrando GPT-5.5 en un contexto de trabajo de oficina más amplio.&lt;/p&gt;
&lt;p&gt;El anuncio dice que GPT-5.5 puede generar documentos, hojas de cálculo (spreadsheets) y presentaciones (slide decks) mejor en Codex, y también es más adecuado para la investigación operativa, el modelado de hojas de cálculo y la organización de materiales de negocio. Combinado con el uso de la computadora, su objetivo no es simplemente ofrecer sugerencias, sino participar en el flujo de trabajo completo de encontrar información, comprender el contenido, usar herramientas, revisar la salida y convertir materia prima en un resultado.&lt;/p&gt;
&lt;p&gt;La página también señala que OpenAI ya utiliza Codex en muchos departamentos internos, incluyendo ingeniería de software, finanzas, comunicaciones, marketing, data science y product management. Lo interesante no es ningún ejemplo en particular, sino la dirección: OpenAI está expandiendo Codex de una herramienta para desarrolladores a una herramienta de trabajo más general.&lt;/p&gt;
&lt;p&gt;En ChatGPT, GPT-5.5 Thinking está disponible para usuarios Plus, Pro, Business y Enterprise; GPT-5.5 Pro está dirigido a preguntas más difíciles y trabajo de mayor precisión, y está disponible para usuarios Pro, Business y Enterprise.&lt;/p&gt;
&lt;p&gt;false&lt;/p&gt;
&lt;h2 id=&#34;4-la-capacidad-de-investigación-es-más-que-respuestas-mejores&#34;&gt;4. La Capacidad de Investigación es Más que Respuestas Mejores
&lt;/h2&gt;&lt;p&gt;GPT-5.5 también recibe una fuerte presentación enfocada en la investigación.&lt;/p&gt;
&lt;p&gt;OpenAI afirma que ha mejorado en genética, biología cuantitativa, bioinformática, prueba matemática y áreas relacionadas. La clave no es si el modelo puede recordar un hecho, sino si puede manejar problemas de investigación más realistas: leer datos, detectar anomalías, proponer análisis, interpretar resultados y continuar basándose en hallazgos intermedios.&lt;/p&gt;
&lt;p&gt;La página de lanzamiento menciona &lt;code&gt;GeneBench&lt;/code&gt; y &lt;code&gt;BixBench&lt;/code&gt;, ambos centrados más en el análisis científico multifase. OpenAI también dice que una versión interna de GPT-5.5, con un &lt;em&gt;harness&lt;/em&gt; personalizado, ayudó a descubrir una nueva prueba relacionada con los números de Ramsey y la verificó con Lean.&lt;/p&gt;
&lt;p&gt;Estos ejemplos no deben simplificarse a &amp;ldquo;la IA ahora puede hacer investigación de forma independiente&amp;rdquo;. Pero sí sugieren que los modelos están pasando de ser motores de respuesta a ser colaboradores en la investigación. En escenarios donde se mezclan código, datos, artículos, ideas de experimentos y notas, el razonamiento de horizonte largo y el uso de herramientas de GPT-5.5 se vuelven especialmente importantes.&lt;/p&gt;
&lt;p&gt;false&lt;/p&gt;
&lt;h2 id=&#34;5-eficiencia-de-inferencia-más-potente-sin-volverse-mucho-más-lento&#34;&gt;5. Eficiencia de Inferencia: Más Potente Sin Volverse Mucho Más Lento
&lt;/h2&gt;&lt;p&gt;Un punto fácilmente pasado por alto es que OpenAI afirma que GPT-5.5 iguala a GPT-5.4 en la latencia por token en el mundo real.&lt;/p&gt;
&lt;p&gt;Normalmente, los modelos más grandes y más capaces tienen una latencia más alta. Esta vez, OpenAI enfatiza que la optimización del sistema de inferencia ayudó a GPT-5.5 a volverse más capaz mientras mantenía la velocidad estable. La página de lanzamiento también menciona que Codex analizó patrones de tráfico de producción y escribió algoritmos heurísticos de balanceo de carga, aumentando la velocidad de generación de tokens en más de &lt;code&gt;20%&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ese detalle es interesante: el modelo no solo es atendido por la infraestructura, sino que también ayuda a mejorar la infraestructura que lo sirve.&lt;/p&gt;
&lt;p&gt;false&lt;/p&gt;
&lt;h2 id=&#34;6-la-seguridad-se-vuelve-más-estricta-especialmente-en-ciberseguridad&#34;&gt;6. La seguridad se vuelve más estricta, especialmente en ciberseguridad
&lt;/h2&gt;&lt;p&gt;Dado que GPT-5.5 tiene capacidades de ciberseguridad más sólidas, OpenAI también está reforzando los controles de seguridad.&lt;/p&gt;
&lt;p&gt;El anuncio indica que GPT-5.5 mejora respecto a GPT-5.4 en capacidad de ciberseguridad, por lo que OpenAI está implementando clasificadores más estrictos, especialmente para actividades de alto riesgo, solicitudes sensibles de ciberseguridad y uso indebido repetido.&lt;/p&gt;
&lt;p&gt;Esto significa que algunos usuarios pueden experimentar más rechazos o fricción al trabajar en tareas relacionadas con la ciberseguridad. OpenAI también ofrece Trusted Access for Cyber, diseñado para reducir barreras innecesarias para usuarios defensivos verificados.&lt;/p&gt;
&lt;p&gt;Para los desarrolladores comunes, la conclusión simple es: el refuerzo legítimo de la seguridad (security hardening), la corrección de vulnerabilidades y la auditoría de código deben seguir siendo compatibles, mientras que los flujos de trabajo de ataque de alto riesgo estarán más controlados.&lt;/p&gt;
&lt;p&gt;false&lt;/p&gt;
&lt;h2 id=&#34;7-disponibilidad-y-precios-de-la-api&#34;&gt;7. Disponibilidad y Precios de la API
&lt;/h2&gt;&lt;p&gt;Según la página de lanzamiento de OpenAI, la disponibilidad de GPT-5.5 es la siguiente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT: GPT-5.5 Thinking para usuarios Plus, Pro, Business y Enterprise&lt;/li&gt;
&lt;li&gt;ChatGPT: GPT-5.5 Pro para usuarios Pro, Business y Enterprise&lt;/li&gt;
&lt;li&gt;Codex: GPT-5.5 para planes Plus, Pro, Business, Enterprise, Edu y Go&lt;/li&gt;
&lt;li&gt;Codex: ventana de contexto de &lt;code&gt;400K&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Codex Modo Fast: velocidad de generación de tokens de aproximadamente &lt;code&gt;1.5x&lt;/code&gt; a un coste de &lt;code&gt;2.5x&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para la API, OpenAI dice que &lt;code&gt;gpt-5.5&lt;/code&gt; y &lt;code&gt;gpt-5.5-pro&lt;/code&gt; estarán disponibles pronto.&lt;/p&gt;
&lt;p&gt;Los precios de la API anunciados son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gpt-5.5&lt;/code&gt;: &lt;code&gt;US$5 / 1M tokens&lt;/code&gt; de entrada y &lt;code&gt;US$30 / 1M tokens&lt;/code&gt; de salida&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gpt-5.5-pro&lt;/code&gt;: &lt;code&gt;US$30 / 1M tokens&lt;/code&gt; de entrada y &lt;code&gt;US$180 / 1M tokens&lt;/code&gt; de salida&lt;/li&gt;
&lt;li&gt;Ventana de contexto API de &lt;code&gt;gpt-5.5&lt;/code&gt;: &lt;code&gt;1M&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Batch y Flex tienen la mitad del precio estándar de la API&lt;/li&gt;
&lt;li&gt;El procesamiento prioritario es &lt;code&gt;2.5x&lt;/code&gt; el precio estándar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto es claramente más caro que muchos modelos cotidianos, por lo que es más adecuado para tareas de alto valor: cambios de ingeniería complejos, análisis de documentos largos, automatización de oficinas, asistencia de investigación y flujos de trabajo empresariales importantes, en lugar de conversaciones casuales.&lt;/p&gt;
&lt;p&gt;false&lt;/p&gt;
&lt;h2 id=&#34;8-cómo-leer-este-lanzamiento&#34;&gt;8. Cómo leer este lanzamiento
&lt;/h2&gt;&lt;p&gt;En una frase, GPT-5.5 trata sobre cómo OpenAI impulsa los modelos más allá de &amp;ldquo;responder preguntas&amp;rdquo; hacia &amp;ldquo;realizar trabajo&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;La parte más importante no son solo las puntuaciones de referencia (benchmark scores) más altas, sino la convergencia de varias capacidades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mejor persistencia en tareas largas&lt;/li&gt;
&lt;li&gt;Uso de herramientas más confiable&lt;/li&gt;
&lt;li&gt;Comprensión de contexto de ingeniería más sólida&lt;/li&gt;
&lt;li&gt;Mejor adaptación a documentos, hojas de cálculo, investigación y flujos de trabajo empresariales&lt;/li&gt;
&lt;li&gt;Contexto más largo y mayor eficiencia de tokens&lt;/li&gt;
&lt;li&gt;Controles más estrictos en capacidades de alto riesgo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para los desarrolladores, lo más interesante de probar es trabajo de ingeniería complejo en Codex. Para los usuarios empresariales (enterprise users), la pregunta más grande es si puede convertir trabajo inter-herramental, inter-documental e inter-proceso en resultados entregables.&lt;/p&gt;
&lt;p&gt;GPT-5.5 no es una pequeña actualización dirigida solo a la experiencia de chat. Parece más bien otro paso en el avance de OpenAI hacia la IA como una capa de ejecución para el trabajo.&lt;/p&gt;
&lt;p&gt;false&lt;/p&gt;
&lt;h2 id=&#34;enlaces-relacionados&#34;&gt;Enlaces Relacionados
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-gpt-5-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Presentando GPT-5.5 - OpenAI&lt;/a&gt;
false&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>OpenAI presenta ChatGPT Images 2.0: la generación de imágenes comienza a avanzar hacia resultados entregables</title>
        <link>https://knightli.com/es/2026/04/22/openai-chatgpt-images-2-0-deliverable-image-generation/</link>
        <pubDate>Wed, 22 Apr 2026 14:21:45 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/22/openai-chatgpt-images-2-0-deliverable-image-generation/</guid>
        <description>&lt;p&gt;OpenAI publicó &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introtaining-chatgpt-images-2-0/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Presentación de ChatGPT Images 2.0&lt;/a&gt; el 21 de abril de 2026. A juzgar por la página del anuncio, el punto principal no es simplemente que las imágenes se vean mejor. El mensaje más importante es que la generación de imágenes está avanzando hacia algo más controlable, más consciente del diseño y más directamente utilizable.&lt;/p&gt;
&lt;p&gt;Si nos fijamos únicamente en esta página de lanzamiento, se parece más a una muestra densa de capacidades que a un anuncio técnico tradicional. Hay muy poco sobre la arquitectura del modelo, los detalles de capacitación o los puntos de referencia. En cambio, OpenAI utiliza un gran conjunto de ejemplos para responder una pregunta más práctica: ¿puede ahora ChatGPT manejar más trabajo que antes requería correcciones manuales repetidas para el texto, el diseño y el pulido final?&lt;/p&gt;
&lt;h2 id=&#34;01-las-señales-más-claras-en-este-lanzamiento&#34;&gt;01 Las señales más claras en este lanzamiento
&lt;/h2&gt;&lt;p&gt;Las frases más destacadas de la página ya resumen el enfoque:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Mayor precisión y control&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Más fuerte en todos los idiomas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Sofisticación estilística y realismo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En conjunto, esas tres ideas dicen mucho.&lt;/p&gt;
&lt;p&gt;En primer lugar, el énfasis se está alejando de la mera imaginación y acercándose al control. La página incluye muchos ejemplos, como carteles, folletos de revistas, páginas promocionales, infografías, hojas de personajes, páginas de cómics y diseños de marcadores listos para imprimir. Lo que comparten estos ejemplos no es sólo el atractivo visual. Requieren manejo de texto, jerarquía, espacios en blanco, composición, coherencia estilística y control de formato al mismo tiempo. Eso sugiere que OpenAI está impulsando intencionalmente el producto desde &amp;ldquo;generar una imagen&amp;rdquo; hacia &amp;ldquo;generar un activo visual que la gente realmente pueda usar&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;En segundo lugar, la representación de texto multilingüe se considera una característica de los titulares. La página incluye carteles multilingües, portadas de libros, una campaña de hospitalidad coreana, manga japonés y varios ejemplos centrados en la tipografía. Esto es importante porque uno de los puntos débiles más persistentes de los modelos de imágenes ha sido el texto largo, los diseños complejos y las escrituras no inglesas. Que OpenAI ponga esto al frente y al centro es en sí mismo una señal: la representación de texto y el diseño en varios idiomas son ahora capacidades que cree que vale la pena mostrar directamente.&lt;/p&gt;
&lt;p&gt;En tercer lugar, la gama estilística es muy amplia. Los ejemplos abarcan imágenes fotorrealistas, carteles de collage retro, gráficos inspirados en la Bauhaus, editoriales de moda, estilos documentales en blanco y negro, ilustraciones de libros infantiles, manga, infografías educativas, cuadrículas de productos y hojas de referencia de personajes. El mensaje no es sólo que el modelo puede imitar muchos estilos visuales. Es que el sistema está intentando adaptarse a un conjunto más amplio de tareas visuales reales.&lt;/p&gt;
&lt;h2 id=&#34;02-por-qué-esto-parece-un-paso-hacia-resultados-entregables&#34;&gt;02 Por qué esto parece un paso hacia resultados entregables
&lt;/h2&gt;&lt;p&gt;Desde el anuncio en sí, ChatGPT Images 2.0 se parece menos a un modelo de conversión de texto a imagen más sólido y más a una herramienta de producción visual mejorada.&lt;/p&gt;
&lt;p&gt;Los modelos anteriores podían producir imágenes impresionantes, pero la experiencia a menudo fallaba cuando la tarea cambiaba a cosas como estas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;crear un póster con un título completo, un subtítulo y un texto de respaldo&lt;/li&gt;
&lt;li&gt;crear una revista o una página promocional con información densa&lt;/li&gt;
&lt;li&gt;generar una página de cómic con continuidad entre personajes y paneles&lt;/li&gt;
&lt;li&gt;producir activos de marketing con relaciones de aspecto fijas, restricciones de diseño claras y tono de marca&lt;/li&gt;
&lt;li&gt;crear contenido visual pulido que incluya texto multilingüe
Esta versión parece diseñada para responder directamente a esas limitaciones anteriores.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La página incluye infografías educativas, carteles de tendencias de diseño, diseños de marcadores listos para imprimir, un cartel de lanzamiento de una cafetería, material de promoción turística, maquetas de productos comerciales y un cartel académico rediseñado. Estas no son sólo imágenes que se ven bonitas de un vistazo. Están mucho más cerca de resultados semiacabados o incluso terminados de flujos de trabajo creativos reales.&lt;/p&gt;
&lt;p&gt;En ese sentido, el cambio más importante aquí puede que no sea un simple aumento en la calidad de la imagen. Puede ser que el modelo esté empezando a parecerse más a un sistema para la producción de contenidos, materiales de marca, educación y trabajos de diseño ligero.&lt;/p&gt;
&lt;h2 id=&#34;03-qué-significa-esto-para-la-dirección-de-productos-de-chatgpt&#34;&gt;03 Qué significa esto para la dirección de productos de ChatGPT
&lt;/h2&gt;&lt;p&gt;La estructura del anuncio también sugiere un cambio de producto más amplio.&lt;/p&gt;
&lt;p&gt;OpenAI no presenta ChatGPT Images 2.0 como una herramienta de nicho solo para artistas o creadores visuales. En cambio, enmarca repetidamente la característica a través de la investigación, el razonamiento, la transformación de fuentes, la organización del diseño, la comunicación de conocimientos y los resultados de marketing. La página incluso incluye ejemplos elaborados en torno a pruebas matemáticas, tendencias de diseño, notas históricas y artículos académicos.&lt;/p&gt;
&lt;p&gt;Eso sugiere que la generación de imágenes dentro de ChatGPT ya no se trata solo de agregar una imagen a un chat o generar una sola ilustración. Se está acercando a ser una capa de expresión de uso general. El objetivo parece ser este: una vez que un usuario ya ha investigado, pensado, organizado y escrito algo en ChatGPT, el sistema también debería poder manejar el resultado visual final.&lt;/p&gt;
&lt;p&gt;Si esa dirección continúa, la competencia en la generación de imágenes se basará menos en la pura estética o el realismo y más en capacidades como estas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;si el sistema puede manejar de forma fiable texto complejo&lt;/li&gt;
&lt;li&gt;si puede preservar la coherencia entre páginas o paneles&lt;/li&gt;
&lt;li&gt;si puede producir diseños más cercanos a los materiales de trabajo reales&lt;/li&gt;
&lt;li&gt;si puede conectarse de forma natural con los flujos de trabajo de investigación, redacción, marketing y enseñanza&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;04-lo-que-no-dice-el-anuncio&#34;&gt;04 Lo que no dice el anuncio
&lt;/h2&gt;&lt;p&gt;Al mismo tiempo, el formato de la página también deja claros sus límites.&lt;/p&gt;
&lt;p&gt;A partir de la página oficial publicada el 21 de abril de 2026, el anuncio se centra mucho más en los resultados que en los métodos. No entra en detalles sobre:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mejoras cuantificadas con respecto a la generación anterior&lt;/li&gt;
&lt;li&gt;métricas explícitas para la precisión del texto o la representación multilingüe&lt;/li&gt;
&lt;li&gt;límites de falla para tareas de diseño complejas&lt;/li&gt;
&lt;li&gt;Detalles de API, precios, modos de acceso o detalles de integración empresarial&lt;/li&gt;
&lt;li&gt;cambios concretos en las políticas de seguridad o límites de generación&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por lo tanto, es mejor leer la página como una señal de producto que como una especificación técnica completa.&lt;/p&gt;
&lt;h2 id=&#34;05-breve-conclusión&#34;&gt;05 Breve conclusión
&lt;/h2&gt;&lt;p&gt;Si tuviera que resumir ChatGPT Images 2.0 en una frase, la actualización clave no es que &amp;ldquo;dibuja mejor&amp;rdquo;, sino que está mejorando en la producción de trabajos terminados.&lt;/p&gt;
&lt;p&gt;OpenAI claramente quiere que la generación de imágenes evolucione de una herramienta de inspiración a una herramienta de producción que sea más ejecutable, más consciente del diseño, más comunicativa y más directamente utilizable. El control de texto, la producción multilingüe, la estructura del diseño, la gama estilística y la organización visual de formato largo solían ser lugares donde los modelos de imágenes a menudo mostraban sus debilidades. En esta versión, esas mismas áreas se presentan como puntos de venta.
Eso no significa que la generación de imágenes haya resuelto todos los problemas de diseño. Pero este anuncio sí sugiere un cambio en lo que importa. La próxima ventaja competitiva quizá no provenga de quién pueda generar la imagen más llamativa. Puede provenir de quién puede generar de manera más confiable contenido visual que esté realmente listo para usar.&lt;/p&gt;
&lt;h2 id=&#34;enlaces-relacionados&#34;&gt;Enlaces relacionados
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introtaining-chatgpt-images-2-0/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Presentación de ChatGPT Images 2.0 - OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Guía práctica de codex-quota: uso local, web y de Docker con comandos CLI originales</title>
        <link>https://knightli.com/es/2026/04/16/codex-quota-cli-web-docker-guide/</link>
        <pubDate>Thu, 16 Apr 2026 18:13:04 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/16/codex-quota-cli-web-docker-guide/</guid>
        <description>&lt;h2 id=&#34;qué-hace-este-proyecto&#34;&gt;Qué hace este proyecto
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;codex-quota&lt;/code&gt; es una herramienta liviana para verificar el uso de la cuota de ChatGPT Codex, con datos obtenidos de &lt;code&gt;https://chatgpt.com/backend-api/wham/usage&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Características principales:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Admite consultas de una sola cuenta y de varias cuentas (&lt;code&gt;account/*.auth.json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Genera &lt;code&gt;five_hour%&lt;/code&gt;, &lt;code&gt;weekly%&lt;/code&gt;, &lt;code&gt;weekly_reset&lt;/code&gt; y marca la fuente (&lt;code&gt;network&lt;/code&gt; o &lt;code&gt;cache&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Utiliza reintentos de retroceso exponencial para fallas temporales (&lt;code&gt;408&lt;/code&gt;, &lt;code&gt;429&lt;/code&gt;, &lt;code&gt;5xx&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Incluye almacenamiento en caché local para reducir las solicitudes repetidas cuando la cuota ya está agotada.&lt;/li&gt;
&lt;li&gt;Proporciona un panel web, API JSON y páginas de administración de archivos de autenticación.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ventajas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ligero: se ejecuta con scripts simples y dependencias mínimas.&lt;/li&gt;
&lt;li&gt;Práctico: admite puntos de entrada CLI y Web.&lt;/li&gt;
&lt;li&gt;Implementable: funciona con Docker y Docker Compose.&lt;/li&gt;
&lt;li&gt;Fácil de operar: incluye reintento, caché y soporte de actualización programada.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;prepare-las-credenciales-de-la-cuenta-primero&#34;&gt;Prepare las credenciales de la cuenta primero
&lt;/h2&gt;&lt;p&gt;Cree archivos de credenciales en &lt;code&gt;account/&amp;lt;name&amp;gt;.auth.json&lt;/code&gt;, por ejemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;eyJ...&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user-xxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explicación:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La API de uso requiere &lt;code&gt;access_token&lt;/code&gt; y &lt;code&gt;account_id&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;nombre&amp;gt;&lt;/code&gt; en el nombre del archivo se utiliza como nombre de cuenta en la salida.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;uso-de-cli-local-conservar-los-comandos-originales&#34;&gt;Uso de CLI local (conservar los comandos originales)
&lt;/h2&gt;&lt;p&gt;Instalar dependencias:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -r requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explicación: instala las dependencias del proyecto.&lt;/p&gt;
&lt;p&gt;Consultar todas las cuentas:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explicación: lee &lt;code&gt;account/*.auth.json&lt;/code&gt; y genera un resumen de cuota para todas las cuentas.&lt;/p&gt;
&lt;p&gt;Consulta una cuenta:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota.py your_account_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explicación: solo consulta &lt;code&gt;cuenta/nombre_de_cuenta.auth.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Forzar actualización (omitir caché):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota.py --refresh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explicación: ignora el caché local y recupera datos nuevos directamente.&lt;/p&gt;
&lt;h2 id=&#34;opciones-cli-alineadas-con-readme&#34;&gt;Opciones CLI (alineadas con README)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;account_name&lt;/code&gt;: nombre de cuenta opcional (sin &lt;code&gt;.auth.json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--account-dir&lt;/code&gt;: directorio de autenticación, &lt;code&gt;cuenta&lt;/code&gt; predeterminada.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--chatgpt-url&lt;/code&gt;: punto final de API de cuota.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--raw-json&lt;/code&gt;: imprime el cuerpo completo de la respuesta JSON.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--raw-headers&lt;/code&gt;: imprime encabezados de respuesta.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--refresh&lt;/code&gt;: ignora el caché.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retries&lt;/code&gt;: recuento de reintentos, valor predeterminado &lt;code&gt;3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retry-delay&lt;/code&gt;: retraso de reintento base en segundos, valor predeterminado &lt;code&gt;2.0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;uso-del-panel-web-conservar-el-comando-original&#34;&gt;Uso del panel web (conservar el comando original)
&lt;/h2&gt;&lt;p&gt;Iniciar el servicio:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota_service.py --host 0.0.0.0 --port &lt;span class=&#34;m&#34;&gt;8081&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explicación: inicia el servicio HTTP escuchando en el puerto &lt;code&gt;8081&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;URL de acceso: &lt;code&gt;http://localhost:8081&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Opciones de servicio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--host&lt;/code&gt;: dirección de enlace, predeterminado &lt;code&gt;0.0.0.0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--port&lt;/code&gt;: puerto de servicio, predeterminado &lt;code&gt;8081&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--interval-segundos&lt;/code&gt;: intervalo de actualización programado, predeterminado &lt;code&gt;3600&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--account-dir&lt;/code&gt;: directorio de autenticación, &lt;code&gt;cuenta&lt;/code&gt; predeterminada.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--state-file&lt;/code&gt;: ruta del archivo de estado, predeterminado &lt;code&gt;&amp;lt;account-dir&amp;gt;/codex_quota_web_results.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--account-name&lt;/code&gt;: modo de cuenta única opcional.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--chatgpt-url&lt;/code&gt;: punto final de API de cuota.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retries&lt;/code&gt;: recuento de reintentos.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retry-delay&lt;/code&gt;: retraso de reintento base.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--refresh&lt;/code&gt;: ignora el caché CLI durante las ejecuciones programadas.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;puntos-finales-http-para-automatización&#34;&gt;Puntos finales HTTP (para automatización)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /&lt;/code&gt;: página del panel de control.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/results&lt;/code&gt;: últimos resultados en JSON.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /refresh&lt;/code&gt;: activa la actualización inmediata y redirige a &lt;code&gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /auth&lt;/code&gt;: enumera los archivos de autenticación.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /auth/new&lt;/code&gt;: formulario para crear un archivo de autenticación.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /auth/edit?name=&amp;lt;cuenta&amp;gt;&lt;/code&gt;: formulario para editar el archivo de autenticación.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /auth/save&lt;/code&gt;: crea/actualiza el archivo de autenticación.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /auth/delete&lt;/code&gt;: elimina el archivo de autenticación.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;uso-de-docker-conservar-los-comandos-originales&#34;&gt;Uso de Docker (conservar los comandos originales)
&lt;/h2&gt;&lt;p&gt;Construir imagen:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker build -t codex-quota .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explicación: construye el proyecto actual como imagen &lt;code&gt;codex-quota&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ejecutar contenedor (mapa 8081):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --rm -p 8081:8081 -v ./account:/app/account codex-quota
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explicación:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--rm&lt;/code&gt;: elimina el contenedor automáticamente después de salir.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p 8081:8081&lt;/code&gt;: asigna el puerto del host al puerto del contenedor.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v ./account:/app/account&lt;/code&gt;: monta las credenciales locales en el contenedor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;URL de acceso: &lt;code&gt;http://localhost:8081&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;uso-de-docker-compose-conservar-el-comando-original&#34;&gt;Uso de Docker Compose (conservar el comando original)
&lt;/h2&gt;&lt;p&gt;Inicio:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up --build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explicación: cree e inicie servicios basados ​​en &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;URL de acceso: &lt;code&gt;http://localhost:8081&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;consejos-de-uso&#34;&gt;Consejos de uso
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Para escenarios de múltiples cuentas, use primero el Panel de control para una vista unificada y administración de autenticación.&lt;/li&gt;
&lt;li&gt;Para alertas o automatización, prefiera &lt;code&gt;GET /api/results&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;No envíe valores reales de &lt;code&gt;access_token&lt;/code&gt; a repositorios públicos.&lt;/li&gt;
&lt;li&gt;Si ve muchas fallas temporales, aumente &lt;code&gt;--retries&lt;/code&gt; y &lt;code&gt;--retry-delay&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>Cómo funcionan los límites de uso de Codex: límites de 5 horas, límites semanales y créditos</title>
        <link>https://knightli.com/es/2026/04/15/codex-usage-limits-five-hour-weekly-credits/</link>
        <pubDate>Wed, 15 Apr 2026 22:50:00 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/15/codex-usage-limits-five-hour-weekly-credits/</guid>
        <description>&lt;p&gt;Cuando la gente mira por primera vez los límites de uso de Codex, es fácil asumir que el &lt;code&gt;5-hour limit&lt;/code&gt; es un saldo de corto plazo y que el &lt;code&gt;weekly limit&lt;/code&gt; solo empieza a bajar cuando se agota la cuota de 5 horas.&lt;/p&gt;
&lt;p&gt;No funciona así. Codex se entiende mejor como un sistema que revisa varias ventanas de límite al mismo tiempo: una ventana corta evita el uso en ráfaga, mientras la ventana semanal controla el uso total de la semana. Una solicitud de Codex normalmente cuenta contra ambas.&lt;/p&gt;
&lt;p&gt;Así que esta situación suele ser normal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5-hour quota still has plenty left
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;but weekly quota has already decreased
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;01-versión-corta&#34;&gt;01 Versión corta
&lt;/h2&gt;&lt;p&gt;Puedes entender el uso de Codex con tres reglas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;El &lt;code&gt;5-hour limit&lt;/code&gt; y el &lt;code&gt;weekly limit&lt;/code&gt; se aplican al mismo tiempo.&lt;/li&gt;
&lt;li&gt;Si se agota el límite semanal, normalmente no puedes seguir usando el mismo pool de cuota de suscripción aunque la cuota de 5 horas aún tenga margen.&lt;/li&gt;
&lt;li&gt;Codex no se cobra por simple número de mensajes. El uso depende del modelo, tokens, complejidad de tarea, tamaño de contexto y ubicación de ejecución.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En pseudocódigo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;can_use_codex =
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    five_hour_remaining &amp;gt; 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;amp;&amp;amp; weekly_remaining &amp;gt; 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;amp;&amp;amp; no other product policy is triggered
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Cuando se reinicia la ventana de 5 horas, solo se restaura esa cuota. No restaura la cuota semanal. La cuota semanal se reinicia según su propio calendario, o puede que puedas comprar créditos extra en planes compatibles.&lt;/p&gt;
&lt;h2 id=&#34;02-por-qué-bajan-ambas-ventanas&#34;&gt;02 Por qué bajan ambas ventanas
&lt;/h2&gt;&lt;p&gt;Piensa en los límites de Codex como dos puertas:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Window&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;5-hour window&lt;/td&gt;
          &lt;td&gt;Prevents high-frequency burst usage&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Weekly window&lt;/td&gt;
          &lt;td&gt;Controls total weekly usage&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Cada tarea de Codex crea uso real. Ese uso se refleja en las ventanas de rate limit relevantes.&lt;/p&gt;
&lt;p&gt;No es:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Use 5-hour quota first
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;After the 5-hour quota runs out
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Start using weekly quota
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Se parece más a:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;One Codex request
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; counts toward the 5-hour window
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; also counts toward the weekly window
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Por eso el uso semanal puede bajar aunque la cuota de 5 horas no esté agotada.&lt;/p&gt;
&lt;h2 id=&#34;03-mira-los-créditos-basados-en-tokens&#34;&gt;03 Mira los créditos basados en tokens
&lt;/h2&gt;&lt;p&gt;OpenAI no publica una fórmula que permita a los usuarios reproducir exactamente el cargo de Codex. Lo público es la rate card, los factores principales y el precio de créditos por modelo.&lt;/p&gt;
&lt;p&gt;A fecha de 2026-04-15, el modelo principal de la rate card de Codex es &lt;code&gt;token-based credits&lt;/code&gt;. El uso se estima a partir de tokens de entrada, tokens de entrada cacheados y tokens de salida.&lt;/p&gt;
&lt;p&gt;Ejemplos de tarifas oficiales:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Model&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Input / 1M tokens&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Cached input / 1M tokens&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Output / 1M tokens&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.4&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;62.50 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;6.250 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;375 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.4-Mini&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;18.75 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;1.875 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;113 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.3-Codex&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;43.75 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;4.375 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;350 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.2-Codex&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;43.75 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;4.375 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;350 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.1-Codex-Max&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;31.25 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;3.125 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;250 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.1-Codex-mini&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;6.25 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;0.625 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;50 credits&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Una estimación aproximada es:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;usage
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~= input tokens / 1,000,000 * model input price
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ cached input tokens / 1,000,000 * model cached input price
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ output tokens / 1,000,000 * model output price
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;No es una fórmula exacta de facturación, pero explica la tendencia: la salida es cara, el contexto largo es caro y los modelos más potentes cuestan más. La rate card oficial también dice que &lt;code&gt;Fast mode&lt;/code&gt; usa 2x créditos y que &lt;code&gt;Code review&lt;/code&gt; usa precios de GPT-5.3-Codex.&lt;/p&gt;
&lt;h2 id=&#34;04-no-cuentes-solo-mensajes&#34;&gt;04 No cuentes solo mensajes
&lt;/h2&gt;&lt;p&gt;Diez mensajes de Codex pueden consumir cantidades muy distintas.&lt;/p&gt;
&lt;p&gt;Las tareas ligeras suelen ser más baratas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Editar una función pequeña&lt;/li&gt;
&lt;li&gt;Explicar un snippet corto&lt;/li&gt;
&lt;li&gt;Escribir un párrafo breve&lt;/li&gt;
&lt;li&gt;Hacer un cambio local en un archivo claramente especificado&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Las tareas pesadas cuestan más:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Escanear una codebase grande&lt;/li&gt;
&lt;li&gt;Ejecutar una sesión larga de agente&lt;/li&gt;
&lt;li&gt;Bucles repetidos de leer, editar, probar y corregir&lt;/li&gt;
&lt;li&gt;Generar mucho código o un informe largo&lt;/li&gt;
&lt;li&gt;Usar tareas cloud&lt;/li&gt;
&lt;li&gt;Activar fast mode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Así que el número de mensajes solo da una impresión aproximada. No refleja el uso real.&lt;/p&gt;
&lt;h2 id=&#34;05-tareas-locales-frente-a-tareas-cloud&#34;&gt;05 Tareas locales frente a tareas cloud
&lt;/h2&gt;&lt;p&gt;La ubicación de ejecución puede marcar una gran diferencia.&lt;/p&gt;
&lt;p&gt;Una &lt;code&gt;local task&lt;/code&gt; trabaja en tu workspace local: lee archivos, edita código y ejecuta comandos. Una &lt;code&gt;cloud task&lt;/code&gt; se delega a un entorno cloud alojado, mejor para flujos más largos y automatizados.&lt;/p&gt;
&lt;p&gt;Las tareas cloud suelen ser más caras porque implican:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un entorno de ejecución alojado&lt;/li&gt;
&lt;li&gt;Tareas más largas&lt;/li&gt;
&lt;li&gt;Más llamadas a herramientas&lt;/li&gt;
&lt;li&gt;Contexto más grande&lt;/li&gt;
&lt;li&gt;Un bucle de automatización más completo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para ediciones normales de código, limpieza de artículos o correcciones pequeñas, las tareas locales suelen ser más baratas. Usa tareas cloud cuando el trabajo realmente necesite ejecución alojada.&lt;/p&gt;
&lt;h2 id=&#34;06-por-qué-el-uso-semanal-baja-rápido&#34;&gt;06 Por qué el uso semanal baja rápido
&lt;/h2&gt;&lt;p&gt;Si tu cuota de 5 horas apenas se mueve pero el uso semanal baja mucho, causas comunes incluyen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Usaste tareas cloud.&lt;/li&gt;
&lt;li&gt;Usaste un modelo más caro.&lt;/li&gt;
&lt;li&gt;Activaste fast mode.&lt;/li&gt;
&lt;li&gt;El contexto era grande, con muchos archivos o una conversación larga.&lt;/li&gt;
&lt;li&gt;La salida fue larga, como mucho código, un informe extenso o análisis de logs.&lt;/li&gt;
&lt;li&gt;La cadena de tareas fue larga: buscar, editar, probar, corregir y probar otra vez.&lt;/li&gt;
&lt;li&gt;Tu script de cuota etiquetó mal las ventanas de límite.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si lees campos desde algo como &lt;code&gt;/backend-api/wham/usage&lt;/code&gt;, no confíes solo en etiquetas procesadas como &lt;code&gt;five_hour%&lt;/code&gt; o &lt;code&gt;weekly%&lt;/code&gt;. Revisa los campos raw JSON:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;limit_window_seconds&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;percent_left&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reset_at&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;bucket / feature name&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ventanas típicas:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;limit_window_seconds = 18000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; about 5 hours
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;limit_window_seconds = 604800
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; about 7 days
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si tu script etiqueta las ventanas al revés, la visualización de cuota será engañosa.&lt;/p&gt;
&lt;h2 id=&#34;07-cómo-ahorrar-cuota&#34;&gt;07 Cómo ahorrar cuota
&lt;/h2&gt;&lt;p&gt;Para hacer que la cuota semanal dure más:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Divide trabajos grandes en tareas más pequeñas.&lt;/li&gt;
&lt;li&gt;Prefiere tareas locales cuando sea posible.&lt;/li&gt;
&lt;li&gt;Indica a Codex las rutas relevantes para reducir escaneo innecesario.&lt;/li&gt;
&lt;li&gt;Evita volcar logs enormes, archivos largos o contexto no relacionado.&lt;/li&gt;
&lt;li&gt;Usa modelos mini más baratos para trabajo ligero.&lt;/li&gt;
&lt;li&gt;Pide un plan antes de empezar una tarea larga.&lt;/li&gt;
&lt;li&gt;Pide respuestas concisas cuando no necesites un informe largo.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Un modelo mental útil:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;can continue using
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;= short window has quota
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;amp;&amp;amp; weekly window has quota
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;usage speed
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;= model price
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* tokens
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* output length
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* task complexity
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;* execution location
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;No es matemática exacta de facturación, pero explica la mayoría del comportamiento de límites de uso de Codex.&lt;/p&gt;
&lt;h2 id=&#34;enlaces-relacionados&#34;&gt;Enlaces relacionados
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11369540-using-codex-with-your-chatgpt-plan&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Using Codex with your ChatGPT plan - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11481834&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ChatGPT Rate Card - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/zh-hans-cn/articles/20001106-codex-rate-card&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Codex rate card - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/12642688-using-credits-for-flexible-usage-in-chatgpt-pluspro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Using Credits for Flexible Usage in ChatGPT - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Comprobar uso y cuota de Codex</title>
        <link>https://knightli.com/es/2026/04/12/codex-usage-quota-check/</link>
        <pubDate>Sun, 12 Apr 2026 00:01:33 +0800</pubDate>
        
        <guid>https://knightli.com/es/2026/04/12/codex-usage-quota-check/</guid>
        <description>&lt;p&gt;Si quieres comprobar la cuota restante de una cuenta de Codex, un pequeño script local puede llamar directamente al endpoint &lt;code&gt;/backend-api/wham/usage&lt;/code&gt; de ChatGPT.&lt;/p&gt;
&lt;p&gt;El flujo general es simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Leer &lt;code&gt;tokens.access_token&lt;/code&gt; y &lt;code&gt;tokens.account_id&lt;/code&gt; desde &lt;code&gt;auth.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Enviar una solicitud a &lt;code&gt;https://chatgpt.com/backend-api/wham/usage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Incluir &lt;code&gt;Authorization: Bearer ...&lt;/code&gt; y &lt;code&gt;ChatGPT-Account-Id&lt;/code&gt; en los headers&lt;/li&gt;
&lt;li&gt;Analizar las ventanas de cuota de cinco horas y semanal en la respuesta&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;para-qué-sirve&#34;&gt;Para qué sirve
&lt;/h2&gt;&lt;p&gt;Este enfoque es útil cuando quieres confirmar rápidamente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cuánta cuota de cinco horas queda&lt;/li&gt;
&lt;li&gt;cuánta cuota semanal queda&lt;/li&gt;
&lt;li&gt;cuándo se reinicia la cuota&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si gestionas varias cuentas, el script también puede escanear &lt;code&gt;account/*.auth.json&lt;/code&gt; e imprimir una tabla compacta de resumen. El archivo &lt;code&gt;auth.json&lt;/code&gt; de la cuenta de ChatGPT con sesión iniciada suele encontrarse en &lt;code&gt;~/.codex/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;entradas-clave&#34;&gt;Entradas clave
&lt;/h2&gt;&lt;p&gt;En la práctica, el script depende principalmente de dos valores:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;access_token&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;account_id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ambos suelen estar disponibles en un &lt;code&gt;auth.json&lt;/code&gt; local. Con ellos, los headers de la solicitud suelen tener este aspecto:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Bearer &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Accept&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;ChatGPT-Account-Id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Origin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Referer&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Mozilla/5.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;cómo-leer-la-respuesta&#34;&gt;Cómo leer la respuesta
&lt;/h2&gt;&lt;p&gt;Cuando la solicitud funciona, las entradas más importantes son las dos ventanas de cuota:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;five_hour&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weekly&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un script práctico suele normalizarlas en:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;porcentaje restante&lt;/li&gt;
&lt;li&gt;hora de reinicio&lt;/li&gt;
&lt;li&gt;duración de la ventana&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;También conviene admitir nombres alternativos de campos como &lt;code&gt;primary_window&lt;/code&gt;, &lt;code&gt;secondary_window&lt;/code&gt;, &lt;code&gt;five_hour_limit&lt;/code&gt; y &lt;code&gt;weekly_limit&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;problemas-comunes&#34;&gt;Problemas comunes
&lt;/h2&gt;&lt;p&gt;Una respuesta 401 normalmente significa que el &lt;code&gt;access_token&lt;/code&gt; ha expirado o no es válido.&lt;/p&gt;
&lt;p&gt;Una respuesta 403 normalmente significa que la cuenta no puede acceder a este endpoint, o que la cuenta está en un estado anómalo.&lt;/p&gt;
&lt;p&gt;Si la respuesta usa nombres de campos inconsistentes, es mejor normalizarlos antes de imprimir el resumen.&lt;/p&gt;
&lt;h2 id=&#34;referencia&#34;&gt;Referencia
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;codex-auth-manager&lt;/code&gt;: &lt;a class=&#34;link&#34; href=&#34;https://github.com/RioArisk/codex-auth-manager&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/RioArisk/codex-auth-manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;código&#34;&gt;Código
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;  1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 55
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 56
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 57
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 58
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 59
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 60
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 61
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 62
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 63
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 64
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 65
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 66
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 67
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 68
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 69
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 70
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 71
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 72
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 73
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 74
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 75
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 76
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 77
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 78
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 79
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 80
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 81
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 82
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 83
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 84
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 85
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 86
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 87
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 88
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 89
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 90
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 91
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 92
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 93
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 94
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 95
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 96
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 97
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 98
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 99
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;100
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;101
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;102
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;103
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;104
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;105
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;106
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;107
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;108
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;109
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;110
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;111
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;112
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;113
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;114
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;115
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;116
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;117
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;118
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;119
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;120
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;121
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;122
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;123
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;124
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;125
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;126
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;127
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;128
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;129
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;130
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;131
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;132
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;133
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;134
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;135
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;136
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;137
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;138
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;139
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;140
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;141
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;142
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;143
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;144
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;145
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;146
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;147
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;148
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;149
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;150
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;151
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;152
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;153
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;154
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;155
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;156
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;157
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;158
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;159
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;160
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;161
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;162
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;163
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;164
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;165
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;166
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;167
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;168
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;169
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;170
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;171
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;172
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;173
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;174
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;175
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;176
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;177
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;178
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;179
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;180
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;181
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;182
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;183
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;184
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;185
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;186
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;187
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;188
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;189
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;190
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;191
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;192
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;193
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;194
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;195
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;196
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;197
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;198
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;199
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;200
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;201
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;202
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;203
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;204
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;205
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;206
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;207
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;208
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;209
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;210
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;211
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;212
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;213
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;214
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;215
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;216
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;217
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;218
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;219
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;220
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;221
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;222
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;223
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;224
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;225
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;226
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;227
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;228
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;229
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;230
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;231
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;232
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;233
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;234
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;235
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;236
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;237
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;238
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;239
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;240
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;241
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;242
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;243
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;244
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;245
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;246
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;247
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;248
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;249
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;250
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;251
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;252
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;253
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;254
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;255
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;256
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;257
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;258
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;259
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;260
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;261
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;262
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;263
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;264
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;265
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;266
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;267
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;268
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;269
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;270
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;271
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;272
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;273
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;274
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;275
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;276
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;277
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;278
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;279
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;280
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;281
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;282
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;283
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;284
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;285
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;286
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;287
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;288
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;289
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;290
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;291
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;292
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;293
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;294
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;295
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;296
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;297
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;298
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;299
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;300
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;301
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;302
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;303
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;304
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;305
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;306
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;307
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;308
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;309
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;310
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;311
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;312
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;313
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;314
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;315
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;316
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;317
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;318
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;319
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;320
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;321
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;322
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;323
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;324
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;325
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;326
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;327
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;328
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;329
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;330
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;331
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;332
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;333
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;334
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;335
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;336
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;337
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;338
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;339
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;340
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;341
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;342
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;343
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;344
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;345
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;346
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;347
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;348
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;349
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;350
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;351
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;352
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;353
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;354
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;355
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;356
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;357
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;358
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;359
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;360
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;361
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;362
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;363
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;364
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;365
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;366
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;367
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;368
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;369
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;370
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;371
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;372
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;373
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;374
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;375
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;376
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;377
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;378
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;379
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;380
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;381
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;382
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;383
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;384
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;385
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;386
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;387
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;388
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;389
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;390
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;391
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;392
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;393
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;394
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;395
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;396
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;397
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;398
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;399
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;400
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;401
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;402
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;403
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;404
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;405
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;406
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;407
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;408
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;409
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;410
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;411
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;412
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;413
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;414
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;415
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;416
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;417
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;418
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;419
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;420
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;421
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;422
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;423
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;424
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;425
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;426
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;427
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;428
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;429
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;430
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;431
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;432
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;433
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;434
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;435
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;436
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;437
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;438
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;439
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;440
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;441
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;442
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;443
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;444
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;445
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;446
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;447
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;448
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;449
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;450
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;451
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;452
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;453
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;454
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;455
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;456
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;457
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;458
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;459
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;460
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;base64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timedelta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timezone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;typing&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timezone&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;utc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;CST&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timezone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;timedelta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hours&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;CST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Query ChatGPT Codex usage from /backend-api/wham/usage.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;account_name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;nargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Account name used to load account/&amp;lt;account_name&amp;gt;.auth.json. If omitted, load all *.auth.json files in account/.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--account-dir&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Directory containing &amp;lt;account_name&amp;gt;.auth.json files.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--chatgpt-url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com/backend-api/wham/usage&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ChatGPT usage endpoint.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--raw-json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;store_true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Print the full JSON response body.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--raw-headers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;store_true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Print response headers.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dumps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;indent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ensure_ascii&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;load_auth_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;expanduser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;OSError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDecodeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_nested_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;astimezone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strftime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;%Y-%m-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; %H:%M:%S %Z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format_cst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;epoch_ms_to_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;TypeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Newer responses sometimes use epoch seconds, older ones use epoch milliseconds.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;timestamp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;11&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fromtimestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;timestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tz&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;first_dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;decode_jwt_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parts&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;urlsafe_b64decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ascii&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;exp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exp&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fromtimestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tz&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;TypeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDecodeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_percent_left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;remaining_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;used_percent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;used_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;used_percent&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;used_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;TypeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;resolve_limit_window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_time_ms&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;primary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;primary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resolve_limit_window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_percent_left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_time_ms&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;limit_window_seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_time_ms&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;epoch_ms_to_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;limit_window_seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;infer_limit_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3600&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3600&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;relabel_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;inferred_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;infer_limit_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;limit_window_seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inferred_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inferred_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;parse_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_rate_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;primary&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary_key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_rate_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;secondary&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;secondary_key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;primary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;secondary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;relabel_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;percent_sort_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;bool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;numeric_value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numeric_value&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;numeric_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;base_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.auth.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sorted&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;glob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*.auth.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_account_name_from_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;.auth.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endswith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;build_summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;print_summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sorted_rows&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sorted&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;percent_sort_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;percent_sort_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;format_cst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sorted_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_cst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour%&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly%&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;validate_token_inputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;startswith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sess-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: invalid_token_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;message: --chatgpt-token looks like a session token (sess-...). Use the JWT access_token instead.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;hint: Found tokens.access_token in auth.json; omit --chatgpt-token or pass that value instead.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;decode_jwt_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: expired&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;message: access_token expired at &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;auth_token_exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;decode_jwt_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;hint&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token_exp&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;unknown time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hint: auth.json contains a different access_token expiring at &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hint&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;warning: supplied --account-id does not match auth.json tokens.account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;handle_error_response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;bool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;401&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: expired&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;message: access_token expired or invalid&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;403&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: forbidden&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;message: account has no access to this endpoint or is in an abnormal state&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;400&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HTTP &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fetch_chatgpt_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;load_auth_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_account_name_from_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_nested_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_nested_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: auth file not found or invalid&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: missing access_token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: missing account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;validation_error&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;validate_token_inputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;validation_error&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;validation_error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Bearer &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Accept&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;ChatGPT-Account-Id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Origin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Referer&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Mozilla/5.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chatgpt_url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timeout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;60&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RequestException&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Request failed: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exc&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;=== Headers ===&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HTTP &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;error_response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;handle_error_response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error_response&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error_response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;=== Raw JSON ===&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;rate_limits&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;first_dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;rate_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;rate_limits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rate_limits&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;build_summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;build_summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_paths&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;No auth files found.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;current_exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;summary_row&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fetch_chatgpt_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current_exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;summary_row&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;__name__&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
        </item>
        
    </channel>
</rss>
