webscout 6.6__py3-none-any.whl → 6.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of webscout might be problematic. Click here for more details.

@@ -6,7 +6,7 @@ webscout/DWEBS.py,sha256=GsKbaVgcxDC5eHtNjxr6r5uk3_8NhtxVG2dqJJVGqaI,18543
6
6
  webscout/LLM.py,sha256=essCz1nakJfmoKLJFguyJnba0HR4AfY6BVU0CEGDCcQ,16336
7
7
  webscout/__init__.py,sha256=eMlqim4Cnc-BLcegMaTtDb2NGt3n48E331IqLx125Mk,864
8
8
  webscout/__main__.py,sha256=pBm2E3ZZiMcCH37b1YCz7qKdKdX_i_S5En6fZDeJKFw,103
9
- webscout/cli.py,sha256=bLaSGs24wxfZlK37_WPPr1jjfbv50nfbxkeSkED0jX0,12456
9
+ webscout/cli.py,sha256=3AG2adVRirqKQMvXX312nswNBtRpmW9-2C16eAhfRd4,11994
10
10
  webscout/conversation.py,sha256=LMZWJVnyc1P5GLAzCLKvw6UU07nD3wA44l9sKh3nu8k,8763
11
11
  webscout/exceptions.py,sha256=10OLw5gFpfyGSSfAMRWT2OYCkdiEJR2byRv74kftAhc,11383
12
12
  webscout/optimizers.py,sha256=ALT4SeO_s_JV6yWG7XJJ3aZIoEiTN1PIaCZJtnGdxXs,10749
@@ -14,13 +14,13 @@ webscout/prompt_manager.py,sha256=Jc0demWN6M6QcwRp14aHZR05r_PVPOaG8PnQkO7pDZ4,98
14
14
  webscout/tempid.py,sha256=7ZTN2eAYqUO2deSdzzhZfgDRxE65OOhGuTBD7f8bTCM,5004
15
15
  webscout/update_checker.py,sha256=mLFD_OYjtEdUvXUiNt8wSbspmkFRmNlULf5sVyVZi60,5129
16
16
  webscout/utils.py,sha256=LVW7U0XcGYqigqxV6D5YXeGMrc_mt7PnNG_YnKf9bBM,3059
17
- webscout/version.py,sha256=cYDAQcJwn2Q6cNtta_6aXODo9AolQGHfZ9rNVaAiFzA,44
18
- webscout/webscout_search.py,sha256=HHdO9XLToC_9nIMM_SaTOKKfzdhrKjb7o8Zi3ZD1O7Y,44744
17
+ webscout/version.py,sha256=1gVsVcJ03O4Y3s8qiPAxRk25y5GbcsNFvUMWB6cFi_E,44
18
+ webscout/webscout_search.py,sha256=kFdcr3-2LaksTbFy9Pmrs_Gfi9XwtfxKKk5_H0hBa80,44748
19
19
  webscout/webscout_search_async.py,sha256=2-RCa9Deahhw3Bti78kXfVaX8y3Aygy4L7HeCaITk9M,14519
20
20
  webscout/Extra/__init__.py,sha256=FbDnwI3zZdoQFosA5Q2bIYpJlHUKFWiFmFKvnk9xWKY,153
21
21
  webscout/Extra/autollama.py,sha256=Mcj7YT8mYL5J7Rg_Wmi3Ppcfh1WK6UWcrbUZySetwuU,8198
22
22
  webscout/Extra/gguf.py,sha256=u_HQ00hiKCcF4GiVabUnFTXEPTmUpa2ADjBNHxtR7bw,16053
23
- webscout/Extra/weather.py,sha256=q-h5UXL2XEBEgoqvEeLRut-ThieNzH_GNfOEIeghKLM,6000
23
+ webscout/Extra/weather.py,sha256=XVi9fb7KZdUNaZjGzCHo8UIkK4v8-rWVfYuDiFbN8WY,5960
24
24
  webscout/Extra/weather_ascii.py,sha256=AsSJT6OCpg9vxzW5h7h0s0PEMq_m_ixvcc7VDtNERdw,793
25
25
  webscout/Extra/YTToolkit/YTdownloader.py,sha256=NfbukCKdyWycl9RzJBXzqSPKW6FwWe7EQxhfLf_dJj8,34793
26
26
  webscout/Extra/YTToolkit/__init__.py,sha256=Wn1K-f6OjZ4GuWvL3FTM4zlTaF3xdb4v_K60YDxKdXg,75
@@ -57,15 +57,14 @@ webscout/Provider/Bing.py,sha256=zxIzq7dlqaLskx9LsYppbMJuwfGtYid3Uh0gIhZ0hps,900
57
57
  webscout/Provider/Blackboxai.py,sha256=KntNTWHHEmXegKFxm79_2tX_FLQF-_7xssrB6T0nCgM,8841
58
58
  webscout/Provider/ChatGPTES.py,sha256=t_Qjn1ShNX0uYp5dJzv6Y7DPQM8HUTgvcBauhFz0-Io,8815
