最近做项目,接入GPT,接口是流式返回的,于是对流式接口请求做了下总结。项目中采用的OKHttp实现网络请求、
接口中,数据是一行一行返回的,每行数据的返回格式如下:
{"code": 0,"message": "","data": "{\"text\":\"\",\"auxiliary_tips\":[]}"
}
流式接口应该一行一行处理,因为返回的内容数据会被拆成一段一段的,放到text字段下,我们的业务比较复杂,在返回的数据中还会有一些特殊标识需要解析,是否需要展示按钮之类的,数据如下:
"此次GPT生成完成!<_action_data_> {\"action\": \"confirm\"}"
因为后面的标识可能会被GPT拆成两个,因此需要拼装后进行解析。
核心代码如下:
suspend fun requestByStream(ur: String,taskType: String? = null,content: String? = null,onStart: () -> Unit,onEnd: (String?) -> Unit,onNetworkError: (Int?, String?) -> Unit,onError: ((Throwable) -> Unit)? = null,onCollect: (String?, Choices?, Int?, String?) -> Unit,) {val body = JsonUtils.toJson(GenerateBody(task_type = taskType, content = content)).toRequestBody()val request =Request.Builder()