增加星火大模型的model按钮;修改配置文件的字段;更改部分逻辑过程。现在大模型的类型也可以选择了。

This commit is contained in:
2024-09-19 19:56:55 +08:00
parent 8438091990
commit a217b7c06b
6 changed files with 195 additions and 33 deletions

View File

@@ -12,7 +12,7 @@ android {
minSdk = 28
targetSdk = 34
versionCode = 1
versionName = "1.0"
versionName = "1.1"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {

View File

@@ -1,5 +1,6 @@
package com.example.flomo_ai
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.view.Gravity
@@ -81,6 +82,7 @@ fun extractLabels(responseBody: String): List<String>? {
} catch (e: Exception) {
e.printStackTrace()
Log.e("ExtractLabels", "Error during extraction: ${e.message}")
}
return null
}
@@ -89,11 +91,14 @@ class MainActivity : AppCompatActivity() {
private lateinit var inputEditText: EditText
private lateinit var configButton: Button
private lateinit var submitToAIButton: Button
private lateinit var submitToZhiPuAIButton: Button
private lateinit var submitToSparkAIButton: Button
private lateinit var tabLayout: TabLayout
private lateinit var submitToServerButton: Button
private lateinit var statusText: TextView
@SuppressLint("MissingInflatedId")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
@@ -102,10 +107,11 @@ class MainActivity : AppCompatActivity() {
inputEditText.gravity = Gravity.START or Gravity.TOP
configButton = findViewById(R.id.configButton)
submitToAIButton = findViewById(R.id.submitToAIButton)
// 状态栏目的信息
statusText = findViewById<TextView>(R.id.statusTextView)
submitToAIButton.setOnClickListener {
submitToZhiPuAIButton = findViewById(R.id.submitToZhiPuAIButton)
submitToZhiPuAIButton.setOnClickListener {
// 创建 OkHttpClient点击智谱AI分析返回标签
val client = OkHttpClient.Builder()
.addInterceptor(object : Interceptor {
@@ -124,23 +130,12 @@ class MainActivity : AppCompatActivity() {
val combinedText =
"$textFromEditText。请为以上文章分析并给出 4 个最合理的标签,没有其他内容。以 JSON 格式输出,格式为 labels: [标签 1, 标签 2, 标签 3, 标签 4]"
val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
val jsonAdapter = moshi.adapter(ChatRequest::class.java)
val requestBody = ChatRequest(
model = "glm-4-flash",
messages = listOf(Message(role = "user", content = combinedText))
)
val requestBodyJson = jsonAdapter.toJson(requestBody)
val mediaType = "application/json; charset=utf-8".toMediaType()
val body = requestBodyJson.toRequestBody(mediaType)
// 从配置中读取 api_key
val sharedPrefs = getSharedPreferences("APIConfigs", MODE_PRIVATE)
val allConfigsJson = sharedPrefs.getString("configs", null)
var api_key = ""
var api_url = ""
var api_model = "glm-4-flash"
if (allConfigsJson != null) {
val type = object : TypeToken<List<APIConfig>>() {}.type
val allConfigs = Gson().fromJson<List<APIConfig>>(allConfigsJson, type)
@@ -149,9 +144,26 @@ class MainActivity : AppCompatActivity() {
if (zhipuConfig != null) {
api_key = zhipuConfig.key
api_url = zhipuConfig.url
api_model = zhipuConfig.model
statusText.text = "zhipuConfig配置文件$api_model"
} else {
statusText.text = "没找到zhipuConfig配置文件"
}
}
val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
val jsonAdapter = moshi.adapter(ChatRequest::class.java)
val requestBody = ChatRequest(
model = api_model.toString(),
messages = listOf(Message(role = "user", content = combinedText))
)
val requestBodyJson = jsonAdapter.toJson(requestBody)
val mediaType = "application/json; charset=utf-8".toMediaType()
val body = requestBodyJson.toRequestBody(mediaType)
// 创建请求
val request = Request.Builder()
.url("$api_url")
@@ -206,6 +218,114 @@ class MainActivity : AppCompatActivity() {
}
}
submitToSparkAIButton = findViewById(R.id.submitToSparkAIButton)
submitToSparkAIButton.setOnClickListener {
// 创建 OkHttpClient点击星火大模型分析返回标签
val client = OkHttpClient.Builder()
.addInterceptor(object : Interceptor {
override fun intercept(chain: Interceptor.Chain): okhttp3.Response {
val originalRequest = chain.request()
val newRequest = originalRequest.newBuilder().build()
return chain.proceed(newRequest)
}
})
.build()
// 假设这是一个 EditText 元素
val inputEditText = findViewById<EditText>(R.id.inputEditText)
// 获取 EditText 中的文本内容创建request的body
val textFromEditText = inputEditText.text.toString()
val combinedText =
"$textFromEditText。请为以上文章分析并给出 4 个最合理的标签,没有其他内容。以 JSON 格式输出,格式为 labels: [标签 1, 标签 2, 标签 3, 标签 4]"
// 从配置中读取 api_key
val sharedPrefs = getSharedPreferences("APIConfigs", MODE_PRIVATE)
val allConfigsJson = sharedPrefs.getString("configs", null)
var api_key = ""
var api_url = ""
var api_model = "general"
if (allConfigsJson != null) {
val type = object : TypeToken<List<APIConfig>>() {}.type
val allConfigs = Gson().fromJson<List<APIConfig>>(allConfigsJson, type)
val sparkConfig = allConfigs.find { it.name == "spark" }
if (sparkConfig != null) {
api_key = sparkConfig.key
api_url = sparkConfig.url
api_model = sparkConfig.model
statusText.text = "sparkConfig配置文件$api_model"
} else {
statusText.text = "没找到sparkConfig配置文件"
}
}
// 配置 body的内容
val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
val jsonAdapter = moshi.adapter(ChatRequest::class.java)
val requestBody = ChatRequest(
model = api_model.toString(),
messages = listOf(Message(role = "user", content = combinedText))
)
val requestBodyJson = jsonAdapter.toJson(requestBody)
val mediaType = "application/json; charset=utf-8".toMediaType()
val body = requestBodyJson.toRequestBody(mediaType)
// 创建请求
val request = Request.Builder()
.url("$api_url")
.post(body)
.header("Authorization", "Bearer $api_key")
.header("Content-Type", "application/json")
.build()
// 使用协程在后台线程中发送请求
CoroutineScope(Dispatchers.Main).launch {
try {
// 模拟可能出现异常的网络操作,这里需要替换为你的实际网络请求相关代码
// 比如使用 OkHttp 或者其他网络库进行请求
val response = withContext(Dispatchers.IO) {
client.newCall(request).execute()
}
if (response.isSuccessful) {
val responseBody = response.body?.string() // 将响应体转换为字符串
responseBody?.let {
// 处理响应 JSON 数据
print("return message is $responseBody")
val labels = extractLabels(responseBody)
labels?.let {
if (labels != null && labels.size == 4) {
for (i in 0 until 4) {
val tab = tabLayout.getTabAt(i)
if (tab != null) {
tab.text = labels[i]
tab.view.setOnClickListener {
val currentText =
findViewById<EditText>(R.id.inputEditText).text.toString()
val buttonText = tab.text.toString()
inputEditText.setText("$currentText\n#$buttonText")
statusText.text = "标签已增加"
}
}
}
statusText.text = "标签已经获取并更新"
}
} ?: run {
statusText.text = "没有更新到标签"
}
}
} else {
statusText.text = "服务器没有响应,没有更新"
}
} catch (e: UnknownHostException) {
statusText.text ="UnknownHostException: ${e.message}"
} catch (e: IOException) {
statusText.text = "IOException: ${e.message}"
}
}
}
tabLayout = findViewById(R.id.tabLayout)
submitToServerButton = findViewById(R.id.submitToServerButton)
@@ -238,10 +358,8 @@ class MainActivity : AppCompatActivity() {
}
private fun submitToServer(content: String) {
CoroutineScope(Dispatchers.Main).launch {
statusText.text = "提交到flomo服务器..."
val result = withContext(Dispatchers.IO) {
postDataToServer(content)
}

View File

@@ -1,6 +1,8 @@
package com.example.flomo_ai
import android.annotation.SuppressLint
import android.os.Bundle
import android.graphics.Color
import android.widget.Button
import android.widget.EditText
import android.widget.LinearLayout
@@ -8,13 +10,13 @@ import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import java.util.UUID
class SecondActivity : AppCompatActivity() {
private lateinit var etApiName: EditText
private lateinit var etApiUrl: EditText
private lateinit var etApiKey: EditText
private lateinit var etApiSecretKey: EditText
private lateinit var etApiModel: EditText
private lateinit var btnSave: Button
private lateinit var llConfigList: LinearLayout
@@ -49,6 +51,7 @@ class SecondActivity : AppCompatActivity() {
etApiUrl = findViewById(R.id.etApiUrl)
etApiKey = findViewById(R.id.etApiKey)
etApiSecretKey = findViewById(R.id.etApiSecretKey)
etApiModel = findViewById(R.id.etApiModel)
btnSave = findViewById(R.id.btnSave)
llConfigList = findViewById(R.id.llConfigList)
}
@@ -73,11 +76,12 @@ class SecondActivity : AppCompatActivity() {
val url = etApiUrl.text.toString()
val key = etApiKey.text.toString()
val secretKey = etApiSecretKey.text.toString()
val model = etApiModel.text.toString()
// 生成唯一的 id
val id = System.currentTimeMillis()
// 创建新的配置项
val newConfig = APIConfig(id, name, url, key, secretKey)
val newConfig = APIConfig(id, name, url, key, secretKey, model)
// 添加配置项
configs.add(newConfig)
// 保存配置
@@ -93,11 +97,12 @@ class SecondActivity : AppCompatActivity() {
val url = etApiUrl.text.toString()
val key = etApiKey.text.toString()
val secretKey = etApiSecretKey.text.toString()
val model = etApiModel.text.toString()
// 获取编辑的配置项 id
val id = editingId ?: return
// 更新配置项
val updatedConfig = APIConfig(id, name, url, key, secretKey)
val updatedConfig = APIConfig(id, name, url, key, secretKey, model)
val existingConfigIndex = configs.indexOfFirst { it.id == id }
if (existingConfigIndex != -1) {
configs[existingConfigIndex] = updatedConfig
@@ -113,6 +118,7 @@ class SecondActivity : AppCompatActivity() {
}
@SuppressLint("MissingInflatedId")
private fun displayConfigs() {
llConfigList.removeAllViews()
for (config in configs) {
@@ -121,24 +127,30 @@ class SecondActivity : AppCompatActivity() {
// 设置各项文本信息
// 获取并设置 Name 的 TextView 前景色和背景色
val tvName = configView.findViewById<TextView>(R.id.tvName)
tvName.setTextColor(resources.getColor(R.color.background_color))
tvName.text = "Name: ${config.name}"
tvName.setTextColor(Color.BLACK)
// 获取并设置 URL 的 TextView 前景色和背景色
val tvUrl = configView.findViewById<TextView>(R.id.tvUrl)
tvUrl.setTextColor(resources.getColor(R.color.background_color))
tvUrl.text = "URL: ${config.url}"
tvUrl.setTextColor(Color.BLACK)
// 获取并设置 Key 的 TextView 前景色和背景色
val tvKey = configView.findViewById<TextView>(R.id.tvKey).also {
it.setTextColor(resources.getColor(R.color.background_color))
}
val tvKey = configView.findViewById<TextView>(R.id.tvKey)
tvKey.text = "Key: ${config.key.take(4)}..."
tvKey.setTextColor(Color.BLACK)
// 获取并设置 SecretKey 的 TextView 前景色和背景色
val tvSecretKey = configView.findViewById<TextView>(R.id.tvSecretKey)
tvSecretKey.setTextColor(resources.getColor(R.color.background_color))
tvSecretKey.text = "Secret Key: ${config.secretKey.take(4)}..."
tvSecretKey.setTextColor(Color.BLACK)
// 获取并设置 model 的 TextView 前景色和背景色
val tvApiModel = configView.findViewById<TextView>(R.id.tvApiModel)
tvApiModel.text = "Model: ${config.model}"
tvApiModel.setTextColor(Color.BLACK)
// 设置编辑按钮点击事件
configView.findViewById<Button>(R.id.btnEdit).setOnClickListener {
@@ -176,6 +188,7 @@ class SecondActivity : AppCompatActivity() {
etApiUrl.text.clear()
etApiKey.text.clear()
etApiSecretKey.text.clear()
etApiModel.text.clear()
btnSave.text = "保存配置"
}
}
@@ -185,5 +198,6 @@ data class APIConfig(
val name: String,
val url: String,
val key: String,
val secretKey: String
val secretKey: String,
val model: String
)

View File

@@ -39,11 +39,28 @@
android:layout_weight="0.5"
android:background="@drawable/edittext_border" />
<Button
android:id="@+id/submitToAIButton"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="提交到智谱AI" />
android:orientation="horizontal"
android:weightSum="100">
<Button
android:id="@+id/submitToZhiPuAIButton"
android:layout_width="113dp"
android:layout_height="wrap_content"
android:text="提交到智谱AI"
android:textSize="12sp" />
<Button
android:id="@+id/submitToSparkAIButton"
android:layout_width="113dp"
android:layout_height="wrap_content"
android:text="提交到星火AI"
android:textSize="12sp" />
</LinearLayout>
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"

View File

@@ -49,6 +49,14 @@
android:hint="API Secret Key"
android:minHeight="48dp" />
<EditText
android:id="@+id/etApiModel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:hint="API Model Type"
android:minHeight="48dp" />
<Button
android:id="@+id/btnSave"
android:layout_width="wrap_content"

View File

@@ -28,6 +28,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tvApiModel"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"