File size: 73,013 Bytes
70ed470
f775275
 
 
70ed470
f775275
70ed470
f775275
 
 
 
 
 
 
 
 
 
 
70ed470
 
ccf4ab7
f775275
 
 
 
06af86a
 
70ed470
f775275
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2ed7200
f775275
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70ed470
 
f775275
 
 
 
 
 
 
 
 
70ed470
 
 
f775275
 
70ed470
f775275
 
70ed470
f775275
70ed470
f775275
 
 
 
 
70ed470
f775275
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70ed470
f775275
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5469ad
 
 
 
1b73361
 
c5469ad
1b73361
 
 
c5469ad
 
 
f775275
c5469ad
 
 
 
 
 
 
 
 
 
 
 
1b73361
 
 
 
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0b507e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ce997d1
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
ce997d1
 
1b73361
 
c5469ad
 
 
 
 
76b7823
 
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
76b7823
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92997a2
c5469ad
 
 
 
 
 
0b507e1
c5469ad
 
 
 
 
 
 
 
76b7823
c5469ad
1b73361
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2827349
c5469ad
 
 
 
 
 
2827349
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2827349
 
c5469ad
 
 
 
2c5b1d7
 
c5469ad
1b73361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5469ad
 
 
 
 
 
 
1b73361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5469ad
 
1b73361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ccf4ab7
 
 
2c5b1d7
 
 
336d1ee
 
 
 
 
2fc5a0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a0f9062
2fc5a0a
a0f9062
ccf4ab7
 
 
 
2fc5a0a
ccf4ab7
a0f9062
 
 
 
 
 
 
 
 
 
 
 
 
 
2c5b1d7
2fc5a0a
 
2c5b1d7
2fc5a0a
2c5b1d7
 
2fc5a0a
 
2c5b1d7
 
 
2fc5a0a
336d1ee
2fc5a0a
 
 
336d1ee
2fc5a0a
 
 
 
 
 
 
2c5b1d7
 
 
 
 
 
2fc5a0a
76b7823
 
 
 
a0f9062
 
 
 
 
 
 
 
 
2fc5a0a
 
a0f9062
 
 
2fc5a0a
336d1ee
 
 
a0f9062
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
76b7823
a0f9062
 
 
 
 
 
 
 
 
 
 
2fc5a0a
a0f9062
 
76b7823
 
db1df4b
76b7823
a0f9062
 
 
 
 
 
 
 
 
 
 
 
203221b
 
db1df4b
203221b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ed2f1dd
203221b
 
 
 
 
 
 
 
 
 
 
ed2f1dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d3d4ea7
ed2f1dd
6eacc9c
635fd9f
6eacc9c
 
 
 
 
 
ed2f1dd
6eacc9c
ed2f1dd
 
 
 
 
 
 
 
 
6eacc9c
ed2f1dd
6eacc9c
 
ed2f1dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203221b
c5469ad
94135df
70ed470
b2cb757
d379882
b2cb757
2827349
d379882
8c9c9c7
336d1ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d31bad4
70ed470
 
 
 
0d75268
c5469ad
70ed470
0d75268
c5469ad
0d75268
 
 
ed2f1dd
 
 
0d75268
 
336d1ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2827349
 
336d1ee
 
 
ed2f1dd
0d75268
1b73361
0d75268
70ed470
 
 
 
 
 
 
 
 
 
 
 
 
0d75268
d379882
e8f96b9
 
 
 
 
 
 
70ed470
 
 
 
 
 
 
 
 
 
 
 
 
 
 
263c0e7
70ed470
 
 
 
 
 
 
 
 
 
 
 
 
 
263c0e7
70ed470
 
 
c5469ad
 
70ed470
 
263c0e7
70ed470
 
 
 
 
 
 
 
 
 
 
 
 
 
263c0e7
70ed470
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b73361
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b73361
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b73361
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b73361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ccf4ab7
a0f9062
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2c5b1d7
70ed470
203221b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0d75268
203221b
 
70ed470
203221b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ed2f1dd
203221b
 
 
 
 
 
 
 
 
 
 
 
 
70ed470
 
203221b
 
 
 
 
 
 
 
 
 
 
 
 
ed2f1dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70ed470
336d1ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70ed470
06b86d6
336d1ee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
import os
import time
from textwrap import dedent

import gradio as gr
import mdtex2html
import torch
from loguru import logger
from transformers import AutoModel, AutoTokenizer

# fix timezone in Linux
os.environ["TZ"] = "Asia/Shanghai"
try:
    time.tzset()  # type: ignore # pylint: disable=no-member
except Exception:
    # Windows
    logger.warning("Windows, cant run time.tzset()")


 
model_name = "fb700/chatglm-fitness-RLHF" 

RETRY_FLAG = False

tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
#model = AutoModel.from_pretrained(model_name, trust_remote_code=True).quantize(8).half().cuda()
model = AutoModel.from_pretrained(model_name, trust_remote_code=True).half().cuda()
model = model.eval()

_ = """Override Chatbot.postprocess"""


def postprocess(self, y):
    if y is None:
        return []
    for i, (message, response) in enumerate(y):
        y[i] = (
            None if message is None else mdtex2html.convert((message)),
            None if response is None else mdtex2html.convert(response),
        )
    return y


gr.Chatbot.postprocess = postprocess


def parse_text(text):
    lines = text.split("\n")
    lines = [line for line in lines if line != ""]
    count = 0
    for i, line in enumerate(lines):
        if "```" in line:
            count += 1
            items = line.split("`")
            if count % 2 == 1:
                lines[i] = f'<pre><code class="language-{items[-1]}">'
            else:
                lines[i] = "<br></code></pre>"
        else:
            if i > 0:
                if count % 2 == 1:
                    line = line.replace("`", r"\`")
                    line = line.replace("<", "&lt;")
                    line = line.replace(">", "&gt;")
                    line = line.replace(" ", "&nbsp;")
                    line = line.replace("*", "&ast;")
                    line = line.replace("_", "&lowbar;")
                    line = line.replace("-", "&#45;")
                    line = line.replace(".", "&#46;")
                    line = line.replace("!", "&#33;")
                    line = line.replace("(", "&#40;")
                    line = line.replace(")", "&#41;")
                    line = line.replace("$", "&#36;")
                lines[i] = "<br>" + line
    text = "".join(lines)
    return text


