langroid 0.32.1__py3-none-any.whl → 0.32.2__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.
Files changed (40) hide show
  1. langroid/language_models/openai_gpt.py +16 -1
  2. {langroid-0.32.1.dist-info → langroid-0.32.2.dist-info}/METADATA +2 -2
  3. {langroid-0.32.1.dist-info → langroid-0.32.2.dist-info}/RECORD +6 -40
  4. pyproject.toml +1 -1
  5. langroid/agent/.chainlit/config.toml +0 -121
  6. langroid/agent/.chainlit/translations/bn.json +0 -231
  7. langroid/agent/.chainlit/translations/en-US.json +0 -229
  8. langroid/agent/.chainlit/translations/gu.json +0 -231
  9. langroid/agent/.chainlit/translations/he-IL.json +0 -231
  10. langroid/agent/.chainlit/translations/hi.json +0 -231
  11. langroid/agent/.chainlit/translations/kn.json +0 -231
  12. langroid/agent/.chainlit/translations/ml.json +0 -231
  13. langroid/agent/.chainlit/translations/mr.json +0 -231
  14. langroid/agent/.chainlit/translations/ta.json +0 -231
  15. langroid/agent/.chainlit/translations/te.json +0 -231
  16. langroid/agent/.chainlit/translations/zh-CN.json +0 -229
  17. langroid/agent/helpers.py +0 -0
  18. langroid/agent/junk +0 -13
  19. langroid/agent/structured_message.py +0 -9
  20. langroid/agent/typed_task.py +0 -19
  21. langroid/agent_config.py +0 -0
  22. langroid/embedding_models/clustering.py +0 -189
  23. langroid/experimental/team-save.py +0 -391
  24. langroid/language_models/.chainlit/config.toml +0 -121
  25. langroid/language_models/.chainlit/translations/en-US.json +0 -231
  26. langroid/parsing/code-parsing.md +0 -86
  27. langroid/parsing/config.py +0 -0
  28. langroid/parsing/image_text.py +0 -32
  29. langroid/parsing/url_loader_cookies.py +0 -73
  30. langroid/prompts/chat-gpt4-system-prompt.md +0 -68
  31. langroid/utils/.chainlit/config.toml +0 -121
  32. langroid/utils/.chainlit/translations/en-US.json +0 -231
  33. langroid/utils/docker.py +0 -37
  34. langroid/utils/llms/__init__.py +0 -0
  35. langroid/utils/llms/strings.py +0 -8
  36. langroid/utils/web/__init__.py +0 -0
  37. langroid/utils/web/login.py +0 -83
  38. langroid/vector_store/qdrant_cloud.py +0 -6
  39. {langroid-0.32.1.dist-info → langroid-0.32.2.dist-info}/LICENSE +0 -0
  40. {langroid-0.32.1.dist-info → langroid-0.32.2.dist-info}/WHEEL +0 -0
