@@ -132,10 +132,16 @@ interface ChatProvider {
132
132
usage : ( ) => void ;
133
133
}
134
134
135
+ // Khởi tạo API client dựa trên nhà cung cấp mô hình được chỉ định
135
136
export class ClientApi {
136
137
public llm : LLMApi ;
137
138
139
+ // Hàm khởi tạo nhận vào một provider (nhà cung cấp mô hình AI)
140
+ // Mặc định là ModelProvider.GPT nếu không được chỉ định
138
141
constructor ( provider : ModelProvider = ModelProvider . GPT ) {
142
+ console . log ( "[ClientApi] provider " , provider ) ;
143
+
144
+ // Sử dụng switch để khởi tạo instance tương ứng với provider được chọn
139
145
switch ( provider ) {
140
146
case ModelProvider . GeminiPro :
141
147
this . llm = new GeminiProApi ( ) ;
@@ -178,13 +184,18 @@ export class ClientApi {
178
184
}
179
185
}
180
186
187
+ // Hàm cấu hình (chưa triển khai chi tiết)
181
188
config ( ) { }
182
189
190
+ // Hàm lấy prompts (chưa triển khai chi tiết)
183
191
prompts ( ) { }
184
192
193
+ // Hàm lấy masks (chưa triển khai chi tiết)
185
194
masks ( ) { }
186
195
196
+ // Hàm chia sẻ cuộc trò chuyện
187
197
async share ( messages : ChatMessage [ ] , avatarUrl : string | null = null ) {
198
+ // Chuẩn bị dữ liệu tin nhắn để chia sẻ
188
199
const msgs = messages
189
200
. map ( ( m ) => ( {
190
201
from : m . role === "user" ? "human" : "gpt" ,
@@ -197,14 +208,20 @@ export class ClientApi {
197
208
"Share from [NextChat]: https://github.com/Yidadaa/ChatGPT-Next-Web" ,
198
209
} ,
199
210
] ) ;
200
- // 敬告二开开发者们,为了开源大模型的发展,请不要修改上述消息,此消息用于后续数据清洗使用
211
+ // Lưu ý: Không nên sửa đổi dòng thông báo cuối cùng này vì nó dùng cho việc làm sạch dữ liệu sau này
201
212
// Please do not modify this message
202
213
203
214
console . log ( "[Share]" , messages , msgs ) ;
215
+
216
+ // Lấy cấu hình client
204
217
const clientConfig = getClientConfig ( ) ;
218
+
219
+ // Xác định URL để chia sẻ dựa trên môi trường (app hay web)
205
220
const proxyUrl = "/sharegpt" ;
206
221
const rawUrl = "https://sharegpt.com/api/conversations" ;
207
222
const shareUrl = clientConfig ?. isApp ? rawUrl : proxyUrl ;
223
+
224
+ // Gửi yêu cầu POST để chia sẻ cuộc trò chuyện
208
225
const res = await fetch ( shareUrl , {
209
226
body : JSON . stringify ( {
210
227
avatarUrl,
@@ -216,6 +233,7 @@ export class ClientApi {
216
233
method : "POST" ,
217
234
} ) ;
218
235
236
+ // Xử lý phản hồi và trả về link chia sẻ
219
237
const resJson = await res . json ( ) ;
220
238
console . log ( "[Share]" , resJson ) ;
221
239
if ( resJson . id ) {
@@ -224,6 +242,7 @@ export class ClientApi {
224
242
}
225
243
}
226
244
245
+ // Hàm tạo token xác thực Bearer
227
246
export function getBearerToken (
228
247
apiKey : string ,
229
248
noBearer : boolean = false ,
@@ -233,25 +252,37 @@ export function getBearerToken(
233
252
: "" ;
234
253
}
235
254
255
+ // Hàm kiểm tra chuỗi có hợp lệ không (có độ dài > 0)
236
256
export function validString ( x : string ) : boolean {
237
257
return x ?. length > 0 ;
238
258
}
239
259
260
+ // Hàm lấy các header cần thiết cho yêu cầu API
240
261
export function getHeaders ( ignoreHeaders : boolean = false ) {
262
+ // Lấy store để truy cập các trạng thái liên quan đến quyền truy cập và chat
241
263
const accessStore = useAccessStore . getState ( ) ;
242
264
const chatStore = useChatStore . getState ( ) ;
265
+
266
+ // Khởi tạo đối tượng headers rỗng
243
267
let headers : Record < string , string > = { } ;
268
+
269
+ // Nếu không bỏ qua headers thì thêm các header mặc định
244
270
if ( ! ignoreHeaders ) {
245
271
headers = {
246
272
"Content-Type" : "application/json" ,
247
273
Accept : "application/json" ,
248
274
} ;
249
275
}
250
276
277
+ // Lấy cấu hình client
251
278
const clientConfig = getClientConfig ( ) ;
252
279
280
+ // Hàm getConfig sẽ xác định nhà cung cấp hiện tại và API key tương ứng
253
281
function getConfig ( ) {
282
+ // Lấy cấu hình mô hình từ session hiện tại
254
283
const modelConfig = chatStore . currentSession ( ) . mask . modelConfig ;
284
+
285
+ // Kiểm tra loại nhà cung cấp đang được sử dụng
255
286
const isGoogle = modelConfig . providerName === ServiceProvider . Google ;
256
287
const isAzure = modelConfig . providerName === ServiceProvider . Azure ;
257
288
const isAnthropic = modelConfig . providerName === ServiceProvider . Anthropic ;
@@ -265,7 +296,11 @@ export function getHeaders(ignoreHeaders: boolean = false) {
265
296
const isChatGLM = modelConfig . providerName === ServiceProvider . ChatGLM ;
266
297
const isSiliconFlow =
267
298
modelConfig . providerName === ServiceProvider . SiliconFlow ;
299
+
300
+ // Kiểm tra xem có bật kiểm soát truy cập không
268
301
const isEnabledAccessControl = accessStore . enabledAccessControl ( ) ;
302
+
303
+ // Xác định API key dựa trên nhà cung cấp đang được sử dụng
269
304
const apiKey = isGoogle
270
305
? accessStore . googleApiKey
271
306
: isAzure
@@ -309,6 +344,7 @@ export function getHeaders(ignoreHeaders: boolean = false) {
309
344
} ;
310
345
}
311
346
347
+ // Hàm xác định header nào sẽ được sử dụng để xác thực
312
348
function getAuthHeader ( ) : string {
313
349
return isAzure
314
350
? "api-key"
@@ -319,6 +355,7 @@ export function getHeaders(ignoreHeaders: boolean = false) {
319
355
: "Authorization" ;
320
356
}
321
357
358
+ // Lấy các giá trị đã được xác định trong getConfig
322
359
const {
323
360
isGoogle,
324
361
isAzure,
@@ -335,19 +372,24 @@ export function getHeaders(ignoreHeaders: boolean = false) {
335
372
apiKey,
336
373
isEnabledAccessControl,
337
374
} = getConfig ( ) ;
338
- // when using baidu api in app, not set auth header
375
+
376
+ // Khi sử dụng API của Baidu trong ứng dụng, không đặt header xác thực
339
377
if ( isBaidu && clientConfig ?. isApp ) return headers ;
340
378
379
+ // Xác định tên header xác thực
341
380
const authHeader = getAuthHeader ( ) ;
342
381
382
+ // Tạo token xác thực
343
383
const bearerToken = getBearerToken (
344
384
apiKey ,
345
385
isAzure || isAnthropic || isGoogle ,
346
386
) ;
347
387
388
+ // Nếu có bearer token thì thêm vào headers
348
389
if ( bearerToken ) {
349
390
headers [ authHeader ] = bearerToken ;
350
391
} else if ( isEnabledAccessControl && validString ( accessStore . accessCode ) ) {
392
+ // Nếu có mã truy cập thì sử dụng nó để tạo bearer token
351
393
headers [ "Authorization" ] = getBearerToken (
352
394
ACCESS_CODE_PREFIX + accessStore . accessCode ,
353
395
) ;
@@ -356,6 +398,7 @@ export function getHeaders(ignoreHeaders: boolean = false) {
356
398
return headers ;
357
399
}
358
400
401
+ // Hàm tạo instance của ClientApi dựa trên nhà cung cấp dịch vụ
359
402
export function getClientApi ( provider : ServiceProvider ) : ClientApi {
360
403
switch ( provider ) {
361
404
case ServiceProvider . Google :
0 commit comments