如何在 ellmer::chat_gemini 中格式化 api_args 以避免 Gemini Google 搜索接地时的“Error in !extra_args : invalid argument type”错误?

我在尝试为 ellmer::chat_gemini 格式化 api_args,但每次调用 $chat() 都会返回“Error in !extra_args : invalid argument type”的错误

目标是生成带有 Gemini 的 Google 搜索接地的调用。

我尝试了直接的 JSON 和嵌入的列表:

#这不起作用(尝试 1)api_args <- list(tools = r"--( {"google_search_retrieval": { "dynamic_retrieval_config": {"mode": "MODE_DYNAMIC","dynamic_threshold": 0.3}}} )--" )#这不起作用(尝试 2)api_args <- list(tools = list(list(google_search_retrieval = list(dynamic_retrieval_config = list(mode = "MODE_DYNAMIC", dynamic_threshold = 0.3)))))chat_gemini20 <- chat_gemini(system_prompt = system_prompt, model = "gemini-2.0-flash", api_args = api_args, api_key = Sys.getenv("GEMINI_API_KEY"))gp <- "What is the product identified by isin IE00BYXPSP02?"chat_gemini20$chat(gp)

我试图复制的样本 REST 调用直接来自 Gemini API 参考:

echo '{"contents":          [{"parts": [{"text": "What is the current Google stock price?"}]}],      "tools": [{"google_search_retrieval": {                  "dynamic_retrieval_config": {                    "mode": "MODE_DYNAMIC",                    "dynamic_threshold": 1,                }            }        }    ]}' > request.jsoncurl -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GEMINI_API_KEY" \-H "Content-Type: application/json" \-d  @request.json > response.jsoncat response.json

然而,我的尝试都没有成功复制。

额外信息 – 问题可能是标量值的装箱 – [“MODE_DYNAMIC”](尝试 2):

>toJSON(api_args){"tools":[{"google_search_retrieval":{"dynamic_retrieval_config":{"mode":["MODE_DYNAMIC"],"dynamic_threshold":[0.3]}}}]} 

回答:

ellmer 似乎在将 api_args 序列化为 JSON 之前对其进行了预处理,因为它最终在请求中显示为 "tools":[{"google_search":null}] 而不是 "tools":[{"google_search":{}}]

# API key 在 GOOGLE_API_KEY 环境变量中library(ellmer)api_args <- list(tools = list(list(google_search = c())))# 检查转换jsonlite::toJSON(api_args, pretty = TRUE) |> cat()#> {#>   "tools": [#>     {#>       "google_search": {}#>     }#>   ]#> }# 测试聊天,设置 verbosity 级别为 2 以显示请求头和正文:httr2::with_verbosity(  chat_gemini(    model = "gemini-2.0-flash",     api_args = api_args  )$chat("What is the current Google stock price?"),  verbosity = 2)#> -> POST /v1beta/models/gemini-2.0-flash:streamGenerateContent?alt=sse HTTP/1.1#> -> Host: generativelanguage.googleapis.com#> -> User-Agent: httr2/1.1.0 r-curl/6.1.0 libcurl/8.10.1#> -> Accept: */*#> -> Accept-Encoding: deflate, gzip#> -> x-goog-api-key: <REDACTED>#> -> Content-Type: application/json#> -> Content-Length: 166#> -> #> >> {"contents":[{"role":"user","parts":[{"text":"What is the current Google stock price?"}]}],"systemInstruction":{"parts":{"text":""}},"tools":[{"google_search":null}]}#> <- HTTP/1.1 400 Bad Request#> /../#> <-#> Error in `req_perform_connection()`:#> ! HTTP 400 Bad Request.#> • Request contains an invalid argument.

虽然像
list(tools = list(list(google_search = structure(list(), names = character(0))))) 或只是
jsonlite::parse_json('{"tools": [{ "google_search": {} }] }')
这样的代码是有效的:

api_args <- jsonlite::parse_json('{"tools": [{ "google_search": {} }] }') chat <- chat_gemini(model = "gemini-2.0-flash", api_args = api_args)chat$chat("What is the current Google stock price?")#> As of February 12, 2025, the current price of Alphabet Inc (Google) Class C #> stock (GOOG) is $185.37. It has decreased by -0.60% in the past 24 hours.

虽然这是一个有效的接地响应,你可以通过 httr2::with_verbosity() 更仔细地查看,但似乎 ellmer 目前不收集也不提供接地数据的访问权限。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注