chainlit 1.1.0rc1__py3-none-any.whl → 1.1.200__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/socket.py CHANGED
@@ -177,8 +177,8 @@ async def connection_successful(sid):
177
177
  "first_interaction",
178
178
  {"interaction": "resume", "thread_id": thread.get("id")},
179
179
  )
180
- await context.emitter.resume_thread(thread)
181
180
  await config.code.on_chat_resume(thread)
181
+ await context.emitter.resume_thread(thread)
182
182
  return
183
183
 
184
184
  if config.code.on_chat_start:
@@ -188,36 +188,42 @@ async def connection_successful(sid):
188
188
 
189
189
  @socket.on("clear_session")
190
190
  async def clean_session(sid):
191
- await disconnect(sid, force_clear=True)
191
+ session = WebsocketSession.get(sid)
192
+ if session:
193
+ session.to_clear = True
192
194
 
193
195
 
194
196
  @socket.on("disconnect")
195
- async def disconnect(sid, force_clear=False):
197
+ async def disconnect(sid):
196
198
  session = WebsocketSession.get(sid)
197
- if session:
198
- init_ws_context(session)
199
199
 
200
- if config.code.on_chat_end and session:
200
+ if not session:
201
+ return
202
+
203
+ init_ws_context(session)
204
+
205
+ if config.code.on_chat_end:
201
206
  await config.code.on_chat_end()
202
207
 
203
- if session and session.thread_id and session.has_first_interaction:
208
+ if session.thread_id and session.has_first_interaction:
204
209
  await persist_user_session(session.thread_id, session.to_persistable())
205
210
 
206
- def clear():
207
- if session := WebsocketSession.get(sid):
211
+ def clear(_sid):
212
+ if session := WebsocketSession.get(_sid):
208
213
  # Clean up the user session
209
214
  if session.id in user_sessions:
210
215
  user_sessions.pop(session.id)
211
216
  # Clean up the session
212
217
  session.delete()
213
218
 
214
- async def clear_on_timeout(sid):
215
- await asyncio.sleep(config.project.session_timeout)
216
- clear()
217
-
218
- if force_clear:
219
- clear()
219
+ if session.to_clear:
220
+ clear(sid)
220
221
  else:
222
+
223
+ async def clear_on_timeout(_sid):
224
+ await asyncio.sleep(config.project.session_timeout)
225
+ clear(_sid)
226
+
221
227
  asyncio.ensure_future(clear_on_timeout(sid))
222
228
 
223
229
 
chainlit/step.py CHANGED
@@ -193,10 +193,34 @@ class Step:
193
193
  self.persisted = False
194
194
  self.fail_on_persist_error = False
195
195
 
196
+ def _clean_content(self, content):
197
+ """
198
+ Recursively checks and converts bytes objects in content.
199
+ """
200
+
201
+ def handle_bytes(item):
202
+ if isinstance(item, bytes):
203
+ return "STRIPPED_BINARY_DATA"
204
+ elif isinstance(item, dict):
205
+ return {k: handle_bytes(v) for k, v in item.items()}
206
+ elif isinstance(item, list):
207
+ return [handle_bytes(i) for i in item]
208
+ elif isinstance(item, tuple):
209
+ return tuple(handle_bytes(i) for i in item)
210
+ return item
211
+
212
+ return handle_bytes(content)
213
+
196
214
  def _process_content(self, content, set_language=False):
197
215
  if content is None:
198
216
  return ""
199
- if isinstance(content, dict):
217
+ content = self._clean_content(content)
218
+
219
+ if (
220
+ isinstance(content, dict)
221
+ or isinstance(content, list)
222
+ or isinstance(content, tuple)
223
+ ):
200
224
  try:
201
225
  processed_content = json.dumps(content, indent=4, ensure_ascii=False)
202
226
  if set_language:
@@ -275,7 +299,7 @@ class Step:
275
299
  tasks = [el.send(for_id=self.id) for el in self.elements]
276
300
  await asyncio.gather(*tasks)
277
301
 
278
- if config.ui.hide_cot and self.parent_id:
302
+ if config.ui.hide_cot and (self.parent_id or not self.root):
279
303
  return
280
304
 
281
305
  if not config.features.prompt_playground and "generation" in step_dict:
@@ -308,7 +332,7 @@ class Step:
308
332
 
309
333
  async def send(self):
310
334
  if self.persisted:
311
- return
335
+ return self
312
336
 
313
337
  if config.code.author_rename:
314
338
  self.name = await config.code.author_rename(self.name)
@@ -332,27 +356,21 @@ class Step:
332
356
  tasks = [el.send(for_id=self.id) for el in self.elements]
