← Back to all sparks
E

ellmer

AI-ASSISTANTS
Velocity2.5

ellmer stopped being a chat wrapper and started shipping the parts production LLM code needs

llmrobservabilityagentic toolsstructured outputtidyverse
Current state
ellmer is R's provider-agnostic LLM client, covering Anthropic, OpenAI, Gemini, Bedrock, Databricks, Snowflake, Ollama, Groq and more behind one Chat object with structured output, tool calling and streaming. The last year moved it well past request plumbing: API keys are now fetched through a credentials function rather than stored in the object, provider-native web search and fetch are first-class tools, and every call emits OpenTelemetry spans when a tracer is active. Releases land roughly every six to ten weeks with meaningful content each time.
Where it's heading
The arc runs from breadth to depth. Early releases raced to add providers; recent ones assume you already picked one and are trying to run it in production — tracing with the gen_ai semantic conventions, prompt caching on by default, parallel and batch chat graduating out of experimental with configurable error handling, and truncated or filtered responses raising warnings instead of passing silently. The credentials rework and automatic key redaction on save show the same instinct applied to secrets.
Prediction
Batch processing has been picking up one provider per release — Gemini and Groq most recently — so the next releases likely continue filling in batch and built-in-tool coverage across the provider list rather than adding new provider integrations.

Recent moves

  1. 29d ago

    ellmer 0.4.2

    Production-hygiene work in the same vein as the last few releases: finish_reason exposes why the model stopped, chat() warns and chat_structured() errors when a response is truncated or filtered, set_model() allows switching models mid-chat, and batch_chat() reaches Gemini and Groq. Default models roll forward to the current Claude Sonnet generation across the Anthropic, Bedrock and Databricks entry points.

    View source ↗
  2. 3mo ago

    ellmer emits OpenTelemetry traces for every chat and tool call

    ⚡ SPARK

    The release that makes R LLM code observable by the same tooling as everything else in a production stack. Chat and tool invocations become spans following the gen_ai conventions, nesting httr2's HTTP spans underneath.

    View source ↗
  3. 9mo ago

    ellmer 0.4.0 adds provider-native web search and stops storing API keys

    ⚡ SPARK

    The release where ellmer picks up agentic capability and rewrites how secrets are handled. Built-in web search and fetch tools arrive for Claude, Gemini and OpenAI, credentials become a function rather than a stored string, and parallel_chat()/batch_chat() leave experimental status.

    View source ↗
  4. 11mo ago

    ellmer 0.3.2

    Consistency work across the provider list: nine more chat_*() functions accept a params() object, chat() becomes compatible with most of them, and chat_azure_openai() renames deployment_id to model to match everyone else. Small, but it is the normalization that made the later provider-agnostic features possible.

    View source ↗
  5. 11mo ago

    ellmer 0.3.1

    Provider fixes rather than features — GitHub models move to the models.github.ai endpoint, Vertex authentication scope and global location are corrected, and base URLs are read from environment variables. contents_record()/contents_replay() also learn to round-trip custom Turn and Content subclasses, which matters for anyone extending ellmer.

    View source ↗
  6. 1y ago

    ellmer 0.3.0 adds a universal chat() and rewrites tool specification

    An ergonomics release with breaking edges. chat("anthropic") or chat("openai/gpt-4.1-nano") reaches any provider from a single string, and tool() moves to an explicit name/description/arguments form that returns a callable function. The maintainer's own notes acknowledge the migration pain and ship an LLM conversion prompt in ?tool to soften it.

    View source ↗