我正在尝试通过实现异步任务在 android (java) 中流式传输 chatgpt api 的响应(逐字),但我得到一个错误

问题描述 投票:0回答:2

我正在尝试通过实现异步任务在 android (java) 中流式传输 chatgpt api 的响应(逐字),但我收到错误。我正在将 java 的 HTTPurlconnection 库与输入和输出流一起使用,以便我可以像在其原始界面中一样流式传输 chatgpt 的响应,但我收到一个错误:虽然 api 密钥是正确的,但您还没有提供 API 密钥,因为它与 android kotlin volley 库一起使用。我哪里错了?请帮助这个代码

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.facebook.ads.AdView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class gpt extends AppCompatActivity {
EditText queryt;
TextView question;
TextView response1;
AdView mAdview;
Button queryb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gpt);

        response1 = findViewById(R.id.idTVResponse2);
        question = findViewById(R.id.idTVQuestion2);

        queryt = findViewById(R.id.edit_query2);
        queryb = findViewById(R.id.buttonPanel2);
        //ChatGPTTask GPT = new ChatGPTTask();
        queryb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ChatGPTTask GPT = new ChatGPTTask();
                GPT.execute(queryt.getText().toString());
                queryt.setText("");
            }
        });
    }

    public class ChatGPTTask extends AsyncTask<String, String, Void> {
        private final String TAG = ChatGPTTask.class.getSimpleName();

 private final String API_URL = "https://api.openai.com/v1/completions";
        //private final String API_KEY =API_KEY
        

        @Override
        protected void onPostExecute(Void unused) {
            super.onPostExecute(unused);


        }

       



        @Override
        protected Void doInBackground(String... strings) {


            try {
                String prompt = strings[0];
               
                URL url = new URL(API_URL);
                Log.d(TAG, "Authorization Header: " +url);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                Log.d(TAG, "Authorization Header: " +conn);
                conn.setRequestMethod("POST");
                String authHeader = "Bearer API_KEY";
                conn.setConnectTimeout(5000);

            

                conn.setRequestProperty("Content-Type", "application/json");
                conn.setRequestProperty("Authorization", authHeader);

                conn.setDoOutput(true);
                Log.d(TAG, "Authorization Header: " + authHeader);
                String requestBody = "{\n" +
                        "    \"model\": \"text-davinci-003\",\n" +
                        "    \"prompt\": \"" + prompt + "\",\n" +
                        "    \"max_tokens\": 1000,\n" +
                        "    \"temperature\": 0.0,\n" +
                        "    \"top_p\": 1,\n" +
                        "    \"frequency_penalty\": 0.0,\n" +
                        //"    \"n\": 1,\n" +
                        //"    \"stop\": \"\\n\"\n" +
                        "    \"presence_penalty\": 0.0,\n" +
                        "}";

                conn.getOutputStream().write(requestBody.getBytes(StandardCharsets.UTF_8));
               
                InputStream inputStream = conn.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    publishProgress(line);
                }

                bufferedReader.close();
                inputStream.close();
                conn.disconnect();
            } catch (IOException e) {
                Log.e(TAG, "Error: " + e.getMessage());
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(String... values) {
            String response = values[0];
            response1.append(response);
            // TODO: handle ChatGPT's response here
            Log.d(TAG, "Response: " + response);
        }
    }
}type here

我试图获取响应并将其逐行附加到文本视图中,就像在 chatgpt 界面中一样,它如何实现服务器发送的事件,但实际上在初步的基础上,它返回一个错误,指出我没有提供 API 密钥,尽管格式为API 密钥输入正确并且密钥本身有效,因为我已经在不同的应用程序中测试了密钥并且它在那里工作。

我从 url 得到的错误:

{
    "error": {
        "message": "You didn't provide an API key. You need to provide your API key in an Authorization header using Bearer auth (i.e. Authorization: Bearer YOUR_KEY), or as the password field (with blank username) if you're accessing the API from your browser and are prompted for a username and password. You can obtain an API key from https://platform.openai.com/account/api-keys.",
        "type": "invalid_request_error",
        "param": null,
        "code": null
    }
}
java android httpurlconnection openai-api java-http-client
2个回答
0
投票

关于错误消息,首先仔细检查您是否已从 https://platform.openai.com/account/api-keys.

获得 OpenAI API 密钥

关于使用的模型,根据https://platform.openai.com/docs/api-reference/chat/create使用“ChatGPT API”(聊天完成),要使用的模型是

  • gpt-3.5-turbo
  • gpt-3.5-turbo-0301
    ,

不是

text-davinci-003
因为这个模型是用于 text completionments.

在您决定使用的模型的任何情况下,您可能首先使用正确的端点和参数验证对 OpenAI API 的 http 请求是否正常工作,即使用 curl。一旦你让它工作,那么可能会专注于在你的 Java 代码中实现这个调用。

参考文献


0
投票

首先,您应该生成一个由https://platform.openai.com/account/api-keys生成的api密钥。

其次,您应该在发布请求时使用此 api 密钥。

第三,对于此功能,您应该使用模式 gpt-3.5-turbo 或 gpt-3.5-turbo-0301 而不是 text-davinci-003。

© www.soinside.com 2019 - 2024. All rights reserved.