238 lines
12 KiB
Java
238 lines
12 KiB
Java
|
package com.bifan.txtreaderlib.ui;
|
|||
|
|
|||
|
import android.content.Context;
|
|||
|
import android.content.SharedPreferences;
|
|||
|
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 androidx.annotation.Nullable;
|
|||
|
import androidx.appcompat.app.AppCompatActivity;
|
|||
|
import androidx.recyclerview.widget.LinearLayoutManager;
|
|||
|
import androidx.recyclerview.widget.RecyclerView;
|
|||
|
|
|||
|
import com.bifan.txtreaderlib.R;
|
|||
|
import com.bifan.txtreaderlib.adapter.MessageAdapter;
|
|||
|
import com.bifan.txtreaderlib.bean.ChatMessage_bmob;
|
|||
|
import com.bifan.txtreaderlib.bean.ChatRequest;
|
|||
|
import com.bifan.txtreaderlib.bean.ChatResponse;
|
|||
|
import com.bifan.txtreaderlib.bean.Message;
|
|||
|
import com.bifan.txtreaderlib.interfaces.ChatGPTService;
|
|||
|
|
|||
|
import org.json.JSONObject;
|
|||
|
|
|||
|
import java.io.IOException;
|
|||
|
import java.util.ArrayList;
|
|||
|
import java.util.List;
|
|||
|
import java.util.concurrent.TimeUnit;
|
|||
|
|
|||
|
import cn.bmob.v3.Bmob;
|
|||
|
import cn.bmob.v3.BmobQuery;
|
|||
|
import cn.bmob.v3.exception.BmobException;
|
|||
|
import cn.bmob.v3.listener.FindListener;
|
|||
|
import cn.bmob.v3.listener.SaveListener;
|
|||
|
import okhttp3.OkHttpClient;
|
|||
|
import retrofit2.Call;
|
|||
|
import retrofit2.Callback;
|
|||
|
import retrofit2.Response;
|
|||
|
import retrofit2.Retrofit;
|
|||
|
import retrofit2.converter.gson.GsonConverterFactory;
|
|||
|
|
|||
|
public class ChatWithGptActivity extends AppCompatActivity {
|
|||
|
private RecyclerView recyclerView;
|
|||
|
private MessageAdapter messageAdapter;
|
|||
|
private EditText editTextMessage;
|
|||
|
private TextView chatbot_title;
|
|||
|
private Button buttonSend;
|
|||
|
private String bookName = "";
|
|||
|
private String userid="";
|
|||
|
private ArrayList<Message> messageList = new ArrayList<>();
|
|||
|
|
|||
|
@Override
|
|||
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
|||
|
super.onCreate(savedInstanceState);
|
|||
|
setContentView(R.layout.activity_chatwithgpt);
|
|||
|
Bmob.initialize(this, "8f9f1d1ea520b0ce4f84a6fa83a5f754");
|
|||
|
if (getIntent() != null && getIntent().hasExtra("book_name")) {
|
|||
|
bookName = getIntent().getStringExtra("book_name");
|
|||
|
}
|
|||
|
SharedPreferences sharedPreferences = getSharedPreferences("userinf", Context.MODE_PRIVATE);
|
|||
|
String userIdFromPrefs = sharedPreferences.getString("user_id", "");
|
|||
|
userid = userIdFromPrefs != null ? userIdFromPrefs : "";
|
|||
|
|
|||
|
recyclerView = findViewById(R.id.chatRecyclerView);
|
|||
|
editTextMessage = findViewById(R.id.inputEditText);
|
|||
|
buttonSend = findViewById(R.id.sendButton);
|
|||
|
chatbot_title=findViewById(R.id.chatbot_title);
|
|||
|
messageAdapter = new MessageAdapter(messageList);
|
|||
|
recyclerView.setLayoutManager(new LinearLayoutManager(this));
|
|||
|
recyclerView.setAdapter(messageAdapter);
|
|||
|
init();
|
|||
|
buttonSend.setOnClickListener(new View.OnClickListener() {
|
|||
|
@Override
|
|||
|
public void onClick(View v) {
|
|||
|
String text = editTextMessage.getText().toString();
|
|||
|
if (!text.isEmpty()) {
|
|||
|
messageList.add(new Message(text, 1)); // User message
|
|||
|
messageAdapter.notifyItemInserted(messageList.size() - 1);
|
|||
|
recyclerView.scrollToPosition(messageList.size() - 1);
|
|||
|
editTextMessage.setText("");
|
|||
|
sendMessageToChatGPT(text);
|
|||
|
ChatMessage_bmob chatMessage_bmob=new ChatMessage_bmob(text,1,bookName,userid);
|
|||
|
chatMessage_bmob.save(new SaveListener<String>() {
|
|||
|
@Override
|
|||
|
public void done(String objectId,BmobException e) {
|
|||
|
if(e==null){
|
|||
|
// toast("添加数据成功,返回objectId为:"+objectId);
|
|||
|
}else{
|
|||
|
//toast("创建数据失败:" + e.getMessage());
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
private void init(){
|
|||
|
chatbot_title.setText(bookName);
|
|||
|
BmobQuery<ChatMessage_bmob> bmobQuery = new BmobQuery<>();
|
|||
|
bmobQuery.addWhereEqualTo("relatedBook", bookName);
|
|||
|
bmobQuery.addWhereEqualTo("userid", userid);
|
|||
|
bmobQuery.findObjects(new FindListener<ChatMessage_bmob>() {
|
|||
|
@Override
|
|||
|
public void done(List<ChatMessage_bmob> messages, BmobException e) {
|
|||
|
if (e == null && messages != null) {
|
|||
|
if (!messages.isEmpty()) {
|
|||
|
for (ChatMessage_bmob item : messages) {
|
|||
|
if (item.getContent() == null) {
|
|||
|
String content = "出现未知错误!";
|
|||
|
messageList.add(new Message(content, item.getIsuser()));
|
|||
|
} else {
|
|||
|
messageList.add(new Message(item.getContent(), item.getIsuser()));
|
|||
|
}
|
|||
|
}
|
|||
|
} else {
|
|||
|
// 如果没有消息,添加一条 bot 的欢迎消息
|
|||
|
String welcomeMessage = "你好!我是你的阅读助手。我可以帮助你解答关于书籍的各种问题,比如内容概述、作者信息、主要主题和角色分析等。请随时向我提问,现在,你有什么关于《" + bookName + "》的问题吗?";
|
|||
|
messageList.add(new Message(welcomeMessage, 0)); // 假设 0 表示系统或助手消息
|
|||
|
ChatMessage_bmob chatMessage_bmob=new ChatMessage_bmob(welcomeMessage,0,bookName,userid);
|
|||
|
chatMessage_bmob.save(new SaveListener<String>() {
|
|||
|
@Override
|
|||
|
public void done(String objectId,BmobException e) {
|
|||
|
if(e==null){
|
|||
|
// toast("添加数据成功,返回objectId为:"+objectId);
|
|||
|
}else{
|
|||
|
//toast("创建数据失败:" + e.getMessage());
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
}
|
|||
|
messageAdapter.notifyDataSetChanged();
|
|||
|
} else {
|
|||
|
Log.e("BookInfo", "Error loading book info: " + (e != null ? e.getMessage() : ""));
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 从数据库加载历史对话并构建消息列表
|
|||
|
*/
|
|||
|
private List<ChatRequest.Message> loadMessagesFromDatabase(String bookName, String userId) {
|
|||
|
List<ChatRequest.Message> messages = new ArrayList<>();
|
|||
|
BmobQuery<ChatMessage_bmob> bmobQuery = new BmobQuery<>();
|
|||
|
bmobQuery.addWhereEqualTo("relatedBook", bookName);
|
|||
|
bmobQuery.addWhereEqualTo("userid", userId);
|
|||
|
bmobQuery.order("createdAt");
|
|||
|
bmobQuery.setLimit(10); //设置上下文最多10条历史对话
|
|||
|
bmobQuery.findObjects(new FindListener<ChatMessage_bmob>() {
|
|||
|
@Override
|
|||
|
public void done(List<ChatMessage_bmob> chatMessages, BmobException e) {
|
|||
|
if (e == null && chatMessages != null && !chatMessages.isEmpty()) {
|
|||
|
for (ChatMessage_bmob item : chatMessages) {
|
|||
|
// 根据消息来源判断角色,假设 0 表示用户,1 表示助手
|
|||
|
String role = item.getIsuser() == 0 ? "user" : "assistant";
|
|||
|
messages.add(new ChatRequest.Message(role, item.getContent()));
|
|||
|
Log.d("test",item.getContent());
|
|||
|
}
|
|||
|
} else {
|
|||
|
Log.e("BookInfo", "Error loading book info: " + (e != null ? e.getMessage() : "No error details."));
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
return messages;
|
|||
|
}
|
|||
|
|
|||
|
private void sendMessageToChatGPT(String messageText) {
|
|||
|
OkHttpClient client = new OkHttpClient.Builder()
|
|||
|
.connectTimeout(60, TimeUnit.SECONDS)
|
|||
|
.readTimeout(60, TimeUnit.SECONDS)
|
|||
|
.writeTimeout(60, TimeUnit.SECONDS)
|
|||
|
.build();
|
|||
|
Retrofit retrofit = new Retrofit.Builder()
|
|||
|
.client(client)
|
|||
|
.baseUrl("https://api.openai-ch.top/")
|
|||
|
.addConverterFactory(GsonConverterFactory.create())
|
|||
|
.build();
|
|||
|
ChatGPTService service = retrofit.create(ChatGPTService.class);
|
|||
|
List<ChatRequest.Message> messages = new ArrayList<>();
|
|||
|
String prompt = "你好!我是你的阅读助手。我可以帮助你解答关于书籍的各种问题,比如内容概述、作者信息、主要主题和角色分析等。请随时向我提问,我会用中文简体来回答你。现在,你有什么关于《" + bookName + "》的问题吗?";
|
|||
|
messages.add(new ChatRequest.Message("system", prompt));
|
|||
|
|
|||
|
// messages.add(new ChatRequest.Message("system", "You are a reading assistant. The user will ask you questions about the book '" + bookName + "'."));
|
|||
|
messages.addAll(loadMessagesFromDatabase(bookName, userid));
|
|||
|
messages.add(new ChatRequest.Message("user", messageText)); // 添加用户消息
|
|||
|
|
|||
|
ChatRequest request = new ChatRequest(messages); // 使用消息列表创建请求
|
|||
|
request.setModel("gpt-4-turbo"); // 根据需要选择不同的模型
|
|||
|
request.setMaxTokens(200); // 设置最大 token 数,根据需要调整
|
|||
|
request.setTemperature(0.5); // 设置适当的温度
|
|||
|
service.postMessage(request).enqueue(new Callback<ChatResponse>() {
|
|||
|
@Override
|
|||
|
public void onResponse(Call<ChatResponse> call, Response<ChatResponse> response) {
|
|||
|
if (response.isSuccessful() && response.body() != null) {
|
|||
|
ChatResponse chatResponse = response.body();
|
|||
|
if (chatResponse.choices != null && !chatResponse.choices.isEmpty()) {
|
|||
|
ChatResponse.Message message = chatResponse.choices.get(0).message;
|
|||
|
String reply = message.content; // 这是从 GPT-3.5 响应中提取的内容
|
|||
|
runOnUiThread(() -> {
|
|||
|
messageList.add(new Message(reply, 0));
|
|||
|
messageAdapter.notifyItemInserted(messageList.size() - 1);
|
|||
|
recyclerView.scrollToPosition(messageList.size() - 1);
|
|||
|
ChatMessage_bmob chatMessage_bmob = new ChatMessage_bmob(reply, 0, bookName, userid);
|
|||
|
chatMessage_bmob.save(new SaveListener<String>() {
|
|||
|
@Override
|
|||
|
public void done(String objectId, BmobException e) {
|
|||
|
if (e == null) {
|
|||
|
// toast("添加数据成功,返回objectId为:" + objectId);
|
|||
|
} else {
|
|||
|
// toast("创建数据失败:" + e.getMessage());
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
} else {
|
|||
|
try {
|
|||
|
String errorBody = response.errorBody() != null ? response.errorBody().string() : "Unknown error";
|
|||
|
Log.e("ChatGPT", "Error: " + errorBody);
|
|||
|
} catch (IOException e) {
|
|||
|
Log.e("ChatGPT", "Error reading error body", e);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
@Override
|
|||
|
public void onFailure(Call<ChatResponse> call, Throwable t) {
|
|||
|
Log.e("ChatGPT", "Failure: " + t.getMessage());
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|