chainlit 2.0.0__py3-none-any.whl → 2.0.dev1__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 chainlit might be problematic. Click here for more details.
- chainlit/__init__.py +57 -55
- chainlit/action.py +10 -12
- chainlit/{auth/__init__.py → auth.py} +34 -20
- chainlit/cache.py +1 -2
- chainlit/callbacks.py +7 -52
- chainlit/chat_context.py +2 -2
- chainlit/chat_settings.py +1 -3
- chainlit/cli/__init__.py +1 -14
- chainlit/config.py +69 -35
- chainlit/context.py +2 -3
- chainlit/copilot/dist/index.js +935 -8533
- chainlit/data/__init__.py +8 -96
- chainlit/data/acl.py +2 -3
- chainlit/data/base.py +1 -1
- chainlit/data/dynamodb.py +3 -5
- chainlit/data/literalai.py +6 -4
- chainlit/data/sql_alchemy.py +7 -8
- chainlit/data/storage_clients/azure.py +0 -1
- chainlit/data/storage_clients/base.py +0 -6
- chainlit/data/storage_clients/s3.py +3 -16
- chainlit/discord/app.py +1 -2
- chainlit/element.py +9 -13
- chainlit/emitter.py +21 -17
- chainlit/frontend/dist/assets/{DailyMotion-DgRzV5GZ.js → DailyMotion-D1ipkdPJ.js} +1 -1
- chainlit/frontend/dist/assets/{Facebook-C0vx6HWv.js → Facebook-d4TLeTik.js} +1 -1
- chainlit/frontend/dist/assets/{FilePlayer-CdhzeHPP.js → FilePlayer-BcU7tttX.js} +1 -1
- chainlit/frontend/dist/assets/{Kaltura-5iVmeUct.js → Kaltura-DdaRjZrh.js} +1 -1
- chainlit/frontend/dist/assets/{Mixcloud-C2zi77Ex.js → Mixcloud-BaJoMsaU.js} +1 -1
- chainlit/frontend/dist/assets/{Mux-Vkebogdf.js → Mux-DxPCM5d3.js} +1 -1
- chainlit/frontend/dist/assets/{Preview-DwY_sEIl.js → Preview-tUK_Z9pZ.js} +1 -1
- chainlit/frontend/dist/assets/{SoundCloud-CREBXAWo.js → SoundCloud-K8-lFZC6.js} +1 -1
- chainlit/frontend/dist/assets/{Streamable-B5Lu25uy.js → Streamable-hB-AQ54w.js} +1 -1
- chainlit/frontend/dist/assets/{Twitch-y9iKCcM1.js → Twitch-pmuNY0J5.js} +1 -1
- chainlit/frontend/dist/assets/{Vidyard-ClYvcuEu.js → Vidyard-BSUm6trV.js} +1 -1
- chainlit/frontend/dist/assets/{Vimeo-D6HvM2jt.js → Vimeo-JIPn71zS.js} +1 -1
- chainlit/frontend/dist/assets/Wistia-D75KkqOG.js +1 -0
- chainlit/frontend/dist/assets/{YouTube-D10tR6CJ.js → YouTube-CPlwqNm_.js} +1 -1
- chainlit/frontend/dist/assets/index-CuSbXjG5.js +1091 -0
- chainlit/frontend/dist/assets/index-CwmincdQ.css +1 -0
- chainlit/frontend/dist/assets/{react-plotly-BpxUS-ab.js → react-plotly-DALmanjC.js} +1 -1
- chainlit/frontend/dist/index.html +2 -2
- chainlit/haystack/callbacks.py +4 -5
- chainlit/input_widget.py +4 -6
- chainlit/langchain/callbacks.py +47 -56
- chainlit/langflow/__init__.py +0 -1
- chainlit/llama_index/callbacks.py +7 -7
- chainlit/message.py +7 -6
- chainlit/mistralai/__init__.py +2 -3
- chainlit/oauth_providers.py +3 -70
- chainlit/openai/__init__.py +2 -3
- chainlit/secret.py +1 -1
- chainlit/server.py +174 -474
- chainlit/session.py +5 -7
- chainlit/slack/app.py +2 -3
- chainlit/socket.py +103 -78
- chainlit/step.py +11 -11
- chainlit/sync.py +1 -2
- chainlit/teams/app.py +0 -1
- chainlit/types.py +4 -20
- chainlit/user.py +1 -2
- chainlit/utils.py +2 -3
- {chainlit-2.0.0.dist-info → chainlit-2.0.dev1.dist-info}/METADATA +38 -8
- chainlit-2.0.dev1.dist-info/RECORD +99 -0
- chainlit/auth/cookie.py +0 -123
- chainlit/auth/jwt.py +0 -37
- chainlit/data/chainlit_data_layer.py +0 -584
- chainlit/data/storage_clients/azure_blob.py +0 -80
- chainlit/data/storage_clients/gcs.py +0 -78
- chainlit/frontend/dist/assets/Dataframe-DVgwSMU2.js +0 -22
- chainlit/frontend/dist/assets/Wistia-Cu4zZ2Ci.js +0 -1
- chainlit/frontend/dist/assets/index-CI4qFOt5.js +0 -8665
- chainlit/frontend/dist/assets/index-CrrqM0nZ.css +0 -1
- chainlit/translations/nl-NL.json +0 -229
- chainlit-2.0.0.dist-info/RECORD +0 -106
- {chainlit-2.0.0.dist-info → chainlit-2.0.dev1.dist-info}/WHEEL +0 -0
- {chainlit-2.0.0.dist-info → chainlit-2.0.dev1.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
chainlit/__init__.py,sha256=a9Kp1l-bWiCWV8zn4Eo-TDwFp7Uy6bgf0u7di2bZaNo,4433
|
|
2
|
+
chainlit/__main__.py,sha256=7Vg3w3T3qDuz4KDu5lQhLH6lQ3cYdume7gHH7Z1V97U,87
|
|
3
|
+
chainlit/_utils.py,sha256=vaKfEpXcL4kXktp54IRQWZRK4L_HGK8gJuAoIM29YYc,289
|
|
4
|
+
chainlit/action.py,sha256=k-GsblVHI4DnDWFyF-RZgq3KfdfAFICFh2OBeU4w8N8,1410
|
|
5
|
+
chainlit/auth.py,sha256=Ut_sQTgYDQ7K2t3QG0ByO4Gw5t0PmmYI4Cr48cJmHCA,2846
|
|
6
|
+
chainlit/cache.py,sha256=d6A8u3aWKJouuN7Ikx6e9bnsrZzPlaCy42PXSEQYrNY,1348
|
|
7
|
+
chainlit/callbacks.py,sha256=cz8RBC4yT2M8mK--lrazMFt4ZPrdPKwca4iSLZFm_mI,8886
|
|
8
|
+
chainlit/chat_context.py,sha256=X1NInuCkhrfFhFUNIbipVaqf-90xXuyCAB9fvJlEUD4,1868
|
|
9
|
+
chainlit/chat_settings.py,sha256=2ByenmwS8O6jQjDVJjhhbLrBPGA5aY2F7R3VvQQxXPk,877
|
|
10
|
+
chainlit/cli/__init__.py,sha256=EBm7RAcR9579s1uglKQ5O9UxSEQ5FEIXh2-joljRSFc,6244
|
|
11
|
+
chainlit/config.py,sha256=8o06uZt3w6GUO-jbkOrJoYsBi8ZU7hfUctRGb44GjTs,16907
|
|
12
|
+
chainlit/context.py,sha256=yAN5da8w2P5pZ8OhQLVpsoc5eqeNoo_mFSGNE6C_AGo,3318
|
|
13
|
+
chainlit/copilot/dist/assets/logo_dark-IkGJ_IwC.svg,sha256=Kjz3QMh-oh-ag4YatjU0YCPqGF7F8nHh8VUQoJIs01E,8887
|
|
14
|
+
chainlit/copilot/dist/assets/logo_light-Bb_IPh6r.svg,sha256=sHjnvEq1rfqh3bcexJNYUY7WEDdTQZq3aKZYpi4w4ck,8889
|
|
15
|
+
chainlit/copilot/dist/index.js,sha256=hfHsPAAtWdDTi9mJ28pU5T57FNZRxjIbHT_OH4ej8mo,7126630
|
|
16
|
+
chainlit/data/__init__.py,sha256=oaKft5-ejrduen95fTMVmqLMLXVyEa97mQI72oDDSlE,751
|
|
17
|
+
chainlit/data/acl.py,sha256=5EwZuKVcZediw77L661MohGce3JzGIaYmw6NutmMTw0,578
|
|
18
|
+
chainlit/data/base.py,sha256=U8MTp_7Ywmnt3j5W6TmYvBqqK61TOZ1T7kYi7RTyUGc,2539
|
|
19
|
+
chainlit/data/dynamodb.py,sha256=lb_XM5ApL82ATMmvqoHyD-Hror22TXedXLDFGFh9qZM,19456
|
|
20
|
+
chainlit/data/literalai.py,sha256=H6fxhqwJVeA6movnmlcB_TToD7jslY1X8u2vg3gIku0,17256
|
|
21
|
+
chainlit/data/sql_alchemy.py,sha256=1Kc3d6FSNVj7f2L1ms34NiAW7uAJ9fxJhUL9cjzTDyI,29562
|
|
22
|
+
chainlit/data/storage_clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
|
+
chainlit/data/storage_clients/azure.py,sha256=25VCLfSUuiwbS68r8YUaQnquDkbhvjt8iXeD78Oay_E,2530
|
|
24
|
+
chainlit/data/storage_clients/base.py,sha256=mOu3yWgLaqtdPZFjdngJ8ItTR_8Nwq05JxIjXfXlYMg,440
|
|
25
|
+
chainlit/data/storage_clients/s3.py,sha256=LcXABHtc4zX5YiMBLN4Xr7YAXpb0zPXojTMkrNjUKj0,1158
|
|
26
|
+
chainlit/data/utils.py,sha256=cVe8p9F-lITgmAD2xhON_h0nKJVrh1P0AUoLCq6JCWs,966
|
|
27
|
+
chainlit/discord/__init__.py,sha256=lTHHcYQmfa2wpJ35m3eveEpUbp6ti2YSA7AdopfsREs,219
|
|
28
|
+
chainlit/discord/app.py,sha256=-efl4v9wNvfidYPjS2kqNqaaUCvvfBlErZe6lyQF_IE,11174
|
|
29
|
+
chainlit/element.py,sha256=3bWesS5LVR3nJgrqsipDc0UqfrPOQekQWMmpgL91GDw,11632
|
|
30
|
+
chainlit/emitter.py,sha256=DvxpQYS_BKPHQ6WUEOOhAOkl9M14Tm1FQ8uFI2xi75E,13946
|
|
31
|
+
chainlit/frontend/dist/assets/DailyMotion-D1ipkdPJ.js,sha256=lfI-aAHQqeU7vKM-4nWByYOkCCOavciTgXwCVLlLR58,2958
|
|
32
|
+
chainlit/frontend/dist/assets/Facebook-d4TLeTik.js,sha256=UYx9xHuTTPbxfY8EAzQ4IoEAJKb53pa_rqKSR4ggqRE,3213
|
|
33
|
+
chainlit/frontend/dist/assets/FilePlayer-BcU7tttX.js,sha256=0MPqwM_Z2hMWD7RC_gwDHlWgsIamSeFFL4j2tOgjJo0,9038
|
|
34
|
+
chainlit/frontend/dist/assets/Kaltura-DdaRjZrh.js,sha256=_eegLbhKDAjJ0-GZK2e0Az-WF-pJOpUkChSXIjjvhso,2787
|
|
35
|
+
chainlit/frontend/dist/assets/Mixcloud-BaJoMsaU.js,sha256=5_A4jZhkc9QAPMvSpE1OQrmy_fHTwGgia_xK5X3AD6Y,2635
|
|
36
|
+
chainlit/frontend/dist/assets/Mux-DxPCM5d3.js,sha256=dZb7Vr5Rf91Ql43b5whuo9bBJDCbitChES4PHDIfWDk,5357
|
|
37
|
+
chainlit/frontend/dist/assets/Preview-tUK_Z9pZ.js,sha256=kjPNO2PZVlSRWy7pIF5zMFtHsQ1j5Mr2-X2wiHgrXTY,3008
|
|
38
|
+
chainlit/frontend/dist/assets/SoundCloud-K8-lFZC6.js,sha256=hzRPMiai5ojIEiM6E4kV5xue_bH41bEh4zOGY7PwzvM,2920
|
|
39
|
+
chainlit/frontend/dist/assets/Streamable-hB-AQ54w.js,sha256=FyErjgWAGbxutmgMZmOyMR4B3s0Rv_3a_zAJB21ah0A,2932
|
|
40
|
+
chainlit/frontend/dist/assets/Twitch-pmuNY0J5.js,sha256=uK1rfxa-DcQxmtg874BotoDLsDuL0mxiTrI9aQKjgBE,3080
|
|
41
|
+
chainlit/frontend/dist/assets/Vidyard-BSUm6trV.js,sha256=lnn3nNL0FaSUvMOURTKCWye-xGgustAGEKfUiR5swaE,2854
|
|
42
|
+
chainlit/frontend/dist/assets/Vimeo-JIPn71zS.js,sha256=M2SFC9RInnw2bXL-svvrh8SozvtUjxGzejGLLvo8NUE,3624
|
|
43
|
+
chainlit/frontend/dist/assets/Wistia-D75KkqOG.js,sha256=cE8UHEmoZ7_HeGU0Nccfeyq4HXjqpzR5v9hyZ-JpmV4,3511
|
|
44
|
+
chainlit/frontend/dist/assets/YouTube-CPlwqNm_.js,sha256=IEu7N_8-p8TQUW0m1Fqx2egYvOWS2k43-BcfCGKR6FE,4445
|
|
45
|
+
chainlit/frontend/dist/assets/index-CuSbXjG5.js,sha256=8mZvRkklEqjcYWBHkQwLFuSIWofAmMrsFilS6WtUrNQ,3086883
|
|
46
|
+
chainlit/frontend/dist/assets/index-CwmincdQ.css,sha256=qvl0qUmR5u0JcmJAfkzaZpN-0ZKdQjzqCSE9cnrQpZQ,2559
|
|
47
|
+
chainlit/frontend/dist/assets/logo_dark-IkGJ_IwC.svg,sha256=Kjz3QMh-oh-ag4YatjU0YCPqGF7F8nHh8VUQoJIs01E,8887
|
|
48
|
+
chainlit/frontend/dist/assets/logo_light-Bb_IPh6r.svg,sha256=sHjnvEq1rfqh3bcexJNYUY7WEDdTQZq3aKZYpi4w4ck,8889
|
|
49
|
+
chainlit/frontend/dist/assets/react-plotly-DALmanjC.js,sha256=MtXH8sP_q-N7gE344TAaTEe8gxmIRSiltHN4tDGkx5g,3762918
|
|
50
|
+
chainlit/frontend/dist/favicon.svg,sha256=0Cy8x28obT5eWW3nxZRhsEvu6_zMqrqbg0y6hT3D0Q0,6455
|
|
51
|
+
chainlit/frontend/dist/index.html,sha256=SK_O7tN4N8B6npXJwHS4lfYevWECNQW3TbSQtJf32Dc,972
|
|
52
|
+
chainlit/haystack/__init__.py,sha256=uZ77YiPy-qleSTi3dQCDO9HE6S6F6GpJWmh7jO4cxXA,217
|
|
53
|
+
chainlit/haystack/callbacks.py,sha256=mh6CS6n0Z70u9B1s72iF0kSl-qi2N55T-AgaMtUvq9Y,5036
|
|
54
|
+
chainlit/hello.py,sha256=LwENQWo5s5r8nNDn4iKSV77vX60Ky5r_qGjQhyi7qlY,416
|
|
55
|
+
chainlit/input_widget.py,sha256=KmOn1nPTBvnld3iIBHR0Vih0KsCxVnTbo2t_xBNANzo,4949
|
|
56
|
+
chainlit/langchain/__init__.py,sha256=zErMw0_3ufSGeF9ye7X0ZX3wDat4mTOx97T40ePDO2g,217
|
|
57
|
+
chainlit/langchain/callbacks.py,sha256=qC9p_XKYOVEszy2gdRr2QTHVtKHBzK07OXfcoxmqMOE,21242
|
|
58
|
+
chainlit/langflow/__init__.py,sha256=wxhxdsl1yxdsRyNTgZticxFF_8VFtJJ4OdIy3tnEIyM,817
|
|
59
|
+
chainlit/llama_index/__init__.py,sha256=weRoIWCaRBGvA1LczCEfsqhWsltQSVlhtRnTovtdo8w,227
|
|
60
|
+
chainlit/llama_index/callbacks.py,sha256=HtxBRkfjHnwEBmhcuYDFsAD2gUVpsOi4ET39l4afh1M,7286
|
|
61
|
+
chainlit/logger.py,sha256=wTwRSZsLfXwWy6U4351IgWAm4KCMThgxm9EZpjGUEr4,373
|
|
62
|
+
chainlit/markdown.py,sha256=V-Op4hyqyTTvXInU5QrHfxs0nb71lBMU8trOSAlast8,2142
|
|
63
|
+
chainlit/message.py,sha256=Rd7CT0U-Zv0zu7jce_XB32h10Ui7z4Ahlis41YYJJxQ,17308
|
|
64
|
+
chainlit/mistralai/__init__.py,sha256=Zr3-mb-3ycNXR1e5ui_yX_7ZxGB0cu5d9E80ir7t-2w,1507
|
|
65
|
+
chainlit/oauth_providers.py,sha256=e-HupFy6HFPCAavBfD3XGBgwHU1n0JrGHO7QjeBp0ts,24297
|
|
66
|
+
chainlit/openai/__init__.py,sha256=CJp-3lr4NS3X-aZ0H3OvKcL5wFf-cJZffIK0Bwl9jxA,1690
|
|
67
|
+
chainlit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
68
|
+
chainlit/secret.py,sha256=cQvIFGTQ7r2heC8EOGdgifSZZYqslh-qQxhUhKhD8vU,295
|
|
69
|
+
chainlit/server.py,sha256=AIHezi1QgJC1JWRhETZmeWFXCiRg93edwrhl3MfT1nY,30430
|
|
70
|
+
chainlit/session.py,sha256=dU56wmJ9LSuSAOwKBpYF8ZofV5SoN1oPmWycHWEN85k,9219
|
|
71
|
+
chainlit/slack/__init__.py,sha256=gkC1iYlQrWHDN8bbsWOquwwlyW9DtKAe22GizJJzY7A,226
|
|
72
|
+
chainlit/slack/app.py,sha256=jzy6Nz9kmnJ6j1wfoI94cweSNDjdv7X-ur_lWnq5oVE,11741
|
|
73
|
+
chainlit/socket.py,sha256=Hg1OC0diVii9o_KZjo1mqnFbgZjezrF3r60D1-UfoBs,12762
|
|
74
|
+
chainlit/step.py,sha256=jyrmaLfj6cwiNtRcJ7q1492g5ZIpuTXX3jjI2Mv35uM,14286
|
|
75
|
+
chainlit/sync.py,sha256=G1n-7-3WgXsN8y1bJkEyws_YwmHZIyDZoZUwhprigag,1235
|
|
76
|
+
chainlit/teams/__init__.py,sha256=_lUcuc5R4bYwUoC15jyKES10KTeH8ciSWqV5JyLrW6M,236
|
|
77
|
+
chainlit/teams/app.py,sha256=gJm_wBNzCawaTLIYtOEhDlpRwBDprnguTAIoWZhlO8o,10533
|
|
78
|
+
chainlit/telemetry.py,sha256=Rk4dnZv0OnGOgV4kD-VHdhgl4i7i3ypqhSE_R-LZceM,3060
|
|
79
|
+
chainlit/translations/bn.json,sha256=_44si0jO2AFZytfH9sBcINpOveQ4OZs77yf-_VlUtjs,13172
|
|
80
|
+
chainlit/translations/en-US.json,sha256=eS9YSnca-MFpWeZI4JhI0Yl0YBQlrsxB-yFM62K03bI,7778
|
|
81
|
+
chainlit/translations/gu.json,sha256=CkhAowZ0mgMJhQUMrUADfKPfsDgj5mvHlC3WtQ0UjQE,12699
|
|
82
|
+
chainlit/translations/he-IL.json,sha256=fu6FXfoqYqydSh_NcDpS6ZN7byQ-WZkr4zU0qXznqwc,8789
|
|
83
|
+
chainlit/translations/hi.json,sha256=J15GBkMu45RJMj1p5sFVnlackwAp_jKySRsKN-wRCUg,12397
|
|
84
|
+
chainlit/translations/kn.json,sha256=koYH5mEcX4ZfacgmiTu_UfKgNbDXXUwcEV7v6uq92eY,13575
|
|
85
|
+
chainlit/translations/ml.json,sha256=x_QV-3H0vCoijszWrjHajaTBtZzAdQ0y4V2uJgLf0S4,14270
|
|
86
|
+
chainlit/translations/mr.json,sha256=pUr540hPG3Vq-Nts7Pnj-oor_scw1Rx2gaIBnGOyPZU,12495
|
|
87
|
+
chainlit/translations/ta.json,sha256=kLXucUlMCD3jXlPhmOZ3FFZNdXfGDaqVxwqGqJqVF78,14152
|
|
88
|
+
chainlit/translations/te.json,sha256=spOs9mYNITEUy_mKp4_9qmXP2yACVrruiQKb1zlRIWU,13608
|
|
89
|
+
chainlit/translations/zh-CN.json,sha256=Y3MhXUDFi4YMxX8-agpCM68efYXCGcHqyqRAen8LLfk,7508
|
|
90
|
+
chainlit/translations.py,sha256=WG_r7HzxBYns-zk9tVvoGdoofv71okTZx8k1RlcoTIg,2034
|
|
91
|
+
chainlit/types.py,sha256=7pY4iePG2s5nPxU9LnmKbmNI3vT6l5gs6jy9VEH3P4A,5181
|
|
92
|
+
chainlit/user.py,sha256=mUhnGhYQ__qEx8YzigHhF2Z9xxuqQo5C2U8opKpiVRs,752
|
|
93
|
+
chainlit/user_session.py,sha256=T1nQVN_weELXTrkDIV54YgdrA3zIvJGe1tN-nypunt4,1531
|
|
94
|
+
chainlit/utils.py,sha256=hXb5z3jb2syJP0P_jTz3zjDEuIfl0IAmQbA3MooSCTs,3989
|
|
95
|
+
chainlit/version.py,sha256=VcRO6Iwchkv80BWb4hRGkOnBgDhj87-Yjorcv1u5Z3g,276
|
|
96
|
+
chainlit-2.0.dev1.dist-info/METADATA,sha256=s4MlZw9456xccBhQd3rs5ynj9K5NQuacctEfdD_52iM,7091
|
|
97
|
+
chainlit-2.0.dev1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
98
|
+
chainlit-2.0.dev1.dist-info/entry_points.txt,sha256=FrkqdjrFl8juSnvBndniyX7XuKojmUwO4ghRh-CFMQc,45
|
|
99
|
+
chainlit-2.0.dev1.dist-info/RECORD,,
|
chainlit/auth/cookie.py
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
from typing import Literal, Optional, cast
|
|
3
|
-
|
|
4
|
-
from fastapi import Request, Response
|
|
5
|
-
from fastapi.exceptions import HTTPException
|
|
6
|
-
from fastapi.security.base import SecurityBase
|
|
7
|
-
from fastapi.security.utils import get_authorization_scheme_param
|
|
8
|
-
from starlette.status import HTTP_401_UNAUTHORIZED
|
|
9
|
-
|
|
10
|
-
""" Module level cookie settings. """
|
|
11
|
-
_cookie_samesite = cast(
|
|
12
|
-
Literal["lax", "strict", "none"],
|
|
13
|
-
os.environ.get("CHAINLIT_COOKIE_SAMESITE", "lax"),
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
assert (
|
|
17
|
-
_cookie_samesite
|
|
18
|
-
in [
|
|
19
|
-
"lax",
|
|
20
|
-
"strict",
|
|
21
|
-
"none",
|
|
22
|
-
]
|
|
23
|
-
), "Invalid value for CHAINLIT_COOKIE_SAMESITE. Must be one of 'lax', 'strict' or 'none'."
|
|
24
|
-
_cookie_secure = _cookie_samesite == "none"
|
|
25
|
-
|
|
26
|
-
_auth_cookie_lifetime = 60 * 60 # 1 hour
|
|
27
|
-
_state_cookie_lifetime = 3 * 60 # 3m
|
|
28
|
-
_auth_cookie_name = "access_token"
|
|
29
|
-
_state_cookie_name = "oauth_state"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class OAuth2PasswordBearerWithCookie(SecurityBase):
|
|
33
|
-
"""
|
|
34
|
-
OAuth2 password flow with cookie support with fallback to bearer token.
|
|
35
|
-
"""
|
|
36
|
-
|
|
37
|
-
def __init__(
|
|
38
|
-
self,
|
|
39
|
-
tokenUrl: str,
|
|
40
|
-
scheme_name: Optional[str] = None,
|
|
41
|
-
auto_error: bool = True,
|
|
42
|
-
):
|
|
43
|
-
self.tokenUrl = tokenUrl
|
|
44
|
-
self.scheme_name = scheme_name or self.__class__.__name__
|
|
45
|
-
self.auto_error = auto_error
|
|
46
|
-
|
|
47
|
-
async def __call__(self, request: Request) -> Optional[str]:
|
|
48
|
-
# First try to get the token from the cookie
|
|
49
|
-
token = request.cookies.get(_auth_cookie_name)
|
|
50
|
-
|
|
51
|
-
# If no cookie, try the Authorization header as fallback
|
|
52
|
-
if not token:
|
|
53
|
-
# TODO: Only bother to check if cookie auth is explicitly disabled.
|
|
54
|
-
authorization = request.headers.get("Authorization")
|
|
55
|
-
if authorization:
|
|
56
|
-
scheme, token = get_authorization_scheme_param(authorization)
|
|
57
|
-
if scheme.lower() != "bearer":
|
|
58
|
-
if self.auto_error:
|
|
59
|
-
raise HTTPException(
|
|
60
|
-
status_code=HTTP_401_UNAUTHORIZED,
|
|
61
|
-
detail="Invalid authentication credentials",
|
|
62
|
-
headers={"WWW-Authenticate": "Bearer"},
|
|
63
|
-
)
|
|
64
|
-
else:
|
|
65
|
-
return None
|
|
66
|
-
else:
|
|
67
|
-
if self.auto_error:
|
|
68
|
-
raise HTTPException(
|
|
69
|
-
status_code=HTTP_401_UNAUTHORIZED,
|
|
70
|
-
detail="Not authenticated",
|
|
71
|
-
headers={"WWW-Authenticate": "Bearer"},
|
|
72
|
-
)
|
|
73
|
-
else:
|
|
74
|
-
return None
|
|
75
|
-
|
|
76
|
-
return token
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def set_auth_cookie(response: Response, token: str):
|
|
80
|
-
"""
|
|
81
|
-
Helper function to set the authentication cookie with secure parameters
|
|
82
|
-
"""
|
|
83
|
-
|
|
84
|
-
response.set_cookie(
|
|
85
|
-
key=_auth_cookie_name,
|
|
86
|
-
value=token,
|
|
87
|
-
httponly=True,
|
|
88
|
-
secure=_cookie_secure,
|
|
89
|
-
samesite=_cookie_samesite,
|
|
90
|
-
max_age=_auth_cookie_lifetime,
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def clear_auth_cookie(response: Response):
|
|
95
|
-
"""
|
|
96
|
-
Helper function to clear the authentication cookie
|
|
97
|
-
"""
|
|
98
|
-
response.delete_cookie(key=_auth_cookie_name, path="/")
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
def set_oauth_state_cookie(response: Response, token: str):
|
|
102
|
-
response.set_cookie(
|
|
103
|
-
_state_cookie_name,
|
|
104
|
-
token,
|
|
105
|
-
httponly=True,
|
|
106
|
-
samesite=_cookie_samesite,
|
|
107
|
-
secure=_cookie_secure,
|
|
108
|
-
max_age=_state_cookie_lifetime,
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
def validate_oauth_state_cookie(request: Request, state: str):
|
|
113
|
-
"""Check the state from the oauth provider against the browser cookie."""
|
|
114
|
-
|
|
115
|
-
oauth_state = request.cookies.get(_state_cookie_name)
|
|
116
|
-
|
|
117
|
-
if oauth_state != state:
|
|
118
|
-
raise Exception("oauth state does not correspond")
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
def clear_oauth_state_cookie(response: Response):
|
|
122
|
-
"""Oauth complete, delete state token."""
|
|
123
|
-
response.delete_cookie(_state_cookie_name) # Do we set path here?
|
chainlit/auth/jwt.py
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import datetime
|
|
2
|
-
import os
|
|
3
|
-
from typing import Any, Dict, Optional
|
|
4
|
-
|
|
5
|
-
import jwt as pyjwt
|
|
6
|
-
|
|
7
|
-
from chainlit.config import config
|
|
8
|
-
from chainlit.user import User
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def get_jwt_secret() -> Optional[str]:
|
|
12
|
-
return os.environ.get("CHAINLIT_AUTH_SECRET")
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def create_jwt(data: User) -> str:
|
|
16
|
-
to_encode: Dict[str, Any] = data.to_dict()
|
|
17
|
-
to_encode.update(
|
|
18
|
-
{
|
|
19
|
-
"exp": datetime.datetime.utcnow()
|
|
20
|
-
+ datetime.timedelta(seconds=config.project.user_session_timeout),
|
|
21
|
-
}
|
|
22
|
-
)
|
|
23
|
-
secret = get_jwt_secret()
|
|
24
|
-
assert secret
|
|
25
|
-
encoded_jwt = pyjwt.encode(to_encode, secret, algorithm="HS256")
|
|
26
|
-
return encoded_jwt
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def decode_jwt(token: str) -> User:
|
|
30
|
-
dict = pyjwt.decode(
|
|
31
|
-
token,
|
|
32
|
-
get_jwt_secret(),
|
|
33
|
-
algorithms=["HS256"],
|
|
34
|
-
options={"verify_signature": True},
|
|
35
|
-
)
|
|
36
|
-
del dict["exp"]
|
|
37
|
-
return User(**dict)
|