Skip to content

Commit

Permalink
@select添加"[选项名]选项内容"语法;修复从设置界面返回时模板@network失效问题;修复\r导致模板参数识别失败问题;版本号更…
Browse files Browse the repository at this point in the history
…新为1.9.1
  • Loading branch information
Skythinker616 committed Dec 22, 2023
1 parent a58665e commit 0944244
Show file tree
Hide file tree
Showing 9 changed files with 68 additions and 15 deletions.
20 changes: 18 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -283,8 +283,8 @@ A: 为防止滥用,仓库中的Key开启了包名和签名验证,因此如

| 机型 | 系统版本 | Android 版本 | 本程序版本 |
| :--: | :-----: | :----------: | :-------: |
| 荣耀 7C | EMUI 8.0.0 | Android 8 | 1.9.0 |
| 荣耀 20 | HarmonyOS 3.0.0 | Android 10 | 1.9.0 |
| 荣耀 7C | EMUI 8.0.0 | Android 8 | 1.9.1 |
| 荣耀 20 | HarmonyOS 3.0.0 | Android 10 | 1.9.1 |
| 华为 Mate 30 | HarmonyOS 3.0.0 | Android 12 | 1.6.0 |
| 华为 Mate 30 | HarmonyOS 4.0 | Android 12 | 1.8.0 |
| 荣耀 Magic 4 | MagicOS 7.0 | Android 13 | 1.2.0 |
Expand All @@ -310,3 +310,19 @@ A: 为防止滥用,仓库中的Key开启了包名和签名验证,因此如

