File size: 92,249 Bytes
8cf621f
56d98ec
8cf621f
 
a5e860d
183a544
ba2d4df
a4230c4
8cf621f
318cc53
 
f3db00f
fb1ecc6
d576879
fb1ecc6
2d0313b
 
 
 
 
 
 
 
 
108fbc5
 
 
 
 
 
 
e66aece
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108fbc5
9a01241
f3db00f
8cf621f
3bd9280
 
 
 
8cf621f
3e178d1
3644a6d
108fbc5
 
 
 
 
 
 
 
 
 
 
 
56d98ec
2ba7b49
8041e10
6d68276
2ba7b49
8cf621f
2ba7b49
 
dc956e2
 
5d7a272
9aa4575
c3ee46e
28aaa99
6d68276
5b961a1
 
6d68276
 
 
 
 
 
 
 
 
 
 
 
2dc2143
 
ac2cf4c
 
c3ee46e
2230a05
 
6d68276
8cf621f
3d7da3b
 
 
 
eec0ff5
3adf4e1
c4031e4
4deedc1
8cf621f
c4031e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8cf621f
108fbc5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8cf621f
108fbc5
8cf621f
 
2ba7b49
c3ee46e
2ba7b49
c3ee46e
2ba7b49
c3ee46e
 
2ba7b49
c3ee46e
2ba7b49
c3ee46e
2ba7b49
 
 
 
ac2cf4c
 
 
8cf621f
 
 
539297a
8cf621f
539297a
 
 
7915d0e
8cf621f
 
5d7a272
d0e883b
5d7a272
8cf621f
13476fb
 
 
acd3d26
dc956e2
8cf621f
 
 
 
 
 
 
 
 
25783c2
8cf621f
7ea899d
d0e883b
7ea899d
81301d6
8cf621f
81301d6
cef3e2b
8cf621f
acd3d26
 
6d68276
 
9cab0d2
58a6b7a
6d68276
 
8cf621f
89c7e88
8cf621f
705de0b
f381212
 
722e265
f381212
 
8cf621f
7f4ea28
8cf621f
 
 
4deedc1
83c344a
4deedc1
8cf621f
 
 
a31bf92
8cf621f
 
fd1b068
8cf621f
 
9ff7b40
8cf621f
 
 
 
 
9ff7b40
8cf621f
7900969
8cf621f
 
 
 
 
 
108fbc5
8cf621f
 
 
 
 
 
d0e883b
 
 
 
 
 
 
 
 
8cf621f
 
cbadafb
8cf621f
 
 
 
 
ec4f30e
8c17b9e
 
 
 
 
 
 
 
8cf621f
 
728f4ca
66161b9
 
 
728f4ca
5d8c295
3842ab5
116d146
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe92701
116d146
 
3842ab5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1b64aba
1eab9d7
1b64aba
 
 
 
3842ab5
 
 
 
 
 
 
 
 
 
7915d0e
89c7e88
3842ab5
 
 
 
 
8fedb12
 
 
3bd9280
8fedb12
670cfd5
7f4ea28
 
62690c8
 
25783c2
62690c8
25783c2
 
7f4ea28
e354ae1
 
 
 
 
 
 
 
 
9d7a2f2
116d146
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8c6dcfa
 
3bd9280
 
 
 
 
8c6dcfa
3bd9280
8c6dcfa
8b23b39
1eab9d7
 
 
 
 
8c6dcfa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3bd9280
 
 
 
 
 
 
 
 
 
 
89c7e88
 
3bd9280
 
 
5d8c295
d02c2ed
7f4ea28
8248262
62690c8
e354ae1
 
 
 
 
62690c8
5d8c295
 
4863816
06b4cba
670cfd5
0ee07e8
670cfd5
 
 
 
 
 
 
 
 
 
0ee07e8
183a544
 
 
 
 
 
 
 
 
 
 
71612f5
9aa4575
5d7a272
dc956e2
 
183a544
 
 
 
d0e883b
 
183a544
 
953e4ee
183a544
 
 
 
e354ae1
5d7a272
a57e2fb
e354ae1
f9b040e
9aa4575
e354ae1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f9b040e
728f4ca
5d7a272
e201947
 
 
 
 
 
 
 
9aa4575
c979149
 
e354ae1
 
 
 
 
 
 
3172a1f
8cf621f
a7f0c75
96acf8a
5de7e4c
 
 
7f4ea28
67d6e0f
96acf8a
 
a71dbb8
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
import json
import os
import shutil
import requests
import threading
import time
import random
import inspect

from requests import HTTPError

from pathlib import Path
from typing import Callable, Literal, AsyncGenerator
from gradio.utils import SyncToAsyncIterator, async_iteration

from gradio.components import (
    Button,
    Chatbot,
    IOComponent,
    Markdown,
    State,
    Textbox,
    get_component_instance,
)

from huggingface_hub.utils import (
    BadRequestError,
    build_hf_headers,
    get_session,
    hf_raise_for_status,
)
from huggingface_hub.inference._common import (
    TASKS_EXPECTING_IMAGES,
    ContentT,
    InferenceTimeoutError,
    ModelStatus,
    _b64_encode,
    _b64_to_image,
    _bytes_to_dict,
    _bytes_to_image,
    _bytes_to_list,
    _get_recommended_model,
    _import_numpy,
    _is_tgi_server,
    _open_as_binary,
    _set_as_non_tgi,
    _stream_text_generation_response,
)
from huggingface_hub.inference._text_generation import (
    TextGenerationParameters,
    TextGenerationRequest,
    TextGenerationResponse,
    TextGenerationStreamResponse,
    raise_text_generation_error,
)
from huggingface_hub.inference._types import (
    ClassificationOutput,
    ConversationalOutput,
    FillMaskOutput,
    ImageSegmentationOutput,
    ObjectDetectionOutput,
    QuestionAnsweringOutput,
    TableQuestionAnsweringOutput,
    TokenClassificationOutput,
)

from gradio.themes import ThemeClass as Theme

import gradio as gr
from gradio.helpers import special_args
from gradio.routes import Request
import anyio

from huggingface_hub import Repository, InferenceClient
from utils import force_git_push

from typing import (
    TYPE_CHECKING,
    Any,
    Dict,
    Iterable,
    List,
    Literal,
    Optional,
    Union,
    overload,
)

HF_TOKEN = os.environ.get("HF_TOKEN", None)
DATASET_REPO_URL = os.getenv("DATASET_REPO_URL")
MODEL_NAME = os.getenv("MODEL_NAME")
ENDPOINT = os.getenv("ENDPOINT")
FORCE_PUSH = os.getenv("FORCE_PUSH")
BOT_NAME = "PersianGPT-FT"
PUSH_FREQUENCY = 60 # every minute

HISTORY = ""
PROMPT = ""
USERNAME = ""
NAME = ""

REVISION = "" #"4f68dc3740b410835da71811d92bd3b2d690e79c"

MODEL_REPO_URL = f"https://huggingface.co/{MODEL_NAME}"

if len(ENDPOINT)>0:
    API_URL = f"{ENDPOINT}"
    MODEL_VERSION = f"{ENDPOINT}" if len(REVISION)==0 else REVISION
else:
    API_URL = f"/static-proxy?url=https%3A%2F%2Fapi-inference.huggingface.co%2Fmodels%2F%3Cspan class="hljs-subst">{MODEL_NAME}/revision/{REVISION}" if len(REVISION)>0 else f"/static-proxy?url=https%3A%2F%2Fapi-inference.huggingface.co%2Fmodels%2F%3Cspan class="hljs-subst">{MODEL_NAME}"
    model_repo = Repository(local_dir="model", 
                        clone_from=MODEL_REPO_URL, 
                        use_auth_token=HF_TOKEN, 
                        skip_lfs_files=True,
                        revision=REVISION)
    MODEL_VERSION = model_repo.git_head_commit_url() if len(REVISION)==0 else REVISION

print(f'Model Version: {MODEL_VERSION}')

DATA_FILENAME = "data.jsonl"
DATA_FILE = os.path.join("data", DATA_FILENAME)
data_repo = Repository(local_dir="data", 
                  clone_from=DATASET_REPO_URL, 
                  use_auth_token=HF_TOKEN)


