@@ -37,12 +37,13 @@ class XingHuoProvider(val project: Project) : LLMProvider {
37
37
private val hmacsha256Algorithms = " hmacsha256"
38
38
private val uid = UUID .randomUUID().toString().substring(0 , 32 )
39
39
40
- private val hmacsha256 by lazy {
41
- val hmac = Mac .getInstance(hmacsha256Algorithms)
42
- val keySpec = SecretKeySpec (secrectKey.toByteArray(), hmacsha256Algorithms)
43
- hmac.init (keySpec)
44
- hmac
45
- }
40
+ private val hmacsha256: Mac
41
+ get() {
42
+ val hmac = Mac .getInstance(hmacsha256Algorithms)
43
+ val keySpec = SecretKeySpec (secrectKey.toByteArray(), hmacsha256Algorithms)
44
+ hmac.init (keySpec)
45
+ return hmac
46
+ }
46
47
47
48
override fun prompt (promptText : String ): String {
48
49
// prompt 接口看似是无用的废弃接口,因为所有 LLM 请求都只能异步返回,不可能直接返回同步结果
@@ -54,12 +55,9 @@ class XingHuoProvider(val project: Project) : LLMProvider {
54
55
override fun stream (promptText : String , systemPrompt : String ): Flow <String > {
55
56
return callbackFlow {
56
57
val client = OkHttpClient ()
57
- client.newWebSocket(request, MyListener (this , onSocketOpend = {
58
+ client.newWebSocket(request, MyListener (this , onSocketOpen = {
58
59
val msg = getSendBody(promptText)
59
- println (" sending $msg " )
60
60
send(msg)
61
- }, onSocketClosed = {
62
- close()
63
61
}))
64
62
awaitClose()
65
63
}
@@ -68,19 +66,18 @@ class XingHuoProvider(val project: Project) : LLMProvider {
68
66
69
67
class MyListener (
70
68
private val producerScope : ProducerScope <String >,
71
- private val onSocketOpend : WebSocket .() -> Unit ,
72
- private val onSocketClosed : WebSocket .() -> Unit
69
+ private val onSocketOpen : WebSocket .() -> Unit ,
73
70
) : WebSocketListener() {
74
71
75
72
private var sockedOpen = false
76
73
override fun onOpen (webSocket : WebSocket , response : Response ) {
77
- webSocket.onSocketOpend ()
74
+ webSocket.onSocketOpen ()
78
75
sockedOpen = true
79
76
}
80
77
81
- override fun onMessage (webSocket : WebSocket , body : String ) {
82
- return runCatching {
83
- val element = Json .parseToJsonElement(body )
78
+ override fun onMessage (webSocket : WebSocket , text : String ) {
79
+ runCatching {
80
+ val element = Json .parseToJsonElement(text )
84
81
val choices = element.jsonObject[" payload" ]!! .jsonObject[" choices" ]!!
85
82
val statusCode: Int = choices.jsonObject[" status" ]?.jsonPrimitive?.int!!
86
83
val message = choices.jsonObject[" text" ]!! .jsonArray[0 ]
@@ -96,11 +93,12 @@ class XingHuoProvider(val project: Project) : LLMProvider {
96
93
}
97
94
98
95
override fun onClosed (webSocket : WebSocket , code : Int , reason : String ) {
99
- webSocket.onSocketClosed ()
96
+ producerScope.close ()
100
97
}
101
98
102
99
override fun onFailure (webSocket : WebSocket , t : Throwable , response : Response ? ) {
103
100
// WebSocket connection failed
101
+ println (" failure ${t.message} ${response?.body} ${response?.message} ${response?.code} " )
104
102
producerScope.trySend(" onFailure ${response?.body} ${response?.message} ${response?.code} " )
105
103
producerScope.close()
106
104
}
@@ -131,6 +129,7 @@ class XingHuoProvider(val project: Project) : LLMProvider {
131
129
urlBuilder.addQueryParameter(it.key, it.value)
132
130
}
133
131
val url = urlBuilder.build().toString().replace(" https://" , " wss://" )
132
+ println (url)
134
133
return Request .Builder ().url(url).build()
135
134
}
136
135
0 commit comments