@@ -19,12 +19,12 @@ import { Alert } from '@/components/docs/Alert';
19
19
20
20
``` json
21
21
{
22
- "success" : true ,
23
- "message" : " 错误提示" ,
24
- "msg" : " 同message, 错误提示" ,
25
- "data" : {
26
- "uid" : " 用户唯一凭证"
27
- }
22
+ "success" : true ,
23
+ "message" : " 错误提示" ,
24
+ "msg" : " 同message, 错误提示" ,
25
+ "data" : {
26
+ "uid" : " 用户唯一凭证"
27
+ }
28
28
}
29
29
```
30
30
@@ -37,21 +37,20 @@ import { Alert } from '@/components/docs/Alert';
37
37
![ ] ( /imgs/sharelink_process.png )
38
38
39
39
## 配置教程
40
+
40
41
### 1. 配置身份校验地址
41
42
42
43
![ ] ( /imgs/share-setlink.png )
43
44
44
45
配置校验地址后,在每次分享链接使用时,都会向对应的地址发起校验和上报请求。
45
46
46
- <Alert icon = " 🤖" >
47
- 这里仅需配置根地址,无需具体到完整请求路径。
48
- </Alert >
47
+ <Alert icon = " 🤖" >这里仅需配置根地址,无需具体到完整请求路径。</Alert >
49
48
50
49
### 2. 分享链接中增加额外 query
51
50
52
51
在分享链接的地址中,增加一个额外的参数: authToken。例如:
53
52
54
- 原始的链接:` https://share.tryfastgpt.ai/chat/share?shareId=648aaf5ae121349a16d62192 `
53
+ 原始的链接:` https://share.tryfastgpt.ai/chat/share?shareId=648aaf5ae121349a16d62192 `
55
54
56
55
完整链接: ` https://share.tryfastgpt.ai/chat/share?shareId=648aaf5ae121349a16d62192&authToken=userid12345 `
57
56
@@ -62,7 +61,6 @@ import { Alert } from '@/components/docs/Alert';
62
61
<Tabs items = { [' 请求示例' ,' 鉴权成功' ,' 鉴权失败' ]} >
63
62
<Tab value = " 请求示例" >
64
63
65
-
66
64
``` bash
67
65
curl --location --request POST ' {{host}}/shareAuth/init' \
68
66
--header ' Content-Type: application/json' \
@@ -71,48 +69,40 @@ curl --location --request POST '{{host}}/shareAuth/init' \
71
69
}'
72
70
```
73
71
74
-
75
72
</Tab >
76
73
77
74
<Tab value = " 鉴权成功" >
78
75
79
-
80
76
``` json
81
77
{
82
- "success" : true ,
83
- "data" : {
84
- "uid" : " 用户唯一凭证"
85
- }
78
+ "success" : true ,
79
+ "data" : {
80
+ "uid" : " 用户唯一凭证"
81
+ }
86
82
}
87
83
```
88
84
89
85
系统会拉取该分享链接下,uid 为 username123 的对话记录。
90
86
91
-
92
87
</Tab >
93
88
94
89
<Tab value = " 鉴权失败" >
95
90
96
-
97
91
``` json
98
92
{
99
- "success" : false ,
100
- "message" : " 身份错误" ,
93
+ "success" : false ,
94
+ "message" : " 身份错误"
101
95
}
102
96
```
103
97
104
-
105
98
</Tab >
106
99
</Tabs >
107
100
108
-
109
-
110
101
### 4. 编写对话前校验接口
111
102
112
103
<Tabs items = { [' 请求示例' ,' 鉴权成功' ,' 鉴权失败' ]} >
113
104
<Tab value = " 请求示例" >
114
105
115
-
116
106
``` bash
117
107
curl --location --request POST ' {{host}}/shareAuth/start' \
118
108
--header ' Content-Type: application/json' \
@@ -122,50 +112,45 @@ curl --location --request POST '{{host}}/shareAuth/start' \
122
112
}'
123
113
```
124
114
125
-
126
115
</Tab >
127
116
128
117
<Tab value = " 鉴权成功" >
129
118
130
-
131
119
``` json
132
120
{
133
- "success" : true ,
134
- "data" : {
135
- "uid" : " 用户唯一凭证"
136
- }
121
+ "success" : true ,
122
+ "data" : {
123
+ "uid" : " 用户唯一凭证"
124
+ }
137
125
}
138
126
```
139
127
140
-
141
128
</Tab >
142
129
143
130
<Tab value = " 鉴权失败" >
144
131
145
-
146
132
``` json
147
133
{
148
- "success" : false ,
149
- "message" : " 身份验证失败" ,
134
+ "success" : false ,
135
+ "message" : " 身份验证失败"
150
136
}
151
137
```
152
138
153
139
``` json
154
140
{
155
- "success" : false ,
156
- "message" : " 存在违规词" ,
141
+ "success" : false ,
142
+ "message" : " 存在违规词"
157
143
}
158
144
```
159
145
160
-
161
146
</Tab >
162
147
</Tabs >
163
148
164
149
### 5. 编写对话结果上报接口(可选)
165
150
166
151
该接口无规定返回值。
167
152
168
- 响应值与[ chat 接口格式相同] ( /docs/development/openapi/chat /#响应 ) ,仅多了一个` token ` 。
153
+ 响应值与[ chat 接口格式相同] ( /docs/introduction/ development/openapi/intro /#响应 ) ,仅多了一个` token ` 。
169
154
170
155
重点关注:` totalPoints ` (总消耗AI积分),` token ` (Token消耗总数)
171
156
@@ -236,56 +221,56 @@ curl --location --request POST '{{host}}/shareAuth/finish' \
236
221
"runningTime": 1.32
237
222
}
238
223
]
239
-
240
-
224
+
225
+
241
226
}'
242
227
```
243
228
244
229
** responseData 完整字段说明:**
245
230
246
231
``` ts
247
232
type ResponseType = {
248
- moduleType: FlowNodeTypeEnum ; // 模块类型
249
- moduleName: string ; // 模块名
250
- moduleLogo? : string ; // logo
251
- runningTime? : number ; // 运行时间
252
- query? : string ; // 用户问题/检索词
253
- textOutput? : string ; // 文本输出
254
-
255
- tokens? : number ; // 上下文总Tokens
256
- model? : string ; // 使用到的模型
257
- contextTotalLen? : number ; // 上下文总长度
258
- totalPoints? : number ; // 总消耗AI积分
259
-
260
- temperature? : number ; // 温度
261
- maxToken? : number ; // 模型的最大token
262
- quoteList? : SearchDataResponseItemType []; // 引用列表
263
- historyPreview? : ChatItemType []; // 上下文预览(历史记录会被裁剪)
264
-
265
- similarity? : number ; // 最低相关度
266
- limit? : number ; // 引用上限token
267
- searchMode? : ` ${DatasetSearchModeEnum } ` ; // 搜索模式
268
- searchUsingReRank? : boolean ; // 是否使用rerank
269
- extensionModel? : string ; // 问题扩展模型
270
- extensionResult? : string ; // 问题扩展结果
271
- extensionTokens? : number ; // 问题扩展总字符长度
272
-
273
- cqList? : ClassifyQuestionAgentItemType []; // 分类问题列表
274
- cqResult? : string ; // 分类问题结果
275
-
276
- extractDescription? : string ; // 内容提取描述
277
- extractResult? : Record <string , any >; // 内容提取结果
278
-
279
- params? : Record <string , any >; // HTTP模块params
280
- body? : Record <string , any >; // HTTP模块body
281
- headers? : Record <string , any >; // HTTP模块headers
282
- httpResult? : Record <string , any >; // HTTP模块结果
283
-
284
- pluginOutput? : Record <string , any >; // 插件输出
285
- pluginDetail? : ChatHistoryItemResType []; // 插件详情
286
-
287
- isElseResult? : boolean ; // 判断器结果
288
- }
233
+ moduleType: FlowNodeTypeEnum ; // 模块类型
234
+ moduleName: string ; // 模块名
235
+ moduleLogo? : string ; // logo
236
+ runningTime? : number ; // 运行时间
237
+ query? : string ; // 用户问题/检索词
238
+ textOutput? : string ; // 文本输出
239
+
240
+ tokens? : number ; // 上下文总Tokens
241
+ model? : string ; // 使用到的模型
242
+ contextTotalLen? : number ; // 上下文总长度
243
+ totalPoints? : number ; // 总消耗AI积分
244
+
245
+ temperature? : number ; // 温度
246
+ maxToken? : number ; // 模型的最大token
247
+ quoteList? : SearchDataResponseItemType []; // 引用列表
248
+ historyPreview? : ChatItemType []; // 上下文预览(历史记录会被裁剪)
249
+
250
+ similarity? : number ; // 最低相关度
251
+ limit? : number ; // 引用上限token
252
+ searchMode? : ` ${DatasetSearchModeEnum } ` ; // 搜索模式
253
+ searchUsingReRank? : boolean ; // 是否使用rerank
254
+ extensionModel? : string ; // 问题扩展模型
255
+ extensionResult? : string ; // 问题扩展结果
256
+ extensionTokens? : number ; // 问题扩展总字符长度
257
+
258
+ cqList? : ClassifyQuestionAgentItemType []; // 分类问题列表
259
+ cqResult? : string ; // 分类问题结果
260
+
261
+ extractDescription? : string ; // 内容提取描述
262
+ extractResult? : Record <string , any >; // 内容提取结果
263
+
264
+ params? : Record <string , any >; // HTTP模块params
265
+ body? : Record <string , any >; // HTTP模块body
266
+ headers? : Record <string , any >; // HTTP模块headers
267
+ httpResult? : Record <string , any >; // HTTP模块结果
268
+
269
+ pluginOutput? : Record <string , any >; // 插件输出
270
+ pluginDetail? : ChatHistoryItemResType []; // 插件详情
271
+
272
+ isElseResult? : boolean ; // 判断器结果
273
+ };
289
274
```
290
275
291
276
## 实践案例
@@ -296,87 +281,75 @@ type ResponseType = {
296
281
297
282
![ ] ( /imgs/share-auth1.png )
298
283
299
-
300
-
301
284
<Tabs items = { [' /shareAuth/init' ,' /shareAuth/start' ,' /shareAuth/finish' ]} >
302
285
<Tab value = " /shareAuth/init" >
303
286
304
-
305
287
这个接口中,我们设置了` token ` 必须等于` fastgpt ` 才能通过校验。(实际生产中不建议固定写死)
306
288
307
289
``` ts
308
- import cloud from ' @lafjs/cloud'
290
+ import cloud from ' @lafjs/cloud' ;
309
291
310
292
export default async function (ctx : FunctionContext ) {
311
- const { token } = ctx .body
312
-
313
- // 此处省略 token 解码过程
293
+ const { token } = ctx .body ;
294
+
295
+ // 此处省略 token 解码过程
314
296
if (token === ' fastgpt' ) {
315
- return { success: true , data: { uid: " user1" } }
297
+ return { success: true , data: { uid: ' user1' } };
316
298
}
317
299
318
- return { success: false ,message:" 身份错误" }
300
+ return { success: false , message: ' 身份错误' };
319
301
}
320
-
321
302
```
322
303
323
-
324
304
</Tab >
325
305
326
306
<Tab value = " /shareAuth/start" >
327
307
328
-
329
308
这个接口中,我们设置了` token ` 必须等于` fastgpt ` 才能通过校验。并且如果问题中包含了` 你 ` 字,则会报错,用于模拟敏感校验。
330
309
331
310
``` ts
332
- import cloud from ' @lafjs/cloud'
311
+ import cloud from ' @lafjs/cloud' ;
333
312
334
313
export default async function (ctx : FunctionContext ) {
335
- const { token, question } = ctx .body
314
+ const { token, question } = ctx .body ;
336
315
337
- // 此处省略 token 解码过程
316
+ // 此处省略 token 解码过程
338
317
if (token !== ' fastgpt' ) {
339
- return { success: false , message: " 身份错误" }
340
-
318
+ return { success: false , message: ' 身份错误' };
341
319
}
342
320
343
- if (question .includes (" 你 " )) {
344
- return { success: false , message: " 内容不合规" }
321
+ if (question .includes (' 你 ' )) {
322
+ return { success: false , message: ' 内容不合规' };
345
323
}
346
324
347
- return { success: true , data: { uid: " user1" } }
325
+ return { success: true , data: { uid: ' user1' } };
348
326
}
349
-
350
327
```
351
328
352
-
353
329
</Tab >
354
330
355
331
<Tab value = " /shareAuth/finish" >
356
332
357
-
358
333
结果上报接口可自行进行逻辑处理。
359
334
360
335
``` ts
361
- import cloud from ' @lafjs/cloud'
336
+ import cloud from ' @lafjs/cloud' ;
362
337
363
338
export default async function (ctx : FunctionContext ) {
364
- const { token, responseData } = ctx .body
365
-
366
- const total = responseData .reduce ((sum ,item ) => sum + item .price ,0 )
367
- const amount = total / 100000
339
+ const { token, responseData } = ctx .body ;
340
+
341
+ const total = responseData .reduce ((sum , item ) => sum + item .price , 0 );
342
+ const amount = total / 100000 ;
368
343
369
344
// 省略数据库操作
370
345
371
- return { }
346
+ return {};
372
347
}
373
348
```
374
349
375
-
376
350
</Tab >
377
351
</Tabs >
378
352
379
-
380
353
### 2. 配置校验地址
381
354
382
355
我们随便复制3个地址中一个接口: ` https://d8dns0.laf.dev/shareAuth/finish ` , 去除` /shareAuth/finish ` 后填入` 身份校验 ` :` https://d8dns0.laf.dev `
@@ -394,7 +367,6 @@ export default async function (ctx: FunctionContext) {
394
367
1 . 打开源链接或者` authToken ` 不等于` fastgpt ` 的链接会提示身份错误。
395
368
2 . 发送内容中包含你字,会提示内容不合规。
396
369
397
-
398
370
## 使用场景
399
371
400
372
这个鉴权方式通常是帮助你直接嵌入` 分享链接 ` 到你的应用中,在你的应用打开分享链接前,应做` authToken ` 的拼接后再打开。
0 commit comments