- [Markwon](https://github.com/noties/Markwon): Android上的Markdown渲染器
- [chatgpt-java](https://github.com/Grt1228/chatgpt-java): OpenAI API的Java封装

---

## 捐赠

<details>
<summary>点击展开</summary>

<p>开发和维护本项目花费了很多时间和精力,如果你觉得本项目对你有帮助,可以请我喝杯奶茶,非常感谢你的支持!</p>

<div align="center">
<img src="readme_img/wechat.png" height="180px">
<img src="readme_img/alipay.jpg" height="180px">
</div>

</details>
2 changes: 1 addition & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ android {
minSdk 26
targetSdk 32
versionCode 1
versionName "1.9.0"
versionName "1.9.1"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public static void saveAsrInfo(boolean useBaidu, String appId, String apiKey, St
}

public static void loadGptApiInfo() {
gptApiHost = sp.getString("gpt_api_host", "");
gptApiHost = sp.getString("gpt_api_host", "https://api.openai.com/");
gptApiKey = sp.getString("gpt_api_key", "");
gptModel = sp.getString("gpt_model", "gpt-3.5-turbo");
customModels = new ArrayList<>(Arrays.asList(sp.getString("custom_models", "gpt-4-1106-preview;gpt-4-vision-preview").split(";")));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -665,7 +665,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
setAsrClient("hms");
}

setNetworkEnabled(GlobalDataHolder.getEnableInternetAccess()); // 更新GPT联网设置
setNetworkEnabled(currentTemplateParams.getBool("network", GlobalDataHolder.getEnableInternetAccess())); // 更新GPT联网设置
} else if((requestCode == 1 || requestCode == 2) && resultCode == RESULT_OK) { // 从相册或相机返回
Uri uri = requestCode == 1 ? photoUri : data.getData(); // 获取图片Uri
try {
Expand Down Expand Up @@ -821,7 +821,11 @@ private void updateTemplateParamsView() {
sp.setPadding(0, 0, 0, 0);
sp.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1));
sp.setPopupBackgroundDrawable(ContextCompat.getDrawable(this, R.drawable.spinner_dropdown_background));
List<String> options = new ArrayList<>(inputItem.getJSONArray("items").toList(String.class));
List<String> options = new ArrayList<>();
JSONArray itemsArray = inputItem.getJSONArray("items");
for(int i = 0; i < itemsArray.size(); i++) {
options.add(itemsArray.getJSONObject(i).getStr("name"));
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.param_spinner_item, options) {
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
Expand Down
39 changes: 33 additions & 6 deletions app/src/main/java/com/skythinker/gptassistant/PromptTabData.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,14 +52,24 @@ public JSONObject parseParams() {
params.putOpt(name, value);
} else if (Arrays.asList("system", "speak", "chat", "network").contains(name)) { // 布尔型参数
params.putOpt(name, value.equals("true"));
} else if (name.equals("input")) { // 输入型参数
} else if (name.equals("input")) { // 输入型参数 {inputName: {type: "text"}}
inputObject.putOpt(value, new JSONObject().putOpt("type", "text"));
} else if (name.equals("select")) { // 选择型参数
} else if (name.equals("select")) { // 选择型参数 {selectName: {type: "select", items: [{name: "name1", value: "item1"}]}}
String[] selectParams = value.split("\\|");
if (selectParams.length > 0) {
JSONArray itemsArray = new JSONArray();
for (int i = 1; i < selectParams.length; i++) {
itemsArray.put(selectParams[i].trim());
String item = selectParams[i].trim();
JSONObject itemObject = new JSONObject();
Matcher itemMatcher = Pattern.compile("^\\[(.*?)\\](.*?)$").matcher(item);
if (itemMatcher.find()) {
itemObject.putOpt("name", itemMatcher.group(1));
itemObject.putOpt("value", itemMatcher.group(2));
} else {
itemObject.putOpt("name", item);
itemObject.putOpt("value", item);
}
itemsArray.put(itemObject);
}
inputObject.putOpt(selectParams[0].trim(), new JSONObject().putOpt("type", "select").putOpt("items", itemsArray));
}
Expand All @@ -83,10 +93,27 @@ public String getContentWithoutParams() {
}

// 将参数填充到模板中
public String getFormattedPrompt(JSONObject params) {
public String getFormattedPrompt(JSONObject inputValues) {
JSONObject inputParams = parseParams().getJSONObject("input");
String template = getContentWithoutParams();
for(String key : params.keySet()) {
template = template.replace("${" + key + "}", params.getStr(key));
if (inputParams != null) {
for (String key : inputValues.keySet()) {
JSONObject paramObject = inputParams.getJSONObject(key);
if(paramObject != null) {
if(paramObject.getStr("type").equals("select")) {
JSONArray items = paramObject.getJSONArray("items");
for (int i = 0; i < items.size(); i++) {
JSONObject item = items.getJSONObject(i);
if (item.getStr("name").equals(inputValues.getStr(key))) {
template = template.replace("${" + key + "}", item.getStr("value"));
break;
}
}
} else if(paramObject.getStr("type").equals("text")) {
template = template.replace("${" + key + "}", inputValues.getStr(key));
}
}
}
}
return template;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ protected void onCreate(Bundle savedInstanceState) {
Intent intent = new Intent();
intent.putExtra("ok", true);
intent.putExtra("title", etTitle.getText().toString());
intent.putExtra("prompt", etPrompt.getText().toString());
intent.putExtra("prompt", etPrompt.getText().toString().replaceAll("\\r", ""));
setResult(RESULT_OK, intent);
finish();
});
Expand Down
Binary file added readme_img/alipay.jpg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added readme_img/wechat.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 8 additions & 2 deletions template_help.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# 模板编写说明

> 注:在查看本文档前,请先将软件更新到最新版本。
## 基础模板

一个对话模板由标题和内容两部分组成,标题部分用于显示在主界面下方的选择按钮上,当用户发送问题时,输入的提问将会与所选中的模板合并后发送给GPT模型。
Expand Down Expand Up @@ -66,11 +68,15 @@
| `@select` | `选框名\|选项1\|选项2\|...` | 添加一个下拉选框,选中项会替换到占位符`${选框名}`|
| `@input` | `输入框名` | 添加一个文本输入框,输入的内容会替换到占位符`${输入框名}`|

此外,`@select`的每个选项可以在前面添加一个`[选项名]`(即`[选项名]选项内容`),在下拉选框中显示的是选项名,发送问题时替换到占位符中的则是选项内容。

### 注意事项

- 设置为`system`角色后,`${input}`占位符将会失效,用户输入的问题会以`user`角色跟在模板内容后方发送
- 如果设置了`@model``@speak``@network``@chat`参数,软件全局设置的对应项将会暂时失效,而采用所设置的值
- 注意选框名和输入框名不要设置为`input`,这会导致原有`${input}`占位符失效
- 如果设置了`@model``@speak``@network``@chat`参数,在选中该模板时,软件全局设置的对应项将会暂时失效,而采用所设置的值
- 选框名和输入框名不要设置为`input`,这会导致原有`${input}`占位符失效
- 选框名和输入框名不要重名,否则靠后的会覆盖前面的
- 连续对话过程中修改下拉选项或输入框内容,新的内容不会再次替换到占位符中

## 社区交流

Expand Down

0 comments on commit 0944244

Please sign in to comment.