59
59
  webscout/Provider/Chatify.py,sha256=QYgZAEmhLkEnR7oyr-qUs6OSHoNJm2BgMr41f84Ntbg,6370
60
- webscout/Provider/Cloudflare.py,sha256=KZ2aZj-K5se_Xn8GPozJ3xRx2lJhf36uIu0Tyx-jH54,10801
60
+ webscout/Provider/Cloudflare.py,sha256=dPBrB1NO1KrJMK4nFhqlZcYXQvcElgb4W3TdWXCJV9c,10718
61
61
  webscout/Provider/Cohere.py,sha256=oL9kAv--RSkEQxwkPTq1Wi57Wkgg0WNvL82CpTj22YY,8264
62
- webscout/Provider/DARKAI.py,sha256=Bn2p5yU1MMiaS-meQySCVPjtc0uOfjJyxXA0kSaO_P0,9041
62
+ webscout/Provider/DARKAI.py,sha256=kVElPYVh_VchfGylR4YzC3orrPJPyPoOpSolc62b5eY,8944
63
63
  webscout/Provider/Deepinfra.py,sha256=djm8LSDj6aummNSym4HrJHZD2CCVJ_er1oxiFLiq1N4,6389
64
64
  webscout/Provider/Deepseek.py,sha256=axBNDR_5N_Ge9iDopLHhR0kCAD0meq787UNh8oLqqGI,9142
65
65
  webscout/Provider/DiscordRocks.py,sha256=fRkVBCyDMZf0SoaNPK7KXAsh8mQj0JWDb7ifYpL9PQQ,11372
66
66
  webscout/Provider/EDITEE.py,sha256=9rq7c84XoIoRBqd0qgW-Ebu3lyffhicSOtUvMtAjO0s,7742
67
- webscout/Provider/Farfalle.py,sha256=eVmSB4Dq6P2epo8dd6CyCtyxvOMFwvk6f0Ikb9nZ2d0,9017
68
- webscout/Provider/Free2GPT.py,sha256=Lf8dd9iacry_GRr6CT86Cjcp-oNzLyw1O_TWIPDFDxk,9037
67
+ webscout/Provider/Free2GPT.py,sha256=WQOURmq7MciW9Imh-cMSkQgxsuE8cmxs85aBONtv1Rw,8953
69
68
  webscout/Provider/GPTWeb.py,sha256=xh_mnBko6RDyz2v3KhMux-yIipipkZfVVVoUJWkbzcQ,7466
70
69
  webscout/Provider/Gemini.py,sha256=Vg2MLqQ_qxHkcN7Zikife1dyVK-y94ik8y6MAu-VzUI,7801
71
70
  webscout/Provider/Groq.py,sha256=iqyewnxWwN7fMG-dqAR_SyUqImfyZS880lO5iaXso9c,28636
@@ -73,43 +72,41 @@ webscout/Provider/Jadve.py,sha256=_8qlC0oWjGlJAUL6yH__cd6NSGkT0mcLdEZHixFlp-M,93
73
72
  webscout/Provider/Koboldai.py,sha256=gpRgyDe4OQWwNqT7MWnNrJx4dnFmCW23KUx0Ezjgchk,15185
74
73
  webscout/Provider/Llama.py,sha256=N01p3ZVD1HgRnNNxhjRhBVD4m_qiextdyF1KDfJlqbE,7703
75
74
  webscout/Provider/Llama3.py,sha256=fU1iyKflFHDeSqa32M6UE2JtADZB0B7rcG5HYj5MWSQ,7581
76
- webscout/Provider/Marcus.py,sha256=6LvBYnAcbwVYiXoQ8ZrprefJ6zS2KdveiEZauClNtSE,5045
77
- webscout/Provider/Netwrck.py,sha256=qRA8maK76zcTq3Lb3rstuBgKY0lWOk7KIwG4fXTHLPU,8364
78
- webscout/Provider/NinjaChat.py,sha256=tMja5xItus6WoKJm_fhILLoGyPdplikqr-nxtuUziNU,8617
75
+ webscout/Provider/Marcus.py,sha256=lxD8Ti6O2KjmRegAidJcKiC247jVULWHL-hXzlNzySs,5003
76
+ webscout/Provider/Netwrck.py,sha256=TtW-W4oSGwf8JiMBXN6EBttQMA0tMaYvuYnRs0YNI68,9482
79
77
  webscout/Provider/OLLAMA.py,sha256=RQXJt-PJYnA15_IXhUy4mM9qwm4PcBMfINaZm2KG6zE,7018
80
78
  webscout/Provider/Openai.py,sha256=mpJ9VgIyvW6uo0-jIcx5Qcz4PIUAj3xVLOgKrB1z9pU,20074
