LLMR 0.8.12
Uncaught API errors print their message again. The parsed provider payload now travels on the condition as
response_body; the previous field name,body, is reserved by rlang for message bullets, and storing a list there made top-level display fail with “bodyfield must be a character vector or a function” while hiding the provider’s reason. Error headers now show the raising call instead of the internal constructor, and the model-params tip appears only for parameter errors, with the flagged parameter named when the provider identifies one.The audit log keeps its documented contract when
include_messages = FALSE: generation parameters now land in aparametersfield (the request body minus its message-bearing fields), where previously nothing of the body survived. A failed log write warns once and is counted;llm_log_status()reports the count, since a silently unlogged call defeats an audit log. Thellm_hash()documentation states its portability claim as the stable canonicalization it is (hash schema v1) rather than as a promise about all machines forever.API failures are classified against a catalog of each provider’s documented error codes (R/errors_catalog.R) rather than by HTTP status alone. A new
llmr_api_billing_errorclass marks empty balances and spend caps, andcall_llm_robust()fails fast on it instead of retrying: OpenAI’sinsufficient_quota(a 429) is an account block, while DashScope’s same-named code is throttling, and Moonshot separates quota, rate limit, and overload behind one 429. Ollama’s bare-string errors and Voyage’sdetailfield now surface as the reason instead of falling back to raw JSON, and the condition’scodefield carries the provider’s code, type, or status string when one is sent.
LLMR 0.8.11
CRAN release: 2026-07-24
- Fast-follow corrections cover attachment-aware request hashes, embedding error propagation, Anthropic thinking budgets, ordered agreement labels, audit-log destinations, tool-loop provenance, and experiment reporting. The inert structured-output
methodargument is gone, and ten non-core helpers are now internal. - A config with structured output enabled now produces the same request hash as its logged request body:
enable_structured_output()’s local bookkeeping fields no longer enter the identity. -
llm_batch_submit(state_path = )refuses to persist a job whose config carries a literal API key; environment-variable handles round-trip as before. - Removed: the inert
json_outputargument ofcall_llm_par()and the inert.fieldsargument of the chat session’s$send_structured()and$send_tags().llm_methods_text()is deprecated in favor ofreport()and will be removed once the current ‘LLMRagent’ release no longer calls it. - New provider
"openrouter": chat, streaming, and structured output through OpenRouter’s OpenAI-compatible aggregator (model ids like"openai/gpt-4o-mini"; key fromOPENROUTER_API_KEY). OpenRouter has no embeddings or batch API; its optional attribution headers can be set through thereq_builderhook.
LLMR 0.8.10
CRAN release: 2026-07-10
A bug-fix release; all changes are backward compatible.
-
llm_hash()no longer depends on the collation locale, so the same object hashes identically on every machine; hashes recorded under the C locale are unchanged. - Constant prompts (no
{column}reference) now fill every row; previously rows 2..n were sent withNAcontent and rejected by providers. -
llm_mutate()appends its generated columns again (instead of moving them to the front), and.before/.afternow work on the embedding, structured, tag, and row-batched paths. -
llm_usage()andllm_failures()work onllm_mutate_structured()andllm_mutate_tags()results; config-side and log-side request hashes agree after provider parameter renames. - Streaming no longer errors for providers outside the built-in table and now applies the
req_builderhook and the request timeout. Assorted smaller fixes; see the commit log.
LLMR 0.8.9
- Additive helpers for the agent layer:
call_llm_par(.request_hash =),llm_add_request_hash(),llm_log_active(),llm_tool_signature(), andllm_uuid(). -
llm_agreement()gains ordinal and interval Krippendorff’s alpha (metric =); the nominal default is unchanged.
LLMR 0.8.8
- Bundled example data
anes_2024_personas: 100 participant profiles derived from the ANES 2024 public release, the shared persona dataset of the LLMR family. - Persona data-frame helpers:
llm_persona_split(),llm_persona_overview(),llm_persona_dictionary(),llm_persona_demographic_fields(),llm_validate_persona_frame().
LLMR 0.8.7
-
transcript_as_messages()andensure_alternating_messages(): build a provider-safe, role-flipped message array from a multi-speaker transcript (own turns becomeassistant, others become labeleduserturns).
LLMR 0.8.6
CRAN release: 2026-06-17
- Row-packing controls renamed (
.batch_size->.rows_per_prompt, and kin); the word “batch” is now reserved for the asynchronous provider Batch API. -
llm_log_read(): parse a JSONL call log into records plus a per-record manifest with record and request hashes. -
llm_request_hash()canonicalizes message shape and keys on all generation parameters, so a logged call and its config hash identically. - Added the shared
reset()generic.
LLMR 0.8.5
- Provenance helpers:
llm_response_record()(one-row response record; a failed call is a row, never a dropped call) andllm_request_hash()(stable identity for a call).
LLMR 0.8.4
- Added the shared S3 generics
diagnostics()andreport(), implemented by the LLMR method packages.
LLMR 0.8.3
- Provider Batch APIs at roughly half price:
llm_batch_submit(),llm_batch_status(),llm_batch_fetch(),llm_batch_cancel()(OpenAI, Groq, Anthropic, Gemini). - Call log for reproducible research (
llm_log_enable()), a draft methods paragraph (llm_methods_text()), and replication with agreement statistics (llm_replicate(),llm_agreement()). - Native tool calling (
llm_tool(),call_llm_tools()) and streaming (call_llm_stream()). - Token log-probabilities (
llm_logprobs()), canonicalseed,model_versionandthinkingon every response, prompt caching, and cost estimates from a user-suppliedprice_table. - One shared request builder for the nine OpenAI-compatible providers, with full multimodal, structured-output, tools, and hooks parity.
LLMR 0.8.0
-
llm_preview(): render exactly what a call would send, and flag problems, without any API call. -
llm_usage()andllm_failures(): outcome counts, token totals, and per-row failure listings for any result frame. - Missing token usage is reported as
NA, not0; a bare environment-variable name passed asapi_keyis always treated as a reference. - New “LLMR in 5 minutes” quickstart vignette, runnable on an open-weight model.
LLMR 0.7.2
- Retry and error-classification fixes (provider errors containing braces, typed re-raise after exhausted retries).
-
llm_par_resume()re-runs only the failed rows; JSON array recovery and embedding-dimension fixes.
LLMR 0.7.1
- Row batching for generative calls: pack several rows into one request, with fault-tolerant recovery for dropped, reordered, or truncated rows.
LLMR 0.7.0
- Soft structured output via XML-like tags:
.tagsonllm_mutate(), plusllm_mutate_tags(),llm_fn_tags(), and the tag parsers. - Four new providers (Xiaomi, Alibaba/Qwen, Zhipu, Moonshot) and Gemini on Google Cloud Vertex.
LLMR 0.6.3
CRAN release: 2025-10-11
- Ollama provider (local generative and embedding models); stable embedding column names.
LLMR 0.6.2
-
llm_mutate()shorthand (answer = "{question}") and.structured = TRUE.
LLMR 0.6.0
CRAN release: 2025-08-26
-
call_llm()returns anllmr_responseobject;as.character(x)extracts the text. - Secure API-key handling, structured JSON output, and multi-column injection in
llm_mutate().
