{ellmercodex}: un puente entre R, el ecosistema de IA de Posit y OpenAI
ellmeres un paquete que permite conectarse con un proveedor de IA para interactuar de forma programática con un LLM desde R.ellmercodexextiende esta funcionalidad permitiendo usar una cuenta de ChatGPT para acceder a Codex como proveedor deellmer, sin necesidad de una API.

Contexto
R es una herramienta sumamente potente para la ciencia de datos y Posit, la compañía detrás de tidyverse, RStudio y demás iniciativas, no para de realizar aportes a la comunidad. Más recientemente han incursionado en el mundo de la IA y los modelos de lenguaje, con un ecosistema de paquetes como ellmer, ragnar, o mcptools que buscan hacer accesibles los LLMs a un público más amplio.
En este sentido, ellmer permite conectarse con un proveedor de IA para interactuar de forma programática con un LLM desde R. El procedimiento no es demasiado complicado, pero requiere del uso de una API de pago de alguno de los proveedores soportados1 (OpenAI, Anthropic, Deepseek, etc.), lo que fácilmente puede disuadir a los curiosos.
Por esta razón llevo algún tiempo trabajando en el que es mi primer paquete de R, ellmercodex. La idea surgió de la necesidad de incorporar modelos de lenguaje para el análisis de discursos parlamentarios en el marco de mi monografía de grado, y de la limitación que implica que el consumo de API salga de mi bolsillo. Al mismo tiempo, ya contaba con una suscripción a ChatGPT que me daba acceso a Codex, el agente de programación de OpenAI, disponible también —aunque de forma limitada— en el plan gratuito. En esta línea, ya existen otros agentes de programación de terceros como Opencode o Pi, capaces de autenticarse con una cuenta de ChatGPT y aprovechar el acceso a Codex. Mi razonamiento fue el siguiente: si ellos podían hacerlo, entonces debía existir una forma de implementarlo en R.
El resultado de este proceso es ellmercodex, un paquete que permite utilizar una cuenta de ChatGPT desde R a través de la interfaz de ellmer, sin necesidad de contar con una API ni instalar programas adicionales2.
¿Cómo usarlo?
La versión más reciente puede instalarse desde GitHub usando pak:
# install.packages("pak")
pak::pak("simxnherrera/ellmercodex")
Una vez instalado, basta con cargar el paquete:
library(ellmercodex)
La primera vez que lo utilicemos será necesario iniciar sesión:
codex_login()
codex_login abre una ventana del navegador para autenticarse con la cuenta de ChatGPT. Una vez completado este paso, podemos volver a R y crear una conversación:
chat <- chat_codex(model = "gpt-5.6-luna", effort = "low")
chat$chat("Hola desde R")
#> ¡Hola! ¿En qué puedo ayudarte con R?
Como chat_codex() devuelve un objeto Chat de ellmer, a partir de este punto podemos utilizar buena parte de su interfaz habitual.
No solo es un chatbot
Hasta ahora, el ejemplo no parece demasiado distinto de utilizar ChatGPT directamente: enviamos un mensaje y recibimos una respuesta. La diferencia importante es que estamos trabajando con un objeto Chat de ellmer. Esto significa que Codex puede integrarse con las herramientas que ellmer ofrece para incorporar modelos de lenguaje dentro de flujos de trabajo en R. Por ejemplo, podemos pedir resultados estructurados en lugar de texto libre:
# fragmento real de un debate parlamentario sobre regulación del cannabis
fragmento <- paste(
"seguimos pensando que además de la represión y del combate al",
"narcotráfico que debe seguir con firmeza y decisión como sociedad",
"debemos apostar a dos o tres pilares fundamentales la educación",
"la prevención y la rehabilitación"
)
# le pedimos que clasifique el fragmento y devuelva una respuesta estructurada
resultado <- chat$chat_structured(
paste(
"Clasifica el fragmento como PREVENTIVA, PUNITIVA, MIXTA o",
"SIN_ORIENTACIÓN_ATRIBUIBLE.",
"Usa MIXTA cuando se defiendan simultáneamente respuestas",
"preventivas y punitivas.",
"\n\nFragmento:",
fragmento
),
# definimos los campos y valores que puede contener la respuesta
type = ellmer::type_object(
codigo = ellmer::type_enum(c(
"PREVENTIVA",
"PUNITIVA",
"MIXTA",
"SIN_ORIENTACIÓN_ATRIBUIBLE"
)),
justificacion = ellmer::type_string()
)
)
resultado
#> $codigo
#> [1] "MIXTA"
#
#> $justificacion
#> [1] "El fragmento defiende explícitamente la represión y el combate al narcotráfico,
#> que son respuestas punitivas, y simultáneamente propone la educación, la prevención
#> y la rehabilitación, de carácter preventivo o rehabilitador."
Para tareas de análisis de texto, esto resulta particularmente útil: en lugar de recibir una respuesta que luego debemos volver a procesar, podemos solicitar al modelo que devuelva directamente una estructura que R pueda incorporar a un data.frame, validar o analizar.
Un agente dentro de R
Las posibilidades se vuelven todavía más interesantes cuando incorporamos tool calling. ellmer permite registrar funciones como herramientas que el modelo puede decidir utilizar durante una conversación. De esta manera, Codex no solo puede generar texto, sino que también puede solicitar que R ejecute una función, recibir su resultado y utilizarlo para continuar razonando.
Supongamos, por ejemplo, que tenemos una pequeña base con intervenciones parlamentarias ya clasificadas:
intervenciones <- data.frame(
partido = c("FA", "FA", "PN", "PN", "PN"),
orientacion = c(
"PREVENTIVA",
"MIXTA",
"PUNITIVA",
"PUNITIVA",
"MIXTA"
)
)
Podemos crear una función de R que resuma las orientaciones observadas para un partido:
resumir_partido <- function(partido_buscado) {
intervenciones |>
dplyr::filter(partido == partido_buscado) |>
dplyr::count(orientacion)
}
Y exponerla a Codex como una herramienta de ellmer:
resumen_tool <- ellmer::tool(
resumir_partido,
name = "resumir_partido",
description = "Cuenta las orientaciones discursivas de un partido.",
arguments = list(
partido_buscado = ellmer::type_string()
)
)
chat$register_tool(resumen_tool)
A partir de ahí podemos pedirle, por ejemplo:
chat$chat(
"Compara las orientaciones discursivas de FA y PN. Usa la herramienta disponible."
)
#> - **FA:** 1 fragmento **MIXTO** y 1 **PREVENTIVO**.
#> - **PN:** 1 fragmento **MIXTO** y 2 **PUNITIVOS**.
#>
#> En comparación, ambos presentan orientación mixta, pero el **FA** también muestra una
#> orientación preventiva, mientras que el **PN** registra una mayor presencia de respuestas
#> punitivas.
En este caso, Codex puede decidir llamar a resumir_partido() para cada partido, recibir los resultados producidos por R y utilizarlos para elaborar su respuesta.
Lo relevante que este ejemplo busca demostrar es que podemos conectar un LLM con funciones y objetos de nuestra sesión de R. La herramienta podría consultar una base de datos, ejecutar una búsqueda sobre un corpus, realizar un cálculo, recuperar información de una API o disparar cualquier otra operación que decidamos implementar.
Esto no implica cederle a Codex acceso irrestricto a nuestra sesión, ya que el modelo solo puede utilizar las herramientas que registremos explícitamente. R sigue siendo quien ejecuta las funciones; Codex decide cuándo utilizarlas y con qué argumentos/parámetros.
Una pequeña advertencia
La integración de Codex se basa en mecanismos de autenticación y comunicación observados en otros clientes compatibles y, por lo tanto, no existe garantía de que permanezcan sin cambios. Esto significa que una modificación realizada por OpenAI podría romper parcial o completamente el paquete y requerir una actualización.
También existen algunas diferencias respecto de la interfaz completa de ellmer. El foco actual está puesto en el objeto Chat y en operaciones interactivas sobre una conversación; funcionalidades separadas como parallel_chat() y batch_chat() no están soportadas. Justamente, la idea fue desarrollar un paquete compatible con el ecosistema de IA de Posit, de manera que la curva de aprendizaje sea mínima y que si te animaste a probar con Codex, luego no tengas ningún problema en escalar en complejidad, incorporando otros modelos o paquetes.
¿Y ahora?
ellmercodex nació de una necesidad bastante concreta: quería experimentar con modelos de lenguaje desde R sin que cada prueba implicara necesariamente consumir créditos por API. En el proceso terminó convirtiéndose también en un pequeño experimento sobre cómo pueden conectarse dos ecosistemas que utilizo cada vez más, que son el de R y Posit y las herramientas de OpenAI.
Todavía queda trabajo pendiente, pero la versión actual ya permite mantener conversaciones, obtener resultados estructurados, utilizar herramientas y aprovechar otras capacidades del objeto Chat de ellmer con solo una cuenta de ChatGPT.
El código, la documentación y las instrucciones de instalación están disponibles en mi GitHub. Si lo probás y encontrás algún problema, te surge una duda o tenés alguna sugerencia, no dudes en escribirme por cualquiera de las vías de contacto disponibles en el blog. Asimismo, el proyecto está abierto a issues o contribuciones.
ellmertambién soporta el uso de modelos locales a través de Ollama, pero esta funcionalidad merece un artículo en sí mismo. ↩︎ellmercodexes una integración independiente de Codex para R, basada en mecanismos de compatibilidad observados en agentes de programación de terceros como OpenCode o Pi. La idea es que, una vez iniciada sesión, la experiencia sea lo más parecida posible a la de cualquier otro proveedor soportado por ellmer. El paquete no está afiliado a OpenAI ni cuenta con su respaldo, y depende de comportamientos que no forman parte de una API pública documentada. ↩︎