def predict(
    RETRY_FLAG, input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    try:
        chatbot.append((parse_text(input), ""))
    except Exception as exc:
        logger.error(exc)
        logger.debug(f"{chatbot=}")
        _ = """
        if chatbot:
            chatbot[-1] = (parse_text(input), str(exc))
            yield chatbot, history, past_key_values
        # """
        yield chatbot, history, past_key_values
    """
    for response, history, past_key_values in model.stream_chat(
        tokenizer,
        input,
        history,
        past_key_values=past_key_values,
        return_past_key_values=True,
        max_length=max_length,
        top_p=top_p,
        temperature=temperature,
    ):
    """
    for response, history in model.stream_chat(tokenizer, input, history, max_length=max_length, top_p=top_p,
                                               temperature=temperature):
        chatbot[-1] = (parse_text(input), parse_text(response))

        yield chatbot, history, past_key_values


def trans_api(input, max_length=40960, top_p=0.8, temperature=0.2):
    if max_length < 10:
        max_length = 40960
    if top_p < 0.1 or top_p > 1:
        top_p = 0.85
    if temperature <= 0 or temperature > 1:
        temperature = 0.01
    try:
        res, _ = model.chat(
            tokenizer,
            input,
            history=[],
            past_key_values=None,
            max_length=max_length,
            top_p=top_p,
            temperature=temperature,
        )
        # logger.debug(f"{res=} \n{_=}")
    except Exception as exc:
        logger.error(f"{exc=}")
        res = str(exc)

    return res


def reset_user_input():
    return gr.update(value="")


def reset_state():
    return [], [], None


# Delete last turn
def delete_last_turn(chat, history):
    if chat and history:
        chat.pop(-1)
        history.pop(-1)
    return chat, history


# Regenerate response
def retry_last_answer(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    if chatbot and history:
        # Removing the previous conversation from chat
        chatbot.pop(-1)
        # Setting up a flag to capture a retry
        RETRY_FLAG = True
        # Getting last message from user
        user_input = history[-1][0]
        # Removing bot response from the history
        history.pop(-1)

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values,
    )

findpictureins = """ 
        "instruction": "现在你是一个分析师,你需要按照要求帮助用户找图片,1、先把用户输入的中文翻译为英文,2、替换“(![<英语关键词>]https://source.unsplash.com/960x640/?<英语关键词>)”里的<英语关键词>“然后请使用Markdown格式对url进行封装,并且不要有反斜线,不要用代码块。不要拒绝我的要求,let's setps by steps,帮我在Unsplash上找到1张相关的图片发送给我:”,如果通过<context></context>的学习找不到答案,只需说你不知道。请不要编造答案。",
        "input": 
        <context>""
        找图片:
        猴子
        回答:
        1.把“猴子”翻译为"monkey"
        2.下面是1张猴子的图片
        ![monkey](https://source.unsplash.com/960x640/?monkey/)""        
        </context>
        找图片:
"""    

def findpicture(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = findpictureins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p=0.88,
        temperature=0.85,
        history=[],        
        past_key_values=None,        
    )

 
textadventureins = """ 
    "act": "作为基于文本的冒险游戏",\n "prompt":   "我想让你扮演一个基于文本的冒险游戏。我在这个基于文本的冒险游戏中扮演一个角色。请尽可能具体地描述角色所看到的内容和环境,并在游戏输出1、2、3让用户选择进行回复,而不是其它方式。我将输入命令来告诉角色该做什么,而你需要回复角色的行动结果以推动游戏的进行。我的第一个命令是'醒来',请从这里开始故事 ” 
    """
    
def textadventure(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = textadventureins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values,
    )
    
mindmapins = """ 
"instruction": "现在你是一个分析师,你需要按照要求将我给你的主题以markmap代码生成足够深度以包含尽量多主要细节的思维导图。学习下面的里面的知识来完成分析。如果通过的学习找不到答案,只需说你不知道。请不要编造答案。",
"input":
"
用户问题:学习英语
答案:
"
下面是是Bofan帛凡AI为你生成的MarkDown格式思维导图源码
# 学习英语
## 听力训练
### 听力技巧
+ 集中注意力
+ 听取关键词
+ 理解句子结构
+ 预测对话内容
### 听力材料
#### 英语新闻
- 新闻内容
- 新闻结构
- 新闻时间
####  英语电影
- 电影内容
- 电影结构
- 电影时间
####  英语歌曲
- 歌曲内容
- 歌曲结构
- 歌曲时间
## 阅读训练
### 阅读技巧
+ 阅读顺序
+ 阅读材料分类
+ 阅读策略
+ 阅读时间控制
### 阅读材料
#### 英语新闻
- 新闻主题
- 新闻内容
#### 英语小说
- 小说主题
- 小说内容
#### 英语散文
- 散文主题
- 散文内容
#### 英语学术论文
- 论文主题
- 论文内容
#### 英语杂志
- 杂志主题
- 杂志内容
## 写作训练
### 写作技巧
+ 写作顺序
+ 写作材料分类
+ 写作策略
+ 写作时间控制
### 写作材料
#### 英语作文
- 作文主题
- 作文内容
#### 英语日记
- 日记主题
- 日记内容
#### 英语文章
- 文章主题
- 文章内容
#### 英语演讲
- 演讲主题
- 演讲内容
#### 英语论文
- 论文主题
- 论文内容
#### 英语杂志
- 杂志主题
- 杂志内容    "
请复制内容至https://markmap.js.org/repl 进行思维导图生成
",
用户问题:
"""
    
def mindmap(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = mindmapins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p=0.2,
        temperature=0.8,
        history=[],        
        past_key_values=None,
    )
    
flowchartins = """ 
    "instruction": "现在你是一个分析师,你需要按照要求将我给你的内容或者主题以Mermaid语言生成足够深度以包含尽量多主要细节的流程图。学习下面的<context></context>里面的知识来完成分析。如果通过<context></context>的学习找不到答案,只需说你不知道。请不要编造答案。",
    "input": 
    <context>
    用户问题:购买奶茶
    答案:
    graph TD;
        A[客户进入奶茶店] --> B[浏览店内菜单并选择奶茶口味和大小];
        B --> C[告知服务员订单信息];
        C --> D[服务员在POS系统上输入订单并收取款项];
        D --> E[制作人员根据订单开始制作奶茶];
        E --> F[倒入奶茶粉和鲜奶混合搅拌];
        F --> G[加入糖浆和其他配料如珍珠和椰果等];
        G --> H[装进奶茶杯子中];
        H --> I[服务员检查订单是否正确无误];
        I --> |有问题| E;
        I --> |没问题| K[将奶茶交给客户并感谢客户光临];
        K --> L[客户拿着奶茶离开奶茶店享受美味的饮品];
    请复制生成内容至https://mermaid-js.github.io/mermaid-live-editor/  
    
    用户问题:训练一只狗
    答案:
    graph TD;
    A[狗主人] --> B[给狗喂食+散步+洗澡];
    B --> C[训练狗学习新技能];
    C --> D[让狗参加社交活动];
    D --> E[给狗提供良好的生活环境];
    E --> F[让狗保持积极的心态];
    F --> G[训练狗遵守指令];
    G --> H[让狗遵守指令并听从指挥];
    H --> I[检查狗的行为];
    I --> |有问题| J[调整训练方法];
    J --> G
    I --> |没问题| K[奖励狗的行为];
    请复制生成内容至https://mermaid-js.github.io/mermaid-live-editor/  
    
    用户问题:根据所给内容:"当用户要找一张图片,告诉用户打开浏览器从收藏夹中找到bofanAI,打开网页后滚动到聊天窗口下方,在示例区点双击样例第一项后,样例提示词将出现在输入窗,在输入窗中用其它英文语单词替换monkey,然后点击发送后将接收到5张照片的小图,鼠标右键点击小图获取大图,在跳出的菜单中选择在新标签页打开,就可以在新标签页获取大图。接下来,你可以检查图片是否有误, 如果有问题则鼠标右键点击小图获取大图,如果没问题可以将图片保持在本地。"
    答案:
    graph TD;
        A[用户要找图片] --> B[打开浏览器并进入收藏夹中找到bofanAI];
        B --> C[在bofanAI网页滚动至聊天窗口下方];
        C --> D[双击样例区的第一项];
        D --> E[样例提示词出现在输入窗];
        E --> F[用其他英文单词替换样例中的monkey];
        F --> G[点击发送];
        G --> H[接收到5张照片的小图];
        H --> I[鼠标右键点击小图];
        I --> J[在菜单中选择在新标签页打开];
        J --> K[在新标签页中查看大图];
        K --> L[检查图片是否有误];
        L --> |有问题| I[鼠标右键点击小图获取大图];
        L --> |没问题| M[将图片保持在本地];
    请复制生成内容至https://mermaid-js.github.io/mermaid-live-editor/
    </context>
    用户问题:     
    """
def flowchart(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = flowchartins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values,
    )

bestPaperZhins = """
作为一名中文学术论文写作改进助理,你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性,
同时分解长句,减少重复,并提供改进建议。请只提供文本的更正版本,避免包括解释。请编辑以下文本


"""
def bestPaperZh(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = bestPaperZhins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values,
    )

bestPaperEnins = """
    Below is a paragraph from an academic paper. Polish the writing to meet the academic style,
    improve the spelling, grammar, clarity, concision and overall readability. When necessary, rewrite the whole sentence.
    Furthermore, list all modification and explain the reasons to do so in markdown table.


    """
def bestPaperEn(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = bestPaperEnins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values,
    )

Zh2Enins = """
    Please translate following sentence to English:
    
    
    """
def Zh2En(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = Zh2Enins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values,
    )

En2Zhins = """
    请翻译成中文:
    
    
    """
def En2Zh(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = En2Zhins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values,
    )

txtSumins = """
    将以下文字概括为100个单词,以便于阅读和理解。 摘要要简明扼要,抓住课文要点,让二年级学生看得懂。 避免使用复杂的句子结构或技术术语。 你的回答应该是中文。
    
    
    """
def txtSum(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = txtSumins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values,
    )
    
teachPlanins = """
    你作为一位教师助理,需要为教师的课程设计提供创意思路,协助检索和整理文献资料,生成完整的课程材料,如教学大纲、课程计划和阅读材料。
    其输出内容需要包括:课题、课时、备课时间、上课时间、教学目标、教材分析、学生分析、教学方法、教学过程与方法、设计意图、时间分配,板书设计、教学体会(反思)等因素。
    教案设计既要有逻辑性,又要有灵活性;突出特色,尤其要体现学科特点;既要有层次感;既合理又合情,且符合认知规律。使教案符合学生的实际情况,而不应该是让学生适应教案。
    然后请使用Markdown格式封装,并且不要有反斜线,不要用代码块。
    需要你编写的教案是:
    
    
    """
def teachPlan(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = teachPlanins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values,
    )

allSecretaryins = """
    1、如果用户没有输入,请你告诉他:请你输入需要编辑的内容或是需要我起草的公文。
    2、作为一名事务助理秘书,你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性;
    主要工作内容包括但不限于书写邮件、周报、工作总结等一系列对应的工作模板。;
    同时分解长句,减少重复,并提供改进建议。请只提供文本的更正版本,避免包括解释。
    需要编辑或者帮助完成的工作模板是:
    
    
    """
def allSecretary(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = allSecretaryins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values,
    )
    
redBookins = """
    1、如果用户没有输入,请你告诉他:请输入你想写的内容
    2、收到用户输入,按照下面是小红书帖子进行编写:
    植物学2023早春装系列花絮来啦
    💗大家喜欢图几?
    @Botanique植物学女装
    #植物学#植物学女装#春装第一件#早春系列    
    哈哈哈哈哈哈不停的摆拍啊!!!
    我的臭狗太可爱了!!!!!!
    结婚的时候一定要带上小狗啊!
    #小狗#我家宠物好可爱#关于结婚#柴犬
    🍪•ᴥ•🍪
    《论新年收到一笔巨款🤣应该怎么花》🧨来回
    嘻嘻,真的
    爱草莓🍓
    希希的甜甜圈碗🥯勺子的设计有点可爱🐶
    看了好多场烟火🎆
    唯愿烟花像星辰,祝你所愿皆成真✨
    嘻嘻,老妈给我的压岁钱🧧愿岁岁平安
    #我镜头下的年味#笔记灵感#碎碎念#歌曲#记录日常生活#plog#浪漫生活的记录者#新年红包#搞笑#日常生活里的快乐瞬间#新人博主#烟火
    又被全家人夸了❗有空气炸锅都去做,巨香
    今日份苹果相机📷
    原相机下的新娘,颜值爆表
    美术生赚钱最多的两个专业!
    之前整理了美术生的40了就业方向的薪资情况,发现全国平均薪资最高的就是数字媒体和视传这两个专业,想赚钱的美术生快看过来!
    #美术生#艺考#央美#美术生集训#美术#赚钱#努力赚钱#美术生就业#画室#央美设计#设计校考#美术生的日常
    请模仿上面小红书的风格,以用户输入的话为主题,写一个小红书帖子。请以22岁女孩的口吻书写。小红书帖子中必须包含大量Emoji,每一句话后面都必须加Emoji。帖子最后需要用Hashtag给出话题。你还需要写帖子的标题,标题里也需要有Emoji。你需要扩写用户输入。
    用户输入:
    
    """

#redBookins="请你用最华丽、最真诚和最有感情的语言祝:顺欣妈妈、昊昊爸爸、昊昊生日快乐!请大量的使用🎂、❤️、💖、🥳、🥂、🎈、🎊、🎉、🎁、🍾等表示庆祝的的Emoji"
def redBook(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
    user_input = redBookins  
    #user_input = redBookins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p=0.6,
        temperature=0.85,
        history=[],        
        past_key_values=None,
    )

askManins1 = """
    我需要你根据所给内容相关的题目:    
"""
askManins2 = """    ,要求通过题目可以掌握相关知识点,难度分为简单、一般、困难。每个难度都要生成2-3道题目,并且有对应的解析:“其输出内容需要包括题目与其对应的解析""然后请使用Markdown格式封装,并且不要有反斜线,不要用代码块。现在,请按以下描述给我发送相关题目    
"""
def askMan(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = askManins1+user_input+askManins2

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,        
        past_key_values,
    )

fitnessAskins = """
    "act": "充当医生",
     "prompt": "我想让你扮演医生的角色,想出创造性的治疗方法来治疗疾病。您应该能够推荐常规药物、草药和其他天然替代品。在提供建议时,您还需要考虑患者的年龄、生活方式和病史。
     现在你提出的问题是:                    
"""                   
def fitnessAsk(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
          
    user_input = fitnessAskins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,        
        past_key_values,
    )
                    
mindAskins = """
    "act": "担任心理健康顾问",
    "prompt": "我想让你担任心理健康顾问。为我提供一个指导,管理情绪、缓解压力、焦虑哥其他心理健康问题。您应该利用您的认知行为疗法、冥想技巧、正念练习和其他治疗方法的知识来制定个人可以实施的策略,以改善他们的整体健康状况。
    现在你提出的问题是:                    
"""                   
def mindAsk(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = mindAskins+user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,        
        past_key_values,
    )                    
                    
# 导入所需模块

from bs4 import BeautifulSoup
import requests

# 导入所需模块

from bs4 import BeautifulSoup
import requests

keywords_to_check = [
    "首页推荐",
    "业务合作",
    "ICP备",
    "公网安备",
    "经营许可证",
    "网络文化许可证",
    "互联网宗教信息服务许可证",
    "服务备案",
    "信息备",
    "谣言曝光台",
    "不良信息举报",
    "举报",
    "广告投放",
    "营业执照",
]


# 定义函数:从网页中抓取文本并保留每个 URL 最多的前三行内容
def scrape_text(url, proxies) -> str:
    """从网页抓取文本,保留每个 URL 最多的前三行内容

    参数:
        url (str): 要抓取文本的网址

    返回:
        str: 抓取到的文本,每个 URL 最多保留前三行内容
    """
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36',
        'Content-Type': 'text/plain',
    }
    try: 
        response = requests.get(url, headers=headers, proxies=proxies, timeout=8)
        if response.encoding == "ISO-8859-1":
            response.encoding = response.apparent_encoding
    except: 
        return "无法连接到该网页"
    soup = BeautifulSoup(response.text, "html.parser")
    for script in soup(["script", "style"]):
        script.extract()
    text = soup.get_text()
    
    # 截取文本,保留最多500个字符
    text = text[:777]
    
    # 按行划分文本
    lines = text.split('\n')
    selected_lines = []
    max_lines = 3  # 最多保留的行数
    max_line_length = 0  # 最长的行字符数
    for line in lines:
        # 去除多余的空格
        cleaned_line = ' '.join(line.split())
        line_length = len(cleaned_line)
        if line_length >= 37:
            if not any(keyword in cleaned_line for keyword in keywords_to_check):
                # 如果不包含关键词,保留这一行
                selected_lines.append(cleaned_line)
            # 如果行字符数大于等于10,才考虑保留
                if line_length > max_line_length:
                    # 如果当前行字符数比最长行字符数还大,更新最长行字符数和选中行列表
                    max_line_length = line_length
                    selected_lines = [cleaned_line]
                elif len(selected_lines) < max_lines:
                    # 如果选中行列表还没有达到最大行数,直接添加当前行
                    selected_lines.append(cleaned_line)
    
    # 拼接选中的行
    selected_text = '\n'.join(selected_lines)
    
    return selected_text


