File size: 53,624 Bytes
70ed470
f775275
 
 
70ed470
f775275
70ed470
f775275
 
 
 
 
 
 
 
 
 
 
70ed470
 
1b73361
f775275
 
 
 
d76b456
 
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
 
 
 
 
9e6c301
92997a2
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
9e6c301
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92997a2
c5469ad
 
 
 
 
 
0b507e1
c5469ad
 
 
 
 
 
 
 
9e6c301
c5469ad
1b73361
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b73361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5469ad
 
 
 
 
 
 
1b73361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5469ad
 
1b73361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a0f9062
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b73361
c5469ad
94135df
70ed470
b2cb757
d379882
b2cb757
94135df
d379882
8c9c9c7
70ed470
94135df
0d75268
70ed470
 
 
 
d379882
70ed470
d379882
 
 
 
70ed470
d379882
70ed470
 
 
0d75268
 
 
70ed470
 
d31bad4
70ed470
 
 
 
0d75268
c5469ad
70ed470
0d75268
c5469ad
0d75268
 
 
 
 
c5469ad
 
 
 
 
 
 
 
 
 
1b73361
c5469ad
 
 
 
1b73361
 
 
 
a0f9062
1b73361
0d75268
1b73361
0d75268
70ed470
 
 
 
 
 
 
 
 
 
 
 
 
0d75268
d379882
70ed470
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
263c0e7
70ed470
 
 
 
 
 
 
 
 
 
 
 
 
 
263c0e7
70ed470
 
 
c5469ad
 
70ed470
 
263c0e7
70ed470
 
 
 
 
 
 
 
 
 
 
 
 
 
263c0e7
70ed470
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b73361
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b73361
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b73361
c5469ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b73361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5469ad
a0f9062
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70ed470
 
c5469ad
0d75268
 
 
70ed470
 
700915b
 
 
 
 
 
 
 
220b124
 
 
 
700915b
0d75268
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8c9c9c7
0d75268
 
 
 
70ed470
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
06b86d6
6eb8cde
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
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。你需要扩写用户输入。
    用户输入:
    
    """
def redBook(
    user_input, chatbot, max_length, top_p, temperature, history, past_key_values
):
    
      
    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

def scrape_text(url, proxies) -> str:
    """从网页抓取文本,限制为前500个字符

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

    返回:
        str: 抓取到的文本,最多为前500个字符
    """
    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[:500]
    return text

# 定义函数:联网搜索并更新聊天界面
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}"
    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'
    }

    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 = txtSumins+GGSearchins

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

                   
                    
 
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>如果喜欢请给个 💖 。遇到任何问题可邮件和我联系👉 fb700@qq.com</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")
                    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")
                with gr.Row():
                    fitnessAskBtn = gr.Button("🥼健康咨询", variant="primary")
                    mindAskBtn = gr.Button("😶‍🌫️心理咨询", variant="primary")
                    GGSearchBtn = 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>""")

    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],
    )    
    deleteBtn.click(delete_last_turn, [chatbot, history], [chatbot, history])

    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=3, max_size=10).launch(debug=True, auth=eval(os.environ.get("AUTHENTICATION")))