当前位置: 首页 > news >正文

安卓接入通义千问AI的实现记录

官网:https://help.aliyun.com/zh/model-studio/use-qwen-by-calling-api#b1320a1664b9a

创建网络请求

  1. 创建一个BaseNetworkApi基类用于实现各种拦截器等。
abstract class BaseNetworkApi {fun <T> getApi(serviceClass: Class<T>, baseUrl: String): T {val retrofitBuilder = Retrofit.Builder().baseUrl(baseUrl).client(okHttpClient)return setRetrofitBuilder(retrofitBuilder).build().create(serviceClass)}/*** 实现重写父类的setHttpClientBuilder方法,* 在这里可以添加拦截器,可以对 OkHttpClient.Builder 做任意操作*/abstract fun setHttpClientBuilder(builder: OkHttpClient.Builder): OkHttpClient.Builder/*** 实现重写父类的setRetrofitBuilder方法,* 在这里可以对Retrofit.Builder做任意操作,比如添加GSON解析器,Protocol*/abstract fun setRetrofitBuilder(builder: Retrofit.Builder): Retrofit.Builder/*** 配置http*/private val okHttpClient: OkHttpClientget() {var builder = RetrofitUrlManager.getInstance().with(OkHttpClient.Builder())builder = setHttpClientBuilder(builder)return builder.build()}
}
  1. 完成BaseNetworkApi的具体实现类。
val aiService : AiService by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {AiApi.INSTANCE.getApi(AiService::class.java, AiService.getBaseUrl())
}class AiApi : BaseNetworkApi() {companion object {val INSTANCE: AiApi by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {AiApi()}}/*** 实现重写父类的setHttpClientBuilder方法,* 在这里可以添加拦截器,可以对 OkHttpClient.Builder 做任意操作*/override fun setHttpClientBuilder(builder: OkHttpClient.Builder): OkHttpClient.Builder {builder.apply {//设置缓存配置 缓存最大10Mcache(Cache(File(appContext.cacheDir, "cxk_cache"), 10 * 1024 * 1024))//添加Cookies自动持久化cookieJar(cookieJar)addInterceptor(AiInterceptor())//超时时间 连接、读、写connectTimeout(10, TimeUnit.SECONDS)readTimeout(120, TimeUnit.SECONDS)writeTimeout(30, TimeUnit.SECONDS)}return builder}/*** 实现重写父类的setRetrofitBuilder方法,* 在这里可以对Retrofit.Builder做任意操作,比如添加GSON解析器,protobuf等*/override fun setRetrofitBuilder(builder: Retrofit.Builder): Retrofit.Builder {return builder.apply {addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))}}val cookieJar: PersistentCookieJar by lazy {PersistentCookieJar(SetCookieCache(), SharedPrefsCookiePersistor(appContext))}}
  1. 在AiInterceptor完成公共Header的添加。
class AiInterceptor : Interceptor {@Throws(IOException::class)override fun intercept(chain: Interceptor.Chain): Response {val builder = chain.request().newBuilder()builder.addHeader("Authorization", "Bearer sk-xxxxxxxxxxxxxxxxxxxx")builder.addHeader("Content-Type", "application/json").build()return chain.proceed(builder.build())}
}

此处的Key可在阿里云百炼自行申请。

  1. 通过第三方框架retrofit2完成网络请求注解。

interface AiService {companion object {fun getBaseUrl(): String {return "https://dashscope.aliyuncs.com"}}@POST("compatible-mode/v1/chat/completions")suspend fun askQuestion(@Body request: AiRequest): AiResponse<List<Choice>>
}@Keep
data class AiResponse<T>(val error: Error?, val choices: T) : BaseResponse<T>() {override fun isSucces() = error ==  nulloverride fun getResponseCode(): Int {return if (error == null) {200} else {400}}override fun getResponseData() = choicesoverride fun getResponseMsg(): String {return error?.message?: ""}
}data class Error(val message: String?, val type: String?, val param: String?, val code: String?)data class Message(var role: String?, var content: String?)data class Choice(var message: Message?,  var finish_reason: String?,  var index: Int?)data class AiRequest(var model: String?, var messages: List<Message>?, var stream :Boolean? = false)
@Keep
abstract class BaseResponse<T> {abstract fun isSucces(): Booleanabstract fun getResponseData(): Tabstract fun getResponseCode(): Intabstract fun getResponseMsg(): String}
  1. 在需要的地方直接调用即可,亦可编辑请求类对异常情况进行处理。
val message = Message("user", "你好")val messageList = ArrayList<Message>()messageList.add(message)val request1 = AiRequest("qwen-max", messageList)val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main)scope.launch  {val response = aiService.askQuestion(request1)Log.d("AI-test", response.toString())}

在这里插入图片描述

  1. 实现效果如下。

在这里插入图片描述

  1. 遇到的问题

● 在请求时,报java.net.SocketTimeoutException: timeout

遇到的 java.net.SocketTimeoutException: timeout 是网络请求超时问题,在调用阿里通义千问API时很常见。以下是建议方案:

① 增加超时时间配置

            connectTimeout(10, TimeUnit.SECONDS)readTimeout(120, TimeUnit.SECONDS)writeTimeout(30, TimeUnit.SECONDS)

② 网络状态检查
③ 使用 qwen-turbo,响应速度最快

http://www.dtcms.com/a/352701.html

相关文章:

  • 基于Springboot学生社区管理系统源码
  • uniapp H5禁止微信浏览器长按出菜单,只针对图片
  • 迅睿CMS自定义网站表单:HTML方式调用Select下拉选项数据指南
  • HTML(面试)
  • 【开题答辩全过程】以 微信小程序的医院挂号预约系统为例,包含答辩的问题和答案
  • 【开题答辩全过程】以 微信小程序的老年活动中心为例,包含答辩的问题和答案
  • 本地windows电脑部署html网页到互联网:html+node.js+ngrok/natapp
  • 腾讯位置商业授权微信小程序路线规划
  • 基于微信小程序的化妆品成分查询系统源码
  • Android Glide最佳实践:高效图片加载完全指南
  • 软考-系统架构设计师 业务处理系统(TPS)详细讲解
  • Class44语言模型
  • 实现多态的三个必要条件?
  • 计算机网络:服务器处理多客户端(并发服务器)
  • ollama离线部署+大语言模型
  • 【JAVA实现websocket】
  • 【网络】网络基础概念
  • AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2025.04.10-2025.04.15
  • 数据结构:堆排序 (Heap Sort)
  • 基于单片机光照强度检测(光敏电阻)系统Proteus仿真(含全部资料)
  • 华为鸿蒙HarmonyOS Next基础开发教程
  • uniapp+vue+uCharts开发常见问题汇总
  • uniapp npm安装形式 全局分享和按钮分享设置
  • Spring Boot:统一返回格式,这样搞就对了。
  • HMM简单拓展-HSMM与高阶HMM
  • 视频号存在争议了...
  • 软件开发技术栈
  • JVM之【运行时数据区】
  • 深度学习-----ptorch框架认识-手写数字识别.py项目解读
  • 2025年渗透测试面试题总结-34(题目+回答)