chainlit 0.6.3__py3-none-any.whl → 0.6.401__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.

Files changed (40) hide show
  1. chainlit/__init__.py +38 -1
  2. chainlit/cache.py +6 -9
  3. chainlit/cli/deploy.py +2 -2
  4. chainlit/client/base.py +2 -1
  5. chainlit/client/cloud.py +10 -8
  6. chainlit/client/local.py +4 -1
  7. chainlit/client/utils.py +4 -2
  8. chainlit/config.py +22 -1
  9. chainlit/context.py +1 -1
  10. chainlit/db/prisma/schema.prisma +2 -1
  11. chainlit/element.py +6 -1
  12. chainlit/emitter.py +6 -1
  13. chainlit/frontend/dist/assets/index-69562d52.js +543 -0
  14. chainlit/frontend/dist/assets/{index-34600e45.js → index-ace9588d.js} +1 -1
  15. chainlit/frontend/dist/index.html +1 -1
  16. chainlit/haystack/__init__.py +5 -10
  17. chainlit/input_widget.py +35 -0
  18. chainlit/langchain/__init__.py +5 -10
  19. chainlit/langchain/callbacks.py +98 -30
  20. chainlit/langflow/__init__.py +5 -10
  21. chainlit/llama_index/__init__.py +5 -10
  22. chainlit/llama_index/callbacks.py +16 -8
  23. chainlit/message.py +17 -4
  24. chainlit/playground/config.py +14 -14
  25. chainlit/playground/providers/__init__.py +1 -0
  26. chainlit/playground/providers/huggingface.py +3 -1
  27. chainlit/playground/providers/langchain.py +87 -0
  28. chainlit/playground/providers/openai.py +2 -2
  29. chainlit/prompt.py +8 -1
  30. chainlit/server.py +9 -8
  31. chainlit/socket.py +16 -1
  32. chainlit/sync.py +3 -1
  33. chainlit/types.py +12 -7
  34. chainlit/utils.py +23 -0
  35. {chainlit-0.6.3.dist-info → chainlit-0.6.401.dist-info}/METADATA +6 -5
  36. chainlit-0.6.401.dist-info/RECORD +61 -0
  37. chainlit/frontend/dist/assets/index-87533cb5.js +0 -533
  38. chainlit-0.6.3.dist-info/RECORD +0 -60
  39. {chainlit-0.6.3.dist-info → chainlit-0.6.401.dist-info}/WHEEL +0 -0
  40. {chainlit-0.6.3.dist-info → chainlit-0.6.401.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,87 @@
1
+ from typing import Union
2
+
3
+ from fastapi.responses import StreamingResponse
4
+
5
+ from chainlit.playground.provider import BaseProvider
6
+ from chainlit.prompt import PromptMessage
7
+ from chainlit.sync import make_async
8
+
9
+
10
+ class LangchainGenericProvider(BaseProvider):
11
+ from langchain.chat_models.base import BaseChatModel
12
+ from langchain.llms.base import LLM
13
+
14
+ llm: Union[LLM, BaseChatModel]
15
+
16
+ def __init__(
17
+ self,
18
+ id: str,
19
+ name: str,
20
+ llm: Union[LLM, BaseChatModel],
21
+ is_chat: bool = False,
22
+ ):
23
+ super().__init__(
24
+ id=id,
25
+ name=name,
26
+ env_vars={},
27
+ inputs=[],
28
+ is_chat=is_chat,
29
+ )
30
+ self.llm = llm
31
+
32
+ def prompt_message_to_langchain_message(self, message: PromptMessage):
33
+ from langchain.schema.messages import (
34
+ AIMessage,
35
+ FunctionMessage,
36
+ HumanMessage,
37
+ SystemMessage,
38
+ )
39
+
40
+ content = "" if message.formatted is None else message.formatted
41
+ if message.role == "user":
42
+ return HumanMessage(content=content)
43
+ elif message.role == "assistant":
44
+ return AIMessage(content=content)
45
+ elif message.role == "system":
46
+ return SystemMessage(content=content)
47
+ elif message.role == "function":
48
+ return FunctionMessage(
49
+ content=content, name=message.name if message.name else "function"
50
+ )
51
+ else:
52
+ raise ValueError(f"Got unknown type {message}")
53
+
54
+ def format_message(self, message, prompt):
55
+ message = super().format_message(message, prompt)
56
+ return self.prompt_message_to_langchain_message(message)
57
+
58
+ def message_to_string(self, message: PromptMessage) -> str:
59
+ return message.to_string()
60
+
61
+ async def create_completion(self, request):
62
+ from langchain.schema.messages import BaseMessageChunk
63
+
64
+ await super().create_completion(request)
65
+
66
+ messages = self.create_prompt(request)
67
+
68
+ stream = make_async(self.llm.stream)
69
+
70
+ result = await stream(
71
+ input=messages,
72
+ )
73
+
74
+ def create_event_stream():
75
+ try:
76
+ for chunk in result:
77
+ if isinstance(chunk, BaseMessageChunk):
78
+ yield chunk.content
79
+ else:
80
+ yield chunk
81
+ except Exception as e:
82
+ # The better solution would be to return a 500 error, but
83
+ # langchain raises the error in the stream, and the http
84
+ # headers have already been sent.
85
+ yield f"Failed to create completion: {str(e)}"
86
+
87
+ return StreamingResponse(create_event_stream())
@@ -196,7 +196,7 @@ ChatOpenAI = ChatOpenAIProvider(
196
196
  Select(
197
197
  id="model",
198
198
  label="Model",
199
- values=["gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt4"],
199
+ values=["gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-4", "gpt-4-32k"],
200
200
  initial_value="gpt-3.5-turbo",
201
201
  ),
202
202
  *openai_common_inputs,
@@ -213,7 +213,7 @@ AzureChatOpenAI = ChatOpenAIProvider(
213
213
  Select(
214
214
  id="model",
215
215
  label="Model",
216
- values=["gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt4"],
216
+ values=["gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-4", "gpt-4-32k"],
217
217
  initial_value="gpt-3.5-turbo",
218
218
  ),
219
219
  *openai_common_inputs,
chainlit/prompt.py CHANGED
@@ -13,10 +13,17 @@ class BaseTemplate(DataClassJsonMixin):
13
13
 
14
14
  @dataclass
15
15
  class PromptMessage(BaseTemplate):
16
+ # This is used for Langchain's MessagesPlaceholder
17
+ placeholder_size: Optional[int] = None
18
+ # This is used for OpenAI's function message
19
+ name: Optional[str] = None
16
20
  role: Optional[Literal["system", "assistant", "user", "function"]] = None
17
21
 
18
22
  def to_openai(self):
19
- return {"role": self.role, "content": self.formatted}
23
+ msg_dict = {"role": self.role, "content": self.formatted}
24
+ if self.role == "function":
25
+ msg_dict["name"] = self.name or ""
26
+ return msg_dict
20
27
 
21
28
  def to_string(self):
22
29
  return f"{self.role}: {self.formatted}"
chainlit/server.py CHANGED
@@ -11,12 +11,7 @@ from contextlib import asynccontextmanager
11
11
  from pathlib import Path
12
12
 
13
13
  from fastapi import FastAPI, HTTPException, Request
14
- from fastapi.responses import (
15
- FileResponse,
16
- HTMLResponse,
17
- JSONResponse,
18
- PlainTextResponse,
19
- )
14
+ from fastapi.responses import FileResponse, HTMLResponse, JSONResponse
20
15
  from fastapi.staticfiles import StaticFiles
21
16
  from fastapi_socketio import SocketManager
22
17
  from starlette.middleware.cors import CORSMiddleware
@@ -30,6 +25,7 @@ from chainlit.config import DEFAULT_HOST, config, load_module, reload_config
30
25
  from chainlit.logger import logger
31
26
  from chainlit.markdown import get_markdown_str
32
27
  from chainlit.playground.config import get_llm_providers
28
+ from chainlit.telemetry import trace_event
33
29
  from chainlit.types import (
34
30
  CompletionRequest,
35
31
  DeleteConversationRequest,
@@ -125,7 +121,10 @@ app = FastAPI(lifespan=lifespan)
125
121
  app.mount("/public", StaticFiles(directory="public", check_dir=False), name="public")
126
122
  app.mount(
127
123
  "/assets",
128
- StaticFiles(packages=[("chainlit", os.path.join(build_dir, "assets"))]),
124
+ StaticFiles(
125
+ packages=[("chainlit", os.path.join(build_dir, "assets"))],
126
+ follow_symlink=config.project.follow_symlink,
127
+ ),
129
128
  name="assets",
130
129
  )
131
130
 
@@ -198,6 +197,7 @@ async def completion(request: CompletionRequest):
198
197
  detail=f"LLM provider '{request.prompt.provider}' not found",
199
198
  )
200
199
 
200
+ trace_event("pp_create_completion")
201
201
  response = await provider.create_completion(request)
202
202
 
203
203
  return response
@@ -206,6 +206,7 @@ async def completion(request: CompletionRequest):
206
206
  @app.get("/project/llm-providers")
207
207
  async def get_providers():
208
208
  """List the providers."""
209
+ trace_event("pp_get_llm_providers")
209
210
  providers = get_llm_providers()
210
211
  providers = [p.to_dict() for p in providers]
211
212
  return JSONResponse(content={"providers": providers})
@@ -251,7 +252,7 @@ async def get_member_role(request: Request):
251
252
 
252
253
  auth_client = await get_auth_client_from_request(request)
253
254
  role = auth_client.user_infos["role"] if auth_client.user_infos else "ANONYMOUS"
254
- return PlainTextResponse(content=role)
255
+ return JSONResponse(content=role)
255
256
 
256
257
 
257
258
  @app.post("/project/conversations")
chainlit/socket.py CHANGED
@@ -15,6 +15,7 @@ from chainlit.message import ErrorMessage, Message
15
15
  from chainlit.server import socket
16
16
  from chainlit.session import Session
17
17
  from chainlit.telemetry import trace_event
18
+ from chainlit.types import FileSpec
18
19
  from chainlit.user_session import user_sessions
19
20
 
20
21
 
@@ -132,7 +133,12 @@ async def connection_successful(sid):
132
133
  "local",
133
134
  "custom",
134
135
  ]:
135
- await context.session.db_client.create_user(session.auth_client.user_infos)
136
+ await context.session.db_client.create_user(
137
+ context.session.auth_client.user_infos
138
+ )
139
+
140
+ if config.code.on_file_upload:
141
+ await context.emitter.enable_file_upload(config.code.on_file_upload_config)
136
142
 
137
143
  if config.code.on_chat_start:
138
144
  """Call the on_chat_start function provided by the developer."""
@@ -236,3 +242,12 @@ async def change_settings(sid, settings: Dict[str, Any]):
236
242
 
237
243
  if config.code.on_settings_update:
238
244
  await config.code.on_settings_update(settings)
245
+
246
+
247
+ @socket.on("file_upload")
248
+ async def file_upload(sid, files: Any):
249
+ """Handle file upload from the UI."""
250
+ init_context(sid)
251
+
252
+ if config.code.on_file_upload:
253
+ await config.code.on_file_upload(files)
chainlit/sync.py CHANGED
@@ -22,8 +22,10 @@ T = TypeVar("T")
22
22
 
23
23
 
24
24
  def run_sync(co: Coroutine[Any, Any, T_Retval]) -> T_Retval:
25
+ """Run the coroutine synchronously."""
26
+ # Execute from the main thread in the main event loop
25
27
  if threading.current_thread() == threading.main_thread():
26
28
  return sync(co)
27
- else:
29
+ else: # Execute from a thread in the main event loop
28
30
  result = asyncio.run_coroutine_threadsafe(co, loop=context.loop)
29
31
  return result.result()
chainlit/types.py CHANGED
@@ -6,7 +6,9 @@ from pydantic.dataclasses import dataclass
6
6
 
7
7
  from chainlit.prompt import Prompt
8
8
 
9
- InputWidgetType = Literal["switch", "slider", "select", "textinput", "tags"]
9
+ InputWidgetType = Literal[
10
+ "switch", "slider", "select", "textinput", "tags", "numberinput"
11
+ ]
10
12
  ElementType = Literal[
11
13
  "image", "avatar", "text", "pdf", "tasklist", "audio", "video", "file"
12
14
  ]
@@ -14,6 +16,13 @@ ElementDisplay = Literal["inline", "side", "page"]
14
16
  ElementSize = Literal["small", "medium", "large"]
15
17
 
16
18
 
19
+ @dataclass
20
+ class FileSpec(DataClassJsonMixin):
21
+ accept: Union[List[str], Dict[str, List[str]]]
22
+ max_files: int
23
+ max_size_mb: int
24
+
25
+
17
26
  @dataclass
18
27
  class AskSpec(DataClassJsonMixin):
19
28
  """Specification for asking the user."""
@@ -23,12 +32,8 @@ class AskSpec(DataClassJsonMixin):
23
32
 
24
33
 
25
34
  @dataclass
26
- class AskFileSpec(AskSpec, DataClassJsonMixin):
27
- """Specification for asking the user for a file."""
28
-
29
- accept: Union[List[str], Dict[str, List[str]]]
30
- max_files: int
31
- max_size_mb: int
35
+ class AskFileSpec(FileSpec, AskSpec, DataClassJsonMixin):
36
+ """Specification for asking the user a file."""
32
37
 
33
38
 
34
39
  class AskResponse(TypedDict):
chainlit/utils.py CHANGED
@@ -1,7 +1,10 @@
1
+ import functools
1
2
  import importlib
2
3
  import inspect
3
4
  from typing import Callable
4
5
 
6
+ from packaging import version
7
+
5
8
  from chainlit.context import context
6
9
  from chainlit.logger import logger
7
10
  from chainlit.message import ErrorMessage
@@ -18,6 +21,7 @@ def wrap_user_function(user_function: Callable, with_task=False) -> Callable:
18
21
  Callable: The wrapped function.
19
22
  """
20
23
 
24
+ @functools.wraps(user_function)
21
25
  async def wrapper(*args):
22
26
  # Get the parameter names of the user-defined function
23
27
  user_function_params = list(inspect.signature(user_function).parameters.keys())
@@ -63,3 +67,22 @@ def make_module_getattr(registry):
63
67
  return getattr(module, name)
64
68
 
65
69
  return __getattr__
70
+
71
+
72
+ def check_module_version(name, required_version):
73
+ """
74
+ Check the version of a module.
75
+
76
+ Args:
77
+ name (str): A module name.
78
+ version (str): Minimum version.
79
+
80
+ Returns:
81
+ (bool): Return True if the module is installed and the version
82
+ match the minimum required version.
83
+ """
84
+ try:
85
+ module = importlib.import_module(name)
86
+ except ModuleNotFoundError:
87
+ return False
88
+ return version.parse(module.__version__) >= version.parse(required_version)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: chainlit
3
- Version: 0.6.3
3
+ Version: 0.6.401
4
4
  Summary: A faster way to build chatbot UIs.
5
5
  Home-page: https://github.com/Chainlit/chainlit
6
6
  License: Apache-2.0 license
@@ -18,20 +18,21 @@ Requires-Dist: asyncer (>=0.0.2,<0.0.3)
18
18
  Requires-Dist: auth0-python (>=4.4.0,<5.0.0)
19
19
  Requires-Dist: click (>=8.1.3,<9.0.0)
20
20
  Requires-Dist: dataclasses_json (>=0.5.7,<0.6.0)
21
- Requires-Dist: fastapi (>=0.97.0,<0.98.0)
21
+ Requires-Dist: fastapi (>=0.99.0,<0.100.0)
22
22
  Requires-Dist: fastapi-socketio (>=0.0.10,<0.0.11)
23
23
  Requires-Dist: filetype (>=1.2.0,<2.0.0)
24
24
  Requires-Dist: lazify (>=0.4.0,<0.5.0)
25
25
  Requires-Dist: nest-asyncio (>=1.5.6,<2.0.0)
26
- Requires-Dist: prisma (>=0.9.0,<0.10.0)
26
+ Requires-Dist: packaging (>=23.1,<24.0)
27
+ Requires-Dist: prisma (>=0.10.0,<0.11.0)
27
28
  Requires-Dist: pydantic (>=1.10.8,<2.0.0)
28
29
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
29
30
  Requires-Dist: python-graphql-client (>=0.4.3,<0.5.0)
30
31
  Requires-Dist: syncer (>=2.0.3,<3.0.0)
31
32
  Requires-Dist: tomli (>=2.0.1,<3.0.0)
32
33
  Requires-Dist: uptrace (>=1.18.0,<2.0.0)
33
- Requires-Dist: uvicorn (>=0.22.0,<0.23.0)
34
- Requires-Dist: watchfiles (>=0.19.0,<0.20.0)
34
+ Requires-Dist: uvicorn (>=0.23.2,<0.24.0)
35
+ Requires-Dist: watchfiles (>=0.20.0,<0.21.0)
35
36
  Project-URL: Repository, https://github.com/Chainlit/chainlit
36
37
  Description-Content-Type: text/markdown
37
38
 
@@ -0,0 +1,61 @@
1
+ chainlit/__init__.py,sha256=GwCGkhW8kEqkgK1-7BrT5NwyWvkgKIYlcY1Hwggi8Fs,7446
2
+ chainlit/__main__.py,sha256=7Vg3w3T3qDuz4KDu5lQhLH6lQ3cYdume7gHH7Z1V97U,87
3
+ chainlit/action.py,sha256=xKphgUy0nMGY-5DJs8Ve4Jm9S6DmpIWB5Atr8iGe0Ro,1344
4
+ chainlit/cache.py,sha256=si9qTRY6Qa2TQmOhhWMYmkGTW0snWtyQ7hwYxMIXyOE,1345
5
+ chainlit/chat_settings.py,sha256=NoRdgTaJtetUBY3alNUWQCA9R9NT6Ewy3mY2Mn1s8Fo,878
6
+ chainlit/cli/__init__.py,sha256=znoIijqydQwI-oeqh-H3FIDwst2lByG9eN1G19Ls154,5152
7
+ chainlit/cli/auth.py,sha256=IwVnU5BaFKm8w2dWQ9NSUg0zYPs97wL78ne1oBxRefQ,4082
8
+ chainlit/cli/deploy.py,sha256=C82JQm6hiOEsxM_LIqmozeR1f1kTb-ZIn5FBaQQ65B4,2585
9
+ chainlit/cli/utils.py,sha256=mE2d9oOk-B2b9ZvDV1zENoDWxjfMriGP7bVwEFduZP4,717
10
+ chainlit/client/base.py,sha256=HIDEn47v0GtOairys90ULsIauaHzo0Nc1XEe9_Qz3ic,3804
11
+ chainlit/client/cloud.py,sha256=6Fh3qBOjKXO-RbIuW-B5crOZkHEC1iX0ZN9j2AcWojc,16715
12
+ chainlit/client/local.py,sha256=L2MX5JcX08Jb6L-n9D9WA9P6Swll9Yv-3n08eTjz19c,8969
13
+ chainlit/client/utils.py,sha256=evtI0tM0Bf5mvUr3i0mBFDNdFAbdIFQ_Yn5lnasUrbI,2920
14
+ chainlit/config.py,sha256=Sf4pD5L8_XpO0IIKuMX24JqmbvLSASFJ84JylY5e72c,10116
15
+ chainlit/context.py,sha256=fQzZ0AiPq2tUOwrVWmg43pHmZGrmu5cZn0FYN3iAjZU,1264
16
+ chainlit/db/__init__.py,sha256=AQw7cg_qyCa8x4tBcHcpKnBtplqIMSv0deT8MNM07YQ,1086
17
+ chainlit/db/prisma/schema.prisma,sha256=XjUeWdLZ0ktAEWMRiM2i9PYKr7tTownCcyww2ZqqtaQ,1724
18
+ chainlit/element.py,sha256=CdjUwY22QFpJ0WWVXesZa3G2HKrKpIkUZIBUXvWQyTI,9184
19
+ chainlit/emitter.py,sha256=OkLj0PCfM78T3gIEOpLSb7pNDdscQt4NUspBdqKNfSQ,5130
20
+ chainlit/frontend/dist/assets/index-69562d52.js,sha256=39U5A0F5wOTkpBLoEdjEARtmtmmAmvWobZ6YSWjTY30,1516711
21
+ chainlit/frontend/dist/assets/index-a6e13df6.css,sha256=puE99ts96eKxNBZADPvq8_IwuJtfDcnDug6dtLTP4As,5697
22
+ chainlit/frontend/dist/assets/index-ace9588d.js,sha256=A8w9oyBajXY9GSm0KKGqQU6iQam5VWTvCGge-GLpSZU,614554
23
+ chainlit/frontend/dist/assets/logo_dark-bc7401f6.svg,sha256=vHQB9g-n5OqOmuH3Fduuc7ZMg0EmMsGyO9cEnYwLbHg,8889
24
+ chainlit/frontend/dist/assets/logo_light-f19fc2ea.svg,sha256=8Z_C6t-0V9QL9ldmLjaLfp2REcGDuaTeNynj6-6muNI,8891
25
+ chainlit/frontend/dist/favicon.svg,sha256=0Cy8x28obT5eWW3nxZRhsEvu6_zMqrqbg0y6hT3D0Q0,6455
26
+ chainlit/frontend/dist/index.html,sha256=O-9FQnEi0c7cGFsUVt2jeB2Nz86rIwhcPc3vEKWX4e8,832
27
+ chainlit/haystack/__init__.py,sha256=uZ77YiPy-qleSTi3dQCDO9HE6S6F6GpJWmh7jO4cxXA,217
28
+ chainlit/haystack/callbacks.py,sha256=SRnY2WCvhMWuM5jfgaBdf5clYNGnwT7CVeKdeApP-G0,3910
29
+ chainlit/hello.py,sha256=bqKP00i0FKHnZ9fdyVW1a2xDAA1g7IWT0EVzUNky7rA,417
30
+ chainlit/input_widget.py,sha256=EV5Ldm9oTRuuYp82IrhD90hq1U_s7yp6a5XFMFsAU24,7335
31
+ chainlit/langchain/__init__.py,sha256=zErMw0_3ufSGeF9ye7X0ZX3wDat4mTOx97T40ePDO2g,217
32
+ chainlit/langchain/callbacks.py,sha256=nhlskk08J2LXcExw2uJ4g5mEt2gmzj78AjLBpFHZDyM,21546
33
+ chainlit/langflow/__init__.py,sha256=Oihgbq3lmcLbxyCiD8Bf8-PvANPYoopjiB3mUG4dBEE,882
34
+ chainlit/llama_index/__init__.py,sha256=c7wIUZmKTtZPU9zpdGpKTHctQaBWTuRGqTN0kkIkBcg,218
35
+ chainlit/llama_index/callbacks.py,sha256=yWC7qzI9UK2MEFGAfVpiNZkfLwxMtyvmmjTEytw0ReI,4795
36
+ chainlit/logger.py,sha256=wTwRSZsLfXwWy6U4351IgWAm4KCMThgxm9EZpjGUEr4,373
37
+ chainlit/markdown.py,sha256=L2IPPWxIlrhJZcKPfO1akomHdN3sgC2EvC2ilxR8MQs,1624
38
+ chainlit/message.py,sha256=SxCQQ2naSKsTpbkPC2coJXCU48s6mrDLXJbrsr256r4,14181
39
+ chainlit/playground/__init__.py,sha256=igNRcBgqLKPTjOQtTNhhGNJFmZn-Dl1fHRQzQSjDGTQ,80
40
+ chainlit/playground/config.py,sha256=WMDKS9F2YYwGS1DyXhyktKbbRb5B4mZUZ0IbAsdbDOk,894
41
+ chainlit/playground/provider.py,sha256=Nh00Bm3XFK3GN2v1rcg5w204PzU7iRQ8RM9co-_qBcI,4424
42
+ chainlit/playground/providers/__init__.py,sha256=1gOwojHFZijRaK2rpA8_qsNV55EdQLc8J_cFYZyrDJM,184
43
+ chainlit/playground/providers/anthropic.py,sha256=pISSLD1D3ChmbLQ6A_QyGPQDuAeJ540JfL8iZacKbZo,3319
44
+ chainlit/playground/providers/huggingface.py,sha256=wImaCfxSgaqNp5t2LcJfjzL56_-6yjMLOLYn1raNN-8,2123
45
+ chainlit/playground/providers/langchain.py,sha256=wpVs_IHcZPNwP-RNUshU6SoECxeOnwNaRRCkhlMw1Ig,2741
46
+ chainlit/playground/providers/openai.py,sha256=OnPNO96MZ-YXdIQt7sth5zvfXl024DJpbvY6jGXaW2M,6715
47
+ chainlit/prompt.py,sha256=gBcdlCY6HK3DvO-PDAUgbf1OgMyA9FjD7htdQnNGRB0,1178
48
+ chainlit/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
+ chainlit/server.py,sha256=s_DDvFP74DEC_im1oxmRXw2EEuRN5wG-0kRrEHKwj3k,10735
50
+ chainlit/session.py,sha256=22nn7Qa8NFUPiPEnAP4Xe92x6LU2Ee7J2YRs9s68RgM,3265
51
+ chainlit/socket.py,sha256=j1Kk6FR0sYRS-whrMYh8sQ2QHGGcNNz7I6Skh38qIxs,7718
52
+ chainlit/sync.py,sha256=Rhb7wu8zXiCeA0bmLFpZarEFzREg28uYXg9U9X87Jho,818
53
+ chainlit/telemetry.py,sha256=cQ97cu1eSbrJXA_6buOVSGLr9Ioi13PUpo9V1zBq4JQ,3203
54
+ chainlit/types.py,sha256=swd72Q1V6gk2TWH5Pf1_iYLhbrD9fQWF0nkIw6Kay1E,1665
55
+ chainlit/user_session.py,sha256=9vXAPu0wyZWeSSG2Td6ULWIjKfsPAAufKjbk-0FrwVM,1727
56
+ chainlit/utils.py,sha256=RksBfwm6D8yol45WTjcjk792i3wyIS3R7D_L4JaS8lw,2572
57
+ chainlit/version.py,sha256=iosXhlXclBwBqlADFKEilxAC2wWKbtuBKi87AmPi7s8,196
58
+ chainlit-0.6.401.dist-info/METADATA,sha256=QtfKVHILKdsDJ7f4YE4KYpEm37Pjbq_IxrB4h9VgvEs,4380
59
+ chainlit-0.6.401.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
60
+ chainlit-0.6.401.dist-info/entry_points.txt,sha256=FrkqdjrFl8juSnvBndniyX7XuKojmUwO4ghRh-CFMQc,45
61
+ chainlit-0.6.401.dist-info/RECORD,,