333
357
  await asyncio.gather(*tasks)
334
358
 
335
- if config.ui.hide_cot and self.parent_id:
336
- return self.id
359
+ if config.ui.hide_cot and (self.parent_id or not self.root):
360
+ return self
337
361
 
338
362
  if not config.features.prompt_playground and "generation" in step_dict:
339
363
  step_dict.pop("generation", None)
340
364
 
341
365
  await context.emitter.send_step(step_dict)
342
366
 
343
- return self.id
367
+ return self
344
368
 
345
369
  async def stream_token(self, token: str, is_sequence=False):
346
370
  """
347
371
  Sends a token to the UI.
348
372
  Once all tokens have been streamed, call .send() to end the stream and persist the step if persistence is enabled.
349
373
  """
350
-
351
- if not self.streaming:
352
- self.streaming = True
353
- step_dict = self.to_dict()
354
- await context.emitter.stream_start(step_dict)
355
-
356
374
  if is_sequence:
357
375
  self.output = token
358
376
  else:
@@ -360,9 +378,14 @@ class Step:
360
378
 
361
379
  assert self.id
362
380
 
363
- if config.ui.hide_cot and self.parent_id:
381
+ if config.ui.hide_cot and (self.parent_id or not self.root):
364
382
  return
365
383
 
384
+ if not self.streaming:
385
+ self.streaming = True
386
+ step_dict = self.to_dict()
387
+ await context.emitter.stream_start(step_dict)
388
+
366
389
  await context.emitter.send_token(
367
390
  id=self.id, token=token, is_sequence=is_sequence
368
391
  )