if REVISION == "4f68dc3740b410835da71811d92bd3b2d690e79c":
    prompt_dict = {'<$قصاید$': 6621, '<': 86431, '<$$': 23118, '<$غزل$%وحدت کرمانشاهی%': 60, '<$قصاید$%سنایی غزنوی%': 98, '<$رباعی$%قدسی مشهدی%': 651, '<$$%نیما یوشیج%': 54, '<%شهریار%': 329, '<$غزل$%مولوی%': 3247, '<%امیرخسرو دهلوی%': 3389, '<$غزل$%اوحدی مراغه ای%': 478, '<%شاه نعمت\u200cالله ولی%': 2700, '<$غزل$%صائب تبریزی%': 7472, '<%سنایی%': 1793, '<%سعدی%': 1920, '<$غزل$%فیض کاشانی%': 1449, '<$قطعه$%سلمان ساوجی%': 232, '<$$%خواجه عبدالله انصاری%': 261, '<%حافظ شیرازی%': 911, '<$رباعی$%عراقی%': 189, '<%صائب تبریزی%': 10395, '<$$%اقبال لاهوری%': 1176, '<$رباعی$': 10455, '<$غزل$': 41981, '<%بیدل دهلوی%': 3343, '<%سیف فرغانی%': 1270, '<$$%صائب تبریزی%': 2874, '<$رباعی$%کمال خجندی%': 42, '<%مولوی%': 6328, '<$رباعی$%مولوی%': 1986, '<$مثنوی$%پروین اعتصامی%': 347, '<$$%عطار%': 4066, '<$$%باباطاهر%': 391, '<$$%کمال\u200cالدین اسماعیل%': 365, '<$غزل$%خواجوی کرمانی%': 1306, '<%حکیم نزاری قهستانی%': 1456, '<%هلالی جغتایی%': 352, '<%عطار%': 5014, '<$غزل$%شهریار%': 302, '<%قدسی مشهدی%': 1218, '<$قصاید$%ناصرخسرو%': 281, '<$$%ابوسعید ابوالخیر%': 122, '<%سنایی غزنوی%': 399, '<$غزل$%شاه نعمت\u200cالله ولی%': 1564, '<%فرخی سیستانی%': 615, '<$غزل$%فروغی بسطامی%': 817, '<%بهرام سالکی%': 139, '<%اقبال لاهوری%': 1230, '<$غزل$%هلالی جغتایی%': 251, '<%عراقی%': 868, '<$قصاید$%فرخی سیستانی%': 510, '<$غزل$%امیرخسرو دهلوی%': 3122, '<$$%مولوی%': 1016, '<$غزل$%خاقانی شروانی%': 338, '<%انوری%': 1463, '<%ناصرخسرو%': 385, '<%فروغی بسطامی%': 864, '<$غزل$%بیدل دهلوی%': 3339, '<%وحشی%': 650, '<%خیام%': 323, '<$قطعه$': 751, '<%هاتف اصفهانی%': 396, '<$قصاید$%اوحدی%': 42, '<%کمال خجندی%': 1251, '<%هجویری%': 209, '<$غزل$%اوحدی%': 901, '<$غزل$%سنایی%': 440, '<%فردوسی%': 615, '<%اشعار ترانه\u200cهای سیاوش قمیشی%': 180, '<$$%رشیدالدین میبدی%': 1269, '<%حافظ%': 594, '<%عبید زاکانی%': 444, '<$غزل$%سیف فرغانی%': 983, '<$غزل$%عبید زاکانی%': 219, '<%منوچهری%': 97, '<%ناصرخسرو قبادیانی%': 286, '<$رباعی$%انوری%': 443, '<$رباعی$%خاقانی%': 352, '<$$%عمان سامانی%': 40, '<$غزل$%سلمان ساوجی%': 669, '<$رباعی$%ابوسعید ابوالخیر%': 749, '<$مفردات$': 486, '<$قصاید$%مسعود سعد سلمان%': 484, '<$$%نصرالله منشی%': 238, '<$$%سعدی%': 752, '<$$%فردوسی%': 615, '<$قصاید$%امام خمینی%': 3, '<$غزل$%حکیم نزاری قهستانی%': 1407, '<$غزل$%سعدی%': 703, '<$قصاید$%سلمان ساوجی%': 104, '<%باباطاهر%': 392, '<%خاقانی%': 1364, '<$غزل$%عطار%': 871, '<%نادر نادرپور%': 274, '<%ظهیر فاریابی%': 305, '<$رباعی$%رضی\u200cالدین آرتیمانی%': 100, '<%رشیدالدین میبدی%': 1336, '<$$%محتشم کاشانی%': 106, '<$غزل$%عطار نیشابوری%': 418, '<$رباعی$%اِ لیـــار    (جبار محمدی )%': 263, '<%عرفی%': 697, '<%مسعود سعد سلمان%': 1117, '<%عرفی شیرازی%': 160, '<$غزل$%هاتف اصفهانی%': 198, '<$$قصاید$%سیف فرغانی%': 263, '<$غزل$%شیون فومنی%': 41, '<$غزل$%حافظ شیرازی%': 830, '<$تضمین$%صامت بروجردی%': 17, '<%عنصری%': 478, '<$$%کامبیز صدیقی کسمایی%': 179, '<$$%صامت بروجردی%': 250, '<$غزل$%رهی معیری%': 197, '<$قصاید$%رشیدالدین وطواط%': 356, '<%خواجوی کرمانی%': 1306, '<%جلال الدین محمد مولوی%': 789, '<$$%احمد شاملو%': 309, '<%ابوسعید ابوالخیر%': 871, '<%سعدی شیرازی%': 933, '<$غزل$%محتشم کاشانی%': 929, '<$ترجیع$': 108, '<%اِ لیـــار    (جبار محمدی )%': 429, '<$غزل$%کمال خجندی%': 1085, '<%خاقانی شروانی%': 500, '<$$$%اشعار ترانه\u200cهای سیاوش قمیشی%': 175, '<%اوحدی%': 1325, '<$$%فخرالدین اسعد گرگانی%': 137, '<%جامی%': 1002, '<%کمال\u200cالدین اسماعیل%': 1617, '<%احمد شاملو%': 322, '<%سلمان ساوجی%': 1261, '<$مقطعات$%عبید زاکانی%': 41, '<$رباعی$%امام خمینی%': 117, '<$قصاید$%قاآنی%': 540, '<$مثنوی$%ملک\u200cالشعرای بهار%': 83, '<%مهستی گنجوی%': 215, '<$$%فروغ فرخزاد%': 121, '<$غزل$%ملا هادی سبزواری%': 186, '<%قاآنی%': 830, '<$ترکیب$%وحشی%': 11, '<$غزل$%انوری ابیوردی%': 248, '<%رشیدالدین وطواط%': 579, '<$$%اسدی توسی%': 143, '<%سیاوش کسرایی%': 167, '<%کسایی%': 113, '<$مقطعات$': 985, '<$$%سایه%': 172, '<$قصاید$%سنایی%': 408, '<$قصاید$%عنصری%': 219, '<%کامبیز صدیقی کسمایی%': 180, '<$غزل$%عرفی شیرازی%': 134, '<%عطار نیشابوری%': 457, '<$قطعه$%سعدی%': 21, '<%شیخ بهایی%': 274, '<$رباعی$%امیرمعزی%': 174, '<$مقطعات$%کمال خجندی%': 97, '<$$%فریدون مشیری%': 260, '<$غزل$%حافظ%': 495, '<%فریدون مشیری%': 276, '<$رباعی$%مسعود سعد سلمان%': 397, '<$غزل$%امام خمینی%': 149, '<$$%اوحدی%': 186, '<%ملک\u200cالشعرای بهار%': 1104, '<%محتشم کاشانی%': 1296, '<$$%نظامی%': 330, '<$$%رودکی%': 282, '<$$%%': 168, '<$$%سیاوش کسرایی%': 160, '<$مثنوی$%امیرخسرو دهلوی%': 152, '<$رباعی$%کمال\u200cالدین اسماعیل%': 867, '<$غزل$%قاآنی%': 89, '<%مهدی سهیلی%': 61, '<%ازرقی هروی%': 182, '<$غزل$%جلال الدین محمد مولوی%': 763, '<$$%امیرخسرو دهلوی%': 101, '<$$%شیخ محمود شبستری%': 117, '<%رضی\u200cالدین آرتیمانی%': 232, '<$$%جامی%': 960, '<$مفردات$%سعدی%': 104, '<%محمدرضا شفیعی کدکنی%': 214, '<$غزل$%وحشی بافقی%': 215, '<$$%سلمان ساوجی%': 89, '<$قطعه$%شاه نعمت\u200cالله ولی%': 134, '<$غزل$%خاقانی%': 401, '<$غزل$%عرفی%': 571, '<$غزل$%اِ لیـــار    (جبار محمدی )%': 132, '<$قصاید$%ناصرخسرو قبادیانی%': 281, '<$غزل$%عبدالقادر گیلانی%': 73, '<$رباعی$%ابن حسام خوسفی%': 99, '<$رباعی$%شیخ بهایی%': 106, '<$مثنوی$': 1208, '<%فاضل نظری%': 14, '<$رباعی$%سعدی%': 202, '<$ربااعی$%فیض کاشانی%': 70, '<$مقطعات$%رشیدالدین وطواط%': 121, '<%سایه%': 327, '<$$%امام خمینی%': 34, '<$$%هجویری%': 190, '<%احمد پروین%': 153, '<%ملک الشعرای بهار%': 288, '<$قصاید$%امیرمعزی%': 467, '<$غزل$%عراقی%': 569, '<$قصاید$%ظهیر فاریابی%': 80, '<$رباعی$%شاه نعمت\u200cالله ولی%': 322, '<$چهارپاره$%ملک\u200cالشعرای بهار%': 7, '<$$%عراقی%': 28, '<$$%وحشی%': 121, '<%فیض کاشانی%': 1524, '<$$%خاقانی%': 349, '<$مقطعات$%مسعود سعد سلمان%': 140, '<$$%سنایی%': 480, '<%امیرمعزی%': 741, '<$غزل$%رضی\u200cالدین آرتیمانی%': 114, '<%صامت بروجردی%': 384, '<$رباعی$%عرفی%': 124, '<$$%رهی معیری%': 46, '<$قصاید$%ملک الشعرای بهار%': 224, '<$رباعی$%حافظ شیرازی%': 25, '<$قصاید$%سعدی%': 85, '<$مثنوی$%شیخ بهایی%': 28, '<$رباعی$%هاتف اصفهانی%': 60, '<$غزل$%سعدی شیرازی%': 857, '<%%': 175, '<$غزل$%ابن حسام خوسفی%': 305, '<$رباعی$%داوود ملک\u200cزاده%': 84, '<$رباعی$%وحشی%': 66, '<%نصرالله منشی%': 249, '<$رباعی$%خیام%': 321, '<$غزل$%مولانا خالد نقشبندی%': 58, '<%فایز دشتستانی%': 111, '<$قصیده$': 156, '<$$%محمدرضا شفیعی کدکنی%': 195, '<$قصیده$%ایرج میرزا%': 35, '<%رودکی%': 538, '<%باباافضل کاشانی%': 236, '<%سیمین بهبهانی%': 226, '<$$%قاآنی%': 149, '<$غزل$%وحشی%': 400, '<%ایرج میرزا%': 212, '<$رباعی$%همام تبریزی%': 99, '<$غزل$%همام تبریزی%': 219, '<%خواجه عبدالله انصاری%': 261, '<%سهراب سپهری%': 135, '<$مثنوی$%قدسی مشهدی%': 34, '<%امام خمینی%': 304, '<$قصاید$%کمال\u200cالدین اسماعیل%': 192, '<$رباعی$%سنایی%': 421, '<$$%فرخی سیستانی%': 48, '<$غزل$%سنایی غزنوی%': 273, '<$مفردات$%شاه نعمت\u200cالله ولی%': 283, '<%عارف قزوینی%': 35, '<$$%کسایی%': 106, '<$غزل$%انوری%': 326, '<$قصاید$%خاقانی%': 233, '<%عبدالقهّار عاصی%': 87, '<%ابن حسام خوسفی%': 406, '<$رباعی$%رودکی سمرقندی%': 25, '<$رباعی$%ازرقی هروی%': 107, '<%همام تبریزی%': 381, '<$غزل$%قدسی مشهدی%': 459, '<$$%حمید مصدق%': 115, '<$رباعی$%حافظ%': 42, '<$$%احمد پروین%': 14, '<$$%ناصصرخسرو%': 95, '<%انوری ابیوردی%': 406, '<$رباعی$%عبید زاکانی%': 76, '<$مثنوی$%همام تبریزی%': 15, '<$رباعی$%عنصری%': 77, '<%عبدالقادر گیلانی%': 73, '<$$%سهراب سپهری%': 130, '<$$%بهرام سالکی%': 19, '<$رباعی$%خاقانی شروانی%': 25, '<$مثنوی$%ایرج میرزا%': 37, '<%محمدحسن بارق شفیعی%': 47, '<%ابوالقاسم فردوسی%': 27, '<%رهی معیری%': 311, '<%رودکی سمرقندی%': 296, '<$$%هلالی جغتایی%': 51, '<$قصاید$%عبید زاکانی%': 62, '<$رباعی$%مهستی گنجوی%': 190, '<$$%ملک\u200cالشعرای بهار%': 405, '<$رباعی$%عبدالقهّار عاصی%': 37, '<$قصاید$%رودککی%': 128, '<$قصاید$%انوری ابیوردی%': 87, '<$$%نادر نادرپور%': 267, '<%پروین اعتصامی%': 438, '<%فخرالدین اسعد گرگانی%': 137, '<$$%خاقانی شروانی%': 53, '<%باقر فداغی لارستانی%': 105, '<$شعر نو$%ملک\u200cالشعرای بهار%': 4, '<%وحشی بافقی%': 303, '<$$%مهدی اخوان ثالث%': 103, '<$رباعی$%اوحدی%': 184, '<$$%شاه نعمت\u200cالله ولی%': 274, '<%مولانا خالد نقشبندی%': 151, '<$غزل$%سلطان باهو%': 53, '<$$%سیمین بهبهانی%': 215, '<$$%رودکی سمرقندی%': 109, '<%اوحدی مراغه ای%': 514, '<$$%پژمان بختیاری%': 31, '<$$%عنصری%': 181, '<$غزل$%سایه%': 125, '<$رباعی$%خلیل الله خلیلی%': 31, '<$ترکیب$%محتشم کاشانی%': 16, '<%شیخ محمود شبستری%': 125, '<$غزل$%صادق سرمد%': 3, '<$رباعی$%خیام نیشابوری%': 72, '<$قطعه$%محتشم کاشانی%': 12, '<$مثنوی$%ملک الشعرای بهار%': 5, '<%نظامی%': 377, '<$قصاید$%وحشی%': 41, '<$قصاید$%محتشم کاشانی%': 95, '<%اسدی توسی%': 143, '<%عمان سامانی%': 49, '<$قصاید$%منوچهری دامغانی%': 79, '<%فروغ فرخزاد%': 123, '<$غزل$%سید حمیدرضا برقعی%': 10, '<$مقطعات$%انوری%': 479, '<$$%نظامی گنجوی%': 110, '<%وحدت کرمانشاهی%': 70, '<$مقطعات$%هاتف اصفهانی%': 18, '<%نظامی گنجوی%': 125, '<$ترکیب$': 276, '<$قصاید$%ملک\u200cالشعرای بهار%': 310, '<%سلطان باهو%': 53, '<$رباعی$%سلمان ساوجی%': 145, '<$قصاید$%ازرقی هروی%': 65, '<$مفردات$%همام تبریزی%': 46, '<$$%سعدالدین وراوینی%': 69, '<%زرتشت%': 93, '<$$%محمدحسن بارق شفیعی%': 47, '<$مسمطات$': 53, '<%کارو%': 48, '<$مثنوی$%رودکی سمرقندی%': 38, '<$رباعی$%محتشم کاشانی%': 112, '<$$%فایز دشتستانی%': 111, '<$ترکیب$%رشیدالدین وطواط%': 7, '<$قصاید$%شاه نعمت\u200cالله ولی%': 34, '<$قطعه$%هلالی جغتایی%': 10, '<$مثنوی$%بهرام سالکی%': 92, '<$$%هاتف اصفهانی%': 99, '<$رباعی$%باباافضل کاشانی%': 216, '<$قطعه$%رهی معیری%': 30, '<%خسرو گلسرخی%': 53, '<$$%قدسی مشهدی%': 74, '<$قطعه$%ملک\u200cالشعرای بهار%': 20, '<$غزل$%شیخ بهایی%': 51, '<%شیون فومنی%': 118, '<$غزل$%اقبال لاهوری%': 50, '<$غزل$%کمال\u200cالدین اسماعیل%': 161, '<$ترکیب$%نظامی%': 17, '<$رباعی$%سنایی غزنوی%': 25, '<$طنز$%%': 1, '<$رباعی$%ملک\u200cالشعرای بهار%': 71, '<$مفردات$%کمال خجندی%': 8, '<$غزل$%جامی%': 14, '<$رباعی$%رشیدالدین وطواط%': 36, '<$غزل$%شاطرعباس صبوحی%': 81, '<$تضمین$': 36, '<$غزل$%صامت بروجردی%': 77, '<$$%امیرمعزی%': 31, '<$قصاید$%انوری%': 208, '<$مثنوی$%عبید زاکانی%': 4, '<$غزل$%امیرمعزی%': 64, '<$رباعی$%فروغی بسطامی%': 35, '<$قطعه$%فرخی سیستانی%': 12, '<$$%باقر فداغی لارستانی%': 104, '<%پژمان بختیاری%': 31, '<$غزل$%احمد پروین%': 128, '<%داوود ملک\u200cزاده%': 87, '<$رباعی$%ظهیر فاریابی%': 100, '<$معمیات$%کمال خجندی%': 9, '<$تصنیف$%عطار%': 19, '<$ترکیب$%ازرقی هروی%': 1, '<$$%مهدی سهیلی%': 59, '<$رباعی$%عرفی شیرازی%': 25, '<$تصنیف$': 119, '<%حمید مصدق%': 122, '<$ترکیب$%خاقانی%': 10, '<$ترجیع$%حمید مصدق%': 1, '<%ملا هادی سبزواری%': 208, '<$قطعه$%مولانا خالد نقشبندی%': 45, '<$مثنوی$%سعدی%': 46, '<$$%زرتشت%': 92, '<$ترجیع$%اوحدی مراغه ای%': 1, '<$قطعه$%سیمین بهبهانی%': 2, '<$قصاید$%رودکی سمرقندی%': 124, '<$$%شاطرعباس صبوحی%': 16, '<$قصاید$%پروین اعتصامی%': 83, '<$مفردات$%رضی\u200cالدین آرتیمانی%': 9, '<$$%سعدی شیرازی%': 34, '<$مقطعات$%انوری ابیوردی%': 47, '<$$%کارو%': 46, '<$رباعی$%وحشی بافقی%': 24, '<$غزل$%نجمه زارع%': 33, '<$غزل$%رشیدالدین میبدی%': 8, '<$ترکیب$%عطار%': 20, '<$$%خسرو گلسرخی%': 53, '<$چهارپاره$': 12, '<%سعدالدین وراوینی%': 80, '<$قطعه$%ایرج میرزا%': 88, '<$رباعی$%ملک الشعرای بهار%': 22, '<$قصاید$%عطار%': 30, '<$$%وحشی بافقی%': 43, '<$مثنوی$%سایه%': 9, '<$رباعی$%شیون فومنی%': 8, '<$$%حکیم نزاری قهستانی%': 46, '<$قصیده$%جامی%': 8, '<%شاطرعباس صبوحی%': 97, '<%خلیل\u200cالله خلیلی%': 53, '<$ترکیب$%امیرمعزی%': 2, '<$$%آیت الله حسین نوری همدانی%': 71, '<$غزل$%ملک\u200cالشعرای بهار%': 136, '<$مثنوی$%رودکی%': 90, '<$ترکیب$%نظامی گنجوی%': 5, '<$$%مصطفی مجیدی%': 9, '<%منوچهری دامغانی%': 97, '<$$%شیخ بهایی%': 68, '<$قطعه$%حافظ شیرازی%': 34, '<$رباعی$%خلیل\u200cالله خلیلی%': 53, '<%کسایی مروزی%': 58, '<$رباعی$%فرخی سیستانی%': 36, '<$تصنیف$%شیخ محمود شبستری%': 3, '<$$%کسایی مروزی%': 52, '<$$%صادق سرمد%': 27, '<$معمیات$': 9, '<$قصیده$%نظامی گنجوی%': 3, '<%محمدعلی بهمنی%': 27, '<$قصاید$%صائب تبریزی%': 45, '<$قصیده$%عراقی%': 2, '<$مثنوی$%مولانا خالد نقشبندی%': 4, '<$قطعه$%احمد شاملو%': 1, '<$$%عطار نیشابوری%': 25, '<$قصاید$%کمال خجندی%': 4, '<$مثنوی$%مسعود سعد سلمان%': 23, '<$قطعه$%کارو%': 2, '<$غزل$%ملک الشعرای بهار%': 28, '<$مسمطات$%قاآنی%': 6, '<$مثنوی$%وحشی%': 7, '<$قصاید$%باباافضل کاشانی%': 6, '<$قطعه$%رشیدالدین میبدی%': 28, '<$$%ظهیر فاریابی%': 104, '<$قطعه$%مهدی سهیلی%': 1, '<%صادق سرمد%': 33, '<$$%شیون فومنی%': 68, '<$غزل$%محمدرضا شفیعی کدکنی%': 7, '<$مثنوی$%شاه نعمت\u200cالله ولی%': 85, '<$رباعی$%هلالی جغتایی%': 35, '<$قطعه$%کمال\u200cالدین اسماعیل%': 10, '<$ترکیب$%ایرج میرزا%': 2, '<$$%صادق هدایت%': 11, '<$$%عبید زاکانی%': 35, '<$مثنوی$%کمال\u200cالدین اسماعیل%': 2, '<$قصیده$%آیت الله حسین نوری همدانی%': 8, '<$$%ابوالقاسم فردوسی%': 27, '<$رباعی$%صامت بروجردی%': 1, '<$قطعه$%ظهیر فاریابی%': 2, '<$غزل$%رشیدالدین وطواط%': 45, '<%خلیل الله خلیلی%': 31, '<$$%نجمه زارع%': 2, '<$$%شهریار%': 26, '<$مخمسات$': 2, '<$رباعی$%سیف فرغانی%': 22, '<$قصیده$%بیدل دهلوی%': 4, '<$مفردات$%مولانا خالد نقشبندی%': 24, '<$قصاید$%خاقانی شروانی%': 83, '<%آیت الله حسین نوری همدانی%': 85, '<$قصاید$%صامت بروجردی%': 32, '<$ترکیب$%قاآنی%': 14, '<$غزل$%سیاوش کسرایی%': 5, '<$تصنیف$%عارف قزوینی%': 35, '<$ترجیع$%ملک\u200cالشعرای بهار%': 9, '<$قصاید$%منوچهری%': 78, '<%مهدی اخوان ثالث%': 115, '<$غزل$%مسعود سعد سلمان%': 34, '<%خیام نیشابوری%': 72, '<$ترجیع$%عطار%': 2, '<$قصیده$%فیض کاشانی%': 5, '<$$%شاه اسماعیل صفوی ( خطایی )%': 30, '<$قصاید$%عراقی%': 40, '<$قصاید$%هاتف اصفهانی%': 16, '<$$%محمدعلی بهمنی%': 17, '<$ترجیع$%سلمان ساوجی%': 3, '<%مصطفی مجیدی%': 9, '<$مثنوی$%محتشم کاشانی%': 22, '<$ترجیع$%خاقانی%': 7, '<$شعر نو$%اِ لیـــار    (جبار محمدی )%': 9, '<$شعر نو$%فرخی سیستانی%': 4, '<$ترکیب$%سعدالدین وراوینی%': 7, '<$$%مسعود سعد سلمان%': 28, '<$طنز$%بهرام سالکی%': 3, '<%نیما یوشیج%': 54, '<$ررباعی$%وحدت کرمانشاهی%': 8, '<$طنز$%احمد شاملو%': 1, '<$قصاید$%عبدالواسع جبلی%': 13, '<$طنز$%جامی%': 4, '<$غزل$%نظامی%': 20, '<$رباعی$%سعدی شیرازی%': 26, '<$غزل$%عبدالقهّار عاصی%': 17, '<$مقطعات$%شیخ بهایی%': 20, '<$رباعی$%جلال الدین محمد مولوی%': 25, '<$ترکیب$%%عراقی%': 4, '<$ترجیع$%مولوی%': 37, '<$ترجیع$%رشیدالدین وطواط%': 14, '<$قصیده$%کمال\u200cالدین اسماعیل%': 3, '<$$%سید حمیدرضا برقعی%': 8, '<$$%اِ لیـــار    (جبار محمدی )%': 24, '<%صادق هدایت%': 17, '<$مقطعات$%ازرقی هروی%': 8, '<$ترجیع$%امیرمعزی%': 3, '<$مسمطات$$%سنایی غزنوی%': 3, '<$رباعی$%رودکی%': 38, '<$رباعی$%انوری ابیوردی%': 24, '<$رباعی$%رهی معیری%': 38, '<$ترکیب$%اقبال لاهوری%': 2, '<$ترجیع$%هاتف اصفهانی%': 1, '<$مسمطات$%منوچهری دامغانی%': 9, '<$$%حافظ%': 18, '<$قطعه$%حافظ%': 33, '<$قصاید$%عطار نیشابوری%': 14, '<$$%ملک الشعرای بهار%': 5, '<$غزل$%احمد شاملو%': 5, '<$مثنوی$%مولوی%': 20, '<$ترجیع$%فرخی سیستانی%': 3, '<$تصنیف$%ملک\u200cالشعرای بهار%': 15, '<$ترکیب$%رشیدالدین میبدی%': 15, '<%نجمه زارع%': 36, '<$غزل$%سیمین بهبهانی%': 9, '<$مثنوی$%عراقی%': 20, '<$قصاید$%امیرخسرو دهلوی%': 12, '<%عبدالواسع جبلی%': 13, '<$رباعی$%ملا هادی سبزواری%': 15, '<$رباعی$%اوحدی مراغه ای%': 25, '<$$%وحدت کرمانشاهی%': 2, '<$قصیده$%هاتف اصفهانی%': 4, '<$قصاید$%هلالی جغتایی%': 4, '<$قصیده$%انوری%': 4, '<$قصیده$%پروین اعتصامی%': 2, '<$رباعی$%قاآنی%': 28, '<$مثنوی$%عمان سامانی%': 1, '<$مسمطات$%منوچهری%': 9, '<$ترکیب$%صادق هدایت%': 3, '<$ترکیب$%سنایی%': 11, '<$شعر نو$': 30, '<$مسمطات$%ملک\u200cالشعرای بهار%': 20, '<$چهارپاره$%عبدالقهّار عاصی%': 4, '<$مثنوی$%وحشی بافقی%': 6, '<$غزل$%حمید مصدق%': 3, '<$ترکیبب$%جامی%': 4, '<$$%ملا هادی سبزواری%': 7, '<$غزل$%مهدی اخوان ثالث%': 8, '<$ترکیب$%هجویری%': 11, '<$$%ایرج میرزا%': 23, '<%شاه اسماعیل صفوی ( خطایی )%': 30, '<$مقطعات$%عراقی%': 12, '<$طنز$': 25, '<$قصیده$%خاقانی%': 4, '<$غزل$%فریدون مشیری%': 12, '<$ترکیب$%مولوی%': 11, '<$تصنیف$%نادر نادرپور%': 1, '<$$%عبدالقهّار عاصی%': 26, '<$قصیده$%صائب تبریزی%': 1, '<$ترکیب$%ملک\u200cالشعرای بهار%': 15, '<$مثنوی$%ظهیر فاریابی%': 2, '<$$%حافظ شیرازی%': 19, '<$ترکیب$%محمدرضا شفیعی کدکنی%': 2, '<$رباعی$%سایه%': 14, '<$ترکیب$%سلمان ساوججی%': 15, '<$$%مولانا خالد نقشبندی%': 10, '<$$%مهستی گنجوی%': 25, '<$غزل$%نظامی گنجوی%': 6, '<$ترکیب$%کمال\u200cالدین اسماعیل%': 15, '<$ترکیب$%شیخ محمود شبستری%': 3, '<$غزل$%بهرام سالکی%': 24, '<%سید حمیدرضا برقعی%': 20, '<$شعر نو$%انوری%': 1, '<$ترجیع$%محمدرضا شفیعی کدکنی%': 4, '<$مثنوی$%احمد پروین%': 10, '<$رباعی$%مهدی اخوان ثالث%': 2, '<$ترکیب$%سعدی%': 4, '<$قصاید$%سعدی شیرازی%': 5, '<$$%فاضل نظری%': 14, '<$ترجیع$%حکیم نزاری قهستانی%': 1, '<$قطعه$%صائب تبریزی%': 1, '<$رباعی$%ایرج میرزا%': 7, '<$طنز$%مهدی اخوان ثالث%': 1, '<$مقطعات$%رشیدالدین میبدی%': 2, '<$ترکیب$%عبید زاکانی%': 5, '<$غزل$%اشعار ترانه\u200cهای سیاوش قمیشی%': 4, '<$قصیده$%سنایی%': 3, '<$قصیده$%عطار%': 1, '<$غزل$%باباافضل کاشانی%': 14, '<$غزل$%منوچهری%': 2, '<$قصاید$%رضی\u200cالدین آرتیمانی%': 6, '<$ترکیب$%مسعود سعد سلمان%': 5, '<$غزل$%کسایی%': 4, '<$قصیده$%نظامی%': 5, '<$ترکیب$%ملک الشعرای بهار%': 2, '<$تصنیف$%سنایی%': 26, '<$طنز$%کمال\u200cالدین اسماعیل%': 1, '<$ترکیب$%نصرالله منشی%': 7, '<$ترکیب$%همام تبریزی%': 1, '<$طنز$%نظامی%': 3, '<$تصنیف$%مولوی%': 3, '<$قصاید$%وحشی بافقی%': 11, '<$غزل$%ظهیر فاریابی%': 10, '<$قطعه$%ملک الشعرای بهار%': 1, '<$تضمین$%رشیدالدین میبدی%': 1, '<$ترجیع$%عراقی%': 4, '<$رباعی$%محمدرضا شفیعی کدکنی%': 6, '<$قصیده$%احمد شاملو%': 6, '<$قطعه$%نصرالله منشی%': 1, '<$غزل$%پروین اعتصامی%': 6, '<$مفردات$%سعدی شیرازی%': 10, '<$قطعه$%خاقانی%': 6, '<$قصیده$%کمال خجندی%': 3, '<$غزل$%سهراب سپهری%': 1, '<$قصیده$%هجویری%': 1, '<$قطعه$%صامت بروجردی%': 2, '<$غزل$%ایرج میرزا%': 19, '<$مثنوی$%اقبال لاهوری%': 2, '<$مثنوی$%شیخ محمود شبستری%': 2, '<$قصیده$%سلمان ساوجی%': 2, '<$قصاید$%جامی%': 6, '<$تضمین$%حکیم نزاری قهستانی%': 2, '<$تصنیف$%وحشی بافقی%': 1, '<$شعر نو$%کمال\u200cالدین اسماعیل%': 1, '<$غزل$%فرخی سیستانی%': 2, '<$قصیده$%وحشی%': 1, '<$رباعی$%منوچهری دامغانی%': 7, '<$رباعی$%منوچهری%': 7, '<$قصیده$%صامت بروجردی%': 1, '<$غزل$%سعدالدین وراوینی%': 3, '<$قصاید$%عمان سامانی%': 8, '<$قصیده$%فریدون مشیری%': 2, '<$تصنیف$%وحشی%': 2, '<$طنز$%رشیدالدین میبدی%': 4, '<$قصیده$%شیون فومنی%': 1, '<$قصیده$%فروغ فرخزاد%': 1, '<$ترکیب$%زرتشت%': 1, '<$قصیده$%سیف فرغانی%': 2, '<$قصیده$%ظهیر فاریابی%': 3, '<$قصیده$%ملک\u200cالشعرای بهار%': 8, '<$ترکیب$%صامت بروجردی%': 3, '<$مثنوی$%اوحدی%': 5, '<$ترکیب$%حافظ%': 2, '<$ترجیع$%رشیدالدین میبدی%': 1, '<$تضمین$%صادق سرمد%': 1, '<$رباعی$%ناصرخسرو قبادیانی%': 4, '<$قطعه$%آیت الله حسین نوری همدانی%': 5, '<$قصاید$%اوحدی مراغه ای%': 5, '<$ترجیع$%سنایی%': 2, '<$طنز$%هجویری%': 1, '<$مثنوی$%سلمان ساوجی%': 2, '<$مثنوی$%نجمه زارع%': 1, '<$قطعه$%سهراب سپهری%': 2, '<$ترجیع$%عبید زاکانی%': 2, '<$قصیده$%قاآنی%': 1, '<$مثنوی$%رشیدالدین میبدی%': 2, '<$قطعه$%سایه%': 7, '<$قصیده$%وحشی بافقی%': 1, '<$طنز$%ملک\u200cالشعرای بهار%': 1, '<$غزل$%محمدعلی بهمنی%': 10, '<$شعر نو$%قاآنی%': 2, '<$شعر نو$%اوحدی%': 1, '<$غزل$%کسایی مروزی%': 3, '<$رباعی$%رشیدالدین میبدی%': 3, '<$تصنیف$%سعدی%': 1, '<$رباعی$%جامی%': 1, '<$غزل$%نادر نادرپور%': 3, '<$قصیده$%حمید مصدق%': 3, '<$قصیده$%باباطاهر%': 1, '<$رباعی$%کسایی مروزی%': 3, '<$قطعه$%شیخ بهایی%': 1, '<$ترکیب$%عبدالقهّار عاصی%': 1, '<$ترکیب$%وحشی بافقی%': 2, '<$تصنیف$%همام تبریزی%': 1, '<$ترکیب$%اوحدی%': 4, '<$قصیده$%محتشم کاشانی%': 4, '<$قصیده$%مسعود سعد سلممان%': 2, '<$ترکیب$%انوری%': 2, '<$قصاید$%نظامی%': 2, '<$$%اوحدی مراغه ای%': 5, '<$غزل$%%': 2, '<$قطعه$%خاقانی شروانی%': 1, '<$قصاید$%مولانا خالد نقشبندی%': 5, '<$قصیده$%نصرالله منشی%': 1, '<$شعر نو$%عطار%': 1, '<$مسمطات$%سنایی%': 2, '<$$%رضی\u200cالدین آرتیمانی%': 2, '<$طنز$%مولوی%': 5, '<$تضمین$%فروغی بسطامی%': 11, '<$غزل$%مهدی سهیلی%': 1, '<$رباعی$%صادق هدایت%': 1, '<$ترجیع$%امام خمینی%': 1, '<$تصنیف$%هجویری%': 4, '<$ترکیب$%ظهیر فاریابی%': 4, '<$مثنوی$%عبدالقهّار عاصی%': 2, '<$قصیده$%جلال الدین محمد مولوی%': 1, '<$$مسمطات$%مسعود سعد سلمان%': 4, '<$غزل$%هجویری%': 1, '<$غزل$%ازرقی هروی%': 1, '<$تصنیف$%صادق هدایت%': 2, '<$غزل$%آیت الله حسین نوری همدانی%': 1, '<$قصیده$%مولوی%': 2, '<$شعر نو$%صامت بروجردی%': 1, '<$ترکیب$%ناصرخسرو%': 4, '<$قطعه$%سعدی شیرازی%': 1, '<$قصیده$%احمد پروین%': 1, '<$قصاید$%حافظ%': 3, '<$قصیده$%داوود ملک\u200cزاده%': 2, '<$قصیده$%صادق سرمد%': 2, '<$قطعه$%شهریار%': 1, '<$شعر نو$%کمال خجندی%': 2, '<$تضمین$%خاقانی%': 1, '<$ترکیب$%نادر نادرپور%': 2, '<$قصیده$%عرفی%': 2, '<$رباعی$%ناصرخسرو%': 4, '<$مثنوی$%جامی%': 3, '<$ترجیع$%شاه نعمت\u200cالله ولی%': 4, '<$ترجیع$%سعدی%': 1, '<$قصیده$%خیام%': 1, '<$قصاید$%هجویری%': 1, '<$قصاید$%نظامی گنجوی%': 1, '<$تصنیف$%جامی%': 1, '<$مثنوی$%باقر فداغی لارستانی%': 1, '<$ترجیع$%ابن حسام خوسفی%': 1, '<$قطعه$%سعدالدین وراوینی%': 1, '<$ترجیع$%اوحدی%': 2, '<$رباعی$%عطار%': 2, '<$قصاید$%حافظ شیرازی%': 3, '<$رباعی$%کسایی%': 3, '<$قطعه$%عطار%': 1, '<$غزل$%کامبیز صدیقی کسمایی%': 1, '<$غزل$%منوچهری دامغانی%': 2, '<$غزل$%داوود ملک\u200cزاده%': 1, '<$قصیده$%سیاوش کسرایی%': 1, '<$تصنیف$%نصرالله منشی%': 1, '<$قصیده$%حافظ%': 1, '<$ترکیب$%ابن حسام خوسفی%': 1, '<$مثنوی$%قاآنی%': 1, '<$قصیده$%سعدی%': 1, '<$مثنوی$%عنصری%': 1, '<$شعر نو$%مولوی%': 1, '<$مفردات$%رشیدالدین میبدی%': 1, '<$ترکیب$%سهراب سپهری%': 1, '<$قطعه$%جامی%': 1, '<$ترجیع$%بهرام سالکی%': 1, '<$قصاید$%%': 1, '<$$%کمال خجندی%': 1, '<$مثنوی$%سید حمیدرضا برقعی%': 1, '<$تضمین$%نصرالله منشی%': 1, '<$رباعی$%مولانا خالد نقشبندی%': 3, '<$غزل$%فروغ فرخزاد%': 1, '<$قطعه$%نادر نادرپور%': 1, '<$مثنوی$%اِ لیـــار    (جبار محمدی )%': 1, '<$شعر نو$%خاقانی%': 1, '<$مفردات$$%ناصرخسرو%': 1, '<$ترکیب$%%': 2, '<$قصیده$%سید حمیدرضا برقعی%': 1, '<$قصاید$%ایرج میرزا%': 1, '<$$%منوچهری%': 1, '<$$%ناصرخسرو قبادیانی%': 1, '<$قصیده$%مهدی اخوان ثالث%': 1, '<$چهارپاره$%ملک الشعرای بهار%': 1, '<$تصنیف$%هلالی جغتایی%': 1, '<$قطعه$%سیاوش کسرایی%': 1, '<$تضمین$%عطار%': 1, '<$تضمین$%فریدون مشیری%': 1, '<$مثنوی$%صائب تبریزی%': 1, '<$تصنیف$%رشیدالدین میبدی%': 2, '<$ترجیع$%صائب تبریزی%': 1, '<$قصیده$%امیرخسرو دهلوی%': 2, '<$$%خیام%': 1, '<$شعر نو$%فریدون مشیری%': 1, '<$مخمسات$%مولانا خالد نقشبندی%': 2, '<$قصیده$%فروغی بسطامی%': 1, '<$تصنیف$%سهراب سپهری%': 1, '<$ترجیع$%رضی\u200cالدین آرتیمانی%': 1, '<$قصیده$%عرفی شیرازی%': 1, '<$شعر نو$%اشعار ترانه\u200cهای سیاوش قمیشی%': 1, '<$مثنوی$%%': 1, '<$ترجیع$%وحشی%': 1}
