Delphi 11调用ChatGPT API遇SSL协议错误,求解决方案
Delphi 11对接ChatGPT API时SSL协议错误的解决建议
问题概述
使用Delphi 11结合Indy 10组件开发对接ChatGPT API的应用,调用httpClient.Post时出现SSL协议错误,错误信息:
error:1409442E:SSL routines:SSL3_READ_BYTES:tlsv1 alert protocol version
相关代码如下:
function SendDataToChatGPT(data: TJSONObject): string; var httpClient: TIdHTTP; requestURL: string; requestBody: TStringStream; IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL ; begin httpClient := TIdHTTP.Create(nil); try IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.create(httpClient) ; httpClient.IOHandler := IdSSLIOHandlerSocketOpenSSL; IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions :=[sslvTLSv1_2]; requestURL := 'https://api.openai.com/v1/chat/completions'; httpClient.Request.ContentType := 'application/json'; httpClient.Request.CustomHeaders.Add('Authorization: Bearer myAPI_KEY'); //MyAPI_KEY is my personal token requestBody := TStringStream.Create(data.ToString, TEncoding.UTF8); try Result := httpClient.Post(requestURL, requestBody); finally requestBody.Free; end; finally httpClient.Free; end; end; procedure TForm10.Button5Click(Sender: TObject); var data: TJSONObject; dataArray: TJSONArray; dataItem: TJSONObject; response: string; begin // Prepare your data as a JSON object data := TJSONObject.Create; try data.AddPair('prompt', 'comment data and trend during interval date'); data.AddPair('max_tokens', '50'); // Create a JSON array to hold the data items dataArray := TJSONArray.Create; // Create a JSON object for each data item and add it to the array dataItem := TJSONObject.Create; dataItem.AddPair('Acid', 'Acetico'); dataItem.AddPair('value', '10'); dataItem.AddPair('data', '10/02/2003'); dataArray.AddElement(dataItem); dataItem := TJSONObject.Create; dataItem.AddPair('Acid', 'Acetico'); dataItem.AddPair('value', '11'); dataItem.AddPair('data', '12/02/2003'); dataArray.AddElement(dataItem); dataItem := TJSONObject.Create; dataItem.AddPair('Acid', 'Acetico'); dataItem.AddPair('value', '8.5'); dataItem.AddPair('data', '15/02/2003'); dataArray.AddElement(dataItem); dataItem := TJSONObject.Create; dataItem.AddPair('Acid', 'Acetico'); dataItem.AddPair('value', '10.7'); dataItem.AddPair('data', '22/02/2003'); dataArray.AddElement(dataItem); // Add the data array to the main data object data.AddPair('data', dataArray); // Send data to ChatGPT response := SendDataToChatGPT(data); // Process the response as needed Memo1.Lines.Text := response; finally data.Free; end; end;
解决建议
1. 升级OpenSSL动态库
Indy 10依赖OpenSSL库实现SSL通信,旧版本OpenSSL可能不支持ChatGPT API要求的TLS版本(至少TLS 1.2,部分场景需TLS 1.3):
- 确保应用目录下包含对应架构的最新OpenSSL动态库:32位程序用32位库,64位用64位库,推荐使用OpenSSL 1.1.x或3.x版本(文件如
libssl-3.dll、libcrypto-3.dll或libssl11.dll、libcrypto11.dll)。 - 淘汰1.0.x及更早版本的OpenSSL,这类版本已不再被主流服务支持。
2. 调整SSL版本配置
代码中已指定sslvTLSv1_2,可尝试扩展支持范围(若OpenSSL版本支持TLS 1.3):
IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_3];
若OpenSSL不支持TLS 1.3,保留sslvTLSv1_2即可,但需确保OpenSSL版本支持该协议。
3. 更新Indy组件版本
确保使用最新版Indy 10组件,旧版本Indy可能存在SSL协议兼容问题,可通过Embarcadero GetIt组件管理器更新到最新稳定版。
4. 修正ChatGPT API请求格式
当前请求JSON不符合v1/chat/completions接口规范,需调整:
- 接口无需
prompt字段,改用messages数组,每个元素包含role(如user)和content字段。 max_tokens需为数值类型,而非字符串。- 自定义数据需嵌入到
content中作为用户消息内容。
修正后的请求构建代码示例:
procedure TForm10.Button5Click(Sender: TObject); var data: TJSONObject; messagesArray: TJSONArray; userMsg: TJSONObject; dataArray: TJSONArray; dataItem: TJSONObject; response: string; begin data := TJSONObject.Create; try // 构建符合接口要求的messages数组 messagesArray := TJSONArray.Create; userMsg := TJSONObject.Create; userMsg.AddPair('role', 'user'); // 构建数据数组 dataArray := TJSONArray.Create; dataItem := TJSONObject.Create; dataItem.AddPair('Acid', 'Acetico'); dataItem.AddPair('value', '10'); dataItem.AddPair('data', '10/02/2003'); dataArray.AddElement(dataItem); dataItem := TJSONObject.Create; dataItem.AddPair('Acid', 'Acetico'); dataItem.AddPair('value', '11'); dataItem.AddPair('data', '12/02/2003'); dataArray.AddElement(dataItem); dataItem := TJSONObject.Create; dataItem.AddPair('Acid', 'Acetico'); dataItem.AddPair('value', '8.5'); dataItem.AddPair('data', '15/02/2003'); dataArray.AddElement(dataItem); dataItem := TJSONObject.Create; dataItem.AddPair('Acid', 'Acetico'); dataItem.AddPair('value', '10.7'); dataItem.AddPair('data', '22/02/2003'); dataArray.AddElement(dataItem); // 组合提示语与数据作为消息内容 userMsg.AddPair('content', Format('comment data and trend during interval date: %s', [dataArray.ToString])); messagesArray.AddElement(userMsg); data.AddPair('model', 'gpt-3.5-turbo'); // 必须指定模型 data.AddPair('messages', messagesArray); data.AddPair('max_tokens', TJSONNumber.Create(50)); // 改为数值类型 response := SendDataToChatGPT(data); Memo1.Lines.Text := response; finally data.Free; end; end;
5. 验证请求头与编码
- 确保ContentType设置完整:
httpClient.Request.ContentType := 'application/json; charset=utf-8'; - 代码中
TStringStream已指定TEncoding.UTF8,这部分无需修改。
总结
优先解决OpenSSL库版本问题,这是SSL协议错误的最常见诱因;其次修正ChatGPT API的请求格式,避免因格式错误导致的额外异常。
内容的提问来源于stack exchange,提问作者Gianluca Colombo
相关产品推荐
相关产品推荐

