PHP CURL调用OpenAI:移除POST数据中数值引号的问题
问题说明
通过PHP的$_POST获取temperature、max_tokens、top_p等参数后,这些值默认是字符串类型,直接放入$postData再用json_encode()转换时,会被加上引号,不符合OpenAI接口要求的数值格式。
原获取参数代码:
$getOpenAITemperature = $_POST[OpenAITemperature]; $getmaxtokens = $_POST[OpenAIMaximumLength]; $getTopp = $_POST[OpenAITopP];
导致json_encode()后输出:
{ "model": "...", "prompt": "...", "temperature": "0.24", "max_tokens": "250", "top_p": "1" }
而接口需要的格式是:
{ "model": "...", "prompt": "...", "temperature": 0.24, "max_tokens": 250, "top_p": 1 }
解决方案
直接对$_POST获取的值进行类型强制转换,将字符串转为对应的数值类型即可:
方法1:强制类型转换
// 转换为浮点数(适用于temperature、top_p这类可能带小数的参数) $getOpenAITemperature = (float)$_POST['OpenAITemperature']; // 转换为整数(适用于max_tokens这类整数参数) $getmaxtokens = (int)$_POST['OpenAIMaximumLength']; $getTopp = (float)$_POST['OpenAITopP'];
方法2:使用filter_var做安全转换(推荐)
如果需要对输入值做合法性校验,比如确保是有效的数字,用filter_var更安全:
$getOpenAITemperature = filter_var($_POST['OpenAITemperature'], FILTER_VALIDATE_FLOAT); $getmaxtokens = filter_var($_POST['OpenAIMaximumLength'], FILTER_VALIDATE_INT); $getTopp = filter_var($_POST['OpenAITopP'], FILTER_VALIDATE_FLOAT);
注:如果输入值不是有效的数字,
filter_var会返回false,可以额外添加判断处理异常情况。
修改后的完整示例代码
// 转换参数类型 $getOpenAITemperature = (float)$_POST['OpenAITemperature']; $getmaxtokens = (int)$_POST['OpenAIMaximumLength']; $getTopp = (float)$_POST['OpenAITopP']; $OPENAI_API_KEY = "sk-123"; $getOpenAIModel = "text-davinci-003"; $getRequest = "My Question"; $ch = curl_init(); $headers = [ 'Accept: application/json', 'Content-Type: application/json', 'Authorization: Bearer '.$OPENAI_API_KEY.'' ]; $postData = [ 'model' => $getOpenAIModel, 'prompt' => $getRequest, 'temperature' => $getOpenAITemperature, 'max_tokens' => $getmaxtokens, 'top_p' => $getTopp, 'best_of' => 2, 'frequency_penalty' => 0.0, 'presence_penalty' => 0.0, 'stop' => '["\n"]', ]; curl_setopt($ch, CURLOPT_URL, 'https://api.openai.com/v1/completions'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); $result = curl_exec($ch);
这样处理后,json_encode()会将数值类型的参数输出为不带引号的格式,符合OpenAI接口要求。
内容的提问来源于stack exchange,提问作者HotsyncUK
相关产品推荐
相关产品推荐