81
- webscout/Provider/PI.py,sha256=Z2yXXCv84AUbvNNaBQHkJ-Hgp-oc8sPfcvWytYwISVc,12781
82
- webscout/Provider/Phind.py,sha256=NA_b3B4h-kutX6wdoEg4THPfZggl2UeXPbramzZ6oiU,19297
83
- webscout/Provider/PizzaGPT.py,sha256=GkyvWvs_aIcXSpM-j-CfH7Jsft2vU1IUxXmyZ-Z23kI,7120
84
- webscout/Provider/RUBIKSAI.py,sha256=fHCOAFWGXIESA05Bmuqtx6ZChnWomHOMwndfTLv1Hg8,8517
79
+ webscout/Provider/PI.py,sha256=rBxICAtQFP-XglVRXnm6VtShikrEQBMaqh7rhzCloIo,13989
80
+ webscout/Provider/Phind.py,sha256=FaE10xQJ_TluRnzA_t7SxXsqgKzTfXR5lLGla2DQVBM,19467
81
+ webscout/Provider/PizzaGPT.py,sha256=uJDpdkD9yN3n_s7egkipFmvPSBuf312Vy55opkdT3No,6899
82
+ webscout/Provider/RUBIKSAI.py,sha256=EwynOsqHrxk3dNP-hIMn7AO3MkA-RwNHPzA64Ola5Mo,10940
85
83
  webscout/Provider/Reka.py,sha256=dWw4vX91nJhAn-X1SXK72gttRaTqWNGUBFaeRJobTJg,8519
86
84
  webscout/Provider/TeachAnything.py,sha256=6scp1tzcc5z_TKUALArQ4APCNElHJ7SzsJoiB71o0V0,7169
87
85
  webscout/Provider/Youchat.py,sha256=hwm16gmyvMrRseFHl7nrcaHzGlY8BUx3y0KD-YQjTnc,10082
88
- webscout/Provider/__init__.py,sha256=rns4O8C6Thft04CCq9OgAGl1GE8n-ofsvjcyt8CfGfc,2715
86
+ webscout/Provider/__init__.py,sha256=oKmt-p8K3p53Dh9CX_aLYOWz7CKpBY1dOBZjc81YF2M,2591
89
87
  webscout/Provider/ai4chat.py,sha256=av96iS4QPt9IzhcswowmDY2F8IUSLl1YVHZ4bAbfO-s,8140
90
88
  webscout/Provider/aimathgpt.py,sha256=BdXNxEHQP11p6m0wl2Q-uben46A6lMKOg89utV1S7aI,7320
91
89
  webscout/Provider/askmyai.py,sha256=XDxLQfIztI-jwergalUfNiMOwNEw62jGTN4yTlar8Po,5895
92
90
  webscout/Provider/bagoodex.py,sha256=OdYIyvypX-Vkok9zAr6F5NwFQx_z0bKhiw8U4tTFw5o,5023
93
91
  webscout/Provider/cerebras.py,sha256=cyUIgGdVMAmBgTifwuPW-XGC2SKGL2CbTKxY8al9ji4,7986
94
- webscout/Provider/cleeai.py,sha256=tXs_XuYZ2ZGmSOSTS0yJ59qbvFCJusE7yZkIqALwUbE,8064
95
- webscout/Provider/elmo.py,sha256=6C-j8xLfgyMjmv8jdjey0BPzl_UwEFpMEbBtYobfPd0,9387
96
- webscout/Provider/gaurish.py,sha256=yKV4MvOvjMEsXY2fQXDc0YHyFBtW2sh-pA4YNdY--wE,8472
92
+ webscout/Provider/cleeai.py,sha256=ZIPm2dT8H8BxGSLHsgp6aDWn3DVOxAOcFfkMNH1UK0I,7979
93
+ webscout/Provider/elmo.py,sha256=I7qq2YvKht28Z2KFTxj3wNyekJM6gAJCExilB-_UkzQ,9308
94
+ webscout/Provider/gaurish.py,sha256=5FGlc6Ps0hz4AHyXgAreleoeSdfrRJLFUTPyhm-H68A,8393
97
95
  webscout/Provider/geminiapi.py,sha256=c2zvwqkRgscI8vU1FU4qb_4fPe374LIQJ_uHNM9lmF8,8297
98
- webscout/Provider/geminiprorealtime.py,sha256=unQRqHkDt_gkZ_Ls0qBb73d6YTtqYwd1uhYW0RrXKI0,5845
96
+ webscout/Provider/geminiprorealtime.py,sha256=DQdChZRryg9bvXiKpos7wFlu0Q6QNq9lYkbb-FJubWk,5766
99
97
  webscout/Provider/julius.py,sha256=unD3UUnW8-Bie4o0__Vn7cXfqnaVvlE3MWI-LYGb5VE,8576
100
98
  webscout/Provider/koala.py,sha256=qBtqjTvhoMQdDE8qUH0XuNa_x2bic77d7CUjIVboask,10106
101
99
  webscout/Provider/learnfastai.py,sha256=xANWSHF3e6kTKgwbAHYdjNWIwYvr5Bin0NDENmJvruE,9763