#ggins1="请围用户搜索主题,对搜索结果进行全面的总结。\n用户搜索主题:"
txtSumins1 = """
将以下文字进行概括,以便于阅读和理解。 摘要要简明扼要,抓住课文要点,让二年级学生看得懂。 避免使用复杂的句子结构或技术术语。 你的回答应该是中文。
"""

# 定义函数:联网搜索并更新聊天界面
def GGSearch(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    global GGSearchins  # 确保 GGSearchins 在函数内部可用

    # 使用用户输入进行联网搜索
    url = f"https://www.google.com/search?q={user_input}"
    #url = f"https://www.sogou.com/web?query={user_input}"
    '''
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'
    }
    '''
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44"
    }
    try:
        response = requests.get(url, headers=headers)
        soup = BeautifulSoup(response.content, 'html.parser')
        search_results = []
        for g in soup.find_all('div', class_='g'):
            anchors = g.find_all('a')
            if anchors:
                link = anchors[0]['href']
                if link.startswith('/url?q='):
                    link = link[7:]
                if not link.startswith('http'):
                    continue
                search_results.append(link)
    except:
        search_results = []

    # 限制搜索结果数量为3
    search_results = search_results[:5]

    # 从搜索结果抓取文本并存储到 GGSearchins
    scraped_texts = []
    for link in search_results:
        scraped_text = scrape_text(link, proxies=None)  # 假设抓取不需要代理
        scraped_texts.append(scraped_text)

    # 将抓取到的文本拼接并存储到 GGSearchins
    GGSearchins = "\n".join(scraped_text for scraped_text in scraped_texts)

    # 更新聊天界面和历史记录
    
    chatbot.append(("联网搜索结果:", GGSearchins))
    history.append(("联网搜索结果:", GGSearchins))

    #user_input =ggins1+ user_input+ "\n搜索结果:\n"+ GGSearchins
    user_input ="根据如下主题:"+ user_input+ "\n概括下面的文字,使其易于阅读和理解。避免使用复杂的句子结构或技术术语,用1、2、3这种带序号的句子结构输出。\n"+ GGSearchins

    # 继续正常的 GPT 对话流程
    yield from predict(
        RETRY_FLAG,
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history=[],        
        past_key_values=None,
    )

