0 0 0

国内无法调用 OpenAI 接口的解决办法

openai
2023-3-11 3695

本次总结的方法有两种。

 

1.设置 HTTP 代理

不少同学反映国内无法直接通过代码调用 OpenAI 接口,我在写这个示例项目的时候也遇到这个问题,解决办法也不难,就是在发起 HTTP 请求的时候在请求头中添加代理设置:

'proxy' => 'http://127.0.0.1:10809',
'verify' => false,

如果是通过 curl 发起的请求也是参照这个思路。Go HTTP 代理设置参考这个代码配置

之前使用的 `openai-php/laravel` 这个扩展包不支持对代理进行设置,也不支持对 ClientHeaders 进行扩展(都是通过 final 修饰):

因此我重新开发了一个扩展包,也就是今天项目中使用的 geekr/openai-laravel,主要就是在原来的基础上支持配置代理(以域名代理的方式实现,不是这种配置本地代理,本地代理只能本地使用)。

此外,你还可以使用另一个 OpenAI PHP 扩展包替代 —— orhanerday/open-ai,该扩展包支持你对代理进行设置:

 

2.通过中间层代理

不过如果你没有本地代理或者不想每个项目配置,还可以使用 Cloudflare Workers 解决 OpenAI 和 ChatGPT 的 API 无法访问的问题,其实就是把一个国内可访问的域名指向 Cloudflare Workers,再将 Cloudflare Workers 作为代理,转发给 OpenAI 接口进行交互,最后把响应数据返回给客户端:

参照这个思路,使用 AWS 或者其他云服务厂商的 API 网关+ Lambda 函数(云函数)也可以实现类似的功能。不想折腾的同学可以使用极客书房提供的腾讯云代理,只需要在发起请求时将 OpenAI 的 API 域名 api.openai.com 替换成 openai.aiproxy.xyz 即可:

代码里也是一样,以我开发的 geekr/openai-laravel 为例,它首先从配置文件读取 base_uri,然后在发起请求的时候,以自定义的 $baseUri 为准发起请求,这样就可以通过代理的方式发起对 OpenAI 的接口请求了:

<!--?php

declare(strict_types=1);

namespace GeekrOpenAI\Laravel\Client;

use GuzzleHttp\Client as GuzzleClient;
use OpenAI\Client;
use OpenAI\Transporters\HttpTransporter;
use OpenAI\ValueObjects\ApiKey;
use OpenAI\ValueObjects\Transporter\BaseUri;
use OpenAI\ValueObjects\Transporter\Headers;

class OpenAI
{
    /**
     * Creates a new Open AI Client with the given API token.
     */
    public static function client(string $apiKey, $baseUri, string $organization = null): Client
    {
        $apiKey = ApiKey::from($apiKey);

        $baseUri = BaseUri::from($baseUri);

        $headers = Headers::withAuthorization($apiKey);

        if ($organization !== null) {
            $headers = $headers--->withOrganization($organization);
        }

        $client = new GuzzleClient();

        $transporter = new HttpTransporter($client, $baseUri, $headers);

        return new Client($transporter);
    }
}

这个代理的源码我也提交到 Github 仓库里了,其实就是做一层转发而已:GO-OPENAI-PROXY,觉得有帮助就给个 star 吧。

AD:GPT-4官方账号:点击购买

请先登录后发表评论!

最新回复 (0)

    暂无评论

返回
请先登录后发表评论!