请求Openai接口 java版+python版 (代理方式)

该文章提供了Java和Python两种语言实现调用OpenAIAPI的代码示例,包括设置请求超时和最多重试3次的逻辑。Java版本使用OkHttp库,Python版本则利用requests和线程池进行并发请求,并有自动重试功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是请求OPENAI接口的java版本和python,增加请求超时重试3次的逻辑

java 版本

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OpenAIRequest {
    private static final String OPENAI_API_URL = "https://api.openai.com/v1/your_endpoint";
    private static final String API_KEY = "your_api_key";
    private static final int TIMEOUT = 10;
    private static final int RETRY_COUNT = 3;
    private static final int THREAD_POOL_SIZE = 10;

    private final OkHttpClient httpClient;
    private final ExecutorService executorService;

    public OpenAIRequest() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .connectTimeout(TIMEOUT, TimeUnit.SECONDS)
                .writeTimeout(TIMEOUT, TimeUnit.SECONDS)
                .readTimeout(TIMEOUT, TimeUnit.SECONDS);

        // 设置代理
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("your_proxy_host", your_proxy_port));
        builder.proxy(proxy);

        httpClient = builder.build();
        executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
    }

    public void requestOpenAI() {
        executorService.submit(() -> {
            int retries = 0;
            boolean success = false;

            while (retries < RETRY_COUNT && !success) {
                try {
                    Request request = new Request.Builder()
                            .url(OPENAI_API_URL)
                            .header("Authorization", "Bearer " + API_KEY)
                            .build();

                    httpClient.newCall(request).enqueue(new Callback() {
                        @Override
                        public void onFailure(Call call, IOException e) {
                            System.out.println("请求失败: " + e.getMessage());
                        }

                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            if (response.isSuccessful()) {
                                System.out.println("请求成功: " + response.body().string());
                                success = true;
                            } else {
                                System.out.println("请求失败: " + response.message());
                            }
                        }
                    });

                    success = true;
                } catch (Exception e) {
                    retries++;
                    System.out.println("重试次数: " + retries);
                }
            }
        });
    }

    public static void main(String[] args) {
        OpenAIRequest openAIRequest = new OpenAIRequest();
        openAIRequest.requestOpenAI();
    }
}

注意,需要替换`OPENAI_API_URL`、`API_KEY`、`your_proxy_host`和`your_proxy_port`为您的实际值。同时,需要添加OkHttp库作为依赖项。

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.6.0</version>
</dependency>

Python 版本

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

class OpenAIRequester:
    def __init__(self, api_key, proxy=None, max_workers=5):
        self.api_key = api_key
        self.proxy = proxy
        self.max_workers = max_workers
        self.session = self._create_session()

    def _create_session(self):
        session = requests.Session()
        if self.proxy:
            session.proxies.update(self.proxy)

        retries = Retry(total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504])
        adapter = HTTPAdapter(max_retries=retries)
        session.mount('http://', adapter)
        session.mount('https://', adapter)

        return session

    def _request_openai(self, url, data):
        headers = {
            'Authorization': f'Bearer {self.api_key}',
            'Content-Type': 'application/json'
        }
        try:
            response = self.session.post(url, json=data, headers=headers, timeout=10)
            response.raise_for_status()
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"请求失败: {e}")
            return None

    def request(self, urls, data_list):
        with ThreadPoolExecutor(max_workers=self.max_workers) as executor:
            futures = [executor.submit(self._request_openai, url, data) for url, data in zip(urls, data_list)]

            results = []
            for future in as_completed(futures):
                result = future.result()
                if result:
                    results.append(result)

        return results

# 使用示例
if __name__ == "__main__":
    api_key = "your_openai_api_key"
    proxy = {
        "http": "http://proxy.example.com:8080",
        "https": "https://proxy.example.com:8080"
    }
    requester = OpenAIRequester(api_key, proxy)

    urls = ["https://api.openai.com/v1/engines/davinci-codex/completions"] * 3
    data_list = [
        {
            "prompt": "Python code to calculate the factorial of a number",
            "max_tokens": 100,
            "n": 1,
            "stop": None,
            "temperature": 0.5,
        }
    ] * 3

    results = requester.request(urls, data_list)
    print(results)