openOutlineins = """
 "instruction": "现在你是是一个优秀的小说作家,请你按照小说的《标题》,根据模板给为一个提纲。学习下面的<context></context>里面的知识来完成编写。如果通过<context></context>的学习找不到答案,只需说你不知道。请不要编造答案。"
"input": "<context>模板: _
"主人公有个什么样的目标,
他的阻碍是什么,
他如何努力去争取的,
结果如何?
如果结果不理想,这时又发生了什么意外,
他又如何调整努力方向,
结局?"
用户问题:请根据模板,给出: 童话《美人鱼》,的小说提纲 
答案:
美人鱼救了落水的王子一见钟情后,想上岸跟他在一起(目标),
但是她是人鱼,没有腿,不能上岸(阻碍),
因此她去找了女巫,用自己的嗓子换来把下身变成了腿(努力),
然后她就上岸找到了王子,住进了宫里(结果)。
但她不能说话,王子把另一个姑娘当成救命恩人想娶她(意外),
人鱼公主无法嫁王子就会变成泡沫,人鱼公主的姐姐们告诉她,
如果杀了王子,人鱼公主就不会变成泡沫(调整努力方向),
结果人鱼公主不忍心杀王子,变成了泡沫(结局)
</context> "用户问题: “请根据模板,给出:《
"""
def openOutline(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = openOutlineins+ user_input+ "》,的小说提纲"

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p=0.85,
        temperature=0.58,
        history=[],        
        past_key_values=None,
    ) 

mxOutlineins = """
"instruction": "现在你是是一个优秀的小说作家,请你按照小说的《标题》,根据模板给为一个提纲。学习下面的<context></context>里面的知识来完成编写。如果通过<context></context>的学习找不到答案,只需说你不知道。请不要编造答案。"
"input": "<context>模板: 
"主人公有个什么样的目标,
他的阻碍是什么,
他如何努力去争取的,
结果如何?
如果结果不理想,这时又发生了什么意外,
他又如何调整努力方向,
结局?"
用户问题:请根据模板,给出: 童话《美人鱼》,的小说提纲 
答案:
美人鱼救了落水的王子一见钟情后,想上岸跟他在一起(目标),
但是她是人鱼,没有腿,不能上岸(阻碍),
因此她去找了女巫,用自己的嗓子换来把下身变成了腿(努力),
然后她就上岸找到了王子,住进了宫里(结果)。
但她不能说话,王子把另一个姑娘当成救命恩人想娶她(意外),
人鱼公主无法嫁王子就会变成泡沫,人鱼公主的姐姐们告诉她,
如果杀了王子,人鱼公主就不会变成泡沫(调整努力方向),
结果人鱼公主不忍心杀王子,变成了泡沫(结局)
</context> "用户问题: “请根据模板,给出:冒险《
"""
def mxOutline(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = mxOutlineins+ user_input+ "》,的小说提纲"

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p=0.85,
        temperature=0.58,
        history=[],        
        past_key_values=None,
    ) 