102
- webscout/Provider/lepton.py,sha256=4RiQ4YNJljX558yhSUqws6pf1Yhf7pWIesa4SRQCry8,7590
103
- webscout/Provider/llama3mitril.py,sha256=3Ur3GMkmSSTmyxJh1u9fF0xlZ7ssFF6Jxuoi587N1lw,6501
104
- webscout/Provider/llamatutor.py,sha256=DijA4Y1CVDz-Ks8pACTSb6hnOxdQD2IHw-_ztRqhyPQ,8871
105
- webscout/Provider/llmchat.py,sha256=gr7ewEPWWIfjhmpQXTOZJxQffol8MA1yWAIXdG3VZZo,7944
106
- webscout/Provider/meta.py,sha256=N1Ia1iDADfk1QJUHb10Vq5UvObiybQsi5QlUoNVaY-M,30456
107
- webscout/Provider/mhystical.py,sha256=W3j28XOnVGlRPCSYrjA5N7okYEdTVeOw41HdocfvzqE,6555
100
+ webscout/Provider/lepton.py,sha256=ocex934Pb0AXiDrTLh67KhouoHh4EIl5giQbW6cgeDQ,7513
101
+ webscout/Provider/llama3mitril.py,sha256=ykVZxFI-PJL9pASogjuAw9yRRuC7hjKoV8VPdV6ma_0,6445
102
+ webscout/Provider/llamatutor.py,sha256=UdmzgNLflIM1rfD_gL1bIyeS0cmhYSPZC2QmkNPuOK4,8795
103
+ webscout/Provider/llmchat.py,sha256=CFDuISSj8Wj7Vq82stpQodVJLUXlLB-8smcZNKVuOKk,7947
104
+ webscout/Provider/meta.py,sha256=Rn8ixYG2HvHEwkopy7MLGX8qyXjo5Ue0Qfv3hay-ejA,30391
108
105
  webscout/Provider/multichat.py,sha256=c1TFCGv3Ds06mO5eYl_6YmUjGkg_dkqh2weQpYYsc08,8415
109
106
  webscout/Provider/promptrefine.py,sha256=W0Ka59yRRKCOBXfF_hF-iF30F0AR45OPxgCCZ6mZzuA,7722
110
107
  webscout/Provider/talkai.py,sha256=FHBZzBdHrOVn41nkhhJmjhHuR1NKTOBE7lGgYDV-0dk,7598
111
108
  webscout/Provider/turboseek.py,sha256=uEoL5eJFvnpDCymTufrC8O9Ni3i8acb0GBy4JweFeIE,8474
112
- webscout/Provider/tutorai.py,sha256=qBwo53bNtCumFonF43m0RCOQx6dU6t869Cnhw3H6qSM,11204
109
+ webscout/Provider/tutorai.py,sha256=hgjYrI1zqNRhHEoi8t1OU8m9i80EQCay5UtmKqbNS9w,11205
113
110
  webscout/Provider/typegpt.py,sha256=TMNu1h8pyiTqynJoZXi150TjGzGkyZzYGvFKiXnZM3g,12700
114
111
  webscout/Provider/x0gpt.py,sha256=eKDEbUIkY1Cc8mCad-CFA4ZgBXOmR7T7rKf89lh16-8,9383
115
112
  webscout/Provider/yep.py,sha256=uor5RXrEjdoTsEvAROnAa6cZnW2Zlpm382AoltGkvRg,9926
@@ -154,7 +151,7 @@ webscout/Provider/TTS/streamElements.py,sha256=0cfayE1eQYQj4ILF9tmHdodIcw9WknTKs
154
151
  webscout/Provider/TTS/utils.py,sha256=-2sXcGG1lDBIr32fssI1Tf9yxl7gMWZRM0xzUFebeko,10599
155
152
  webscout/Provider/TTS/voicepod.py,sha256=cMF7k88cP-RMqkqcoT8cu1o-eehxd2tqiq8laJeuMJw,4227
156
153
  webscout/litagent/__init__.py,sha256=V-hXEmMp3UH1qKmJDtL0j6_mazmbyyRrIqKqt__oIRw,6091
157
- webscout/litprinter/__init__.py,sha256=PGGakKwKXoKbt-hziQkeRXNfmBlpqZrO0evvFa643i8,28548
154
+ webscout/litprinter/__init__.py,sha256=3Hdtj0-YSdwNqxc_Uc_yZIv7gnsap4e4dvqni4CA9oY,28821
158
155
  webscout/litprinter/colors.py,sha256=5L_WmYFcp2JoX1rCS4GvFCNCOlj2EhEJRGWvqvs8M54,1247
159
156
  webscout/scout/__init__.py,sha256=C-uYGqVR7iiScetSxUTHc76i0OLQnWJO7WFTfhgafW4,325
160
157
  webscout/scout/core.py,sha256=Joiw1RTPse2VQOjF5y6Uksa_ixsUSIO58RLWnyx6gbU,28761
@@ -186,12 +183,11 @@ webstoken/normalizer.py,sha256=-raK5_VMyyeXxEYF7panghYejeQkhKJqxqdhDCX1zwI,1110
186
183
  webstoken/processor.py,sha256=szBNJNFjAjSOHoH4Q2h_MugE_AOnj-QoZwS83sn68Gg,2369
