事情本身不复杂,线索都在日志里。为了减少误拦,把 safetySettings 里四个类别都设成 BLOCK_NONE,结果返回 400,原文 invalid safety category,用的是 gemini-1.5-flash。
第一反应是「BLOCK_NONE 在部分账号上不生效,需要走申请」,验证下来不成立。
原因不止一个,得分开看。类别名必须与官方枚举完全一致,多一个连字符就失败。还有一种是部分类别只支持较新的 API 版本。
还有一种情况,阈值参数写成数字,接口只接受枚举字符串。
上来先列一次不带安全设置的请求确认基线
curl -sS "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=$GEMINI_API_KEY" -H 'content-type: application/json' -d '{"contents":[{"parts":[{"text":"写一段产品说明"}]}]}'
随后按官方枚举逐条配置类别
python -c "import json;print(json.dumps({'safetySettings':[{'category':'HARM_CATEGORY_HARASSMENT','threshold':'BLOCK_ONLY_HIGH'}]}))"
末了把设置项单独抽成配置再复用
python -c "import json;print(len(json.load(open('safety.json'))['safetySettings']))"
这台环境是别人交接的,不少默认值被动过,只能一项项核。
改完先别撤,确认这几项。配置合法后请求返回 200,正常内容不再被拦,blockReason 字段消失。
这里还有个坑。安全设置改弱只是让拦截变少,不等于问题解决,正式业务里更该做输入侧的内容治理。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