else:
    prompt_dict = {"": 109892, "$غزل$": 41983, "#بیدل دهلوی#": 3343, "$غزل$#بیدل دهلوی#": 3339, "#حکیم نزاری قهستانی#": 1502, "$غزل$#حکیم نزاری قهستانی#": 1407, "#مولوی#": 7344, "$غزل$#مولوی#": 3247, "$قطعه$": 751, "#شاه نعمت‌الله ولی#": 2974, "$قطعه$#شاه نعمت‌الله ولی#": 134, "$رباعی$": 10455, "#قدسی مشهدی#": 1292, "$رباعی$#قدسی مشهدی#": 651, "#حافظ#": 612, "$غزل$#حافظ#": 495, "#هجویری#": 399, "$ترکیب$": 278, "#نصرالله منشی#": 487, "$ترکیب$#نصرالله منشی#": 7, "#صادق هدایت#": 28, "$رباعی$#صادق هدایت#": 1, "#محمدرضا شفیعی کدکنی#": 409, "#صائب تبریزی#": 13269, "$غزل$#صائب تبریزی#": 7472, "$قصاید$": 6622, "#فرخی سیستانی#": 663, "$قصاید$#فرخی سیستانی#": 510, "#امیرخسرو دهلوی#": 3490, "$غزل$#امیرخسرو دهلوی#": 3122, "#عطار#": 9080, "#فردوسی#": 1230, "$غزل$#عطار#": 871, "#اقبال لاهوری#": 2406, "#وحشی#": 771, "$غزل$#قدسی مشهدی#": 459, "#نادر نادرپور#": 541, "$ترکیب$#نادر نادرپور#": 2, "$مثنوی$": 1209, "$مثنوی$#امیرخسرو دهلوی#": 152, "#رودکی#": 820, "#جامی#": 1962, "$غزل$#شاه نعمت‌الله ولی#": 1564, "#جلال الدین محمد مولوی#": 789, "$غزل$#جلال الدین محمد مولوی#": 763, "#محتشم کاشانی#": 1402, "$غزل$#محتشم کاشانی#": 929, "#سلمان ساوجی#": 1350, "$غزل$#سلمان ساوجی#": 669, "#شهریار#": 355, "$غزل$#شهریار#": 302, "#فروغی بسطامی#": 864, "$غزل$#فروغی بسطامی#": 817, "#سیف فرغانی#": 1270, "$غزل$#سیف فرغانی#": 983, "#کمال‌الدین اسماعیل#": 1982, "$غزل$#کمال‌الدین اسماعیل#": 161, "#پروین اعتصامی#": 438, "$قصاید$#پروین اعتصامی#": 83, "$غزل$#وحشی#": 400, "#خاقانی#": 1713, "#ناصرخسرو قبادیانی#": 287, "$قصاید$#ناصرخسرو قبادیانی#": 281, "#باقر فداغی لارستانی#": 209, "#سهراب سپهری#": 265, "#کمال خجندی#": 1252, "$غزل$#کمال خجندی#": 1085, "#عنصری#": 659, "#سایه#": 499, "$غزل$#سایه#": 125, "#امیرمعزی#": 772, "$رباعی$#امیرمعزی#": 174, "#سنایی#": 2273, "$غزل$#سنایی#": 440, "#بهرام سالکی#": 158, "$غزل$#بهرام سالکی#": 24, "#خواجوی کرمانی#": 1306, "$غزل$#خواجوی کرمانی#": 1306, "#نظامی#": 707, "$رباعی$#مولوی#": 1986, "#اِ لیـــار    (جبار محمدی )#": 453, "$رباعی$#اِ لیـــار    (جبار محمدی )#": 263, "#انوری#": 1463, "$رباعی$#انوری#": 443, "#عطار نیشابوری#": 482, "$غزل$#عطار نیشابوری#": 418, "#ایرج میرزا#": 235, "#رشیدالدین وطواط#": 579, "$قصاید$#رشیدالدین وطواط#": 356, "$رباعی$#خاقانی#": 352, "#باباطاهر#": 783, "#فیض کاشانی#": 1524, "$غزل$#فیض کاشانی#": 1449, "#اوحدی#": 1511, "$غزل$#اوحدی#": 901, "#ملا هادی سبزواری#": 215, "$غزل$#ملا هادی سبزواری#": 186, "#رودکی سمرقندی#": 405, "$قصاید$#رودکی سمرقندی#": 124, "$غزل$#خاقانی#": 401, "$قصاید$#محتشم کاشانی#": 95, "#ملک‌الشعرای بهار#": 1509, "$غزل$#ملک‌الشعرای بهار#": 136, "#امام خمینی#": 338, "$غزل$#امام خمینی#": 149, "#اوحدی مراغه ای#": 519, "$غزل$#اوحدی مراغه ای#": 478, "#ابوسعید ابوالخیر#": 993, "$رباعی$#ابوسعید ابوالخیر#": 749, "#رشیدالدین میبدی#": 2605, "$رباعی$#کمال‌الدین اسماعیل#": 867, "#حافظ شیرازی#": 930, "$قطعه$#حافظ شیرازی#": 34, "#خاقانی شروانی#": 553, "$قصاید$#خاقانی شروانی#": 83, "$مثنوی$#پروین اعتصامی#": 347, "#هلالی جغتایی#": 403, "$غزل$#هلالی جغتایی#": 251, "$رباعی$#محتشم کاشانی#": 112, "$مثنوی$#بهرام سالکی#": 92, "#صادق سرمد#": 60, "#عرفی شیرازی#": 160, "$غزل$#عرفی شیرازی#": 134, "#سعدی شیرازی#": 967, "$غزل$#سعدی شیرازی#": 857, "#ناصرخسرو#": 480, "$قصاید$#ناصرخسرو#": 281, "$رباعی$#سنایی#": 421, "#سعدی#": 2672, "$غزل$#سعدی#": 703, "$رباعی$#سیف فرغانی#": 22, "#کامبیز صدیقی کسمایی#": 359, "#سلطان باهو#": 53, "$غزل$#سلطان باهو#": 53, "$قصاید$#رودکی#": 128, "#عمان سامانی#": 89, "$رباعی$#هلالی جغتایی#": 35, "$غزل$#رشیدالدین وطواط#": 45, "#خلیل‌الله خلیلی#": 53, "$رباعی$#خلیل‌الله خلیلی#": 53, "$قصاید$#سیف فرغانی#": 263, "#شیخ بهایی#": 342, "$قصاید$#خاقانی#": 233, "#ظهیر فاریابی#": 409, "$قصاید$#ظهیر فاریابی#": 80, "$غزل$#حافظ شیرازی#": 830, "$قصاید$#امیرمعزی#": 467, "#مسعود سعد سلمان#": 1145, "$قصاید$#مسعود سعد سلمان#": 484, "#عراقی#": 896, "$رباعی$#عراقی#": 189, "$غزل$#انوری#": 326, "#وحشی بافقی#": 346, "$غزل$#وحشی بافقی#": 215, "#سیاوش کسرایی#": 327, "#مهدی سهیلی#": 120, "#شیخ محمود شبستری#": 242, "$غزل$#عراقی#": 569, "$رباعی$#شاه نعمت‌الله ولی#": 322, "$رباعی$#شیخ بهایی#": 106, "$قصاید$#سنایی#": 408, "$مفردات$": 486, "$مفردات$#شاه نعمت‌الله ولی#": 283, "#مهدی اخوان ثالث#": 218, "#مهستی گنجوی#": 240, "$رباعی$#مهستی گنجوی#": 190, "#احمد شاملو#": 631, "#هاتف اصفهانی#": 495, "$غزل$#هاتف اصفهانی#": 198, "#حمید مصدق#": 237, "$قصاید$#عنصری#": 219, "#انوری ابیوردی#": 406, "$رباعی$#انوری ابیوردی#": 24, "$غزل$#انوری ابیوردی#": 248, "$غزل$#امیرمعزی#": 64, "#همام تبریزی#": 381, "$غزل$#همام تبریزی#": 219, "#ابن حسام خوسفی#": 406, "$غزل$#ابن حسام خوسفی#": 305, "$قصاید$#سلمان ساوجی#": 104, "#فریدون مشیری#": 536, "#سید حمیدرضا برقعی#": 28, "#صامت بروجردی#": 634, "$رباعی$#وحشی بافقی#": 24, "$رباعی$#همام تبریزی#": 99, "$رباعی$#ظهیر فاریابی#": 100, "#قاآنی#": 979, "#عبید زاکانی#": 479, "$ترکیب$#عبید زاکانی#": 5, "$رباعی$#رشیدالدین وطواط#": 36, "#سنایی غزنوی#": 399, "$غزل$#سنایی غزنوی#": 273, "$مثنوی$#شاه نعمت‌الله ولی#": 85, "#عرفی#": 697, "$رباعی$#عرفی#": 124, "#سیمین بهبهانی#": 441, "#فخرالدین اسعد گرگانی#": 274, "$غزل$#عرفی#": 571, "$غزل$#خاقانی شروانی#": 338, "#ملک الشعرای بهار#": 293, "$قصاید$#ملک الشعرای بهار#": 224, "#نظامی گنجوی#": 235, "#رهی معیری#": 357, "$غزل$#رهی معیری#": 197, "$غزل$#اقبال لاهوری#": 50, "#فروغ فرخزاد#": 244, "#خیام نیشابوری#": 72, "$رباعی$#خیام نیشابوری#": 72, "$مقطعات$": 985, "$مقطعات$#کمال خجندی#": 97, "$رباعی$#ابن حسام خوسفی#": 99, "#سعدالدین وراوینی#": 149, "$غزل$#مسعود سعد سلمان#": 34, "#داوود ملک‌زاده#": 87, "$رباعی$#داوود ملک‌زاده#": 84, "$مثنوی$#رودکی#": 90, "$مقطعات$#انوری#": 479, "$قصاید$#قاآنی#": 540, "$قصاید$#انوری ابیوردی#": 87, "$رباعی$#مسعود سعد سلمان#": 397, "$قصاید$#سنایی غزنوی#": 98, "$تصنیف$": 119, "$تصنیف$#سنایی#": 26, "$رباعی$#هاتف اصفهانی#": 60, "#شیون فومنی#": 186, "#عبدالقادر گیلانی#": 73, "$غزل$#عبدالقادر گیلانی#": 73, "#باباافضل کاشانی#": 236, "$رباعی$#باباافضل کاشانی#": 216, "$قصاید$#عراقی#": 40, "$رباعی$#عنصری#": 77, "$غزل$#عبید زاکانی#": 219, "#منوچهری#": 98, "$قصاید$#منوچهری#": 78, "#زرتشت#": 185, "$مثنوی$#مسعود سعد سلمان#": 23, "$قصاید$#هاتف اصفهانی#": 16, "$قصاید$#انوری#": 208, "#احمد پروین#": 167, "$غزل$#احمد پروین#": 128, "$قصاید$#ملک‌الشعرای بهار#": 310, "$مثنوی$#ایرج میرزا#": 37, "$غزل$#ایرج میرزا#": 19, "$مثنوی$#سعدی#": 46, "$ترکیب$#رشیدالدین میبدی#": 15, "$قصاید$#سعدی#": 85, "$قطعه$#حافظ#": 33, "$رباعی$#ملک‌الشعرای بهار#": 71, "$غزل$#صامت بروجردی#": 77, "#ازرقی هروی#": 182, "$قصاید$#ازرقی هروی#": 65, "$رباعی$#اوحدی#": 184, "$غزل$#شیخ بهایی#": 51, "$قطعه$#سلمان ساوجی#": 232, "$قصاید$#کمال‌الدین اسماعیل#": 192, "#رضی‌الدین آرتیمانی#": 234, "$غزل$#رضی‌الدین آرتیمانی#": 114, "#خیام#": 324, "$رباعی$#خیام#": 321, "#خواجه عبدالله انصاری#": 522, "#کارو#": 94, "#اشعار ترانه‌های سیاوش قمیشی#": 355, "$ترکیب$#محتشم کاشانی#": 16, "$رباعی$#رهی معیری#": 38, "$قطعه$#کمال‌الدین اسماعیل#": 10, "$رباعی$#سلمان ساوجی#": 145, "$رباعی$#امام خمینی#": 117, "$قصاید$#عبید زاکانی#": 62, "$غزل$#ظهیر فاریابی#": 10, "$رباعی$#رودکی#": 38, "$ترجیع$": 108, "$ترجیع$#خاقانی#": 7, "#وحدت کرمانشاهی#": 72, "$رباعی$#وحدت کرمانشاهی#": 8, "$مفردات$#سعدی#": 104, "#محمدحسن بارق شفیعی#": 94, "$قطعه$#فرخی سیستانی#": 12, "#نیما یوشیج#": 108, "$قطعه$#ایرج میرزا#": 88, "#اسدی توسی#": 286, "$مقطعات$#رشیدالدین وطواط#": 121, "$رباعی$#فروغی بسطامی#": 35, "$غزل$#جامی#": 14, "$مثنوی$#ملک‌الشعرای بهار#": 83, "$مقطعات$#مسعود سعد سلمان#": 140, "$رباعی$#رضی‌الدین آرتیمانی#": 100, "$غزل$#قاآنی#": 89, "$رباعی$#سعدی#": 202, "#شاطرعباس صبوحی#": 113, "$رباعی$#جلال الدین محمد مولوی#": 25, "$رباعی$#کمال خجندی#": 42, "$قصاید$#عطار#": 30, "$غزل$#وحدت کرمانشاهی#": 60, "#منوچهری دامغانی#": 97, "$قصاید$#منوچهری دامغانی#": 79, "$رباعی$#رودکی سمرقندی#": 25, "$رباعی$#ازرقی هروی#": 107, "$رباعی$#اوحدی مراغه ای#": 25, "$ترکیب$#مولوی#": 11, "#مولانا خالد نقشبندی#": 161, "$غزل$#مولانا خالد نقشبندی#": 58, "#خلیل الله خلیلی#": 31, "$رباعی$#خلیل الله خلیلی#": 31, "$تصنیف$#نادر نادرپور#": 1, "#فایز دشتستانی#": 222, "$قصاید$#اوحدی#": 42, "$مقطعات$#انوری ابیوردی#": 47, "$مقطعات$#عبید زاکانی#": 41, "$مقطعات$#شیخ بهایی#": 20, "$مفردات$#مولانا خالد نقشبندی#": 24, "$طنز$": 26, "$طنز$#مولوی#": 5, "$تضمین$": 36, "$تضمین$#فروغی بسطامی#": 11, "#آیت الله حسین نوری همدانی#": 156, "$ترکیب$#جامی#": 4, "#کسایی#": 219, "$قطعه$#هلالی جغتایی#": 10, "#عبدالواسع جبلی#": 13, "$قصاید$#عبدالواسع جبلی#": 13, "$قصاید$#شاه نعمت‌الله ولی#": 34, "$قصیده$": 156, "$قصیده$#سید حمیدرضا برقعی#": 1, "$معمیات$": 9, "$معمیات$#کمال خجندی#": 9, "$غزل$#اِ لیـــار    (جبار محمدی )#": 132, "$قصیده$#مسعود سعد سلمان#": 2, "$ترجیع$#اوحدی#": 2, "$مثنوی$#قدسی مشهدی#": 34, "$قصاید$#وحشی#": 41, "$رباعی$#خاقانی شروانی#": 25, "$رباعی$#عرفی شیرازی#": 25, "$مثنوی$#محتشم کاشانی#": 22, "#کسایی مروزی#": 110, "$رباعی$#ملک الشعرای بهار#": 22, "$تضمین$#صادق سرمد#": 1, "$ترجیع$#مولوی#": 37, "$شعر نو$": 30, "$شعر نو$#اِ لیـــار    (جبار محمدی )#": 9, "$قصیده$#احمد شاملو#": 6, "$رباعی$#فیض کاشانی#": 70, "$مثنوی$#اقبال لاهوری#": 2, "#محمدعلی بهمنی#": 44, "$غزل$#محمدعلی بهمنی#": 10, "$ترکیب$#نظامی گنجوی#": 5, "$مثنوی$#ظهیر فاریابی#": 2, "$مثنوی$#رودکی سمرقندی#": 38, "$ترجیع$#شاه نعمت‌الله ولی#": 4, "$ترکیب$#عراقی#": 4, "$تضمین$#صامت بروجردی#": 17, "$قصاید$#صائب تبریزی#": 45, "$غزل$#شیون فومنی#": 41, "$تصنیف$#همام تبریزی#": 1, "$مفردات$#همام تبریزی#": 46, "$قطعه$#رهی معیری#": 30, "$قصاید$#عطار نیشابوری#": 14, "$قصاید$#وحشی بافقی#": 11, "$رباعی$#حافظ#": 42, "$غزل$#نادر نادرپور#": 3, "$رباعی$#سعدی شیرازی#": 26, "$تصنیف$#سعدی#": 1, "$رباعی$#ناصرخسرو#": 4, "$رباعی$#مهدی اخوان ثالث#": 2, "$قصاید$#حافظ#": 3, "$غزل$#شاطرعباس صبوحی#": 81, "$قطعه$#رشیدالدین میبدی#": 28, "$مقطعات$#ازرقی هروی#": 8, "$مقطعات$#عراقی#": 12, "$ترکیب$#خاقانی#": 10, "$ترجیع$#سلمان ساوجی#": 3, "$رباعی$#عبید زاکانی#": 76, "$مسمطات$": 53, "$مسمطات$#منوچهری#": 9, "$تصنیف$#عطار#": 19, "$ترکیب$#سنایی#": 11, "#عبدالقهّار عاصی#": 113, "$رباعی$#عبدالقهّار عاصی#": 37, "$قطعه$#مولانا خالد نقشبندی#": 45, "$قصیده$#قاآنی#": 1, "#خسرو گلسرخی#": 106, "$قصیده$#ایرج میرزا#": 35, "$مثنوی$#مولوی#": 20, "$غزل$#سید حمیدرضا برقعی#": 10, "$قصیده$#سنایی#": 3, "$ترکیب$#قاآنی#": 14, "$ترکیب$#مسعود سعد سلمان#": 5, "$مثنوی$#عراقی#": 20, "$مثنوی$#سایه#": 9, "$مسمطات$#قاآنی#": 6, "$رباعی$#منوچهری دامغانی#": 7, "$ترجیع$#رشیدالدین وطواط#": 14, "$رباعی$#فرخی سیستانی#": 36, "$قصیده$#نصرالله منشی#": 1, "$چهارپاره$": 12, "$چهارپاره$#ملک‌الشعرای بهار#": 7, "$رباعی$#قاآنی#": 28, "$رباعی$#حافظ شیرازی#": 25, "#پژمان بختیاری#": 62, "$ترکیب$#عطار#": 20, "#شاه اسماعیل صفوی ( خطایی )#": 60, "$غزل$#عبدالقهّار عاصی#": 17, "#ابوالقاسم فردوسی#": 54, "$مفردات$#ناصرخسرو#": 1, "$ترجیع$#فرخی سیستانی#": 3, "$مثنوی$#قاآنی#": 1, "$غزل$#سیمین بهبهانی#": 9, "$مثنوی$#وحشی بافقی#": 6, "$تصنیف$#مولوی#": 3, "$رباعی$#وحشی#": 66, "#عارف قزوینی#": 35, "$تصنیف$#عارف قزوینی#": 35, "$ترکیب$#کمال‌الدین اسماعیل#": 15, "$قطعه$#سعدی#": 21, "$قصیده$#آیت الله حسین نوری همدانی#": 8, "#نجمه زارع#": 38, "$غزل$#نجمه زارع#": 33, "$مثنوی$#عبید زاکانی#": 4, "$ترکیب$#سعدالدین وراوینی#": 7, "$رباعی$#سایه#": 14, "$مثنوی$#شیخ بهایی#": 28, "$غزل$#نظامی#": 20, "$قصاید$#صامت بروجردی#": 32, "$غزل$#فریدون مشیری#": 12, "$ترکیب$#ملک‌الشعرای بهار#": 15, "$قصاید$#اوحدی مراغه ای#": 5, "$غزل$#سیاوش کسرایی#": 5, "$مثنوی$#رشیدالدین میبدی#": 2, "$ترجیع$#عراقی#": 4, "$ترجیع$#صائب تبریزی#": 1, "$ترکیب$#وحشی#": 11, "$قصیده$#نظامی گنجوی#": 3, "$غزل$#منوچهری دامغانی#": 2, "$قطعه$#سهراب سپهری#": 2, "$مثنوی$#اوحدی#": 5, "$قصیده$#صامت بروجردی#": 1, "$شعر نو$#ملک‌الشعرای بهار#": 4, "$قطعه$#ملک‌الشعرای بهار#": 20, "$غزل$#پروین اعتصامی#": 6, "$مسمطات$#ملک‌الشعرای بهار#": 20, "$قصاید$#ایرج میرزا#": 1, "$ترکیب$#ایرج میرزا#": 2, "$ترجیع$#امیرمعزی#": 3, "$غزل$#رشیدالدین میبدی#": 8, "$رباعی$#سنایی غزنوی#": 25, "$تصنیف$#ملک‌الشعرای بهار#": 15, "$مثنوی$#همام تبریزی#": 15, "$تصنیف$#هجویری#": 4, "$قطعه$#کارو#": 2, "$غزل$#حمید مصدق#": 3, "$قطعه$#خاقانی#": 6, "$قصیده$#کمال خجندی#": 3, "$ترکیب$#محمدرضا شفیعی کدکنی#": 2, "#مصطفی مجیدی#": 18, "$مفردات$#رضی‌الدین آرتیمانی#": 9, "$قطعه$#آیت الله حسین نوری همدانی#": 5, "$قصیده$#محتشم کاشانی#": 4, "$ترکیب$#نظامی#": 17, "$ترکیب$#سعدی#": 4, "$غزل$#باباافضل کاشانی#": 14, "$رباعی$#ملا هادی سبزواری#": 15, "$مفردات$#سعدی شیرازی#": 10, "$ترکیب$#وحشی بافقی#": 2, "$غزل$#کسایی#": 4, "$قصاید$#مولانا خالد نقشبندی#": 5, "$غزل$#ملک الشعرای بهار#": 28, "$ترجیع$#هاتف اصفهانی#": 1, "$غزل$#سهراب سپهری#": 1, "$ترکیب$#ظهیر فاریابی#": 4, "$قصیده$#شیون فومنی#": 1, "$رباعی$#جامی#": 1, "$قطعه$#محتشم کاشانی#": 12, "$قصاید$#عمان سامانی#": 8, "$قصاید$#کمال خجندی#": 4, "$غزل$#کامبیز صدیقی کسمایی#": 1, "$ترکیب$#ناصرخسرو#": 4, "$قصیده$#کمال‌الدین اسماعیل#": 3, "$رباعی$#ناصرخسرو قبادیانی#": 4, "$قطعه$#سایه#": 7, "$شعر نو$#فرخی سیستانی#": 4, "$قصیده$#ملک‌الشعرای بهار#": 8, "$قصیده$#وحشی بافقی#": 1, "$طنز$#رشیدالدین میبدی#": 4, "$مثنوی$#سید حمیدرضا برقعی#": 1, "$رباعی$#کسایی#": 3, "$ترکیب$#سلمان ساوجی#": 15, "$غزل$#نظامی گنجوی#": 6, "$قصیده$#سلمان ساوجی#": 2, "$غزل$#محمدرضا شفیعی کدکنی#": 7, "$قصیده$#فریدون مشیری#": 2, "$ترکیب$#هجویری#": 11, "$رباعی$#شیون فومنی#": 8, "$مقطعات$#هاتف اصفهانی#": 18, "$قصیده$#ظهیر فاریابی#": 3, "$قصیده$#پروین اعتصامی#": 2, "$قصیده$#امیرخسرو دهلوی#": 2, "$شعر نو$#فریدون مشیری#": 1, "$چهارپاره$#عبدالقهّار عاصی#": 4, "$تصنیف$#وحشی#": 2, "$مسمطات$#مسعود سعد سلمان#": 4, "$قطعه$#شیخ بهایی#": 1, "$ترجیع$#سعدی#": 1, "$رباعی$#مولانا خالد نقشبندی#": 3, "$قصیده$#حمید مصدق#": 3, "$مثنوی$#احمد پروین#": 10, "$مثنوی$#عبدالقهّار عاصی#": 2, "$تضمین$#حکیم نزاری قهستانی#": 2, "$مسمطات$#منوچهری دامغانی#": 9, "$شعر نو$#کمال‌الدین اسماعیل#": 1, "$تصنیف$#رشیدالدین میبدی#": 2, "$قصاید$#باباافضل کاشانی#": 6, "$طنز$#جامی#": 4, "$قصیده$#جامی#": 8, "$مثنوی$#نجمه زارع#": 1, "$قصاید$#سعدی شیرازی#": 5, "$قصیده$#فیض کاشانی#": 5, "$قصیده$#بیدل دهلوی#": 4, "$مثنوی$#وحشی#": 7, "$رباعی$#ایرج میرزا#": 7, "#فاضل نظری#": 28, "$رباعی$#عطار#": 2, "$ترکیب$#صامت بروجردی#": 3, "$غزل$#کسایی مروزی#": 3, "$ترجیع$#عبید زاکانی#": 2, "$ترکیب$#رشیدالدین وطواط#": 7, "$قصاید$#امام خمینی#": 3, "$ترکیب$#همام تبریزی#": 1, "$غزل$#اشعار ترانه‌های سیاوش قمیشی#": 4, "$غزل$#مهدی اخوان ثالث#": 8, "$غزل$#احمد شاملو#": 5, "$ترکیب$#اوحدی#": 4, "$رباعی$#کسایی مروزی#": 3, "$شعر نو$#اوحدی#": 1, "$قصیده$#انوری#": 4, "$ترجیع$#سنایی#": 2, "$قصیده$#هاتف اصفهانی#": 4, "$قصاید$#امیرخسرو دهلوی#": 12, "$رباعی$#محمدرضا شفیعی کدکنی#": 6, "$رباعی$#منوچهری#": 7, "$شعر نو$#عطار#": 1, "$ترجیع$#وحشی#": 1, "$قصاید$#حافظ شیرازی#": 3, "$قطعه$#خاقانی شروانی#": 1, "$قصاید$#رضی‌الدین آرتیمانی#": 6, "$غزل$#صادق سرمد#": 3, "$قطعه$#جامی#": 1, "$قصیده$#داوود ملک‌زاده#": 2, "$غزل$#آیت الله حسین نوری همدانی#": 1, "$ترکیب$#سهراب سپهری#": 1, "$مفردات$#کمال خجندی#": 8, "$مثنوی$#جامی#": 3, "$ترکیب$#ابن حسام خوسفی#": 1, "$قصیده$#خاقانی#": 4, "$طنز$#ملک‌الشعرای بهار#": 1, "$مثنوی$#مولانا خالد نقشبندی#": 4, "$مثنوی$#ملک الشعرای بهار#": 5, "$قطعه$#مهدی سهیلی#": 1, "$تضمین$#خاقانی#": 1, "$مسمطات$#سنایی#": 2, "$قصیده$#عرفی#": 2, "$ترجیع$#محمدرضا شفیعی کدکنی#": 4, "$قصیده$#نظامی#": 5, "$ترجیع$#ملک‌الشعرای بهار#": 9, "$غزل$#سعدالدین وراوینی#": 3, "$قصاید$#نظامی#": 2, "$قصیده$#سعدی#": 1, "$ترکیب$#صادق هدایت#": 3, "$قصیده$#مولوی#": 2, "$ترجیع$#عطار#": 2, "$طنز$#نظامی#": 3, "$ترجیع$#امام خمینی#": 1, "$قصاید$#هلالی جغتایی#": 4, "$مثنوی$#اِ لیـــار    (جبار محمدی )#": 1, "$ترجیع$#اوحدی مراغه ای#": 1, "$تصنیف$#هلالی جغتایی#": 1, "$ترکیب$#انوری#": 2, "$قصاید$#جامی#": 6, "$مثنوی$#کمال‌الدین اسماعیل#": 2, "$ترکیب$#زرتشت#": 1, "$تصنیف$#صادق هدایت#": 2, "$غزل$#فرخی سیستانی#": 2, "$قصیده$#عراقی#": 2, "$ترکیب$#امیرمعزی#": 2, "$تصنیف$#شیخ محمود شبستری#": 3, "$قصیده$#وحشی#": 1, "$تصنیف$#وحشی بافقی#": 1, "$مسمطات$#سنایی غزنوی#": 3, "$طنز$#بهرام سالکی#": 3, "$غزل$#هجویری#": 1, "$ترکیب$#ازرقی هروی#": 1, "$غزل$#ازرقی هروی#": 1, "$شعر نو$#انوری#": 1, "$قطعه$#صامت بروجردی#": 2, "$قصیده$#باباطاهر#": 1, "$تصنیف$#نصرالله منشی#": 1, "$قطعه$#نصرالله منشی#": 1, "$تصنیف$#سهراب سپهری#": 1, "$قصیده$#سیاوش کسرایی#": 1, "$قطعه$#سعدالدین وراوینی#": 1, "$قصیده$#جلال الدین محمد مولوی#": 1, "$قصیده$#سیف فرغانی#": 2, "$قصیده$#مهدی اخوان ثالث#": 1, "$قصیده$#حافظ#": 1, "$غزل$#منوچهری#": 2, "$قطعه$#ظهیر فاریابی#": 2, "$قصیده$#فروغی بسطامی#": 1, "$قطعه$#ملک الشعرای بهار#": 1, "$شعر نو$#صامت بروجردی#": 1, "$قصاید$#هجویری#": 1, "$تضمین$#فریدون مشیری#": 1, "$مقطعات$#رشیدالدین میبدی#": 2, "$قطعه$#نادر نادرپور#": 1, "$تضمین$#رشیدالدین میبدی#": 1, "$طنز$#احمد شاملو#": 1, "$رباعی$#رشیدالدین میبدی#": 3, "$طنز$#مهدی اخوان ثالث#": 1, "$قطعه$#سیمین بهبهانی#": 2, "$ترکیب$#شیخ محمود شبستری#": 3, "$طنز$#هجویری#": 1, "$تصنیف$#جامی#": 1, "$قصاید$#نظامی گنجوی#": 1, "$قصیده$#هجویری#": 1, "$ترجیع$#رضی‌الدین آرتیمانی#": 1, "$قصیده$#خیام#": 1, "$مثنوی$#عنصری#": 1, "$تضمین$#عطار#": 1, "$ترجیع$#حمید مصدق#": 1, "$ترکیب$#اقبال لاهوری#": 2, "$قطعه$#سعدی شیرازی#": 1, "$شعر نو$#قاآنی#": 2, "$قطعه$#عطار#": 1, "$ترجیع$#ابن حسام خوسفی#": 1, "$قصیده$#صادق سرمد#": 2, "$غزل$#مهدی سهیلی#": 1, "$ترکیب$#ملک الشعرای بهار#": 2, "$شعر نو$#اشعار ترانه‌های سیاوش قمیشی#": 1, "$قصیده$#صائب تبریزی#": 1, "$رباعی$#صامت بروجردی#": 1, "$طنز$#کمال‌الدین اسماعیل#": 1, "$ترکیب$#عبدالقهّار عاصی#": 1, "$ترجیع$#بهرام سالکی#": 1, "$قصیده$#فروغ فرخزاد#": 1, "$ترکیب$#حافظ#": 2, "$ترجیع$#رشیدالدین میبدی#": 1, "$غزل$#فروغ فرخزاد#": 1, "$مثنوی$#صائب تبریزی#": 1, "$قطعه$#صائب تبریزی#": 1, "$مثنوی$#عمان سامانی#": 1, "$شعر نو$#خاقانی#": 1, "$مخمسات$": 2, "$مخمسات$#مولانا خالد نقشبندی#": 2, "$مثنوی$#سلمان ساوجی#": 2, "$قطعه$#احمد شاملو#": 1, "$غزل$#داوود ملک‌زاده#": 1, "$قصیده$#احمد پروین#": 1, "$قطعه$#سیاوش کسرایی#": 1, "$مفردات$#رشیدالدین میبدی#": 1, "$شعر نو$#کمال خجندی#": 2, "$قطعه$#شهریار#": 1, "$شعر نو$#مولوی#": 1, "$تضمین$#نصرالله منشی#": 1, "$قصیده$#عطار#": 1, "$مثنوی$#شیخ محمود شبستری#": 2, "$چهارپاره$#ملک الشعرای بهار#": 1, "$قصیده$#عرفی شیرازی#": 1, "$مثنوی$#باقر فداغی لارستانی#": 1, "$ترجیع$#حکیم نزاری قهستانی#": 1}