187
184
  webstoken/sentiment.py,sha256=Bivwm9Wmo2GMXvKYxPxd1vrnyDwDywyjxmOIe6jP6NM,7996
188
185
  webstoken/stemmer.py,sha256=AYg1frOaS2CWF-KvFwh3_s-VMZUa0olM7CN1UaEpc-8,2551
189
- webstoken/t.py,sha256=jrgacr0xK8Xbc9BZNtMknZv2xQagg9eMO3MXwCvIIFE,2558
190
186
  webstoken/tagger.py,sha256=RgDxPw0E6VgeXTrAFnnOb4X2J2Hu3snafr-MJeWtHlc,2246
191
187
  webstoken/tokenizer.py,sha256=RAaihP3Yq4OFHcXrTNUGBDLbq1-ti_lVUEw0CIPPCww,5858
192
- webscout-6.6.dist-info/LICENSE.md,sha256=5mkWS6cgjGxJClmN7n--h0beF3uFAOV_Ngr1YTK33Tk,9203
193
- webscout-6.6.dist-info/METADATA,sha256=Z2rc2q-RPXJgG3-EbRKWRIMoxjoomQkH78SFl6rsa-A,40862
194
- webscout-6.6.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
195
- webscout-6.6.dist-info/entry_points.txt,sha256=Hh4YIIjvkqB9SVxZ2ri4DZUkgEu_WF_5_r_nZDIvfG8,73
196
- webscout-6.6.dist-info/top_level.txt,sha256=KQtbgkA3gxcsADB0hIIx-heydmEYXpAY7xn3LjwDx0E,19
197
- webscout-6.6.dist-info/RECORD,,
188
+ webscout-6.8.dist-info/LICENSE.md,sha256=5mkWS6cgjGxJClmN7n--h0beF3uFAOV_Ngr1YTK33Tk,9203
189
+ webscout-6.8.dist-info/METADATA,sha256=SXpZgppl5DVTdkX3rw9kjQjn66pxaVQq3VOu90gopOM,40718
190
+ webscout-6.8.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
191
+ webscout-6.8.dist-info/entry_points.txt,sha256=7thMsVUoHiXGoIH1NeoocKpxlszWflNsNyrnDqGzvO0,70
192
+ webscout-6.8.dist-info/top_level.txt,sha256=KQtbgkA3gxcsADB0hIIx-heydmEYXpAY7xn3LjwDx0E,19
193
+ webscout-6.8.dist-info/RECORD,,
@@ -1,3 +1,3 @@
1
1
  [console_scripts]
2
2
  WEBS = webscout.cli:cli
