如何格式化ellmer::chat_gemini的api_args解决谷歌搜索grounding参数错误
解决ellmer::chat_gemini配置Google搜索Grounding时的
Error in !extra_args : invalid argument type错误 问题背景
尝试为ellmer::chat_gemini配置api_args以实现Gemini的谷歌搜索grounding,但调用$chat()方法时始终返回错误:Error in !extra_args : invalid argument type。先后尝试两种配置方式均失败:
失败的配置示例
# 尝试1:直接传入JSON字符串 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)
目标是复刻Gemini官方REST 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.json curl -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.json cat response.json
错误原因
- 直接传JSON字符串:
ellmer::chat_gemini的api_args参数要求传入列表结构,而非原始JSON字符串,直接传递会导致参数类型不匹配。 - 嵌套列表转JSON异常:默认情况下,
jsonlite(ellmer内部依赖的JSON处理库)会将R中的标量转换为JSON数组(如mode = "MODE_DYNAMIC"会被转为"mode": ["MODE_DYNAMIC"]),不符合Gemini API要求的纯标量格式,触发API调用失败,进而引发!extra_args类型错误。
解决方案
方案1:用I()包裹标量构造列表
通过I()函数标记标量值,阻止jsonlite将其转换为数组,确保生成的JSON符合Gemini API要求:
library(jsonlite) # 正确构造api_args,用I()包裹标量避免转成数组 api_args <- list( tools = list( list( google_search_retrieval = list( dynamic_retrieval_config = list( mode = I("MODE_DYNAMIC"), dynamic_threshold = I(0.3) ) ) ) ) ) # 验证JSON格式(可选) cat(toJSON(api_args, pretty = TRUE)) # 初始化实例并调用 chat_gemini20 <- ellmer::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)
方案2:直接生成正确的JSON字符串传递
使用jsonlite::toJSON生成符合要求的JSON字符串,指定auto_unbox = TRUE自动解包标量,再传递给api_args:
library(jsonlite) # 生成符合要求的JSON字符串 api_json <- toJSON( list( tools = list( list( google_search_retrieval = list( dynamic_retrieval_config = list( mode = "MODE_DYNAMIC", dynamic_threshold = 0.3 ) ) ) ) ), auto_unbox = TRUE, pretty = TRUE ) # 初始化实例,将JSON字符串作为json参数传入 chat_gemini20 <- ellmer::chat_gemini( system_prompt = system_prompt, model = "gemini-2.0-flash", api_args = list(json = api_json), api_key = Sys.getenv("GEMINI_API_KEY") ) gp <- "What is the product identified by isin IE00BYXPSP02?" chat_gemini20$chat(gp)
内容的提问来源于stack exchange,提问作者pcs
相关产品推荐
相关产品推荐