prompt_dict = dict(sorted(prompt_dict.items(), key=lambda x: x[1], reverse=True))
examples = [[x] for x in prompt_dict.keys()]

stop_sequences = ["<|endoftext|>"] # ":پایان","@","#","$",

# examples = [
#     ["<$غزل$@بر دلم هر ذره داغی می توان کردن"],
#     ["<$غزل$%صائب تبریزی%"],
#     ["<$قصاید$"],
#     ["<%سعدی شیرازی%"],
#     ["<$غزل$@دراین سرای بی کسی، کسی به در نمی زند"],
#     ["<$غزل$%مولوی%"],
#     ["<%امیرخسرو دهلوی%"],
#     ["<%شاه نعمت‌الله ولی%"],
#     ["<$رباعی$%مولوی%"],
#     ["<%عطار%"],
#     ["<%قدسی مشهدی%"],
#     ["<$غزل$%بیدل دهلوی%"],
#     ["<$ترجیع$"],
#     ["$مقطعات$%کمال خجندی%"],
#     ["<%ملک‌الشعرای بهار%"],
#     ["<%پروین اعتصامی%"],
#     ["<%مهدی اخوان ثالث%"],
#     ]


class InferenceClientUS(InferenceClient):
    def __init__(
        self,
        model: Optional[str] = None,
        token: Union[str, bool, None] = None,
        timeout: Optional[float] = None,
        headers: Optional[Dict[str, str]] = None,
        cookies: Optional[Dict[str, str]] = None,
    ) -> None:
        super().__init__(
            model=model,
            token=token,
            timeout=timeout,
            headers=headers,
            cookies=cookies,
        )
        
    def post(
        self,
        *,
        json: Optional[Union[str, Dict, List]] = None,
        data: Optional[ContentT] = None,
        model: Optional[str] = None,
        task: Optional[str] = None,
        stream: bool = False,
    ) -> Union[bytes, Iterable[bytes]]:
        """
        Make a POST request to the inference server.

        Args:
            json (`Union[str, Dict, List]`, *optional*):
                The JSON data to send in the request body. Defaults to None.
            data (`Union[str, Path, bytes, BinaryIO]`, *optional*):
                The content to send in the request body. It can be raw bytes, a pointer to an opened file, a local file
                path, or a URL to an online resource (image, audio file,...). If both `json` and `data` are passed,
                `data` will take precedence. At least `json` or `data` must be provided. Defaults to None.
            model (`str`, *optional*):
                The model to use for inference. Can be a model ID hosted on the Hugging Face Hub or a URL to a deployed
                Inference Endpoint. Will override the model defined at the instance level. Defaults to None.
            task (`str`, *optional*):
                The task to perform on the inference. Used only to default to a recommended model if `model` is not
                provided. At least `model` or `task` must be provided. Defaults to None.
            stream (`bool`, *optional*):
                Whether to iterate over streaming APIs.

        Returns:
            bytes: The raw bytes returned by the server.

        Raises:
            [`InferenceTimeoutError`]:
                If the model is unavailable or the request times out.
            `HTTPError`:
                If the request fails with an HTTP error status code other than HTTP 503.
        """
        url = self._resolve_url(model, task)

        if data is not None and json is not None:
            warnings.warn("Ignoring `json` as `data` is passed as binary.")

        # Set Accept header if relevant
        headers = self.headers.copy()
        if task in TASKS_EXPECTING_IMAGES and "Accept" not in headers:
            headers["Accept"] = "image/png"

        t0 = time.time()
        timeout = self.timeout
        while True:
            with _open_as_binary(data) as data_as_binary:
                try:
                    response = get_session().post(
                        url,
                        json=json,
                        data=data_as_binary,
                        headers=headers,
                        cookies=self.cookies,
                        timeout=self.timeout,
                        stream=stream,
                    )
                except TimeoutError as error:
                    # Convert any `TimeoutError` to a `InferenceTimeoutError`
                    raise InferenceTimeoutError(f"Inference call timed out: {url}") from error  # type: ignore

            try:
                hf_raise_for_status(response)
                return response.iter_lines() if stream else response.content
            except HTTPError as error:
                if error.response.status_code == 503:
                    # If Model is unavailable, either raise a TimeoutError...
                    if timeout is not None and time.time() - t0 > timeout:
                        raise InferenceTimeoutError(
                            f"Model not loaded on the server: {url}. Please retry with a higher timeout (current:"
                            f" {self.timeout}).",
                            request=error.request,
                            response=error.response,
                        ) from error
                    # ...or wait 1s and retry
                    logger.info(f"Waiting for model to be loaded on the server: {error}")
                    time.sleep(1)
                    if timeout is not None:
                        timeout = max(self.timeout - (time.time() - t0), 1)  # type: ignore
                    continue
                raise

