Skip to content

Commit deb5e69

Browse files
committed
update 配置开启上下文;配置选择GPT模型;修改小助手昵称
1 parent 35537ee commit deb5e69

File tree

12 files changed

+352
-41
lines changed

12 files changed

+352
-41
lines changed

app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ android {
99
applicationId "org.yameida.asrassistant"
1010
minSdkVersion 24
1111
targetSdkVersion 30
12-
versionCode 2561
13-
versionName "2.5.6"
12+
versionCode 1201
13+
versionName "1.2.1"
1414
}
1515

1616
buildTypes {

app/src/main/java/org/yameida/asrassistant/activity/ChatActivity.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import org.yameida.asrassistant.R
1818
import org.yameida.asrassistant.utils.AsrUtil
1919
import org.yameida.asrassistant.utils.HttpUtil
2020
import org.yameida.asrassistant.adapter.MyPagerAdapter
21+
import org.yameida.asrassistant.config.Config
2122
import org.yameida.asrassistant.model.ChatMessageBean
2223
import java.text.SimpleDateFormat
2324
import java.util.*
@@ -42,7 +43,7 @@ class ChatActivity : FragmentActivity() {
4243
addData(ChatMessageBean(ChatMessageBean.TYPE_SYSTEM, null, null, sdf.format(Date())))
4344
}
4445
addData(ChatMessageBean(ChatMessageBean.TYPE_SEND, "", "", result))
45-
val receivedMessage = ChatMessageBean(ChatMessageBean.TYPE_RECEIVED, "小助手", "", "请稍等...")
46+
val receivedMessage = ChatMessageBean(ChatMessageBean.TYPE_RECEIVED, Config.assistantName, "", "请稍等...")
4647
addData(receivedMessage)
4748
lastFragment?.rv_chat?.scrollToPosition(mData.size - 1)
4849
lastFragment?.rv_chat?.clearOnScrollListeners()
@@ -70,7 +71,14 @@ class ChatActivity : FragmentActivity() {
7071
}
7172
initView()
7273
requestAudioPermission()
73-
startActivity(Intent(this, ConfigActivity::class.java))
74+
if (Config.apiKey.isNullOrEmpty()) {
75+
startActivity(Intent(this, ConfigActivity::class.java))
76+
}
77+
}
78+
79+
override fun onResume() {
80+
super.onResume()
81+
tv_title.text = Config.assistantName
7482
}
7583

7684
private fun requestAudioPermission() {
@@ -129,7 +137,7 @@ class ChatActivity : FragmentActivity() {
129137
addData(ChatMessageBean(ChatMessageBean.TYPE_SYSTEM, null, null, sdf.format(Date())))
130138
}
131139
addData(ChatMessageBean(ChatMessageBean.TYPE_SEND, "", "", result))
132-
val receivedMessage = ChatMessageBean(ChatMessageBean.TYPE_RECEIVED, "小助手", "", "请稍等...")
140+
val receivedMessage = ChatMessageBean(ChatMessageBean.TYPE_RECEIVED, Config.assistantName, "", "请稍等...")
133141
addData(receivedMessage)
134142
lastFragment?.rv_chat?.scrollToPosition(mData.size - 1)
135143
lastFragment?.rv_chat?.clearOnScrollListeners()
@@ -156,7 +164,9 @@ class ChatActivity : FragmentActivity() {
156164
}
157165
chat_content.text.clear()
158166
}
159-
167+
ll_settings.setOnClickListener {
168+
startActivity(Intent(this, ConfigActivity::class.java))
169+
}
160170
}
161171

162172
}

app/src/main/java/org/yameida/asrassistant/activity/ConfigActivity.kt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ package org.yameida.asrassistant.activity
33
import android.content.Intent
44
import android.os.Bundle
55
import android.text.InputType
6+
import android.widget.CompoundButton
67
import androidx.fragment.app.FragmentActivity
8+
import com.blankj.utilcode.util.LogUtils
79
import com.blankj.utilcode.util.ToastUtils
810
import com.qmuiteam.qmui.widget.dialog.QMUIDialog
911
import kotlinx.android.synthetic.main.activity_config.*
1012
import org.yameida.asrassistant.R
1113
import org.yameida.asrassistant.config.Config
1214
import org.yameida.asrassistant.utils.DonateUtil
15+
import org.yameida.asrassistant.utils.HttpUtil
1316
import org.yameida.asrassistant.utils.ShareUtil
1417

