You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何格式化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

错误原因

  1. 直接传JSON字符串:ellmer::chat_gemini的api_args参数要求传入列表结构,而非原始JSON字符串,直接传递会导致参数类型不匹配。
  2. 嵌套列表转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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:20:58