client = InferenceClientUS(
    API_URL,
    headers={"Authorization": f"Bearer {HF_TOKEN}"},
)

def asynchronous_push(f_stop):
    if data_repo.is_repo_clean():
        print("Repo currently clean. Ignoring push_to_hub")
        print(data_repo.huggingface_token)
    else:
        data_repo.git_add(auto_lfs_track=True)
        data_repo.git_commit("Auto commit by space")
        if FORCE_PUSH == "yes":
            force_git_push(data_repo)
        else:
            data_repo.git_push()
    if not f_stop.is_set():
        # call again in 60 seconds
        threading.Timer(PUSH_FREQUENCY, asynchronous_push, [f_stop]).start()

f_stop = threading.Event()
asynchronous_push(f_stop)

def format_prompt(message, history, system_prompt):
  prompt = ""
  if system_prompt:
    prompt += f"{system_prompt}"
  for user_prompt, bot_response in history:
    prompt += f"{user_prompt}"
    prompt += f"{bot_response}"
  prompt += f"""{message}"""
  return prompt.replace('\n','؛').replace('\t','/').replace(' ** ','/').strip()

def generate(
    prompt, history, system_prompt, 
    temperature=0.9, max_new_tokens=100, top_p=0.95, top_k=100,
    repetition_penalty=1.0, seed=42,
):
    global HISTORY
    HISTORY = history
    global PROMPT
    PROMPT = prompt
    
    temperature = float(temperature)
    if temperature < 1e-2:
        temperature = 1e-2
    top_p = float(top_p)
    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        stop_sequences=stop_sequences,
        do_sample=True,
        #best_of=2,
        top_k=top_k,
        #typical_p=0.9,
        #seed=seed,
    )
    #seed = seed + 1
    history = [] # explicitly set the history as none so no history is important anymore
    formatted_prompt = format_prompt(prompt, history, system_prompt)

    print(f"Formatted Prompt: {formatted_prompt}")
    
    if len(ENDPOINT)>0:
        stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=False, details=True, return_full_text=False)
        stream = [stream] # if stream false
    else:
        stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=False, details=True, return_full_text=False)

    output = "" #f"{prompt}"
    for response in stream:
        #print('stream',response)

        if len(ENDPOINT)>0:
            output += response.generated_text if response.generated_text else ""
        else:        
            output += response

        for stop_str in stop_sequences:
            if output.endswith(stop_str):
                output = output[:-len(stop_str)]
                output = output.rstrip()
                yield output
        yield output

    return output

