我在尝试为 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
目前不收集也不提供接地数据的访问权限。