3
- webscout = webscout.webai:main
3
+ webscout = webscout.cli:cli
@@ -1,227 +0,0 @@
1
- import requests
2
- import json
3
- from typing import Any, Dict, Optional
4
-
5
- from webscout.AIutel import Optimizers
6
- from webscout.AIutel import Conversation
7
- from webscout.AIutel import AwesomePrompts
8
- from webscout.AIbase import Provider, AsyncProvider
9
- from webscout import exceptions
10
-
11
-
12
- class Farfalle(Provider):
13
- """
14
- A class to interact with the Farfalle.dev API.
15
- """
16
-
17
- AVAILABLE_MODELS = [
18
- "gpt-3.5-turbo",
19
-
20
- ]
21
-
22
- def __init__(
23
- self,
24
- is_conversation: bool = True,
25
- max_tokens: int = 600,
26
- timeout: int = 30,
27
- intro: str = None,
28
- filepath: str = None,
29
- update_file: bool = True,
30
- proxies: dict = {},
31
- history_offset: int = 10250,
32
- act: str = None,
33
- model: str = "gpt-3.5-turbo",
34
- ) -> None:
35
- """
36
- Initializes the Farfalle.dev API with given parameters.
37
-
38
- Args:
39
- is_conversation (bool, optional): Flag for chatting conversationally. Defaults to True.
40
- max_tokens (int, optional): Maximum number of tokens to be generated upon completion.
41
- Defaults to 600.
42
- timeout (int, optional): Http request timeout. Defaults to 30.
43
- intro (str, optional): Conversation introductory prompt. Defaults to None.
44
- filepath (str, optional): Path to file containing conversation history. Defaults to None.
45
- update_file (bool, optional): Add new prompts and responses to the file. Defaults to True.
46
- proxies (dict, optional): Http request proxies. Defaults to {}.
47
- history_offset (int, optional): Limit conversation history to this number of last texts.
48
- Defaults to 10250.
49
- act (str|int, optional): Awesome prompt key or index. (Used as intro). Defaults to None.
50
- model (str, optional): AI model to use. Defaults to "gpt-3.5-turbo".
51
- Options: "gpt-3.5-turbo", "gpt-4"
52
- """
53
- if model not in self.AVAILABLE_MODELS:
54
- raise ValueError(f"Invalid model: {model}. Choose from: {self.AVAILABLE_MODELS}")
55
-
56
- self.session = requests.Session()
57
- self.is_conversation = is_conversation
58
- self.max_tokens_to_sample = max_tokens
59
- self.api_endpoint = "https://api.farfalle.dev/chat"
60
- self.stream_chunk_size = 64
61
- self.timeout = timeout
62
- self.last_response = {}
63
- self.model = model
64
- self.headers = {
65
- "accept": "text/event-stream",
66
- "accept-encoding": "gzip, deflate, br, zstd",
67
- "accept-language": "en-US,en;q=0.9,en-IN;q=0.8",
68
- "content-type": "application/json",
69
- "dnt": "1",
70
- "origin": "https://www.farfalle.dev",
71
- "priority": "u=1, i",
72
- "referer": "https://www.farfalle.dev/",
73
- "sec-ch-ua": '"Not)A;Brand";v="99", "Microsoft Edge";v="127", "Chromium";v="127"',
74
- "sec-ch-ua-mobile": "?0",
75
- "sec-ch-ua-platform": '"Windows"',
76
- "sec-fetch-dest": "empty",
77
- "sec-fetch-mode": "cors",
78
- "sec-fetch-site": "same-site",
79
- "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0"
80
- }
81
-
82
- self.__available_optimizers = (
83
- method
84
- for method in dir(Optimizers)
85
- if callable(getattr(Optimizers, method)) and not method.startswith("__")
86
- )
87
- self.session.headers.update(self.headers)
88
- Conversation.intro = (
89
- AwesomePrompts().get_act(
90
- act, raise_not_found=True, default=None, case_insensitive=True
91
- )
92
- if act
93
- else intro or Conversation.intro
94
- )
95
- self.conversation = Conversation(
96
- is_conversation, self.max_tokens_to_sample, filepath, update_file
97
- )
98
- self.conversation.history_offset = history_offset
99
- self.session.proxies = proxies
100
-
101
- def ask(
102
- self,
103
- prompt: str,
104
- stream: bool = False,
105
- raw: bool = False,
106
- optimizer: str = None,
107
- conversationally: bool = False,
108
- ) -> Dict[str, Any]:
109
- """
110
- Sends a prompt to the Farfalle.dev API and returns the response.
111
-
112
- Args:
113
- prompt: The text prompt to generate text from.
114
- stream (bool, optional): Whether to stream the response. Defaults to False.
115
- raw (bool, optional): Whether to return the raw response. Defaults to False.
116
- optimizer (str, optional): The name of the optimizer to use. Defaults to None.
117
- conversationally (bool, optional): Whether to chat conversationally. Defaults to False.
118
-
119
- Returns:
120
- The response from the API.
121
- """
122
- conversation_prompt = self.conversation.gen_complete_prompt(prompt)
123
- if optimizer:
124
- if optimizer in self.__available_optimizers:
125
- conversation_prompt = getattr(Optimizers, optimizer)(
126
- conversation_prompt if conversationally else prompt
127
- )
128
- else:
129
- raise Exception(
130
- f"Optimizer is not one of {self.__available_optimizers}"
131
- )
132
-
133
- payload = {
134
- "query": conversation_prompt,
135
- "model": self.model
136
- }
137
-
138
- def for_stream():
139
- response = self.session.post(
140
- self.api_endpoint, json=payload, headers=self.headers, stream=True, timeout=self.timeout
141
- )
142
-
143
- if not response.ok:
144
- raise exceptions.FailedToGenerateResponseError(
145
- f"Failed to generate response - ({response.status_code}, {response.reason})"
146
- )
147
-
148
- streaming_response = ""
149
- for line in response.iter_lines():
150
- if line:
151
- decoded_line = line.decode('utf-8')
152
- if decoded_line.startswith("data:"):
153
- data = decoded_line[len("data:"):].strip()
154
- if data:
155
- try:
156
- event = json.loads(data)
157
- if event.get("event") == "final-response":
158
- message = event['data'].get('message', '')
159
- streaming_response += message
160
- yield message if raw else dict(text=streaming_response)
161
- except json.decoder.JSONDecodeError:
162
- continue
163
- self.last_response.update(dict(text=streaming_response))
164
- self.conversation.update_chat_history(
165
- prompt, self.get_message(self.last_response)
166
- )
167
- def for_non_stream():
168
- for _ in for_stream():
169
- pass
170
- return self.last_response
171
-
172
- return for_stream() if stream else for_non_stream()
173
-
174
- def chat(
175
- self,
176
- prompt: str,
177
- stream: bool = False,
178
- optimizer: str = None,
179
- conversationally: bool = False,
180
- ) -> str:
181
- """Generate response `str`
182
- Args:
183
- prompt (str): Prompt to be send.
184
- stream (bool, optional): Flag for streaming response. Defaults to False.
185
- optimizer (str, optional): Prompt optimizer name - `[code, shell_command]`. Defaults to None.
186
- conversationally (bool, optional): Chat conversationally when using optimizer. Defaults to False.
187
- Returns:
188
- str: Response generated
189
- """
190
-
191
- def for_stream():
192
- for response in self.ask(
193
- prompt, True, optimizer=optimizer, conversationally=conversationally
194
- ):
195
- yield self.get_message(response)
196
-
197
- def for_non_stream():
198
- return self.get_message(
199
- self.ask(
200
- prompt,
201
- False,
202
- optimizer=optimizer,
203
- conversationally=conversationally,
204
- )
205
- )
206
-
207
- return for_stream() if stream else for_non_stream()
208
-
209
- def get_message(self, response: dict) -> str:
210
- """Retrieves message only from response
211
-
212
- Args:
213
- response (dict): Response generated by `self.ask`
214
-
215
- Returns:
216
- str: Message extracted
217
- """
218
- assert isinstance(response, dict), "Response should be of dict data-type only"
219
- return response["text"]
220
- if __name__ == "__main__":
221
- from rich import print
222
-
223
- ai = Farfalle()
224
- # Stream the response
225
- response = ai.chat("who is pm of india")
226
- for chunk in response:
227
- print(chunk, end="", flush=True)
@@ -1,200 +0,0 @@
1
- import requests
2
- import json
3
- import os
4
- from typing import Any, Dict, Optional, Generator, List, Union
5
-
6
- from webscout.AIutel import Optimizers
7
- from webscout.AIutel import Conversation
8
- from webscout.AIutel import AwesomePrompts, sanitize_stream
9
- from webscout.AIbase import Provider, AsyncProvider
10
- from webscout import exceptions
11
-
12
-
13
- class NinjaChat(Provider):
14
- """
15
- A class to interact with the NinjaChat API.
16
- """
17
-
18
- AVAILABLE_MODELS = {
19
- "mistral": "https://www.ninjachat.ai/api/mistral",
20
- "perplexity": "https://www.ninjachat.ai/api/perplexity",
21
- "claude-3.5": "https://www.ninjachat.ai/api/claude-pro",
22
- "gemini-1.5-pro": "https://www.ninjachat.ai/api/gemini",
23
- "llama": "https://www.ninjachat.ai/api/llama-pro",
24
- "o1-mini": "https://www.ninjachat.ai/api/o1-mini",
25
- }
26
-
27
- def __init__(
28
- self,
29
- is_conversation: bool = True,
30
- max_tokens: int = 2049,
31
- timeout: int = 30,
32
- intro: str = None, # System message/intro prompt
33
- filepath: str = None,
34
- update_file: bool = True,
35
- proxies: dict = {},
36
- history_offset: int = 10250,
37
- act: str = None,
38
- model: str = "llama", # Default model
39
- system_message: str = "You are a helpful AI assistant.", # Default system message
40
- ):
41
- """Initializes the NinjaChat API client."""
42
-
43
- self.headers = {
44
- "Accept": "*/*",
45
- "Accept-Encoding": "gzip, deflate, br, zstd",
46
- "Accept-Language": "en-US,en;q=0.9,en-IN;q=0.8",
47
- "Content-Type": "application/json",
48
- "Cookie": "_ga=GA1.1.298084589.1727859540; _ga_11N4NZX9WP=GS1.1.1727859539.1.0.1727859552.0.0.0; __stripe_mid=4f63db68-c41d-45b4-9111-2457a6cf1b538696a9; __Host-next-auth.csrf-token=a5cb5a40c73df3e808ebc072dcb116fe7dd4b9b8d39d8002ef7e54153e6aa665%7Cbffe3f934f2db43330d281453af2cd0b4757f439b958f2d1a06a36cea63e9cc8; __stripe_sid=118678d1-403a-43f9-b3b9-d80ed9392a0d2ac131; __Secure-next-auth.callback-url=https%3A%2F%2Fwww.ninjachat.ai%2Fdashboard; __Secure-next-auth.session-token=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..l34CIFGTJCtstUqU.VjEYgaUUPpgp-49wueXFlFYvbm8csuyX0HichHrPNH45nX4s_LeZX2VhK1ZvwmUpfdlsMD4bi8VzFfQUEgs8FLPhkbKnoZDP939vobV7K_2Q9CA8PgC0oXEsQf_azWmILZ8rOE37uYzTu1evCnOjCucDYrC1ONXzl9NbGNPVa8AQr7hXvatuqtqe-lBUQXWdrw3QLulbqxvh6yLoxJj04gqC-nPudGciU-_-3TZJYr98u8o7KtUGio1ZX9vHNFfv8djWM1NCkji3Kl9eUhiyMj71.6uhUS39UcCVRa6tFzHxz2g; ph_phc_wWUtqcGWqyyochfPvwKlXMkMjIoIQKUwcnHE3KMKm8K_posthog=%7B%22distinct_id%22%3A%2201924c74-2926-7042-a1fb-5b5debdbcd1c%22%2C%22%24sesid%22%3A%5B1727966419499%2C%22019252bb-9de4-75db-9f85-a389fb401670%22%2C1727964880355%5D%7D",
49
- "DNT": "1",
50
- "Origin": "https://www.ninjachat.ai",
51
- "Priority": "u=1, i",
52
- "Referer": "https://www.ninjachat.ai/dashboard",
53
- "Sec-CH-UA": '"Microsoft Edge";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
54
- "Sec-CH-UA-Mobile": "?0",
55
- "Sec-CH-UA-Platform": '"Windows"',
56
- "Sec-Fetch-Dest": "empty",
57
- "Sec-Fetch-Mode": "cors",
58
- "Sec-Fetch-Site": "same-origin",
59
- "User-Agent": (
60
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
61
- "AppleWebKit/537.36 (KHTML, like Gecko) "
62
- "Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"
63
- )
64
- }
65
- self.session = requests.Session()
66
- self.session.headers.update(self.headers)
67
- self.session.proxies.update(proxies)
68
- self.timeout = timeout
69
- self.last_response = {}
70
- self.system_message = system_message
71
-
72
- self.is_conversation = is_conversation
73
- self.max_tokens_to_sample = max_tokens
74
- self.__available_optimizers = (
75
- method
76
- for method in dir(Optimizers)
77
- if callable(getattr(Optimizers, method)) and not method.startswith("__")
78
- )
79
-
80
- #Set the intro/system message
81
- Conversation.intro = (
82
- AwesomePrompts().get_act(
83
- act, raise_not_found=True, default=None, case_insensitive=True
84
- )
85
- if act
86
- else intro or system_message or Conversation.intro #Priority: act > intro > system_message > Conversation.intro
87
-
88
- )
89
-
90
-
91
- self.conversation = Conversation(
92
- is_conversation, self.max_tokens_to_sample, filepath, update_file
93
- )
94
- self.conversation.history_offset = history_offset
95
-
96
- if model not in self.AVAILABLE_MODELS:
97
- raise ValueError(f"Invalid model: {model}. Choose from: {', '.join(self.AVAILABLE_MODELS)}")
98
- self.model_url = self.AVAILABLE_MODELS[model]
99
- self.headers["Referer"] = self.model_url # Set initial referer
100
-
101
-
102
-
103
- def ask(
104
- self,
105
- prompt: str,
106
- stream: bool = False,
107
- raw: bool = False,
108
- optimizer: str = None,
109
- conversationally: bool = False,
110
- ) -> Union[Dict, Generator]:
111
-
112
- conversation_prompt = self.conversation.gen_complete_prompt(prompt, intro=Conversation.intro)
113
-
114
- if optimizer:
115
- if optimizer in self.__available_optimizers:
116
- conversation_prompt = getattr(Optimizers, optimizer)(
117
- conversation_prompt if conversationally else prompt
118
- )
119
- else:
120
- raise Exception(f"Optimizer is not one of {self.__available_optimizers}")
121
-
122
- #Include the system message in the payload
123
- payload = {
124
- "messages": [
125
- {"role": "system", "content": self.system_message}, # System message here
126
- {"role": "user", "content": conversation_prompt},
127
- ],
128
- "stream": stream # Now passed dynamically
129
- }
130
-
131
- def for_stream():
132
- try:
133
- with requests.post(self.model_url, headers=self.headers, json=payload, stream=True, timeout=self.timeout) as response:
134
- response.raise_for_status()
135
- streaming_text = ""
136
- for line in response.iter_lines(decode_unicode=True):
137
- if line:
138
- if line.startswith("0:"):
139
- try:
140
- text = json.loads(line[2:]) # Extract streaming text
141
- streaming_text += text #Accumulate for history
142
- resp = dict(text=text)
143
- yield resp if raw else resp
144
- except json.JSONDecodeError:
145
- print("\n[Error] Failed to decode JSON content.")
146
-
147
- elif line.startswith("d:"):
148
- break #End of stream
149
- self.conversation.update_chat_history(prompt, streaming_text)
150
- self.last_response.update({"text": streaming_text})
151
- except requests.exceptions.RequestException as e:
152
- print("An error occurred:", e)
153
-
154
-
155
-
156
- def for_non_stream():
157
-
158
- for _ in for_stream():
159
- pass
160
- return self.last_response
161
-
162
-
163
- return for_stream() if stream else for_non_stream()
164
-
165
- def chat(
166
- self,
167
- prompt: str,
168
- stream: bool = False,
169
- optimizer: str = None,
170
- conversationally: bool = False,
171
- ) -> Union[str, Generator]:
172
-
173
- def for_stream():
174
- for response in self.ask(
175
- prompt, True, optimizer=optimizer, conversationally=conversationally
176
- ):
177
- yield self.get_message(response)
178
-
179
- def for_non_stream():
180
- return self.get_message(
181
- self.ask(
182
- prompt, False, optimizer=optimizer, conversationally=conversationally
183
- )
184
- )
185
- return for_stream() if stream else for_non_stream()
186
-
187
- def get_message(self, response: dict) -> str:
188
- assert isinstance(response, dict), "Response should be of dict data-type only"
189
- return response["text"]
190
-
191
-
192
-
193
- if __name__ == "__main__":
194
- from rich import print
195
- bot = NinjaChat(model="perplexity", system_message="You are a creative writer.")
196
-
197
- response = bot.chat("tell me about Abhay koul, HelpingAI ", stream=True)
198
-
199
- for chunk in response:
200
- print(chunk, end="", flush=True)