chainlit/types.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from enum import Enum
2
+ from pathlib import Path
2
3
  from typing import (
3
4
  TYPE_CHECKING,
4
5
  Any,
@@ -144,7 +145,7 @@ class FileReference(TypedDict):
144
145
  class FileDict(TypedDict):
145
146
  id: str
146
147
  name: str
147
- path: str
148
+ path: Path
148
149
  size: int
149
150
  type: str
150
151
 
@@ -248,6 +249,7 @@ class FeedbackDict(TypedDict):
248
249
  @dataclass
249
250
  class Feedback:
250
251
  forId: str
252
+ threadId: Optional[str]
251
253
  value: Literal[0, 1]
252
254
  id: Optional[str] = None
253
255
  comment: Optional[str] = None
chainlit/user_session.py CHANGED
@@ -1,6 +1,6 @@
1
1
  from typing import Dict
2
2
 
3
- from chainlit.context import context
3
+ from chainlit.context import WebsocketSession, context
4
4
 
5
5
  user_sessions: Dict[str, Dict] = {}
6
6
 
@@ -27,8 +27,11 @@ class UserSession:
27
27
  user_session["chat_settings"] = context.session.chat_settings
28
28
  user_session["user"] = context.session.user
29
29
  user_session["chat_profile"] = context.session.chat_profile
30
- user_session["languages"] = context.session.languages
31
30
  user_session["http_referer"] = context.session.http_referer
31
+ user_session["client_type"] = context.session.client_type
32
+
33
+ if isinstance(context.session, WebsocketSession):
34
+ user_session["languages"] = context.session.languages
32
35
 
33
36
  if context.session.root_message:
34
37
  user_session["root_message"] = context.session.root_message
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: chainlit
3
- Version: 1.1.0rc1
3
+ Version: 1.1.200
4
4
  Summary: Build Conversational AI.
5
5
  Home-page: https://github.com/Chainlit/chainlit
6
6
  License: Apache-2.0 license
@@ -22,13 +22,12 @@ Requires-Dist: fastapi-socketio (>=0.0.10,<0.0.11)
22
22
  Requires-Dist: filetype (>=1.2.0,<2.0.0)
23
23
  Requires-Dist: httpx (>=0.23.0)
24
24
  Requires-Dist: lazify (>=0.4.0,<0.5.0)
25
- Requires-Dist: literalai (==0.0.600)
25
+ Requires-Dist: literalai (==0.0.601)
26
26
  Requires-Dist: nest-asyncio (>=1.5.6,<2.0.0)
27
27
  Requires-Dist: packaging (>=23.1,<24.0)
28
28
  Requires-Dist: pydantic (>=1,<3)
29
29
  Requires-Dist: pyjwt (>=2.8.0,<3.0.0)
30
30
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
31
- Requires-Dist: python-graphql-client (>=0.4.3,<0.5.0)
32
31
  Requires-Dist: python-multipart (>=0.0.9,<0.0.10)
33
32
  Requires-Dist: starlette (>=0.37.2,<0.38.0)
34
33
  Requires-Dist: syncer (>=2.0.3,<3.0.0)
@@ -51,6 +50,7 @@ Chainlit is an open-source async Python framework which allows developers to bui
51
50
 
52
51
  - ✅ ChatGPT-like application
53
52
  - ✅ Embedded Chatbot & Software Copilot
53
+ - ✅ Slack & Discord
54
54
  - ✅ Custom frontend (build your own agentic experience)
55
55
  - ✅ API Endpoint
56
56
 
@@ -113,6 +113,7 @@ $ chainlit run demo.py -w
113
113
  ```
114
114
 
115
115
  <img src="/images/quick-start.png" alt="Quick Start"></img>
116
+
116
117
  ## 🎉 Key Features and Integrations
117
118
 
118
119
  Full documentation is available [here](https://docs.chainlit.io). Key features:
@@ -6,24 +6,26 @@ chainlit/cache.py,sha256=Bv3dT4eHhE6Fq3c6Do0ZTpiyoXgXYewdxTgpYghEd9g,1361
6
6
  chainlit/chat_settings.py,sha256=2ByenmwS8O6jQjDVJjhhbLrBPGA5aY2F7R3VvQQxXPk,877
7
7
  chainlit/cli/__init__.py,sha256=JEB3Z3VWpzPgcfdSOQ6Z-L7dHdl7A1y47KUZP8H08GQ,4951
8
8
  chainlit/cli/utils.py,sha256=mE2d9oOk-B2b9ZvDV1zENoDWxjfMriGP7bVwEFduZP4,717
9
- chainlit/config.py,sha256=RNrxWmqmbPol_mRI2M5p0sMcR5PqyqY7WcLwo4g6OHI,16047
10
- chainlit/context.py,sha256=CecWdRuRCTr4jfXlOiU3Mh41j3B-p40c1jC7mhToVzk,2476
9
+ chainlit/config.py,sha256=nm4e-v_rDDGwVSGwyqk2NjQOQ07yWUF7E7J24BgcifA,16429
10
+ chainlit/context.py,sha256=kBnJiKKNhft1nrXFLQnAW6M-_mzMpYqDEFAG5-lrHyo,2813
11
11
  chainlit/copilot/dist/assets/logo_dark-2a3cf740.svg,sha256=Kjz3QMh-oh-ag4YatjU0YCPqGF7F8nHh8VUQoJIs01E,8887
12
12
  chainlit/copilot/dist/assets/logo_light-b078e7bc.svg,sha256=sHjnvEq1rfqh3bcexJNYUY7WEDdTQZq3aKZYpi4w4ck,8889
13
- chainlit/copilot/dist/index.js,sha256=PxrZhSq4MB4UFHZQjdp-ZM3M6yUFF2mudoG-IORjGXk,6986912
13
+ chainlit/copilot/dist/index.js,sha256=K2gY3O4VMlj3AL0_I_DMAdbIbBsDLdAFTFnvYfnWyFk,6958139
14
14
  chainlit/data/__init__.py,sha256=CUkwYx9GYqIbgrLh7gmQm4qvO1mu4D0Es-z31dc00DU,16486
15
- chainlit/data/acl.py,sha256=hx7Othkx12EitonyZD4iFIRVHwxBmBY2TKdwjPuZMSo,461
16
- chainlit/data/sql_alchemy.py,sha256=4UasGe7-mVDUa2Pa6B5YydS9In7HU_ZmAH_f1l5sOWw,26109
15
+ chainlit/data/acl.py,sha256=5EwZuKVcZediw77L661MohGce3JzGIaYmw6NutmMTw0,578
16
+ chainlit/data/sql_alchemy.py,sha256=XGiqUWnT64qv9tg08C7evCRoZolv8XtqtqJno3wg9H0,26524
17
17
  chainlit/data/storage_clients.py,sha256=D9KY1XKDjZh2uuh01ECxeoEtjw-JlrCR-WCuOuePVQI,3007
18
- chainlit/element.py,sha256=ZOE5ly2G07JxGeXaZDs8yrd76jaWXDelqRL00QM5KRg,10283
19
- chainlit/emitter.py,sha256=JK9aQ6qbaY1G0eqwshMcLFS6T198LwZ7soXXQOFNvT4,12688
20
- chainlit/frontend/dist/assets/index-032fca02.js,sha256=PL95Q0CxHX2HuXGsTvwsOIyzHf_yhj7zR5qrCdE0xlc,3038679
18
+ chainlit/discord/__init__.py,sha256=kZ_AAMaCToqO-1FdeQ8_IHS2pqNT0QJ-yyd8bCMaHHs,198
19
+ chainlit/discord/app.py,sha256=LGYjjqhwdNnWwBokRbXScEJI-IiJNrfHd1zVtDSv2ls,10385
20
+ chainlit/element.py,sha256=MIp-iyvsnK2iJ6Z_1Q-9JGZz_j_rrIxMM_L1LPA_5hw,10414
21
+ chainlit/emitter.py,sha256=54MPYoYHkOCKJvT30Vvg9mWYzWunGN9I3cFaqIoQ8oU,13037
21
22
  chainlit/frontend/dist/assets/index-d088547c.css,sha256=0IhUfCm_IY1kjvlTR2edW1qKXAFDya3LZ6mnZnP6ovk,6605
23
+ chainlit/frontend/dist/assets/index-d9bad4f1.js,sha256=kF9RcVHsbUt4-Exyx7mn88DFXbnIy2e_bmgFaL6iTLg,3034460
22
24
  chainlit/frontend/dist/assets/logo_dark-2a3cf740.svg,sha256=Kjz3QMh-oh-ag4YatjU0YCPqGF7F8nHh8VUQoJIs01E,8887
23
25
  chainlit/frontend/dist/assets/logo_light-b078e7bc.svg,sha256=sHjnvEq1rfqh3bcexJNYUY7WEDdTQZq3aKZYpi4w4ck,8889
24
- chainlit/frontend/dist/assets/react-plotly-8c993614.js,sha256=GpCai451WJ_7qhNmWWU2fQSrawurIwb-A9XtEB6Gia4,3763471
26
+ chainlit/frontend/dist/assets/react-plotly-48cc0858.js,sha256=VhxAgWoqSZ1246pSJLJxLRo6BRogXJREodhlWGYqaQs,3739251
25
27
  chainlit/frontend/dist/favicon.svg,sha256=0Cy8x28obT5eWW3nxZRhsEvu6_zMqrqbg0y6hT3D0Q0,6455
26
- chainlit/frontend/dist/index.html,sha256=SaYXa2Hau1GOjUIO_13mCPG2A24ijtD1xv_U-5yze14,1005
28
+ chainlit/frontend/dist/index.html,sha256=oG0RI6e36X5pAoDPoXQFiAHdY9VkyDl7KtVUs1ZH2tc,1005
27
29
  chainlit/haystack/__init__.py,sha256=uZ77YiPy-qleSTi3dQCDO9HE6S6F6GpJWmh7jO4cxXA,217
28
30
  chainlit/haystack/callbacks.py,sha256=tItLc6OmskPeDEJH2Qjtg7KgAgIy1TuYQYHTZm9cr3U,5209
29
31
  chainlit/hello.py,sha256=LwENQWo5s5r8nNDn4iKSV77vX60Ky5r_qGjQhyi7qlY,416
@@ -35,7 +37,7 @@ chainlit/llama_index/__init__.py,sha256=weRoIWCaRBGvA1LczCEfsqhWsltQSVlhtRnTovtd
35
37
  chainlit/llama_index/callbacks.py,sha256=nvmLTdKPV-WFjTTXnkIb-sPa7ZvQ49DrKH7UUQ_AGdg,7277
36
38
  chainlit/logger.py,sha256=wTwRSZsLfXwWy6U4351IgWAm4KCMThgxm9EZpjGUEr4,373
37
39
  chainlit/markdown.py,sha256=VUpqW7MqgjiPIQYHU4funwqC4GmHZBu_TGZTjTI4B0k,2025
38
- chainlit/message.py,sha256=NQiNzzJgE5D5ciOSzdWYNH5e7fBFbrjxLWeGpczXQGs,17961
40
+ chainlit/message.py,sha256=aeeijWL4-iNW6TOzNIv0QQHM2wO5LXk8QFsa4Q8P8ss,17979
39
41
  chainlit/oauth_providers.py,sha256=WiKUFpNp0RRN5Vq6LHCR9V-9td_1YEn2yD8iGu8atvY,17459
40
42
  chainlit/openai/__init__.py,sha256=DJP_ptclLUM5Zylr4RO1Vk0lCufo3yDqXyH5J9izYS8,1814
41
43
  chainlit/playground/__init__.py,sha256=igNRcBgqLKPTjOQtTNhhGNJFmZn-Dl1fHRQzQSjDGTQ,80
@@ -49,20 +51,22 @@ chainlit/playground/providers/openai.py,sha256=9aDSgXVW3sW-gaybBBWMIE8cJPyk9ZuGv
49
51
  chainlit/playground/providers/vertexai.py,sha256=zKy501f-MHnLrvuRzN50FqgB3xoHzfQFTVbw83Nsj20,5084
50
52
  chainlit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
53
  chainlit/secret.py,sha256=cQvIFGTQ7r2heC8EOGdgifSZZYqslh-qQxhUhKhD8vU,295
52
- chainlit/server.py,sha256=P2Djxg8T_3shITgoKAf7BTL-Qwx-P58UoiKfyamkgSM,23851
53
- chainlit/session.py,sha256=uxvtDpzJr0JKKOSjarRT0_7PscNv8rCgs9QVf6C0_uU,9241
54
- chainlit/socket.py,sha256=0_3EoAVERQQlsFCcBd9Vfx4l6NQz7RT2H_HvaZ8duIM,11654
55
- chainlit/step.py,sha256=JdXVqG73d9kNtHJjLhmfo1mqkCYtgqfF3jm08uGaCMs,13102
54
+ chainlit/server.py,sha256=b1xeAknQrPICkPaLvpvQO5VRK4yhgq2HoCqCs6N788o,24757
55
+ chainlit/session.py,sha256=SOX2zFct3apiSNcIzCDWgDRsUFgUG_6hewqWU8gfIZE,9694
56
+ chainlit/slack/__init__.py,sha256=Q41ztJHeVmpoXVgVqAcwGOufQp_bjf7dDT7eEXDdhPI,207
57
+ chainlit/slack/app.py,sha256=biQIOOM_--XeB_rvPMXdiYy6fKvcADcp6MZUP1Lfhfk,11649
58
+ chainlit/socket.py,sha256=KHabfdproCBlzF4VzLgtvqDA1xMB6_Xai6Ih6MZXogg,11703
59
+ chainlit/step.py,sha256=0uDQE0zTrhtvCQ3kdPuE2Uj6TYtIaWfzAGsyHmKEQl4,13931
56
60
  chainlit/sync.py,sha256=G1n-7-3WgXsN8y1bJkEyws_YwmHZIyDZoZUwhprigag,1235
57
61
  chainlit/telemetry.py,sha256=Rk4dnZv0OnGOgV4kD-VHdhgl4i7i3ypqhSE_R-LZceM,3060
58
62
  chainlit/translations/en-US.json,sha256=uUuS4hlNoYSlDp0DZGTAlPZxwLfsP4Jiu4ckrfr-fI0,7835
59
63
  chainlit/translations.py,sha256=WG_r7HzxBYns-zk9tVvoGdoofv71okTZx8k1RlcoTIg,2034
60
- chainlit/types.py,sha256=bkY7A0msU1xgOc6h6gAb_dA1SX5TVOLYUN9S39EXSQY,5332
64
+ chainlit/types.py,sha256=drgPqbBMLlfHuMEkvRJSafahlS4DeBf4BnLKBWPh-vA,5386
61
65
  chainlit/user.py,sha256=Cw4uGz0ffivWFszv8W__EHwkvTHQ3Lj9hqpRCPxFujo,619
62
- chainlit/user_session.py,sha256=C440ClH8kiIj6SqZ9BB5Q5Ni4eb7Jstsn81_1rAY-f8,1498
66
+ chainlit/user_session.py,sha256=G1amgs1_h2tVn4mtAXZmunm9nlBHQ_rCYvJQh3nsVwQ,1645
63
67
  chainlit/utils.py,sha256=ObNTLIhRDWcx1tHhpULUkpgWSJBlsi2USat2TLaaiTM,2604
64
68
  chainlit/version.py,sha256=iosXhlXclBwBqlADFKEilxAC2wWKbtuBKi87AmPi7s8,196
65
- chainlit-1.1.0rc1.dist-info/METADATA,sha256=XB0S59FWRYHsRBmkKnXdcWROFwNJHjD0Kn6fZcE1wxs,5561
66
- chainlit-1.1.0rc1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
67
- chainlit-1.1.0rc1.dist-info/entry_points.txt,sha256=FrkqdjrFl8juSnvBndniyX7XuKojmUwO4ghRh-CFMQc,45
68
- chainlit-1.1.0rc1.dist-info/RECORD,,
69
+ chainlit-1.1.200.dist-info/METADATA,sha256=KsNQbObDUDpFyTt-EQGc1omAi8xjjPEPMHYs2XcJcLM,5529
70
+ chainlit-1.1.200.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
71
+ chainlit-1.1.200.dist-info/entry_points.txt,sha256=FrkqdjrFl8juSnvBndniyX7XuKojmUwO4ghRh-CFMQc,45
72
+ chainlit-1.1.200.dist-info/RECORD,,