Grt1228 / chatgpt-java

ChatGPT Java SDK支持流式输出、Gpt插件、联网。支持OpenAI官方所有接口。ChatGPT的Java客户端。OpenAI GPT-3.5-Turb GPT-4 Api Client for Java
https://chatgpt-java.unfbx.com
Apache License 2.0
3.31k stars 811 forks source link

支持当key欠费时自动剔除key #145

Closed kissycn closed 1 year ago

kissycn commented 1 year ago

按照demo提示我添加了DynamicKeyOpenAiAuthInterceptor后测试未生效。

HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new OpenAILogger());
        DynamicKeyOpenAiAuthInterceptor interceptor =  new DynamicKeyOpenAiAuthInterceptor();
        interceptor.setApiKey(keys);
        interceptor.setKeyStrategy(new KeyRandomStrategy());
        //!!!!千万别再生产或者测试环境打开BODY级别日志!!!!
        //!!!生产或者测试环境建议设置为这三种级别:NONE,BASIC,HEADERS,!!!
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS);
        OkHttpClient okHttpClient = new OkHttpClient
                .Builder()
                //.proxy(proxy)
                .addInterceptor(httpLoggingInterceptor)
                .addInterceptor(interceptor)
                //.addInterceptor(new OpenAiResponseInterceptor())
                .connectTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .build();

经过debug观察发现使用一个欠费的key返回的信息如下:

  "message": "You exceeded your current quota, please check your plan and billing details.",
  "type": "insufficient_quota",

而代码里边只处理了:账号被封了、 key不正确

    /**
     * 账号被封了
     */
    private static final String ACCOUNT_DEACTIVATED = "account_deactivated";
    /**
     * key不正确
     */
    private static final String INVALID_API_KEY = "invalid_api_key";

    //账号被封或者key不正确就移除掉
    if (ACCOUNT_DEACTIVATED.equals(errorCode) || INVALID_API_KEY.equals(errorCode)) {
        super.setApiKey(this.onErrorDealApiKeys(key));
    }
    throw new BaseException(openAiResponse.getError().getMessage());

如果想要添加自动处理欠费key的逻辑是不是在上面添加一个 insufficient_quot errorcode处理就可以了

Grt1228 commented 1 year ago

@livghit 可以自定义实现OpenAiAuthInterceptor即可,参考DynamicKeyOpenAiAuthInterceptor 。