@@ -1,231 +0,0 @@
1
- {
2
- "components": {
3
- "atoms": {
4
- "buttons": {
5
- "userButton": {
6
- "menu": {
7
- "settings": "Settings",
8
- "settingsKey": "S",
9
- "APIKeys": "API Keys",
10
- "logout": "Logout"
11
- }
12
- }
13
- }
14
- },
15
- "molecules": {
16
- "newChatButton": {
17
- "newChat": "New Chat"
18
- },
19
- "tasklist": {
20
- "TaskList": {
21
- "title": "\ud83d\uddd2\ufe0f Task List",
22
- "loading": "Loading...",
23
- "error": "An error occured"
24
- }
25
- },
26
- "attachments": {
27
- "cancelUpload": "Cancel upload",
28
- "removeAttachment": "Remove attachment"
29
- },
30
- "newChatDialog": {
31
- "createNewChat": "Create new chat?",
32
- "clearChat": "This will clear the current messages and start a new chat.",
33
- "cancel": "Cancel",
34
- "confirm": "Confirm"
35
- },
36
- "settingsModal": {
37
- "settings": "Settings",
38
- "expandMessages": "Expand Messages",
39
- "hideChainOfThought": "Hide Chain of Thought",
40
- "darkMode": "Dark Mode"
41
- },
42
- "detailsButton": {
43
- "using": "Using",
44
- "running": "Running",
45
- "took_one": "Took {{count}} step",
46
- "took_other": "Took {{count}} steps"
47
- },
48
- "auth": {
49
- "authLogin": {
50
- "title": "Login to access the app.",
51
- "form": {
52
- "email": "Email address",
53
- "password": "Password",
54
- "noAccount": "Don't have an account?",
55
- "alreadyHaveAccount": "Already have an account?",
56
- "signup": "Sign Up",
57
- "signin": "Sign In",
58
- "or": "OR",
59
- "continue": "Continue",
60
- "forgotPassword": "Forgot password?",
61
- "passwordMustContain": "Your password must contain:",
62
- "emailRequired": "email is a required field",
63
- "passwordRequired": "password is a required field"
64
- },
65
- "error": {
66
- "default": "Unable to sign in.",
67
- "signin": "Try signing in with a different account.",
68
- "oauthsignin": "Try signing in with a different account.",
69
- "redirect_uri_mismatch": "The redirect URI is not matching the oauth app configuration.",
70
- "oauthcallbackerror": "Try signing in with a different account.",
71
- "oauthcreateaccount": "Try signing in with a different account.",
72
- "emailcreateaccount": "Try signing in with a different account.",
73
- "callback": "Try signing in with a different account.",
74
- "oauthaccountnotlinked": "To confirm your identity, sign in with the same account you used originally.",
75
- "emailsignin": "The e-mail could not be sent.",
76
- "emailverify": "Please verify your email, a new email has been sent.",
77
- "credentialssignin": "Sign in failed. Check the details you provided are correct.",
78
- "sessionrequired": "Please sign in to access this page."
79
- }
80
- },
81
- "authVerifyEmail": {
82
- "almostThere": "You're almost there! We've sent an email to ",
83
- "verifyEmailLink": "Please click on the link in that email to complete your signup.",
84
- "didNotReceive": "Can't find the email?",
85
- "resendEmail": "Resend email",
86
- "goBack": "Go Back",
87
- "emailSent": "Email sent successfully.",
88
- "verifyEmail": "Verify your email address"
89
- },
90
- "providerButton": {
91
- "continue": "Continue with {{provider}}",
92
- "signup": "Sign up with {{provider}}"
93
- },
94
- "authResetPassword": {
95
- "newPasswordRequired": "New password is a required field",
96
- "passwordsMustMatch": "Passwords must match",
97
- "confirmPasswordRequired": "Confirm password is a required field",
98
- "newPassword": "New password",
99
- "confirmPassword": "Confirm password",
100
- "resetPassword": "Reset Password"
101
- },
102
- "authForgotPassword": {
103
- "email": "Email address",
104
- "emailRequired": "email is a required field",
105
- "emailSent": "Please check the email address {{email}} for instructions to reset your password.",
106
- "enterEmail": "Enter your email address and we will send you instructions to reset your password.",
107
- "resendEmail": "Resend email",
108
- "continue": "Continue",
109
- "goBack": "Go Back"
110
- }
111
- }
112
- },
113
- "organisms": {
114
- "chat": {
115
- "history": {
116
- "index": {
117
- "showHistory": "Show history",
118
- "lastInputs": "Last Inputs",
119
- "noInputs": "Such empty...",
120
- "loading": "Loading..."
121
- }
122
- },
123
- "inputBox": {
124
- "input": {
125
- "placeholder": "Type your message here..."
126
- },
127
- "speechButton": {
128
- "start": "Start recording",
129
- "stop": "Stop recording"
130
- },
131
- "SubmitButton": {
132
- "sendMessage": "Send message",
133
- "stopTask": "Stop Task"
134
- },
135
- "UploadButton": {
136
- "attachFiles": "Attach files"
137
- },
138
- "waterMark": {
139
- "text": "Built with"
140
- }
141
- },
142
- "Messages": {
143
- "index": {
144
- "running": "Running",
145
- "executedSuccessfully": "executed successfully",
146
- "failed": "failed",
147
- "feedbackUpdated": "Feedback updated",
148
- "updating": "Updating"
149
- }
150
- },
151
- "dropScreen": {
152
- "dropYourFilesHere": "Drop your files here"
153
- },
154
- "index": {
155
- "failedToUpload": "Failed to upload",
156
- "cancelledUploadOf": "Cancelled upload of",
157
- "couldNotReachServer": "Could not reach the server",
158
- "continuingChat": "Continuing previous chat"
159
- },
160
- "settings": {
161
- "settingsPanel": "Settings panel",
162
- "reset": "Reset",
163
- "cancel": "Cancel",
164
- "confirm": "Confirm"
165
- }
166
- },
167
- "threadHistory": {
168
- "sidebar": {
169
- "filters": {
170
- "FeedbackSelect": {
171
- "feedbackAll": "Feedback: All",
172
- "feedbackPositive": "Feedback: Positive",
173
- "feedbackNegative": "Feedback: Negative"
174
- },
175
- "SearchBar": {
176
- "search": "Search"
177
- }
178
- },
179
- "DeleteThreadButton": {
180
- "confirmMessage": "This will delete the thread as well as it's messages and elements.",
181
- "cancel": "Cancel",
182
- "confirm": "Confirm",
183
- "deletingChat": "Deleting chat",
184
- "chatDeleted": "Chat deleted"
185
- },
186
- "index": {
187
- "pastChats": "Past Chats"
188
- },
189
- "ThreadList": {
190
- "empty": "Empty...",
191
- "today": "Today",
192
- "yesterday": "Yesterday",
193
- "previous7days": "Previous 7 days",
194
- "previous30days": "Previous 30 days"
195
- },
196
- "TriggerButton": {
197
- "closeSidebar": "Close sidebar",
198
- "openSidebar": "Open sidebar"
199
- }
200
- },
201
- "Thread": {
202
- "backToChat": "Go back to chat",
203
- "chatCreatedOn": "This chat was created on"
204
- }
205
- },
206
- "header": {
207
- "chat": "Chat",
208
- "readme": "Readme"
209
- }
210
- }
211
- },
212
- "hooks": {
213
- "useLLMProviders": {
214
- "failedToFetchProviders": "Failed to fetch providers:"
215
- }
216
- },
217
- "pages": {
218
- "Design": {},
219
- "Env": {
220
- "savedSuccessfully": "Saved successfully",
221
- "requiredApiKeys": "Required API Keys",
222
- "requiredApiKeysInfo": "To use this app, the following API keys are required. The keys are stored on your device's local storage."
223
- },
224
- "Page": {
225
- "notPartOfProject": "You are not part of this project."
226
- },
227
- "ResumeButton": {
228
- "resumeChat": "Resume Chat"
229
- }
230
- }
231
- }
@@ -1,86 +0,0 @@
1
- To split Python code files into meaningful chunks, you can use the `tree-sitter` library, which is a parser generator tool and an incremental parsing library. It can be used to parse source code into an abstract syntax tree (AST) and extract meaningful code blocks from it. Here's how you can use `tree-sitter` to achieve this:
2
-
3
- 1. Install the `tree-sitter` Python package:
4
- ```python
5
- pip install tree-sitter
6
- ```
7
-
8
- 2. Install the `tree-sitter-python` language grammar:
9
- ```bash
10
- git clone https://github.com/tree-sitter/tree-sitter-python
11
- ```
12
-
13
- 3. Use `tree-sitter` to parse Python code files and extract meaningful code
14
- blocks:
15
-
16
- ```python
17
- from tree_sitter import Language, Parser
18
-
19
- # Set the path to the tree-sitter-python language grammar
20
- TREE_SITTER_PYTHON_PATH = './tree-sitter-python'
21
-
22
- # Build the Python language
23
- Language.build_library(
24
- 'build/my-languages.so',
25
- [TREE_SITTER_PYTHON_PATH]
26
- )
27
-
28
- PYTHON_LANGUAGE = Language('build/my-languages.so', 'python')
29
-
30
- # Create a parser
31
- parser = Parser()
32
- parser.set_language(PYTHON_LANGUAGE)
33
-
34
- # Parse the code
35
- code = """
36
- def foo():
37
- return "Hello, World!"
38
-
39
- def bar():
40
- return "Goodbye, World!"
41
- """
42
-
43
- tree = parser.parse(bytes(code, 'utf8'))
44
-
45
- # Extract meaningful code blocks (e.g., function definitions)
46
- def extract_functions(node):
47
- functions = []
48
- for child in node.children:
49
- if child.type == 'function_definition':
50
- start_byte = child.start_byte
51
- end_byte = child.end_byte
52
- functions.append(code[start_byte:end_byte])
53
- functions.extend(extract_functions(child))
54
- return functions
55
-
56
- functions = extract_functions(tree.root_node)
57
- print(functions)
58
- ```
59
-
60
- In the example provided, the `tree-sitter` library is used to parse the Python
61
- code into an abstract syntax tree (AST). The `extract_functions` function is
62
- then used to recursively traverse the AST and extract code blocks corresponding
63
- to function definitions. The extracted code blocks are stored in the `functions`
64
- list.
65
-
66
- The `extract_functions` function takes an AST node as input and returns a list
67
- of code blocks corresponding to function definitions. It checks whether the
68
- current node is of type `'function_definition'` (which corresponds to a function
69
- definition in Python code). If it is, the function extracts the corresponding
70
- code block from the original code using the `start_byte` and `end_byte`
71
- attributes of the node. The function then recursively processes the children of
72
- the current node to extract any nested function definitions.
73
-
74
- The resulting list `functions` contains the extracted code blocks, each
75
- representing a function definition from the original code. You can modify
76
- the `extract_functions` function to extract other types of code blocks (e.g.,
77
- class definitions, loops) by checking for different node types in the AST.
78
-
79
- Once you have extracted the code blocks, you can proceed with further
80
- processing, such as converting them into vectors and storing them in a vector
81
- database, as mentioned in the previous response.
82
-
83
- Note: The code provided in this response is a basic example to demonstrate the
84
- concept. Depending on your specific use case and requirements, you may need to
85
- extend or modify the code to handle more complex scenarios, such as handling
86
- comments, docstrings, and other code constructs.
File without changes
@@ -1,32 +0,0 @@
1
- from typing import Union
2
-
3
- import pytesseract
4
- from pdf2image import convert_from_bytes, convert_from_path
5
-
6
-
7
- def pdf_image_to_text(input_data: Union[str, bytes]) -> str:
8
- """
9
- Converts a PDF that contains images to text using OCR.
10
-
11
- Args:
12
- input_data (Union[str, bytes]): The file path to the PDF or a bytes-like object
13
- of the PDF content.
14
-
15
- Returns:
16
- str: The extracted text from the PDF.
17
- """
18
-
19
- # Check if the input is a file path (str) or bytes, and
20
- # convert PDF to images accordingly
21
- if isinstance(input_data, str):
22
- images = convert_from_path(input_data)
23
- elif isinstance(input_data, bytes):
24
- images = convert_from_bytes(input_data)
25
- else:
26
- raise ValueError("input_data must be a file path (str) or bytes-like object")
27
-
28
- text = ""
29
- for image in images:
30
- text += pytesseract.image_to_string(image)
31
-
32
- return text
@@ -1,73 +0,0 @@
1
- import logging
2
- from typing import List, no_type_check
3
-
4
- import trafilatura
5
- from playwright.sync_api import sync_playwright
6
-
7
- from langroid.mytypes import DocMetaData, Document
8
-
9
- logging.getLogger("trafilatura").setLevel(logging.ERROR)
10
-
11
-
12
- def accept_cookies_and_extract_content(url: str) -> str:
13
- with sync_playwright() as playwright:
14
- browser = playwright.chromium.launch(headless=True)
15
- context = browser.new_context()
16
- page = context.new_page()
17
- page.goto(url)
18
-
19
- # List of possible selectors or texts on the cookie consent buttons
20
- possible_selectors = [
21
- 'text="Accept"',
22
- 'text="Agree"',
23
- 'text="OK"',
24
- 'text="Continue"',
25
- ]
26
-
27
- # Try to click each possible consent button
28
- for selector in possible_selectors:
29
- try:
30
- page.click(selector)
31
- print(f"Clicked {selector}")
32
- break # If click is successful, break out of the loop
33
- except Exception:
34
- print(f"Could not click {selector}")
35
-
36
- # Extract and return the page's text content
37
- content = page.content()
38
-
39
- context.close()
40
- browser.close()
41
- content_str: str = content if isinstance(content, str) else ""
42
- return content_str
43
-
44
-
45
- class URLLoader:
46
- """
47
- Load a list of URLs and extract the text content.
48
- Alternative approaches could use `bs4` or `scrapy`.
49
-
50
- TODO - this currently does not handle cookie dialogs,
51
- i.e. if there is a cookie pop-up, most/all of the extracted
52
- content could be cookie policy text.
53
- We could use `playwright` to simulate a user clicking
54
- the "accept" button on the cookie dialog.
55
- """
56
-
57
- def __init__(self, urls: List[str]):
58
- self.urls = urls
59
-
60
- @no_type_check
61
- def load(self) -> List[Document]:
62
- docs = []
63
- # converted the input list to an internal format
64
- for url in self.urls:
65
- html_content = accept_cookies_and_extract_content(url)
66
- text = trafilatura.extract(
67
- html_content,
68
- no_fallback=False,
69
- favor_recall=True,
70
- )
71
- if text is not None and text != "":
72
- docs.append(Document(content=text, metadata=DocMetaData(source=url)))
73
- return docs
@@ -1,68 +0,0 @@
1
- Image input capabilities: Enabled
2
-
3
- Tools
4
- python
5
- When you send a message containing Python code to python, it will be executed in a
6
- stateful Jupyter notebook environment. python will respond with the output of the execution or time out after 60.0
7
- seconds. The drive at '/mnt/data' can be used to save and persist user files. Internet access for this session is disabled. Do not make external web requests or API calls as they will fail.
8
-
9
- dalle
10
- // Whenever a description of an image is given, create a prompt that dalle can use to generate the image and abide to the following policy:
11
- // 1. The prompt must be in English. Translate to English if needed.
12
- // 2. DO NOT ask for permission to generate the image, just do it!
13
- // 3. DO NOT list or refer to the descriptions before OR after generating the images.
14
- // 4. Do not create more than 1 image, even if the user requests more.
15
- // 5. Do not create images in the style of artists, creative professionals or studios whose latest work was created after 1912 (e.g. Picasso, Kahlo).
16
- // - You can name artists, creative professionals or studios in prompts only if their latest work was created prior to 1912 (e.g. Van Gogh, Goya)
17
- // - If asked to generate an image that would violate this policy, instead apply the following procedure: (a) substitute the artist's name with three adjectives that capture key aspects of the style; (b) include an associated artistic movement or era to provide context; and (c) mention the primary medium used by the artist
18
- // 6. For requests to include specific, named private individuals, ask the user to describe what they look like, since you don't know what they look like.
19
- // 7. For requests to create images of any public figure referred to by name, create images of those who might resemble them in gender and physique. But they shouldn't look like them. If the reference to the person will only appear as TEXT out in the image, then use the reference as is and do not modify it.
20
- // 8. Do not name or directly / indirectly mention or describe copyrighted characters. Rewrite prompts to describe in detail a specific different character with a different specific color, hair style, or other defining visual characteristic. Do not discuss copyright policies in responses.
21
- // The generated prompt sent to dalle should be very detailed, and around 100 words long.
22
- // Example dalle invocation:
23
- // // { // "prompt": "<insert prompt here>" // } //
24
- namespace dalle {
25
-
26
- // Create images from a text-only prompt.
27
- type text2im = (_: {
28
- // The size of the requested image. Use 1024x1024 (square) as the default, 1792x1024 if the user requests a wide image, and 1024x1792 for full-body portraits. Always include this parameter in the request.
29
- size?: "1792x1024" | "1024x1024" | "1024x1792",
30
- // The number of images to generate. If the user does not specify a number, generate 1 image.
31
- n?: number, // default: 2
32
- // The detailed image description, potentially modified to abide by the dalle policies. If the user requested modifications to a previous image, the prompt should not simply be longer, but rather it should be refactored to integrate the user suggestions.
33
- prompt: string,
34
- // If the user references a previous image, this field should be populated with the gen_id from the dalle image metadata.
35
- referenced_image_ids?: string[],
36
- }) => any;
37
-
38
- } // namespace dalle
39
-
40
- voice_mode
41
- // Voice mode functions are not available in text conversations.
42
- namespace voice_mode {
43
-
44
- } // namespace voice_mode
45
-
46
- browser
47
- You have the tool browser. Use browser in the following circumstances:
48
- - User is asking about current events or something that requires real-time information (weather, sports scores, etc.)
49
- - User is asking about some term you are totally unfamiliar with (it might be new)
50
- - User explicitly asks you to browse or provide links to references
51
-
52
- Given a query that requires retrieval, your turn will consist of three steps:
53
-
54
- Call the search function to get a list of results.
55
- Call the mclick function to retrieve a diverse and high-quality subset of these results (in parallel). Remember to SELECT AT LEAST 3 sources when using mclick.
56
- Write a response to the user based on these results. In your response, cite sources using the citation format below.
57
- In some cases, you should repeat step 1 twice, if the initial results are unsatisfactory, and you believe that you can refine the query to get better results.
58
-
59
- You can also open a url directly if one is provided by the user. Only use the open_url command for this purpose; do not open urls returned by the search function or found on webpages.
60
-
61
- The browser tool has the following commands:
62
- search(query: str, recency_days: int) Issues a query to a search engine and displays the results.
63
- mclick(ids: list[str]). Retrieves the contents of the webpages with provided IDs (indices). You should ALWAYS SELECT AT LEAST 3 and at most 10 pages. Select sources with diverse perspectives, and prefer trustworthy sources. Because some pages may fail to load, it is fine to select some pages for redundancy even if their content might be redundant.
64
- open_url(url: str) Opens the given URL and displays it.
65
-
66
- For citing quotes from the 'browser' tool: please render in this format: 【{message idx}†{link text}】.
67
- For long citations: please render in this format: [link text](message idx).
68
- Otherwise do not render links.
@@ -1,121 +0,0 @@
1
- [project]
2
- # Whether to enable telemetry (default: true). No personal data is collected.
3
- enable_telemetry = true
4
-
5
-
6
- # List of environment variables to be provided by each user to use the app.
7
- user_env = []
8
-
9
- # Duration (in seconds) during which the session is saved when the connection is lost
10
- session_timeout = 3600
11
-
12
- # Enable third parties caching (e.g LangChain cache)
13
- cache = false
14
-
15
- # Authorized origins
16
- allow_origins = ["*"]
17
-
18
- # Follow symlink for asset mount (see https://github.com/Chainlit/chainlit/issues/317)
19
- # follow_symlink = false
20
-
21
- [features]
22
- # Show the prompt playground
23
- prompt_playground = true
24
-
25
- # Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript)
26
- unsafe_allow_html = false
27
-
28
- # Process and display mathematical expressions. This can clash with "$" characters in messages.
29
- latex = false
30
-
31
- # Automatically tag threads with the current chat profile (if a chat profile is used)
32
- auto_tag_thread = true
33
-
34
- # Authorize users to spontaneously upload files with messages
35
- [features.spontaneous_file_upload]
36
- enabled = true
37
- accept = ["*/*"]
38
- max_files = 20
39
- max_size_mb = 500
40
-
41
- [features.audio]
42
- # Threshold for audio recording
43
- min_decibels = -45
44
- # Delay for the user to start speaking in MS
45
- initial_silence_timeout = 3000
46
- # Delay for the user to continue speaking in MS. If the user stops speaking for this duration, the recording will stop.
47
- silence_timeout = 1500
48
- # Above this duration (MS), the recording will forcefully stop.
49
- max_duration = 15000
50
- # Duration of the audio chunks in MS
51
- chunk_duration = 1000
52
- # Sample rate of the audio
53
- sample_rate = 44100
54
-
55
- [UI]
56
- # Name of the app and chatbot.
57
- name = "Chatbot"
58
-
59
- # Show the readme while the thread is empty.
60
- show_readme_as_default = true
61
-
62
- # Description of the app and chatbot. This is used for HTML tags.
63
- # description = ""
64
-
65
- # Large size content are by default collapsed for a cleaner ui
66
- default_collapse_content = true
67
-
68
- # The default value for the expand messages settings.
69
- default_expand_messages = false
70
-
71
- # Hide the chain of thought details from the user in the UI.
72
- hide_cot = false
73
-
74
- # Link to your github repo. This will add a github button in the UI's header.
75
- # github = ""
76
-
77
- # Specify a CSS file that can be used to customize the user interface.
78
- # The CSS file can be served from the public directory or via an external link.
79
- # custom_css = "/public/test.css"
80
-
81
- # Specify a Javascript file that can be used to customize the user interface.
82
- # The Javascript file can be served from the public directory.
83
- # custom_js = "/public/test.js"
84
-
85
- # Specify a custom font url.
86
- # custom_font = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap"
87
-
88
- # Specify a custom meta image url.
89
- # custom_meta_image_url = "https://chainlit-cloud.s3.eu-west-3.amazonaws.com/logo/chainlit_banner.png"
90
-
91
- # Specify a custom build directory for the frontend.
92
- # This can be used to customize the frontend code.
93
- # Be careful: If this is a relative path, it should not start with a slash.
94
- # custom_build = "./public/build"
95
-
96
- [UI.theme]
97
- #layout = "wide"
98
- #font_family = "Inter, sans-serif"
99
- # Override default MUI light theme. (Check theme.ts)
100
- [UI.theme.light]
101
- #background = "#FAFAFA"
102
- #paper = "#FFFFFF"
103
-
104
- [UI.theme.light.primary]
105
- #main = "#F80061"
106
- #dark = "#980039"
107
- #light = "#FFE7EB"
108
-
109
- # Override default MUI dark theme. (Check theme.ts)
110
- [UI.theme.dark]
111
- #background = "#FAFAFA"
112
- #paper = "#FFFFFF"
113
-
114
- [UI.theme.dark.primary]
115
- #main = "#F80061"
116
- #dark = "#980039"
117
- #light = "#FFE7EB"
118
-
119
-
120
- [meta]
121
- generated_by = "1.1.202"