From a217b7c06be2fa202f125fea391f7a42f41791c9 Mon Sep 17 00:00:00 2001 From: xiaji Date: Thu, 19 Sep 2024 19:56:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=98=9F=E7=81=AB=E5=A4=A7?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E7=9A=84model=E6=8C=89=E9=92=AE=EF=BC=9B?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=EF=BC=9B=E6=9B=B4=E6=94=B9=E9=83=A8=E5=88=86?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E8=BF=87=E7=A8=8B=E3=80=82=E7=8E=B0=E5=9C=A8?= =?UTF-8?q?=E5=A4=A7=E6=A8=A1=E5=9E=8B=E7=9A=84=E7=B1=BB=E5=9E=8B=E4=B9=9F?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E9=80=89=E6=8B=A9=E4=BA=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 2 +- .../java/com/example/flomo_ai/MainActivity.kt | 154 ++++++++++++++++-- .../com/example/flomo_ai/SecondActivity.kt | 34 ++-- app/src/main/res/layout/activity_main.xml | 25 ++- app/src/main/res/layout/activity_second.xml | 8 + app/src/main/res/layout/item_api_config.xml | 5 + 6 files changed, 195 insertions(+), 33 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1b6a7e8..399a559 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -12,7 +12,7 @@ android { minSdk = 28 targetSdk = 34 versionCode = 1 - versionName = "1.0" + versionName = "1.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/java/com/example/flomo_ai/MainActivity.kt b/app/src/main/java/com/example/flomo_ai/MainActivity.kt index 344f020..b9eeca5 100644 --- a/app/src/main/java/com/example/flomo_ai/MainActivity.kt +++ b/app/src/main/java/com/example/flomo_ai/MainActivity.kt @@ -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? { } 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(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>() {}.type val allConfigs = Gson().fromJson>(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(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>() {}.type + val allConfigs = Gson().fromJson>(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(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) } diff --git a/app/src/main/java/com/example/flomo_ai/SecondActivity.kt b/app/src/main/java/com/example/flomo_ai/SecondActivity.kt index 958c431..f54a730 100644 --- a/app/src/main/java/com/example/flomo_ai/SecondActivity.kt +++ b/app/src/main/java/com/example/flomo_ai/SecondActivity.kt @@ -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(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(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(R.id.tvKey).also { - it.setTextColor(resources.getColor(R.color.background_color)) - } + val tvKey = configView.findViewById(R.id.tvKey) tvKey.text = "Key: ${config.key.take(4)}..." + tvKey.setTextColor(Color.BLACK) + // 获取并设置 SecretKey 的 TextView 前景色和背景色 val tvSecretKey = configView.findViewById(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(R.id.tvApiModel) + tvApiModel.text = "Model: ${config.model}" + tvApiModel.setTextColor(Color.BLACK) // 设置编辑按钮点击事件 configView.findViewById