1518

@@ -23,14 +26,22 @@ class ConfigActivity : FragmentActivity() {
2326

2427
private fun initView() {
2528
rl_api_key.setOnClickListener { showCorpIdDialog() }
29+
rl_assistant_name.setOnClickListener { showRenameDialog() }
30+
rl_gpt_model.setOnClickListener { showModelDialog() }
2631
rl_donate.setOnClickListener { showDonateDialog() }
2732
rl_share.setOnClickListener { showShareDialog() }
33+
sw_use_context.isChecked = Config.useContext
34+
sw_use_context.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->
35+
LogUtils.i("sw_use_context onCheckedChanged: $isChecked")
36+
Config.useContext = isChecked
37+
})
2838
}
2939

3040
private fun showCorpIdDialog() {
3141
val builder = QMUIDialog.EditTextDialogBuilder(this)
3242
builder.setTitle("API_KEY")
3343
.setDefaultText(Config.apiKey)
44+
.setPlaceholder("sk-xxxxxx")
3445
.setInputType(InputType.TYPE_CLASS_TEXT)
3546
.addAction(getString(R.string.cancel)) { dialog, index -> dialog.dismiss() }
3647
.addAction(getString(R.string.confirm)) { dialog, index ->
@@ -45,6 +56,45 @@ class ConfigActivity : FragmentActivity() {
4556
.create(R.style.QMUI_Dialog).show()
4657
}
4758

59+
private fun showRenameDialog() {
60+
val builder = QMUIDialog.EditTextDialogBuilder(this)
61+
builder.setTitle("昵称")
62+
.setDefaultText(Config.assistantName)
63+
.setPlaceholder("请输入昵称")
64+
.setInputType(InputType.TYPE_CLASS_TEXT)
65+
.addAction(getString(R.string.cancel)) { dialog, index -> dialog.dismiss() }
66+
.addAction(getString(R.string.confirm)) { dialog, index ->
67+
val text = builder.editText.text
68+
if (text != null) {
69+
dialog.dismiss()
70+
Config.assistantName = text.toString().trim()
71+
} else {
72+
ToastUtils.showLong("请勿为空!")
73+
}
74+
}
75+
.create(R.style.QMUI_Dialog).show()
76+
}
77+
78+
private fun showModelDialog() {
79+
val builder = QMUIDialog.EditTextDialogBuilder(this)
80+
builder.setTitle("GPT模型")
81+
.setDefaultText(Config.gptModel)
82+
.setPlaceholder("请输入GPT模型")
83+
.setInputType(InputType.TYPE_CLASS_TEXT)
84+
.addAction(getString(R.string.cancel)) { dialog, index -> dialog.dismiss() }
85+
.addAction(getString(R.string.confirm)) { dialog, index ->
86+
val text = builder.editText.text
87+
if (text != null) {
88+
dialog.dismiss()
89+
Config.gptModel = text.toString().trim()
90+
HttpUtil.gptRequestJson["model"] = Config.gptModel
91+
} else {
92+
ToastUtils.showLong("请勿为空!")
93+
}
94+
}
95+
.create(R.style.QMUI_Dialog).show()
96+
}
97+
4898
private fun showDonateDialog() {
4999
DonateUtil.zfbDonate(this)
50100
}

app/src/main/java/org/yameida/asrassistant/config/Config.kt

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,35 @@ object Config {
88
* input your ChatGPT ApiKey
99
*/
1010
var apiKey: String
11-
get() = SPUtils.getInstance().getString("apiKey", "sk-")
11+
get() = SPUtils.getInstance().getString("apiKey", "")
1212
set(value) {
1313
SPUtils.getInstance().put("apiKey", value)
1414
}
15+
16+
/**
17+
* 小助手昵称
18+
*/
19+
var assistantName: String
20+
get() = SPUtils.getInstance().getString("assistantName", "小助手")
21+
set(value) {
22+
SPUtils.getInstance().put("assistantName", value)
23+
}
24+
25+
/**
26+
* 开启上下文
27+
*/
28+
var useContext: Boolean
29+
get() = SPUtils.getInstance().getBoolean("useContext", true)
30+
set(value) {
31+
SPUtils.getInstance().put("useContext", value)
32+
}
33+
34+
/**
35+
* GPT模型
36+
*/
37+
var gptModel: String
38+
get() = SPUtils.getInstance().getString("gptModel", "gpt-3.5-turbo-16k")
39+
set(value) {
40+
SPUtils.getInstance().put("gptModel", value)
41+
}
1542
}

app/src/main/java/org/yameida/asrassistant/model/Message.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package org.yameida.asrassistant.model;
22

3-
/**
4-
* @author genxm
5-
*/
63
public class Message {
74

85
public String id;

app/src/main/java/org/yameida/asrassistant/utils/HttpUtil.kt

Lines changed: 46 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,40 @@ package org.yameida.asrassistant.utils
33
import com.blankj.utilcode.util.GsonUtils
44
import com.blankj.utilcode.util.LogUtils
55
import com.blankj.utilcode.util.ToastUtils
6-
import com.google.gson.JsonObject
76
import okhttp3.*
87
import org.yameida.asrassistant.config.Config
98
import org.yameida.asrassistant.model.Message
109
import org.yameida.asrassistant.model.StreamAiAnswer
1110
import java.io.BufferedReader
1211
import java.io.IOException
1312
import java.lang.Exception
13+
import kotlin.collections.ArrayList
1414

1515

1616
object HttpUtil {
1717

18+
val history: ArrayList<Message> = arrayListOf()
19+
val gptRequestJson = hashMapOf(
20+
Pair("model", "gpt-3.5-turbo-16k"),
21+
Pair("stream", true),
22+
Pair("messages", history)
23+
)
24+
1825
/**
1926
* ChatGPT
2027
*/
2128
fun chat(send: String, callback: CallBack) {
2229
val url = "http://proxy.chat.carlife.host/v1/chat/completions"
2330
val apiKey = "Bearer ${Config.apiKey}"
24-
val jsonObject = JsonObject()
25-
jsonObject.addProperty("model", "gpt-3.5-turbo")
26-
val body = RequestBody.create(MediaType.parse("application/json"), "{\n" +
27-
" \"model\": \"gpt-3.5-turbo\",\n" +
28-
" \"stream\": true,\n" +
29-
" \"messages\": [{\"role\": \"user\", \"content\": \"$send!\"}]\n" +
30-
"}")
31+
if (!Config.useContext) {
32+
history.clear()
33+
}
34+
history.add(Message().apply {
35+
role = "user"
36+
content = send
37+
})
38+
LogUtils.d("gptRequestJson", GsonUtils.toJson(gptRequestJson))
39+
val body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.toJson(gptRequestJson))
3140
val request: Request = Request.Builder().url(url).method("POST", body)
3241
.addHeader("Authorization", apiKey)
3342
.build()
@@ -40,6 +49,11 @@ object HttpUtil {
4049
try {
4150
val responseBody = response.body()
4251
if (responseBody != null) {
52+
val message = Message().apply {
53+
role = "assistant"
54+
content = ""
55+
}
56+
history.add(message)
4357
val bufferedReader = BufferedReader(responseBody.charStream())
4458
var line = bufferedReader.readLine()
4559
var index = 0
@@ -48,6 +62,7 @@ object HttpUtil {
4862
val msg = convert(line, "1", index++)
4963
if (msg != null) {
5064
sb.append(msg.content)
65+
message.content = sb.toString()
5166
callback.onCallBack(sb.toString(), false)
5267
}
5368
line = bufferedReader.readLine()
@@ -69,27 +84,32 @@ object HttpUtil {
6984
msg.id = questionId
7085
if ("data: [DONE]" != answer) {
7186
val beanStr = answer.replaceFirst("data: ", "", false)
72-
val aiAnswer = GsonUtils.fromJson(beanStr, StreamAiAnswer::class.java) ?: return null
73-
val choices = aiAnswer.choices
74-
if (choices.isEmpty()) {
75-
return null
76-
}
77-
val stringBuffer = StringBuffer()
78-
for (choice in choices) {
79-
if (choice.finish_reason != "stop") {
80-
if (choice.delta.content != null) {
81-
stringBuffer.append(choice.delta.content)
82-
} else {
83-
return null
87+
try {
88+
val aiAnswer =
89+
GsonUtils.fromJson(beanStr, StreamAiAnswer::class.java) ?: return null
90+
val choices = aiAnswer.choices
91+
if (choices.isEmpty()) {
92+
return null
93+
}
94+
val stringBuffer = StringBuffer()
95+
for (choice in choices) {
96+
if (choice.finish_reason != "stop") {
97+
if (choice.delta.content != null) {
98+
stringBuffer.append(choice.delta.content)
99+
} else {
100+
return null
101+
}
84102
}
85103
}
86-
}
87-
msg.content = stringBuffer.toString()
88-
if (index == 0) {
89-
if (msg.content == "\n\n") {
90-
LogUtils.e("发现开头有两次换行,移除两次换行")
91-
return null
104+
msg.content = stringBuffer.toString()
105+
if (index == 0) {
106+
if (msg.content == "\n\n") {
107+
LogUtils.e("发现开头有两次换行,移除两次换行")
108+
return null
109+
}
92110
}
111+
} catch (e: Exception) {
112+
e.printStackTrace()
93113
}
94114
} else {
95115
msg.type = "stop"
145 Bytes
Loading
616 Bytes
Loading
5.32 KB
Loading

app/src/main/res/layout/activity_chat.xml

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
android:layout_height="wrap_content"
3131
android:layout_centerVertical="true"
3232
android:layout_marginStart="10dp"
33-
android:src="@drawable/switch1283" />
33+
android:src="@drawable/switch__text_icon1" />
3434

3535
<RelativeLayout
3636
android:id="@+id/chat_bottom"
@@ -74,11 +74,62 @@
7474

7575
</RelativeLayout>
7676

77+
<RelativeLayout
78+
android:id="@+id/rl_bar"
79+
android:layout_width="match_parent"
80+
android:layout_height="50dp">
81+
82+
<TextView
83+
android:id="@+id/tv_title"
84+
android:layout_width="wrap_content"
85+
android:layout_height="wrap_content"
86+
android:layout_centerInParent="true"
87+
android:text="小气包"
88+
android:textColor="@color/black_text_color"
89+
android:textSize="@dimen/size_button" />
90+
91+
<LinearLayout
92+
android:id="@+id/ll_settings"
93+
android:layout_width="wrap_content"
94+
android:layout_height="wrap_content"
95+
android:layout_alignParentEnd="true"
96+
android:layout_centerVertical="true"
97+
android:layout_marginEnd="20dp">
98+
99+
<ImageView
100+
android:layout_width="wrap_content"
101+
android:layout_height="wrap_content"
102+
android:src="@drawable/wx_chat_icon2"/>
103+
104+
<ImageView
105+
android:layout_width="wrap_content"
106+
android:layout_height="wrap_content"
107+
android:layout_marginStart="3.5dp"
108+
android:src="@drawable/wx_chat_icon2"/>
109+
110+
<ImageView
111+
android:layout_width="wrap_content"
112+
android:layout_height="wrap_content"
113+
android:layout_marginStart="3.5dp"
114+
android:src="@drawable/wx_chat_icon2"/>
115+
116+
</LinearLayout>
117+
118+
<View
119+
android:layout_width="match_parent"
120+
android:layout_height="0.5dp"
121+
android:background="@color/list_divider_line"
122+
android:layout_alignParentBottom="true"
123+
/>
124+
125+
</RelativeLayout>
126+
77127
<androidx.viewpager.widget.ViewPager
78128
android:id="@+id/viewpager"
79129
android:layout_width="match_parent"
80130
android:layout_height="match_parent"
81-
android:layout_above="@id/rl_input">
131+
android:layout_above="@id/rl_input"
132+
android:layout_below="@id/rl_bar">
82133

83134
</androidx.viewpager.widget.ViewPager>
84135

0 commit comments

Comments
 (0)