From f89d530d9365fd2aa936962f474682f5cb63d223 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Tue, 4 Nov 2025 16:11:04 -0600 Subject: [PATCH 01/17] Implement built-in tools To do: * [ ] Move to individual provider files * [ ] Support claude citation deltas * [ ] Support claude `server_tool_use` * [ ] Support OpenAI content type * [ ] Add tests for claude * [ ] Add tests for google * [ ] Add tests for openAI * [ ] Check gemini is counting tokens Fixes #578 --- DESCRIPTION | 1 + NAMESPACE | 5 + NEWS.md | 6 + R/provider-google.R | 7 +- R/tools-web.R | 204 ++++++++++++++++++++++++++++++++++ _pkgdown.yml | 10 ++ man/tool_claude_web_fetch.Rd | 54 +++++++++ man/tool_claude_web_search.Rd | 47 ++++++++ man/tool_google_url_fetch.Rd | 29 +++++ man/tool_google_web_search.Rd | 32 ++++++ man/tool_openai_web_search.Rd | 46 ++++++++ 11 files changed, 440 insertions(+), 1 deletion(-) create mode 100644 R/tools-web.R create mode 100644 man/tool_claude_web_fetch.Rd create mode 100644 man/tool_claude_web_search.Rd create mode 100644 man/tool_google_url_fetch.Rd create mode 100644 man/tool_google_web_search.Rd create mode 100644 man/tool_openai_web_search.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 504841e2..7d9588ff 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -113,6 +113,7 @@ Collate: 'tokens.R' 'tools-built-in.R' 'tools-def-auto.R' + 'tools-web.R' 'utils-auth.R' 'utils-callbacks.R' 'utils-cat.R' diff --git a/NAMESPACE b/NAMESPACE index 8750d8f3..a54f5222 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -88,6 +88,11 @@ export(params) export(token_usage) export(tool) export(tool_annotations) +export(tool_claude_web_fetch) +export(tool_claude_web_search) +export(tool_google_url_fetch) +export(tool_google_web_search) +export(tool_openai_web_search) export(tool_reject) export(type_array) export(type_boolean) diff --git a/NEWS.md b/NEWS.md index ff9c532d..b5a174ec 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,11 @@ # ellmer (development version) +* New web search and fetch tools (#578): + - `tool_claude_web_search()` and `tool_claude_web_fetch()` for Claude. + - `tool_google_web_search()` and `tool_google_url_fetch()` for Gemini. + - `tool_openai_web_search()` for OpenAI. + + If you want to do web fetch for other providers, you could use `btw::btw_tool_web_read_url()`. * `chat_openai_responses()` gains a `service_tier` argument (#712). * `Chat$get_tokens()` now also returns the cost, and returns one row for each assistant turn, better representing the underlying data received from LLM APIs. Similarly, the `print()` method now reports costs on each assistant turn, rather than trying to parse out individual costs. * `chat_*()` functions now use a `credentials` function instead of an `api_key` (#613). This means that API keys are never stored in the chat object (which might be saved to disk), but is instead retrieved on demand as needed. You generally shouldn't need to use the `credentials` argument, but when you do, you should use it to dynamically retrieve the API key from some other source (i.e. never inline a secret directly into a function call). diff --git a/R/provider-google.R b/R/provider-google.R index acb2fd6a..5b3eb112 100644 --- a/R/provider-google.R +++ b/R/provider-google.R @@ -214,8 +214,13 @@ method(chat_body, ProviderGoogleGemini) <- function( # https://ai.google.dev/api/caching#Tool if (length(tools) > 0) { + is_builtin <- map_lgl(tools, \(tool) S7_inherits(tool, ToolBuiltIn)) funs <- as_json(provider, unname(tools)) - tools <- list(functionDeclarations = funs) + + tools <- c( + compact(list(functionDeclarations = funs[!is_builtin])), + unlist(funs[is_builtin], recursive = FALSE) + ) } else { tools <- NULL } diff --git a/R/tools-web.R b/R/tools-web.R new file mode 100644 index 00000000..f5dbc5f8 --- /dev/null +++ b/R/tools-web.R @@ -0,0 +1,204 @@ +#' @include tools-built-in.R +NULL + +#' Claude web search tool +#' +#' @description +#' Enables Claude to search the web for up-to-date information. Your organization +#' administrator must enable web search in the Anthropic Console before using +#' this tool, as it costs extra ($10 per 1,000 tokens at time of writing). +#' +#' Learn more in . +#' +#' @param max_uses Integer. Maximum number of searches allowed per request. +#' @param allowed_domains Character vector. Restrict searches to specific domains +#' (e.g., `c("nytimes.com", "bbc.com")`). Cannot be used with `blocked_domains`. +#' @param blocked_domains Character vector. Exclude specific domains from searches. +#' Cannot be used with `allowed_domains`. +#' @param user_location List with optional elements: `country` (2-letter code), +#' `city`, `region`, and `timezone` (IANA timezone) to localize search results. +#' +#' @family built-in tools +#' @export +#' @examples +#' \dontrun{ +#' chat <- chat_claude(model = "claude-sonnet-4-5-20250929") +#' chat$register_tool(tool_claude_web_search()) +#' chat$chat("What was in the news today?") +#' } +tool_claude_web_search <- function( + max_uses = NULL, + allowed_domains = NULL, + blocked_domains = NULL, + user_location = NULL +) { + check_exclusive(allowed_domains, blocked_domains, .require = FALSE) + + check_number_whole(max_uses, allow_null = TRUE, min = 1) + check_character(allowed_domains, allow_null = TRUE) + check_character(blocked_domains, allow_null = TRUE) + + json <- compact(list( + name = "web_search", + type = "web_search_20250305", + max_uses = max_uses, + allowed_domains = allowed_domains, + blocked_domains = blocked_domains, + user_location = user_location + )) + ToolBuiltIn("claude_web_search", json = json) +} + +#' Claude web fetch tool +#' +#' @description +#' Enables Claude to fetch and analyze content from web URLs. Claude can only +#' fetch URLs that appear in the conversation context (user messages or +#' previous tool results). For security reasons, Claude cannot dynamically +#' construct URLs to fetch. +#' +#' Requires the `web-fetch-2025-09-10` beta header. +#' Learn more in . +#' +#' @param max_uses Integer. Maximum number of fetches allowed per request. +#' @param allowed_domains Character vector. Restrict fetches to specific domains. +#' Cannot be used with `blocked_domains`. +#' @param blocked_domains Character vector. Exclude specific domains from fetches. +#' Cannot be used with `allowed_domains`. +#' @param citations Logical. Whether to include citations in the response. Default is `TRUE`. +#' @param max_content_tokens Integer. Maximum number of tokens to fetch from each URL. +#' +#' @family built-in tools +#' @export +#' @examples +#' \dontrun{ +#' chat <- chat_claude( +#' model = "claude-sonnet-4-5-20250929", +#' beta_headers = "web-fetch-2025-09-10" +#' ) +#' chat$register_tool(tool_claude_web_fetch()) +#' chat$chat("Fetch and summarize https://tidyverse.org/blog") +#' } +tool_claude_web_fetch <- function( + max_uses = NULL, + allowed_domains = NULL, + blocked_domains = NULL, + citations = TRUE, + max_content_tokens = NULL +) { + check_exclusive(allowed_domains, blocked_domains, .require = FALSE) + + check_character(allowed_domains, allow_null = TRUE) + check_character(blocked_domains, allow_null = TRUE) + check_bool(citations) + + json <- compact(list( + name = "web_fetch", + type = "web_fetch_20250910", + max_uses = max_uses, + allowed_domains = allowed_domains, + blocked_domains = blocked_domains, + citations = list(enabled = citations), + max_content_tokens = max_content_tokens + )) + ToolBuiltIn("claude_web_fetch", json) +} + +# Google tools ---- + +#' Google web search (grounding) tool +#' +#' @description +#' Enables Gemini models to search the web for up-to-date information and ground +#' responses with citations to sources. The model automatically decides when +#' (and how) to search the web based on your prompt. Search results are +#' incorporated into the response with grounding metadata including source +#' URLs and titles. +#' +#' Learn more in . +#' +#' @family built-in tools +#' @export +#' @examples +#' \dontrun{ +#' chat <- chat_google_gemini(model = "gemini-2.5-flash") +#' chat$register_tool(tool_google_web_search()) +#' chat$chat("What's in the news today?") +#' } +tool_google_web_search <- function() { + ToolBuiltIn("google_web_search", list(google_search = set_names(list()))) +} + +#' Google URL fetch tool +#' +#' @description +#' When this tool is enabled, you can include URLs directly in your prompts and +#' Gemini will fetch and analyze the content. +#' +#' Learn more in . +#' +#' @family built-in tools +#' @export +#' @examples +#' \dontrun{ +#' chat <- chat_google_gemini(model = "gemini-2.5-flash") +#' chat$register_tool(tool_google_url_fetch()) +#' chat$chat("Fetch and summarize https://tidyverse.org/blog") +#' } +tool_google_url_fetch <- function() { + ToolBuiltIn( + name = "google_url_context", + json = list(url_context = set_names(list())) + ) +} + + +#' OpenAI web search tool +#' +#' @description +#' Enables OpenAI models to search the web for up-to-date information. The search +#' behavior varies by model: non-reasoning models perform simple searches, while +#' reasoning models can perform agentic, iterative searches. +#' +#' Learn more at +#' +#' @param allowed_domains Character vector. Restrict searches to specific domains +#' (e.g., `c("nytimes.com", "bbc.com")`). Maximum 20 domains. URLs will be +#' automatically cleaned (http/https prefixes removed). +#' @param user_location List with optional elements: `country` (2-letter ISO code), +#' `city`, `region`, and `timezone` (IANA timezone) to localize search results. +#' @param external_web_access Logical. Whether to allow live internet access +#' (`TRUE`, default) or use only cached/indexed results (`FALSE`). +#' +#' @family built-in tools +#' @export +#' @examples +#' \dontrun{ +#' # Basic web search +#' chat <- chat_openai_responses(model = "gpt-5") +#' chat$register_tool(tool_openai_web_search()) +#' chat$chat("What happened in the news today?") +#' } +tool_openai_web_search <- function( + allowed_domains = NULL, + user_location = NULL, + external_web_access = TRUE +) { + check_character(allowed_domains, allow_null = TRUE) + check_bool(external_web_access) + + # Strip http/https from domains + if (!is.null(allowed_domains)) { + allowed_domains <- sub("^https?://", "", allowed_domains) + } + + json <- compact(list( + type = "web_search", + filters = if (!is.null(allowed_domains)) { + list(allowed_domains = allowed_domains) + }, + user_location = user_location, + external_web_access = external_web_access + )) + ToolBuiltIn("openai_web_search", json) +} diff --git a/_pkgdown.yml b/_pkgdown.yml index 5e2c1862..869deb5f 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -45,6 +45,16 @@ reference: - tool_reject - type_boolean +- subtitle: Built-in tools + desc: > + Access built-in supplied by individual LLM providers. + contents: + - tool_claude_web_search + - tool_claude_web_fetch + - tool_google_web_search + - tool_google_url_fetch + - tool_openai_web_search + - title: Objects desc: > These classes abstract away behaviour differences in chat providers so diff --git a/man/tool_claude_web_fetch.Rd b/man/tool_claude_web_fetch.Rd new file mode 100644 index 00000000..eddd51db --- /dev/null +++ b/man/tool_claude_web_fetch.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/tools-web.R +\name{tool_claude_web_fetch} +\alias{tool_claude_web_fetch} +\title{Claude web fetch tool} +\usage{ +tool_claude_web_fetch( + max_uses = NULL, + allowed_domains = NULL, + blocked_domains = NULL, + citations = TRUE, + max_content_tokens = NULL +) +} +\arguments{ +\item{max_uses}{Integer. Maximum number of fetches allowed per request.} + +\item{allowed_domains}{Character vector. Restrict fetches to specific domains. +Cannot be used with \code{blocked_domains}.} + +\item{blocked_domains}{Character vector. Exclude specific domains from fetches. +Cannot be used with \code{allowed_domains}.} + +\item{citations}{Logical. Whether to include citations in the response. Default is \code{TRUE}.} + +\item{max_content_tokens}{Integer. Maximum number of tokens to fetch from each URL.} +} +\description{ +Enables Claude to fetch and analyze content from web URLs. Claude can only +fetch URLs that appear in the conversation context (user messages or +previous tool results). For security reasons, Claude cannot dynamically +construct URLs to fetch. + +Requires the \code{web-fetch-2025-09-10} beta header. +Learn more in \url{https://docs.claude.com/en/docs/agents-and-tools/tool-use/web-fetch-tool}. +} +\examples{ +\dontrun{ +chat <- chat_claude( + model = "claude-sonnet-4-5-20250929", + beta_headers = "web-fetch-2025-09-10" +) +chat$register_tool(tool_claude_web_fetch()) +chat$chat("Fetch and summarize https://tidyverse.org/blog") +} +} +\seealso{ +Other built-in tools: +\code{\link{tool_claude_web_search}()}, +\code{\link{tool_google_url_fetch}()}, +\code{\link{tool_google_web_search}()}, +\code{\link{tool_openai_web_search}()} +} +\concept{built-in tools} diff --git a/man/tool_claude_web_search.Rd b/man/tool_claude_web_search.Rd new file mode 100644 index 00000000..53c19cfe --- /dev/null +++ b/man/tool_claude_web_search.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/tools-web.R +\name{tool_claude_web_search} +\alias{tool_claude_web_search} +\title{Claude web search tool} +\usage{ +tool_claude_web_search( + max_uses = NULL, + allowed_domains = NULL, + blocked_domains = NULL, + user_location = NULL +) +} +\arguments{ +\item{max_uses}{Integer. Maximum number of searches allowed per request.} + +\item{allowed_domains}{Character vector. Restrict searches to specific domains +(e.g., \code{c("nytimes.com", "bbc.com")}). Cannot be used with \code{blocked_domains}.} + +\item{blocked_domains}{Character vector. Exclude specific domains from searches. +Cannot be used with \code{allowed_domains}.} + +\item{user_location}{List with optional elements: \code{country} (2-letter code), +\code{city}, \code{region}, and \code{timezone} (IANA timezone) to localize search results.} +} +\description{ +Enables Claude to search the web for up-to-date information. Your organization +administrator must enable web search in the Anthropic Console before using +this tool, as it costs extra ($10 per 1,000 tokens at time of writing). + +Learn more in \url{https://docs.claude.com/en/docs/agents-and-tools/tool-use/web-search-tool}. +} +\examples{ +\dontrun{ +chat <- chat_claude(model = "claude-sonnet-4-5-20250929") +chat$register_tool(tool_claude_web_search()) +chat$chat("What was in the news today?") +} +} +\seealso{ +Other built-in tools: +\code{\link{tool_claude_web_fetch}()}, +\code{\link{tool_google_url_fetch}()}, +\code{\link{tool_google_web_search}()}, +\code{\link{tool_openai_web_search}()} +} +\concept{built-in tools} diff --git a/man/tool_google_url_fetch.Rd b/man/tool_google_url_fetch.Rd new file mode 100644 index 00000000..bf6541b1 --- /dev/null +++ b/man/tool_google_url_fetch.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/tools-web.R +\name{tool_google_url_fetch} +\alias{tool_google_url_fetch} +\title{Google URL fetch tool} +\usage{ +tool_google_url_fetch() +} +\description{ +When this tool is enabled, you can include URLs directly in your prompts and +Gemini will fetch and analyze the content. + +Learn more in \url{https://ai.google.dev/gemini-api/docs/url-context}. +} +\examples{ +\dontrun{ +chat <- chat_google_gemini(model = "gemini-2.5-flash") +chat$register_tool(tool_google_url_fetch()) +chat$chat("Fetch and summarize https://tidyverse.org/blog") +} +} +\seealso{ +Other built-in tools: +\code{\link{tool_claude_web_fetch}()}, +\code{\link{tool_claude_web_search}()}, +\code{\link{tool_google_web_search}()}, +\code{\link{tool_openai_web_search}()} +} +\concept{built-in tools} diff --git a/man/tool_google_web_search.Rd b/man/tool_google_web_search.Rd new file mode 100644 index 00000000..ffbef3f2 --- /dev/null +++ b/man/tool_google_web_search.Rd @@ -0,0 +1,32 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/tools-web.R +\name{tool_google_web_search} +\alias{tool_google_web_search} +\title{Google web search (grounding) tool} +\usage{ +tool_google_web_search() +} +\description{ +Enables Gemini models to search the web for up-to-date information and ground +responses with citations to sources. The model automatically decides when +(and how) to search the web based on your prompt. Search results are +incorporated into the response with grounding metadata including source +URLs and titles. + +Learn more in \url{https://ai.google.dev/gemini-api/docs/google-search}. +} +\examples{ +\dontrun{ +chat <- chat_google_gemini(model = "gemini-2.5-flash") +chat$register_tool(tool_google_web_search()) +chat$chat("What's in the news today?") +} +} +\seealso{ +Other built-in tools: +\code{\link{tool_claude_web_fetch}()}, +\code{\link{tool_claude_web_search}()}, +\code{\link{tool_google_url_fetch}()}, +\code{\link{tool_openai_web_search}()} +} +\concept{built-in tools} diff --git a/man/tool_openai_web_search.Rd b/man/tool_openai_web_search.Rd new file mode 100644 index 00000000..b1cf8558 --- /dev/null +++ b/man/tool_openai_web_search.Rd @@ -0,0 +1,46 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/tools-web.R +\name{tool_openai_web_search} +\alias{tool_openai_web_search} +\title{OpenAI web search tool} +\usage{ +tool_openai_web_search( + allowed_domains = NULL, + user_location = NULL, + external_web_access = TRUE +) +} +\arguments{ +\item{allowed_domains}{Character vector. Restrict searches to specific domains +(e.g., \code{c("nytimes.com", "bbc.com")}). Maximum 20 domains. URLs will be +automatically cleaned (http/https prefixes removed).} + +\item{user_location}{List with optional elements: \code{country} (2-letter ISO code), +\code{city}, \code{region}, and \code{timezone} (IANA timezone) to localize search results.} + +\item{external_web_access}{Logical. Whether to allow live internet access +(\code{TRUE}, default) or use only cached/indexed results (\code{FALSE}).} +} +\description{ +Enables OpenAI models to search the web for up-to-date information. The search +behavior varies by model: non-reasoning models perform simple searches, while +reasoning models can perform agentic, iterative searches. + +Learn more at \url{https://platform.openai.com/docs/guides/tools-web-search} +} +\examples{ +\dontrun{ +# Basic web search +chat <- chat_openai_responses(model = "gpt-5") +chat$register_tool(tool_openai_web_search()) +chat$chat("What happened in the news today?") +} +} +\seealso{ +Other built-in tools: +\code{\link{tool_claude_web_fetch}()}, +\code{\link{tool_claude_web_search}()}, +\code{\link{tool_google_url_fetch}()}, +\code{\link{tool_google_web_search}()} +} +\concept{built-in tools} From 0c0a26458e5f7fdd462228f1e64b61b292d65ab7 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Thu, 6 Nov 2025 15:30:35 -0600 Subject: [PATCH 02/17] Move to own files --- DESCRIPTION | 4 +- R/{tools-web.R => provider-anthropic-tools.R} | 102 ------------------ R/provider-google-tools.R | 45 ++++++++ R/provider-openai-tools.R | 49 +++++++++ man/tool_claude_web_fetch.Rd | 2 +- man/tool_claude_web_search.Rd | 2 +- man/tool_google_url_fetch.Rd | 2 +- man/tool_google_web_search.Rd | 2 +- man/tool_openai_web_search.Rd | 2 +- 9 files changed, 102 insertions(+), 108 deletions(-) rename R/{tools-web.R => provider-anthropic-tools.R} (53%) create mode 100644 R/provider-google-tools.R create mode 100644 R/provider-openai-tools.R diff --git a/DESCRIPTION b/DESCRIPTION index 7d9588ff..2462f307 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -88,6 +88,7 @@ Collate: 'live.R' 'parallel-chat.R' 'params.R' + 'provider-anthropic-tools.R' 'provider-anthropic.R' 'provider-any.R' 'provider-aws.R' @@ -98,12 +99,14 @@ Collate: 'provider-databricks.R' 'provider-deepseek.R' 'provider-github.R' + 'provider-google-tools.R' 'provider-google-upload.R' 'provider-groq.R' 'provider-huggingface.R' 'provider-mistral.R' 'provider-ollama.R' 'provider-openai-responses.R' + 'provider-openai-tools.R' 'provider-openrouter.R' 'provider-perplexity.R' 'provider-portkey.R' @@ -113,7 +116,6 @@ Collate: 'tokens.R' 'tools-built-in.R' 'tools-def-auto.R' - 'tools-web.R' 'utils-auth.R' 'utils-callbacks.R' 'utils-cat.R' diff --git a/R/tools-web.R b/R/provider-anthropic-tools.R similarity index 53% rename from R/tools-web.R rename to R/provider-anthropic-tools.R index f5dbc5f8..84a1e1f4 100644 --- a/R/tools-web.R +++ b/R/provider-anthropic-tools.R @@ -1,6 +1,3 @@ -#' @include tools-built-in.R -NULL - #' Claude web search tool #' #' @description @@ -103,102 +100,3 @@ tool_claude_web_fetch <- function( )) ToolBuiltIn("claude_web_fetch", json) } - -# Google tools ---- - -#' Google web search (grounding) tool -#' -#' @description -#' Enables Gemini models to search the web for up-to-date information and ground -#' responses with citations to sources. The model automatically decides when -#' (and how) to search the web based on your prompt. Search results are -#' incorporated into the response with grounding metadata including source -#' URLs and titles. -#' -#' Learn more in . -#' -#' @family built-in tools -#' @export -#' @examples -#' \dontrun{ -#' chat <- chat_google_gemini(model = "gemini-2.5-flash") -#' chat$register_tool(tool_google_web_search()) -#' chat$chat("What's in the news today?") -#' } -tool_google_web_search <- function() { - ToolBuiltIn("google_web_search", list(google_search = set_names(list()))) -} - -#' Google URL fetch tool -#' -#' @description -#' When this tool is enabled, you can include URLs directly in your prompts and -#' Gemini will fetch and analyze the content. -#' -#' Learn more in . -#' -#' @family built-in tools -#' @export -#' @examples -#' \dontrun{ -#' chat <- chat_google_gemini(model = "gemini-2.5-flash") -#' chat$register_tool(tool_google_url_fetch()) -#' chat$chat("Fetch and summarize https://tidyverse.org/blog") -#' } -tool_google_url_fetch <- function() { - ToolBuiltIn( - name = "google_url_context", - json = list(url_context = set_names(list())) - ) -} - - -#' OpenAI web search tool -#' -#' @description -#' Enables OpenAI models to search the web for up-to-date information. The search -#' behavior varies by model: non-reasoning models perform simple searches, while -#' reasoning models can perform agentic, iterative searches. -#' -#' Learn more at -#' -#' @param allowed_domains Character vector. Restrict searches to specific domains -#' (e.g., `c("nytimes.com", "bbc.com")`). Maximum 20 domains. URLs will be -#' automatically cleaned (http/https prefixes removed). -#' @param user_location List with optional elements: `country` (2-letter ISO code), -#' `city`, `region`, and `timezone` (IANA timezone) to localize search results. -#' @param external_web_access Logical. Whether to allow live internet access -#' (`TRUE`, default) or use only cached/indexed results (`FALSE`). -#' -#' @family built-in tools -#' @export -#' @examples -#' \dontrun{ -#' # Basic web search -#' chat <- chat_openai_responses(model = "gpt-5") -#' chat$register_tool(tool_openai_web_search()) -#' chat$chat("What happened in the news today?") -#' } -tool_openai_web_search <- function( - allowed_domains = NULL, - user_location = NULL, - external_web_access = TRUE -) { - check_character(allowed_domains, allow_null = TRUE) - check_bool(external_web_access) - - # Strip http/https from domains - if (!is.null(allowed_domains)) { - allowed_domains <- sub("^https?://", "", allowed_domains) - } - - json <- compact(list( - type = "web_search", - filters = if (!is.null(allowed_domains)) { - list(allowed_domains = allowed_domains) - }, - user_location = user_location, - external_web_access = external_web_access - )) - ToolBuiltIn("openai_web_search", json) -} diff --git a/R/provider-google-tools.R b/R/provider-google-tools.R new file mode 100644 index 00000000..c90ace98 --- /dev/null +++ b/R/provider-google-tools.R @@ -0,0 +1,45 @@ +#' Google web search (grounding) tool +#' +#' @description +#' Enables Gemini models to search the web for up-to-date information and ground +#' responses with citations to sources. The model automatically decides when +#' (and how) to search the web based on your prompt. Search results are +#' incorporated into the response with grounding metadata including source +#' URLs and titles. +#' +#' Learn more in . +#' +#' @family built-in tools +#' @export +#' @examples +#' \dontrun{ +#' chat <- chat_google_gemini(model = "gemini-2.5-flash") +#' chat$register_tool(tool_google_web_search()) +#' chat$chat("What's in the news today?") +#' } +tool_google_web_search <- function() { + ToolBuiltIn("google_web_search", list(google_search = set_names(list()))) +} + +#' Google URL fetch tool +#' +#' @description +#' When this tool is enabled, you can include URLs directly in your prompts and +#' Gemini will fetch and analyze the content. +#' +#' Learn more in . +#' +#' @family built-in tools +#' @export +#' @examples +#' \dontrun{ +#' chat <- chat_google_gemini(model = "gemini-2.5-flash") +#' chat$register_tool(tool_google_url_fetch()) +#' chat$chat("Fetch and summarize https://tidyverse.org/blog") +#' } +tool_google_url_fetch <- function() { + ToolBuiltIn( + name = "google_url_context", + json = list(url_context = set_names(list())) + ) +} diff --git a/R/provider-openai-tools.R b/R/provider-openai-tools.R new file mode 100644 index 00000000..421f7aff --- /dev/null +++ b/R/provider-openai-tools.R @@ -0,0 +1,49 @@ +#' OpenAI web search tool +#' +#' @description +#' Enables OpenAI models to search the web for up-to-date information. The search +#' behavior varies by model: non-reasoning models perform simple searches, while +#' reasoning models can perform agentic, iterative searches. +#' +#' Learn more at +#' +#' @param allowed_domains Character vector. Restrict searches to specific domains +#' (e.g., `c("nytimes.com", "bbc.com")`). Maximum 20 domains. URLs will be +#' automatically cleaned (http/https prefixes removed). +#' @param user_location List with optional elements: `country` (2-letter ISO code), +#' `city`, `region`, and `timezone` (IANA timezone) to localize search results. +#' @param external_web_access Logical. Whether to allow live internet access +#' (`TRUE`, default) or use only cached/indexed results (`FALSE`). +#' +#' @family built-in tools +#' @export +#' @examples +#' \dontrun{ +#' # Basic web search +#' chat <- chat_openai_responses(model = "gpt-5") +#' chat$register_tool(tool_openai_web_search()) +#' chat$chat("What happened in the news today?") +#' } +tool_openai_web_search <- function( + allowed_domains = NULL, + user_location = NULL, + external_web_access = TRUE +) { + check_character(allowed_domains, allow_null = TRUE) + check_bool(external_web_access) + + # Strip http/https from domains + if (!is.null(allowed_domains)) { + allowed_domains <- sub("^https?://", "", allowed_domains) + } + + json <- compact(list( + type = "web_search", + filters = if (!is.null(allowed_domains)) { + list(allowed_domains = allowed_domains) + }, + user_location = user_location, + external_web_access = external_web_access + )) + ToolBuiltIn("openai_web_search", json) +} diff --git a/man/tool_claude_web_fetch.Rd b/man/tool_claude_web_fetch.Rd index eddd51db..fc24343a 100644 --- a/man/tool_claude_web_fetch.Rd +++ b/man/tool_claude_web_fetch.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/tools-web.R +% Please edit documentation in R/provider-anthropic-tools.R \name{tool_claude_web_fetch} \alias{tool_claude_web_fetch} \title{Claude web fetch tool} diff --git a/man/tool_claude_web_search.Rd b/man/tool_claude_web_search.Rd index 53c19cfe..a62e8745 100644 --- a/man/tool_claude_web_search.Rd +++ b/man/tool_claude_web_search.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/tools-web.R +% Please edit documentation in R/provider-anthropic-tools.R \name{tool_claude_web_search} \alias{tool_claude_web_search} \title{Claude web search tool} diff --git a/man/tool_google_url_fetch.Rd b/man/tool_google_url_fetch.Rd index bf6541b1..98d7e3ae 100644 --- a/man/tool_google_url_fetch.Rd +++ b/man/tool_google_url_fetch.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/tools-web.R +% Please edit documentation in R/provider-google-tools.R \name{tool_google_url_fetch} \alias{tool_google_url_fetch} \title{Google URL fetch tool} diff --git a/man/tool_google_web_search.Rd b/man/tool_google_web_search.Rd index ffbef3f2..f43962ff 100644 --- a/man/tool_google_web_search.Rd +++ b/man/tool_google_web_search.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/tools-web.R +% Please edit documentation in R/provider-google-tools.R \name{tool_google_web_search} \alias{tool_google_web_search} \title{Google web search (grounding) tool} diff --git a/man/tool_openai_web_search.Rd b/man/tool_openai_web_search.Rd index b1cf8558..d4461126 100644 --- a/man/tool_openai_web_search.Rd +++ b/man/tool_openai_web_search.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/tools-web.R +% Please edit documentation in R/provider-openai-tools.R \name{tool_openai_web_search} \alias{tool_openai_web_search} \title{OpenAI web search tool} From efdb6e714cd869ec1db3c7c464e72643fa1a80b3 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Thu, 6 Nov 2025 16:29:29 -0600 Subject: [PATCH 03/17] Implement request + response types for search + fetch for claude --- R/provider-anthropic-tools.R | 12 +++-- R/provider-anthropic.R | 32 +++++++++++++ R/tools-built-in.R | 84 +++++++++++++++++++++++++++++++++++ R/utils.R | 7 +++ man/tool_claude_web_fetch.Rd | 9 ++-- man/tool_claude_web_search.Rd | 3 +- 6 files changed, 133 insertions(+), 14 deletions(-) diff --git a/R/provider-anthropic-tools.R b/R/provider-anthropic-tools.R index 84a1e1f4..1f858cda 100644 --- a/R/provider-anthropic-tools.R +++ b/R/provider-anthropic-tools.R @@ -19,9 +19,10 @@ #' @export #' @examples #' \dontrun{ -#' chat <- chat_claude(model = "claude-sonnet-4-5-20250929") +#' chat <- chat_claude() #' chat$register_tool(tool_claude_web_search()) #' chat$chat("What was in the news today?") +#' chat$chat("What's the biggest news in the economy?") #' } tool_claude_web_search <- function( max_uses = NULL, @@ -69,18 +70,15 @@ tool_claude_web_search <- function( #' @export #' @examples #' \dontrun{ -#' chat <- chat_claude( -#' model = "claude-sonnet-4-5-20250929", -#' beta_headers = "web-fetch-2025-09-10" -#' ) +#' chat <- chat_claude(beta_headers = "web-fetch-2025-09-10") #' chat$register_tool(tool_claude_web_fetch()) -#' chat$chat("Fetch and summarize https://tidyverse.org/blog") +#' chat$chat("What are the latest package releases on https://tidyverse.org/blog") #' } tool_claude_web_fetch <- function( max_uses = NULL, allowed_domains = NULL, blocked_domains = NULL, - citations = TRUE, + citations = FALSE, max_content_tokens = NULL ) { check_exclusive(allowed_domains, blocked_domains, .require = FALSE) diff --git a/R/provider-anthropic.R b/R/provider-anthropic.R index 030d4eef..66af80f0 100644 --- a/R/provider-anthropic.R +++ b/R/provider-anthropic.R @@ -302,6 +302,12 @@ method(stream_merge_chunks, ProviderAnthropic) <- function( paste(result$content[[i]]$thinking) <- chunk$delta$thinking } else if (chunk$delta$type == "signature_delta") { paste(result$content[[i]]$signature) <- chunk$delta$signature + } else if (chunk$delta$type == "citations_delta") { + # https://docs.claude.com/en/docs/build-with-claude/citations#streaming-support + result$content[[i]]$citations <- c( + result$content[[i]]$citations, + list(chunk$delta$citation) + ) } else { cli::cli_inform(c("!" = "Unknown delta type {.str {chunk$delta$type}}.")) } @@ -353,6 +359,32 @@ method(value_turn, ProviderAnthropic) <- function( } ContentToolRequest(content$id, content$name, content$input) } + } else if (content$type == "server_tool_use") { + # Sends a string, but expects parsed json to be sent back + content$input <- parse_json(content$input) + + # https://docs.claude.com/en/docs/agents-and-tools/tool-use/web-search-tool#response + if (content$name == "web_search") { + ContentToolRequestSearch( + query = content$input$query, + json = content + ) + } else if (content$name == "web_fetch") { + ContentToolRequestFetch( + url = content$input$url, + json = content + ) + } else { + cli::cli_abort("Unknown server tool {.str {content$name}}.") + } + } else if (content$type == "web_search_tool_result") { + urls <- map_chr(content$content, \(x) x$url) + ContentToolResponseSearch( + url = urls, + json = content + ) + } else if (content$type == "web_fetch_tool_result") { + ContentToolResponseFetch(url = content$url %||% "failed", json = content) } else if (content$type == "thinking") { ContentThinking( content$thinking, diff --git a/R/tools-built-in.R b/R/tools-built-in.R index f087b8ae..0c165957 100644 --- a/R/tools-built-in.R +++ b/R/tools-built-in.R @@ -9,3 +9,87 @@ ToolBuiltIn <- new_class( method(as_json, list(Provider, ToolBuiltIn)) <- function(provider, x, ...) { x@json } + +# Web search --------------------------------------------------------------- + +ContentToolRequestSearch <- new_class( + "ContentToolRequestSearch", + parent = Content, + properties = list( + query = prop_string(), + json = class_list + ) +) +method(format, ContentToolRequestSearch) <- function(x, ...) { + cli::format_inline("[{.strong web search request}]: {.str {x@query}}") +} +method(as_json, list(Provider, ContentToolRequestSearch)) <- function( + provider, + x, + ... +) { + x@json +} + +ContentToolResponseSearch <- new_class( + "ContentToolResponseSearch", + parent = Content, + properties = list( + urls = class_character, + json = class_list + ) +) +method(format, ContentToolResponseSearch) <- function(x, ...) { + paste0( + cli::format_inline("[{.strong web search results}]:\n"), + paste0("* ", x@urls, "\n", collapse = "") + ) +} + +method(as_json, list(Provider, ContentToolResponseSearch)) <- function( + provider, + x, + ... +) { + x@json +} + +# Web fetch ------------------------------------------------------------------- + +ContentToolRequestFetch <- new_class( + "ContentToolRequestFetch", + parent = Content, + properties = list( + url = prop_string(), + json = class_list + ) +) +method(format, ContentToolRequestFetch) <- function(x, ...) { + cli::format_inline("[{.strong web fetch request}]: {.url {x@url}}") +} +method(as_json, list(Provider, ContentToolRequestFetch)) <- function( + provider, + x, + ... +) { + x@json +} + +ContentToolResponseFetch <- new_class( + "ContentToolResponseFetch", + parent = Content, + properties = list( + url = prop_string(), + json = class_list + ) +) +method(format, ContentToolResponseFetch) <- function(x, ...) { + cli::format_inline("[{.strong web fetch result}]: {.url {x@url}}") +} +method(as_json, list(Provider, ContentToolResponseFetch)) <- function( + provider, + x, + ... +) { + x@json +} diff --git a/R/utils.R b/R/utils.R index 8156982d..444cfb6b 100644 --- a/R/utils.R +++ b/R/utils.R @@ -60,6 +60,13 @@ pretty_json <- function(x) { jsonlite::toJSON(x, pretty = TRUE, auto_unbox = TRUE) } +parse_json <- function(x) { + tryCatch( + jsonlite::fromJSON(x, simplifyVector = FALSE), + error = function(cnd) NULL + ) +} + read_ndjson <- function(path) { lines <- readLines(path, warn = FALSE) lapply(lines, jsonlite::fromJSON, simplifyVector = FALSE) diff --git a/man/tool_claude_web_fetch.Rd b/man/tool_claude_web_fetch.Rd index fc24343a..d70199f9 100644 --- a/man/tool_claude_web_fetch.Rd +++ b/man/tool_claude_web_fetch.Rd @@ -8,7 +8,7 @@ tool_claude_web_fetch( max_uses = NULL, allowed_domains = NULL, blocked_domains = NULL, - citations = TRUE, + citations = FALSE, max_content_tokens = NULL ) } @@ -36,12 +36,9 @@ Learn more in \url{https://docs.claude.com/en/docs/agents-and-tools/tool-use/web } \examples{ \dontrun{ -chat <- chat_claude( - model = "claude-sonnet-4-5-20250929", - beta_headers = "web-fetch-2025-09-10" -) +chat <- chat_claude(beta_headers = "web-fetch-2025-09-10") chat$register_tool(tool_claude_web_fetch()) -chat$chat("Fetch and summarize https://tidyverse.org/blog") +chat$chat("What are the latest package releases on https://tidyverse.org/blog") } } \seealso{ diff --git a/man/tool_claude_web_search.Rd b/man/tool_claude_web_search.Rd index a62e8745..c50d2d68 100644 --- a/man/tool_claude_web_search.Rd +++ b/man/tool_claude_web_search.Rd @@ -32,9 +32,10 @@ Learn more in \url{https://docs.claude.com/en/docs/agents-and-tools/tool-use/web } \examples{ \dontrun{ -chat <- chat_claude(model = "claude-sonnet-4-5-20250929") +chat <- chat_claude() chat$register_tool(tool_claude_web_search()) chat$chat("What was in the news today?") +chat$chat("What's the biggest news in the economy?") } } \seealso{ From 7673131c48294f44690344b9ef610801aea08453 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 07:28:10 -0600 Subject: [PATCH 04/17] Group all provider specific helpers together --- _pkgdown.yml | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/_pkgdown.yml b/_pkgdown.yml index a5a3e266..f9a71dac 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -28,6 +28,11 @@ reference: contents: - google_upload - starts_with("anthropic_file") + - tool_claude_web_search + - tool_claude_web_fetch + - tool_google_web_search + - tool_google_url_fetch + - tool_openai_web_search - title: Chat helpers contents: @@ -49,16 +54,6 @@ reference: - tool_reject - type_boolean -- subtitle: Built-in tools - desc: > - Access built-in supplied by individual LLM providers. - contents: - - tool_claude_web_search - - tool_claude_web_fetch - - tool_google_web_search - - tool_google_url_fetch - - tool_openai_web_search - - title: Objects desc: > These classes abstract away behaviour differences in chat providers so From c83821a309f612dd4c1f22f795c475a945ce3128 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 07:30:07 -0600 Subject: [PATCH 05/17] Update google docs --- R/provider-google-tools.R | 9 +++++---- man/tool_google_url_fetch.Rd | 4 ++-- man/tool_google_web_search.Rd | 5 +++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/R/provider-google-tools.R b/R/provider-google-tools.R index c90ace98..bad8e11a 100644 --- a/R/provider-google-tools.R +++ b/R/provider-google-tools.R @@ -13,9 +13,10 @@ #' @export #' @examples #' \dontrun{ -#' chat <- chat_google_gemini(model = "gemini-2.5-flash") +#' chat <- chat_google_gemini() #' chat$register_tool(tool_google_web_search()) -#' chat$chat("What's in the news today?") +#' chat$chat("What was in the news today?") +#' chat$chat("What's the biggest news in the economy?") #' } tool_google_web_search <- function() { ToolBuiltIn("google_web_search", list(google_search = set_names(list()))) @@ -33,9 +34,9 @@ tool_google_web_search <- function() { #' @export #' @examples #' \dontrun{ -#' chat <- chat_google_gemini(model = "gemini-2.5-flash") +#' chat <- chat_google_gemini() #' chat$register_tool(tool_google_url_fetch()) -#' chat$chat("Fetch and summarize https://tidyverse.org/blog") +#' chat$chat("What are the latest package releases on https://tidyverse.org/blog?") #' } tool_google_url_fetch <- function() { ToolBuiltIn( diff --git a/man/tool_google_url_fetch.Rd b/man/tool_google_url_fetch.Rd index 98d7e3ae..fe823bd8 100644 --- a/man/tool_google_url_fetch.Rd +++ b/man/tool_google_url_fetch.Rd @@ -14,9 +14,9 @@ Learn more in \url{https://ai.google.dev/gemini-api/docs/url-context}. } \examples{ \dontrun{ -chat <- chat_google_gemini(model = "gemini-2.5-flash") +chat <- chat_google_gemini() chat$register_tool(tool_google_url_fetch()) -chat$chat("Fetch and summarize https://tidyverse.org/blog") +chat$chat("What are the latest package releases on https://tidyverse.org/blog?") } } \seealso{ diff --git a/man/tool_google_web_search.Rd b/man/tool_google_web_search.Rd index f43962ff..230277c0 100644 --- a/man/tool_google_web_search.Rd +++ b/man/tool_google_web_search.Rd @@ -17,9 +17,10 @@ Learn more in \url{https://ai.google.dev/gemini-api/docs/google-search}. } \examples{ \dontrun{ -chat <- chat_google_gemini(model = "gemini-2.5-flash") +chat <- chat_google_gemini() chat$register_tool(tool_google_web_search()) -chat$chat("What's in the news today?") +chat$chat("What was in the news today?") +chat$chat("What's the biggest news in the economy?") } } \seealso{ From 9441fb486c093a34c9faf96e21abceb949d4d77e Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 07:41:34 -0600 Subject: [PATCH 06/17] Add content type for openai --- R/provider-openai-tools.R | 6 +++--- R/provider-openai.R | 6 +++++- man/tool_openai_web_search.Rd | 6 +++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/R/provider-openai-tools.R b/R/provider-openai-tools.R index 421f7aff..7668dda8 100644 --- a/R/provider-openai-tools.R +++ b/R/provider-openai-tools.R @@ -19,10 +19,10 @@ #' @export #' @examples #' \dontrun{ -#' # Basic web search -#' chat <- chat_openai_responses(model = "gpt-5") +#' chat <- chat_openai() #' chat$register_tool(tool_openai_web_search()) -#' chat$chat("What happened in the news today?") +#' chat$chat("Very briefly summarise the top 3 news stories of the day") +#' chat$chat("Of those stories, which one do you think was the most interesting?") #' } tool_openai_web_search <- function( allowed_domains = NULL, diff --git a/R/provider-openai.R b/R/provider-openai.R index 60ddcb5a..c63e8220 100644 --- a/R/provider-openai.R +++ b/R/provider-openai.R @@ -305,9 +305,13 @@ method(value_turn, ProviderOpenAI) <- function( "unknown" ) ContentImageInline(mime_type, output$result) + } else if (output$type == "web_search_call") { + # https://platform.openai.com/docs/guides/tools-web-search#output-and-citations + ContentToolRequestSearch(query = output$action$query, json = output) } else { + browser() cli::cli_abort( - "Unknown content type {.str {content$type}}.", + "Unknown content type {.str {output$type}}.", .internal = TRUE ) } diff --git a/man/tool_openai_web_search.Rd b/man/tool_openai_web_search.Rd index d4461126..41bc4794 100644 --- a/man/tool_openai_web_search.Rd +++ b/man/tool_openai_web_search.Rd @@ -30,10 +30,10 @@ Learn more at \url{https://platform.openai.com/docs/guides/tools-web-search} } \examples{ \dontrun{ -# Basic web search -chat <- chat_openai_responses(model = "gpt-5") +chat <- chat_openai() chat$register_tool(tool_openai_web_search()) -chat$chat("What happened in the news today?") +chat$chat("Very briefly summarise the top 3 news stories of the day") +chat$chat("Of those stories, which one do you think was the most interesting?") } } \seealso{ From 018c3425af77b91dde9dcbf84f5a1b24d32c2604 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 08:53:44 -0600 Subject: [PATCH 07/17] Rename --- .claude/settings.local.json | 2 +- NAMESPACE | 10 +++++----- NEWS.md | 6 +++--- R/provider-anthropic-tools.R | 8 ++++---- R/provider-google-tools.R | 8 ++++---- R/provider-openai-tools.R | 4 ++-- _pkgdown.yml | 10 +++++----- ...ude_web_fetch.Rd => claude_tool_web_fetch.Rd} | 16 ++++++++-------- ...e_web_search.Rd => claude_tool_web_search.Rd} | 16 ++++++++-------- ...gle_url_fetch.Rd => google_tool_url_fetch.Rd} | 16 ++++++++-------- ...e_web_search.Rd => google_tool_web_search.Rd} | 16 ++++++++-------- ...i_web_search.Rd => openai_tool_web_search.Rd} | 16 ++++++++-------- 12 files changed, 64 insertions(+), 64 deletions(-) rename man/{tool_claude_web_fetch.Rd => claude_tool_web_fetch.Rd} (83%) rename man/{tool_claude_web_search.Rd => claude_tool_web_search.Rd} (82%) rename man/{tool_google_url_fetch.Rd => google_tool_url_fetch.Rd} (65%) rename man/{tool_google_web_search.Rd => google_tool_web_search.Rd} (72%) rename man/{tool_openai_web_search.Rd => openai_tool_web_search.Rd} (82%) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index be969563..a8cf1993 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -6,7 +6,7 @@ "Bash(R:*)", "Bash(rm:*)", "Bash(air format:*)", - "Edit(/**)", + "Edit(**)" ], "deny": [] } diff --git a/NAMESPACE b/NAMESPACE index 8013195a..9a12fa51 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -60,6 +60,8 @@ export(chat_perplexity) export(chat_portkey) export(chat_snowflake) export(chat_vllm) +export(claude_tool_web_fetch) +export(claude_tool_web_search) export(content_image_file) export(content_image_plot) export(content_image_url) @@ -72,6 +74,8 @@ export(contents_replay) export(contents_text) export(create_tool_def) export(df_schema) +export(google_tool_url_fetch) +export(google_tool_web_search) export(google_upload) export(has_credentials) export(interpolate) @@ -89,6 +93,7 @@ export(models_ollama) export(models_openai) export(models_portkey) export(models_vllm) +export(openai_tool_web_search) export(parallel_chat) export(parallel_chat_structured) export(parallel_chat_text) @@ -96,11 +101,6 @@ export(params) export(token_usage) export(tool) export(tool_annotations) -export(tool_claude_web_fetch) -export(tool_claude_web_search) -export(tool_google_url_fetch) -export(tool_google_web_search) -export(tool_openai_web_search) export(tool_reject) export(type_array) export(type_boolean) diff --git a/NEWS.md b/NEWS.md index 72f8c0ac..625c5413 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,9 +1,9 @@ # ellmer (development version) * New web search and fetch tools (#578): - - `tool_claude_web_search()` and `tool_claude_web_fetch()` for Claude. - - `tool_google_web_search()` and `tool_google_url_fetch()` for Gemini. - - `tool_openai_web_search()` for OpenAI. + - `claude_tool_web_search()` and `claude_tool_web_fetch()` for Claude. + - `google_tool_web_search()` and `google_tool_url_fetch()` for Gemini. + - `openai_tool_web_search()` for OpenAI. If you want to do web fetch for other providers, you could use `btw::btw_tool_web_read_url()`. * `parallel_chat()` and `batch_chat()` are no longer experimental. diff --git a/R/provider-anthropic-tools.R b/R/provider-anthropic-tools.R index 1f858cda..4c3f53a7 100644 --- a/R/provider-anthropic-tools.R +++ b/R/provider-anthropic-tools.R @@ -20,11 +20,11 @@ #' @examples #' \dontrun{ #' chat <- chat_claude() -#' chat$register_tool(tool_claude_web_search()) +#' chat$register_tool(claude_tool_web_search()) #' chat$chat("What was in the news today?") #' chat$chat("What's the biggest news in the economy?") #' } -tool_claude_web_search <- function( +claude_tool_web_search <- function( max_uses = NULL, allowed_domains = NULL, blocked_domains = NULL, @@ -71,10 +71,10 @@ tool_claude_web_search <- function( #' @examples #' \dontrun{ #' chat <- chat_claude(beta_headers = "web-fetch-2025-09-10") -#' chat$register_tool(tool_claude_web_fetch()) +#' chat$register_tool(claude_tool_web_fetch()) #' chat$chat("What are the latest package releases on https://tidyverse.org/blog") #' } -tool_claude_web_fetch <- function( +claude_tool_web_fetch <- function( max_uses = NULL, allowed_domains = NULL, blocked_domains = NULL, diff --git a/R/provider-google-tools.R b/R/provider-google-tools.R index bad8e11a..6831ec5c 100644 --- a/R/provider-google-tools.R +++ b/R/provider-google-tools.R @@ -14,11 +14,11 @@ #' @examples #' \dontrun{ #' chat <- chat_google_gemini() -#' chat$register_tool(tool_google_web_search()) +#' chat$register_tool(google_tool_web_search()) #' chat$chat("What was in the news today?") #' chat$chat("What's the biggest news in the economy?") #' } -tool_google_web_search <- function() { +google_tool_web_search <- function() { ToolBuiltIn("google_web_search", list(google_search = set_names(list()))) } @@ -35,10 +35,10 @@ tool_google_web_search <- function() { #' @examples #' \dontrun{ #' chat <- chat_google_gemini() -#' chat$register_tool(tool_google_url_fetch()) +#' chat$register_tool(google_tool_url_fetch()) #' chat$chat("What are the latest package releases on https://tidyverse.org/blog?") #' } -tool_google_url_fetch <- function() { +google_tool_url_fetch <- function() { ToolBuiltIn( name = "google_url_context", json = list(url_context = set_names(list())) diff --git a/R/provider-openai-tools.R b/R/provider-openai-tools.R index 7668dda8..61964511 100644 --- a/R/provider-openai-tools.R +++ b/R/provider-openai-tools.R @@ -20,11 +20,11 @@ #' @examples #' \dontrun{ #' chat <- chat_openai() -#' chat$register_tool(tool_openai_web_search()) +#' chat$register_tool(openai_tool_web_search()) #' chat$chat("Very briefly summarise the top 3 news stories of the day") #' chat$chat("Of those stories, which one do you think was the most interesting?") #' } -tool_openai_web_search <- function( +openai_tool_web_search <- function( allowed_domains = NULL, user_location = NULL, external_web_access = TRUE diff --git a/_pkgdown.yml b/_pkgdown.yml index f9a71dac..cb06e393 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -28,11 +28,11 @@ reference: contents: - google_upload - starts_with("anthropic_file") - - tool_claude_web_search - - tool_claude_web_fetch - - tool_google_web_search - - tool_google_url_fetch - - tool_openai_web_search + - claude_tool_web_search + - claude_tool_web_fetch + - google_tool_web_search + - google_tool_url_fetch + - openai_tool_web_search - title: Chat helpers contents: diff --git a/man/tool_claude_web_fetch.Rd b/man/claude_tool_web_fetch.Rd similarity index 83% rename from man/tool_claude_web_fetch.Rd rename to man/claude_tool_web_fetch.Rd index d70199f9..52bfb2d3 100644 --- a/man/tool_claude_web_fetch.Rd +++ b/man/claude_tool_web_fetch.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/provider-anthropic-tools.R -\name{tool_claude_web_fetch} -\alias{tool_claude_web_fetch} +\name{claude_tool_web_fetch} +\alias{claude_tool_web_fetch} \title{Claude web fetch tool} \usage{ -tool_claude_web_fetch( +claude_tool_web_fetch( max_uses = NULL, allowed_domains = NULL, blocked_domains = NULL, @@ -37,15 +37,15 @@ Learn more in \url{https://docs.claude.com/en/docs/agents-and-tools/tool-use/web \examples{ \dontrun{ chat <- chat_claude(beta_headers = "web-fetch-2025-09-10") -chat$register_tool(tool_claude_web_fetch()) +chat$register_tool(claude_tool_web_fetch()) chat$chat("What are the latest package releases on https://tidyverse.org/blog") } } \seealso{ Other built-in tools: -\code{\link{tool_claude_web_search}()}, -\code{\link{tool_google_url_fetch}()}, -\code{\link{tool_google_web_search}()}, -\code{\link{tool_openai_web_search}()} +\code{\link{claude_tool_web_search}()}, +\code{\link{google_tool_url_fetch}()}, +\code{\link{google_tool_web_search}()}, +\code{\link{openai_tool_web_search}()} } \concept{built-in tools} diff --git a/man/tool_claude_web_search.Rd b/man/claude_tool_web_search.Rd similarity index 82% rename from man/tool_claude_web_search.Rd rename to man/claude_tool_web_search.Rd index c50d2d68..c784a92a 100644 --- a/man/tool_claude_web_search.Rd +++ b/man/claude_tool_web_search.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/provider-anthropic-tools.R -\name{tool_claude_web_search} -\alias{tool_claude_web_search} +\name{claude_tool_web_search} +\alias{claude_tool_web_search} \title{Claude web search tool} \usage{ -tool_claude_web_search( +claude_tool_web_search( max_uses = NULL, allowed_domains = NULL, blocked_domains = NULL, @@ -33,16 +33,16 @@ Learn more in \url{https://docs.claude.com/en/docs/agents-and-tools/tool-use/web \examples{ \dontrun{ chat <- chat_claude() -chat$register_tool(tool_claude_web_search()) +chat$register_tool(claude_tool_web_search()) chat$chat("What was in the news today?") chat$chat("What's the biggest news in the economy?") } } \seealso{ Other built-in tools: -\code{\link{tool_claude_web_fetch}()}, -\code{\link{tool_google_url_fetch}()}, -\code{\link{tool_google_web_search}()}, -\code{\link{tool_openai_web_search}()} +\code{\link{claude_tool_web_fetch}()}, +\code{\link{google_tool_url_fetch}()}, +\code{\link{google_tool_web_search}()}, +\code{\link{openai_tool_web_search}()} } \concept{built-in tools} diff --git a/man/tool_google_url_fetch.Rd b/man/google_tool_url_fetch.Rd similarity index 65% rename from man/tool_google_url_fetch.Rd rename to man/google_tool_url_fetch.Rd index fe823bd8..2321d904 100644 --- a/man/tool_google_url_fetch.Rd +++ b/man/google_tool_url_fetch.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/provider-google-tools.R -\name{tool_google_url_fetch} -\alias{tool_google_url_fetch} +\name{google_tool_url_fetch} +\alias{google_tool_url_fetch} \title{Google URL fetch tool} \usage{ -tool_google_url_fetch() +google_tool_url_fetch() } \description{ When this tool is enabled, you can include URLs directly in your prompts and @@ -15,15 +15,15 @@ Learn more in \url{https://ai.google.dev/gemini-api/docs/url-context}. \examples{ \dontrun{ chat <- chat_google_gemini() -chat$register_tool(tool_google_url_fetch()) +chat$register_tool(google_tool_url_fetch()) chat$chat("What are the latest package releases on https://tidyverse.org/blog?") } } \seealso{ Other built-in tools: -\code{\link{tool_claude_web_fetch}()}, -\code{\link{tool_claude_web_search}()}, -\code{\link{tool_google_web_search}()}, -\code{\link{tool_openai_web_search}()} +\code{\link{claude_tool_web_fetch}()}, +\code{\link{claude_tool_web_search}()}, +\code{\link{google_tool_web_search}()}, +\code{\link{openai_tool_web_search}()} } \concept{built-in tools} diff --git a/man/tool_google_web_search.Rd b/man/google_tool_web_search.Rd similarity index 72% rename from man/tool_google_web_search.Rd rename to man/google_tool_web_search.Rd index 230277c0..f2164ef8 100644 --- a/man/tool_google_web_search.Rd +++ b/man/google_tool_web_search.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/provider-google-tools.R -\name{tool_google_web_search} -\alias{tool_google_web_search} +\name{google_tool_web_search} +\alias{google_tool_web_search} \title{Google web search (grounding) tool} \usage{ -tool_google_web_search() +google_tool_web_search() } \description{ Enables Gemini models to search the web for up-to-date information and ground @@ -18,16 +18,16 @@ Learn more in \url{https://ai.google.dev/gemini-api/docs/google-search}. \examples{ \dontrun{ chat <- chat_google_gemini() -chat$register_tool(tool_google_web_search()) +chat$register_tool(google_tool_web_search()) chat$chat("What was in the news today?") chat$chat("What's the biggest news in the economy?") } } \seealso{ Other built-in tools: -\code{\link{tool_claude_web_fetch}()}, -\code{\link{tool_claude_web_search}()}, -\code{\link{tool_google_url_fetch}()}, -\code{\link{tool_openai_web_search}()} +\code{\link{claude_tool_web_fetch}()}, +\code{\link{claude_tool_web_search}()}, +\code{\link{google_tool_url_fetch}()}, +\code{\link{openai_tool_web_search}()} } \concept{built-in tools} diff --git a/man/tool_openai_web_search.Rd b/man/openai_tool_web_search.Rd similarity index 82% rename from man/tool_openai_web_search.Rd rename to man/openai_tool_web_search.Rd index 41bc4794..5941bcd2 100644 --- a/man/tool_openai_web_search.Rd +++ b/man/openai_tool_web_search.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/provider-openai-tools.R -\name{tool_openai_web_search} -\alias{tool_openai_web_search} +\name{openai_tool_web_search} +\alias{openai_tool_web_search} \title{OpenAI web search tool} \usage{ -tool_openai_web_search( +openai_tool_web_search( allowed_domains = NULL, user_location = NULL, external_web_access = TRUE @@ -31,16 +31,16 @@ Learn more at \url{https://platform.openai.com/docs/guides/tools-web-search} \examples{ \dontrun{ chat <- chat_openai() -chat$register_tool(tool_openai_web_search()) +chat$register_tool(openai_tool_web_search()) chat$chat("Very briefly summarise the top 3 news stories of the day") chat$chat("Of those stories, which one do you think was the most interesting?") } } \seealso{ Other built-in tools: -\code{\link{tool_claude_web_fetch}()}, -\code{\link{tool_claude_web_search}()}, -\code{\link{tool_google_url_fetch}()}, -\code{\link{tool_google_web_search}()} +\code{\link{claude_tool_web_fetch}()}, +\code{\link{claude_tool_web_search}()}, +\code{\link{google_tool_url_fetch}()}, +\code{\link{google_tool_web_search}()} } \concept{built-in tools} From ad15423625b43782132cf6c20b55f704388f2812 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 08:54:20 -0600 Subject: [PATCH 08/17] Use shorter tool names --- R/provider-anthropic-tools.R | 4 ++-- R/provider-google-tools.R | 7 ++----- R/provider-openai-tools.R | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/R/provider-anthropic-tools.R b/R/provider-anthropic-tools.R index 4c3f53a7..d2244ccb 100644 --- a/R/provider-anthropic-tools.R +++ b/R/provider-anthropic-tools.R @@ -44,7 +44,7 @@ claude_tool_web_search <- function( blocked_domains = blocked_domains, user_location = user_location )) - ToolBuiltIn("claude_web_search", json = json) + ToolBuiltIn("web_search", json = json) } #' Claude web fetch tool @@ -96,5 +96,5 @@ claude_tool_web_fetch <- function( citations = list(enabled = citations), max_content_tokens = max_content_tokens )) - ToolBuiltIn("claude_web_fetch", json) + ToolBuiltIn("web_fetch", json) } diff --git a/R/provider-google-tools.R b/R/provider-google-tools.R index 6831ec5c..fa659bd0 100644 --- a/R/provider-google-tools.R +++ b/R/provider-google-tools.R @@ -19,7 +19,7 @@ #' chat$chat("What's the biggest news in the economy?") #' } google_tool_web_search <- function() { - ToolBuiltIn("google_web_search", list(google_search = set_names(list()))) + ToolBuiltIn("web_search", list(google_search = set_names(list()))) } #' Google URL fetch tool @@ -39,8 +39,5 @@ google_tool_web_search <- function() { #' chat$chat("What are the latest package releases on https://tidyverse.org/blog?") #' } google_tool_url_fetch <- function() { - ToolBuiltIn( - name = "google_url_context", - json = list(url_context = set_names(list())) - ) + ToolBuiltIn(name = "web_fetch", json = list(url_context = set_names(list()))) } diff --git a/R/provider-openai-tools.R b/R/provider-openai-tools.R index 61964511..f8fad8c7 100644 --- a/R/provider-openai-tools.R +++ b/R/provider-openai-tools.R @@ -45,5 +45,5 @@ openai_tool_web_search <- function( user_location = user_location, external_web_access = external_web_access )) - ToolBuiltIn("openai_web_search", json) + ToolBuiltIn("web_search", json) } From d7a8fd35525e909ff07ea89e6e2e044f92621a61 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 09:05:12 -0600 Subject: [PATCH 09/17] Add test for web fetch and fix problems thus revealed --- NAMESPACE | 2 +- NEWS.md | 2 +- R/provider-anthropic.R | 9 +- R/provider-google-tools.R | 4 +- _pkgdown.yml | 2 +- man/claude_tool_web_fetch.Rd | 2 +- man/claude_tool_web_search.Rd | 2 +- ..._url_fetch.Rd => google_tool_web_fetch.Rd} | 8 +- man/google_tool_web_search.Rd | 2 +- man/openai_tool_web_search.Rd | 2 +- tests/testthat/_vcr/anthropic-web-fetch.yml | 94 ++++++++++++++++ tests/testthat/_vcr/google-web-fetch.yml | 101 ++++++++++++++++++ tests/testthat/helper-provider.R | 11 ++ tests/testthat/test-provider-anthropic.R | 6 ++ tests/testthat/test-provider-google.R | 6 ++ 15 files changed, 236 insertions(+), 17 deletions(-) rename man/{google_tool_url_fetch.Rd => google_tool_web_fetch.Rd} (84%) create mode 100644 tests/testthat/_vcr/anthropic-web-fetch.yml create mode 100644 tests/testthat/_vcr/google-web-fetch.yml diff --git a/NAMESPACE b/NAMESPACE index 9a12fa51..d7ac2ab5 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -74,7 +74,7 @@ export(contents_replay) export(contents_text) export(create_tool_def) export(df_schema) -export(google_tool_url_fetch) +export(google_tool_web_fetch) export(google_tool_web_search) export(google_upload) export(has_credentials) diff --git a/NEWS.md b/NEWS.md index 625c5413..6a21d48a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,7 +2,7 @@ * New web search and fetch tools (#578): - `claude_tool_web_search()` and `claude_tool_web_fetch()` for Claude. - - `google_tool_web_search()` and `google_tool_url_fetch()` for Gemini. + - `google_tool_web_search()` and `google_tool_web_fetch()` for Gemini. - `openai_tool_web_search()` for OpenAI. If you want to do web fetch for other providers, you could use `btw::btw_tool_web_read_url()`. diff --git a/R/provider-anthropic.R b/R/provider-anthropic.R index 31848890..608b4a49 100644 --- a/R/provider-anthropic.R +++ b/R/provider-anthropic.R @@ -362,16 +362,17 @@ method(value_turn, ProviderAnthropic) <- function( ContentToolRequest(content$id, content$name, content$input) } } else if (content$type == "server_tool_use") { - # Sends a string, but expects parsed json to be sent back - content$input <- parse_json(content$input) - - # https://docs.claude.com/en/docs/agents-and-tools/tool-use/web-search-tool#response if (content$name == "web_search") { + # Sends a string, but expects parsed json to be sent back + content$input <- parse_json(content$input) + + # https://docs.claude.com/en/docs/agents-and-tools/tool-use/web-search-tool#response ContentToolRequestSearch( query = content$input$query, json = content ) } else if (content$name == "web_fetch") { + # https://docs.claude.com/en/docs/agents-and-tools/tool-use/web-fetch-tool#response ContentToolRequestFetch( url = content$input$url, json = content diff --git a/R/provider-google-tools.R b/R/provider-google-tools.R index fa659bd0..7a26885f 100644 --- a/R/provider-google-tools.R +++ b/R/provider-google-tools.R @@ -35,9 +35,9 @@ google_tool_web_search <- function() { #' @examples #' \dontrun{ #' chat <- chat_google_gemini() -#' chat$register_tool(google_tool_url_fetch()) +#' chat$register_tool(google_tool_web_fetch()) #' chat$chat("What are the latest package releases on https://tidyverse.org/blog?") #' } -google_tool_url_fetch <- function() { +google_tool_web_fetch <- function() { ToolBuiltIn(name = "web_fetch", json = list(url_context = set_names(list()))) } diff --git a/_pkgdown.yml b/_pkgdown.yml index cb06e393..a905f99b 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -31,7 +31,7 @@ reference: - claude_tool_web_search - claude_tool_web_fetch - google_tool_web_search - - google_tool_url_fetch + - google_tool_web_fetch - openai_tool_web_search - title: Chat helpers diff --git a/man/claude_tool_web_fetch.Rd b/man/claude_tool_web_fetch.Rd index 52bfb2d3..3aaedbf1 100644 --- a/man/claude_tool_web_fetch.Rd +++ b/man/claude_tool_web_fetch.Rd @@ -44,7 +44,7 @@ chat$chat("What are the latest package releases on https://tidyverse.org/blog") \seealso{ Other built-in tools: \code{\link{claude_tool_web_search}()}, -\code{\link{google_tool_url_fetch}()}, +\code{\link{google_tool_web_fetch}()}, \code{\link{google_tool_web_search}()}, \code{\link{openai_tool_web_search}()} } diff --git a/man/claude_tool_web_search.Rd b/man/claude_tool_web_search.Rd index c784a92a..bed30507 100644 --- a/man/claude_tool_web_search.Rd +++ b/man/claude_tool_web_search.Rd @@ -41,7 +41,7 @@ chat$chat("What's the biggest news in the economy?") \seealso{ Other built-in tools: \code{\link{claude_tool_web_fetch}()}, -\code{\link{google_tool_url_fetch}()}, +\code{\link{google_tool_web_fetch}()}, \code{\link{google_tool_web_search}()}, \code{\link{openai_tool_web_search}()} } diff --git a/man/google_tool_url_fetch.Rd b/man/google_tool_web_fetch.Rd similarity index 84% rename from man/google_tool_url_fetch.Rd rename to man/google_tool_web_fetch.Rd index 2321d904..83adadf4 100644 --- a/man/google_tool_url_fetch.Rd +++ b/man/google_tool_web_fetch.Rd @@ -1,10 +1,10 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/provider-google-tools.R -\name{google_tool_url_fetch} -\alias{google_tool_url_fetch} +\name{google_tool_web_fetch} +\alias{google_tool_web_fetch} \title{Google URL fetch tool} \usage{ -google_tool_url_fetch() +google_tool_web_fetch() } \description{ When this tool is enabled, you can include URLs directly in your prompts and @@ -15,7 +15,7 @@ Learn more in \url{https://ai.google.dev/gemini-api/docs/url-context}. \examples{ \dontrun{ chat <- chat_google_gemini() -chat$register_tool(google_tool_url_fetch()) +chat$register_tool(google_tool_web_fetch()) chat$chat("What are the latest package releases on https://tidyverse.org/blog?") } } diff --git a/man/google_tool_web_search.Rd b/man/google_tool_web_search.Rd index f2164ef8..d6cc3633 100644 --- a/man/google_tool_web_search.Rd +++ b/man/google_tool_web_search.Rd @@ -27,7 +27,7 @@ chat$chat("What's the biggest news in the economy?") Other built-in tools: \code{\link{claude_tool_web_fetch}()}, \code{\link{claude_tool_web_search}()}, -\code{\link{google_tool_url_fetch}()}, +\code{\link{google_tool_web_fetch}()}, \code{\link{openai_tool_web_search}()} } \concept{built-in tools} diff --git a/man/openai_tool_web_search.Rd b/man/openai_tool_web_search.Rd index 5941bcd2..c679e5af 100644 --- a/man/openai_tool_web_search.Rd +++ b/man/openai_tool_web_search.Rd @@ -40,7 +40,7 @@ chat$chat("Of those stories, which one do you think was the most interesting?") Other built-in tools: \code{\link{claude_tool_web_fetch}()}, \code{\link{claude_tool_web_search}()}, -\code{\link{google_tool_url_fetch}()}, +\code{\link{google_tool_web_fetch}()}, \code{\link{google_tool_web_search}()} } \concept{built-in tools} diff --git a/tests/testthat/_vcr/anthropic-web-fetch.yml b/tests/testthat/_vcr/anthropic-web-fetch.yml new file mode 100644 index 00000000..9bbcbdb3 --- /dev/null +++ b/tests/testthat/_vcr/anthropic-web-fetch.yml @@ -0,0 +1,94 @@ +http_interactions: +- request: + method: POST + uri: https://api.anthropic.com/v1/messages + body: + string: '{"model":"claude-sonnet-4-5-20250929","messages":[{"role":"user","content":[{"type":"text","text":"What''s + the first movie listed on https://rvest.tidyverse.org/articles/starwars.html?","cache_control":{"type":"ephemeral","ttl":"5m"}}]}],"stream":false,"tools":[{"name":"web_fetch","type":"web_fetch_20250910","citations":{"enabled":false}}],"temperature":0,"max_tokens":4096}' + response: + status: 200 + headers: + date: Fri, 07 Nov 2025 15:02:42 GMT + content-type: application/json + content-encoding: gzip + anthropic-ratelimit-input-tokens-limit: '2000000' + anthropic-ratelimit-input-tokens-remaining: '2000000' + anthropic-ratelimit-input-tokens-reset: '2025-11-07T15:02:42Z' + anthropic-ratelimit-output-tokens-limit: '400000' + anthropic-ratelimit-output-tokens-remaining: '400000' + anthropic-ratelimit-output-tokens-reset: '2025-11-07T15:02:42Z' + anthropic-ratelimit-requests-limit: '4000' + anthropic-ratelimit-requests-remaining: '3999' + anthropic-ratelimit-requests-reset: '2025-11-07T15:02:35Z' + retry-after: '18' + anthropic-ratelimit-tokens-limit: '2400000' + anthropic-ratelimit-tokens-remaining: '2400000' + anthropic-ratelimit-tokens-reset: '2025-11-07T15:02:42Z' + request-id: req_011CUtjPnhzgLiZmS98DtyYA + strict-transport-security: max-age=31536000; includeSubDomains; preload + anthropic-organization-id: bf3687d8-1b59-41eb-9761-a1fd70b24e7e + x-envoy-upstream-service-time: '7589' + cf-cache-status: DYNAMIC + x-robots-tag: none + server: cloudflare + cf-ray: 99adb664f945878a-DFW + body: + string: '{"model":"claude-sonnet-4-5-20250929","id":"msg_01VDAC7gLfWHRTVgQSwsXQvV","type":"message","role":"assistant","content":[{"type":"text","text":"I''ll + fetch that URL to see what the first movie listed is."},{"type":"server_tool_use","id":"srvtoolu_01EthpPPHPCFHAuuctoLTbej","name":"web_fetch","input":{"url":"https://rvest.tidyverse.org/articles/starwars.html"}},{"type":"web_fetch_tool_result","tool_use_id":"srvtoolu_01EthpPPHPCFHAuuctoLTbej","content":{"type":"web_fetch_result","url":"https://rvest.tidyverse.org/articles/starwars.html","retrieved_at":"2025-11-07T15:00:10.015000+00:00","content":{"type":"document","source":{"type":"text","media_type":"text/plain","data":"![](../logo.png)\nStar + Wars films (static HTML)\nSource:\nvignettes/starwars.Rmd\nstarwars.Rmd\nThis + vignette contains some data about the Star Wars films for use in rvest examples + and vignettes.\nThe Phantom Menace\nReleased: 1999-05-19\nDirector: George + Lucas\nTurmoil has engulfed the Galactic Republic. The taxation of trade routes + to outlying star systems is in dispute.\nHoping to resolve the matter with + a blockade of deadly battleships, the greedy Trade Federation has stopped + all shipping to the small planet of Naboo.\nWhile the Congress of the Republic + endlessly debates this alarming chain of events, the Supreme Chancellor has + secretly dispatched two Jedi Knights, the guardians of peace and justice in + the galaxy, to settle the conflict….\nAttack of the Clones\nReleased: 2002-05-16\nDirector: + George Lucas\nThere is unrest in the Galactic Senate. Several thousand solar + systems have declared their intentions to leave the Republic.\nThis separatist + movement, under the leadership of the mysterious Count Dooku, has made it + difficult for the limited number of Jedi Knights to maintain peace and order + in the galaxy.\nSenator Amidala, the former Queen of Naboo, is returning to + the Galactic Senate to vote on the critical issue of creating an ARMY OF THE + REPUBLIC to assist the overwhelmed Jedi….\nRevenge of the Sith\nReleased: + 2005-05-19\nDirector: George Lucas\nWar! The Republic is crumbling under attacks + by the ruthless Sith Lord, Count Dooku. There are heroes on both sides. Evil + is everywhere.\nIn a stunning move, the fiendish droid leader, General Grievous, + has swept into the Republic capital and kidnapped Chancellor Palpatine, leader + of the Galactic Senate.\nAs the Separatist Droid Army attempts to flee the + besieged capital with their valuable hostage, two Jedi Knights lead a desperate + mission to rescue the captive Chancellor….\nA New Hope\nReleased: 1977-05-25\nDirector: + George Lucas\nIt is a period of civil war. Rebel spaceships, striking from + a hidden base, have won their first victory against the evil Galactic Empire.\nDuring + the battle, Rebel spies managed to steal secret plans to the Empire’s ultimate + weapon, the DEATH STAR, an armored space station with enough power to destroy + an entire planet.\nPursued by the Empire’s sinister agents, Princess Leia + races home aboard her starship, custodian of the stolen plans that can save + her people and restore freedom to the galaxy….\nThe Empire Strikes Back\nReleased: + 1980-05-17\nDirector: Irvin Kershner\nIt is a dark time for the Rebellion. + Although the Death Star has been destroyed, Imperial troops have driven the + Rebel forces from their hidden base and pursued them across the galaxy.\nEvading + the dreaded Imperial Starfleet, a group of freedom fighters led by Luke Skywalker + has established a new secret base on the remote ice world of Hoth.\nThe evil + lord Darth Vader, obsessed with finding young Skywalker, has dispatched thousands + of remote probes into the far reaches of space….\nReturn of the Jedi\nReleased: + 1983-05-25\nDirector: Richard Marquand\nLuke Skywalker has returned to his + home planet of Tatooine in an attempt to rescue his friend Han Solo from the + clutches of the vile gangster Jabba the Hutt.\nLittle does Luke know that + the GALACTIC EMPIRE has secretly begun construction on a new armored space + station even more powerful than the first dreaded Death Star.\nWhen completed, + this ultimate weapon will spell certain doom for the small band of rebels + struggling to restore freedom to the galaxy…\nThe Force Awakens\nReleased: + 2015-12-11\nDirector: J. J. Abrams\nLuke Skywalker has vanished. In his absence, + the sinister FIRST ORDER has risen from the ashes of the Empire and will not + rest until Skywalker, the last Jedi, has been destroyed. With the support + of the REPUBLIC, General Leia Organa leads a brave RESISTANCE. She is desperate + to find her brother Luke and gain his help in restoring peace and justice + to the galaxy. Leia has sent her most daring pilot on a secret mission to + Jakku, where an old ally has discovered a clue to Luke’s whereabouts…."},"title":"Star + Wars films (static HTML)","citations":{"enabled":false}}}},{"type":"text","text":"The + first movie listed on that page is **The Phantom Menace**, which was released + on 1999-05-19 and directed by George Lucas."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":10,"cache_creation_input_tokens":0,"cache_read_input_tokens":3279,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":123,"service_tier":"standard","server_tool_use":{"web_search_requests":0,"web_fetch_requests":1}}}' + recorded_at: 2025-11-07 15:02:42 +recorded_with: VCR-vcr/2.0.0 diff --git a/tests/testthat/_vcr/google-web-fetch.yml b/tests/testthat/_vcr/google-web-fetch.yml new file mode 100644 index 00000000..1c2c4ecc --- /dev/null +++ b/tests/testthat/_vcr/google-web-fetch.yml @@ -0,0 +1,101 @@ +http_interactions: +- request: + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent + body: + string: '{"contents":[{"role":"user","parts":[{"text":"What''s the first movie + listed on https://rvest.tidyverse.org/articles/starwars.html?"}]}],"tools":{"url_context":{}},"systemInstruction":{"parts":{"text":""}},"generationConfig":{"temperature":0,"seed":1014}}' + response: + status: 200 + headers: + alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content-encoding: gzip + content-length: '608' + content-type: application/json; charset=UTF-8 + date: Fri, 07 Nov 2025 15:04:58 GMT + server: scaffolding on HTTPServer2 + server-timing: gfet4t7; dur=1279 + vary: + - Origin + - X-Origin + - Referer + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-xss-protection: '0' + body: + string: | + { + "candidates": [ + { + "content": { + "parts": [ + { + "text": "The first movie listed on https://rvest.tidyverse.org/articles/starwars.html is \"The Phantom Menace\"." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0, + "groundingMetadata": { + "groundingChunks": [ + { + "web": { + "uri": "https://rvest.tidyverse.org/articles/starwars.html", + "title": "Star Wars films (static HTML) • rvest" + } + } + ], + "groundingSupports": [ + { + "segment": { + "endIndex": 100, + "text": "The first movie listed on https://rvest.tidyverse.org/articles/starwars.html is \"The Phantom Menace\"" + }, + "groundingChunkIndices": [ + 0 + ] + } + ] + }, + "urlContextMetadata": { + "urlMetadata": [ + { + "retrievedUrl": "https://rvest.tidyverse.org/articles/starwars.html", + "urlRetrievalStatus": "URL_RETRIEVAL_STATUS_SUCCESS" + } + ] + } + } + ], + "usageMetadata": { + "promptTokenCount": 25, + "candidatesTokenCount": 49, + "totalTokenCount": 1250, + "cachedContentTokenCount": 13, + "promptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 25 + } + ], + "cacheTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 13 + } + ], + "toolUsePromptTokenCount": 1133, + "toolUsePromptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 1133 + } + ], + "thoughtsTokenCount": 43 + }, + "modelVersion": "gemini-2.5-flash", + "responseId": "mgoOaemwMMCdqtsPuKTr8Ac" + } + recorded_at: 2025-11-07 15:04:58 +recorded_with: VCR-vcr/2.0.0 diff --git a/tests/testthat/helper-provider.R b/tests/testthat/helper-provider.R index 32b35cae..107ffb14 100644 --- a/tests/testthat/helper-provider.R +++ b/tests/testthat/helper-provider.R @@ -81,6 +81,17 @@ test_data_extraction <- function(chat_fun) { ) } +# Built-in tools --------------------------------------------------------- + +test_tool_web_fetch <- function(chat_fun, search_tool) { + chat <- chat_fun() + chat$register_tool(search_tool) + result <- chat$chat( + "What's the first movie listed on https://rvest.tidyverse.org/articles/starwars.html?" + ) + expect_match(result, "The Phantom Menace") +} + # Images ----------------------------------------------------------------- test_images_inline <- function(chat_fun, test_shape = TRUE) { diff --git a/tests/testthat/test-provider-anthropic.R b/tests/testthat/test-provider-anthropic.R index 611de822..6f6ddd70 100644 --- a/tests/testthat/test-provider-anthropic.R +++ b/tests/testthat/test-provider-anthropic.R @@ -47,6 +47,12 @@ test_that("can extract data", { test_data_extraction(chat_fun) }) +test_that("can fetch web pages", { + vcr::local_cassette("anthropic-web-fetch") + chat_fun <- \(...)chat_anthropic_test(..., beta_headers = "web-fetch-2025-09-10") + test_tool_web_fetch(chat_fun, claude_tool_web_fetch()) +}) + test_that("can use images", { vcr::local_cassette("anthropic-images") chat_fun <- chat_anthropic_test diff --git a/tests/testthat/test-provider-google.R b/tests/testthat/test-provider-google.R index 92d26f15..ec501be8 100644 --- a/tests/testthat/test-provider-google.R +++ b/tests/testthat/test-provider-google.R @@ -47,6 +47,12 @@ test_that("can extract data", { test_data_extraction(chat_fun) }) +test_that("can fetch web pages", { + vcr::local_cassette("google-web-fetch") + chat_fun <- chat_google_gemini_test + test_tool_web_fetch(chat_fun, google_tool_web_fetch()) +}) + test_that("can use images", { vcr::local_cassette("google-image") chat_fun <- chat_google_gemini_test From c7f80e69aac72af30118498d02cacc018a8179ed Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 11:41:42 -0600 Subject: [PATCH 10/17] Add tests and fix bugs --- R/provider-anthropic.R | 3 - tests/testthat/_vcr/anthropic-web-fetch.yml | 317 +++++++++++++- tests/testthat/_vcr/anthropic-web-search.yml | 162 ++++++++ tests/testthat/_vcr/google-web-fetch.yml | 313 +++++++++++++- tests/testthat/_vcr/google-web-search.yml | 212 ++++++++++ tests/testthat/_vcr/openai-v2-web-search.yml | 388 ++++++++++++++++++ tests/testthat/helper-provider.R | 28 +- .../testthat/test-provider-anthropic-files.R | 2 +- tests/testthat/test-provider-anthropic.R | 11 +- tests/testthat/test-provider-google.R | 6 + tests/testthat/test-provider-openai.R | 10 + 11 files changed, 1416 insertions(+), 36 deletions(-) create mode 100644 tests/testthat/_vcr/anthropic-web-search.yml create mode 100644 tests/testthat/_vcr/google-web-search.yml create mode 100644 tests/testthat/_vcr/openai-v2-web-search.yml diff --git a/R/provider-anthropic.R b/R/provider-anthropic.R index 608b4a49..bac55659 100644 --- a/R/provider-anthropic.R +++ b/R/provider-anthropic.R @@ -363,9 +363,6 @@ method(value_turn, ProviderAnthropic) <- function( } } else if (content$type == "server_tool_use") { if (content$name == "web_search") { - # Sends a string, but expects parsed json to be sent back - content$input <- parse_json(content$input) - # https://docs.claude.com/en/docs/agents-and-tools/tool-use/web-search-tool#response ContentToolRequestSearch( query = content$input$query, diff --git a/tests/testthat/_vcr/anthropic-web-fetch.yml b/tests/testthat/_vcr/anthropic-web-fetch.yml index 9bbcbdb3..9f92ae32 100644 --- a/tests/testthat/_vcr/anthropic-web-fetch.yml +++ b/tests/testthat/_vcr/anthropic-web-fetch.yml @@ -8,33 +8,288 @@ http_interactions: response: status: 200 headers: - date: Fri, 07 Nov 2025 15:02:42 GMT + date: Fri, 07 Nov 2025 15:47:27 GMT + content-type: application/json + content-encoding: gzip + anthropic-ratelimit-input-tokens-limit: '2000000' + anthropic-ratelimit-input-tokens-remaining: '1999000' + anthropic-ratelimit-input-tokens-reset: '2025-11-07T15:47:27Z' + anthropic-ratelimit-output-tokens-limit: '400000' + anthropic-ratelimit-output-tokens-remaining: '400000' + anthropic-ratelimit-output-tokens-reset: '2025-11-07T15:47:27Z' + anthropic-ratelimit-requests-limit: '4000' + anthropic-ratelimit-requests-remaining: '3999' + anthropic-ratelimit-requests-reset: '2025-11-07T15:47:21Z' + retry-after: '34' + anthropic-ratelimit-tokens-limit: '2400000' + anthropic-ratelimit-tokens-remaining: '2399000' + anthropic-ratelimit-tokens-reset: '2025-11-07T15:47:27Z' + request-id: req_011CUtnoqauZ5V5PjEKFqCfg + strict-transport-security: max-age=31536000; includeSubDomains; preload + anthropic-organization-id: bf3687d8-1b59-41eb-9761-a1fd70b24e7e + x-envoy-upstream-service-time: '6055' + cf-cache-status: DYNAMIC + x-robots-tag: none + server: cloudflare + cf-ray: 99adf7fd1ff57a97-DFW + body: + string: '{"model":"claude-sonnet-4-5-20250929","id":"msg_01WSdQZERVjDmn7tPQiTKjH8","type":"message","role":"assistant","content":[{"type":"text","text":"I''ll + fetch that URL to see what the first movie listed is."},{"type":"server_tool_use","id":"srvtoolu_011B8NpmmZj6QqwjjDwxgUU3","name":"web_fetch","input":{"url":"https://rvest.tidyverse.org/articles/starwars.html"}},{"type":"web_fetch_tool_result","tool_use_id":"srvtoolu_011B8NpmmZj6QqwjjDwxgUU3","content":{"type":"web_fetch_result","url":"https://rvest.tidyverse.org/articles/starwars.html","retrieved_at":"2025-11-07T15:00:10.015000+00:00","content":{"type":"document","source":{"type":"text","media_type":"text/plain","data":"![](../logo.png)\nStar + Wars films (static HTML)\nSource:\nvignettes/starwars.Rmd\nstarwars.Rmd\nThis + vignette contains some data about the Star Wars films for use in rvest examples + and vignettes.\nThe Phantom Menace\nReleased: 1999-05-19\nDirector: George + Lucas\nTurmoil has engulfed the Galactic Republic. The taxation of trade routes + to outlying star systems is in dispute.\nHoping to resolve the matter with + a blockade of deadly battleships, the greedy Trade Federation has stopped + all shipping to the small planet of Naboo.\nWhile the Congress of the Republic + endlessly debates this alarming chain of events, the Supreme Chancellor has + secretly dispatched two Jedi Knights, the guardians of peace and justice in + the galaxy, to settle the conflict….\nAttack of the Clones\nReleased: 2002-05-16\nDirector: + George Lucas\nThere is unrest in the Galactic Senate. Several thousand solar + systems have declared their intentions to leave the Republic.\nThis separatist + movement, under the leadership of the mysterious Count Dooku, has made it + difficult for the limited number of Jedi Knights to maintain peace and order + in the galaxy.\nSenator Amidala, the former Queen of Naboo, is returning to + the Galactic Senate to vote on the critical issue of creating an ARMY OF THE + REPUBLIC to assist the overwhelmed Jedi….\nRevenge of the Sith\nReleased: + 2005-05-19\nDirector: George Lucas\nWar! The Republic is crumbling under attacks + by the ruthless Sith Lord, Count Dooku. There are heroes on both sides. Evil + is everywhere.\nIn a stunning move, the fiendish droid leader, General Grievous, + has swept into the Republic capital and kidnapped Chancellor Palpatine, leader + of the Galactic Senate.\nAs the Separatist Droid Army attempts to flee the + besieged capital with their valuable hostage, two Jedi Knights lead a desperate + mission to rescue the captive Chancellor….\nA New Hope\nReleased: 1977-05-25\nDirector: + George Lucas\nIt is a period of civil war. Rebel spaceships, striking from + a hidden base, have won their first victory against the evil Galactic Empire.\nDuring + the battle, Rebel spies managed to steal secret plans to the Empire’s ultimate + weapon, the DEATH STAR, an armored space station with enough power to destroy + an entire planet.\nPursued by the Empire’s sinister agents, Princess Leia + races home aboard her starship, custodian of the stolen plans that can save + her people and restore freedom to the galaxy….\nThe Empire Strikes Back\nReleased: + 1980-05-17\nDirector: Irvin Kershner\nIt is a dark time for the Rebellion. + Although the Death Star has been destroyed, Imperial troops have driven the + Rebel forces from their hidden base and pursued them across the galaxy.\nEvading + the dreaded Imperial Starfleet, a group of freedom fighters led by Luke Skywalker + has established a new secret base on the remote ice world of Hoth.\nThe evil + lord Darth Vader, obsessed with finding young Skywalker, has dispatched thousands + of remote probes into the far reaches of space….\nReturn of the Jedi\nReleased: + 1983-05-25\nDirector: Richard Marquand\nLuke Skywalker has returned to his + home planet of Tatooine in an attempt to rescue his friend Han Solo from the + clutches of the vile gangster Jabba the Hutt.\nLittle does Luke know that + the GALACTIC EMPIRE has secretly begun construction on a new armored space + station even more powerful than the first dreaded Death Star.\nWhen completed, + this ultimate weapon will spell certain doom for the small band of rebels + struggling to restore freedom to the galaxy…\nThe Force Awakens\nReleased: + 2015-12-11\nDirector: J. J. Abrams\nLuke Skywalker has vanished. In his absence, + the sinister FIRST ORDER has risen from the ashes of the Empire and will not + rest until Skywalker, the last Jedi, has been destroyed. With the support + of the REPUBLIC, General Leia Organa leads a brave RESISTANCE. She is desperate + to find her brother Luke and gain his help in restoring peace and justice + to the galaxy. Leia has sent her most daring pilot on a secret mission to + Jakku, where an old ally has discovered a clue to Luke’s whereabouts…."},"title":"Star + Wars films (static HTML)","citations":{"enabled":false}}}},{"type":"text","text":"The + first movie listed on that page is **The Phantom Menace**, which was released + on 1999-05-19 and directed by George Lucas."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":10,"cache_creation_input_tokens":2227,"cache_read_input_tokens":1052,"cache_creation":{"ephemeral_5m_input_tokens":1052,"ephemeral_1h_input_tokens":0},"output_tokens":123,"service_tier":"standard","server_tool_use":{"web_search_requests":0,"web_fetch_requests":1}}}' + recorded_at: 2025-11-07 15:47:27 +- request: + method: POST + uri: https://api.anthropic.com/v1/messages + body: + string: '{"model":"claude-sonnet-4-5-20250929","messages":[{"role":"user","content":[{"type":"text","text":"What''s + the first movie listed on https://rvest.tidyverse.org/articles/starwars.html?"}]},{"role":"assistant","content":[{"type":"text","text":"I''ll + fetch that URL to see what the first movie listed is."},{"type":"server_tool_use","id":"srvtoolu_011B8NpmmZj6QqwjjDwxgUU3","name":"web_fetch","input":{"url":"https://rvest.tidyverse.org/articles/starwars.html"}},{"type":"web_fetch_tool_result","tool_use_id":"srvtoolu_011B8NpmmZj6QqwjjDwxgUU3","content":{"type":"web_fetch_result","url":"https://rvest.tidyverse.org/articles/starwars.html","retrieved_at":"2025-11-07T15:00:10.015000+00:00","content":{"type":"document","source":{"type":"text","media_type":"text/plain","data":"![](../logo.png)\nStar + Wars films (static HTML)\nSource:\nvignettes/starwars.Rmd\nstarwars.Rmd\nThis + vignette contains some data about the Star Wars films for use in rvest examples + and vignettes.\nThe Phantom Menace\nReleased: 1999-05-19\nDirector: George + Lucas\nTurmoil has engulfed the Galactic Republic. The taxation of trade routes + to outlying star systems is in dispute.\nHoping to resolve the matter with + a blockade of deadly battleships, the greedy Trade Federation has stopped + all shipping to the small planet of Naboo.\nWhile the Congress of the Republic + endlessly debates this alarming chain of events, the Supreme Chancellor has + secretly dispatched two Jedi Knights, the guardians of peace and justice in + the galaxy, to settle the conflict….\nAttack of the Clones\nReleased: 2002-05-16\nDirector: + George Lucas\nThere is unrest in the Galactic Senate. Several thousand solar + systems have declared their intentions to leave the Republic.\nThis separatist + movement, under the leadership of the mysterious Count Dooku, has made it + difficult for the limited number of Jedi Knights to maintain peace and order + in the galaxy.\nSenator Amidala, the former Queen of Naboo, is returning to + the Galactic Senate to vote on the critical issue of creating an ARMY OF THE + REPUBLIC to assist the overwhelmed Jedi….\nRevenge of the Sith\nReleased: + 2005-05-19\nDirector: George Lucas\nWar! The Republic is crumbling under attacks + by the ruthless Sith Lord, Count Dooku. There are heroes on both sides. Evil + is everywhere.\nIn a stunning move, the fiendish droid leader, General Grievous, + has swept into the Republic capital and kidnapped Chancellor Palpatine, leader + of the Galactic Senate.\nAs the Separatist Droid Army attempts to flee the + besieged capital with their valuable hostage, two Jedi Knights lead a desperate + mission to rescue the captive Chancellor….\nA New Hope\nReleased: 1977-05-25\nDirector: + George Lucas\nIt is a period of civil war. Rebel spaceships, striking from + a hidden base, have won their first victory against the evil Galactic Empire.\nDuring + the battle, Rebel spies managed to steal secret plans to the Empire’s ultimate + weapon, the DEATH STAR, an armored space station with enough power to destroy + an entire planet.\nPursued by the Empire’s sinister agents, Princess Leia + races home aboard her starship, custodian of the stolen plans that can save + her people and restore freedom to the galaxy….\nThe Empire Strikes Back\nReleased: + 1980-05-17\nDirector: Irvin Kershner\nIt is a dark time for the Rebellion. + Although the Death Star has been destroyed, Imperial troops have driven the + Rebel forces from their hidden base and pursued them across the galaxy.\nEvading + the dreaded Imperial Starfleet, a group of freedom fighters led by Luke Skywalker + has established a new secret base on the remote ice world of Hoth.\nThe evil + lord Darth Vader, obsessed with finding young Skywalker, has dispatched thousands + of remote probes into the far reaches of space….\nReturn of the Jedi\nReleased: + 1983-05-25\nDirector: Richard Marquand\nLuke Skywalker has returned to his + home planet of Tatooine in an attempt to rescue his friend Han Solo from the + clutches of the vile gangster Jabba the Hutt.\nLittle does Luke know that + the GALACTIC EMPIRE has secretly begun construction on a new armored space + station even more powerful than the first dreaded Death Star.\nWhen completed, + this ultimate weapon will spell certain doom for the small band of rebels + struggling to restore freedom to the galaxy…\nThe Force Awakens\nReleased: + 2015-12-11\nDirector: J. J. Abrams\nLuke Skywalker has vanished. In his absence, + the sinister FIRST ORDER has risen from the ashes of the Empire and will not + rest until Skywalker, the last Jedi, has been destroyed. With the support + of the REPUBLIC, General Leia Organa leads a brave RESISTANCE. She is desperate + to find her brother Luke and gain his help in restoring peace and justice + to the galaxy. Leia has sent her most daring pilot on a secret mission to + Jakku, where an old ally has discovered a clue to Luke’s whereabouts…."},"title":"Star + Wars films (static HTML)","citations":{"enabled":false}}}},{"type":"text","text":"The + first movie listed on that page is **The Phantom Menace**, which was released + on 1999-05-19 and directed by George Lucas."}]},{"role":"user","content":[{"type":"text","text":"What''s + the first movie listed on https://rvest.tidyverse.org/articles/starwars.html?","cache_control":{"type":"ephemeral","ttl":"5m"}}]}],"stream":false,"tools":[{"name":"web_fetch","type":"web_fetch_20250910","citations":{"enabled":false}}],"temperature":0,"max_tokens":4096}' + response: + status: 200 + headers: + date: Fri, 07 Nov 2025 15:47:31 GMT + content-type: application/json + content-encoding: gzip + anthropic-ratelimit-input-tokens-limit: '2000000' + anthropic-ratelimit-input-tokens-remaining: '2000000' + anthropic-ratelimit-input-tokens-reset: '2025-11-07T15:47:30Z' + anthropic-ratelimit-output-tokens-limit: '400000' + anthropic-ratelimit-output-tokens-remaining: '400000' + anthropic-ratelimit-output-tokens-reset: '2025-11-07T15:47:30Z' + anthropic-ratelimit-requests-limit: '4000' + anthropic-ratelimit-requests-remaining: '3999' + anthropic-ratelimit-requests-reset: '2025-11-07T15:47:28Z' + retry-after: '32' + anthropic-ratelimit-tokens-limit: '2400000' + anthropic-ratelimit-tokens-remaining: '2400000' + anthropic-ratelimit-tokens-reset: '2025-11-07T15:47:30Z' + request-id: req_011CUtnpJDnmXb2VT6jYUDJK + strict-transport-security: max-age=31536000; includeSubDomains; preload + anthropic-organization-id: bf3687d8-1b59-41eb-9761-a1fd70b24e7e + x-envoy-upstream-service-time: '2967' + cf-cache-status: DYNAMIC + x-robots-tag: none + server: cloudflare + cf-ray: 99adf82408a27a97-DFW + body: + string: '{"model":"claude-sonnet-4-5-20250929","id":"msg_015hm92puGV4WPvLmaRqmPD5","type":"message","role":"assistant","content":[{"type":"text","text":"Based + on the page I just fetched, the first movie listed on https://rvest.tidyverse.org/articles/starwars.html + is **The Phantom Menace** (released 1999-05-19, directed by George Lucas)."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":71,"cache_read_input_tokens":2227,"cache_creation":{"ephemeral_5m_input_tokens":71,"ephemeral_1h_input_tokens":0},"output_tokens":60,"service_tier":"standard"}}' + recorded_at: 2025-11-07 15:47:31 +- request: + method: POST + uri: https://api.anthropic.com/v1/messages + body: + string: '{"model":"claude-sonnet-4-5-20250929","messages":[{"role":"user","content":[{"type":"text","text":"What''s + the first movie listed on https://rvest.tidyverse.org/articles/starwars.html?"}]},{"role":"assistant","content":[{"type":"text","text":"I''ll + fetch that URL to see what the first movie listed is."},{"type":"server_tool_use","id":"srvtoolu_011B8NpmmZj6QqwjjDwxgUU3","name":"web_fetch","input":{"url":"https://rvest.tidyverse.org/articles/starwars.html"}},{"type":"web_fetch_tool_result","tool_use_id":"srvtoolu_011B8NpmmZj6QqwjjDwxgUU3","content":{"type":"web_fetch_result","url":"https://rvest.tidyverse.org/articles/starwars.html","retrieved_at":"2025-11-07T15:00:10.015000+00:00","content":{"type":"document","source":{"type":"text","media_type":"text/plain","data":"![](../logo.png)\nStar + Wars films (static HTML)\nSource:\nvignettes/starwars.Rmd\nstarwars.Rmd\nThis + vignette contains some data about the Star Wars films for use in rvest examples + and vignettes.\nThe Phantom Menace\nReleased: 1999-05-19\nDirector: George + Lucas\nTurmoil has engulfed the Galactic Republic. The taxation of trade routes + to outlying star systems is in dispute.\nHoping to resolve the matter with + a blockade of deadly battleships, the greedy Trade Federation has stopped + all shipping to the small planet of Naboo.\nWhile the Congress of the Republic + endlessly debates this alarming chain of events, the Supreme Chancellor has + secretly dispatched two Jedi Knights, the guardians of peace and justice in + the galaxy, to settle the conflict….\nAttack of the Clones\nReleased: 2002-05-16\nDirector: + George Lucas\nThere is unrest in the Galactic Senate. Several thousand solar + systems have declared their intentions to leave the Republic.\nThis separatist + movement, under the leadership of the mysterious Count Dooku, has made it + difficult for the limited number of Jedi Knights to maintain peace and order + in the galaxy.\nSenator Amidala, the former Queen of Naboo, is returning to + the Galactic Senate to vote on the critical issue of creating an ARMY OF THE + REPUBLIC to assist the overwhelmed Jedi….\nRevenge of the Sith\nReleased: + 2005-05-19\nDirector: George Lucas\nWar! The Republic is crumbling under attacks + by the ruthless Sith Lord, Count Dooku. There are heroes on both sides. Evil + is everywhere.\nIn a stunning move, the fiendish droid leader, General Grievous, + has swept into the Republic capital and kidnapped Chancellor Palpatine, leader + of the Galactic Senate.\nAs the Separatist Droid Army attempts to flee the + besieged capital with their valuable hostage, two Jedi Knights lead a desperate + mission to rescue the captive Chancellor….\nA New Hope\nReleased: 1977-05-25\nDirector: + George Lucas\nIt is a period of civil war. Rebel spaceships, striking from + a hidden base, have won their first victory against the evil Galactic Empire.\nDuring + the battle, Rebel spies managed to steal secret plans to the Empire’s ultimate + weapon, the DEATH STAR, an armored space station with enough power to destroy + an entire planet.\nPursued by the Empire’s sinister agents, Princess Leia + races home aboard her starship, custodian of the stolen plans that can save + her people and restore freedom to the galaxy….\nThe Empire Strikes Back\nReleased: + 1980-05-17\nDirector: Irvin Kershner\nIt is a dark time for the Rebellion. + Although the Death Star has been destroyed, Imperial troops have driven the + Rebel forces from their hidden base and pursued them across the galaxy.\nEvading + the dreaded Imperial Starfleet, a group of freedom fighters led by Luke Skywalker + has established a new secret base on the remote ice world of Hoth.\nThe evil + lord Darth Vader, obsessed with finding young Skywalker, has dispatched thousands + of remote probes into the far reaches of space….\nReturn of the Jedi\nReleased: + 1983-05-25\nDirector: Richard Marquand\nLuke Skywalker has returned to his + home planet of Tatooine in an attempt to rescue his friend Han Solo from the + clutches of the vile gangster Jabba the Hutt.\nLittle does Luke know that + the GALACTIC EMPIRE has secretly begun construction on a new armored space + station even more powerful than the first dreaded Death Star.\nWhen completed, + this ultimate weapon will spell certain doom for the small band of rebels + struggling to restore freedom to the galaxy…\nThe Force Awakens\nReleased: + 2015-12-11\nDirector: J. J. Abrams\nLuke Skywalker has vanished. In his absence, + the sinister FIRST ORDER has risen from the ashes of the Empire and will not + rest until Skywalker, the last Jedi, has been destroyed. With the support + of the REPUBLIC, General Leia Organa leads a brave RESISTANCE. She is desperate + to find her brother Luke and gain his help in restoring peace and justice + to the galaxy. Leia has sent her most daring pilot on a secret mission to + Jakku, where an old ally has discovered a clue to Luke’s whereabouts…."},"title":"Star + Wars films (static HTML)","citations":{"enabled":false}}}},{"type":"text","text":"The + first movie listed on that page is **The Phantom Menace**, which was released + on 1999-05-19 and directed by George Lucas."}]},{"role":"user","content":[{"type":"text","text":"What''s + the first movie listed on https://rvest.tidyverse.org/articles/starwars.html?"}]},{"role":"assistant","content":[{"type":"text","text":"Based + on the page I just fetched, the first movie listed on https://rvest.tidyverse.org/articles/starwars.html + is **The Phantom Menace** (released 1999-05-19, directed by George Lucas)."}]},{"role":"user","content":[{"type":"text","text":"Who + directed it?","cache_control":{"type":"ephemeral","ttl":"5m"}}]}],"stream":false,"tools":[{"name":"web_fetch","type":"web_fetch_20250910","citations":{"enabled":false}}],"temperature":0,"max_tokens":4096}' + response: + status: 200 + headers: + date: Fri, 07 Nov 2025 15:47:33 GMT content-type: application/json content-encoding: gzip anthropic-ratelimit-input-tokens-limit: '2000000' anthropic-ratelimit-input-tokens-remaining: '2000000' - anthropic-ratelimit-input-tokens-reset: '2025-11-07T15:02:42Z' + anthropic-ratelimit-input-tokens-reset: '2025-11-07T15:47:33Z' anthropic-ratelimit-output-tokens-limit: '400000' anthropic-ratelimit-output-tokens-remaining: '400000' - anthropic-ratelimit-output-tokens-reset: '2025-11-07T15:02:42Z' + anthropic-ratelimit-output-tokens-reset: '2025-11-07T15:47:33Z' anthropic-ratelimit-requests-limit: '4000' anthropic-ratelimit-requests-remaining: '3999' - anthropic-ratelimit-requests-reset: '2025-11-07T15:02:35Z' - retry-after: '18' + anthropic-ratelimit-requests-reset: '2025-11-07T15:47:31Z' + retry-after: '29' anthropic-ratelimit-tokens-limit: '2400000' anthropic-ratelimit-tokens-remaining: '2400000' - anthropic-ratelimit-tokens-reset: '2025-11-07T15:02:42Z' - request-id: req_011CUtjPnhzgLiZmS98DtyYA + anthropic-ratelimit-tokens-reset: '2025-11-07T15:47:33Z' + request-id: req_011CUtnpXn7cjqA6CoRgWThb strict-transport-security: max-age=31536000; includeSubDomains; preload anthropic-organization-id: bf3687d8-1b59-41eb-9761-a1fd70b24e7e - x-envoy-upstream-service-time: '7589' + x-envoy-upstream-service-time: '2357' cf-cache-status: DYNAMIC x-robots-tag: none server: cloudflare - cf-ray: 99adb664f945878a-DFW + cf-ray: 99adf837cd627a97-DFW body: - string: '{"model":"claude-sonnet-4-5-20250929","id":"msg_01VDAC7gLfWHRTVgQSwsXQvV","type":"message","role":"assistant","content":[{"type":"text","text":"I''ll - fetch that URL to see what the first movie listed is."},{"type":"server_tool_use","id":"srvtoolu_01EthpPPHPCFHAuuctoLTbej","name":"web_fetch","input":{"url":"https://rvest.tidyverse.org/articles/starwars.html"}},{"type":"web_fetch_tool_result","tool_use_id":"srvtoolu_01EthpPPHPCFHAuuctoLTbej","content":{"type":"web_fetch_result","url":"https://rvest.tidyverse.org/articles/starwars.html","retrieved_at":"2025-11-07T15:00:10.015000+00:00","content":{"type":"document","source":{"type":"text","media_type":"text/plain","data":"![](../logo.png)\nStar + string: '{"model":"claude-sonnet-4-5-20250929","id":"msg_01SBmnpbAgvNWX9pQ9YhUZsX","type":"message","role":"assistant","content":[{"type":"text","text":"George + Lucas directed The Phantom Menace."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":67,"cache_read_input_tokens":2298,"cache_creation":{"ephemeral_5m_input_tokens":67,"ephemeral_1h_input_tokens":0},"output_tokens":13,"service_tier":"standard"}}' + recorded_at: 2025-11-07 15:47:33 +- request: + method: POST + uri: https://api.anthropic.com/v1/messages + body: + string: '{"model":"claude-sonnet-4-5-20250929","messages":[{"role":"user","content":[{"type":"text","text":"What''s + the first movie listed on https://rvest.tidyverse.org/articles/starwars.html?"}]},{"role":"assistant","content":[{"type":"text","text":"I''ll + fetch that URL to see what the first movie listed is."},{"type":"server_tool_use","id":"srvtoolu_011B8NpmmZj6QqwjjDwxgUU3","name":"web_fetch","input":{"url":"https://rvest.tidyverse.org/articles/starwars.html"}},{"type":"web_fetch_tool_result","tool_use_id":"srvtoolu_011B8NpmmZj6QqwjjDwxgUU3","content":{"type":"web_fetch_result","url":"https://rvest.tidyverse.org/articles/starwars.html","retrieved_at":"2025-11-07T15:00:10.015000+00:00","content":{"type":"document","source":{"type":"text","media_type":"text/plain","data":"![](../logo.png)\nStar Wars films (static HTML)\nSource:\nvignettes/starwars.Rmd\nstarwars.Rmd\nThis vignette contains some data about the Star Wars films for use in rvest examples and vignettes.\nThe Phantom Menace\nReleased: 1999-05-19\nDirector: George @@ -89,6 +344,42 @@ http_interactions: Jakku, where an old ally has discovered a clue to Luke’s whereabouts…."},"title":"Star Wars films (static HTML)","citations":{"enabled":false}}}},{"type":"text","text":"The first movie listed on that page is **The Phantom Menace**, which was released - on 1999-05-19 and directed by George Lucas."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":10,"cache_creation_input_tokens":0,"cache_read_input_tokens":3279,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":123,"service_tier":"standard","server_tool_use":{"web_search_requests":0,"web_fetch_requests":1}}}' - recorded_at: 2025-11-07 15:02:42 + on 1999-05-19 and directed by George Lucas."}]},{"role":"user","content":[{"type":"text","text":"What''s + the first movie listed on https://rvest.tidyverse.org/articles/starwars.html?"}]},{"role":"assistant","content":[{"type":"text","text":"Based + on the page I just fetched, the first movie listed on https://rvest.tidyverse.org/articles/starwars.html + is **The Phantom Menace** (released 1999-05-19, directed by George Lucas)."}]},{"role":"user","content":[{"type":"text","text":"Who + directed it?"}]},{"role":"assistant","content":[{"type":"text","text":"George + Lucas directed The Phantom Menace."}]},{"role":"user","content":[{"type":"text","text":"Who + directed it?","cache_control":{"type":"ephemeral","ttl":"5m"}}]}],"stream":false,"tools":[{"name":"web_fetch","type":"web_fetch_20250910","citations":{"enabled":false}}],"temperature":0,"max_tokens":4096}' + response: + status: 200 + headers: + date: Fri, 07 Nov 2025 15:47:35 GMT + content-type: application/json + content-encoding: gzip + anthropic-ratelimit-input-tokens-limit: '2000000' + anthropic-ratelimit-input-tokens-remaining: '2000000' + anthropic-ratelimit-input-tokens-reset: '2025-11-07T15:47:35Z' + anthropic-ratelimit-output-tokens-limit: '400000' + anthropic-ratelimit-output-tokens-remaining: '400000' + anthropic-ratelimit-output-tokens-reset: '2025-11-07T15:47:35Z' + anthropic-ratelimit-requests-limit: '4000' + anthropic-ratelimit-requests-remaining: '3999' + anthropic-ratelimit-requests-reset: '2025-11-07T15:47:33Z' + retry-after: '26' + anthropic-ratelimit-tokens-limit: '2400000' + anthropic-ratelimit-tokens-remaining: '2400000' + anthropic-ratelimit-tokens-reset: '2025-11-07T15:47:35Z' + request-id: req_011CUtnpiexg2aqhETRdgr5o + strict-transport-security: max-age=31536000; includeSubDomains; preload + anthropic-organization-id: bf3687d8-1b59-41eb-9761-a1fd70b24e7e + x-envoy-upstream-service-time: '2185' + cf-cache-status: DYNAMIC + x-robots-tag: none + server: cloudflare + cf-ray: 99adf847ccd17a97-DFW + body: + string: '{"model":"claude-sonnet-4-5-20250929","id":"msg_01Qe3QBCM1CwPitm3cMsjmTt","type":"message","role":"assistant","content":[{"type":"text","text":"George + Lucas directed The Phantom Menace."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":20,"cache_read_input_tokens":2365,"cache_creation":{"ephemeral_5m_input_tokens":20,"ephemeral_1h_input_tokens":0},"output_tokens":13,"service_tier":"standard"}}' + recorded_at: 2025-11-07 15:47:35 recorded_with: VCR-vcr/2.0.0 diff --git a/tests/testthat/_vcr/anthropic-web-search.yml b/tests/testthat/_vcr/anthropic-web-search.yml new file mode 100644 index 00000000..947ff5e6 --- /dev/null +++ b/tests/testthat/_vcr/anthropic-web-search.yml @@ -0,0 +1,162 @@ +http_interactions: +- request: + method: POST + uri: https://api.anthropic.com/v1/messages + body: + string: '{"model":"claude-sonnet-4-5-20250929","messages":[{"role":"user","content":[{"type":"text","text":"When + was ggplot2 1.0.0 released to CRAN?\n\nAnswer in YYYY-MM-DD format.","cache_control":{"type":"ephemeral","ttl":"5m"}}]}],"stream":false,"tools":[{"name":"web_search","type":"web_search_20250305"}],"temperature":0,"max_tokens":4096}' + response: + status: 200 + headers: + date: Fri, 07 Nov 2025 16:59:02 GMT + content-type: application/json + content-encoding: gzip + anthropic-ratelimit-input-tokens-limit: '2000000' + anthropic-ratelimit-input-tokens-remaining: '1983000' + anthropic-ratelimit-input-tokens-reset: '2025-11-07T16:59:00Z' + anthropic-ratelimit-output-tokens-limit: '400000' + anthropic-ratelimit-output-tokens-remaining: '400000' + anthropic-ratelimit-output-tokens-reset: '2025-11-07T16:59:02Z' + anthropic-ratelimit-requests-limit: '4000' + anthropic-ratelimit-requests-remaining: '3999' + anthropic-ratelimit-requests-reset: '2025-11-07T16:58:54Z' + retry-after: '61' + anthropic-ratelimit-tokens-limit: '2400000' + anthropic-ratelimit-tokens-remaining: '2383000' + anthropic-ratelimit-tokens-reset: '2025-11-07T16:59:00Z' + request-id: req_011CUttGGVunXEdqAgqWXTx8 + strict-transport-security: max-age=31536000; includeSubDomains; preload + anthropic-organization-id: bf3687d8-1b59-41eb-9761-a1fd70b24e7e + x-envoy-upstream-service-time: '7671' + cf-cache-status: DYNAMIC + x-robots-tag: none + server: cloudflare + cf-ray: 99ae60ca0bd9ead9-DFW + body: + string: '{"model":"claude-sonnet-4-5-20250929","id":"msg_017uaoheKvkJfKrU6KNML4EF","type":"message","role":"assistant","content":[{"type":"server_tool_use","id":"srvtoolu_01GAHpBrEa6jAjMYsJGetGcD","name":"web_search","input":{"query":"ggplot2 + 1.0.0 CRAN release date"}},{"type":"web_search_tool_result","tool_use_id":"srvtoolu_01GAHpBrEa6jAjMYsJGetGcD","content":[{"type":"web_search_result","title":"Changelog + • ggplot2","url":"https://ggplot2.tidyverse.org/news/index.html","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"CRAN: + Package ggplot2","url":"https://cran.r-project.org/package=ggplot2","encrypted_content":"Eq8GCioICRgCIiRiZjM2ODdkOC0xYjU5LTQxZWItOTc2MS1hMWZkNzBiMjRlN2USDDrhAthIu+gs6lY0cxoMzE6+zZ3OTPtQdAZjIjBbolG6mBb+zwWt+NS9n78nIfcEiDilL+jPCD9hcKy7iZR8GJL0MljFR6au69LdWQwqsgXp8JP/13M9J17bNy/hzho6YjOpUuuFIOHWbYQrOgdGpBl8wdflbxGeavXx/RAiDwVzqOPFGn1MOGOA1qIZIHxWHVAdH4CIXwEEGBBcZCggjr1jIKfsfQQJBab95/OgaVr6BDsSzjrAxfF8WJKXVw6zoQln8aOC72HGt01l0Dj3w2s7O6B5fvrLZPyMZd4+8VeZo5nO9zjIgnKeiuHxqpr24Eoe9A4Tbe+hT1CFzlYXUsL/aEkMEhhkW43n5aYlWyKQ8ObgRA0+FfayluVgPw3903zvizlyxvg7jNEc/xWI5+21ocgoEEI6BlLF03wW0Hg1sS9IS99iL0vlMbxiicMHfdqGyUyLVD2mLIs0eBW0d5oLRQFqic/Bw7pf60wLpCyLWF8sg3PbPPWECfc7ILN+ImRe3TxbHyxtTiN8DVQzWO7eMJyEiCX4MssvTLvDHYhYie2AMfn0upoEhRqlgWTE2b08azgXqLuXNzSi1MhHeHQ/wb6oVQZUo41bOqb6j+XERXdilsYhSAv3aR2hG+dYqYrogWuKZdwGorrhhDRtJSNrRHI97W1aZkBrTIt86olG1ia4naxatlA1scvmwT4O+4NZ+kEkOhYpeYIJWn7ZXMOLm7qyKD5fLOv3xc/sfInpp2s/p1ZpTfhEXN9Z4pfp8ENkMuJcE1klojCW3RjhwzxhdVDh5QedwEEnXQfWDQntuZquPQKli0pu0IvmSaIZqQdYaKrov4AuzLCMafnu+7WoSqhOvc8uoSc5yYYILP+9qVvc9ie/9ZnPlUtrnNDxHKBPnruR4Ft4SPMWCTlLh2SPK1UfRTnP9dDulQ4MVxhIIp9KXG9+CCpIiyDJ+kJL+BJX6Vv7d2Bc5VgpkvmaJS3YUSijNUyu+ykKJatCcvNrA8PMOSuesn/JTeePxscT+TIYAw==","page_age":"September + 11, 2025"},{"type":"web_search_result","title":"Releases · tidyverse/ggplot2","url":"https://github.com/tidyverse/ggplot2/releases","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"ggplot2 + - Wikipedia","url":"https://en.wikipedia.org/wiki/Ggplot2","encrypted_content":"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","page_age":"4 + weeks ago"},{"type":"web_search_result","title":"Package ''ggplot2''","url":"https://cran.r-project.org/web/packages/ggplot2/ggplot2.pdf","encrypted_content":"EvsjCioICRgCIiRiZjM2ODdkOC0xYjU5LTQxZWItOTc2MS1hMWZkNzBiMjRlN2USDBLMJqyUCmgXRrVsWRoMkwJRBQC/zyS2HuA6IjCLFxmQiA6lf8rfN5WaK9+EAh57HojBRbT0Dy4fuGAZ4626vOHyYwFKI3/oyWpLrb4q/iKM4Tl+jP1F1Jbv6ynJKm6LkO4OHD671RursrcU6vMtTrVeb2BpagOQBUdzXq85Z0KjvSVPC37vsDbiWnrE2z60kodv1n0+qaSw1wdI7u7Y9GceInpb79OY31E8Z3dMzE+55ACcqRsHqmIK80sbfQ0LIT8XUfmNfDp5XY0+F55erEzOMGKCtziXUL475Gd2Hax29bmo79MnP6M5AFLCKMrj+t9WBrTXuQ6qa9mXQXY+gV6n/ZIENOJeWAOs+gNih1Vzv9xcjGCJ0HkW8z6LrFpIDXbsyDuOMMc+b8I09FZ0ACpNbIofu8pVhrX4K9wVIQy49RyqqoYmsQ0Ulh3eLckMIRy7I/N1ZrJ3hZonqDJQtjDcrjTlMFrt9BuaPSMy08CvrFaSXBTMBHSklM7yci9cAIQLPvf6qbUrQxAVzeXiewKxT5czmUTfSfOTvist4cZkzA4OkhIIWhW0sKv1E4IG4vq8GNcWt04IDBUsE4bCd6ZZNmZAW0qu2u/N8vcReq9cPhAse8n/c5gYi4Dn8VcRxXKePjxtJD49CYIKROQtOHt/akAYwC6JBj6vI6llGkC2GCLbCfKaUXfi03ar3pETJlqVutTr7Q1wYESGyN0urLQ3Hax6//bxBc0L9sMui4DI58OPVkHW52xCd1dJ2gwK66DfZH1EUDn3OXuQZfbbccMRjLG34EfOeVzAECTs+ldrM39idULQH4FaPQbZbtf/JbwKO40V7P19+YiZzf8ICDSUCanbKV1qF97Oi0XjyDukEpapaIYeJ1ngl8sXi5v6ubWWxJLtMurcd1SmCxrdwvnKcVEx8YPEydkIFdabq9qrcrmO56kErNFoRRnM/GlxD7pZ3nCTaBy5+mlkDQO8ypLTTyetTwJXhCaEP8Ts+mvi9pUtBuSdalG3muqat3L96aMBrECYpGI9M+QUwT4hLAH6PJ9/QjK5nqOiS/234w/qcvQVrbjDTOxmNLqHDBzhQFTtxX6TQf07g2dUy+4rYgk8ejDF5CNvEFJ1SEPRsldZFXkVe4UycFjfKGqRpAF2h6P7U6yB193fzLDwkjBdxCh9wN2+J8IcQFspUJ2j81CSebn6C8ersMlMGWiiuNbnaf8TL5lEzuZAm46pR09x3uytwTQoqXQJwi/cf9TuGWqPndNJrbVx2/LmoMeKcCQH/+gtk2VyJPFDSMwltrlodqZzA263peB9jmcKZDly0InJA6Dh7KaL+solz1QxfMMklvY97HXqf50B6D/FIcIA48UbT7VfwZt5WAbV0YtEcWgyxeJ9izLF/qE/9LL868363jsDCZhHvwZOjwvb6D50onpk/9dEv8ATnxDn+nHT1l2wTiqhXOiJf2M+DzmktZud5CYJVjx4LSQG87RDBTLCAy7PB/nfB5rV59L9TtDNM7raBlQungXWxq3LLR0jcTHQ4O69QhoaEkr1hKnxVnl3TxSVt1WfPo3GnQ0l+PMi1UJ4EPmjob8WJ8KdDAwMIp6fZwYS6DeiXOx/fV4zcZV99FcXwNNAdCqaHlqF9qJPSd5qDs6f/3LkDnCusmH69C/O0Ii/hdWQKX3yyqVdhT3DWPUnYNjwnIGyPbRjD+AeiX8fADnbHvgbxYogWBsFn2PotCtbChpdXIlx6BiY1nPryrsVSBTXaqI8TW42GvBCuwB2498a7h3iYG+Ch0sP+QYlVEiYYRbryHYP6EfZnKgB6RcWKTRAcOFhIA5+6B3pNCv8qSz3GyU79emvfKScq94KtLC3ceTq18iJAf28kg3H8wkOmRIJC5afzsfyCSE6Xwrz6szoLTfpcx2c3mLF85UyNiaR5xDaQXwza8o4pFann6+qptHPybka9JdbSmVvN6k773s2s/wNMGKDE9QZmnw5Txzr87kN7TlkKv+UfYY85f/iUTnQniFrg7zFRp9dN/xfbp8tTxb6GFBQO+fx9ffTmES9MUyYSBEWoiD4VSTkFmftwBjMgFlznimOW4P8yUoiSgnO1ZXUj1/wWAl43IxuMo3VdKD66Psu4lAIiUgQ68QAn48dE+ibxArlk3bZRihQP4JglJpiSgX+AVTJlnJMm5WgbN1VRcqLk67zllBXj9MYhwAo9OGJ9ygLVfxCu/AiLa7w1dQsu2c9iZIoPZpCbo/L5KorBI7ZMAH/K1AKy/osODRqhRdiNMNHQlxoMlHTdkCtBcE5OWpJ/CbQvVjMxnACPWS56dSifBobtSIw1MnoOYSfbnEN4mcOnSeDi4YOL13tcix6WoeCUqX746nTPY2mFiC5j3Ka5jwwxusH8jMklKJ0kHzbPdiFrG8BKz35FV2vD26xcmwdBP9+gC801rLUlOtA22Oo9oIa56BSJPIsFa4lZUGxFs53fD1iJNbcrC77DmS2CHbv7d7Vge86MMUrMNG5xVt2FK3COAv/EYd8IJjdxIbgtyH38tAIlMYdOS8OoykPgEZ9ljL1KMCiOkjqYnydo5ynqFAu9tfKzWpWETtkgkyUlkVakZzGWh3WN7ZrfNzPLup11TxROulXYS693VphThz2etMe83alQ2B/ScD+I5lTJ/59WXTt1GAx7kVEvi1wynjlEOSn7vNXu4NVVOF9yUr6v8uZlz0WVFWOPbLiZkxh/2bZA34lLPnASqTuZmxfa6hq8dvRndnm6tHa/j1gGYCXzdlFDqwGdPICW+bJyxGBWML0J7oUHsLdeuqT6RxuJUqH4qwsDLslMDQGg4wNzQEWwr3jMC4BD7DHZX9qJhoUvob7ftFaGUTBj2rLWLSQmBw8hSPFVxL02zuREmX7Bl1/UXbPFPk5h4M8d/i9VdQMwZAtvW67oFszABFhexgBVCP/gogEoPmx07S4A0afMoxI8bVhMzWjg9fC14fkWaJx4Se3sSzEoNiLnFYvLQ6tfXhqQIDqLGjFsbgrit3jD8SzVLqJO+nPbX01C5QzzhfMEAE5LPvjYH9BvGec7fgNYMGxEdrzX5YCQQIvyxxFrCZV9VF5WmeDaUnisaxt6MNDRRtSzQyh/1HF6rV29gZpsC1vrz78xBlCwbO1hGqE2oClNqPbgqZWPgQwpnhi3qr+ivUqpki5veTeBY80X5fgYgOeUGwm3JtfUdc72HqM3SfSVm+KJc8p/vU7SNfP0+i1LYw5m+tIM3XhAWy0r9l2zLJpbaKAgT4jROJGnrwaDskJAHu8S2+HYfC77Hf6lshOedIDdf2bWhpzA8k5YKOgfuKaG5lAT4qZ5SXM9imkFuhfujtZkfCGesC/ozy9et4XSrVutD78Daif4LFdDVd4WnLU6ON/53aSvnzxUIRYz8JO4Vg610bZ0JOckevpwPqOw7SlqT35qa6SNAxZ/xC28zlb7Rl4W1zc2air7qVZgO1dzGCAiqaNKlAoe+c9d/StnEXHFrjTrFulxmbP5C/+bgY3ZRgI/R6RT0twOCeKjrVK69vKKaUbtTCxKDo8tOKBRz26n1pdQgwQTHjWjZalV9VdDERSlL668jyGo4/rKGVf/hKVkslsHxmc5BTgm1P48HrABQ4kiLATdk60tIKc/AWD8BD3X+O1sioR8mLkAKuPeNk6aZwQLsqrUTBGxg8EA4jXe1ki1dRt7+OA/T2W9/aTA74C3d6E8hgj2/nBZoRzZgCT2+uUFD/tRJtWfM3MR60QxanKa8WRZDomsyC9iVOFgzPatZ1cgkALqrUwPMtCxTuX2IoWCZ7XwwX9vFZ7So7QwqSqtDtbPB0p9wDH65mKtYHH6zK2i65P8k4q9ZQsxWT/chDldB8k3nEcR8ZWraEkvOzaN4Xe62orkwO6lbUL9MfXmNIhgexjAqZ5F2kde+LwJpLfvfasuuNGaLPzAKzVLYngE7VLnHPt7uhZo0W+yUs0MWZABpTnNqfwNYIOCMm8ojJgq1uyk30n+Kxlqnqv6HBFaIlvuafgTDQDyy7Kzcuu2Hem6h3cpK7ZMWBsfOCrBJwSoAI45ON71448/Uheg2ME8QZQTWR4Q3oVyc5OIFVEBIASf7MKYEl62RZ9tANf+olRKqYsSV/ixLBkZWhBu674jKA2OmBlsVm5zAonggoaNEA1/vIJipgJZXpyzzxk+BPlujipautJstmhM4QJTpWQ5y2WWvqzG6shqMHOyG0/Gwe33A5mp7/dk3vtCik0V7nrwuoKV3bNo8n7brwnvCsNImTr06Lhun2KVcTu37sNA/q/hzdvX0x9mzqfNBRDNAym0h0FL1Brwne2ojYwaf8l0CIJ+5zkvCqeSEShtPHzE/1W/EiAS7ExhhPL4zN0JP9ZTwMbv/qBp22YY0MiireLqT9fjB1eJ2hxIwbX09fSP4X1kmQfPnN/lSPQ80XnaaQ0W/r3D7VqPkXBnDTlfxrj1hyITNyDkLg8ps3hL8+teH83jMUm2QBs6PoaDQw0jo78fX+Vbks9IyyIjpgXKMwHx5k3ZyPKOiyWbtI8pEDD0e4ALzz9XfaVuYBzf1KAxKkD3OsBXhl2GmioC+xHkOqfmcUYT6ZmTtlBzdfPPfKZ5Ynet1fXp9g9O3HgACalcrC4i8YOipCv0K1bHe8WobKr26J5MZDZOFYRHBQ8iqAuEiJtWrYHbwxic1v56EWLcGCqbi1os4JAkHG268VO37W/2YBFPCvsY3/x8JwUvACMkXFyhcgXPiT4b70mcZGvCHyGsPkDP15TLuqBdO7xwvkPuhBPL+6gSh5JNABHmzT1f9iam+H/GYYylOd2gSlVSi6R3+FBxRTVRbjHKMsAw70VdWbSYmHTkq5v/iTGISdFMiRtjgXcjBl0pCkmJ1kayCNEl76Kz/Gs4HHtU4yFq/HDpk5fwzwmmHWniusLtplibgrIoeWIy0UAvAZwxWgu/IP7qAj3cVjAoSGK8/1tM/1Ih7ViX+vlG9fxuUq4TJGZcCK33PIcEF3tzvultWsdIk6dZQmW9lBhEuLKpCgWDl7hPLBNnFkjpuNnvDYZOgNlaRSA3LRjs1UdpWGShW90pxMm5t52rQNlzXtF1KZCNikZq8YFT7DFx5mnL7y9/k9EMDm8iBKiCsdwudznOAURHzKBYQUTc8dicKIO5wzNme8YjRkkQ7AIj2iV85boxsKLskyTSuSo14AcRoPqt8J5VAG4bCkreaOPlCAG7EQ4eVMQPNe9J/i/vWlvW3L7xGeAsFbih9wU66l4dQ/noyKmxRSy0IUzmFT4jhsqVe185XQVP2kz/38cWc0JdN3T0II0mMyUR4ozRp8xqiqSStK/zaxJV0O8UM9wObBiTcyM5HG/R325vBuOi6q8wKMJgn5xCtCaDCNin9InCbx0WQ5KOb/G6xwKifeL33NdXekVyG+4Pw8wk47BnS+FkRZ0cK1bEebvZDF+o8Fi2gLrtLVrTAWU328bZnqim5fQ0Fy2MkFO6fpp1dGfQ0jekfzSP3btro5hHzq1KY0/cvQcCCDqqbRAuHbC33hCrCS2H0VEialAMFROtnr/m2KNJCzsGjW3EDc9I7LRDecB2f1+9BFEHBxiUatFnO3y+sqqLH8Lf4fkuPPLLMFN2hEdkTDf/fFkNGdylC4IuDqKYN0jHeWY2nZPr0jpZcuudoZzNgvR52agrjwIHEvCdexrHQJmYBDexmnGairEo+7IFEGQQpkzSHfl3dvMOXRdaXBF2eb1CxNsVtz++Xz0isL4U08U9sgvdGRQNlarjHn/zKbARTF/wBE/vGRbKODuZj7BSclih1aGv6M1dvJqmKS0qbhWaKN5ph49EBYT4aF/pxaA8KIBEqaIhiFExt8YE5Puk12hgMY5rG7qfUThqc7v/ae9G2pTRzGxqxzVR+KtOgvuYeMaLIBbhID80Va39Lqd5nm6IxALFVrj3Bit5IYVoqi1ZU8aigFfQ5nbnBTL4BQIhUFbj2ASaDamiMgxO7klXw0pIWycIuqS8E4P4FLKLKcmikrAJ+p5OcgX5kM6KANaxe0vtNjWfg1EWbn9CKgFKOBVfNH71ZVyLbbXRheL4P5G8L8FBRgD","page_age":null},{"type":"web_search_result","title":"Releases + · cran/ggplot2","url":"https://github.com/cran/ggplot2/releases","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"New + version of ggplot2, new problems · Issue #255 · pbiecek/archivist","url":"https://github.com/pbiecek/archivist/issues/255","encrypted_content":"Ev4KCioICRgCIiRiZjM2ODdkOC0xYjU5LTQxZWItOTc2MS1hMWZkNzBiMjRlN2USDGXrhLtVeJsot02xcxoMgBdX6NeGeDNE3GGtIjDDkOsI6t+L4tfE/RnJ8A2KPEjuKeLErMbzXLiwN3/JqtEmxR+/lMmnqMbyiviFrsgqgQqvlwMvpxBSxmB4ymGEj2UFRKwtyWEmY3jstsWcx2zCGZTHe+pEu4cTBNIcSQTh6h+1rCUQnNp6wRYrPItIsaxVdjc96lgVPtaPXBXDvImx9p0dEIz+/4ONHEaphhR+M10KgZdqu44fD+xOWlLuRoJMnL9YliR07JGWYH0Ur6ymYZNUW3ejbe44e+FAhKe/52aptlfbJiQI+m3m3/v6V59WS8uV6f1JeIQg12Q6TRmAFVorFjQ1bsBLRGi5VikibbcIOyucBAuQAuqCfgSmezvjlXWVgoZZdKaT2FPbnqpYnb5t+Fxxql74H1PrPeODy2aEmVnYnOQzfMQLGAg0+1MfW5gI4YV8v4q8LMpfb9Jp3F4KgpMP0mBxCo8Jz8sZgDd7K+n7AKNfg0DqejIw3nMaq5tgP7+LgkdV61IPqM3qQDzZUVJ+tz4UOZdkrNsjMOAiArAMt8sLiavd9vhz4sBRKOwIhZnkGf1NS8T7vyO9UOZUE/uoecOxqiUxa4Wy2PZrgiaU72DXc+JsKOX8u984FT4g3QcN3AzIdEUJ5iLzxVFsu/ymTdXZzKZ1z75aJFJPAB1CD2fVSsE6qnA1LrhXP/qnRWwJd9edODWoh0sSj6sFnH9Z3BWV7Fc+5bSSPrXnn3pvxKiqjaLxugRLiq4M6Fk2SidB6X4cL6ObTyImJTiYv4UIyuut5FUxoy9+q+g8RsF6LkAab4BTAjUGluH6+rX3vjDp3rAmr59MDBqpxW2zUdjPUM23n0gdO+9mv8PYA7vhRFGqipy3ZbjCDop1rKYV0XM4xS+zULvz/fAClSQi3YbRhCjwQPpahvHTy2FNHRqWumwg70o2JtlrxxA3MAQ3w9VK1f+KAIAc8qPXcIruKewblhAGGgevx7Qn9xb/sH9k70RK3lHwpKpv4PEOjnHRigW6+wMCm8HJmbmbhbnLvS4wm4RRcPxTthGWTdbY9c8RHw7c1xxwdCOK+IHblQxAUekrJDTD5r8mE8eSmZUejbWxcM2r+QQMb4lqvR7nY6g3X6+8yQ8VEwUVFBVfayYgPDUzvj6xqZgnV6E42McTLI9zmueSzu58mocLUMe2h6oSy5g0GGmAd8cUBHPNWmPiP0J8zRuL3WEqqXiLm2Pnxzt/KnQkoImGaZfrFut93mVEgB9+cVZ69houbnoQcxS/cwa1d9Q5vzXcpybzPIqQlSCp7PWGQX+QS52ouyLP7SM72r3tLTRqWbuRjSejCQBoiAyr63Ws74LVwyUCwhHyYFbbeGqMBuOft7fi7WNsFpk2HcON6EsLtom8Fc87ROJI6AoZUnJtwfJ/JYYqW1LZ0peLJsGACLCXhc/3BNMJVDb7oh/Tsgv+DBtQgBXmsGZ732UFqkfw/0ZrsdSSOuMFjT3tzPG6TphwjxiARfhW2+kjFKOH9fhxdC3KiFzy/J6vdkvLDYiOWrT5SzkSvKNofAW/ZDecTGe2brShJIc+1NN/3Tv+x7vE1Xd9QgwfbgdjmHC74L1zSCFZfWZNbLscn8RxqoL4We8KqaosAFguCJXrLPlO5wYGdv/1Vbg240ZW9wc5PdwfzCNr4iYaUUQcUP4dgGd/lpgDJfIlKS6wT1Hpxjxy1IrGNbC3UvegSrvhfayD/JPctqJaDoOyQChlArh9kg+/xZU+4ZrQ2MPJFUdORqjtbU53telc7RR1jB4NErx6knu9GumW+OAekrMYAw==","page_age":null},{"type":"web_search_result","title":"ggplot2 + R Package Stats, Author, Search and Tutorials | Examples | Downloads | Statistics + | Citations","url":"https://rpkg.net/package/ggplot2","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"ggplot2 + package - RDocumentation","url":"https://www.rdocumentation.org/packages/ggplot2/versions/3.5.2","encrypted_content":"EuEjCioICRgCIiRiZjM2ODdkOC0xYjU5LTQxZWItOTc2MS1hMWZkNzBiMjRlN2USDKDSQBeZJkRgTRwmgBoMeQFjXj8zd8Za9ePRIjB4vJgwr7uOCwIDtcnbCFXC/ttKDx4yGhf0XRfdi9r0Ty/ShT121DZbB1WhZOktAR4q5CLLz+nK3YTml9My6jrA2V33ZXAbpFyHPllIgwL9FMRcknEdm6KG9YYaxeb3N3a+Wa6HwPsR/XR7J45umTYO/zCBLytkFajFPT8N8xlx5VHycQsLmGA5MP9Qob/prjltBOBx0E5IEytSa0FDCnCNdvL5FsomxQemiB6SoHHNOdcvDZgnlx3GWouif6nMyvgvAdgpA1SjkxFJE6UHrfz37RKareqHF7RjZQnNKX6gCLcWBGx+D1Bwu4CzbhyJR8UykXkBbEzvglwf5z6IrxTLVGXyT1Q0hU5YeLuSc/VJPxwTGMa9ub2+1TF5srwLHmMw3+JMYcUTlHGqLWbKHkbnzxrD5f4Z0iHeHsH+8Cw1PmpwCR9iz9SXVbFuBg4MfQrawtbTzSCol3uPW1kVQPp4590zOK6VaGzn7xiRMJ2TbzLaCQ5Ipavn7feHYeAHIZmbxkutadozvXOqB1Oo1pCwqYnLyobHxmvZ8YrcBxH/TjbNZbJ2DgSO7JYAIfinC3m3INch3SatoWBlVQhnHo153W5D8OF9xn4u9XdknS4yLKsYZTO+EnG1O5Q/8lfOarycYo13nk4eS1GzZHJpYOkxicUtAfWUmVypBkVkDLXF8TE/yOoPueYdnP0KEXBWDQ4zsXjnhSevl1xN+x2L+y+8LdMdSZALgLKSLkSL57n/FNkZKgj4qB7qTmJs/ZPNRdn8W0ThDGGE5Iej/DcLgQWB7WJPZ6vKDoItNZK+PUicCbY/Qxljxmgq0VXztqsTwPoV+zP9XKTWUN/xS1GFvMe9fDZS4b9OPZncZuE06uCn/bZg13Nbtar3cwGmjr4aNijmMToRegIin+Enb+neyNE92Aq8NKGgo0WRF5ou0y9BPBhNebSojhqvqMMhGjwk89FuiROsdYoxUd0VUA+WferlMyyxaWCZDNEPigpTepfat/g3CwkFiJ70EC0vgTAHFAXJvVGZXS/l+63tCf4NUkNzhDIR9qUeZQ8S5FHIYWduYDgLDIpC0IgjkiI+Ex4bBqlLvwrEuazjccTgNdgQeNmLGeH5jcW246Dmp0+obncZNzWd3MmTc+H2+LtQ6/UsTwyRX/j5fiEW4XUHmbZDkI2d/YqThjvdQ6WUnr2SZjmg48WCvCbaHl1vyy66zNhTBKz9T8yQTsLl8Cw9zbj69MO/F/jUNlWzome28pqXyP5nF8v9/WHUP/1HsP5gnwb3gd1O39CK1XcUgy4r2EGucUYES/edxDDrnN4fWLFdmWrwZtgXy8uQEx3fAZjY3aGBgEiHCXW4kQqmA+pREwVM+0fgAd2/DS6cPDBVEqsVIKB7kanuB2xihTLIOI6IydXfAnsJYZF7Ac9JynpZGvIiLGxO9/0RvYlNEIsYuntmySmi+aF0YJlFVeRjHTfdyvsfx5pJBJ7cqsC7HENDg9wMzAwyARnbNo9kGxdAl8fIQwtivCHdlEx7/QxXHj1BbOK064SZVsZnUu/mvCgS2bXdB5bV3gCDhmeWz0TLLNnGlgv2V/EsjKN4xRyIonqizsmWoTN3vQg4Re8QJYzA//QLMnLZ11Zez0rqIFezhiH/wcfR4g9FE+aITmX/64u15Q4gDAPqOX/Lh+E4/hOoMxEMP/564DZgdoqEEmynqy00yDF/hR/3s4BKZpAmijeUMI73RR7rdx4Ky7cKzL4rX4OuWePiJjWUiLp0NfIHeRuRJt/4mF+pslNqESuL2kwDz+Tou/Gpesxwb91M6COPM7pWj4aIddHy93qKyLUyzjz+mfC1pNFbJGk64EUvucfOOJjM0u8t5hHfcsrNXJuMOx2bvcV7s3br/JJv97/o/u50C+Fqf85msUkB7sK6QjoO0xQJmpAqSXruCSJGRYeAlGPoqWl35GYAKry0TRlj/nXXp/boy6BEOPSogFyVeQdANuJHndRCjyiE88a53MkOGqbv3nviOKasCMFwn5p0PaS9GWpH4mcDhgRaOzEbZektgiJfmb4chtktz9gMEtIFFfqZ7LL0no6dznwmcOq4k9im+ZdD1/xI+Wkkoy2afZ9qWHQPY0qxAGGaFSye6EthuGmbONkXu7s7WFD8Xv8huBkvUk7Z5EuPPhQ+XIBKB45ZihDuWuT4eDzeOajM4VDW8WXyZt19EMrGDoCOyFpbKciXs7i0f4p4lEaw9CJ1MWDP6NlMKE7lF4Rp8VVtbIFLLVZIuPcQTwqKudDRHzB9fWA+R+qcMRvSy+RNV2yhe3qd3cki0R8Hma3dAXN/+vqNt7zqNl2wpl9h0lKzPeF2NQ9kCPjMADro6NIRInssx9/q/p6f4rj0YEh1dhX+mXKCS7s1W46thrsu/mnMZmexrnHlka/O+q9f0fKd2nPAL7DFpXDa7gJ8hC+h3eYyPRVAi/tRJ2WuuZ4N4GupBSCQLlDP7DHdoezEew7VbnhWqmtHbkwdtcgZvCOgGxEHzBI8b9QYcN9h+L/LJnSg8kdI+2TlYxUPmvDGSBeoeV8EVXC7LNN0vcqa1J4DPkY2hxByBwDcY5iMPhNz/dtb/b2ABkSZ/i0kuoDv0SV7zcKxvKiO9nXSTumO0zNCXTHjWJpycohIe6L/tIpYenXUBuU+Af6gSy6cJeUkC/Ph5tzk4ZeA1oVURihZbnfXycv+QiyxfwLWQcVHPkU2AqtCZfukr4JXSaR1nNNvlgC34WK+/TVrdce/02sO1HcKxfVrRel0hoSs+OCQ779RAgfHEqswVQnaPnlnlAbPQF0V/8Y5t8t7Cd5vN/E+Ju0VH2lVQp7E4Sy8bI7bYql2u/V4yarJ6DNli9CfP05Uxu8Ho3YJKVt7OGfBoRUfSaYp7Xcr3VowUSoTcKcn9BhwmcE7fDXWkRej7ncTnMwEOCMqBEh1Ve1UwDyX1ulbfiAJegeOn9pAIZpnBCsB3YBRJ+bpmzxGLkhR1uzmqkw3WNbHVfpjQpKZyrDv2fQn4jXEqY+15rc2fpX//SbMztzdAkQMeU6OWhQBDcxS3tUg6ngQvwpB3+tz01gHElWBmMXWbjKSmB6EiTg3Hq9Wi0gC9VLz8ECf5nVF4vJdP+pNCi6s5npLDXJHJg7/x8D/V7UUPwIO3vnvgwGOOqs1tmPeufVjaFDnhz2H63MgT2K7uI5E8y95SqjffvgxYWAXSolyjBQ5HC2myetBorvfCblswIh0ygzwC8iWZYI+T1UorgBg5N7JL0eYYN87zErRG/Bf80CuhVsWKU0tDmRV40uSHp3E2O69aSw+5UOetbAN4pJGZ+BgJ312I9prSNyeISCBCAUgAZy0sSZvJ9PjstfT87baJWf75mHPR4YmKjQvUK29ddyaa5dzYvi09mr7hshLNY49/gZWokrYyptseyW57JJ3lJ/vXtZQnVe7ykWPFCMw13cwx8r6OJ6KifZKY36lQppa2jBckSiESi8D7ip6EbsJnbD7wK4iRAM9YLYvnAUMgPd7tZR3yN3HTZYSl0dSZfBxecjdr9BxnP2u+SIhJuCbjkVFelmxuLdgCmo5y4UxSVQqVAbU25Uel8+ItO00ZTvhKZmPVhHSC68jcAWK2VHA8Fak65XMrjYOAt1RcvEJr4trt2unS0k/0XdCBfmHAK92LU7A5jEdoh23T53GcRQlRAFsspEk9ILvFXYDjAh8p8Da9wRNPoKYMs/ajFFKGc9pKTY9QhVrV57bdBDDZUHgePupu67G5f0U7AT1pZ4bmfkvleLq+Yu6I8xIajOUTNuju1PKe8bHupssx33JIz0Sf18UQ5iFY9OvN87quSAz5K1qGWYYxy/cRxpGDRSEQWykcEkzzPsYvBLGaplUw7Dq+xp5Mzql3W8JEz6qc57TVnjigb3fIoC3zWbhPU/8G5WUYX5HHfQQebNDq5LzDlcrslAOwn5LixhhUIUOz4w0cEFbatNyUBgc8U8JqUWO37K+s1xdXN2vIWRARrA/9uRx94F14QO9zpJorWO506hXHiNrp+Sa1/X6Q0dAQlmH2D7Qh0T1rpsWqTi/Zmr13qbfwtcm4qNG2BVr+qs/LkgR3maSA4AKQrHkz2lxKIwtYwJnPNJJOza0DIRvSb8Q3GtpKltGnIqpiJgSl9rovgw8OitlYbopMO1DBai8DvpBGmreDZmXBEC8WylJC2h/U/uJSub0s25xNVuvTnI9n3q/eMPjI6KwH9DziXUjFq+2RoPSghweK7zuPqgqOkFrtG18sSfSiVl85vnsN8ceGhFa7UW5DLRmNSIL9w1jAeZRb3oRl0UOfivOqo9dbExpqbVJ0RlFnBFl39+znbUwwuKFfFOU2d3zv/i4FPKW7VBq1C5kn+MY+y9XTFSP2Db9R1xrkAXTOK/FVhEeLF8W1wUy2PuLwbkAesYu385HNTHOhkXa1H2/e8FeULBxZTrryJa8N/lAQZ5XFGq1LisNBsF2HNikkv2vhKE3dWCVmlJIEzCoBwX+pexmrarmQeVoyz+S273UjuI+WLVno2/xuYZNzX1sJb/21GEVHbml2D6MsdiVrIiughxQMKFn3iFfcrydjt1W7OeW5boY+Z2Sq6kDW5VvGWzr/SGuKuEZgwBUXMntsuv+zPBKysy9ShKnImH52Z1q1JbLLTcufz6fAVMQXvJPa8o1hW4jF2IBfZV77olDS/U2XH8QYrd8ipoJxDBCd6mXt6YOJc1ZDiDWJjMbG6W1oM64OfRBr8ZsY5NvsPwrvI8uXzIszGwpSecqiQ6wpkfRtWKLxH5/ghbYihrisjBEtc3mDTvRNCYBnu8PC/TA/lqG5+i93EBH2VCdEwkdUiVakzU34OPUUHbb8wFt6vkxYKK9I4EjT7CjantRIvnSHhA66dGI+q+5Ie/x9e6hP4sEUSRt8qOfm0SunyAkqdYExvc54unaZ6sNabegQZeMy2Z50R24HwJd7mvUcGJ/y6zkoZAZYhf52URvWN8G49PnxBFENX7hf49ztVvJfMTBMvyp437zzRWuKM7JyyMYlTMKw/Ehm02GmX3qGH4ghScN1Vl/XuhSS5eSyzj1Z7iK71jHnO82ld/vwaxWWi6r1OgQHPrhbHwgHIHjATBlJa/ppgjy0vn6w8d2t+zIPEWERbsh2FMZ8F6Fa/IVKmscvsJYVNWaVtYUy0U48cpteS9KN/VefFSJFI7676S5kG9fs8XK11qbCLGuOA2yuOH/Uhanc0VPvDEEQjuFPPkAR3oO+OqLwqznPfsvrCxVZmB96x2io3Qj7+JMrcm8g2YOUwft8W5pWgsIpGjkiSoMWEx67dX7jStcX7RevA3X5UzDe2IuNGHnkg71Y21G0toSEhfvI+lm+KHGZNX22ySxzXvo8hIO4Ioj/s0+U8auF++xAsD8tz0tnSmmc0vswJiDKhEx3TVSp3A2xXgpZr+a2ycPyxt8vCosAm1UDQV9C/ltm6bYETttfFlAspcN2BImeykF94YhaHzlU3XUmo/55obXxFHED7D7OtiaoKic2F0Pn44MvuEXUSRSpdT3q/WxQuMfN/Ni/0QD6dIMwjL+ZnZQVp4/24g+623OKxYceyyiBJSsBrd00heHivVgcxZdy7bdVGmcRt4uPf1PtDrd5/OKUy5rBlY8blbP52ijNKXj80M+gkH5oxRUQcoSGYKV9XWylH9bF68qAoWoeVv8oljaTRlhjBZwtoMLShDtOFerz7SgFnMIvva0TxuJhhtt4yh6kWQpJuNaF1BELm1B+sb/YqxbQ9p89miQM/D9jhCA1s6g56bCOe1d7XlU4j4qRTBdibmsmkaMcprLtsrCwgTUOFxpCs/wozqtGluiJy8KZWGBCUoM4K6Ezd3k4aBj38OEdXlyHt5HOGlLqsgZ4iGFFZHOzOSjdaKnR0rJLruwr/ANC3LGtC1HJ8t18ssftusCwWLeVx6Z2iZ465N563P81BuedUKXD2WffZ6UyGvrWiegH0JqTFS2fR1HVbTLcXyhkOVTLKz9SGyWXrFFxg4YAw==","page_age":null},{"type":"web_search_result","title":"NEWS","url":"https://cran.r-project.org/web/packages/ggplot2/news/news.html","encrypted_content":"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","page_age":null}]},{"type":"text","text":"I + found information about ggplot2 1.0.0 in the search results. According to + the data, "},{"citations":[{"type":"web_search_result_location","cited_text":"... + 0.5.1 (2007-06-10 21:49), 0.5.2 ... (2012-09-04 08:16), 0.9.3.1 (2013-03-02 + 15:57), 0.9.3 (2012-12-05 13:11), 1.0.0 (2014-05-21 15:36), 1.0.1 (201...","url":"https://rpkg.net/package/ggplot2","title":"ggplot2 + R Package Stats, Author, Search and Tutorials | Examples | Downloads | Statistics + | Citations","encrypted_index":"Eo8BCioICRgCIiRiZjM2ODdkOC0xYjU5LTQxZWItOTc2MS1hMWZkNzBiMjRlN2USDNXYN4w15FCKZTQbTBoM6G2P3OgxNnxQNQNOIjDm63SwVPZdL71Ai9i0fy3qqbVWV98vMkFGzU1Wn9bmiD9gb1R8sUK03eIkxneNwesqEwrV6XIsSbgnHLiv8x1JF8wKkgsYBA=="}],"type":"text","text":"ggplot2 + version 1.0.0 was released on 2014-05-21 15:36"},{"type":"text","text":".\n\n**2014-05-21**"}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":10,"cache_creation_input_tokens":19569,"cache_read_input_tokens":2240,"cache_creation":{"ephemeral_5m_input_tokens":2240,"ephemeral_1h_input_tokens":0},"output_tokens":149,"service_tier":"standard","server_tool_use":{"web_search_requests":1}}}' + recorded_at: 2025-11-07 16:59:02 +- request: + method: POST + uri: https://api.anthropic.com/v1/messages + body: + string: '{"model":"claude-sonnet-4-5-20250929","messages":[{"role":"user","content":[{"type":"text","text":"When + was ggplot2 1.0.0 released to CRAN?\n\nAnswer in YYYY-MM-DD format."}]},{"role":"assistant","content":[{"type":"server_tool_use","id":"srvtoolu_01GAHpBrEa6jAjMYsJGetGcD","name":"web_search","input":{"query":"ggplot2 + 1.0.0 CRAN release date"}},{"type":"web_search_tool_result","tool_use_id":"srvtoolu_01GAHpBrEa6jAjMYsJGetGcD","content":[{"type":"web_search_result","title":"Changelog + • ggplot2","url":"https://ggplot2.tidyverse.org/news/index.html","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"CRAN: + Package ggplot2","url":"https://cran.r-project.org/package=ggplot2","encrypted_content":"Eq8GCioICRgCIiRiZjM2ODdkOC0xYjU5LTQxZWItOTc2MS1hMWZkNzBiMjRlN2USDDrhAthIu+gs6lY0cxoMzE6+zZ3OTPtQdAZjIjBbolG6mBb+zwWt+NS9n78nIfcEiDilL+jPCD9hcKy7iZR8GJL0MljFR6au69LdWQwqsgXp8JP/13M9J17bNy/hzho6YjOpUuuFIOHWbYQrOgdGpBl8wdflbxGeavXx/RAiDwVzqOPFGn1MOGOA1qIZIHxWHVAdH4CIXwEEGBBcZCggjr1jIKfsfQQJBab95/OgaVr6BDsSzjrAxfF8WJKXVw6zoQln8aOC72HGt01l0Dj3w2s7O6B5fvrLZPyMZd4+8VeZo5nO9zjIgnKeiuHxqpr24Eoe9A4Tbe+hT1CFzlYXUsL/aEkMEhhkW43n5aYlWyKQ8ObgRA0+FfayluVgPw3903zvizlyxvg7jNEc/xWI5+21ocgoEEI6BlLF03wW0Hg1sS9IS99iL0vlMbxiicMHfdqGyUyLVD2mLIs0eBW0d5oLRQFqic/Bw7pf60wLpCyLWF8sg3PbPPWECfc7ILN+ImRe3TxbHyxtTiN8DVQzWO7eMJyEiCX4MssvTLvDHYhYie2AMfn0upoEhRqlgWTE2b08azgXqLuXNzSi1MhHeHQ/wb6oVQZUo41bOqb6j+XERXdilsYhSAv3aR2hG+dYqYrogWuKZdwGorrhhDRtJSNrRHI97W1aZkBrTIt86olG1ia4naxatlA1scvmwT4O+4NZ+kEkOhYpeYIJWn7ZXMOLm7qyKD5fLOv3xc/sfInpp2s/p1ZpTfhEXN9Z4pfp8ENkMuJcE1klojCW3RjhwzxhdVDh5QedwEEnXQfWDQntuZquPQKli0pu0IvmSaIZqQdYaKrov4AuzLCMafnu+7WoSqhOvc8uoSc5yYYILP+9qVvc9ie/9ZnPlUtrnNDxHKBPnruR4Ft4SPMWCTlLh2SPK1UfRTnP9dDulQ4MVxhIIp9KXG9+CCpIiyDJ+kJL+BJX6Vv7d2Bc5VgpkvmaJS3YUSijNUyu+ykKJatCcvNrA8PMOSuesn/JTeePxscT+TIYAw==","page_age":"September + 11, 2025"},{"type":"web_search_result","title":"Releases · tidyverse/ggplot2","url":"https://github.com/tidyverse/ggplot2/releases","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"ggplot2 + - Wikipedia","url":"https://en.wikipedia.org/wiki/Ggplot2","encrypted_content":"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","page_age":"4 + weeks ago"},{"type":"web_search_result","title":"Package ''ggplot2''","url":"https://cran.r-project.org/web/packages/ggplot2/ggplot2.pdf","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"Releases + · cran/ggplot2","url":"https://github.com/cran/ggplot2/releases","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"New + version of ggplot2, new problems · Issue #255 · pbiecek/archivist","url":"https://github.com/pbiecek/archivist/issues/255","encrypted_content":"Ev4KCioICRgCIiRiZjM2ODdkOC0xYjU5LTQxZWItOTc2MS1hMWZkNzBiMjRlN2USDGXrhLtVeJsot02xcxoMgBdX6NeGeDNE3GGtIjDDkOsI6t+L4tfE/RnJ8A2KPEjuKeLErMbzXLiwN3/JqtEmxR+/lMmnqMbyiviFrsgqgQqvlwMvpxBSxmB4ymGEj2UFRKwtyWEmY3jstsWcx2zCGZTHe+pEu4cTBNIcSQTh6h+1rCUQnNp6wRYrPItIsaxVdjc96lgVPtaPXBXDvImx9p0dEIz+/4ONHEaphhR+M10KgZdqu44fD+xOWlLuRoJMnL9YliR07JGWYH0Ur6ymYZNUW3ejbe44e+FAhKe/52aptlfbJiQI+m3m3/v6V59WS8uV6f1JeIQg12Q6TRmAFVorFjQ1bsBLRGi5VikibbcIOyucBAuQAuqCfgSmezvjlXWVgoZZdKaT2FPbnqpYnb5t+Fxxql74H1PrPeODy2aEmVnYnOQzfMQLGAg0+1MfW5gI4YV8v4q8LMpfb9Jp3F4KgpMP0mBxCo8Jz8sZgDd7K+n7AKNfg0DqejIw3nMaq5tgP7+LgkdV61IPqM3qQDzZUVJ+tz4UOZdkrNsjMOAiArAMt8sLiavd9vhz4sBRKOwIhZnkGf1NS8T7vyO9UOZUE/uoecOxqiUxa4Wy2PZrgiaU72DXc+JsKOX8u984FT4g3QcN3AzIdEUJ5iLzxVFsu/ymTdXZzKZ1z75aJFJPAB1CD2fVSsE6qnA1LrhXP/qnRWwJd9edODWoh0sSj6sFnH9Z3BWV7Fc+5bSSPrXnn3pvxKiqjaLxugRLiq4M6Fk2SidB6X4cL6ObTyImJTiYv4UIyuut5FUxoy9+q+g8RsF6LkAab4BTAjUGluH6+rX3vjDp3rAmr59MDBqpxW2zUdjPUM23n0gdO+9mv8PYA7vhRFGqipy3ZbjCDop1rKYV0XM4xS+zULvz/fAClSQi3YbRhCjwQPpahvHTy2FNHRqWumwg70o2JtlrxxA3MAQ3w9VK1f+KAIAc8qPXcIruKewblhAGGgevx7Qn9xb/sH9k70RK3lHwpKpv4PEOjnHRigW6+wMCm8HJmbmbhbnLvS4wm4RRcPxTthGWTdbY9c8RHw7c1xxwdCOK+IHblQxAUekrJDTD5r8mE8eSmZUejbWxcM2r+QQMb4lqvR7nY6g3X6+8yQ8VEwUVFBVfayYgPDUzvj6xqZgnV6E42McTLI9zmueSzu58mocLUMe2h6oSy5g0GGmAd8cUBHPNWmPiP0J8zRuL3WEqqXiLm2Pnxzt/KnQkoImGaZfrFut93mVEgB9+cVZ69houbnoQcxS/cwa1d9Q5vzXcpybzPIqQlSCp7PWGQX+QS52ouyLP7SM72r3tLTRqWbuRjSejCQBoiAyr63Ws74LVwyUCwhHyYFbbeGqMBuOft7fi7WNsFpk2HcON6EsLtom8Fc87ROJI6AoZUnJtwfJ/JYYqW1LZ0peLJsGACLCXhc/3BNMJVDb7oh/Tsgv+DBtQgBXmsGZ732UFqkfw/0ZrsdSSOuMFjT3tzPG6TphwjxiARfhW2+kjFKOH9fhxdC3KiFzy/J6vdkvLDYiOWrT5SzkSvKNofAW/ZDecTGe2brShJIc+1NN/3Tv+x7vE1Xd9QgwfbgdjmHC74L1zSCFZfWZNbLscn8RxqoL4We8KqaosAFguCJXrLPlO5wYGdv/1Vbg240ZW9wc5PdwfzCNr4iYaUUQcUP4dgGd/lpgDJfIlKS6wT1Hpxjxy1IrGNbC3UvegSrvhfayD/JPctqJaDoOyQChlArh9kg+/xZU+4ZrQ2MPJFUdORqjtbU53telc7RR1jB4NErx6knu9GumW+OAekrMYAw==","page_age":null},{"type":"web_search_result","title":"ggplot2 + R Package Stats, Author, Search and Tutorials | Examples | Downloads | Statistics + | Citations","url":"https://rpkg.net/package/ggplot2","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"ggplot2 + package - RDocumentation","url":"https://www.rdocumentation.org/packages/ggplot2/versions/3.5.2","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"NEWS","url":"https://cran.r-project.org/web/packages/ggplot2/news/news.html","encrypted_content":"Ev4mCioICRgCIiRiZjM2ODdkOC0xYjU5LTQxZWItOTc2MS1hMWZkNzBiMjRlN2USDOp1P7GLCMI4T12kaBoMWUCflOS+hzcClBmkIjB5fztq1m4cBcAnA5fTjM1/OhLotmh7GnR62Q2syDz81JUzticvWovxVZXW8hPAp4sqgSYsEQRRvaceDHXof6IoYOh1WHEBbhZu00mkFGt//o08c//H/Jnv9sclZp5iOnVeXM0QHChFxAnAznCiNpR7r8MJVd+DcvKjUNNkquA2vHuN4E2tT7iRWX1cU8s7IoBMQswHW20q38PuPn3ZFAyTHjPojUGYLI9354STzFo6WIHobaOf/u+ZzPgMppXU8Na7zYi9YVxrxESHRP7NIhwFrQSrKrx+1bPcwYIHNK9nqgMaM8X2jyz25aWy6p7NgWz1PVnjviUHTk4EI/ig0bUf7SBES3FH9W+7AoVw7JijVWoY84UJ2u3mHUlgO8bALj89viv1Ggp7wuXAmy1KZXpoeBKFvJ3EHaZFGPKeJ17wFtmJd8dPSL8UBvcQRwg6WsY27V4EJzNAk50d3hLpzeNYJwWm590e4yCbaaZ0sNKE2xha2HH/T2DrPDk8CcLB5iv01tuAc1mVKxwJd+NokvDIf7QRLLGyUgDbCWry6mRTG8P3j4RvUyUY8M/FMmiM3vXWFUnaReRShNMvJgto5aKx/+hThvX8upWlEAmVwigQ1Q8cffiCpK8fC06k1wc4EUvcYcqS34kkQaOAMUvQUVr4GTnoTX0q0gh+/66tmwNaOOxZfu8dVXLa2v14EbWc7UwD8rvpkGDv+ObQ6CsLDBjZ86+CtYeEFjufCIGjS1oxcf1F60+d16/cZsl/cIWFxHdZjHddsDXe98ltMdus2J3KBRML2MtAahlGcBSlaq5VU423WNzsJaCUVmzaDJ8dox6Xq6rHxD8mjWFbw5yZrYf1HiiLjZE+o3t3HUr921mGlcv+01fud5t+z63V5YWFXn4rMAGq10poSzGhCYwxWP29NiYtuFF8P6Pzx2z6CqDOsAaKCs3iQhhKuLMzksC2JZia9ZBDSxYizzaIht9R0mx+uvFMtchn5lvMXPaXIKc2g2PRAHGRGcdI6oZcTcbOxk8YYY8EacriybNpH05MieBIzwN2UZd7PvrkD+hvrcrzBm1k8BCM3uytH5PJ2OiyzRoI4DuwTKJKOXeuj02gHxkRX4kY/VxvqQ6LZZIDLcCREOfe9N5dk0YAWCkXYpVhmHDh21bXkq1kpQmgzUImle1NoVCDfNAQ/XVhD5LrSaXX/M8MzkFSsTpCwhITP2sxuTPNoeRMkVjU/NCb+zwE2X23ZtkuU/pVPzrqPejl1tCMZLaH1M7JGxOHjHacRtwZ5Q2WPb7MDju/i+UHDaAKURcHt3p59lo7GWbD12i7/sxYGoVWQ+IZYIhWFl5e/Ri1Nchsy5pN4k1YqttWjkD5ocN5rUA0bbha+c3Q3QtVo+RpCBMkevyTJGAY7WF3+7eTDoLhRx9pdOUiZud1nhpK7rMJPxfuHGevHeRYED5ZkuO3B/SRGPPGnAYt6WITtYJ1F0Il7StG9DT2eI9RfWODawuQJMF+EZH7I45yNyfDwztRLqj1F81oVOxRHdyRekz0GmWE8M3CWVgWukMVwpo9vNvkkiyCLqbcgW6NK749Y5Pp5AXke5q07lJRMd0n/eRrABO3v0McovoFHcV4wYh4wx6xqh7QAx1I+r+iW/CFeb7R3dNLXka2H8/Ik8TsW4Hd/xTg3Lw9LRYFQOHAQCHD68F/uI+/WGyKiTPnhOIl+9RYrawD25cbWAFCTx/t3ZuFTea+xsXd5nmPYiRNQKCaLPtzvP+eO61nk6H2x7ZiJ8MXpQi1nWLQof68rU4HWdHyeXMcvruOMcs/nSA5kiDfkKNP3vnKHdvRLPlrrfMYkbVea2lX6gCmpQ7McmQYayAYqbhRsG/2mreEXrV0h/2cbN3eCrYQ0ExIuiIT5KPo9+vNd0v2SRjmkMag8kEFB3Ckt3YuX6Sa5oqji/RUVLB80jtJ0xkjLWERAT0m0z0Gj2b9n3AQRBX4G5cyWwZYUsan7hCehU0GoApyWUguaW6hoJLDMyKp0MQuF+1EZPG7bIXHlig4ycYkWKrnQA0WPw9HErav06ZIOGfbk7udZwMHTiOdb/F6AoqFcGBe2xUHPE/EK9iUbDnjABAVbmGnoVWeBWPWEsqAsy5ldKCy4LHIUv0ecwo7suHLeZLFY234+1OTl25EKzMvxfh1FHVFd50DV/qc+mrSXLCLsT0n8UPTbK+RJDSR4sMnMI5smEDsNWCMBNGbtU27nZXtrBmVfvaEGIGUNUEiAzKxEArrhKSOqaWDnczuW55fziL4oOwUiKkZYVEWnuGj5SMjj5rrlvlyAxVZafXPJUFwT/5gJdQ8VYXIrH4xcideuokn20V/rg7SGe8hCQjlkbCosvwLl+OVDz+3ECbL9+NCJqlgzs9beWFP0AfJFKDznAvRx9SjG4AbUi+pC5j3CwOzPLVUbhhHflJS5SmOojenL7aqizpDuyC4eM8erPzJ6zCWNiGY3YTQ0s49zE5DeO/0c74MBRcauS92xYVeA7VpdQhSP7sbTrU9U76uSzA7UTCXZyfvoi17XOMleSR0eYusQwDGkdXeizToW4eyuIkFWbcADcexIVn7DGgEuvBprVVVau0QsM8r0hZLGld7vzqgJ/NrfbaMerQ3MME7EnbbmYexdLmQnxG117idx2DdZdQhzMjXrNhVig3ag1TXEmzHM+P70Qagvd75rqlBxhNfGwF1WMGEfZaJtbmFYoVbUSTX8f6zo9zK7KaOmQzD5FgPgrn/bLFbUSx2anPavCuorUzGne6lTesFirtdYT6yBXGgNwGNRHltNOMhqzeXX7V1722E92BVC/rPdfeWzUkcB9x3z8qslydYbrPss/qCvS3BsjQqeCuUrWWks0wa1L4J/Dga9SQ6hxCzE+NBy66JsT8zlj9823gj5d/g8TPJxl03gwCHfPTQqaxaOzP80AEGd4Lzq9tNs2BBRTlc1bzdwh+qsA3NvK3BWXpLlFy+aQL+na1MJk4yIGSjWEXxJxrP4NhwfBY6aWV+GnJtWhSND93i1cXbwzk+Of2BSjnaw63gk850FdJdxw0r02ibrlUO8BLaevm0nv7gK2xBwb2qH6hlYOCfbzPKmJkjWyLtMwjxKrfkel0YMbkKWyD2cgng7syK2agDiD0/wHllF7ghB5L37rf7hSVix69UPzHsDc8U0YX91MM/LGKV3lkC2J7/QXeNcan6VCfg7Uv7HGrFLx+0LD2vbLqE4lhsQXlewPhWUeQgqRyqrQtGgZP3DG8SizaUYyvQrxZXUPWNIgRG9phqL7R+V7VCuq3Msc4LGlBxp0B8WVO8Ob475Pod9auZfQOkr+xLt41VIpUtiLoaJnLwok+vTKAttVqkgpHZIhqMW6zDlOH5z/A3oNqTG8SsBF7qoMuLw1dG+hzHoD5OZF1C4W0SwRB09LhcU7kvhUvP0hPOWryn0gqE/Epm926PYbRA5RjSrVvPIbZqIlXOYwcE+WEqH5VCzkG7vcJ3xgGckShu6ZDwf3SXs+kByc7iaHlUNSZiRYUc+5oxMmQPzITMIsZ6GSC+VSXuWOC1GFRkcnxbfRPPu3LwmcixFG6+MJkwUP9Mw1onIkEtC1qRmkrGmP7g5GhsFiXWQsqi9Taen58mMqE1XXCHTvNv6mHKWc+CZOrPcGVKLasLcbccS7BgsRGoUXDFIH2MQU6P0LTs/3ttp6o1bml18NskkEpH9ORqCGj7D7Qione3TawkEZPXZa554/846Ki8wBbytNgYD1RAl9A/Q8FBo+HlErE39QbuxQDffdES2Yj/Tuqjxwol6BPtDm9QAFGvKPgKoWJ+7cBy/2cLfJRq3xuUkKcvawSPOfnugAwxtM51/D+SXAGvW0P9SfkS3R+jx8Nfj6AKLX3u8o2ZeNRiCEToX3tgOuCC7gQVn5X+IdLMZhmvMg/X7QSJ395h2ZddG2+eY9NlpsyuCp31NqzxIGwdknwYY2DxFJ5rCIECAIn86K9ffepLnPe6R7NedlU4TSlWlwgp/eIj2JDVNf5A2tbONB1p4GXBV3JTMBJ/c+yXAL6AZPkQBPMAQUzON1UbWEr4t2rWkRPqpdDxiE93DPkjuppxTk9QF2zBCQvlRjeHBy8WQDtvq+I7BKBu1JpvNXZIgmqLcQ2uYopea3MToAmWLyYZ3jUkrsFqwYC4NHQwS2yswfrEoV0DqOwf1Y619VEBat8pBMviQpq8Wwstp+iD7wqgACb76CPo1i8EeGLjwfj4BlV9gmh/iosEZFQ2XXrCGl3E8TLBYksb7C3RJ4jsevke0w3k//mvYXbJqXkQxjJjdRphfay4RA/KMFKxnf+KdA8BxOUQbHNccsNp3rSKm45Sm4+SMrHnn3vVYHyZHfVmIsb9aybQpsJK54/Sr00JR3NHDtQnMxfGy27oiwPaj2Ucaa/ASlWeac8sDP4FOk1xnrZDsFXWUgyAdnrsXCac2RwfimESc9HZt4d71JnS/MApQjMfYyF6+YeZ93DWRPiPpZfFamKCXDAkmTzBLDyrsHkYnnnqspkHcPGaaXM3T6Qw/jS1tuO4kAhdeQoKvh3RhBtBu6kYI8hUbxZLKRa+ICgmD+LxbhYFadBm/FQf/EZZbPnbiYsIcynalYfgOaI7PEFtFGfnRMK3uLB7limGSXguO5gTPV+4l4m/mXY7vKJ2KscWulvPuV/2XG0luVtQvsoZSiuhvg5JQJI1MUIeXLxjQRbpMzyxcoXOZRFa/h0INIsKgOCYaR01cLWIpauZlWQPLbIADun1Q2zuI+4hxZ98LFbv6ExXFvooDAQhLz1XzVJJpKzF57jhcDycCuqi1rYp2Mzr0+dKxBHTslNxfmKvc1Y+YHFIxdSG2a9U78drI32YyInVXQ1x8Hs2TPt01a+mKoVtOrFu+dMQ9Pr/KAtzG+bjsJydUn6/Do8zaZw9U7U4CKLeEd+JZi28FKAZK35GIVwJK3QJqp6ZsI1WuXHd+5Lxr3b/98P9ahZJy3uGyTRNwfAazydLDzgJG2irW1hLDz7eFyUer6fVzpw+OpNOh64RetWrV5RjMt6a41zXVV6Eo0QncLe3fnDZhyeWPK8fJmrP3jRH0RYExtpQGdxAoGbEE0lQKxw3BTl7XgO/uTl7H2UUS1kKdJAdOdf6RF3yGiWj6sVAfGU7WhcPaFzIeHL4OFpoFjf4M0tqmrPoPY9LKCDgZ2Xlf+xZnCZRR0wZ1VgNcGZD39f55/vjI1AOcjkjNVCfoCE1UlcLhpOrPkPFO5JCYY9WUCCZVelkdEF2f+OPbiKh4TpXCle7O1WpC7V95cLi6U+XVtRlATEDEUAdHWV3bKqVeyPMqIHursVBSSTETrJjUgNtf5V+ujLMAM7+k9CzuF9Bbd7SmdDJ+9v/NnupBfUoJhRkQyS4UdgaavoCJIY+fdTQOmiCL/uvcVDva2pEwqNwtmUSG2BARJhLkEEeZUKJpQ3gKhPakWQ8GzeGeyazTvMsi68cqMws9pq2uscsEuULUR/viBQaC/ZvZG0zEs6sEI//mCysnbKGlpu8ewOb3ruZcOC51PjSoWUgYxdHZjmz+F9mmaRw6i5rt9YrTNIFeme76RkJlzY3n6IPztpidt1B+PSuNPy9+JVz4uCOcbLFyBbH9oTuVj+MrncdEn8TY/tGL3cMeWuM0pGDEkRnMaK1dzPsU0H7CCtvLQkX1iKhDUTcqtsz2K73TvJeUX31f2wAwDeHpIEwlOvU7h6cRppPhRFk37EK2uDSofhQYJFf40OSnI/bwA7EJ8PHB5WCx8A7Rqg+n4z9pIsWFHRQwjh83zR84JCh3rOejbiyx+SffddEseFSfhbY04zGTD8zPiyKUnu2X7Rcy26eZBg1Fj4uhSvwLdUg5hHqrgat76wwlKkWhE/+rO0cXlrASSzZSr0C5jp7+nZxnUrpELOs+8m73s+IZcOCFwzK7QwD1871WlYpQAqnlTErE8S/nsTEZ2DcVnulrMNpOeKrFM1Q4BIVfQqR4gcGC2CYunmqdQCqh4LTHnxQMtRz3MoC3JE81pUr5hQ50K9zjRMWSkOwUMhwSANOt2+LLtfe/CJuK5/4PFKRApDdDkb4OciES0tgMGc0HqNxc5DKzzN/7eyjSOrmqF+e3bhstJKLpe3lgH5bZTPEatrphm17RFmKufbuO5zXzE2BkLKwIiceK7GzoIzIsvJlg0rG6mA7P+XL0CC/6X4xMB//V4F3jsBmUdx81Q/hGjhmJPFnzKZuDxIafqA5/h+dBRLXWpxUSkAqiqdXeT0GY5zQsLP6IShVLrfAxyDgFvNt/rW7hQJ8LOg2MpbCd0FaUj3BKT/SSaZOMnX8tsqSboINKH+PnmiL7yxD4Bwlr+h6vb5YB1FKKqp6LR9pAONnZKAnCxAN724g1dVI8NoYjBH45yljy0y5tGe1NM/f+Z0zqI85VcXnAJE+r96QTIX1rU9KXzQPDomD5+8zFe3CGZ2HLJxNlab0Zhnn2RAKcE1sAIiH4DgS7NvSmvOZ/QXJkPILjDIoXQfPa9nZWgJrvhkpql5rjCRfCCv+dFQ1vRx5joX2sOfHZjc37jjS+hgD","page_age":null}]},{"type":"text","text":"I + found information about ggplot2 1.0.0 in the search results. According to + the data, "},{"type":"text","text":"ggplot2 version 1.0.0 was released on + 2014-05-21 15:36"},{"type":"text","text":".\n\n**2014-05-21**"}]},{"role":"user","content":[{"type":"text","text":"What + month was that?","cache_control":{"type":"ephemeral","ttl":"5m"}}]}],"stream":false,"tools":[{"name":"web_search","type":"web_search_20250305"}],"temperature":0,"max_tokens":4096}' + response: + status: 200 + headers: + date: Fri, 07 Nov 2025 16:59:05 GMT + content-type: application/json + content-encoding: gzip + anthropic-ratelimit-input-tokens-limit: '2000000' + anthropic-ratelimit-input-tokens-remaining: '2000000' + anthropic-ratelimit-input-tokens-reset: '2025-11-07T16:59:04Z' + anthropic-ratelimit-output-tokens-limit: '400000' + anthropic-ratelimit-output-tokens-remaining: '400000' + anthropic-ratelimit-output-tokens-reset: '2025-11-07T16:59:05Z' + anthropic-ratelimit-requests-limit: '4000' + anthropic-ratelimit-requests-remaining: '3999' + anthropic-ratelimit-requests-reset: '2025-11-07T16:59:02Z' + retry-after: '61' + anthropic-ratelimit-tokens-limit: '2400000' + anthropic-ratelimit-tokens-remaining: '2400000' + anthropic-ratelimit-tokens-reset: '2025-11-07T16:59:04Z' + request-id: req_011CUttGrPrPr3CmdgCrvcmZ + strict-transport-security: max-age=31536000; includeSubDomains; preload + anthropic-organization-id: bf3687d8-1b59-41eb-9761-a1fd70b24e7e + x-envoy-upstream-service-time: '3053' + cf-cache-status: DYNAMIC + x-robots-tag: none + server: cloudflare + cf-ray: 99ae60fbaa79ead9-DFW + body: + string: '{"model":"claude-sonnet-4-5-20250929","id":"msg_01Ds9ByCdpq8qdanpq2A7ERM","type":"message","role":"assistant","content":[{"type":"text","text":"That + was **May** 2014."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":77,"cache_read_input_tokens":19569,"cache_creation":{"ephemeral_5m_input_tokens":77,"ephemeral_1h_input_tokens":0},"output_tokens":12,"service_tier":"standard"}}' + recorded_at: 2025-11-07 16:59:05 +- request: + method: POST + uri: https://api.anthropic.com/v1/messages + body: + string: '{"model":"claude-sonnet-4-5-20250929","messages":[{"role":"user","content":[{"type":"text","text":"When + was ggplot2 1.0.0 released to CRAN?\n\nAnswer in YYYY-MM-DD format."}]},{"role":"assistant","content":[{"type":"server_tool_use","id":"srvtoolu_01GAHpBrEa6jAjMYsJGetGcD","name":"web_search","input":{"query":"ggplot2 + 1.0.0 CRAN release date"}},{"type":"web_search_tool_result","tool_use_id":"srvtoolu_01GAHpBrEa6jAjMYsJGetGcD","content":[{"type":"web_search_result","title":"Changelog + • ggplot2","url":"https://ggplot2.tidyverse.org/news/index.html","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"CRAN: + Package ggplot2","url":"https://cran.r-project.org/package=ggplot2","encrypted_content":"Eq8GCioICRgCIiRiZjM2ODdkOC0xYjU5LTQxZWItOTc2MS1hMWZkNzBiMjRlN2USDDrhAthIu+gs6lY0cxoMzE6+zZ3OTPtQdAZjIjBbolG6mBb+zwWt+NS9n78nIfcEiDilL+jPCD9hcKy7iZR8GJL0MljFR6au69LdWQwqsgXp8JP/13M9J17bNy/hzho6YjOpUuuFIOHWbYQrOgdGpBl8wdflbxGeavXx/RAiDwVzqOPFGn1MOGOA1qIZIHxWHVAdH4CIXwEEGBBcZCggjr1jIKfsfQQJBab95/OgaVr6BDsSzjrAxfF8WJKXVw6zoQln8aOC72HGt01l0Dj3w2s7O6B5fvrLZPyMZd4+8VeZo5nO9zjIgnKeiuHxqpr24Eoe9A4Tbe+hT1CFzlYXUsL/aEkMEhhkW43n5aYlWyKQ8ObgRA0+FfayluVgPw3903zvizlyxvg7jNEc/xWI5+21ocgoEEI6BlLF03wW0Hg1sS9IS99iL0vlMbxiicMHfdqGyUyLVD2mLIs0eBW0d5oLRQFqic/Bw7pf60wLpCyLWF8sg3PbPPWECfc7ILN+ImRe3TxbHyxtTiN8DVQzWO7eMJyEiCX4MssvTLvDHYhYie2AMfn0upoEhRqlgWTE2b08azgXqLuXNzSi1MhHeHQ/wb6oVQZUo41bOqb6j+XERXdilsYhSAv3aR2hG+dYqYrogWuKZdwGorrhhDRtJSNrRHI97W1aZkBrTIt86olG1ia4naxatlA1scvmwT4O+4NZ+kEkOhYpeYIJWn7ZXMOLm7qyKD5fLOv3xc/sfInpp2s/p1ZpTfhEXN9Z4pfp8ENkMuJcE1klojCW3RjhwzxhdVDh5QedwEEnXQfWDQntuZquPQKli0pu0IvmSaIZqQdYaKrov4AuzLCMafnu+7WoSqhOvc8uoSc5yYYILP+9qVvc9ie/9ZnPlUtrnNDxHKBPnruR4Ft4SPMWCTlLh2SPK1UfRTnP9dDulQ4MVxhIIp9KXG9+CCpIiyDJ+kJL+BJX6Vv7d2Bc5VgpkvmaJS3YUSijNUyu+ykKJatCcvNrA8PMOSuesn/JTeePxscT+TIYAw==","page_age":"September + 11, 2025"},{"type":"web_search_result","title":"Releases · tidyverse/ggplot2","url":"https://github.com/tidyverse/ggplot2/releases","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"ggplot2 + - Wikipedia","url":"https://en.wikipedia.org/wiki/Ggplot2","encrypted_content":"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","page_age":"4 + weeks ago"},{"type":"web_search_result","title":"Package ''ggplot2''","url":"https://cran.r-project.org/web/packages/ggplot2/ggplot2.pdf","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"Releases + · cran/ggplot2","url":"https://github.com/cran/ggplot2/releases","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"New + version of ggplot2, new problems · Issue #255 · pbiecek/archivist","url":"https://github.com/pbiecek/archivist/issues/255","encrypted_content":"Ev4KCioICRgCIiRiZjM2ODdkOC0xYjU5LTQxZWItOTc2MS1hMWZkNzBiMjRlN2USDGXrhLtVeJsot02xcxoMgBdX6NeGeDNE3GGtIjDDkOsI6t+L4tfE/RnJ8A2KPEjuKeLErMbzXLiwN3/JqtEmxR+/lMmnqMbyiviFrsgqgQqvlwMvpxBSxmB4ymGEj2UFRKwtyWEmY3jstsWcx2zCGZTHe+pEu4cTBNIcSQTh6h+1rCUQnNp6wRYrPItIsaxVdjc96lgVPtaPXBXDvImx9p0dEIz+/4ONHEaphhR+M10KgZdqu44fD+xOWlLuRoJMnL9YliR07JGWYH0Ur6ymYZNUW3ejbe44e+FAhKe/52aptlfbJiQI+m3m3/v6V59WS8uV6f1JeIQg12Q6TRmAFVorFjQ1bsBLRGi5VikibbcIOyucBAuQAuqCfgSmezvjlXWVgoZZdKaT2FPbnqpYnb5t+Fxxql74H1PrPeODy2aEmVnYnOQzfMQLGAg0+1MfW5gI4YV8v4q8LMpfb9Jp3F4KgpMP0mBxCo8Jz8sZgDd7K+n7AKNfg0DqejIw3nMaq5tgP7+LgkdV61IPqM3qQDzZUVJ+tz4UOZdkrNsjMOAiArAMt8sLiavd9vhz4sBRKOwIhZnkGf1NS8T7vyO9UOZUE/uoecOxqiUxa4Wy2PZrgiaU72DXc+JsKOX8u984FT4g3QcN3AzIdEUJ5iLzxVFsu/ymTdXZzKZ1z75aJFJPAB1CD2fVSsE6qnA1LrhXP/qnRWwJd9edODWoh0sSj6sFnH9Z3BWV7Fc+5bSSPrXnn3pvxKiqjaLxugRLiq4M6Fk2SidB6X4cL6ObTyImJTiYv4UIyuut5FUxoy9+q+g8RsF6LkAab4BTAjUGluH6+rX3vjDp3rAmr59MDBqpxW2zUdjPUM23n0gdO+9mv8PYA7vhRFGqipy3ZbjCDop1rKYV0XM4xS+zULvz/fAClSQi3YbRhCjwQPpahvHTy2FNHRqWumwg70o2JtlrxxA3MAQ3w9VK1f+KAIAc8qPXcIruKewblhAGGgevx7Qn9xb/sH9k70RK3lHwpKpv4PEOjnHRigW6+wMCm8HJmbmbhbnLvS4wm4RRcPxTthGWTdbY9c8RHw7c1xxwdCOK+IHblQxAUekrJDTD5r8mE8eSmZUejbWxcM2r+QQMb4lqvR7nY6g3X6+8yQ8VEwUVFBVfayYgPDUzvj6xqZgnV6E42McTLI9zmueSzu58mocLUMe2h6oSy5g0GGmAd8cUBHPNWmPiP0J8zRuL3WEqqXiLm2Pnxzt/KnQkoImGaZfrFut93mVEgB9+cVZ69houbnoQcxS/cwa1d9Q5vzXcpybzPIqQlSCp7PWGQX+QS52ouyLP7SM72r3tLTRqWbuRjSejCQBoiAyr63Ws74LVwyUCwhHyYFbbeGqMBuOft7fi7WNsFpk2HcON6EsLtom8Fc87ROJI6AoZUnJtwfJ/JYYqW1LZ0peLJsGACLCXhc/3BNMJVDb7oh/Tsgv+DBtQgBXmsGZ732UFqkfw/0ZrsdSSOuMFjT3tzPG6TphwjxiARfhW2+kjFKOH9fhxdC3KiFzy/J6vdkvLDYiOWrT5SzkSvKNofAW/ZDecTGe2brShJIc+1NN/3Tv+x7vE1Xd9QgwfbgdjmHC74L1zSCFZfWZNbLscn8RxqoL4We8KqaosAFguCJXrLPlO5wYGdv/1Vbg240ZW9wc5PdwfzCNr4iYaUUQcUP4dgGd/lpgDJfIlKS6wT1Hpxjxy1IrGNbC3UvegSrvhfayD/JPctqJaDoOyQChlArh9kg+/xZU+4ZrQ2MPJFUdORqjtbU53telc7RR1jB4NErx6knu9GumW+OAekrMYAw==","page_age":null},{"type":"web_search_result","title":"ggplot2 + R Package Stats, Author, Search and Tutorials | Examples | Downloads | Statistics + | Citations","url":"https://rpkg.net/package/ggplot2","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"ggplot2 + package - RDocumentation","url":"https://www.rdocumentation.org/packages/ggplot2/versions/3.5.2","encrypted_content":"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","page_age":null},{"type":"web_search_result","title":"NEWS","url":"https://cran.r-project.org/web/packages/ggplot2/news/news.html","encrypted_content":"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","page_age":null}]},{"type":"text","text":"I + found information about ggplot2 1.0.0 in the search results. According to + the data, "},{"type":"text","text":"ggplot2 version 1.0.0 was released on + 2014-05-21 15:36"},{"type":"text","text":".\n\n**2014-05-21**"}]},{"role":"user","content":[{"type":"text","text":"What + month was that?"}]},{"role":"assistant","content":[{"type":"text","text":"That + was **May** 2014."}]},{"role":"user","content":[{"type":"text","text":"What + month was that?","cache_control":{"type":"ephemeral","ttl":"5m"}}]}],"stream":false,"tools":[{"name":"web_search","type":"web_search_20250305"}],"temperature":0,"max_tokens":4096}' + response: + status: 200 + headers: + date: Fri, 07 Nov 2025 16:59:09 GMT + content-type: application/json + content-encoding: gzip + anthropic-ratelimit-input-tokens-limit: '2000000' + anthropic-ratelimit-input-tokens-remaining: '2000000' + anthropic-ratelimit-input-tokens-reset: '2025-11-07T16:59:08Z' + anthropic-ratelimit-output-tokens-limit: '400000' + anthropic-ratelimit-output-tokens-remaining: '400000' + anthropic-ratelimit-output-tokens-reset: '2025-11-07T16:59:09Z' + anthropic-ratelimit-requests-limit: '4000' + anthropic-ratelimit-requests-remaining: '3999' + anthropic-ratelimit-requests-reset: '2025-11-07T16:59:05Z' + retry-after: '52' + anthropic-ratelimit-tokens-limit: '2400000' + anthropic-ratelimit-tokens-remaining: '2400000' + anthropic-ratelimit-tokens-reset: '2025-11-07T16:59:08Z' + request-id: req_011CUttH6atKiW5bNYmUxWiD + strict-transport-security: max-age=31536000; includeSubDomains; preload + anthropic-organization-id: bf3687d8-1b59-41eb-9761-a1fd70b24e7e + x-envoy-upstream-service-time: '3386' + cf-cache-status: DYNAMIC + x-robots-tag: none + server: cloudflare + cf-ray: 99ae61105c13ead9-DFW + body: + string: '{"model":"claude-sonnet-4-5-20250929","id":"msg_01FJPHSeg3t7dsaCqxGYC9om","type":"message","role":"assistant","content":[{"type":"text","text":"May + is the **5th month** of the year."}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":20,"cache_read_input_tokens":19646,"cache_creation":{"ephemeral_5m_input_tokens":20,"ephemeral_1h_input_tokens":0},"output_tokens":15,"service_tier":"standard"}}' + recorded_at: 2025-11-07 16:59:09 +recorded_with: VCR-vcr/2.0.0 diff --git a/tests/testthat/_vcr/google-web-fetch.yml b/tests/testthat/_vcr/google-web-fetch.yml index 1c2c4ecc..5c7ec1ff 100644 --- a/tests/testthat/_vcr/google-web-fetch.yml +++ b/tests/testthat/_vcr/google-web-fetch.yml @@ -10,11 +10,11 @@ http_interactions: headers: alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 content-encoding: gzip - content-length: '608' + content-length: '598' content-type: application/json; charset=UTF-8 - date: Fri, 07 Nov 2025 15:04:58 GMT + date: Fri, 07 Nov 2025 16:57:45 GMT server: scaffolding on HTTPServer2 - server-timing: gfet4t7; dur=1279 + server-timing: gfet4t7; dur=1587 vary: - Origin - X-Origin @@ -49,7 +49,8 @@ http_interactions: "groundingSupports": [ { "segment": { - "endIndex": 100, + "startIndex": 1, + "endIndex": 101, "text": "The first movie listed on https://rvest.tidyverse.org/articles/starwars.html is \"The Phantom Menace\"" }, "groundingChunkIndices": [ @@ -71,31 +72,317 @@ http_interactions: "usageMetadata": { "promptTokenCount": 25, "candidatesTokenCount": 49, - "totalTokenCount": 1250, - "cachedContentTokenCount": 13, + "totalTokenCount": 1296, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 25 } ], - "cacheTokensDetails": [ + "toolUsePromptTokenCount": 1133, + "toolUsePromptTokensDetails": [ { "modality": "TEXT", - "tokenCount": 13 + "tokenCount": 1133 } ], - "toolUsePromptTokenCount": 1133, + "thoughtsTokenCount": 89 + }, + "modelVersion": "gemini-2.5-flash", + "responseId": "CSUOacmVHrTgz7IP_uaQwQw" + } + recorded_at: 2025-11-07 16:57:45 +- request: + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent + body: + string: '{"contents":[{"role":"user","parts":[{"text":"What''s the first movie + listed on https://rvest.tidyverse.org/articles/starwars.html?"}]},{"role":"model","parts":[{"text":"The + first movie listed on https://rvest.tidyverse.org/articles/starwars.html is + \"The Phantom Menace\"."}]},{"role":"user","parts":[{"text":"What''s the first + movie listed on https://rvest.tidyverse.org/articles/starwars.html?"}]}],"tools":{"url_context":{}},"systemInstruction":{"parts":{"text":""}},"generationConfig":{"temperature":0,"seed":1014}}' + response: + status: 200 + headers: + alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content-encoding: gzip + content-length: '592' + content-type: application/json; charset=UTF-8 + date: Fri, 07 Nov 2025 16:57:47 GMT + server: scaffolding on HTTPServer2 + server-timing: gfet4t7; dur=1540 + vary: + - Origin + - X-Origin + - Referer + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-xss-protection: '0' + body: + string: | + { + "candidates": [ + { + "content": { + "parts": [ + { + "text": "The first movie listed on https://rvest.tidyverse.org/articles/starwars.html is \"The Phantom Menace\"." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0, + "groundingMetadata": { + "groundingChunks": [ + { + "web": { + "uri": "https://rvest.tidyverse.org/articles/starwars.html", + "title": "Star Wars films (static HTML) • rvest" + } + } + ], + "groundingSupports": [ + { + "segment": { + "endIndex": 100, + "text": "The first movie listed on https://rvest.tidyverse.org/articles/starwars.html is \"The Phantom Menace\"" + }, + "groundingChunkIndices": [ + 0 + ] + } + ] + }, + "urlContextMetadata": { + "urlMetadata": [ + { + "retrievedUrl": "https://rvest.tidyverse.org/articles/starwars.html", + "urlRetrievalStatus": "URL_RETRIEVAL_STATUS_SUCCESS" + } + ] + } + } + ], + "usageMetadata": { + "promptTokenCount": 78, + "candidatesTokenCount": 49, + "totalTokenCount": 1350, + "promptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 78 + } + ], + "toolUsePromptTokenCount": 1183, "toolUsePromptTokensDetails": [ { "modality": "TEXT", - "tokenCount": 1133 + "tokenCount": 1183 + } + ], + "thoughtsTokenCount": 40 + }, + "modelVersion": "gemini-2.5-flash", + "responseId": "CyUOafP3CZGIz7IPk-yeSQ" + } + recorded_at: 2025-11-07 16:57:47 +- request: + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent + body: + string: '{"contents":[{"role":"user","parts":[{"text":"What''s the first movie + listed on https://rvest.tidyverse.org/articles/starwars.html?"}]},{"role":"model","parts":[{"text":"The + first movie listed on https://rvest.tidyverse.org/articles/starwars.html is + \"The Phantom Menace\"."}]},{"role":"user","parts":[{"text":"What''s the first + movie listed on https://rvest.tidyverse.org/articles/starwars.html?"}]},{"role":"model","parts":[{"text":"The + first movie listed on https://rvest.tidyverse.org/articles/starwars.html is + \"The Phantom Menace\"."}]},{"role":"user","parts":[{"text":"Who directed + it?"}]}],"tools":{"url_context":{}},"systemInstruction":{"parts":{"text":""}},"generationConfig":{"temperature":0,"seed":1014}}' + response: + status: 200 + headers: + alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content-encoding: gzip + content-length: '584' + content-type: application/json; charset=UTF-8 + date: Fri, 07 Nov 2025 16:57:48 GMT + server: scaffolding on HTTPServer2 + server-timing: gfet4t7; dur=1122 + vary: + - Origin + - X-Origin + - Referer + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-xss-protection: '0' + body: + string: | + { + "candidates": [ + { + "content": { + "parts": [ + { + "text": "George Lucas directed \"The Phantom Menace\"." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0, + "groundingMetadata": { + "groundingChunks": [ + { + "web": { + "uri": "https://rvest.tidyverse.org/articles/starwars.html", + "title": "Star Wars films (static HTML) • rvest" + } + } + ], + "groundingSupports": [ + { + "segment": { + "endIndex": 42, + "text": "George Lucas directed \"The Phantom Menace\"" + }, + "groundingChunkIndices": [ + 0 + ] + } + ] + }, + "urlContextMetadata": { + "urlMetadata": [ + { + "retrievedUrl": "https://rvest.tidyverse.org/articles/starwars.html", + "urlRetrievalStatus": "URL_RETRIEVAL_STATUS_SUCCESS" + } + ] + } + } + ], + "usageMetadata": { + "promptTokenCount": 111, + "candidatesTokenCount": 31, + "totalTokenCount": 1390, + "promptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 111 + } + ], + "toolUsePromptTokenCount": 1212, + "toolUsePromptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 1212 + } + ], + "thoughtsTokenCount": 36 + }, + "modelVersion": "gemini-2.5-flash", + "responseId": "DCUOafeQGdmfz7IP6fWrkQ8" + } + recorded_at: 2025-11-07 16:57:48 +- request: + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent + body: + string: '{"contents":[{"role":"user","parts":[{"text":"What''s the first movie + listed on https://rvest.tidyverse.org/articles/starwars.html?"}]},{"role":"model","parts":[{"text":"The + first movie listed on https://rvest.tidyverse.org/articles/starwars.html is + \"The Phantom Menace\"."}]},{"role":"user","parts":[{"text":"What''s the first + movie listed on https://rvest.tidyverse.org/articles/starwars.html?"}]},{"role":"model","parts":[{"text":"The + first movie listed on https://rvest.tidyverse.org/articles/starwars.html is + \"The Phantom Menace\"."}]},{"role":"user","parts":[{"text":"Who directed + it?"}]},{"role":"model","parts":[{"text":"George Lucas directed \"The Phantom + Menace\"."}]},{"role":"user","parts":[{"text":"Who directed it?"}]}],"tools":{"url_context":{}},"systemInstruction":{"parts":{"text":""}},"generationConfig":{"temperature":0,"seed":1014}}' + response: + status: 200 + headers: + alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content-encoding: gzip + content-length: '591' + content-type: application/json; charset=UTF-8 + date: Fri, 07 Nov 2025 16:57:51 GMT + server: scaffolding on HTTPServer2 + server-timing: gfet4t7; dur=2633 + vary: + - Origin + - X-Origin + - Referer + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-xss-protection: '0' + body: + string: | + { + "candidates": [ + { + "content": { + "parts": [ + { + "text": "George Lucas directed \"The Phantom Menace\"." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0, + "groundingMetadata": { + "groundingChunks": [ + { + "web": { + "uri": "https://rvest.tidyverse.org/articles/starwars.html", + "title": "Star Wars films (static HTML) • rvest" + } + } + ], + "groundingSupports": [ + { + "segment": { + "startIndex": 1, + "endIndex": 43, + "text": "George Lucas directed \"The Phantom Menace\"" + }, + "groundingChunkIndices": [ + 0 + ] + } + ] + }, + "urlContextMetadata": { + "urlMetadata": [ + { + "retrievedUrl": "https://rvest.tidyverse.org/articles/starwars.html", + "urlRetrievalStatus": "URL_RETRIEVAL_STATUS_SUCCESS" + } + ] + } + } + ], + "usageMetadata": { + "promptTokenCount": 126, + "candidatesTokenCount": 31, + "totalTokenCount": 1428, + "promptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 126 + } + ], + "toolUsePromptTokenCount": 1221, + "toolUsePromptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 1221 } ], - "thoughtsTokenCount": 43 + "thoughtsTokenCount": 50 }, "modelVersion": "gemini-2.5-flash", - "responseId": "mgoOaemwMMCdqtsPuKTr8Ac" + "responseId": "DyUOaaSoCuzPz7IP-JqVGA" } - recorded_at: 2025-11-07 15:04:58 + recorded_at: 2025-11-07 16:57:51 recorded_with: VCR-vcr/2.0.0 diff --git a/tests/testthat/_vcr/google-web-search.yml b/tests/testthat/_vcr/google-web-search.yml new file mode 100644 index 00000000..a0bc52dd --- /dev/null +++ b/tests/testthat/_vcr/google-web-search.yml @@ -0,0 +1,212 @@ +http_interactions: +- request: + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent + body: + string: '{"contents":[{"role":"user","parts":[{"text":"When was ggplot2 1.0.0 + released to CRAN?\n\nAnswer in YYYY-MM-DD format."}]}],"tools":{"google_search":{}},"systemInstruction":{"parts":{"text":""}},"generationConfig":{"temperature":0,"seed":1014}}' + response: + status: 200 + headers: + alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content-encoding: gzip + content-length: '2564' + content-type: application/json; charset=UTF-8 + date: Fri, 07 Nov 2025 16:59:13 GMT + server: scaffolding on HTTPServer2 + server-timing: gfet4t7; dur=2558 + vary: + - Origin + - X-Origin + - Referer + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-xss-protection: '0' + body: + string: | + { + "candidates": [ + { + "content": { + "parts": [ + { + "text": "ggplot2 version 1.0.0 was released to CRAN on 2014-05-21." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0, + "groundingMetadata": { + "searchEntryPoint": { + "renderedContent": "\u003cstyle\u003e\n.container {\n align-items: center;\n border-radius: 8px;\n display: flex;\n font-family: Google Sans, Roboto, sans-serif;\n font-size: 14px;\n line-height: 20px;\n padding: 8px 12px;\n}\n.chip {\n display: inline-block;\n border: solid 1px;\n border-radius: 16px;\n min-width: 14px;\n padding: 5px 16px;\n text-align: center;\n user-select: none;\n margin: 0 8px;\n -webkit-tap-highlight-color: transparent;\n}\n.carousel {\n overflow: auto;\n scrollbar-width: none;\n white-space: nowrap;\n margin-right: -12px;\n}\n.headline {\n display: flex;\n margin-right: 4px;\n}\n.gradient-container {\n position: relative;\n}\n.gradient {\n position: absolute;\n transform: translate(3px, -9px);\n height: 36px;\n width: 9px;\n}\n@media (prefers-color-scheme: light) {\n .container {\n background-color: #fafafa;\n box-shadow: 0 0 0 1px #0000000f;\n }\n .headline-label {\n color: #1f1f1f;\n }\n .chip {\n background-color: #ffffff;\n border-color: #d2d2d2;\n color: #5e5e5e;\n text-decoration: none;\n }\n .chip:hover {\n background-color: #f2f2f2;\n }\n .chip:focus {\n background-color: #f2f2f2;\n }\n .chip:active {\n background-color: #d8d8d8;\n border-color: #b6b6b6;\n }\n .logo-dark {\n display: none;\n }\n .gradient {\n background: linear-gradient(90deg, #fafafa 15%, #fafafa00 100%);\n }\n}\n@media (prefers-color-scheme: dark) {\n .container {\n background-color: #1f1f1f;\n box-shadow: 0 0 0 1px #ffffff26;\n }\n .headline-label {\n color: #fff;\n }\n .chip {\n background-color: #2c2c2c;\n border-color: #3c4043;\n color: #fff;\n text-decoration: none;\n }\n .chip:hover {\n background-color: #353536;\n }\n .chip:focus {\n background-color: #353536;\n }\n .chip:active {\n background-color: #464849;\n border-color: #53575b;\n }\n .logo-light {\n display: none;\n }\n .gradient {\n background: linear-gradient(90deg, #1f1f1f 15%, #1f1f1f00 100%);\n }\n}\n\u003c/style\u003e\n\u003cdiv class=\"container\"\u003e\n \u003cdiv class=\"headline\"\u003e\n \u003csvg class=\"logo-light\" width=\"18\" height=\"18\" viewBox=\"9 9 35 35\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\n \u003cpath fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M42.8622 27.0064C42.8622 25.7839 42.7525 24.6084 42.5487 23.4799H26.3109V30.1568H35.5897C35.1821 32.3041 33.9596 34.1222 32.1258 35.3448V39.6864H37.7213C40.9814 36.677 42.8622 32.2571 42.8622 27.0064V27.0064Z\" fill=\"#4285F4\"/\u003e\n \u003cpath fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M26.3109 43.8555C30.9659 43.8555 34.8687 42.3195 37.7213 39.6863L32.1258 35.3447C30.5898 36.3792 28.6306 37.0061 26.3109 37.0061C21.8282 37.0061 18.0195 33.9811 16.6559 29.906H10.9194V34.3573C13.7563 39.9841 19.5712 43.8555 26.3109 43.8555V43.8555Z\" fill=\"#34A853\"/\u003e\n \u003cpath fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M16.6559 29.8904C16.3111 28.8559 16.1074 27.7588 16.1074 26.6146C16.1074 25.4704 16.3111 24.3733 16.6559 23.3388V18.8875H10.9194C9.74388 21.2072 9.06992 23.8247 9.06992 26.6146C9.06992 29.4045 9.74388 32.022 10.9194 34.3417L15.3864 30.8621L16.6559 29.8904V29.8904Z\" fill=\"#FBBC05\"/\u003e\n \u003cpath fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M26.3109 16.2386C28.85 16.2386 31.107 17.1164 32.9095 18.8091L37.8466 13.8719C34.853 11.082 30.9659 9.3736 26.3109 9.3736C19.5712 9.3736 13.7563 13.245 10.9194 18.8875L16.6559 23.3388C18.0195 19.2636 21.8282 16.2386 26.3109 16.2386V16.2386Z\" fill=\"#EA4335\"/\u003e\n \u003c/svg\u003e\n \u003csvg class=\"logo-dark\" width=\"18\" height=\"18\" viewBox=\"0 0 48 48\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\n \u003ccircle cx=\"24\" cy=\"23\" fill=\"#FFF\" r=\"22\"/\u003e\n \u003cpath d=\"M33.76 34.26c2.75-2.56 4.49-6.37 4.49-11.26 0-.89-.08-1.84-.29-3H24.01v5.99h8.03c-.4 2.02-1.5 3.56-3.07 4.56v.75l3.91 2.97h.88z\" fill=\"#4285F4\"/\u003e\n \u003cpath d=\"M15.58 25.77A8.845 8.845 0 0 0 24 31.86c1.92 0 3.62-.46 4.97-1.31l4.79 3.71C31.14 36.7 27.65 38 24 38c-5.93 0-11.01-3.4-13.45-8.36l.17-1.01 4.06-2.85h.8z\" fill=\"#34A853\"/\u003e\n \u003cpath d=\"M15.59 20.21a8.864 8.864 0 0 0 0 5.58l-5.03 3.86c-.98-2-1.53-4.25-1.53-6.64 0-2.39.55-4.64 1.53-6.64l1-.22 3.81 2.98.22 1.08z\" fill=\"#FBBC05\"/\u003e\n \u003cpath d=\"M24 14.14c2.11 0 4.02.75 5.52 1.98l4.36-4.36C31.22 9.43 27.81 8 24 8c-5.93 0-11.01 3.4-13.45 8.36l5.03 3.85A8.86 8.86 0 0 1 24 14.14z\" fill=\"#EA4335\"/\u003e\n \u003c/svg\u003e\n \u003cdiv class=\"gradient-container\"\u003e\u003cdiv class=\"gradient\"\u003e\u003c/div\u003e\u003c/div\u003e\n \u003c/div\u003e\n \u003cdiv class=\"carousel\"\u003e\n \u003ca class=\"chip\" href=\"https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHEbxuMBZkYd6vMNiVFpyk-0eS07dCRhIzO-Gk8irtxRMxCEibZyakMzDMmA4EWiMR9GKihKfT7lnAQKMIJK9WECY6gjhTEkulyZChpQ94OyIMelveXA5hGLo5mXQertKaqQNFM-LKGBEmiveg9han8cKynxZ2IN3k0FYksvI5UXA7uDdykKPsxwiY4hbPg-VpWJJWCzKcoY8-PgjCtuoj-hA==\"\u003eggplot2 1.0.0 CRAN release date\u003c/a\u003e\n \u003c/div\u003e\n\u003c/div\u003e\n" + }, + "groundingChunks": [ + { + "web": { + "uri": "https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFDtLIOMdNsroh8w5awCpIGefapgZyLHKlpqVeueT6rc5RepGK57BlbQVb6fR0eAXdo56prxYv6oy50o5lP2KR1IYhVWy06-Vmv4jaegigzDs-px8wAcLmLFk8=", + "title": "rpkg.net" + } + } + ], + "groundingSupports": [ + { + "segment": { + "startIndex": 20, + "endIndex": 57, + "text": "0 was released to CRAN on 2014-05-21." + }, + "groundingChunkIndices": [ + 0 + ] + } + ], + "webSearchQueries": [ + "ggplot2 1.0.0 CRAN release date" + ] + } + } + ], + "usageMetadata": { + "promptTokenCount": 28, + "candidatesTokenCount": 50, + "totalTokenCount": 352, + "promptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 28 + } + ], + "toolUsePromptTokenCount": 97, + "toolUsePromptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 97 + } + ], + "thoughtsTokenCount": 177 + }, + "modelVersion": "gemini-2.5-flash", + "responseId": "YSUOac3SFpGIz7IPk-yeSQ" + } + recorded_at: 2025-11-07 16:59:13 +- request: + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent + body: + string: '{"contents":[{"role":"user","parts":[{"text":"When was ggplot2 1.0.0 + released to CRAN?\n\nAnswer in YYYY-MM-DD format."}]},{"role":"model","parts":[{"text":"ggplot2 + version 1.0.0 was released to CRAN on 2014-05-21."}]},{"role":"user","parts":[{"text":"What + month was that?"}]}],"tools":{"google_search":{}},"systemInstruction":{"parts":{"text":""}},"generationConfig":{"temperature":0,"seed":1014}}' + response: + status: 200 + headers: + alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content-encoding: gzip + content-length: '311' + content-type: application/json; charset=UTF-8 + date: Fri, 07 Nov 2025 16:59:14 GMT + server: scaffolding on HTTPServer2 + server-timing: gfet4t7; dur=698 + vary: + - Origin + - X-Origin + - Referer + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-xss-protection: '0' + body: + string: | + { + "candidates": [ + { + "content": { + "parts": [ + { + "text": "That was May." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0, + "groundingMetadata": {} + } + ], + "usageMetadata": { + "promptTokenCount": 62, + "candidatesTokenCount": 4, + "totalTokenCount": 115, + "promptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 62 + } + ], + "thoughtsTokenCount": 49 + }, + "modelVersion": "gemini-2.5-flash", + "responseId": "YiUOaa_GDNXQz7IPpMaW8Q0" + } + recorded_at: 2025-11-07 16:59:14 +- request: + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent + body: + string: '{"contents":[{"role":"user","parts":[{"text":"When was ggplot2 1.0.0 + released to CRAN?\n\nAnswer in YYYY-MM-DD format."}]},{"role":"model","parts":[{"text":"ggplot2 + version 1.0.0 was released to CRAN on 2014-05-21."}]},{"role":"user","parts":[{"text":"What + month was that?"}]},{"role":"model","parts":[{"text":"That was May."}]},{"role":"user","parts":[{"text":"What + month was that?"}]}],"tools":{"google_search":{}},"systemInstruction":{"parts":{"text":""}},"generationConfig":{"temperature":0,"seed":1014}}' + response: + status: 200 + headers: + alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + content-encoding: gzip + content-length: '313' + content-type: application/json; charset=UTF-8 + date: Fri, 07 Nov 2025 16:59:15 GMT + server: scaffolding on HTTPServer2 + server-timing: gfet4t7; dur=821 + vary: + - Origin + - X-Origin + - Referer + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-xss-protection: '0' + body: + string: | + { + "candidates": [ + { + "content": { + "parts": [ + { + "text": "That was May." + } + ], + "role": "model" + }, + "finishReason": "STOP", + "index": 0, + "groundingMetadata": {} + } + ], + "usageMetadata": { + "promptTokenCount": 73, + "candidatesTokenCount": 4, + "totalTokenCount": 106, + "promptTokensDetails": [ + { + "modality": "TEXT", + "tokenCount": 73 + } + ], + "thoughtsTokenCount": 29 + }, + "modelVersion": "gemini-2.5-flash", + "responseId": "YyUOaa7rCfWsz7IPyqKHuAw" + } + recorded_at: 2025-11-07 16:59:15 +recorded_with: VCR-vcr/2.0.0 diff --git a/tests/testthat/_vcr/openai-v2-web-search.yml b/tests/testthat/_vcr/openai-v2-web-search.yml new file mode 100644 index 00000000..23cc996f --- /dev/null +++ b/tests/testthat/_vcr/openai-v2-web-search.yml @@ -0,0 +1,388 @@ +http_interactions: +- request: + method: POST + uri: https://api.openai.com/v1/responses + body: + string: '{"input":[{"role":"system","content":[{"type":"input_text","text":"Be + terse."}]},{"role":"user","content":[{"type":"input_text","text":"When was + ggplot2 1.0.0 released to CRAN?\n\nAnswer in YYYY-MM-DD format.\n\nThe CRAN + archive page has this info."}]}],"model":"gpt-4.1","temperature":0,"stream":false,"tools":[{"type":"web_search","external_web_access":true}],"store":false,"service_tier":"auto"}' + response: + status: 200 + headers: + alt-svc: h3=":443"; ma=86400 + cf-cache-status: DYNAMIC + cf-ray: 99ae5dff3b0b6bce-DFW + content-encoding: gzip + content-type: application/json + date: Fri, 07 Nov 2025 16:57:06 GMT + openai-organization: posit-esfrkf + openai-processing-ms: '6594' + openai-project: proj_IeWhBnzvOO8wbVR5MdxnGXFq + openai-version: '2020-10-01' + server: cloudflare + set-cookie: + - __cf_bm=CNduO6Iw3VBRFpnlkJmmrpZn68suAMm_KxsYupMJcIY-1762534626-1.0.1.1-8tQhIWKcaKzOcOS2q39lPWQ1tY6Mc9Mh9PETwWfWuPwIiH5RcnwTWlWFMMb2gd3cfu0LA8YecxVKEbwXCWr0gOljOj6uFrK9D1drCK7IfvY; + path=/; expires=Fri, 07-Nov-25 17:27:06 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=PluTrp5gpRUU9NPjRYvUYfiSW2MAGKH4hwoE9s79tuE-1762534626683-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + strict-transport-security: max-age=31536000; includeSubDomains; preload + x-content-type-options: nosniff + x-envoy-upstream-service-time: '6599' + x-request-id: req_f8dc9c2c07af4397b0979da043bb275d + body: + string: |- + { + "id": "resp_0a01833cc558a3bc01690e24dc16d08195942d7d79a7dad164", + "object": "response", + "created_at": 1762534620, + "status": "completed", + "background": false, + "billing": { + "payer": "developer" + }, + "error": null, + "incomplete_details": null, + "instructions": null, + "max_output_tokens": null, + "max_tool_calls": null, + "model": "gpt-4.1-2025-04-14", + "output": [ + { + "id": "ws_0a01833cc558a3bc01690e24dcd9cc819589af57101f84dbcc", + "type": "web_search_call", + "status": "completed", + "action": { + "type": "search", + "query": "ggplot2 1.0.0 CRAN archive release date" + } + }, + { + "id": "msg_0a01833cc558a3bc01690e24e23d44819589c9016c3a34846e", + "type": "message", + "status": "completed", + "content": [ + { + "type": "output_text", + "annotations": [ + { + "type": "url_citation", + "end_index": 147, + "start_index": 57, + "title": "Index of /CRAN/src/contrib/Archive/ggplot2", + "url": "https://stat.ethz.ch/CRAN/src/contrib/Archive/ggplot2/?utm_source=openai" + } + ], + "logprobs": [], + "text": "ggplot2 version\u202f1.0.0 was released to CRAN on 2014\u201105\u201121 ([stat.ethz.ch](https://stat.ethz.ch/CRAN/src/contrib/Archive/ggplot2/?utm_source=openai)).\n\nAnswer: 2014\u201105\u201121" + } + ], + "role": "assistant" + } + ], + "parallel_tool_calls": true, + "previous_response_id": null, + "prompt_cache_key": null, + "prompt_cache_retention": null, + "reasoning": { + "effort": null, + "summary": null + }, + "safety_identifier": null, + "service_tier": "default", + "store": false, + "temperature": 0.0, + "text": { + "format": { + "type": "text" + }, + "verbosity": "medium" + }, + "tool_choice": "auto", + "tools": [ + { + "type": "web_search", + "filters": null, + "search_context_size": "medium", + "user_location": { + "type": "approximate", + "city": null, + "country": "US", + "region": null, + "timezone": null + } + } + ], + "top_logprobs": 0, + "top_p": 1.0, + "truncation": "disabled", + "usage": { + "input_tokens": 17038, + "input_tokens_details": { + "cached_tokens": 0 + }, + "output_tokens": 86, + "output_tokens_details": { + "reasoning_tokens": 0 + }, + "total_tokens": 17124 + }, + "user": null, + "metadata": {} + } + recorded_at: 2025-11-07 16:57:06 +- request: + method: POST + uri: https://api.openai.com/v1/responses + body: + string: '{"input":[{"role":"system","content":[{"type":"input_text","text":"Be + terse."}]},{"role":"user","content":[{"type":"input_text","text":"When was + ggplot2 1.0.0 released to CRAN?\n\nAnswer in YYYY-MM-DD format.\n\nThe CRAN + archive page has this info."}]},{"id":"ws_0a01833cc558a3bc01690e24dcd9cc819589af57101f84dbcc","type":"web_search_call","status":"completed","action":{"type":"search","query":"ggplot2 + 1.0.0 CRAN archive release date"}},{"role":"assistant","content":[{"type":"output_text","text":"ggplot2 + version 1.0.0 was released to CRAN on 2014‑05‑21 ([stat.ethz.ch](https://stat.ethz.ch/CRAN/src/contrib/Archive/ggplot2/?utm_source=openai)).\n\nAnswer: + 2014‑05‑21"}]},{"role":"user","content":[{"type":"input_text","text":"What + month was that?"}]}],"model":"gpt-4.1","temperature":0,"stream":false,"tools":[{"type":"web_search","external_web_access":true}],"store":false,"service_tier":"auto"}' + response: + status: 200 + headers: + alt-svc: h3=":443"; ma=86400 + cf-cache-status: DYNAMIC + cf-ray: 99ae5e29bb956bce-DFW + content-encoding: gzip + content-type: application/json + date: Fri, 07 Nov 2025 16:57:07 GMT + openai-organization: posit-esfrkf + openai-processing-ms: '758' + openai-project: proj_IeWhBnzvOO8wbVR5MdxnGXFq + openai-version: '2020-10-01' + server: cloudflare + set-cookie: + - __cf_bm=Zhxxv690XQpe5DsLfGWzW9SZDYTvdqErtQfEUV._uxg-1762534627-1.0.1.1-Ii9OUDs0hkEq1w_pkXS5i4L5K22JtucP9kEej.QJO3p3ISzs4Gn75GLGHWttLdvdVcszxHSDZuvjrhexZQYcDXOxOSS3EI9D21WL2uPtApA; + path=/; expires=Fri, 07-Nov-25 17:27:07 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=sRoAfBwWbMBg4gWoq4okrzfsKdnBPx.oOQkRm53WhOM-1762534627644-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + strict-transport-security: max-age=31536000; includeSubDomains; preload + x-content-type-options: nosniff + x-envoy-upstream-service-time: '763' + x-ratelimit-limit-requests: '10000' + x-ratelimit-limit-tokens: '30000000' + x-ratelimit-remaining-requests: '9999' + x-ratelimit-remaining-tokens: '29999565' + x-ratelimit-reset-requests: 6ms + x-ratelimit-reset-tokens: 0s + x-request-id: req_07255a3f956b478ca10701f7846cf740 + body: + string: |- + { + "id": "resp_0a01833cc558a3bc01690e24e2e2508195b1c2cfee7e4cff7e", + "object": "response", + "created_at": 1762534626, + "status": "completed", + "background": false, + "billing": { + "payer": "developer" + }, + "error": null, + "incomplete_details": null, + "instructions": null, + "max_output_tokens": null, + "max_tool_calls": null, + "model": "gpt-4.1-2025-04-14", + "output": [ + { + "id": "msg_0a01833cc558a3bc01690e24e38c0081958d92374c8497d272", + "type": "message", + "status": "completed", + "content": [ + { + "type": "output_text", + "annotations": [], + "logprobs": [], + "text": "May." + } + ], + "role": "assistant" + } + ], + "parallel_tool_calls": true, + "previous_response_id": null, + "prompt_cache_key": null, + "prompt_cache_retention": null, + "reasoning": { + "effort": null, + "summary": null + }, + "safety_identifier": null, + "service_tier": "default", + "store": false, + "temperature": 0.0, + "text": { + "format": { + "type": "text" + }, + "verbosity": "medium" + }, + "tool_choice": "auto", + "tools": [ + { + "type": "web_search", + "filters": null, + "search_context_size": "medium", + "user_location": { + "type": "approximate", + "city": null, + "country": "US", + "region": null, + "timezone": null + } + } + ], + "top_logprobs": 0, + "top_p": 1.0, + "truncation": "disabled", + "usage": { + "input_tokens": 416, + "input_tokens_details": { + "cached_tokens": 0 + }, + "output_tokens": 4, + "output_tokens_details": { + "reasoning_tokens": 0 + }, + "total_tokens": 420 + }, + "user": null, + "metadata": {} + } + recorded_at: 2025-11-07 16:57:07 +- request: + method: POST + uri: https://api.openai.com/v1/responses + body: + string: '{"input":[{"role":"system","content":[{"type":"input_text","text":"Be + terse."}]},{"role":"user","content":[{"type":"input_text","text":"When was + ggplot2 1.0.0 released to CRAN?\n\nAnswer in YYYY-MM-DD format.\n\nThe CRAN + archive page has this info."}]},{"id":"ws_0a01833cc558a3bc01690e24dcd9cc819589af57101f84dbcc","type":"web_search_call","status":"completed","action":{"type":"search","query":"ggplot2 + 1.0.0 CRAN archive release date"}},{"role":"assistant","content":[{"type":"output_text","text":"ggplot2 + version 1.0.0 was released to CRAN on 2014‑05‑21 ([stat.ethz.ch](https://stat.ethz.ch/CRAN/src/contrib/Archive/ggplot2/?utm_source=openai)).\n\nAnswer: + 2014‑05‑21"}]},{"role":"user","content":[{"type":"input_text","text":"What + month was that?"}]},{"role":"assistant","content":[{"type":"output_text","text":"May."}]},{"role":"user","content":[{"type":"input_text","text":"What + month was that?"}]}],"model":"gpt-4.1","temperature":0,"stream":false,"tools":[{"type":"web_search","external_web_access":true}],"store":false,"service_tier":"auto"}' + response: + status: 200 + headers: + alt-svc: h3=":443"; ma=86400 + cf-cache-status: DYNAMIC + cf-ray: 99ae5e2fab9c6bce-DFW + content-encoding: gzip + content-type: application/json + date: Fri, 07 Nov 2025 16:57:08 GMT + openai-organization: posit-esfrkf + openai-processing-ms: '670' + openai-project: proj_IeWhBnzvOO8wbVR5MdxnGXFq + openai-version: '2020-10-01' + server: cloudflare + set-cookie: + - __cf_bm=dXZ6bUxcMwzXcoo2u1SiC3mFV0_cwBgKmPvr_2h1vcI-1762534628-1.0.1.1-oY1M8DNxcyNCdeLdlIOSYNCJJ_NOH1xvhlmuo8cvrt3JvI3SXyxUTE8c3gnUqhjcZcHPkoBpdqutkJh73QFAL_lYXZvmzbQpKyj9MsrXWCE; + path=/; expires=Fri, 07-Nov-25 17:27:08 GMT; domain=.api.openai.com; HttpOnly; + Secure; SameSite=None + - _cfuvid=32UC1fRT8wPIZxw4pBdO1IOCZu8TtTKPz2UHWZODqFs-1762534628507-0.0.1.1-604800000; + path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None + strict-transport-security: max-age=31536000; includeSubDomains; preload + x-content-type-options: nosniff + x-envoy-upstream-service-time: '677' + x-ratelimit-limit-requests: '10000' + x-ratelimit-limit-tokens: '30000000' + x-ratelimit-remaining-requests: '9999' + x-ratelimit-remaining-tokens: '29999549' + x-ratelimit-reset-requests: 6ms + x-ratelimit-reset-tokens: 0s + x-request-id: req_b2d4259d6be443b8a289a274e7133a68 + body: + string: |- + { + "id": "resp_0a01833cc558a3bc01690e24e3dee48195a6288c1fef751ca7", + "object": "response", + "created_at": 1762534627, + "status": "completed", + "background": false, + "billing": { + "payer": "developer" + }, + "error": null, + "incomplete_details": null, + "instructions": null, + "max_output_tokens": null, + "max_tool_calls": null, + "model": "gpt-4.1-2025-04-14", + "output": [ + { + "id": "msg_0a01833cc558a3bc01690e24e4720c8195a24aba2de909b0f3", + "type": "message", + "status": "completed", + "content": [ + { + "type": "output_text", + "annotations": [], + "logprobs": [], + "text": "May." + } + ], + "role": "assistant" + } + ], + "parallel_tool_calls": true, + "previous_response_id": null, + "prompt_cache_key": null, + "prompt_cache_retention": null, + "reasoning": { + "effort": null, + "summary": null + }, + "safety_identifier": null, + "service_tier": "default", + "store": false, + "temperature": 0.0, + "text": { + "format": { + "type": "text" + }, + "verbosity": "medium" + }, + "tool_choice": "auto", + "tools": [ + { + "type": "web_search", + "filters": null, + "search_context_size": "medium", + "user_location": { + "type": "approximate", + "city": null, + "country": "US", + "region": null, + "timezone": null + } + } + ], + "top_logprobs": 0, + "top_p": 1.0, + "truncation": "disabled", + "usage": { + "input_tokens": 431, + "input_tokens_details": { + "cached_tokens": 0 + }, + "output_tokens": 4, + "output_tokens_details": { + "reasoning_tokens": 0 + }, + "total_tokens": 435 + }, + "user": null, + "metadata": {} + } + recorded_at: 2025-11-07 16:57:08 +recorded_with: VCR-vcr/2.0.0 diff --git a/tests/testthat/helper-provider.R b/tests/testthat/helper-provider.R index 107ffb14..97f175f0 100644 --- a/tests/testthat/helper-provider.R +++ b/tests/testthat/helper-provider.R @@ -83,13 +83,31 @@ test_data_extraction <- function(chat_fun) { # Built-in tools --------------------------------------------------------- -test_tool_web_fetch <- function(chat_fun, search_tool) { +test_tool_web_fetch <- function(chat_fun, tool) { chat <- chat_fun() - chat$register_tool(search_tool) - result <- chat$chat( - "What's the first movie listed on https://rvest.tidyverse.org/articles/starwars.html?" + chat$register_tool(tool) + + url <- "https://rvest.tidyverse.org/articles/starwars.html" + expect_match( + chat$chat(paste0("What's the first movie listed on ", url, "?")), + "The Phantom Menace" ) - expect_match(result, "The Phantom Menace") + expect_match(chat$chat("Who directed it?"), "George Lucas") +} + +test_tool_web_search <- function(chat_fun, tool, hint = NULL) { + chat <- chat_fun() + chat$register_tool(tool) + + result <- chat$chat(c( + "When was ggplot2 1.0.0 released to CRAN?", + "Answer in YYYY-MM-DD format.", + hint + )) + # for openAI + result <- gsub("\u2011", "-", result, fixed = TRUE) + expect_match(result, "2014-05-21") + expect_match(chat$chat("What month was that?"), "May") } # Images ----------------------------------------------------------------- diff --git a/tests/testthat/test-provider-anthropic-files.R b/tests/testthat/test-provider-anthropic-files.R index 46426b8f..990a68f1 100644 --- a/tests/testthat/test-provider-anthropic-files.R +++ b/tests/testthat/test-provider-anthropic-files.R @@ -1,5 +1,5 @@ test_that("end-to-end test of all functions", { - vcr::local_cassette("anthropic-upload-file", record = "all") + vcr::local_cassette("anthropic-upload-file") upload <- anthropic_file_upload(test_path("apples.pdf")) defer(anthropic_file_delete(upload@uri)) diff --git a/tests/testthat/test-provider-anthropic.R b/tests/testthat/test-provider-anthropic.R index 6f6ddd70..f9fda0c8 100644 --- a/tests/testthat/test-provider-anthropic.R +++ b/tests/testthat/test-provider-anthropic.R @@ -49,10 +49,19 @@ test_that("can extract data", { test_that("can fetch web pages", { vcr::local_cassette("anthropic-web-fetch") - chat_fun <- \(...)chat_anthropic_test(..., beta_headers = "web-fetch-2025-09-10") + chat_fun <- \(...) { + chat_anthropic_test(..., beta_headers = "web-fetch-2025-09-10") + } test_tool_web_fetch(chat_fun, claude_tool_web_fetch()) }) +test_that("can search web pages", { + vcr::local_cassette("anthropic-web-search") + chat_fun <- \(...) chat_anthropic_test(...) + test_tool_web_search(chat_fun, claude_tool_web_search()) +}) + + test_that("can use images", { vcr::local_cassette("anthropic-images") chat_fun <- chat_anthropic_test diff --git a/tests/testthat/test-provider-google.R b/tests/testthat/test-provider-google.R index ec501be8..7766151a 100644 --- a/tests/testthat/test-provider-google.R +++ b/tests/testthat/test-provider-google.R @@ -53,6 +53,12 @@ test_that("can fetch web pages", { test_tool_web_fetch(chat_fun, google_tool_web_fetch()) }) +test_that("can search web pages", { + vcr::local_cassette("google-web-search") + chat_fun <- chat_google_gemini_test + test_tool_web_search(chat_fun, google_tool_web_search()) +}) + test_that("can use images", { vcr::local_cassette("google-image") chat_fun <- chat_google_gemini_test diff --git a/tests/testthat/test-provider-openai.R b/tests/testthat/test-provider-openai.R index 4bc678e4..bb427dbd 100644 --- a/tests/testthat/test-provider-openai.R +++ b/tests/testthat/test-provider-openai.R @@ -46,6 +46,16 @@ test_that("can extract data", { test_data_extraction(chat_fun) }) +test_that("can search web pages", { + vcr::local_cassette("openai-v2-web-search") + chat_fun <- \(...) chat_openai_test(model = "gpt-4.1", ...) + test_tool_web_search( + chat_fun, + openai_tool_web_search(), + hint = "The CRAN archive page has this info." + ) +}) + test_that("can use images", { vcr::local_cassette("openai-v2-image") # Needs mini to get shape correct From df11f437ee6dc02805b10ae511e587057c7bd08e Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 11:51:08 -0600 Subject: [PATCH 11/17] Improve google token counting --- R/provider-google.R | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/R/provider-google.R b/R/provider-google.R index 0b6ced23..a81a0dfd 100644 --- a/R/provider-google.R +++ b/R/provider-google.R @@ -284,12 +284,26 @@ method(stream_merge_chunks, ProviderGoogleGemini) <- function( } method(value_tokens, ProviderGoogleGemini) <- function(provider, json) { + # https://ai.google.dev/api/generate-content#UsageMetadata usage <- json$usageMetadata + + # Total token count for the generation request (prompt + response candidates). + # Not documented, but appears to include thinking and tool use, i.e. + # usage$promptTokenCount + usage$candidatesTokenCount + + # usage$toolUsePromptTokenCount + usage$thoughtsTokenCount == + # usage$totalTokenCount + total <- usage$totalTokenCount %||% 0 + + # Number of tokens in the prompt. When cachedContent is set, this is + # still the total effective prompt size meaning this includes the number + # of tokens in the cached content. + input <- usage$promptTokenCount %||% 0 + cached <- usage$cachedContentTokenCount %||% 0 tokens( - input = (usage$promptTokenCount %||% 0) + -cached, - output = usage$candidatesTokenCount + (usage$thoughtsTokenCount %||% 0), + input = input - cached, + output = total - input, cached_input = cached ) } From b2bd2c6b26b34dbc6db8942cf42cd8017694466b Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 11:51:26 -0600 Subject: [PATCH 12/17] Polish news bullet --- NEWS.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 6a21d48a..bf74497b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,10 +1,9 @@ # ellmer (development version) -* New web search and fetch tools (#578): +* ellmer now supports a vareity of built-in web search and fetch tools (#578): - `claude_tool_web_search()` and `claude_tool_web_fetch()` for Claude. - `google_tool_web_search()` and `google_tool_web_fetch()` for Gemini. - `openai_tool_web_search()` for OpenAI. - If you want to do web fetch for other providers, you could use `btw::btw_tool_web_read_url()`. * `parallel_chat()` and `batch_chat()` are no longer experimental. * New set of `anthropic_file_()` functions for managing file uploads with Anthropic (@dcomputing, #761). From b0e6436001308915e5f64a8602c6bc4fd996c3c4 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 11:53:27 -0600 Subject: [PATCH 13/17] Debugging --- tests/testthat/test-provider-anthropic-files.R | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/testthat/test-provider-anthropic-files.R b/tests/testthat/test-provider-anthropic-files.R index 990a68f1..6bd82590 100644 --- a/tests/testthat/test-provider-anthropic-files.R +++ b/tests/testthat/test-provider-anthropic-files.R @@ -1,5 +1,6 @@ test_that("end-to-end test of all functions", { vcr::local_cassette("anthropic-upload-file") + vcr::local_vcr_configure_log() upload <- anthropic_file_upload(test_path("apples.pdf")) defer(anthropic_file_delete(upload@uri)) From 94f9fb7fa0a733ecc44e563d9dfee9cdc0e080a0 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 12:08:14 -0600 Subject: [PATCH 14/17] Temporarily disable parallel testing --- DESCRIPTION | 1 - 1 file changed, 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 20c69c67..69521837 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -57,7 +57,6 @@ VignetteBuilder: knitr Config/Needs/website: tidyverse/tidytemplate, rmarkdown Config/testthat/edition: 3 -Config/testthat/parallel: true Config/testthat/start-first: chat, provider* Encoding: UTF-8 Roxygen: list(markdown = TRUE) From cb34d73ab57fe0453602efae9a1d5682264db018 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Nov 2025 12:15:57 -0600 Subject: [PATCH 15/17] Revert changes --- DESCRIPTION | 1 + tests/testthat/test-provider-anthropic-files.R | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 69521837..20c69c67 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -57,6 +57,7 @@ VignetteBuilder: knitr Config/Needs/website: tidyverse/tidytemplate, rmarkdown Config/testthat/edition: 3 +Config/testthat/parallel: true Config/testthat/start-first: chat, provider* Encoding: UTF-8 Roxygen: list(markdown = TRUE) diff --git a/tests/testthat/test-provider-anthropic-files.R b/tests/testthat/test-provider-anthropic-files.R index 6bd82590..990a68f1 100644 --- a/tests/testthat/test-provider-anthropic-files.R +++ b/tests/testthat/test-provider-anthropic-files.R @@ -1,6 +1,5 @@ test_that("end-to-end test of all functions", { vcr::local_cassette("anthropic-upload-file") - vcr::local_vcr_configure_log() upload <- anthropic_file_upload(test_path("apples.pdf")) defer(anthropic_file_delete(upload@uri)) From f05611768b22cde628707f8e60ffdda1e4008a36 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Wed, 12 Nov 2025 07:55:15 -0600 Subject: [PATCH 16/17] Rename file --- DESCRIPTION | 2 +- R/{provider-anthropic-tools.R => provider-claude-tools.R} | 0 man/claude_tool_web_fetch.Rd | 2 +- man/claude_tool_web_search.Rd | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename R/{provider-anthropic-tools.R => provider-claude-tools.R} (100%) diff --git a/DESCRIPTION b/DESCRIPTION index 43d35752..c4de6284 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -89,11 +89,11 @@ Collate: 'parallel-chat.R' 'params.R' 'provider-anthropic-files.R' - 'provider-anthropic-tools.R' 'provider-any.R' 'provider-aws.R' 'provider-openai-compatible.R' 'provider-azure.R' + 'provider-claude-tools.R' 'provider-claude.R' 'provider-google.R' 'provider-cloudflare.R' diff --git a/R/provider-anthropic-tools.R b/R/provider-claude-tools.R similarity index 100% rename from R/provider-anthropic-tools.R rename to R/provider-claude-tools.R diff --git a/man/claude_tool_web_fetch.Rd b/man/claude_tool_web_fetch.Rd index 3aaedbf1..9e445046 100644 --- a/man/claude_tool_web_fetch.Rd +++ b/man/claude_tool_web_fetch.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/provider-anthropic-tools.R +% Please edit documentation in R/provider-claude-tools.R \name{claude_tool_web_fetch} \alias{claude_tool_web_fetch} \title{Claude web fetch tool} diff --git a/man/claude_tool_web_search.Rd b/man/claude_tool_web_search.Rd index bed30507..d7c684f8 100644 --- a/man/claude_tool_web_search.Rd +++ b/man/claude_tool_web_search.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/provider-anthropic-tools.R +% Please edit documentation in R/provider-claude-tools.R \name{claude_tool_web_search} \alias{claude_tool_web_search} \title{Claude web search tool} From 082dc3c2eae07aff8a3aade35284c6d3d5f93d71 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Wed, 12 Nov 2025 07:59:33 -0600 Subject: [PATCH 17/17] Restore accidental deletion --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index e9b00743..3f1a620d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ # ellmer (development version) +* `AssistantTurn`s now have a `@duration` slot, containing the total time to complete the request (@simonpcouch, #798). * `batch_chat()` logs tokens once, on retrieval (#743). * `batch_chat()` now retrieves failed results for `chat_openai()` (#830). * `batch_chat()` now works correctly for `chat_anthropic()` (#835).