additional_inputs=[
    gr.Textbox("", label="Optional system prompt"), #<|endoftext|>
    gr.Slider(
        label="Temperature",
        value=0.1,
        minimum=0.0,
        maximum=1.0,
        step=0.01,
        interactive=True,
        info="Higher values produce more diverse outputs",
    ),
    gr.Slider(
        label="Max new tokens",
        value=64,
        minimum=0,
        maximum=250,
        step=64,
        interactive=True,
        info="The maximum numbers of new tokens",
    ),
    gr.Slider(
        label="Top-p (nucleus sampling)",
        value=0.9,
        minimum=0.0,
        maximum=1,
        step=0.05,
        interactive=True,
        info="Higher values sample more low-probability tokens",
    ),
    gr.Slider(
        label="Top-k",
        value=40,
        minimum=0.0,
        maximum=1000,
        step=1,
        interactive=True,
        info="Higher values sample more low-probability tokens",
    ),
    gr.Slider(
        label="Repetition penalty",
        value=1.005,
        minimum=1.0,
        maximum=2.0,
        step=0.05,
        interactive=True,
        info="Penalize repeated tokens",
    ),
    gr.Markdown(
                """
                Contributions:
                - Mojtaba Valipour: Model Design and Pretraining, Data Collection
                - Ali Ghodsi: Advising
                - Amir Mohammad Marshal Pirgheybi: Data Processing
                """
            )
]

