PHP调用OpenAI API提示未提供API密钥问题求助
解决OpenAI API调用提示未提供API密钥的问题
你遇到的错误提示看似矛盾,实际是由两个关键问题导致的:
- API端点错误:你使用的
https://api.openai.com/v1/engines/davinci/jobs是旧版批量任务接口,当前用于文本补全的正确端点应为https://api.openai.com/v1/completions。旧接口的认证逻辑与参数要求不同,会导致密钥无法被正确识别。 - 请求头格式错误:WordPress的
wp_remote_post要求headers参数为键值对数组,而非字符串数组。你当前的写法会使头信息无法被正确解析,Authorization头自然无法被OpenAI服务器接收。
以下是修正后的完整代码:
$api_key = "sk-U3B.........7MiL"; $query = "How are you?"; // 修正为正确的文本补全端点 $url = "https://api.openai.com/v1/completions"; // 改为键值对格式的请求头 $headers = array( "Content-Type" => "application/json", "Authorization" => "Bearer " . $api_key ); $data = array( "model" => "text-davinci-003", // 需指定完整的模型名称 "prompt" => $query, "max_tokens" => 100, "temperature" => 0.5 ); $response = wp_remote_post( $url, array( 'headers' => $headers, 'body' => json_encode( $data ), 'method' => 'POST', // 显式指定请求方法,避免自动判断出错 'timeout' => 30 // 增加超时时间,适配API响应时长 ) ); if ( is_wp_error( $response ) ) { echo "Error communicating with OpenAI API: " . $response->get_error_message(); } else { $response_body = json_decode( $response['body'] ); if (isset($response_body->choices[0]->text)) { echo trim($response_body->choices[0]->text); } else { // 打印错误详情便于排查 var_dump($response_body); } }
额外说明:
- 必须指定完整的
model参数值,比如text-davinci-003,不能仅写davinci; - 显式声明请求方法为POST,避免WordPress根据请求内容自动判断时出现异常;
- 增加超时时间,OpenAI API响应可能需要数秒,默认超时可能导致请求中断。
内容的提问来源于stack exchange,提问作者sw123456
相关产品推荐
相关产品推荐