将`your_openai_api_key`替换为您的OpenAI API密钥,并根据需要设置代理。这个类将使用线程池并发地请求OpenAI接口,并在遇到超时或其他错误时自动重试3次

<think>好的,用户想了解如何在Python中调用OpenAI的API,需要示例代码。我之前已经处理过类似的问题,现在需要根据提供的引用内容整理出一个清晰的步骤。 首先,我需要确认用户的具体需求。他们可能已经知道需要安装库,但可能需要详细的步骤和示例。根据引用内容,引用[1]、[2]、[3]、[4]都提到了导入openai库、设置API密钥以及调用不同的方法,比如Model.list()、ChatCompletion.create()和Completion.create()。需要将这些信息整合成一个连贯的指南。 接下来,步骤分解。通常,调用API的第一步是安装库,所以应该先提到使用pip安装。然后导入必要的库,如openai和os,或者处理代理的情况,如引用[3]中的代理设置。不过用户可能不一定需要代理,所以可能需要作为可选步骤。 设置API密钥是关键部分,引用[1]和[2]提到从环境变量获取,引用[3]则从文件读取,而引用[4]直接写在代码里。需要建议最佳实践,比如使用环境变量,避免密钥硬编码。同时,要提醒用户密钥的安全性。 然后,示例代码部分,用户可能需要不同的模型调用方式。比如,ChatCompletion和Completion的区别,引用[3]和[4]分别展示了这两种方式。需要解释这两种不同的方法,以及如何构造请求参数,如model、messages、temperature等。 此外,错误处理和代理设置也是需要考虑的,特别是引用[3]提到了代理的问题,可能国内用户需要设置,但作为可选步骤,放在注意事项里比较合适。 最后,生成相关问题,可能需要涵盖身份验证、不同模型区别、参数调整以及错误处理等方面。确保问题对用户进一步学习有帮助。 现在需要检查是否有遗漏的步骤,比如安装库的部分是否明确,代码示例是否正确,以及注意事项是否全面。同时,确保引用正确,每个步骤对应的引用来源标注清楚,比如环境变量设置来自引用[1][2],代理来自引用[3],代码示例来自引用[3][4]等。 总结下来,回答应该分为安装库、导入和配置、示例代码(聊天和文本生成)、注意事项,最后是相关问题。这样结构清晰,用户能一步步跟随操作。</think>在Python中调用OpenAI API的完整步骤如下: ### 一、安装OpenAI库 ```bash pip install openai ``` ### 二、基础配置 #### 1. 导入库与环境配置 ```python import openai import os ``` #### 2. 身份验证 ```python # 最佳实践:从环境变量读取API密钥(推荐安全性) os.environ["OPENAI_API_KEY"] = "sk-xxx" openai.api_key = os.getenv("OPENAI_API_KEY") # 或直接设置(适用于测试环境) openai.api_key = "sk-xxx" ``` [^1][^2][^3] ### 三、API调用示例 #### 1. 聊天对话接口(ChatCompletion) ```python response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "你是一个资深Python开发者"}, {"role": "user", "content": "解释递归算法的实现原理"} ], temperature=0.7, max_tokens=500 ) print(response.choices[0].message.content) ``` [^3] #### 2. 文本生成接口(Completion) ```python response = openai.Completion.create( engine="text-davinci-003", prompt="用Python实现快速排序算法", temperature=0.5, max_tokens=1000 ) print(response.choices[0].text) ``` [^4] ### 四、高级配置 #### 1. 代理设置(国内需要) ```python os.environ["HTTP_PROXY"] = "http://127.0.0.1:7890" os.environ["HTTPS_PROXY"] = "http://127.0.0.1:7890" ``` [^3] #### 2. 参数说明 - `temperature`:控制随机性(0-2,0最确定) - `max_tokens`:响应最大长度 - `n`:生成多个结果 - `stop`:停止生成标记
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值