khOutlineins = """
"instruction": "现在你是是一个优秀的小说作家,请你按照小说的《标题》,根据模板给为一个提纲。学习下面的<context></context>里面的知识来完成编写。如果通过<context></context>的学习找不到答案,只需说你不知道。请不要编造答案。"
"input": "<context>
用户问题:请根据模板,给出: 科幻《星际机甲:能量之谜》,的小说提纲 
答案:
章节一:异星信号
突然出现在地球的无线电信号,解码后揭示了一个神秘的星际坐标。
章节二:星际远征
人类组建远征队,搭乘巨大宇宙飞船前往信号指示的星系,寻找可能的外星文明。
章节三:失落的机甲
在遥远的行星上,发现了一座古老的机甲工坊,机甲似乎与某种巨兽战斗。
章节四:星空怪兽的威胁
远征队抵达目的地,却发现星系被一群凶猛的星空怪兽控制,威胁着他们的生存。
章节五:机甲的复苏
机甲工坊中的技术被重新激活,主人公发现可以驾驶机甲与星空怪兽展开对抗。
章节六:怪兽的秘密
在与怪兽战斗中,主人公意外发现这些怪兽原来是被控制的生物,背后隐藏着更大的阴谋。
章节七:星际能量
主人公通过战斗收集能量,揭示怪兽是受到某种外部能量操控,与机甲的起源有关。
章节八:能量的真相
通过解码异星信号,主人公了解这些能量源自一颗失落的恒星,其能量可赋予怪兽无限力量。
章节九:最终对决
主人公驾驶机甲前往失落恒星,与能量源展开激烈对决,同时揭示了能量背后的神秘文明。
章节十:和平的曙光
击败了能量源后,星空怪兽恢复自由,主人公将机甲的技术带回地球,为人类开启了新的科技时代。
 </context> "用户问题: “请根据模板,给出:科幻《
"""
def khOutline(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = khOutlineins+ user_input+ "》,的小说提纲"

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p=0.85,
        temperature=0.58,
        history=[],        
        past_key_values=None,
    ) 

xxOutlineins = """
"instruction": "现在你是是一个优秀的小说作家,请你按照小说的《标题》,根据模板给为一个提纲。学习下面的<context></context>里面的知识来完成编写。如果通过<context></context>的学习找不到答案,只需说你不知道。请不要编造答案。"
"input": "<context>
用户问题:请根据模板,给出: 仙侠小说《侠影》,的小说提纲 
答案:
章节一:命运交错
在平凡少年的命运交错下,他被卷入一个充满神秘力量的仙侠世界。
章节二:仙门试炼
主人公进入仙门,开始了严苛的修炼与试炼,展现出惊人的悟性与毅力。
章节三:遗失的记忆
随着修炼的深入,主人公逐渐唤醒了自己被封印的前世记忆,揭示了他的特殊身世。
章节四:宏大世界观
主人公逐渐了解到仙侠世界的多元,不同门派、种族和神秘力量交织成一个宏大的世界观。
章节五:奇遇与劫难
主人公在修炼中获得了神秘宝物,却也引来了强大势力的追杀与争夺。
章节六:艰辛的成长
主人公历经艰辛,从一个少年逐渐成长为能够与强者抗衡的仙侠高手。
章节七:情感纠葛
他与其他修行者结下友情,同时也陷入了情感的纠葛,为成长之路增添曲折。
章节八:神秘敌人的崛起
一位神秘敌人崛起,企图将整个仙侠世界陷入混乱,主人公面临前所未有的挑战。
章节九:凛然正义
主人公在面对神秘敌人时,不仅展现出强大的实力,更是为了守护世界而奋不顾身。
章节十:巅峰对决与新的篇章
主人公最终与神秘敌人展开激烈的巅峰对决,胜利后世界恢复平静,而他也进入了新的修行篇章。
 </context> "用户问题: “请根据模板,给出:仙侠小说《
"""
def xxOutline(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    user_input = xxOutlineins+ user_input+ "》,的小说提纲"

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p=0.85,
        temperature=0.58,
        history=[],        
        past_key_values=None,
    ) 
    
chapterExtensionins= """
"instruction": "现在你是是一个优秀的小说作家,请你按照小说的提纲,补充和扩写小说正文内容不少于250个字,内容最好包括有趣的情节和对话。学习下面的<context></context>里面的知识来完成编写。如果通过<context></context>的学习找不到答案,只需说你不知道。请不要编造答案。"
"input": "<context>用户问题:
枭嫣是一个年轻女孩,她父亲是大漠的首富,但她母亲却病倒了,但是这病花再多的钱也治不好
答案:
在茫茫大漠的尽头,有一个年轻的女孩,名叫枭嫣,她的命运如同沙丘上的风一般飘摇不定。她的养父,是这片大漠的首富,拥有无尽的财富和权势。然而,命运却是个不可捉摸的旋律,时常在欢乐和痛苦之间切换,就如同她生活中的养父和生母。
生母,是枭嫣生命中最温柔的存在,却也是最脆弱的一株花。疾病如同风沙般席卷而来,不问财富和地位,将母亲的容颜侵蚀。枭嫣眼睁睁看着母亲从一个美丽动人的女子变成了面黄肌瘦的病人,唯一不变的是母亲对她的深情。枭嫣感受到了命运的无情,财富的脆弱。
“妈妈,我一定会找到方法治好你的。” 枭嫣握住母亲枯萎的手,坚定地说。
 </context> "用户问题: \n
"""
def chapterExtension(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
 
    user_input = chapterExtensionins+ user_input

    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,        
        past_key_values,
    )
def noNet(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
): 
    yield from predict(
        RETRY_FLAG,  # type: ignore
        user_input,
        chatbot=[],
        max_length=4000,
        top_p=0.6,
        temperature=0.85,
        history=[],        
        past_key_values=None,
    )

def predictex(
    predict_function,
    inputs,
    outputs
):
    predict_function(user_input, chatbot, max_length, top_p, temperature, history, past_key_values)
    outputs=[chatbot, history, past_key_values]