CSS = """
.gradio-container textarea {direction: rtl; white-space: pre-line;}
#component-11 #component-12 {direction: rtl; white-space: pre-line;}
p {direction: rtl; white-space: pre-line;}
"""

class Chatbot(gr.Chatbot):
    def __init__(
        self,
        value: list[list[str | tuple[str] | tuple[str | Path, str] | None]]
        | Callable
        | None = None,
        color_map: dict[str, str] | None = None,
        *,
        label: str | None = None,
        every: float | None = None,
        show_label: bool | None = None,
        container: bool = True,
        scale: int | None = None,
        min_width: int = 160,
        visible: bool = True,
        elem_id: str | None = None,
        elem_classes: list[str] | str | None = None,
        height: int | None = None,
        latex_delimiters: list[dict[str, str | bool]] | None = None,
        rtl: bool = False,
        show_share_button: bool | None = None,
        show_copy_button: bool = False,
        avatar_images: tuple[str | Path | None, str | Path | None] | None = None,
        sanitize_html: bool = True,
        render_markdown: bool = True,
        bubble_full_width: bool = True,
        line_breaks: bool = True,
        layout: Literal["panel", "bubble"] | None = None,
        **kwargs,
    ):
        """
        Parameters:
            value: Default value to show in chatbot. If callable, the function will be called whenever the app loads to set the initial value of the component.
            color_map: This parameter is deprecated.
            label: component name in interface.
            every: If `value` is a callable, run the function 'every' number of seconds while the client connection is open. Has no effect otherwise. Queue must be enabled. The event can be accessed (e.g. to cancel it) via this component's .load_event attribute.
            show_label: if True, will display label.
            container: If True, will place the component in a container - providing some extra padding around the border.
            scale: relative width compared to adjacent Components in a Row. For example, if Component A has scale=2, and Component B has scale=1, A will be twice as wide as B. Should be an integer.
            min_width: minimum pixel width, will wrap if not sufficient screen space to satisfy this value. If a certain scale value results in this Component being narrower than min_width, the min_width parameter will be respected first.
            visible: If False, component will be hidden.
            elem_id: An optional string that is assigned as the id of this component in the HTML DOM. Can be used for targeting CSS styles.
            elem_classes: An optional list of strings that are assigned as the classes of this component in the HTML DOM. Can be used for targeting CSS styles.
            height: height of the component in pixels.
            latex_delimiters: A list of dicts of the form {"left": open delimiter (str), "right": close delimiter (str), "display": whether to display in newline (bool)} that will be used to render LaTeX expressions. If not provided, `latex_delimiters` is set to `[{ "left": "$$", "right": "$$", "display": True }]`, so only expressions enclosed in $$ delimiters will be rendered as LaTeX, and in a new line. Pass in an empty list to disable LaTeX rendering. For more information, see the [KaTeX documentation](https://katex.org/docs/autorender.html).
            rtl: If True, sets the direction of the rendered text to right-to-left. Default is False, which renders text left-to-right.
            show_share_button: If True, will show a share icon in the corner of the component that allows user to share outputs to Hugging Face Spaces Discussions. If False, icon does not appear. If set to None (default behavior), then the icon appears if this Gradio app is launched on Spaces, but not otherwise.
            show_copy_button: If True, will show a copy button for each chatbot message.
            avatar_images: Tuple of two avatar image paths or URLs for user and bot (in that order). Pass None for either the user or bot image to skip. Must be within the working directory of the Gradio app or an external URL.
            sanitize_html: If False, will disable HTML sanitization for chatbot messages. This is not recommended, as it can lead to security vulnerabilities.
            render_markdown: If False, will disable Markdown rendering for chatbot messages.
            bubble_full_width: If False, the chat bubble will fit to the content of the message. If True (default), the chat bubble will be the full width of the component.
            line_breaks: If True (default), will enable Github-flavored Markdown line breaks in chatbot messages. If False, single new lines will be ignored. Only applies if `render_markdown` is True.
            layout: If "panel", will display the chatbot in a llm style layout. If "bubble", will display the chatbot with message bubbles, with the user and bot messages on alterating sides. Will default to "bubble".
        """
        super().__init__(
            value = value,
            color_map = color_map,
            label = label,
            every = every,
            show_label = show_label,
            container = container,
            scale = scale,
            min_width = min_width,
            visible = visible,
            elem_id = elem_id,
            elem_classes = elem_classes,
            height = height,
            latex_delimiters = latex_delimiters,
            rtl = rtl,
            show_share_button = show_share_button,
            show_copy_button = show_copy_button,
            avatar_images = avatar_images,
            sanitize_html = sanitize_html,
            render_markdown = render_markdown,
            bubble_full_width = bubble_full_width,
            line_breaks = line_breaks,
            layout = layout,
            kwargs=kwargs,
        )
        
    def _preprocess_chat_messages(
        self, chat_message: str | dict | None
    ) -> str | tuple[str] | tuple[str, str] | None:
        if chat_message is None:
            return None
        elif isinstance(chat_message, dict):
            if chat_message["alt_text"] is not None:
                return (chat_message["name"], chat_message["alt_text"])
            else:
                return (chat_message["name"],)
        else:  # string
            return chat_message
            
    def preprocess(
        self,
        y: list[list[str | dict | None] | tuple[str | dict | None, str | dict | None]],
    ) -> list[list[str | tuple[str] | tuple[str, str] | None]]:
        if y is None:
            return y
        processed_messages = []
        for message_pair in y:
            if not isinstance(message_pair, (tuple, list)):
                raise TypeError(
                    f"Expected a list of lists or list of tuples. Received: {message_pair}"
                )
            if len(message_pair) != 2:
                raise TypeError(
                    f"Expected a list of lists of length 2 or list of tuples of length 2. Received: {message_pair}"
                )
            processed_messages.append(
                [
                    self._preprocess_chat_messages(message_pair[0]),
                    self._preprocess_chat_messages(message_pair[1]),
                ]
            )
        return processed_messages

    def _postprocess_chat_messages(
        self, chat_message: str | tuple | list | None
    ) -> str | dict | None:
        if chat_message is None:
            return None
        elif isinstance(chat_message, (tuple, list)):
            file_uri = str(chat_message[0])
            if utils.validate_url(file_uri):
                filepath = file_uri
            else:
                filepath = self.make_temp_copy_if_needed(file_uri)

            mime_type = client_utils.get_mimetype(filepath)
            return {
                "name": filepath,
                "mime_type": mime_type,
                "alt_text": chat_message[1] if len(chat_message) > 1 else None,
                "data": None,  # These last two fields are filled in by the frontend
                "is_file": True,
            }
        elif isinstance(chat_message, str):
            chat_message = inspect.cleandoc(chat_message)
            return chat_message
        else:
            raise ValueError(f"Invalid message for Chatbot component: {chat_message}")

    def postprocess(
        self,
        y: list[list[str | tuple[str] | tuple[str, str] | None] | tuple],
    ) -> list[list[str | dict | None]]:
        """
        Parameters:
            y: List of lists representing the message and response pairs. Each message and response should be a string, which may be in Markdown format.  It can also be a tuple whose first element is a string or pathlib.Path filepath or URL to an image/video/audio, and second (optional) element is the alt text, in which case the media file is displayed. It can also be None, in which case that message is not displayed.
        Returns:
            List of lists representing the message and response. Each message and response will be a string of HTML, or a dictionary with media information. Or None if the message is not to be displayed.
        """
        if y is None:
            return []
        processed_messages = []
        for message_pair in y:
            result = ""
            #print('Message Pairs: ',message_pair[0],message_pair[1])
            if message_pair[0] is not None:
                result += message_pair[0]
            if message_pair[1] is not None:
                result += message_pair[1]
            if not isinstance(message_pair, (tuple, list)):
                raise TypeError(
                    f"Expected a list of lists or list of tuples. Received: {message_pair}"
                )
            if len(message_pair) != 2:
                raise TypeError(
                    f"Expected a list of lists of length 2 or list of tuples of length 2. Received: {message_pair}"
                )
            processed_messages.append(
                [
                    None,self._postprocess_chat_messages((result).replace('؛','\n').replace('/',' ** ').strip())
                    #self._postprocess_chat_messages(message_pair[1])),
                ]
            )
        return processed_messages

