如何在GPT-4 API的messages数组中结合固定文本与变量?
GPT-4 API请求中拼接固定文本与变量的正确方式
问题场景
在调用GPT-4 API时,需要在messages数组的content字段中结合固定文本变量(如$intro、$into)和内容变量(如$selectedText、$language),但现有curl请求触发了JSON解析错误,报错信息显示请求的JSON格式无效,还出现了无法解析主机、括号不匹配等问题。
错误原因
原写法中,shell会将单引号内的变量拼接内容按空格拆分,把$into等变量当成独立的URL参数传递给curl,直接破坏了JSON结构,导致OpenAI API无法识别有效请求体。
解决方案
方案1:双引号包裹JSON并转义内部引号
在bash等shell环境中,用双引号包裹整个-d参数内容,同时对JSON内部的双引号进行转义,确保变量被正确解析且JSON结构完整:
curl https://api.openai.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $api_key" \ -d "{ \"model\": \"gpt-4\", \"messages\": [{\"role\": \"user\", \"content\": \"$intro$selectedText$into$language\"}], \"temperature\": 0.7 }"
方案2:用printf构造JSON(更可靠)
如果变量包含特殊字符(如双引号、换行),建议先用printf生成标准JSON字符串,再传给curl,避免直接拼接的格式问题:
# 构造JSON payload json_payload=$(printf '{ "model": "gpt-4", "messages": [{"role": "user", "content": "%s%s%s%s"}], "temperature": 0.7 }' "$intro" "$selectedText" "$into" "$language") # 发起请求 curl https://api.openai.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $api_key" \ -d "$json_payload"
方案3:处理变量中的特殊字符
如果变量内容包含双引号、反斜杠等JSON敏感字符,需要先转义这些字符,避免破坏JSON结构:
# 转义变量中的特殊字符 escaped_selectedText=$(echo "$selectedText" | sed 's/"/\\"/g; s/\\/\\\\/g') escaped_intro=$(echo "$intro" | sed 's/"/\\"/g; s/\\/\\\\/g') # 再用方案1或2拼接请求
内容的提问来源于stack exchange,提问作者RedCryptonaut
相关产品推荐
相关产品推荐