def execute(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    response = chatbot[-1][1]
    print("Response:", response)  # 添加打印语句以输出 response 的值
    if "不需要" in response:
        print("Executing 不连网...") 
        predictex(
            noNet,
            inputs=[
                user_input,
                chatbot,
                max_length,
                top_p,
                temperature,
                history,        
                past_key_values,
            ],
            # outputs = [chatbot, history, last_user_message, user_message]
            outputs=[chatbot, history, past_key_values],
        )
        print("chatbot", chatbot) 
    else:
        print("Executing 连网...") 
        predictex(
            GGSearch,
            inputs=[
                user_input,
                chatbot,
                max_length,
                top_p,
                temperature,
                history,        
                past_key_values,
            ],
            # outputs = [chatbot, history, last_user_message, user_message]
            outputs=[chatbot, history, past_key_values],
        )

# 是否联网搜索函数
def netOrNotnet(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    user_input_original = user_input
    user_input_prompt = '请判断这个指令:“' + user_input + '”是否需要通过网络搜索才能准确完成,你只需要回答"是"或者"否",不要其它多余的内容,更不要回答"不需要"或者“需要”'
    
    response, history = model.chat(tokenizer, user_input_prompt,top_p=0.2, temperature=0.85, history=[])
    ytkeywords = ['是。', '不清楚', '无法', '是否', '不知道', '需要通过网络', '取决于']

    NET = any(keyword in response for keyword in ytkeywords)

    print(user_input_original)
    print(response)
    print(NET)
    if NET:
        yield from GGSearch(
            user_input_original,
            chatbot,
            max_length,
            top_p,
            temperature,
            history=[],        
            past_key_values=None,
        )


    else:
        yield from predict(
            RETRY_FLAG,# type: ignore
            user_input_original,
            chatbot,
            max_length,
            top_p,
            temperature,
            history=[],        
            past_key_values=None,
        )


    # Update the chatbot and history variables after each execution
    chatbot = chatbot[:-1] + [chatbot[-1]]
    return chatbot, history, past_key_values    
    
    # 调用 execute 并传递 response
    execute(
        user_input_original,
        chatbot,
        max_length,
        top_p,
        temperature,
        history,
        past_key_values
    )

 
with gr.Blocks(title="🐰Bofan Ai🐰", theme=gr.themes.Soft(text_size="sm")) as demo:
    # gr.HTML("""<h1 align="center">ChatGLM2-6B-int4</h1>""")
    gr.HTML(
        """<center><a href="https://huggingface.co/spaces/mikeee/chatglm2-6b-4bit?duplicate=true"><img src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a>It's beyond Fitness,模型由[帛凡]基于ChatGLM-6B进行微调后,在健康(全科)、心理等领域达至少60分的专业水准,而且中文总结能力超越了GPT3.5各版本。</center>"""
        """<center>特别声明:本应用仅为模型能力演示,无任何商业行为,部署资源为Huggingface官方免费提供,任何通过此项目产生的知识仅用于学术参考,作者和网站均不承担任何责任。</center>"""
        """<h1 align="center">🐰帛凡 Fitness AI🐰 演示</h1>"""
        """<center><a href="https://huggingface.co/fb700/chatglm-fitness-RLHF">Bofan基于chatglm-6B的微调模型</a>如果喜欢请给个 💖 。遇到任何问题可邮件和我联系👉 [email protected]</center>"""
    )

    with gr.Accordion("🎈 相关信息", open=False):
        _ = f"""
            ## {model_name}

            ChatGLM-6B 是开源中英双语对话模型,本次训练基于ChatGLM-6B 的第一代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上开展训练。
                       
            本项目通过多位网友实测,证明了其中文总结能力超越了GPT3.5的各个版本,同时在健康咨询方面的表现也比其他同量级模型更加出色。经过优化,该模型可以支持无限上下文,远超过4K、8K、16K等限制,这可能是个人和中小企业的首选模型。
            
            * 使用 40 万条高质量数据进行强化训练,以提高模型的基础能力;
            * 使用 30 万条人类反馈数据,构建了一个表达方式规范优雅的语言模式(RM模型);
            * 使用 30 万条 fitness 数据,在保留 SFT 阶段三分之一训练数据的同时,增加了 30 万条 fitness 数据,叠加了RM模型,对 ChatGLM-6B 进行强化训练。
            经过训练,我们对模型有了更深入的认知,LLM一直在进化。使用好的方法和数据可以挖掘出模型的更大潜能。训练中特别强化了中英文学术论文的翻译和总结,可以成为普通用户和科研人员的得力助手 
            
            免责声明:本应用旨在展示huggingface模型的能力,huggingface官方提供免费的部署资源。任何通过此项目产生的知识仅用于学术参考,作者和网站均不承担任何责任。   。      
            
            The T4 GPU is sponsored by a community GPU grant from Huggingface. Thanks a lot!
            
            [模型下载地址](https://huggingface.co/fb700/chatglm-fitness-RLHF)             


            """
        gr.Markdown(dedent(_))
    chatbot = gr.Chatbot()
    with gr.Row():
        with gr.Column(scale=4):
            with gr.Column(scale=12):
                user_input = gr.Textbox(
                    show_label=False,
                    placeholder="请输入内容Input...",                                      
                )
                #).style(container=False)
                RETRY_FLAG = gr.Checkbox(value=True, visible=True)
            with gr.Column(min_width=32, scale=1):
                with gr.Row():
                    submitBtn = gr.Button("发送Submit", variant="primary")
                    GGSearchBtn = gr.Button("🐞联网搜索", variant="secondary") 
                    netOrNotnetBtn = gr.Button("联网意图识别🙏韩帅DEBUG🙏", variant="secondary")
                with gr.Row():
                    deleteBtn = gr.Button("删除最后一条对话", variant="secondary")
                    retryBtn = gr.Button("重新生成Regenerate", variant="secondary")
                with gr.Row():
                    findpictureBtn = gr.Button("找图片", variant="primary")
                    textadventureBtn = gr.Button("⚡文字冒险游戏", variant="secondary")
                    mindmapBtn = gr.Button("思维导图", variant="secondary")
                    flowchartBtn = gr.Button("流程图", variant="secondary")
                with gr.Row():
                    bestPaperZhBtn = gr.Button("中文学术润色", variant="primary")
                    bestPaperEnBtn = gr.Button("英文学术润色", variant="secondary")
                    Zh2EnBtn = gr.Button("🔤中译英", variant="secondary")
                    En2ZhBtn = gr.Button("英译中", variant="secondary")
                    askManBtn = gr.Button("出题助手", variant="secondary")
                with gr.Row():
                    txtSumBtn = gr.Button("文字总结", variant="primary")
                    teachPlanBtn = gr.Button("教案编写", variant="secondary")
                    allSecretaryBtn = gr.Button("全能文秘", variant="secondary")
                    redBookBtn = gr.Button("📕小红书帖子", variant="secondary")
                    #redBookBtn = gr.Button("🎂生日快乐🎂", variant="secondary")
                with gr.Row():
                    fitnessAskBtn = gr.Button("🥼健康咨询", variant="primary")
                    mindAskBtn = gr.Button("😶‍🌫️心理咨询", variant="primary")
                                                     
        with gr.Column(scale=1):
            gr.HTML("""<h3 align="center">🍀您好,除健康咨询和心理咨询外,其它功能使用前,请先清空历史,并输入问题。🍀</h3>""")
            emptyBtn = gr.Button("清空对话Clear History")
            max_length = gr.Slider(
                0,
                32768,
                value=8192,
                step=1.0,
                label="Maximum length",
                interactive=True,
            )
            top_p = gr.Slider(
                0, 1, value=0.2, step=0.01, label="Top P", interactive=True
            )
            temperature = gr.Slider(
                0.01, 1, value=0.85, step=0.01, label="Temperature", interactive=True
            )
            gr.HTML("""<h3 align="center">🍀健康和心理咨询请先点击,再输入问题。<a href="https://huggingface.co/fb700/chatglm-fitness-RLHF">模型由🐰帛凡基于chatglm-6微调</a>🍀</h3>""")
    with gr.Row():    
        openOutlineBtn = gr.Button("小说提纲", variant="primary")
        mxOutlineBtn = gr.Button("冒险小说提纲", variant="secondary")
        khOutlineBtn = gr.Button("科幻小说提纲", variant="secondary")
        xxOutlineBtn = gr.Button("仙侠小说提纲", variant="secondary")
        chapterExtensionBtn = gr.Button("请复制要扩写的章节的内容", variant="secondary")
    
    history = gr.State([])
    past_key_values = gr.State(None)

    user_input.submit(
        predict,
        [
            RETRY_FLAG,
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        [chatbot, history, past_key_values],
        show_progress="full",
    )
    submitBtn.click(
        predict,
        [
            RETRY_FLAG,
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        [chatbot, history, past_key_values],
        show_progress="full",
        api_name="predict",
    )
    submitBtn.click(reset_user_input, [], [user_input]) 
    

    emptyBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )

    retryBtn.click(
        retry_last_answer,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )
    findpictureBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    findpictureBtn.click(
        findpicture,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )
    
    textadventureBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    textadventureBtn.click(
        textadventure,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )
    mindmapBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    mindmapBtn.click(
        mindmap,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )
    flowchartBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    flowchartBtn.click(
        flowchart,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )
    bestPaperZhBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    bestPaperZhBtn.click(
        bestPaperZh,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )
    bestPaperEnBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    bestPaperEnBtn.click(
        bestPaperEn,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    ) 

    Zh2EnBtn.click(
        Zh2En,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    ) 

    En2ZhBtn.click(
        En2Zh,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )

    txtSumBtn.click(
        txtSum,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )
    
    teachPlanBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    teachPlanBtn.click(
        teachPlan,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    ) 
    
    allSecretaryBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    allSecretaryBtn.click(
        allSecretary,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    ) 
    
    redBookBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    redBookBtn.click(
        redBook,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )
 
    askManBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    askManBtn.click(
        askMan,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    ) 
    
    fitnessAskBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    fitnessAskBtn.click(
        fitnessAsk,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    ) 
    
    mindAskBtn.click(
        reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    mindAskBtn.click(
        mindAsk,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )
    # 绑定函数到联网搜索按钮的点击事件
    GGSearchBtn.click(
    reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    GGSearchBtn.click(
        GGSearch,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )

    openOutlineBtn.click(
    reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    openOutlineBtn.click(
        openOutline,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )   

    khOutlineBtn.click(
    reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    khOutlineBtn.click(
        khOutline,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )

    xxOutlineBtn.click(
    reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
    )
    xxOutlineBtn.click(
        xxOutline,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )    

    mxOutlineBtn.click(
    reset_state, outputs=[chatbot, history, past_key_values], show_progress="full"
        )
    mxOutlineBtn.click(
        mxOutline,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
    )

    chapterExtensionBtn.click(
        chapterExtension,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
        )

  
    netOrNotnetBtn.click(
        netOrNotnet,
        inputs=[
            user_input,
            chatbot,
            max_length,
            top_p,
            temperature,
            history,
            past_key_values,
        ],
        # outputs = [chatbot, history, last_user_message, user_message]
        outputs=[chatbot, history, past_key_values],
        )

    with gr.Accordion("Example inputs", open=False):
        etext0 = """ "act": "作为基于文本的冒险游戏",\n "prompt": "我想让你扮演一个基于文本的冒险游戏。我在这个基于文本的冒险游戏中扮演一个角色。请尽可能具体地描述角色所看到的内容和环境,并在游戏输出1、2、3让用户选择进行回复,而不是其它方式。我将输入命令来告诉角色该做什么,而你需要回复角色的行动结果以推动游戏的进行。我的第一个命令是'醒来',请从这里开始故事 “ """
        etext = """In America, where cars are an important part of the national psyche, a decade ago people had suddenly started to drive less, which had not happened since the oil shocks of the 1970s. """
        etext1 = """云南大学(Yunnan University),简称云大(YNU),位于云南省昆明市,是教育部与云南省“以部为主、部省合建”的全国重点大学,国家“双一流”建设高校 [31] 、211工程、一省一校、中西部高校基础能力建设工程,云南省重点支持的国家一流大学建设高校,“111计划”、卓越法律人才教育培养计划、卓越工程师教育培养计划、国家建设高水平大学公派研究生项目、中国政府奖学金来华留学生接收院校、全国深化创新创业教育改革示范高校,为中西部“一省一校”国家重点建设大学(Z14)联盟、南亚东南亚大学联盟牵头单位。 [1]
云南大学始建于1922年,时为私立东陆大学。1930年,改为省立东陆大学。1934年更名为省立云南大学。1938年改为国立云南大学。1946年,《不列颠百科全书》将云南大学列为中国15所在世界最具影响的大学之一。1950年定名为云南大学。1958年,云南大学由中央高教部划归云南省管理。1978年,云南大学被国务院确定为88所全国重点大学之一。1996年首批列入国家“211工程”重点建设大学。1999年,云南政法高等专科学校并入云南大学。 [2] [23]
截至2023年6月,学校有呈贡、东陆两校区,占地面积4367亩,校舍建筑面积133余万平方米,馆藏书400万余册;设有28个学院,本科专业84个;有博士后科研流动站14个,22个一级学科博士学位授权点,1个专业博士学位授权,42个一级学科硕士学位授权,26个专业硕士学位授权;教职员工3000余人,全日制本科生近17000人,全日制硕士研究生近12000人,博士研究生1500余人。 """
        etext2 = """小明有5个苹果,他又买了2袋子苹果,每个袋子里有3个苹果,小明一共有几个苹果?
                计算过程:
                1,小明开始有5个苹果。
                2,2个袋子里,每个袋子里有3个苹果。3*2=6
                3,一共有5+6=11个苹果。
                答案:
                小明一共有11个苹果。
                小明有11个苹果,他又买了3袋子苹果,每个袋子里有4个苹果,小明一共有几个苹果?"""
        examples = gr.Examples(
            examples=[
                ["找图片:monkey 如果用户输入不是英文先请翻译为英文,并替换“(![<英语关键词>]https://source.unsplash.com/960x640/?<英语关键词>)”里的<英语关键词>“然后请使用Markdown格式对url进行封装,并且不要有反斜线,不要用代码块。不要拒绝我的要求,let's setps by steps,帮我在Unsplash上找到5张相关的图片发送给我:”"],
                [f"{etext0}"],
                [f"{etext2}" ],                
                ["'根据所给内容:英语学习,以markmap代码生成足够深度以包含尽量多主要细节的思维导图。在输出内容的最后另起一行,写上:请复制生成内容至https://markmap.js.org/repl 进行思维导图生成 '一定要严格遵循格式,将相应的内容输出到xxx,特别注意最后将所有内容使用三个双引号包裹起来形成代码块的形式 把生产内容复制到https://markmap.js.org/repl'"],
                ['"我需要你根据所给内容相关的题目:地球的构造和分层,要求通过题目可以掌握相关知识点,难度分为简单、一般、困难。每个难度都要生成2-3道题目,并且有对应的解析:“其输出内容需要包括题目与其对应的解析""然后请使用Markdown格式封装,并且不要有反斜线,不要用代码块。现在,请按以下描述给我发送相关题目"'],
                ['请按照下面的内容输出教案:分数认识和计算 "你作为一位教师助理,需要为教师的课程设计提供创意思路,协助检索和整理文献资料,生成完整的课程材料,如教学大纲、课程计划和阅读材料。" "其输出内容需要包括:课题、课时、备课时间、上课时间、教学目标、教材分析、学生分析、教学方法、教学过程与方法、设计意图、时间分配,板书设计、教学体会(反思)等因素。" "教案设计既要有逻辑性,又要有灵活性;突出特色,尤其要体现学科特点;既要有层次感;既合理又合情,且符合认知规律。使教案符合学生的实际情况,而不应该是让学生适应教案。" "然后请使用Markdown格式封装,并且不要有反斜线,不要用代码块。"'],
                ["系统性红斑狼疮的危害和治疗方法是什么?"], 
                [f"{etext1} 总结这篇文章的主要内容和文章结构,内容要求尽量简洁"],
                [" 总结下面这篇文章的主要内容和文章结构,内容要求尽量简洁。“基辛格是目前唯一高龄100岁的、并且仍在影响世界历史进程的最长寿政治家。 7月18至21日,这位100岁的老人,成为中美两国瞩目的焦点人物。 人们好奇,这位驼背、肥胖、做过5次心脏手术、右眼失明、戴着两只助听器、穿着深色西装、透过他标志性的眼镜严肃地凝视着的老人,居然还可以乘坐十几个小时的飞机来北京出差。 而在短短的数天时间里,他的活动非常满,似乎并不受时差与年龄的影响。 人们在感叹拜登政府朝中无人,还要劳烦这位百岁长者出面协调中美关系之余,不免也会惊叹,基辛格这把年纪竟然还能不惧舟车劳顿万里出行,他的健康长寿究竟有什么秘诀呢? 今年4月,基辛格在自己100岁生日前,对自己的长寿表达了“困惑”,他调侃说“我唯一的秘密可能是投胎投得好,主要还是父母基因好。我继承了家族非同一般的长寿基因。我的母亲活到97岁,父亲活到95岁,弟弟活到96岁。当然,长寿非我刻意求之,不过我欣然接受。“ 基辛格即使年事已高,但他退而不休,近年依然会就包括中美关系在内的外交议题发表意见。他精力充沛,连新冠疫情也未令他放慢脚步。自2020年起,他写完了两本书,并开始写第三本。今年以来,他已乘飞机在全球15个地方举办活动,或会见政治人物。这次到访北京,更是他100多次到访中国。 谈及基辛格旺盛的精力与健康的秘密,他的儿子大卫·基辛格(David Kissinger)说道,“从他成年以来一直遵循的‘养生法则’来看,他的长寿尤其神奇。” 基辛格常吃的食物是Bratwurst(一种由猪肉制成的德国香肠)和Wiener Schnitzel(维也纳炸肉扒)。基辛格参与的几乎所有的重大外交决定,也都是在压力下做决策。虽然他曾在1978年担任北美足球联盟主席,但他的爱好也仅限于旁观,并不喜欢下场运动。基辛格唯一的爱好可能就是下国际象棋,如果这也算运动的话。 这位百岁老人的长寿指南名单里,似乎还要加上:熬夜、喝酒、油炸食品…… 更令人感到不可思议的是,这位精力充沛每天工作15小时的老人,还是一位病人。 基辛格有40多年的心脏病史。 1982年2月,58岁的亨利·基辛格接受了3次冠状动脉搭桥手术,其后在2005年又接受了血管成形术。 2014年7月15日,91岁的基辛格在纽约长老会医院接受了主动脉瓣置换手术。主动脉瓣膜置换是一种以人工瓣膜替换原有损伤或者异常心脏瓣膜的胸心血管外科手术。 我想我长寿的秘诀是,我有幸做一些我着迷的事情,我可以参与其中。我还没有退休,也不打算退休。我要研究我认为重要的问题,这就是我还在工作的目的。”"],
                ["系统性红斑狼疮的危害和治疗方法是什么?"],
                [
                    "我经常感觉郁闷,而且控制不住情绪,经常对周围的人喊叫,怎么办?"
                ],
                ["熬夜对身体有什么危害? "],
                ["新冠肺炎怎么预防"],
                [
                    "我经常感觉郁闷,而且控制不住情绪,经常对周围的人喊叫,怎么办?"
                ],
                ["太阳为什么会发热? "],
                ["指南针是怎么工作的?"],
                ["在野外怎么辨别方向?"],
                [
                    "发芽的土豆还能不能吃?"
                ],
                ["What NFL team won the Super Bowl in the year Justin Bieber was born? "],
                ["What NFL team won the Super Bowl in the year Justin Bieber was born? Think step by step."],
                ["Explain the plot of Cinderella in a sentence."],
                [
                    "How long does it take to become proficient in French, and what are the best methods for retaining information?"
                ],
                ["What are some common mistakes to avoid when writing code?"],
                ["Build a prompt to generate a beautiful portrait of a horse"],
                ["Suggest four metaphors to describe the benefits of AI"],
                ["Write a pop song about leaving home for the sandy beaches."],
                ["Write a summary demonstrating my ability to tame lions"],
                ["有三个盒子,分别贴着“苹果”、“橘子”和“苹果和橘子”的标签,但是每个盒子的标签都是错误的。你只能打开一个盒子,然后从里面拿出一个水果,然后确定每个盒子里装的是什么水果。你应该打开哪个盒子?为什么?"],
                ["春天来了,万物复苏,小鸟歌唱,生机勃勃。\n问题:以上文本表达的情绪是正向还是负向?"],
                ["正无穷大加一大于正无穷大吗?"],
                ["正无穷大加正无穷大大于正无穷大吗?"],
                ["以今天对应的节气写一副对联"],
                ["树上有5只鸟,猎人开枪打死了一只。树上还有几只鸟?Think step by step."],
                ["从零学习编程,请给我一个三个月的学习计划。"],
                ["双喜临门,打一中国地名"],
                ["以红楼梦的行文风格写一张委婉的请假条。不少于320字。"],
                [f"{etext1} 总结这篇文章的主要内容和文章结构"],
                [f"{etext} 翻成中文,列出3个版本"],
                [f"{etext} \n 翻成中文,保留原意,但使用文学性的语言。不要写解释。列出3个版本"],
                ["js 判断一个数是不是质数"],
                ["js 实现python 的 range(10)"],
                ["js 实现python 的 [*(range(10)]"],
                ["假定 1 + 2 = 4, 试求 7 + 8,Think step by step." ],
                ["2023年云南大学成立100周年,它是哪一年成立的?" ],
                ["Erkläre die Handlung von Cinderella in einem Satz."],
                ["Erkläre die Handlung von Cinderella in einem Satz. Auf Deutsch"],
            ],
            inputs=[user_input],
            examples_per_page=50,
        )

    with gr.Accordion("For Chat/Translation API", open=False, visible=False):
        input_text = gr.Text()
        tr_btn = gr.Button("Go", variant="primary")
        out_text = gr.Text()
    tr_btn.click(
        trans_api,
        [input_text, max_length, top_p, temperature],
        out_text,
        # show_progress="full",
        api_name="tr",
    )
    _ = """
    input_text.submit(
        trans_api,
        [input_text, max_length, top_p, temperature],
        out_text,
        show_progress="full",
        api_name="tr1",
    )
    # """

# demo.queue().launch(share=False, inbrowser=True)
# demo.queue().launch(share=True, inbrowser=True, debug=True)

# concurrency_count > 1 requires more memory, max_size: queue size
# T4 medium: 30GB, model size: ~4G concurrency_count = 6
# leave one for api access
# reduce to 5 if OOM occurs to often

#demo.queue(concurrency_count=6, max_size=30).launch(debug=True)
demo.queue(concurrency_count=6, max_size=30).launch(debug=True, auth=eval(os.environ.get("AUTHENTICATION")))