chatbot = Chatbot(label="PersianGPT",
                     rtl=True,
                     show_share_button=True,
                     show_copy_button=True,
                     #layout="panel",
                     bubble_full_width = False)

textbox = gr.Textbox(
            label="textbox",
            container=False,
            show_label=False,
            lines=3,
            scale=7,
            placeholder="...Type something here",
            rtl=True,
        )

textbox_whoareu = gr.Textbox(
            label="textbox_whoareu",
            container=False,
            show_label=False,
            lines=1,
            placeholder="Who are you?",
        )

class ChatInterface(gr.ChatInterface):
    def __init__(
        self,
        fn: Callable,
        *,
        chatbot: Chatbot | None = None,
        textbox: Textbox | None = None,
        additional_inputs: str | IOComponent | list[str | IOComponent] | None = None,
        additional_inputs_accordion_name: str = "Additional Inputs",
        examples: list[str] | None = None,
        cache_examples: bool | None = None,
        title: str | None = None,
        description: str | None = None,
        theme: Theme | str | None = None,
        css: str | None = None,
        analytics_enabled: bool | None = None,
        submit_btn: str | None | Button = "Submit",
        stop_btn: str | None | Button = "Stop",
        retry_btn: str | None | Button = "🔄  Retry",
        undo_btn: str | None | Button = "↩️ Undo",
        clear_btn: str | None | Button = "🗑️  Clear",
        autofocus: bool = True,
    ):
        """
        Parameters:
            fn: the function to wrap the chat interface around. Should accept two parameters: a string input message and list of two-element lists of the form [[user_message, bot_message], ...] representing the chat history, and return a string response. See the Chatbot documentation for more information on the chat history format.
            chatbot: an instance of the gr.Chatbot component to use for the chat interface, if you would like to customize the chatbot properties. If not provided, a default gr.Chatbot component will be created.
            textbox: an instance of the gr.Textbox component to use for the chat interface, if you would like to customize the textbox properties. If not provided, a default gr.Textbox component will be created.
            additional_inputs: an instance or list of instances of gradio components (or their string shortcuts) to use as additional inputs to the chatbot. If components are not already rendered in a surrounding Blocks, then the components will be displayed under the chatbot, in an accordion.
            additional_inputs_accordion_name: the label of the accordion to use for additional inputs, only used if additional_inputs is provided.
            examples: sample inputs for the function; if provided, appear below the chatbot and can be clicked to populate the chatbot input.
            cache_examples: If True, caches examples in the server for fast runtime in examples. The default option in HuggingFace Spaces is True. The default option elsewhere is False.
            title: a title for the interface; if provided, appears above chatbot in large font. Also used as the tab title when opened in a browser window.
            description: a description for the interface; if provided, appears above the chatbot and beneath the title in regular font. Accepts Markdown and HTML content.
            theme: Theme to use, loaded from gradio.themes.
            css: custom css or path to custom css file to use with interface.
            analytics_enabled: Whether to allow basic telemetry. If None, will use GRADIO_ANALYTICS_ENABLED environment variable if defined, or default to True.
            submit_btn: Text to display on the submit button. If None, no button will be displayed. If a Button object, that button will be used.
            stop_btn: Text to display on the stop button, which replaces the submit_btn when the submit_btn or retry_btn is clicked and response is streaming. Clicking on the stop_btn will halt the chatbot response. If set to None, stop button functionality does not appear in the chatbot. If a Button object, that button will be used as the stop button.
            retry_btn: Text to display on the retry button. If None, no button will be displayed. If a Button object, that button will be used.
            undo_btn: Text to display on the delete last button. If None, no button will be displayed. If a Button object, that button will be used.
            clear_btn: Text to display on the clear button. If None, no button will be displayed. If a Button object, that button will be used.
            autofocus: If True, autofocuses to the textbox when the page loads.
        """
        super().__init__(
            fn = fn,
            chatbot = chatbot,
            textbox= textbox,
            additional_inputs = additional_inputs,
            additional_inputs_accordion_name = additional_inputs_accordion_name,
            examples = examples,
            cache_examples = cache_examples,
            title = title,
            description = description,
            theme = theme,
            css = css,
            analytics_enabled = analytics_enabled,
            submit_btn = submit_btn,
            stop_btn = stop_btn,
            retry_btn = retry_btn,
            undo_btn = undo_btn,
            clear_btn = clear_btn,
            autofocus = autofocus,
        )

    async def _stream_fn(
        self,
        message: str,
        history_with_input: list[list[str | None]],
        request: Request,
        *args,
    ) -> AsyncGenerator:
        history = history_with_input[:-1]

        print(f'Message is {message}')
        if len(message)==0:
            message = random.choice(["ا","ب","پ","ت","ث","ج","چ","ح","خ","ل","م","ن","و",
                                    "د","ذ","ر","ز","ژ","س","ش","ص","ض","ط","ظ","ع","غ",
                                    "ف","ق","ه","ی",
                                   ])
        
        inputs, _, _ = special_args(
            self.fn, inputs=[message, history, *args], request=request
        )

        if self.is_async:
            generator = self.fn(*inputs)
        else:
            generator = await anyio.to_thread.run_sync(
                self.fn, *inputs, limiter=self.limiter
            )
            generator = SyncToAsyncIterator(generator, self.limiter)
        try:
            first_response = await async_iteration(generator)
            update = history + [[message, first_response]]
            yield update, update
        except StopIteration:
            update = history + [[message, None]]
            yield update, update
        async for response in generator:
            update = history + [[message, response]]
            yield update, update
        
    async def _submit_fn(
        self,
        message: str,
        history_with_input: list[list[str | None]],
        request: Request,
        *args,
    ) -> tuple[list[list[str | None]], list[list[str | None]]]:
        history = history_with_input[:-1]
        
        inputs, _, _ = special_args(
            self.fn, inputs=[message, history, *args], request=request
        )

        if self.is_async:
            response = await self.fn(*inputs)
        else:
            response = await anyio.to_thread.run_sync(
                self.fn, *inputs, limiter=self.limiter
            )

        history.append([message,response])

        return history, history

chat_interface = ChatInterface(
        generate, 
        chatbot=chatbot,
        textbox=textbox,
        #examples=examples,
        additional_inputs=additional_inputs,
        submit_btn = "Generate",
        stop_btn = None,
        retry_btn = None,
        undo_btn = None,
        clear_btn = None,
        cache_examples=False,
    ) 

#print(dir(chat_interface))

# def evolve_text(x):
    
#     possible_generation = "".join([x for x in generate(
#         x if len(x)>0 else "@", HISTORY, additional_inputs[0].value, 
#         temperature=additional_inputs[1].value, 
#         max_new_tokens=10, 
#         top_p=additional_inputs[3].value, 
#         repetition_penalty=additional_inputs[4].value, 
#         #seed=42,
#     )][-1]) #TODO: need a smarter way to do this

#     return possible_generation

def vote(data: gr.LikeData):
    if data.liked:
        print("You upvoted this response: " + data.value)
    else:
        print("You downvoted this response: " + data.value)

    with open(DATA_FILE, "a") as jsonlfile:
        json_data = [
            json.dumps(
                    {
                        "time_stamp": time.time(),
                        "model_version":MODEL_VERSION,
                        "name":NAME,
                        "username":USERNAME,
                        "prompt": PROMPT,
                        "history": HISTORY,
                        "system prompt": additional_inputs[0].value,
                        "temperature": additional_inputs[1].value,
                        "max_new_tokens": additional_inputs[2].value,
                        "top_p": additional_inputs[3].value,
                        "top_k": additional_inputs[4].value,
                        "repetition_penalty": additional_inputs[5].value,
                        "response": data.value,
                        "label": data.liked,
                    }, ensure_ascii=False
            )
        ]
        jsonlfile.write("\n".join(json_data) + "\n")

def save_whotheyare(x):
    global USERNAME
    global NAME
    if len(x) == 0:
        USERNAME = "guest"
        NAME = "guest"
    else:
        USERNAME = ""
        NAME = x
    
# def hello(profile: gr.OAuthProfile | None) -> str:
#     global USERNAME
#     global NAME
#     #print(dir(profile))
#     if profile is None:
#         USERNAME = "guest"
#         NAME = "guest"
#         return "I don't know you. Please login:"
#     NAME = profile.name
#     USERNAME = profile.preferred_username
#     return f"Hello {profile.name}"
    
with gr.Blocks(css=CSS) as demo:
    
    # with gr.Row():
    #     with gr.Column(css="""textarea {direction: ltl}
    #     p {direction: ltl}"""):
    #         gr.Markdown(
    #             """
    #             PERSIAN GPT by Data Analytics Lab
    #             """
    #         )
    with gr.Row():
        with gr.Column(css="""textarea {direction: ltl}
        p {direction: ltl}"""):
            textbox_whoareu.render()
            textbox_whoareu.change(fn=save_whotheyare, inputs=textbox_whoareu, outputs=None,
                  show_progress = False, status_tracker = None)
    #         gr.Markdown().attach_load_event(hello, None)
    # with gr.Row():
    #     with gr.Column():
    #         gr.LoginButton()
            #gr.LogoutButton()

    chatbot.like(vote, None, None)
    
    #output = gr.Textbox(label="What you can expect coming:")
    #textbox.change(fn=evolve_text, inputs=textbox, outputs=output,
    #               show_progress = False, status_tracker = None)

    #textbox.render()
    chat_interface.render()

demo.queue(concurrency_count=100, api_open=False).launch(show_api=False) #, share=True)