├── .dockerignore
├── .env.example
├── .gitignore
├── .python-version
├── Dockerfile
├── LICENSE
├── README.md
├── app
├── .chainlit
│ ├── config.toml
│ └── translations
│ │ ├── bn.json
│ │ ├── en-US.json
│ │ ├── gu.json
│ │ ├── he-IL.json
│ │ ├── hi.json
│ │ ├── kn.json
│ │ ├── ml.json
│ │ ├── mr.json
│ │ ├── ta.json
│ │ ├── te.json
│ │ └── zh-CN.json
├── chainlit.md
├── config
│ ├── ai_models.yaml
│ ├── database.py
│ ├── realtime_instructions.txt
│ ├── realtime_instructions_base.txt
│ └── schema.yaml
├── public
│ ├── avatars
│ │ └── my-assistant.png
│ ├── favicon.png
│ ├── logo_dark.png
│ ├── logo_light.png
│ └── stylesheet.css
├── realtime
│ └── __init__.py
├── samantha.py
├── scripts
│ ├── create_sample_db.py
│ └── test_tools
│ │ ├── mock_chainlit.py
│ │ ├── test_create_python_file.py
│ │ ├── test_database_tool.py
│ │ ├── test_flux_togetherai.py
│ │ ├── test_llama_32.py
│ │ ├── test_structured_output_list.py
│ │ ├── test_subprocess.py
│ │ └── test_tavily.py
├── tools
│ ├── __init__.py
│ ├── browser.py
│ ├── chart.py
│ ├── database.py
│ ├── email.py
│ ├── image.py
│ ├── linkedin.py
│ ├── python_file.py
│ ├── search.py
│ └── stock.py
└── utils
│ ├── __init__.py
│ ├── ai_models.py
│ └── common.py
├── compose.yaml
├── images
├── os1.gif
└── thumbnail_short_demo.png
├── pyproject.toml
└── uv.lock
/.dockerignore:
--------------------------------------------------------------------------------
1 | .venv/
--------------------------------------------------------------------------------
/.env.example:
--------------------------------------------------------------------------------
1 | # Use Azure OpenAI
2 | USE_AZURE='true'
3 |
4 | # Azure OpenAI Configuration
5 | AZURE_OPENAI_API_KEY=''
6 | AZURE_OPENAI_URL='' # without https:// nor wss://
7 | AZURE_OPENAI_API_TYPE='azure'
8 | OPENAI_DEPLOYMENT_NAME_REALTIME='gpt-4o-realtime-preview'
9 |
10 | # API Keys
11 | TOGETHER_API_KEY=''
12 | TAVILY_API_KEY=''
13 | GROQ_API_KEY=''
14 |
15 | # Database Configuration
16 | DB_DIALECT='' # e.g. 'sqlite' 'postgresql'
17 | DB_DATABASE='' # if sqlite, path to the database file
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | *.pyc
3 | __pycache__/
4 | .pytest_cache/
5 |
6 | # Development tool folders
7 | .idea/
8 | .vscode/
9 |
10 | # macOS system files
11 | .DS_Store
12 |
13 | # Secrets
14 | .env
15 |
16 | # env
17 | .venv/
18 |
19 | # Others
20 | scratchpad/
--------------------------------------------------------------------------------
/.python-version:
--------------------------------------------------------------------------------
1 | 3.12
2 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # Use a Python image with uv pre-installed
2 | FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim
3 |
4 | # Install the project into `/app`
5 | WORKDIR /app
6 |
7 | # Enable bytecode compilation
8 | ENV UV_COMPILE_BYTECODE=1
9 |
10 | # Copy from the cache instead of linking since it's a mounted volume
11 | ENV UV_LINK_MODE=copy
12 |
13 | # Install the project's dependencies using the lockfile and settings
14 | RUN --mount=type=cache,target=/root/.cache/uv \
15 | --mount=type=bind,source=uv.lock,target=uv.lock \
16 | --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
17 | uv sync --frozen --no-install-project --no-dev
18 |
19 | # Then, add the rest of the project source code and install it
20 | # Installing separately from its dependencies allows optimal layer caching
21 | ADD . /app
22 | RUN --mount=type=cache,target=/root/.cache/uv \
23 | uv sync --frozen --no-dev
24 |
25 | # Place executables in the environment at the front of the path
26 | ENV PATH="/app/.venv/bin:$PATH"
27 |
28 | # Reset the entrypoint, don't invoke `uv`
29 | ENTRYPOINT []
30 |
31 | # Set the working directory to the app directory
32 | WORKDIR /app/app
33 |
34 | # Run the Chainlit application
35 | CMD ["chainlit", "run", "samantha.py", "-h"]
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Jesús Copado
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Samantha OS¹ (Her)
2 |
3 |
4 |
5 |
6 |
7 |
8 | Samantha OS¹ loading animation
9 |
10 |
11 | Samantha is an AI assistant inspired by the movie *Her*. This project is built to provide real-time voice interactions using the Realtime API and Chainlit. Samantha acts as an agent that calls various tools to handle user requests, such as querying stock prices, executing SQL commands, generating images, and creating Python scripts.
12 |
13 | ## YouTube Demo
14 | Watch a 2-minute demonstration of Samantha in action, where I showcase real-time voice interactions and various capabilities of the AI assistant.
15 |
16 |
17 |
18 |
19 |
20 |
21 | 👆 Click the image to watch the demo on YouTube
22 |
23 |
24 |
25 | ## Setup and Running
26 |
27 | You can run Samantha either by setting up a virtual environment using `uv` or using Docker Compose. Note that setting up the environment variables is required in all cases.
28 |
29 | ### Option 1: Using Virtual Environment
30 |
31 | 1. **Clone the Repository**
32 | ```sh
33 | git clone https://github.com/jesuscopado/samantha-os1.git
34 | cd samantha-os1
35 | ```
36 |
37 | 2. **Set Up Virtual Environment**
38 | - Install `uv` package manager: [Installation Instructions](https://docs.astral.sh/uv/getting-started/installation/)
39 | - Create the virtual environment:
40 | ```sh
41 | uv sync
42 | ```
43 | - Activate the virtual environment:
44 | ```sh
45 | source .venv/bin/activate # On Windows use `.venv\Scripts\activate`
46 | ```
47 |
48 | 3. **Environment Variables**
49 | - Create a `.env` file in the root directory by copying `.env.example` and updating it with your own keys.
50 |
51 | 4. **Run the Application**
52 | ```sh
53 | cd app
54 | chainlit run samantha.py
55 | ```
56 |
57 | ### Option 2: Using Docker Compose
58 |
59 | 1. **Environment Variables**
60 | - Create a `.env` file in the root directory by copying `.env.example` and updating it with your own keys.
61 |
62 | 2. **Build and Run with Docker Compose**
63 | - Make sure Docker and Docker Compose are installed.
64 | - Run the following command:
65 | ```sh
66 | docker-compose up --d
67 | ```
68 |
69 | ## Tools and Features
70 |
71 | This project includes several powerful tools:
72 |
73 | - **Stock Price Queries**: Using the `yfinance` package, Samantha can query the latest stock price information.
74 | - **Plotly Charts**: Visualizations are created using Plotly to provide insights.
75 | - **Image Generation**: Samantha can generate images using AI models through the Together API.
76 | - **Browser Interaction**: Open web pages based on prompts.
77 | - **Internet Search**: Samantha can perform internet searches via the Tavily API.
78 | - **LinkedIn Post Drafting**: Create LinkedIn posts based on given topics using an AI model.
79 | - **Python Script Generation**: Generate Python scripts on-demand based on user-provided topics.
80 | - **Python File Execution**: Create and execute Python scripts directly from the assistant.
81 | - **🆕 Database Interaction**: Convert natural language to SQL and execute db commands with formatted results.
82 | - **🆕 Email Drafting**: Compose professional, personalized emails with appropriate subject lines and content.
83 |
--------------------------------------------------------------------------------
/app/.chainlit/config.toml:
--------------------------------------------------------------------------------
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 | # 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)
23 | unsafe_allow_html = false
24 |
25 | # Process and display mathematical expressions. This can clash with "$" characters in messages.
26 | latex = false
27 |
28 | # Automatically tag threads with the current chat profile (if a chat profile is used)
29 | auto_tag_thread = true
30 |
31 | # Allow users to edit their own messages
32 | edit_message = 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 | # Sample rate of the audio
43 | sample_rate = 24000
44 |
45 | [UI]
46 | # Name of the assistant.
47 | name = "Samantha"
48 |
49 | # Description of the assistant. This is used for HTML tags.
50 | # description = ""
51 |
52 | # Large size content are by default collapsed for a cleaner ui
53 | default_collapse_content = true
54 |
55 | # Chain of Thought (CoT) display mode. Can be "hidden", "tool_call" or "full".
56 | cot = "full"
57 |
58 | # Link to your github repo. This will add a github button in the UI's header.
59 | # github = ""
60 |
61 | # Specify a CSS file that can be used to customize the user interface.
62 | # The CSS file can be served from the public directory or via an external link.
63 | # custom_css = "/public/test.css"
64 |
65 | # Specify a Javascript file that can be used to customize the user interface.
66 | # The Javascript file can be served from the public directory.
67 | # custom_js = "/public/test.js"
68 |
69 | # Specify a custom font url.
70 | # custom_font = "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap"
71 |
72 | # Specify a custom meta image url.
73 | # custom_meta_image_url = "https://chainlit-cloud.s3.eu-west-3.amazonaws.com/logo/chainlit_banner.png"
74 |
75 | # Specify a custom build directory for the frontend.
76 | # This can be used to customize the frontend code.
77 | # Be careful: If this is a relative path, it should not start with a slash.
78 | # custom_build = "./public/build"
79 |
80 | [UI.theme]
81 | default = "light"
82 | #layout = "wide"
83 | #font_family = "Inter, sans-serif"
84 | # Override default MUI light theme. (Check theme.ts)
85 | [UI.theme.light]
86 | #background = "#FAFAFA"
87 | #paper = "#FFFFFF"
88 |
89 | [UI.theme.light.primary]
90 | main = "#c34524"
91 | #dark = "#980039"
92 | #light = "#FFE7EB"
93 | [UI.theme.light.text]
94 | #primary = "#212121"
95 | #secondary = "#616161"
96 |
97 | # Override default MUI dark theme. (Check theme.ts)
98 | [UI.theme.dark]
99 | #background = "#FAFAFA"
100 | #paper = "#FFFFFF"
101 |
102 | [UI.theme.dark.primary]
103 | main = "#c34524"
104 | #dark = "#980039"
105 | #light = "#FFE7EB"
106 | [UI.theme.dark.text]
107 | #primary = "#EEEEEE"
108 | #secondary = "#BDBDBD"
109 |
110 | [meta]
111 | generated_by = "2.0.dev0"
112 |
--------------------------------------------------------------------------------
/app/.chainlit/translations/bn.json:
--------------------------------------------------------------------------------
1 | {
2 | "components": {
3 | "atoms": {
4 | "buttons": {
5 | "userButton": {
6 | "menu": {
7 | "settings": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8",
8 | "settingsKey": "S",
9 | "APIKeys": "\u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0",
10 | "logout": "\u09b2\u0997\u0986\u0989\u099f"
11 | }
12 | }
13 | }
14 | },
15 | "molecules": {
16 | "newChatButton": {
17 | "newChat": "\u09a8\u09a4\u09c1\u09a8 \u0986\u09a1\u09cd\u09a1\u09be"
18 | },
19 | "tasklist": {
20 | "TaskList": {
21 | "title": "\ud83d\uddd2\ufe0f \u0995\u09be\u09b0\u09cd\u09af \u09a4\u09be\u09b2\u09bf\u0995\u09be",
22 | "loading": "\u09b2\u09cb\u09a1\u0964\u0964\u0964",
23 | "error": "\u098f\u0995\u099f\u09bf \u09a4\u09cd\u09b0\u09c1\u099f\u09bf \u09b8\u0982\u0998\u099f\u09bf\u09a4 \u09b9\u09af\u09bc\u09c7\u099b\u09c7"
24 | }
25 | },
26 | "attachments": {
27 | "cancelUpload": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8",
28 | "removeAttachment": "\u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4\u09bf \u09b8\u09b0\u09be\u09a8"
29 | },
30 | "newChatDialog": {
31 | "createNewChat": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09ac\u09c7\u09a8?",
32 | "clearChat": "\u098f\u099f\u09bf \u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u09ac\u09be\u09b0\u09cd\u09a4\u09be\u0997\u09c1\u09b2\u09bf \u09b8\u09be\u09ab \u0995\u09b0\u09ac\u09c7 \u098f\u09ac\u0982 \u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09ac\u09c7\u0964",
33 | "cancel": "\u09ac\u09be\u09a4\u09bf\u09b2",
34 | "confirm": "\u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4"
35 | },
36 | "settingsModal": {
37 | "settings": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8",
38 | "expandMessages": "\u09ac\u09be\u09b0\u09cd\u09a4\u09be\u0997\u09c1\u09b2\u09bf \u09aa\u09cd\u09b0\u09b8\u09be\u09b0\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8",
39 | "hideChainOfThought": "\u099a\u09bf\u09a8\u09cd\u09a4\u09be\u09b0 \u09b6\u09c3\u0999\u09cd\u0996\u09b2 \u09b2\u09c1\u0995\u09be\u09a8",
40 | "darkMode": "\u09a1\u09be\u09b0\u09cd\u0995 \u09ae\u09cb\u09a1"
41 | },
42 | "detailsButton": {
43 | "using": "\u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0",
44 | "running": "\u099a\u09b2\u09ae\u09be\u09a8",
45 | "took_one": "{{count}} \u09aa\u09a6\u0995\u09cd\u09b7\u09c7\u09aa \u09a8\u09bf\u09af\u09bc\u09c7\u099b\u09c7",
46 | "took_other": "{{count}}\u099f\u09bf \u09aa\u09a6\u0995\u09cd\u09b7\u09c7\u09aa \u09a8\u09bf\u09af\u09bc\u09c7\u099b\u09c7"
47 | },
48 | "auth": {
49 | "authLogin": {
50 | "title": "\u0985\u09cd\u09af\u09be\u09aa\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09cd\u09b8\u09c7\u09b8 \u0995\u09b0\u09a4\u09c7 \u09b2\u0997\u0987\u09a8 \u0995\u09b0\u09c1\u09a8\u0964",
51 | "form": {
52 | "email": "\u0987-\u09ae\u09c7\u0987\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be",
53 | "password": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1",
54 | "noAccount": "\u0995\u09cb\u09a8\u0993 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a8\u09c7\u0987?",
55 | "alreadyHaveAccount": "\u0987\u09a4\u09bf\u09ae\u09a7\u09cd\u09af\u09c7 \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u0986\u099b\u09c7?",
56 | "signup": "\u09b8\u09be\u0987\u09a8 \u0986\u09aa \u0995\u09b0\u09cb",
57 | "signin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09cb",
58 | "or": "\u09ac\u09be",
59 | "continue": "\u0985\u09ac\u09bf\u09b0\u09a4",
60 | "forgotPassword": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09ad\u09c1\u09b2\u09c7 \u0997\u09c7\u099b\u09c7\u09a8?",
61 | "passwordMustContain": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1\u09c7 \u0985\u09ac\u09b6\u09cd\u09af\u0987 \u09a5\u09be\u0995\u09a4\u09c7 \u09b9\u09ac\u09c7:",
62 | "emailRequired": "\u0987\u09ae\u09c7\u09b2 \u098f\u0995\u099f\u09bf \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0",
63 | "passwordRequired": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0"
64 | },
65 | "error": {
66 | "default": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09a4\u09c7 \u0985\u0995\u09cd\u09b7\u09ae\u0964",
67 | "signin": "\u098f\u0995\u099f\u09bf \u09ad\u09bf\u09a8\u09cd\u09a8 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8\u0964",
68 | "oauthsignin": "\u098f\u0995\u099f\u09bf \u09ad\u09bf\u09a8\u09cd\u09a8 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8\u0964",
69 | "redirect_uri_mismatch": "\u09aa\u09c1\u09a8\u0983\u09a8\u09bf\u09b0\u09cd\u09a6\u09c7\u09b6\u09bf\u09a4 URI OAUTH \u0985\u09cd\u09af\u09be\u09aa \u0995\u09a8\u09ab\u09bf\u0997\u09be\u09b0\u09c7\u09b6\u09a8\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09ae\u09bf\u09b2\u099b\u09c7 \u09a8\u09be\u0964",
70 | "oauthcallbackerror": "\u098f\u0995\u099f\u09bf \u09ad\u09bf\u09a8\u09cd\u09a8 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8\u0964",
71 | "oauthcreateaccount": "\u098f\u0995\u099f\u09bf \u09ad\u09bf\u09a8\u09cd\u09a8 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8\u0964",
72 | "emailcreateaccount": "\u098f\u0995\u099f\u09bf \u09ad\u09bf\u09a8\u09cd\u09a8 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8\u0964",
73 | "callback": "\u098f\u0995\u099f\u09bf \u09ad\u09bf\u09a8\u09cd\u09a8 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8\u0964",
74 | "oauthaccountnotlinked": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09b0\u09bf\u099a\u09af\u09bc \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09a4\u09c7, \u0986\u09aa\u09a8\u09bf \u09ae\u09c2\u09b2\u09a4 \u09af\u09c7 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f\u099f\u09bf \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c7\u099b\u09c7\u09a8 \u09b8\u09c7\u0987 \u098f\u0995\u0987 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8\u0964",
75 | "emailsignin": "\u0987-\u09ae\u09c7\u0987\u09b2\u099f\u09bf \u09aa\u09cd\u09b0\u09c7\u09b0\u09a3 \u0995\u09b0\u09be \u09af\u09be\u09af\u09bc\u09a8\u09bf\u0964",
76 | "emailverify": "\u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u0987\u09ae\u09c7\u09b2\u099f\u09bf \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09c1\u09a8, \u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u0987\u09ae\u09c7\u09b2 \u09aa\u09cd\u09b0\u09c7\u09b0\u09a3 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964",
77 | "credentialssignin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964 \u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09a6\u09a4\u09cd\u09a4 \u09ac\u09bf\u09ac\u09b0\u09a3\u0997\u09c1\u09b2\u09bf \u09b8\u09a0\u09bf\u0995 \u0995\u09bf\u09a8\u09be \u09a4\u09be \u09aa\u09b0\u09c0\u0995\u09cd\u09b7\u09be \u0995\u09b0\u09c1\u09a8\u0964",
78 | "sessionrequired": "\u098f\u0987 \u09aa\u09c3\u09b7\u09cd\u09a0\u09be\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09cd\u09b8\u09c7\u09b8 \u0995\u09b0\u09a4\u09c7 \u09a6\u09af\u09bc\u09be \u0995\u09b0\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8\u0964"
79 | }
80 | },
81 | "authVerifyEmail": {
82 | "almostThere": "\u0986\u09aa\u09a8\u09bf \u09aa\u09cd\u09b0\u09be\u09af\u09bc \u09b8\u09c7\u0996\u09be\u09a8\u09c7 \u09aa\u09cc\u0981\u099b\u09c7\u099b\u09c7\u09a8! \u0986\u09ae\u09b0\u09be \u098f\u0995\u099f\u09bf \u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09be\u09a0\u09bf\u09af\u09bc\u09c7\u099b\u09bf ",
83 | "verifyEmailLink": "\u0986\u09aa\u09a8\u09be\u09b0 \u09b8\u09be\u0987\u09a8\u0986\u09aa \u09b8\u09ae\u09cd\u09aa\u09c2\u09b0\u09cd\u09a3 \u0995\u09b0\u09a4\u09c7 \u09a6\u09af\u09bc\u09be \u0995\u09b0\u09c7 \u09b8\u09c7\u0987 \u0987\u09ae\u09c7\u09b2\u09c7\u09b0 \u09b2\u09bf\u0999\u09cd\u0995\u099f\u09bf\u09a4\u09c7 \u0995\u09cd\u09b2\u09bf\u0995 \u0995\u09b0\u09c1\u09a8\u0964",
84 | "didNotReceive": "\u0987\u09ae\u09c7\u0987\u09b2 \u0996\u09c1\u0981\u099c\u09c7 \u09aa\u09be\u099a\u09cd\u099b\u09c7\u09a8 \u09a8\u09be?",
85 | "resendEmail": "\u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u09aa\u09be\u09a0\u09be\u09a8",
86 | "goBack": "\u09ab\u09bf\u09b0\u09c7 \u09af\u09be\u0993",
87 | "emailSent": "\u0987\u09ae\u09c7\u09b2 \u09b8\u09ab\u09b2\u09ad\u09be\u09ac\u09c7 \u09aa\u09be\u09a0\u09be\u09a8\u09cb \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964",
88 | "verifyEmail": "\u0986\u09aa\u09a8\u09be\u09b0 \u0987\u09ae\u09c7\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09c1\u09a8"
89 | },
90 | "providerButton": {
91 | "continue": "{{provider}} \u09a6\u09bf\u09af\u09bc\u09c7 \u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8",
92 | "signup": "{{provider}} \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0986\u09aa \u0995\u09b0\u09c1\u09a8"
93 | },
94 | "authResetPassword": {
95 | "newPasswordRequired": "\u09a8\u09a4\u09c1\u09a8 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0",
96 | "passwordsMustMatch": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u0985\u09ac\u09b6\u09cd\u09af\u0987 \u09ae\u09bf\u09b2\u09a4\u09c7 \u09b9\u09ac\u09c7",
97 | "confirmPasswordRequired": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09be \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0",
98 | "newPassword": "\u09a8\u09a4\u09c1\u09a8 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1",
99 | "confirmPassword": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8",
100 | "resetPassword": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09b0\u09bf\u09b8\u09c7\u099f \u0995\u09b0\u09c1\u09a8"
101 | },
102 | "authForgotPassword": {
103 | "email": "\u0987-\u09ae\u09c7\u0987\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be",
104 | "emailRequired": "\u0987\u09ae\u09c7\u09b2 \u098f\u0995\u099f\u09bf \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0",
105 | "emailSent": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1\u099f\u09bf \u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u09b8\u09c7\u099f \u0995\u09b0\u09be\u09b0 \u09a8\u09bf\u09b0\u09cd\u09a6\u09c7\u09b6\u09be\u09ac\u09b2\u09c0\u09b0 \u099c\u09a8\u09cd\u09af \u09a6\u09af\u09bc\u09be \u0995\u09b0\u09c7 \u0987\u09ae\u09c7\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be {{email}} \u09aa\u09b0\u09c0\u0995\u09cd\u09b7\u09be \u0995\u09b0\u09c1\u09a8\u0964",
106 | "enterEmail": "\u0986\u09aa\u09a8\u09be\u09b0 \u0987\u09ae\u09c7\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be \u09b2\u09bf\u0996\u09c1\u09a8 \u098f\u09ac\u0982 \u0986\u09ae\u09b0\u09be \u0986\u09aa\u09a8\u09be\u0995\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u09b8\u09c7\u099f \u0995\u09b0\u09a4\u09c7 \u09a8\u09bf\u09b0\u09cd\u09a6\u09c7\u09b6\u09be\u09ac\u09b2\u09c0 \u09aa\u09be\u09a0\u09be\u09ac\u0964",
107 | "resendEmail": "\u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u09aa\u09be\u09a0\u09be\u09a8",
108 | "continue": "\u0985\u09ac\u09bf\u09b0\u09a4",
109 | "goBack": "\u09ab\u09bf\u09b0\u09c7 \u09af\u09be\u0993"
110 | }
111 | }
112 | },
113 | "organisms": {
114 | "chat": {
115 | "history": {
116 | "index": {
117 | "showHistory": "\u0987\u09a4\u09bf\u09b9\u09be\u09b8 \u09a6\u09c7\u0996\u09be\u09a8",
118 | "lastInputs": "\u09b8\u09b0\u09cd\u09ac\u09b6\u09c7\u09b7 \u0987\u09a8\u09aa\u09c1\u099f",
119 | "noInputs": "\u098f\u09a4 \u09ab\u09be\u0981\u0995\u09be...",
120 | "loading": "\u09b2\u09cb\u09a1\u0964\u0964\u0964"
121 | }
122 | },
123 | "inputBox": {
124 | "input": {
125 | "placeholder": "\u098f\u0996\u09be\u09a8\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09be\u09b0\u09cd\u09a4\u09be \u099f\u09be\u0987\u09aa \u0995\u09b0\u09c1\u09a8..."
126 | },
127 | "speechButton": {
128 | "start": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09c1\u09a8",
129 | "stop": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8"
130 | },
131 | "SubmitButton": {
132 | "sendMessage": "\u09ac\u09be\u09b0\u09cd\u09a4\u09be \u09aa\u09cd\u09b0\u09c7\u09b0\u09a3 \u0995\u09b0\u09c1\u09a8",
133 | "stopTask": "\u09b8\u09cd\u099f\u09aa \u099f\u09be\u09b8\u09cd\u0995"
134 | },
135 | "UploadButton": {
136 | "attachFiles": "\u09ab\u09be\u0987\u09b2 \u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4 \u0995\u09b0\u09c1\u09a8"
137 | },
138 | "waterMark": {
139 | "text": "\u09b8\u0999\u09cd\u0997\u09c7 \u09a8\u09bf\u09b0\u09cd\u09ae\u09bf\u09a4"
140 | }
141 | },
142 | "Messages": {
143 | "index": {
144 | "running": "\u099a\u09b2\u09ae\u09be\u09a8",
145 | "executedSuccessfully": "\u09b8\u09ab\u09b2\u09ad\u09be\u09ac\u09c7 \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09bf\u09a4 \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
146 | "failed": "\u09ac\u09cd\u09af\u09b0\u09cd\u09a5",
147 | "feedbackUpdated": "\u09ab\u09bf\u09a1\u09ac\u09cd\u09af\u09be\u0995 \u0986\u09aa\u09a1\u09c7\u099f \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
148 | "updating": "\u0986\u09a7\u09c1\u09a8\u09bf\u0995\u09c0\u0995\u09b0\u09a3"
149 | }
150 | },
151 | "dropScreen": {
152 | "dropYourFilesHere": "\u0986\u09aa\u09a8\u09be\u09b0 \u09ab\u09be\u0987\u09b2\u0997\u09c1\u09b2\u09bf \u098f\u0996\u09be\u09a8\u09c7 \u09ab\u09c7\u09b2\u09c7 \u09a6\u09bf\u09a8"
153 | },
154 | "index": {
155 | "failedToUpload": "\u0986\u09aa\u09b2\u09cb\u09a1 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
156 | "cancelledUploadOf": "\u098f\u09b0 \u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09be\u09a4\u09bf\u09b2",
157 | "couldNotReachServer": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0\u09c7 \u09aa\u09cc\u0981\u099b\u09be\u09a8\u09cb \u09af\u09be\u09af\u09bc\u09a8\u09bf",
158 | "continuingChat": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0 \u099a\u09cd\u09af\u09be\u099f \u0985\u09ac\u09bf\u09b0\u09a4 \u09b0\u09be\u0996\u09be"
159 | },
160 | "settings": {
161 | "settingsPanel": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8 \u09aa\u09cd\u09af\u09be\u09a8\u09c7\u09b2",
162 | "reset": "\u09b0\u09bf\u09b8\u09c7\u099f",
163 | "cancel": "\u09ac\u09be\u09a4\u09bf\u09b2",
164 | "confirm": "\u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4"
165 | }
166 | },
167 | "threadHistory": {
168 | "sidebar": {
169 | "filters": {
170 | "FeedbackSelect": {
171 | "feedbackAll": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be: \u09b8\u09ac",
172 | "feedbackPositive": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be: \u0987\u09a4\u09bf\u09ac\u09be\u099a\u0995",
173 | "feedbackNegative": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be: \u09a8\u09c7\u09a4\u09bf\u09ac\u09be\u099a\u0995"
174 | },
175 | "SearchBar": {
176 | "search": "\u09b8\u09a8\u09cd\u09a7\u09be\u09a8"
177 | }
178 | },
179 | "DeleteThreadButton": {
180 | "confirmMessage": "\u098f\u099f\u09bf \u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09aa\u09be\u09b6\u09be\u09aa\u09be\u09b6\u09bf \u098f\u09b0 \u09ac\u09be\u09b0\u09cd\u09a4\u09be \u098f\u09ac\u0982 \u0989\u09aa\u09be\u09a6\u09be\u09a8\u0997\u09c1\u09b2\u09bf\u0993 \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09ac\u09c7\u0964",
181 | "cancel": "\u09ac\u09be\u09a4\u09bf\u09b2",
182 | "confirm": "\u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4",
183 | "deletingChat": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09cb\u099b\u09be \u09b9\u099a\u09cd\u099b\u09c7",
184 | "chatDeleted": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09cb\u099b\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7"
185 | },
186 | "index": {
187 | "pastChats": "\u0985\u09a4\u09c0\u09a4 \u099a\u09cd\u09af\u09be\u099f"
188 | },
189 | "ThreadList": {
190 | "empty": "\u0996\u09be\u09b2\u09bf\u0964\u0964\u0964",
191 | "today": "\u0986\u099c",
192 | "yesterday": "\u0997\u09a4\u0995\u09be\u09b2",
193 | "previous7days": "Previous 7 \u09a6\u09bf\u09a8",
194 | "previous30days": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0 30 \u09a6\u09bf\u09a8"
195 | },
196 | "TriggerButton": {
197 | "closeSidebar": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8",
198 | "openSidebar": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u0996\u09c1\u09b2\u09c1\u09a8"
199 | }
200 | },
201 | "Thread": {
202 | "backToChat": "\u099a\u09cd\u09af\u09be\u099f\u09c7 \u09ab\u09bf\u09b0\u09c7 \u09af\u09be\u09a8",
203 | "chatCreatedOn": "\u098f\u0987 \u099a\u09cd\u09af\u09be\u099f\u099f\u09bf \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09bf\u09b2"
204 | }
205 | },
206 | "header": {
207 | "chat": "\u0986\u09b2\u09be\u09aa",
208 | "readme": "\u09b0\u09bf\u09a1\u09ae\u09bf"
209 | }
210 | }
211 | },
212 | "hooks": {
213 | "useLLMProviders": {
214 | "failedToFetchProviders": "\u09b8\u09b0\u09ac\u09b0\u09be\u09b9\u0995\u09be\u09b0\u09c0\u09a6\u09c7\u09b0 \u0986\u09a8\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5:"
215 | }
216 | },
217 | "pages": {
218 | "Design": {},
219 | "Env": {
220 | "savedSuccessfully": "\u09b8\u09ab\u09b2\u09ad\u09be\u09ac\u09c7 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09a3 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
221 | "requiredApiKeys": "\u0986\u09ac\u09b6\u09cd\u09af\u0995 API \u0995\u09c0",
222 | "requiredApiKeysInfo": "\u098f\u0987 \u0985\u09cd\u09af\u09be\u09aa\u099f\u09bf \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7, \u09a8\u09bf\u09ae\u09cd\u09a8\u09b2\u09bf\u0996\u09bf\u09a4 API \u0995\u09c0\u0997\u09c1\u09b2\u09bf\u09b0 \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u0964 \u0995\u09c0\u0997\u09c1\u09b2\u09bf \u0986\u09aa\u09a8\u09be\u09b0 \u09a1\u09bf\u09ad\u09be\u0987\u09b8\u09c7\u09b0 \u09b8\u09cd\u09a5\u09be\u09a8\u09c0\u09af\u09bc \u09b8\u09cd\u099f\u09cb\u09b0\u09c7\u099c\u09c7 \u09b8\u099e\u09cd\u099a\u09bf\u09a4 \u09b0\u09af\u09bc\u09c7\u099b\u09c7\u0964"
223 | },
224 | "Page": {
225 | "notPartOfProject": "\u0986\u09aa\u09a8\u09bf \u098f\u0987 \u09aa\u09cd\u09b0\u0995\u09b2\u09cd\u09aa\u09c7\u09b0 \u0985\u0982\u09b6 \u09a8\u09a8\u0964"
226 | },
227 | "ResumeButton": {
228 | "resumeChat": "\u099a\u09cd\u09af\u09be\u099f \u09aa\u09c1\u09a8\u09b0\u09be\u09af\u09bc \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09c1\u09a8"
229 | }
230 | }
231 | }
--------------------------------------------------------------------------------
/app/.chainlit/translations/en-US.json:
--------------------------------------------------------------------------------
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 occurred"
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 | "used": "Used"
45 | },
46 | "auth": {
47 | "authLogin": {
48 | "title": "Login to access the app.",
49 | "form": {
50 | "email": "Email address",
51 | "password": "Password",
52 | "noAccount": "Don't have an account?",
53 | "alreadyHaveAccount": "Already have an account?",
54 | "signup": "Sign Up",
55 | "signin": "Sign In",
56 | "or": "OR",
57 | "continue": "Continue",
58 | "forgotPassword": "Forgot password?",
59 | "passwordMustContain": "Your password must contain:",
60 | "emailRequired": "email is a required field",
61 | "passwordRequired": "password is a required field"
62 | },
63 | "error": {
64 | "default": "Unable to sign in.",
65 | "signin": "Try signing in with a different account.",
66 | "oauthsignin": "Try signing in with a different account.",
67 | "redirect_uri_mismatch": "The redirect URI is not matching the oauth app configuration.",
68 | "oauthcallbackerror": "Try signing in with a different account.",
69 | "oauthcreateaccount": "Try signing in with a different account.",
70 | "emailcreateaccount": "Try signing in with a different account.",
71 | "callback": "Try signing in with a different account.",
72 | "oauthaccountnotlinked": "To confirm your identity, sign in with the same account you used originally.",
73 | "emailsignin": "The e-mail could not be sent.",
74 | "emailverify": "Please verify your email, a new email has been sent.",
75 | "credentialssignin": "Sign in failed. Check the details you provided are correct.",
76 | "sessionrequired": "Please sign in to access this page."
77 | }
78 | },
79 | "authVerifyEmail": {
80 | "almostThere": "You're almost there! We've sent an email to ",
81 | "verifyEmailLink": "Please click on the link in that email to complete your signup.",
82 | "didNotReceive": "Can't find the email?",
83 | "resendEmail": "Resend email",
84 | "goBack": "Go Back",
85 | "emailSent": "Email sent successfully.",
86 | "verifyEmail": "Verify your email address"
87 | },
88 | "providerButton": {
89 | "continue": "Continue with {{provider}}",
90 | "signup": "Sign up with {{provider}}"
91 | },
92 | "authResetPassword": {
93 | "newPasswordRequired": "New password is a required field",
94 | "passwordsMustMatch": "Passwords must match",
95 | "confirmPasswordRequired": "Confirm password is a required field",
96 | "newPassword": "New password",
97 | "confirmPassword": "Confirm password",
98 | "resetPassword": "Reset Password"
99 | },
100 | "authForgotPassword": {
101 | "email": "Email address",
102 | "emailRequired": "email is a required field",
103 | "emailSent": "Please check the email address {{email}} for instructions to reset your password.",
104 | "enterEmail": "Enter your email address and we will send you instructions to reset your password.",
105 | "resendEmail": "Resend email",
106 | "continue": "Continue",
107 | "goBack": "Go Back"
108 | }
109 | }
110 | },
111 | "organisms": {
112 | "chat": {
113 | "history": {
114 | "index": {
115 | "showHistory": "Show history",
116 | "lastInputs": "Last Inputs",
117 | "noInputs": "Such empty...",
118 | "loading": "Loading..."
119 | }
120 | },
121 | "inputBox": {
122 | "input": {
123 | "placeholder": "Type your message here..."
124 | },
125 | "speechButton": {
126 | "start": "Start recording",
127 | "stop": "Stop recording",
128 | "loading": "Connecting"
129 | },
130 | "SubmitButton": {
131 | "sendMessage": "Send message",
132 | "stopTask": "Stop Task"
133 | },
134 | "UploadButton": {
135 | "attachFiles": "Attach files"
136 | },
137 | "waterMark": {
138 | "text": "Built with"
139 | }
140 | },
141 | "Messages": {
142 | "index": {
143 | "running": "Running",
144 | "executedSuccessfully": "executed successfully",
145 | "failed": "failed",
146 | "feedbackUpdated": "Feedback updated",
147 | "updating": "Updating"
148 | }
149 | },
150 | "dropScreen": {
151 | "dropYourFilesHere": "Drop your files here"
152 | },
153 | "index": {
154 | "failedToUpload": "Failed to upload",
155 | "cancelledUploadOf": "Cancelled upload of",
156 | "couldNotReachServer": "Could not reach the server",
157 | "continuingChat": "Continuing previous chat"
158 | },
159 | "settings": {
160 | "settingsPanel": "Settings panel",
161 | "reset": "Reset",
162 | "cancel": "Cancel",
163 | "confirm": "Confirm"
164 | }
165 | },
166 | "threadHistory": {
167 | "sidebar": {
168 | "filters": {
169 | "FeedbackSelect": {
170 | "feedbackAll": "Feedback: All",
171 | "feedbackPositive": "Feedback: Positive",
172 | "feedbackNegative": "Feedback: Negative"
173 | },
174 | "SearchBar": {
175 | "search": "Search"
176 | }
177 | },
178 | "DeleteThreadButton": {
179 | "confirmMessage": "This will delete the thread as well as it's messages and elements.",
180 | "cancel": "Cancel",
181 | "confirm": "Confirm",
182 | "deletingChat": "Deleting chat",
183 | "chatDeleted": "Chat deleted"
184 | },
185 | "index": {
186 | "pastChats": "Past Chats"
187 | },
188 | "ThreadList": {
189 | "empty": "Empty...",
190 | "today": "Today",
191 | "yesterday": "Yesterday",
192 | "previous7days": "Previous 7 days",
193 | "previous30days": "Previous 30 days"
194 | },
195 | "TriggerButton": {
196 | "closeSidebar": "Close sidebar",
197 | "openSidebar": "Open sidebar"
198 | }
199 | },
200 | "Thread": {
201 | "backToChat": "Go back to chat",
202 | "chatCreatedOn": "This chat was created on"
203 | }
204 | },
205 | "header": {
206 | "chat": "Chat",
207 | "readme": "Readme"
208 | }
209 | }
210 | },
211 | "hooks": {
212 | "useLLMProviders": {
213 | "failedToFetchProviders": "Failed to fetch providers:"
214 | }
215 | },
216 | "pages": {
217 | "Design": {},
218 | "Env": {
219 | "savedSuccessfully": "Saved successfully",
220 | "requiredApiKeys": "Required API Keys",
221 | "requiredApiKeysInfo": "To use this app, the following API keys are required. The keys are stored on your device's local storage."
222 | },
223 | "Page": {
224 | "notPartOfProject": "You are not part of this project."
225 | },
226 | "ResumeButton": {
227 | "resumeChat": "Resume Chat"
228 | }
229 | }
230 | }
--------------------------------------------------------------------------------
/app/.chainlit/translations/gu.json:
--------------------------------------------------------------------------------
1 | {
2 | "components": {
3 | "atoms": {
4 | "buttons": {
5 | "userButton": {
6 | "menu": {
7 | "settings": "\u0ab8\u0ac1\u0aaf\u0acb\u0a9c\u0aa8\u0acb",
8 | "settingsKey": "S",
9 | "APIKeys": "API \u0a95\u0ac0\u0a93",
10 | "logout": "\u0aac\u0ab9\u0abe\u0ab0 \u0aa8\u0ac0\u0a95\u0ab3\u0acb"
11 | }
12 | }
13 | }
14 | },
15 | "molecules": {
16 | "newChatButton": {
17 | "newChat": "\u0aa8\u0ab5\u0acb \u0ab8\u0a82\u0ab5\u0abe\u0aa6"
18 | },
19 | "tasklist": {
20 | "TaskList": {
21 | "title": "\ud83d\uddd2\ufe0f \u0a95\u0abe\u0ab0\u0acd\u0aaf \u0aaf\u0abe\u0aa6\u0ac0",
22 | "loading": "\u0ab2\u0acb\u0aa1 \u0a95\u0ab0\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac7...",
23 | "error": "\u0aad\u0ac2\u0ab2 \u0a89\u0aa6\u0acd\u0aad\u0ab5\u0ac0"
24 | }
25 | },
26 | "attachments": {
27 | "cancelUpload": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0ac1\u0a82 \u0ab0\u0aa6 \u0a95\u0ab0\u0acb",
28 | "removeAttachment": "\u0a9c\u0acb\u0aa1\u0abe\u0aa3\u0aa8\u0ac7 \u0aa6\u0ac2\u0ab0 \u0a95\u0ab0\u0acb"
29 | },
30 | "newChatDialog": {
31 | "createNewChat": "\u0ab6\u0ac1\u0a82 \u0aa8\u0ab5\u0ac1\u0a82 \u0ab8\u0a82\u0ab5\u0abe\u0aa6 \u0aac\u0aa8\u0abe\u0ab5\u0ab5\u0ac1\u0a82 \u0a9b\u0ac7?",
32 | "clearChat": "\u0a86 \u0ab5\u0ab0\u0acd\u0aa4\u0aae\u0abe\u0aa8 \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0abe\u0a93\u0aa8\u0ac7 \u0ab8\u0abe\u0aab \u0a95\u0ab0\u0ab6\u0ac7 \u0a85\u0aa8\u0ac7 \u0aa8\u0ab5\u0ac0 \u0ab5\u0abe\u0aa4\u0a9a\u0ac0\u0aa4 \u0ab6\u0ab0\u0ac2 \u0a95\u0ab0\u0ab6\u0ac7.",
33 | "cancel": "\u0ab0\u0aa6\u0acd\u0aa6",
34 | "confirm": "\u0a96\u0abe\u0aa4\u0ab0\u0ac0 \u0a95\u0ab0\u0acb"
35 | },
36 | "settingsModal": {
37 | "settings": "\u0ab8\u0ac1\u0aaf\u0acb\u0a9c\u0aa8\u0acb",
38 | "expandMessages": "\u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0abe\u0a93 \u0ab5\u0abf\u0ab8\u0acd\u0aa4\u0ac3\u0aa4 \u0a95\u0ab0\u0acb",
39 | "hideChainOfThought": "\u0ab5\u0abf\u0a9a\u0abe\u0ab0\u0aa8\u0ac0 \u0ab8\u0abe\u0a82\u0a95\u0ab3 \u0a9b\u0ac1\u0aaa\u0abe\u0ab5\u0acb",
40 | "darkMode": "\u0a98\u0abe\u0a9f\u0ac0 \u0ab8\u0acd\u0aa5\u0abf\u0aa4\u0abf"
41 | },
42 | "detailsButton": {
43 | "using": "\u0ab5\u0abe\u0aaa\u0ab0\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f",
44 | "running": "\u0a9a\u0abe\u0ab2\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1 \u0a9b\u0ac7",
45 | "took_one": "{{count}} \u0aaa\u0a97\u0ab2\u0ac1\u0a82 \u0aad\u0ab0\u0acd\u0aaf\u0ac1\u0a82",
46 | "took_other": "{{count}} \u0aaa\u0a97\u0ab2\u0abe\u0a82\u0a93 \u0ab2\u0ac0\u0aa7\u0abe"
47 | },
48 | "auth": {
49 | "authLogin": {
50 | "title": "\u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8\u0aa8\u0ac7 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0ab2\u0acb\u0a97\u0abf\u0aa8 \u0a95\u0ab0\u0acb.",
51 | "form": {
52 | "email": "\u0a88-\u0aae\u0ac7\u0a88\u0ab2 \u0ab8\u0ab0\u0aa8\u0abe\u0aae\u0ac1\u0a82",
53 | "password": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1",
54 | "noAccount": "\u0a96\u0abe\u0aa4\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0?",
55 | "alreadyHaveAccount": "\u0aaa\u0ab9\u0ac7\u0ab2\u0ac7\u0aa5\u0ac0 \u0a9c \u0a96\u0abe\u0aa4\u0ac1\u0a82 \u0a9b\u0ac7?",
56 | "signup": "\u0ab8\u0abe\u0a87\u0aa8 \u0a85\u0aaa \u0a95\u0ab0\u0acb",
57 | "signin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb",
58 | "or": "\u0a85\u0aa5\u0ab5\u0abe",
59 | "continue": "\u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb",
60 | "forgotPassword": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0aad\u0ac2\u0ab2\u0ac0 \u0a97\u0aaf\u0abe?",
61 | "passwordMustContain": "\u0aa4\u0aae\u0abe\u0ab0\u0acb \u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0ab8\u0aae\u0abe\u0ab5\u0aa4\u0acb \u0a9c \u0ab9\u0acb\u0ab5\u0acb \u0a9c\u0acb\u0a87\u0a8f:",
62 | "emailRequired": "\u0a88-\u0aae\u0ac7\u0a88\u0ab2 \u0a8f \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a95\u0acd\u0ab7\u0ac7\u0aa4\u0acd\u0ab0 \u0a9b\u0ac7",
63 | "passwordRequired": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0a8f \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a95\u0acd\u0ab7\u0ac7\u0aa4\u0acd\u0ab0 \u0a9b\u0ac7"
64 | },
65 | "error": {
66 | "default": "\u0aaa\u0acd\u0ab0\u0ab5\u0ac7\u0ab6 \u0a95\u0ab0\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0a85\u0ab8\u0aae\u0ab0\u0acd\u0aa5.",
67 | "signin": "\u0a85\u0ab2\u0a97 \u0a96\u0abe\u0aa4\u0abe \u0ab8\u0abe\u0aa5\u0ac7 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0aa4\u0acd\u0aa8 \u0a95\u0ab0\u0acb.",
68 | "oauthsignin": "\u0a85\u0ab2\u0a97 \u0a96\u0abe\u0aa4\u0abe \u0ab8\u0abe\u0aa5\u0ac7 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0aa4\u0acd\u0aa8 \u0a95\u0ab0\u0acb.",
69 | "redirect_uri_mismatch": "\u0ab0\u0ac0\u0aa1\u0abe\u0aaf\u0ab0\u0ac7\u0a95\u0acd\u0a9f URI \u0a8f oauth \u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0ab0\u0ac2\u0aaa\u0ab0\u0ac7\u0a96\u0abe\u0a82\u0a95\u0aa8 \u0ab8\u0abe\u0aa5\u0ac7 \u0aac\u0a82\u0aa7\u0aac\u0ac7\u0ab8\u0aa4\u0ac0 \u0aa8\u0aa5\u0ac0.",
70 | "oauthcallbackerror": "\u0a85\u0ab2\u0a97 \u0a96\u0abe\u0aa4\u0abe \u0ab8\u0abe\u0aa5\u0ac7 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0aa4\u0acd\u0aa8 \u0a95\u0ab0\u0acb.",
71 | "oauthcreateaccount": "\u0a85\u0ab2\u0a97 \u0a96\u0abe\u0aa4\u0abe \u0ab8\u0abe\u0aa5\u0ac7 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0aa4\u0acd\u0aa8 \u0a95\u0ab0\u0acb.",
72 | "emailcreateaccount": "\u0a85\u0ab2\u0a97 \u0a96\u0abe\u0aa4\u0abe \u0ab8\u0abe\u0aa5\u0ac7 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0aa4\u0acd\u0aa8 \u0a95\u0ab0\u0acb.",
73 | "callback": "\u0a85\u0ab2\u0a97 \u0a96\u0abe\u0aa4\u0abe \u0ab8\u0abe\u0aa5\u0ac7 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0aa4\u0acd\u0aa8 \u0a95\u0ab0\u0acb.",
74 | "oauthaccountnotlinked": "\u0aa4\u0aae\u0abe\u0ab0\u0ac0 \u0a93\u0ab3\u0a96\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aa4\u0aae\u0ac7 \u0a9c\u0ac7 \u0aae\u0ac2\u0ab3\u0aad\u0ac2\u0aa4 \u0ab0\u0ac0\u0aa4\u0ac7 \u0a89\u0aaa\u0aaf\u0acb\u0a97 \u0a95\u0ab0\u0acd\u0aaf\u0acb \u0ab9\u0aa4\u0acb \u0aa4\u0ac7 \u0a9c \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f \u0ab8\u0abe\u0aa5\u0ac7 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb.",
75 | "emailsignin": "\u0a88-\u0aae\u0ac7\u0a88\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0acb \u0aa8\u0ab9\u0abf.",
76 | "emailverify": "\u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0\u0aa8\u0ac7 \u0aa4\u0aae\u0abe\u0ab0\u0abe \u0a87\u0aae\u0ac7\u0a87\u0ab2\u0aa8\u0ac0 \u0a96\u0abe\u0aa4\u0acd\u0ab0\u0ac0 \u0a95\u0ab0\u0acb, \u0a8f\u0a95 \u0aa8\u0ab5\u0ac1\u0a82 \u0a87\u0aae\u0ac7\u0a87\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0a86\u0ab5\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7.",
77 | "credentialssignin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3. \u0aa4\u0aae\u0ac7 \u0aaa\u0ac2\u0ab0\u0ac0 \u0aaa\u0abe\u0aa1\u0ac7\u0ab2\u0ac0 \u0ab5\u0abf\u0a97\u0aa4\u0acb \u0ab8\u0abe\u0a9a\u0ac0 \u0a9b\u0ac7 \u0aa4\u0ac7 \u0a9a\u0a95\u0abe\u0ab8\u0acb.",
78 | "sessionrequired": "\u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0\u0aa8\u0ac7 \u0a86 \u0aaa\u0ac3\u0ab7\u0acd\u0aa0\u0aa8\u0ac7 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb."
79 | }
80 | },
81 | "authVerifyEmail": {
82 | "almostThere": "\u0aa4\u0aae\u0ac7 \u0aa4\u0acb \u0ab2\u0a97\u0aad\u0a97 \u0aa4\u0acd\u0aaf\u0abe\u0a82 \u0a9c \u0a9b\u0acb! \u0a85\u0aae\u0ac7 \u0a86\u0aa8\u0abe \u0aaa\u0ab0 \u0a87\u0aae\u0ac7\u0a87\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0acd\u0aaf\u0acb \u0a9b\u0ac7 ",
83 | "verifyEmailLink": "\u0aa4\u0aae\u0abe\u0ab0\u0ac1\u0a82 \u0ab8\u0abe\u0a87\u0aa8\u0a85\u0aaa \u0aaa\u0ac2\u0ab0\u0acd\u0aa3 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0\u0aa8\u0ac7 \u0aa4\u0ac7 \u0a87\u0aae\u0ac7\u0a87\u0ab2\u0aa8\u0ac0 \u0ab2\u0abf\u0a82\u0a95 \u0aaa\u0ab0 \u0a95\u0acd\u0ab2\u0abf\u0a95 \u0a95\u0ab0\u0acb.",
84 | "didNotReceive": "\u0a88-\u0aae\u0ac7\u0a88\u0ab2 \u0ab6\u0acb\u0aa7\u0ac0 \u0ab6\u0a95\u0aa4\u0abe \u0aa8\u0aa5\u0ac0?",
85 | "resendEmail": "\u0a87\u0aae\u0ac7\u0a87\u0ab2 \u0aab\u0ab0\u0ac0 \u0aae\u0acb\u0a95\u0ab2\u0acb",
86 | "goBack": "\u0aaa\u0abe\u0a9b\u0abe \u0a9c\u0abe\u0a93",
87 | "emailSent": "\u0a88-\u0aae\u0ac7\u0a88\u0ab2 \u0ab8\u0aab\u0ab3\u0aa4\u0abe\u0aaa\u0ac2\u0ab0\u0acd\u0ab5\u0a95 \u0aae\u0acb\u0a95\u0ab2\u0abe\u0a88 \u0a97\u0aaf\u0acb.",
88 | "verifyEmail": "\u0aa4\u0aae\u0abe\u0ab0\u0abe \u0a87\u0aae\u0ac7\u0a87\u0ab2 \u0a8f\u0aa1\u0acd\u0ab0\u0ac7\u0ab8\u0aa8\u0ac0 \u0a96\u0abe\u0aa4\u0acd\u0ab0\u0ac0 \u0a95\u0ab0\u0acb"
89 | },
90 | "providerButton": {
91 | "continue": "{{provider}} \u0ab8\u0abe\u0aa5\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb",
92 | "signup": "{{provider}} \u0ab8\u0abe\u0aa5\u0ac7 \u0ab8\u0abe\u0a87\u0aa8 \u0a85\u0aaa \u0a95\u0ab0\u0acb"
93 | },
94 | "authResetPassword": {
95 | "newPasswordRequired": "\u0aa8\u0ab5\u0acb \u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0a8f \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a95\u0acd\u0ab7\u0ac7\u0aa4\u0acd\u0ab0 \u0a9b\u0ac7",
96 | "passwordsMustMatch": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1\u0acb \u0aac\u0a82\u0aa7\u0aac\u0ac7\u0ab8\u0aa4\u0abe \u0a9c \u0ab9\u0acb\u0ab5\u0abe \u0a9c\u0acb\u0a88\u0a8f",
97 | "confirmPasswordRequired": "\u0a96\u0abe\u0aa4\u0ab0\u0ac0 \u0a95\u0ab0\u0acb \u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0a8f \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a95\u0acd\u0ab7\u0ac7\u0aa4\u0acd\u0ab0 \u0a9b\u0ac7",
98 | "newPassword": "\u0aa8\u0ab5\u0acb \u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1",
99 | "confirmPassword": "\u0a96\u0abe\u0aa4\u0ab0\u0ac0 \u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1",
100 | "resetPassword": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1\u0aa8\u0ac7 \u0aaa\u0ac1\u0aa8:\u0ab8\u0ac1\u0aaf\u0acb\u0a9c\u0abf\u0aa4 \u0a95\u0ab0\u0acb"
101 | },
102 | "authForgotPassword": {
103 | "email": "\u0a88-\u0aae\u0ac7\u0a88\u0ab2 \u0ab8\u0ab0\u0aa8\u0abe\u0aae\u0ac1\u0a82",
104 | "emailRequired": "\u0a88-\u0aae\u0ac7\u0a88\u0ab2 \u0a8f \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a95\u0acd\u0ab7\u0ac7\u0aa4\u0acd\u0ab0 \u0a9b\u0ac7",
105 | "emailSent": "\u0ab8\u0ac2\u0a9a\u0aa8\u0abe\u0a93 \u0aae\u0abe\u0a9f\u0ac7 \u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0\u0aa8\u0ac7 \u0aa4\u0aae\u0abe\u0ab0\u0ac1\u0a82 \u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0ab0\u0abf\u0ab8\u0ac5\u0a9f \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0a87\u0aae\u0ac7\u0a87\u0ab2 \u0a8f\u0aa1\u0acd\u0ab0\u0ac7\u0ab8 {{email}} \u0a9a\u0a95\u0abe\u0ab8\u0acb.",
106 | "enterEmail": "\u0aa4\u0aae\u0abe\u0ab0\u0ac1\u0a82 \u0a87\u0aae\u0ac7\u0a87\u0ab2 \u0a8f\u0aa1\u0acd\u0ab0\u0ac7\u0ab8 \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb \u0a85\u0aa8\u0ac7 \u0a85\u0aae\u0ac7 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0ab0\u0ac0\u0ab8\u0ac7\u0a9f \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0aa4\u0aae\u0aa8\u0ac7 \u0ab8\u0ac2\u0a9a\u0aa8\u0abe\u0a93 \u0aae\u0acb\u0a95\u0ab2\u0ac0\u0ab6\u0ac1\u0a82.",
107 | "resendEmail": "\u0a87\u0aae\u0ac7\u0a87\u0ab2 \u0aab\u0ab0\u0ac0 \u0aae\u0acb\u0a95\u0ab2\u0acb",
108 | "continue": "\u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb",
109 | "goBack": "\u0aaa\u0abe\u0a9b\u0abe \u0a9c\u0abe\u0a93"
110 | }
111 | }
112 | },
113 | "organisms": {
114 | "chat": {
115 | "history": {
116 | "index": {
117 | "showHistory": "\u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0aac\u0aa4\u0abe\u0ab5\u0acb",
118 | "lastInputs": "\u0a9b\u0ac7\u0ab2\u0acd\u0ab2\u0abe \u0a87\u0aa8\u0aaa\u0ac1\u0a9f\u0acd\u0ab8",
119 | "noInputs": "\u0a86\u0ab5\u0abe \u0a96\u0abe\u0ab2\u0ac0...",
120 | "loading": "\u0ab2\u0acb\u0aa1 \u0a95\u0ab0\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac7..."
121 | }
122 | },
123 | "inputBox": {
124 | "input": {
125 | "placeholder": "\u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0acb \u0a85\u0ab9\u0ac0\u0a82 \u0a9f\u0abe\u0a87\u0aaa \u0a95\u0ab0\u0acb..."
126 | },
127 | "speechButton": {
128 | "start": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0ac1\u0a82 \u0ab6\u0ab0\u0ac2 \u0a95\u0ab0\u0acb",
129 | "stop": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0ac1\u0a82 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb"
130 | },
131 | "SubmitButton": {
132 | "sendMessage": "\u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0acb \u0aae\u0acb\u0a95\u0ab2\u0acb",
133 | "stopTask": "\u0a95\u0abe\u0ab0\u0acd\u0aaf\u0aa8\u0ac7 \u0a85\u0a9f\u0a95\u0abe\u0ab5\u0acb"
134 | },
135 | "UploadButton": {
136 | "attachFiles": "\u0aab\u0abe\u0a87\u0ab2\u0acb\u0aa8\u0ac7 \u0a9c\u0acb\u0aa1\u0acb"
137 | },
138 | "waterMark": {
139 | "text": "\u0aa8\u0ac0 \u0ab8\u0abe\u0aa5\u0ac7 \u0aac\u0abf\u0ab2\u0acd\u0a9f \u0aa5\u0aaf\u0ac7\u0ab2"
140 | }
141 | },
142 | "Messages": {
143 | "index": {
144 | "running": "\u0a9a\u0abe\u0ab2\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1 \u0a9b\u0ac7",
145 | "executedSuccessfully": "\u0ab8\u0aab\u0ab3\u0aa4\u0abe\u0aaa\u0ac2\u0ab0\u0acd\u0ab5\u0a95 \u0a9a\u0ab2\u0abe\u0ab5\u0acd\u0aaf\u0ac7\u0ab2 \u0a9b\u0ac7",
146 | "failed": "\u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3",
147 | "feedbackUpdated": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0ac1\u0aa7\u0abe\u0ab0\u0ac7\u0ab2 \u0a9b\u0ac7",
148 | "updating": "\u0ab8\u0ac1\u0aa7\u0abe\u0ab0\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f"
149 | }
150 | },
151 | "dropScreen": {
152 | "dropYourFilesHere": "\u0aa4\u0aae\u0abe\u0ab0\u0ac0 \u0aab\u0abe\u0a87\u0ab2\u0acb\u0aa8\u0ac7 \u0a85\u0a82\u0ab9\u0abf \u0aae\u0ac2\u0a95\u0acb"
153 | },
154 | "index": {
155 | "failedToUpload": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0a95\u0ab0\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3",
156 | "cancelledUploadOf": "\u0aa8\u0ac1\u0a82 \u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0ab0\u0aa6 \u0aa5\u0aaf\u0ac7\u0ab2 \u0a9b\u0ac7",
157 | "couldNotReachServer": "\u0ab8\u0ab0\u0acd\u0ab5\u0ab0 \u0ab8\u0ac1\u0aa7\u0ac0 \u0aaa\u0ab9\u0acb\u0a82\u0a9a\u0ac0 \u0ab6\u0a95\u0acd\u0aaf\u0abe \u0aa8\u0ab9\u0abf\u0a82",
158 | "continuingChat": "\u0aaa\u0ab9\u0ac7\u0ab2\u0abe\u0aa8\u0ac0 \u0ab5\u0abe\u0aa4\u0a9a\u0ac0\u0aa4\u0aa8\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac7"
159 | },
160 | "settings": {
161 | "settingsPanel": "\u0aaa\u0ac7\u0aa8\u0ab2 \u0ab8\u0ac1\u0aaf\u0acb\u0a9c\u0aa8\u0acb",
162 | "reset": "\u0aaa\u0ac1\u0aa8:\u0ab8\u0ac1\u0aaf\u0acb\u0a9c\u0abf\u0aa4 \u0a95\u0ab0\u0acb",
163 | "cancel": "\u0ab0\u0aa6\u0acd\u0aa6",
164 | "confirm": "\u0a96\u0abe\u0aa4\u0ab0\u0ac0 \u0a95\u0ab0\u0acb"
165 | }
166 | },
167 | "threadHistory": {
168 | "sidebar": {
169 | "filters": {
170 | "FeedbackSelect": {
171 | "feedbackAll": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6: \u0aac\u0aa7\u0abe",
172 | "feedbackPositive": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6: \u0ab9\u0a95\u0abe\u0ab0\u0abe\u0aa4\u0acd\u0aae\u0a95",
173 | "feedbackNegative": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6: \u0aa8\u0a95\u0abe\u0ab0\u0abe\u0aa4\u0acd\u0aae\u0a95"
174 | },
175 | "SearchBar": {
176 | "search": "\u0ab6\u0acb\u0aa7\u0ab5\u0ac1\u0a82"
177 | }
178 | },
179 | "DeleteThreadButton": {
180 | "confirmMessage": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac0 \u0ab8\u0abe\u0aa5\u0ac7 \u0ab8\u0abe\u0aa5\u0ac7 \u0aa4\u0ac7\u0aa8\u0abe \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0abe \u0a85\u0aa8\u0ac7 \u0aa4\u0aa4\u0acd\u0ab5\u0acb\u0aa8\u0ac7 \u0aaa\u0aa3 \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab6\u0ac7.",
181 | "cancel": "\u0ab0\u0aa6\u0acd\u0aa6",
182 | "confirm": "\u0a96\u0abe\u0aa4\u0ab0\u0ac0 \u0a95\u0ab0\u0acb",
183 | "deletingChat": "\u0a9a\u0ac5\u0a9f\u0aa8\u0ac7 \u0a95\u0abe\u0aa2\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f",
184 | "chatDeleted": "\u0a9a\u0ac5\u0a9f \u0aa1\u0abf\u0ab2\u0ac0\u0a9f \u0aa5\u0a88 \u0a97\u0a88"
185 | },
186 | "index": {
187 | "pastChats": "\u0aad\u0ac2\u0aa4\u0a95\u0abe\u0ab3\u0aa8\u0ac0 \u0ab5\u0abe\u0aa4\u0a9a\u0ac0\u0aa4\u0acb"
188 | },
189 | "ThreadList": {
190 | "empty": "\u0a96\u0abe\u0ab2\u0ac0...",
191 | "today": "\u0a86\u0a9c\u0ac7",
192 | "yesterday": "\u0a97\u0a87\u0a95\u0abe\u0ab2\u0ac7",
193 | "previous7days": "\u0aaa\u0ab9\u0ac7\u0ab2\u0abe\u0aa8\u0abe \u0aed \u0aa6\u0abf\u0ab5\u0ab8\u0acb",
194 | "previous30days": "\u0aaa\u0ab9\u0ac7\u0ab2\u0abe\u0aa8\u0abe \u0ae9\u0ae6 \u0aa6\u0abf\u0ab5\u0ab8\u0acb"
195 | },
196 | "TriggerButton": {
197 | "closeSidebar": "\u0aac\u0abe\u0a9c\u0ac1\u0aaa\u0a9f\u0acd\u0a9f\u0ac0\u0aa8\u0ac7 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb",
198 | "openSidebar": "\u0aac\u0abe\u0a9c\u0ac1\u0aaa\u0a9f\u0acd\u0a9f\u0ac0 \u0a96\u0acb\u0ab2\u0acb"
199 | }
200 | },
201 | "Thread": {
202 | "backToChat": "\u0ab8\u0a82\u0ab5\u0abe\u0aa6\u0aae\u0abe\u0a82 \u0aaa\u0abe\u0a9b\u0abe \u0a9c\u0abe\u0a93",
203 | "chatCreatedOn": "\u0a86 \u0ab5\u0abe\u0aa4\u0a9a\u0ac0\u0aa4 \u0aa4\u0ac7\u0aa8\u0ac0 \u0aaa\u0ab0 \u0aac\u0aa8\u0abe\u0ab5\u0ac7\u0ab2 \u0ab9\u0aa4\u0ac0"
204 | }
205 | },
206 | "header": {
207 | "chat": "\u0ab8\u0a82\u0ab5\u0abe\u0aa6",
208 | "readme": "\u0ab0\u0ac0\u0aa1\u0aae\u0ac7"
209 | }
210 | }
211 | },
212 | "hooks": {
213 | "useLLMProviders": {
214 | "failedToFetchProviders": "\u0aaa\u0acd\u0ab0\u0aa6\u0abe\u0aa4\u0abe\u0a93\u0aa8\u0ac7 \u0ab2\u0abe\u0ab5\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3\u0aa4\u0abe:"
215 | }
216 | },
217 | "pages": {
218 | "Design": {},
219 | "Env": {
220 | "savedSuccessfully": "\u0ab8\u0aab\u0ab3\u0aa4\u0abe\u0aaa\u0ac2\u0ab0\u0acd\u0ab5\u0a95 \u0ab8\u0a82\u0a97\u0acd\u0ab0\u0ab9\u0abe\u0aaf\u0ac7\u0ab2",
221 | "requiredApiKeys": "\u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 API \u0a95\u0ac0\u0a93",
222 | "requiredApiKeysInfo": "\u0a86 \u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8\u0aa8\u0acb \u0a89\u0aaa\u0aaf\u0acb\u0a97 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aa8\u0ac0\u0a9a\u0ac7\u0aa8\u0ac0 API \u0a95\u0ac0\u0a93 \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a9b\u0ac7. \u0a95\u0ac0\u0a93 \u0aa4\u0aae\u0abe\u0ab0\u0abe \u0aa1\u0abf\u0ab5\u0abe\u0a87\u0ab8\u0aa8\u0abe \u0ab8\u0acd\u0aa5\u0abe\u0aa8\u0abf\u0a95 \u0ab8\u0acd\u0a9f\u0acb\u0ab0\u0ac7\u0a9c \u0aaa\u0ab0 \u0ab8\u0a82\u0a97\u0acd\u0ab0\u0ab9\u0abf\u0aa4 \u0aa5\u0abe\u0aaf \u0a9b\u0ac7."
223 | },
224 | "Page": {
225 | "notPartOfProject": "\u0aa4\u0aae\u0ac7 \u0a86 \u0aaa\u0acd\u0ab0\u0acb\u0a9c\u0ac7\u0a95\u0acd\u0a9f\u0aa8\u0acb \u0aad\u0abe\u0a97 \u0aa8\u0aa5\u0ac0."
226 | },
227 | "ResumeButton": {
228 | "resumeChat": "\u0aab\u0ab0\u0ac0 \u0ab6\u0ab0\u0ac2 \u0a95\u0ab0\u0acb \u0ab8\u0a82\u0ab5\u0abe\u0aa6"
229 | }
230 | }
231 | }
--------------------------------------------------------------------------------
/app/.chainlit/translations/he-IL.json:
--------------------------------------------------------------------------------
1 | {
2 | "components": {
3 | "atoms": {
4 | "buttons": {
5 | "userButton": {
6 | "menu": {
7 | "settings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea",
8 | "settingsKey": "S",
9 | "APIKeys": "API Keys",
10 | "logout": "\u05d4\u05ea\u05e0\u05ea\u05e7"
11 | }
12 | }
13 | }
14 | },
15 | "molecules": {
16 | "newChatButton": {
17 | "newChat": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9"
18 | },
19 | "tasklist": {
20 | "TaskList": {
21 | "title": "\ud83d\uddd2\ufe0f Task List",
22 | "loading": "\u05d8\u05d5\u05e2\u05df...",
23 | "error": "\u05e9\u05d2\u05d9\u05d0\u05d4"
24 | }
25 | },
26 | "attachments": {
27 | "cancelUpload": "\u05d1\u05d8\u05dc \u05d4\u05e2\u05dc\u05d0\u05d4",
28 | "removeAttachment": "\u05d4\u05e1\u05e8 \u05e7\u05d5\u05d1\u05e5 \u05de\u05e6\u05d5\u05e8\u05e3"
29 | },
30 | "newChatDialog": {
31 | "createNewChat": "\u05e6\u05d5\u05e8 \u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9?",
32 | "clearChat": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05e0\u05e7\u05d4 \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05d5\u05ea \u05d5\u05ea\u05ea\u05d7\u05d9\u05dc \u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9.",
33 | "cancel": "\u05d1\u05d8\u05dc",
34 | "confirm": "\u05d0\u05e9\u05e8"
35 | },
36 | "settingsModal": {
37 | "settings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea",
38 | "expandMessages": "\u05d4\u05e8\u05d7\u05d1 \u05d4\u05d5\u05d3\u05e2\u05d5\u05ea",
39 | "hideChainOfThought": "\u05d4\u05e1\u05ea\u05e8 \u05e9\u05e8\u05e9\u05e8\u05ea \u05de\u05d7\u05e9\u05d1\u05d5\u05ea",
40 | "darkMode": "\u05de\u05e6\u05d1 \u05db\u05d4\u05d4"
41 | },
42 | "detailsButton": {
43 | "using": "\u05de\u05e9\u05ea\u05de\u05e9 \u05d1-",
44 | "running": "\u05e8\u05e5",
45 | "took_one": "\u05dc\u05e7\u05d7 \u05e6\u05e2\u05d3 {{count}}",
46 | "took_other": "\u05dc\u05e7\u05d7 \u05e6\u05e2\u05d3\u05d9\u05dd {{count}}"
47 | },
48 | "auth": {
49 | "authLogin": {
50 | "title": "\u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4.",
51 | "form": {
52 | "email": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05d9\u05de\u05d9\u05d9\u05dc",
53 | "password": "\u05e1\u05d9\u05e1\u05de\u05d0",
54 | "noAccount": "\u05d0\u05d9\u05df \u05dc\u05da \u05d7\u05e9\u05d1\u05d5\u05df?",
55 | "alreadyHaveAccount": "\u05db\u05d1\u05e8 \u05d9\u05e9 \u05dc\u05da \u05d7\u05e9\u05d1\u05d5\u05df?",
56 | "signup": "\u05d4\u05d9\u05e8\u05e9\u05dd",
57 | "signin": "\u05d4\u05d9\u05db\u05e0\u05e1",
58 | "or": "\u05d0\u05d5",
59 | "continue": "\u05d4\u05de\u05e9\u05da",
60 | "forgotPassword": "\u05e9\u05db\u05d7\u05ea \u05e1\u05d9\u05e1\u05de\u05d4?",
61 | "passwordMustContain": "\u05d4\u05e1\u05d9\u05e1\u05de\u05d4 \u05e9\u05dc\u05da \u05d7\u05d9\u05d9\u05d1\u05ea \u05dc\u05d4\u05db\u05d9\u05dc:",
62 | "emailRequired": "\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4",
63 | "passwordRequired": "\u05e1\u05d9\u05e1\u05de\u05d4 \u05d4\u05d9\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4"
64 | },
65 | "error": {
66 | "default": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05d9\u05db\u05e0\u05e1.",
67 | "signin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05d9\u05db\u05e0\u05e1 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8.",
68 | "oauthsignin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05d9\u05db\u05e0\u05e1 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8.",
69 | "redirect_uri_mismatch": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d4-URI \u05dc\u05d4\u05e4\u05e0\u05d9\u05d4 \u05d0\u05d9\u05e0\u05d4 \u05ea\u05d5\u05d0\u05de\u05ea \u05dc\u05ea\u05e6\u05d5\u05e8\u05ea \u05d4\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4 \u05e9\u05dc oauth.",
70 | "oauthcallbackerror": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05d9\u05db\u05e0\u05e1 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8.",
71 | "oauthcreateaccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05d9\u05db\u05e0\u05e1 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8.",
72 | "emailcreateaccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05d9\u05db\u05e0\u05e1 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8.",
73 | "callback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05d9\u05db\u05e0\u05e1 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8.",
74 | "oauthaccountnotlinked": "\u05db\u05d3\u05d9 \u05dc\u05d0\u05e9\u05e8 \u05d0\u05ea \u05d6\u05d4\u05d5\u05ea\u05da, \u05d4\u05d9\u05db\u05e0\u05e1 \u05e2\u05dd \u05d0\u05d5\u05ea\u05d5 \u05d7\u05e9\u05d1\u05d5\u05df \u05e9\u05d1\u05d5 \u05d4\u05e9\u05ea\u05de\u05e9\u05ea \u05d1\u05de\u05e7\u05d5\u05e8.",
75 | "emailsignin": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc.",
76 | "emailverify": "\u05d0\u05e0\u05d0 \u05d0\u05e9\u05e8 \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05e9\u05dc\u05da, \u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d7\u05d3\u05e9 \u05e0\u05e9\u05dc\u05d7.",
77 | "credentialssignin": "\u05d4\u05db\u05e0\u05d9\u05e1\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4. \u05d1\u05d3\u05d5\u05e7 \u05e9\u05d4\u05e4\u05e8\u05d8\u05d9\u05dd \u05e9\u05e1\u05d9\u05e4\u05e7\u05ea \u05e0\u05db\u05d5\u05e0\u05d9\u05dd.",
78 | "sessionrequired": "\u05d0\u05e0\u05d0 \u05d4\u05d9\u05db\u05e0\u05e1 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d3\u05e3 \u05d6\u05d4."
79 | }
80 | },
81 | "authVerifyEmail": {
82 | "almostThere": "\u05d0\u05ea\u05d4 \u05db\u05de\u05e2\u05d8 \u05e9\u05dd! \u05e9\u05dc\u05d7\u05e0\u05d5 \u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d0\u05dc ",
83 | "verifyEmailLink": "\u05d0\u05e0\u05d0 \u05dc\u05d7\u05e5 \u05e2\u05dc \u05d4\u05e7\u05d9\u05e9\u05d5\u05e8 \u05d1\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d6\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05dc\u05d9\u05dd \u05d0\u05ea \u05d4\u05d4\u05e8\u05e9\u05de\u05d4 \u05e9\u05dc\u05da.",
84 | "didNotReceive": "\u05dc\u05d0 \u05de\u05d5\u05e6\u05d0 \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc?",
85 | "resendEmail": "\u05e9\u05dc\u05d7 \u05e9\u05d5\u05d1 \u05d0\u05d9\u05de\u05d9\u05d9\u05dc",
86 | "goBack": "\u05d7\u05d6\u05d5\u05e8 \u05d0\u05d7\u05d5\u05e8\u05d4",
87 | "emailSent": "\u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05e0\u05e9\u05dc\u05d7 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4.",
88 | "verifyEmail": "\u05d0\u05de\u05ea \u05d0\u05ea \u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05e9\u05dc\u05da"
89 | },
90 | "providerButton": {
91 | "continue": "\u05d4\u05de\u05e9\u05da \u05e2\u05dd {{provider}}",
92 | "signup": "\u05d4\u05d9\u05e8\u05e9\u05dd \u05e2\u05dd {{provider}}"
93 | },
94 | "authResetPassword": {
95 | "newPasswordRequired": "\u05e1\u05d9\u05e1\u05de\u05d4 \u05d7\u05d3\u05e9\u05d4 \u05d4\u05d9\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4",
96 | "passwordsMustMatch": "\u05d4\u05e1\u05d9\u05e1\u05de\u05d0\u05d5\u05ea \u05d7\u05d9\u05d9\u05d1\u05d5\u05ea \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd",
97 | "confirmPasswordRequired": "\u05d0\u05d9\u05e9\u05d5\u05e8 \u05e1\u05d9\u05e1\u05de\u05d4 \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4",
98 | "newPassword": "\u05e1\u05d9\u05e1\u05de\u05d0 \u05d7\u05d3\u05e9\u05d4",
99 | "confirmPassword": "\u05d0\u05e9\u05e8 \u05e1\u05d9\u05e1\u05de\u05d0",
100 | "resetPassword": "\u05d0\u05e4\u05e1 \u05e1\u05d9\u05e1\u05de\u05d4"
101 | },
102 | "authForgotPassword": {
103 | "email": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05d9\u05de\u05d9\u05d9\u05dc",
104 | "emailRequired": "\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4",
105 | "emailSent": "\u05d0\u05e0\u05d0 \u05d1\u05d3\u05d5\u05e7 \u05d0\u05ea \u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc {{email}} \u05dc\u05e7\u05d1\u05dc\u05ea \u05d4\u05d5\u05e8\u05d0\u05d5\u05ea \u05dc\u05d0\u05d9\u05e4\u05d5\u05e1 \u05d4\u05e1\u05d9\u05e1\u05de\u05d4 \u05e9\u05dc\u05da.",
106 | "enterEmail": "\u05d4\u05d6\u05df \u05d0\u05ea \u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05e9\u05dc\u05da \u05d5\u05d0\u05e0\u05d5 \u05e0\u05e9\u05dc\u05d7 \u05dc\u05da \u05d4\u05d5\u05e8\u05d0\u05d5\u05ea \u05dc\u05d0\u05d9\u05e4\u05d5\u05e1 \u05d4\u05e1\u05d9\u05e1\u05de\u05d4 \u05e9\u05dc\u05da.",
107 | "resendEmail": "\u05e9\u05dc\u05d7 \u05e9\u05d5\u05d1 \u05d0\u05d9\u05de\u05d9\u05d9\u05dc",
108 | "continue": "\u05d4\u05de\u05e9\u05da",
109 | "goBack": "\u05d7\u05d6\u05d5\u05e8 \u05d0\u05d7\u05d5\u05e8\u05d4"
110 | }
111 | }
112 | },
113 | "organisms": {
114 | "chat": {
115 | "history": {
116 | "index": {
117 | "showHistory": "\u05d4\u05e6\u05d2 \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4",
118 | "lastInputs": "\u05e7\u05dc\u05d8 \u05d0\u05d7\u05e8\u05d5\u05df",
119 | "noInputs": "\u05e8\u05d9\u05e7...",
120 | "loading": "\u05d8\u05d5\u05e2\u05df..."
121 | }
122 | },
123 | "inputBox": {
124 | "input": {
125 | "placeholder": "\u05db\u05ea\u05d5\u05d1 \u05d4\u05d5\u05d3\u05e2\u05d4 \u05db\u05d0\u05df..."
126 | },
127 | "speechButton": {
128 | "start": "\u05d4\u05ea\u05d7\u05dc \u05d4\u05e7\u05dc\u05d8\u05d4",
129 | "stop": "\u05e2\u05e6\u05d5\u05e8 \u05d4\u05e7\u05dc\u05d8\u05d4"
130 | },
131 | "SubmitButton": {
132 | "sendMessage": "\u05e9\u05dc\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4",
133 | "stopTask": "\u05e2\u05e6\u05d5\u05e8 \u05de\u05e9\u05d9\u05de\u05d4"
134 | },
135 | "UploadButton": {
136 | "attachFiles": "\u05e6\u05e8\u05e3 \u05e7\u05d1\u05e6\u05d9\u05dd"
137 | },
138 | "waterMark": {
139 | "text": "\u05e0\u05d1\u05e0\u05d4 \u05e2\u05dd"
140 | }
141 | },
142 | "Messages": {
143 | "index": {
144 | "running": "\u05e8\u05e5",
145 | "executedSuccessfully": "\u05d1\u05d5\u05e6\u05e2 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4",
146 | "failed": "\u05e0\u05db\u05e9\u05dc",
147 | "feedbackUpdated": "\u05de\u05e9\u05d5\u05d1 \u05e2\u05d5\u05d3\u05db\u05df",
148 | "updating": "\u05de\u05e2\u05d3\u05db\u05df"
149 | }
150 | },
151 | "dropScreen": {
152 | "dropYourFilesHere": "\u05e9\u05d7\u05e8\u05e8 \u05d0\u05ea \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05e9\u05dc\u05da \u05db\u05d0\u05df"
153 | },
154 | "index": {
155 | "failedToUpload": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4",
156 | "cancelledUploadOf": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e9\u05dc \u05d1\u05d5\u05d8\u05dc\u05d4",
157 | "couldNotReachServer": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05d4\u05d9\u05d4 \u05dc\u05d4\u05d2\u05d9\u05e2 \u05dc\u05e9\u05e8\u05ea",
158 | "continuingChat": "\u05de\u05de\u05e9\u05d9\u05da \u05d1\u05e6'\u05d0\u05d8 \u05d4\u05e7\u05d5\u05d3\u05dd"
159 | },
160 | "settings": {
161 | "settingsPanel": "\u05dc\u05d5\u05d7 \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea",
162 | "reset": "\u05d0\u05e4\u05e1",
163 | "cancel": "\u05d1\u05d8\u05dc",
164 | "confirm": "\u05d0\u05e9\u05e8"
165 | }
166 | },
167 | "threadHistory": {
168 | "sidebar": {
169 | "filters": {
170 | "FeedbackSelect": {
171 | "feedbackAll": "\u05de\u05e9\u05d5\u05d1: \u05d4\u05db\u05dc",
172 | "feedbackPositive": "\u05de\u05e9\u05d5\u05d1: \u05d7\u05d9\u05d5\u05d1\u05d9",
173 | "feedbackNegative": "\u05de\u05e9\u05d5\u05d1: \u05e9\u05dc\u05d9\u05dc\u05d9"
174 | },
175 | "SearchBar": {
176 | "search": "\u05d7\u05d9\u05e4\u05d5\u05e9"
177 | }
178 | },
179 | "DeleteThreadButton": {
180 | "confirmMessage": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05de\u05d7\u05e7 \u05d0\u05ea \u05d4\u05e9\u05e8\u05e9\u05d5\u05e8 \u05d5\u05db\u05df \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05d5\u05d4\u05e8\u05db\u05d9\u05d1\u05d9\u05dd \u05e9\u05dc\u05d5.",
181 | "cancel": "\u05d1\u05d8\u05dc",
182 | "confirm": "\u05d0\u05e9\u05e8",
183 | "deletingChat": "\u05de\u05d5\u05d7\u05e7 \u05e6'\u05d0\u05d8",
184 | "chatDeleted": "\u05d4\u05e6'\u05d0\u05d8 \u05e0\u05de\u05d7\u05e7"
185 | },
186 | "index": {
187 | "pastChats": "\u05e6'\u05d0\u05d8\u05d9\u05dd \u05e7\u05d5\u05d3\u05de\u05d9\u05dd"
188 | },
189 | "ThreadList": {
190 | "empty": "\u05e8\u05d9\u05e7...",
191 | "today": "\u05d4\u05d9\u05d5\u05dd",
192 | "yesterday": "\u05d0\u05ea\u05de\u05d5\u05dc",
193 | "previous7days": "7 \u05d9\u05de\u05d9\u05dd \u05e7\u05d5\u05d3\u05de\u05d9\u05dd",
194 | "previous30days": "30 \u05d9\u05de\u05d9\u05dd \u05e7\u05d5\u05d3\u05de\u05d9\u05dd"
195 | },
196 | "TriggerButton": {
197 | "closeSidebar": "\u05e1\u05d2\u05d5\u05e8 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3",
198 | "openSidebar": "\u05e4\u05ea\u05d7 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3"
199 | }
200 | },
201 | "Thread": {
202 | "backToChat": "\u05d7\u05d6\u05d5\u05e8 \u05dc\u05e6'\u05d0\u05d8",
203 | "chatCreatedOn": "\u05d4\u05e6'\u05d0\u05d8 \u05d4\u05d6\u05d4 \u05e0\u05d5\u05e6\u05e8 \u05d1\u05ea\u05d0\u05e8\u05d9\u05da"
204 | }
205 | },
206 | "header": {
207 | "chat": "\u05e6'\u05d0\u05d8",
208 | "readme": "\u05d0\u05d5\u05d3\u05d5\u05ea"
209 | }
210 | }
211 | },
212 | "hooks": {
213 | "useLLMProviders": {
214 | "failedToFetchProviders": "\u05e0\u05db\u05e9\u05dc\u05d4 \u05d4\u05d1\u05d0\u05ea \u05e1\u05e4\u05e7\u05d9\u05dd:"
215 | }
216 | },
217 | "pages": {
218 | "Design": {},
219 | "Env": {
220 | "savedSuccessfully": "\u05e0\u05e9\u05de\u05e8 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4",
221 | "requiredApiKeys": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd",
222 | "requiredApiKeysInfo": "\u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4 \u05d6\u05d5, \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd \u05de\u05e4\u05ea\u05d7\u05d5\u05ea \u05d4-API \u05d4\u05d1\u05d0\u05d9\u05dd. \u05d4\u05de\u05e4\u05ea\u05d7\u05d5\u05ea \u05de\u05d0\u05d5\u05d7\u05e1\u05e0\u05d9\u05dd \u05d1\u05d0\u05d7\u05e1\u05d5\u05df \u05d4\u05de\u05e7\u05d5\u05de\u05d9 \u05e9\u05dc \u05d4\u05de\u05db\u05e9\u05d9\u05e8 \u05e9\u05dc\u05da."
223 | },
224 | "Page": {
225 | "notPartOfProject": "\u05d0\u05ea\u05d4 \u05dc\u05d0 \u05d7\u05dc\u05e7 \u05de\u05d4\u05e4\u05e8\u05d5\u05d9\u05e7\u05d8 \u05d4\u05d6\u05d4."
226 | },
227 | "ResumeButton": {
228 | "resumeChat": "\u05d4\u05de\u05e9\u05da \u05e6'\u05d0\u05d8"
229 | }
230 | }
231 | }
--------------------------------------------------------------------------------
/app/.chainlit/translations/hi.json:
--------------------------------------------------------------------------------
1 | {
2 | "components": {
3 | "atoms": {
4 | "buttons": {
5 | "userButton": {
6 | "menu": {
7 | "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938",
8 | "settingsKey": "\u0926\u0915\u094d\u0937\u093f\u0923\u0940",
9 | "APIKeys": "\u090f\u092a\u0940\u0906\u0908 \u0915\u0941\u0902\u091c\u0940",
10 | "logout": "\u0932\u0949\u0917\u0906\u0909\u091f"
11 | }
12 | }
13 | }
14 | },
15 | "molecules": {
16 | "newChatButton": {
17 | "newChat": "\u0928\u0908 \u091a\u0948\u091f"
18 | },
19 | "tasklist": {
20 | "TaskList": {
21 | "title": "\ud83d\uddd2\ufe0f \u0915\u093e\u0930\u094d\u092f \u0938\u0942\u091a\u0940",
22 | "loading": "\u0932\u094b\u0921\u0964\u0964\u0964",
23 | "error": "\u0915\u094b\u0908 \u0924\u094d\u0930\u0941\u091f\u093f \u0909\u0924\u094d\u092a\u0928\u094d\u0928 \u0939\u0941\u0908"
24 | }
25 | },
26 | "attachments": {
27 | "cancelUpload": "\u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0930\u0947\u0902",
28 | "removeAttachment": "\u0905\u0928\u0941\u0932\u0917\u094d\u0928\u0915 \u0928\u093f\u0915\u093e\u0932\u0947\u0902"
29 | },
30 | "newChatDialog": {
31 | "createNewChat": "\u0928\u0908 \u091a\u0948\u091f \u092c\u0928\u093e\u090f\u0901?",
32 | "clearChat": "\u092f\u0939 \u0935\u0930\u094d\u0924\u092e\u093e\u0928 \u0938\u0902\u0926\u0947\u0936\u094b\u0902 \u0915\u094b \u0938\u093e\u092b\u093c \u0915\u0930\u0947\u0917\u093e \u0914\u0930 \u090f\u0915 \u0928\u0908 \u091a\u0948\u091f \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0917\u093e\u0964",
33 | "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u0928\u093e",
34 | "confirm": "\u0938\u0941\u0926\u0943\u0922\u093c \u0915\u0930\u0928\u093e"
35 | },
36 | "settingsModal": {
37 | "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938",
38 | "expandMessages": "\u0938\u0902\u0926\u0947\u0936\u094b\u0902 \u0915\u093e \u0935\u093f\u0938\u094d\u0924\u093e\u0930 \u0915\u0930\u0947\u0902",
39 | "hideChainOfThought": "\u0935\u093f\u091a\u093e\u0930 \u0915\u0940 \u0936\u094d\u0930\u0943\u0902\u0916\u0932\u093e \u091b\u093f\u092a\u093e\u090f\u0902",
40 | "darkMode": "\u0921\u093e\u0930\u094d\u0915 \u092e\u094b\u0921"
41 | },
42 | "detailsButton": {
43 | "using": "\u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0915\u0947",
44 | "running": "\u092d\u093e\u0917\u0928\u093e",
45 | "took_one": "{{count}} \u0915\u0926\u092e \u0909\u0920\u093e\u092f\u093e",
46 | "took_other": "{{count}} \u0915\u0926\u092e \u0909\u0920\u093e\u090f"
47 | },
48 | "auth": {
49 | "authLogin": {
50 | "title": "\u0910\u092a \u0924\u0915 \u092a\u0939\u0941\u0902\u091a\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u0947\u0902\u0964",
51 | "form": {
52 | "email": "\u0908\u092e\u0947\u0932 \u092a\u0924\u093e",
53 | "password": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921",
54 | "noAccount": "\u0915\u094d\u092f\u093e \u0906\u092a\u0915\u0947 \u092a\u093e\u0938 \u0916\u093e\u0924\u093e \u0928\u0939\u0940\u0902 \u0939\u0948?",
55 | "alreadyHaveAccount": "\u092a\u0939\u0932\u0947 \u0938\u0947 \u0939\u0940 \u090f\u0915 \u0916\u093e\u0924\u093e \u0939\u0948?",
56 | "signup": "\u0928\u093e\u092e \u0932\u093f\u0916\u094b",
57 | "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902",
58 | "or": "\u0928\u0939\u0940\u0902 \u0924\u094b",
59 | "continue": "\u091c\u093e\u0930\u0940 \u0930\u0916\u0928\u093e",
60 | "forgotPassword": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u092d\u0942\u0932 \u0917\u090f?",
61 | "passwordMustContain": "\u0906\u092a\u0915\u0947 \u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u092e\u0947\u0902 \u0939\u094b\u0928\u093e \u091a\u093e\u0939\u093f\u090f:",
62 | "emailRequired": "\u0908\u092e\u0947\u0932 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948",
63 | "passwordRequired": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948"
64 | },
65 | "error": {
66 | "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0905\u0938\u092e\u0930\u094d\u0925.",
67 | "signin": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0915\u0947 \u0926\u0947\u0916\u0947\u0902.",
68 | "oauthsignin": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0915\u0947 \u0926\u0947\u0916\u0947\u0902.",
69 | "redirect_uri_mismatch": "\u0930\u0940\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f \u092f\u0942\u0906\u0930\u0906\u0908 \u0913\u0925 \u0910\u092a \u0915\u0949\u0928\u094d\u092b\u093c\u093f\u0917\u0930\u0947\u0936\u0928 \u0938\u0947 \u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093e \u0930\u0939\u093e \u0939\u0948\u0964",
70 | "oauthcallbackerror": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0915\u0947 \u0926\u0947\u0916\u0947\u0902.",
71 | "oauthcreateaccount": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0915\u0947 \u0926\u0947\u0916\u0947\u0902.",
72 | "emailcreateaccount": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0915\u0947 \u0926\u0947\u0916\u0947\u0902.",
73 | "callback": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0915\u0947 \u0926\u0947\u0916\u0947\u0902.",
74 | "oauthaccountnotlinked": "\u0905\u092a\u0928\u0940 \u092a\u0939\u091a\u093e\u0928 \u0915\u0928\u094d\u092b\u093c\u0930\u094d\u092e \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f, \u0909\u0938\u0940 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902 \u091c\u093f\u0938\u0915\u093e \u0907\u0938\u094d\u0924\u0947\u092e\u093e\u0932 \u0906\u092a\u0928\u0947 \u092a\u0939\u0932\u0947 \u0915\u093f\u092f\u093e \u0925\u093e.",
75 | "emailsignin": "\u0908-\u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u092d\u0947\u091c\u0940 \u091c\u093e \u0938\u0915\u0940.",
76 | "emailverify": "\u0915\u0943\u092a\u092f\u093e \u0905\u092a\u0928\u093e \u0908\u092e\u0947\u0932 \u0938\u0924\u094d\u092f\u093e\u092a\u093f\u0924 \u0915\u0930\u0947\u0902, \u090f\u0915 \u0928\u092f\u093e \u0908\u092e\u0947\u0932 \u092d\u0947\u091c\u093e \u0917\u092f\u093e \u0939\u0948\u0964",
77 | "credentialssignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0935\u093f\u092b\u0932 \u0930\u0939\u093e. \u091c\u093e\u0902\u091a\u0947\u0902 \u0915\u093f \u0906\u092a\u0915\u0947 \u0926\u094d\u0935\u093e\u0930\u093e \u092a\u094d\u0930\u0926\u093e\u0928 \u0915\u093f\u090f \u0917\u090f \u0935\u093f\u0935\u0930\u0923 \u0938\u0939\u0940 \u0939\u0948\u0902\u0964",
78 | "sessionrequired": "\u0915\u0943\u092a\u092f\u093e \u0907\u0938 \u092a\u0943\u0937\u094d\u0920 \u0924\u0915 \u092a\u0939\u0941\u0902\u091a\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902\u0964"
79 | }
80 | },
81 | "authVerifyEmail": {
82 | "almostThere": "\u0906\u092a \u0932\u0917\u092d\u0917 \u0935\u0939\u093e\u0901 \u0939\u0948\u0902! \u0939\u092e\u0928\u0947 \u090f\u0915 \u0908\u092e\u0947\u0932 \u092d\u0947\u091c\u093e \u0939\u0948 ",
83 | "verifyEmailLink": "\u0915\u0943\u092a\u092f\u093e \u0905\u092a\u0928\u093e \u0938\u093e\u0907\u0928\u0905\u092a \u092a\u0942\u0930\u093e \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0909\u0938 \u0908\u092e\u0947\u0932 \u092e\u0947\u0902 \u0926\u093f\u090f \u0917\u090f \u0932\u093f\u0902\u0915 \u092a\u0930 \u0915\u094d\u0932\u093f\u0915 \u0915\u0930\u0947\u0902\u0964",
84 | "didNotReceive": "\u0908\u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u092e\u093f\u0932 \u0930\u0939\u093e \u0939\u0948?",
85 | "resendEmail": "\u0908\u092e\u0947\u0932 \u092a\u0941\u0928\u0903 \u092d\u0947\u091c\u0947\u0902",
86 | "goBack": "\u092a\u0938 \u091c\u093e\u0913",
87 | "emailSent": "\u0908\u092e\u0947\u0932 \u0938\u092b\u0932\u0924\u093e\u092a\u0942\u0930\u094d\u0935\u0915 \u092d\u0947\u091c\u093e \u0917\u092f\u093e\u0964",
88 | "verifyEmail": "\u0905\u092a\u0928\u093e \u0908\u092e\u0947\u0932 \u092a\u0924\u093e \u0938\u0924\u094d\u092f\u093e\u092a\u093f\u0924 \u0915\u0930\u0947\u0902"
89 | },
90 | "providerButton": {
91 | "continue": "{{provider}} \u0915\u0947 \u0938\u093e\u0925 \u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902",
92 | "signup": "{{provider}} \u0915\u0947 \u0938\u093e\u0925 \u0938\u093e\u0907\u0928 \u0905\u092a \u0915\u0930\u0947\u0902"
93 | },
94 | "authResetPassword": {
95 | "newPasswordRequired": "\u0928\u092f\u093e \u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948",
96 | "passwordsMustMatch": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u092e\u0947\u0932 \u0916\u093e\u0928\u093e \u091a\u093e\u0939\u093f\u090f",
97 | "confirmPasswordRequired": "\u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902 \u0915\u093f \u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948",
98 | "newPassword": "\u0928\u092f\u093e \u092a\u093e\u0938\u0935\u0930\u094d\u0921",
99 | "confirmPassword": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0915\u0940 \u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902",
100 | "resetPassword": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0930\u0940\u0938\u0947\u091f \u0915\u0930\u0947\u0902"
101 | },
102 | "authForgotPassword": {
103 | "email": "\u0908\u092e\u0947\u0932 \u092a\u0924\u093e",
104 | "emailRequired": "\u0908\u092e\u0947\u0932 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948",
105 | "emailSent": "\u0905\u092a\u0928\u093e \u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0930\u0940\u0938\u0947\u091f \u0915\u0930\u0928\u0947 \u0915\u0947 \u0928\u093f\u0930\u094d\u0926\u0947\u0936\u094b\u0902 \u0915\u0947 \u0932\u093f\u090f \u0915\u0943\u092a\u092f\u093e \u0908\u092e\u0947\u0932 \u092a\u0924\u093e {{email}} \u0926\u0947\u0916\u0947\u0902\u0964",
106 | "enterEmail": "\u0905\u092a\u0928\u093e \u0908\u092e\u0947\u0932 \u092a\u0924\u093e \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902 \u0914\u0930 \u0939\u092e \u0906\u092a\u0915\u094b \u0905\u092a\u0928\u093e \u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0930\u0940\u0938\u0947\u091f \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0928\u093f\u0930\u094d\u0926\u0947\u0936 \u092d\u0947\u091c\u0947\u0902\u0917\u0947\u0964",
107 | "resendEmail": "\u0908\u092e\u0947\u0932 \u092a\u0941\u0928\u0903 \u092d\u0947\u091c\u0947\u0902",
108 | "continue": "\u091c\u093e\u0930\u0940 \u0930\u0916\u0928\u093e",
109 | "goBack": "\u092a\u0938 \u091c\u093e\u0913"
110 | }
111 | }
112 | },
113 | "organisms": {
114 | "chat": {
115 | "history": {
116 | "index": {
117 | "showHistory": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093f\u0916\u093e\u090f\u0902",
118 | "lastInputs": "\u0905\u0902\u0924\u093f\u092e \u0907\u0928\u092a\u0941\u091f",
119 | "noInputs": "\u0910\u0938\u0947 \u0916\u093e\u0932\u0940...",
120 | "loading": "\u0932\u094b\u0921\u0964\u0964\u0964"
121 | }
122 | },
123 | "inputBox": {
124 | "input": {
125 | "placeholder": "\u0905\u092a\u0928\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0939\u093e\u0901 \u091f\u093e\u0907\u092a \u0915\u0930\u0947\u0902..."
126 | },
127 | "speechButton": {
128 | "start": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
129 | "stop": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u092c\u0902\u0926 \u0915\u0930\u094b"
130 | },
131 | "SubmitButton": {
132 | "sendMessage": "\u0938\u0902\u0926\u0947\u0936 \u092d\u0947\u091c\u0947\u0902",
133 | "stopTask": "\u0915\u093e\u0930\u094d\u092f \u092c\u0902\u0926 \u0915\u0930\u094b"
134 | },
135 | "UploadButton": {
136 | "attachFiles": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u0905\u0928\u0941\u0932\u0917\u094d\u0928 \u0915\u0930\u0947\u0902"
137 | },
138 | "waterMark": {
139 | "text": "\u0915\u0947 \u0938\u093e\u0925 \u0928\u093f\u0930\u094d\u092e\u093f\u0924"
140 | }
141 | },
142 | "Messages": {
143 | "index": {
144 | "running": "\u092d\u093e\u0917\u0928\u093e",
145 | "executedSuccessfully": "\u0938\u092b\u0932\u0924\u093e\u092a\u0942\u0930\u094d\u0935\u0915 \u0928\u093f\u0937\u094d\u092a\u093e\u0926\u093f\u0924",
146 | "failed": "\u0905\u0938\u092b\u0932",
147 | "feedbackUpdated": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0905\u092a\u0921\u0947\u091f \u0915\u0940 \u0917\u0908",
148 | "updating": "\u0905\u0926\u094d\u092f\u0924\u0928"
149 | }
150 | },
151 | "dropScreen": {
152 | "dropYourFilesHere": "\u0905\u092a\u0928\u0940 \u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u092f\u0939\u093e\u0901 \u0921\u094d\u0930\u0949\u092a \u0915\u0930\u0947\u0902"
153 | },
154 | "index": {
155 | "failedToUpload": "\u0905\u092a\u0932\u094b\u0921 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932",
156 | "cancelledUploadOf": "\u0915\u093e \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u093f\u092f\u093e \u0917\u092f\u093e",
157 | "couldNotReachServer": "\u0938\u0930\u094d\u0935\u0930 \u0924\u0915 \u0928\u0939\u0940\u0902 \u092a\u0939\u0941\u0901\u091a \u0938\u0915\u093e",
158 | "continuingChat": "\u092a\u093f\u091b\u0932\u0940 \u091a\u0948\u091f \u091c\u093e\u0930\u0940 \u0930\u0916\u0928\u093e"
159 | },
160 | "settings": {
161 | "settingsPanel": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 \u092a\u0948\u0928\u0932",
162 | "reset": "\u0930\u0940\u0938\u0947\u091f",
163 | "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u0928\u093e",
164 | "confirm": "\u0938\u0941\u0926\u0943\u0922\u093c \u0915\u0930\u0928\u093e"
165 | }
166 | },
167 | "threadHistory": {
168 | "sidebar": {
169 | "filters": {
170 | "FeedbackSelect": {
171 | "feedbackAll": "\u092a\u094d\u0930\u0924\u093f\u092a\u0941\u0937\u094d\u091f\u093f: \u0938\u092d\u0940",
172 | "feedbackPositive": "\u092a\u094d\u0930\u0924\u093f\u092a\u0941\u0937\u094d\u091f\u093f: \u0938\u0915\u093e\u0930\u093e\u0924\u094d\u092e\u0915",
173 | "feedbackNegative": "\u092a\u094d\u0930\u0924\u093f\u092a\u0941\u0937\u094d\u091f\u093f: \u0928\u0915\u093e\u0930\u093e\u0924\u094d\u092e\u0915"
174 | },
175 | "SearchBar": {
176 | "search": "\u0922\u0942\u0901\u0922"
177 | }
178 | },
179 | "DeleteThreadButton": {
180 | "confirmMessage": "\u092f\u0939 \u0925\u094d\u0930\u0947\u0921 \u0915\u0947 \u0938\u093e\u0925-\u0938\u093e\u0925 \u0907\u0938\u0915\u0947 \u0938\u0902\u0926\u0947\u0936\u094b\u0902 \u0914\u0930 \u0924\u0924\u094d\u0935\u094b\u0902 \u0915\u094b \u092d\u0940 \u0939\u091f\u093e \u0926\u0947\u0917\u093e\u0964",
181 | "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u0928\u093e",
182 | "confirm": "\u0938\u0941\u0926\u0943\u0922\u093c \u0915\u0930\u0928\u093e",
183 | "deletingChat": "\u091a\u0948\u091f \u0939\u091f\u093e\u0928\u093e",
184 | "chatDeleted": "\u091a\u0948\u091f \u0939\u091f\u093e\u0908 \u0917\u0908"
185 | },
186 | "index": {
187 | "pastChats": "\u092a\u093f\u091b\u0932\u0940 \u091a\u0948\u091f"
188 | },
189 | "ThreadList": {
190 | "empty": "\u0916\u093e\u0932\u0940\u0964\u0964\u0964",
191 | "today": "\u0906\u091c",
192 | "yesterday": "\u092c\u0940\u0924\u093e \u0939\u0941\u0906 \u0915\u0932",
193 | "previous7days": "\u092a\u093f\u091b\u0932\u0947 7 \u0926\u093f\u0928",
194 | "previous30days": "\u092a\u093f\u091b\u0932\u0947 30 \u0926\u093f\u0928"
195 | },
196 | "TriggerButton": {
197 | "closeSidebar": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u0947\u0902",
198 | "openSidebar": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0916\u094b\u0932\u0947\u0902"
199 | }
200 | },
201 | "Thread": {
202 | "backToChat": "\u091a\u0948\u091f \u092a\u0930 \u0935\u093e\u092a\u0938 \u091c\u093e\u090f\u0902",
203 | "chatCreatedOn": "\u092f\u0939 \u091a\u0948\u091f \u0907\u0938 \u092a\u0930 \u092c\u0928\u093e\u0908 \u0917\u0908 \u0925\u0940"
204 | }
205 | },
206 | "header": {
207 | "chat": "\u091a\u0948\u091f",
208 | "readme": "\u0930\u0940\u0921\u092e\u0940"
209 | }
210 | }
211 | },
212 | "hooks": {
213 | "useLLMProviders": {
214 | "failedToFetchProviders": "\u092a\u094d\u0930\u0926\u093e\u0924\u093e\u0913\u0902 \u0915\u094b \u0932\u093e\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932:"
215 | }
216 | },
217 | "pages": {
218 | "Design": {},
219 | "Env": {
220 | "savedSuccessfully": "\u0938\u092b\u0932\u0924\u093e\u092a\u0942\u0930\u094d\u0935\u0915 \u0938\u0939\u0947\u091c\u093e \u0917\u092f\u093e",
221 | "requiredApiKeys": "\u0906\u0935\u0936\u094d\u092f\u0915 \u090f\u092a\u0940\u0906\u0908 \u0915\u0941\u0902\u091c\u0940",
222 | "requiredApiKeysInfo": "\u0907\u0938 \u0910\u092a \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f, \u0928\u093f\u092e\u094d\u0928\u0932\u093f\u0916\u093f\u0924 \u090f\u092a\u0940\u0906\u0908 \u0915\u0941\u0902\u091c\u093f\u092f\u094b\u0902 \u0915\u0940 \u0906\u0935\u0936\u094d\u092f\u0915\u0924\u093e \u0939\u094b\u0924\u0940 \u0939\u0948\u0964 \u091a\u093e\u092c\u093f\u092f\u093e\u0901 \u0906\u092a\u0915\u0947 \u0921\u093f\u0935\u093e\u0907\u0938 \u0915\u0947 \u0938\u094d\u0925\u093e\u0928\u0940\u092f \u0938\u0902\u0917\u094d\u0930\u0939\u0923 \u092a\u0930 \u0938\u0902\u0917\u094d\u0930\u0939\u0940\u0924 \u0915\u0940 \u091c\u093e\u0924\u0940 \u0939\u0948\u0902\u0964"
223 | },
224 | "Page": {
225 | "notPartOfProject": "\u0906\u092a \u0907\u0938 \u092a\u0930\u093f\u092f\u094b\u091c\u0928\u093e \u0915\u093e \u0939\u093f\u0938\u094d\u0938\u093e \u0928\u0939\u0940\u0902 \u0939\u0948\u0902\u0964"
226 | },
227 | "ResumeButton": {
228 | "resumeChat": "\u091a\u0948\u091f \u092b\u093f\u0930 \u0938\u0947 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902"
229 | }
230 | }
231 | }
--------------------------------------------------------------------------------
/app/.chainlit/translations/mr.json:
--------------------------------------------------------------------------------
1 | {
2 | "components": {
3 | "atoms": {
4 | "buttons": {
5 | "userButton": {
6 | "menu": {
7 | "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938",
8 | "settingsKey": "S",
9 | "APIKeys": "\u090f\u092a\u0940\u0906\u092f \u0915\u0940\u091c",
10 | "logout": "Logout"
11 | }
12 | }
13 | }
14 | },
15 | "molecules": {
16 | "newChatButton": {
17 | "newChat": "\u0928\u0935\u0940\u0928 \u0917\u092a\u094d\u092a\u093e"
18 | },
19 | "tasklist": {
20 | "TaskList": {
21 | "title": "\ud83d\uddd2\ufe0f \u0915\u093e\u0930\u094d\u092f \u0938\u0942\u091a\u0940",
22 | "loading": "\u0932\u094b\u0921\u093f\u0902\u0917...",
23 | "error": "\u090f\u0915 \u0924\u094d\u0930\u0941\u091f\u0940 \u091d\u093e\u0932\u0940"
24 | }
25 | },
26 | "attachments": {
27 | "cancelUpload": "\u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0930\u093e",
28 | "removeAttachment": "\u0938\u0902\u0932\u0917\u094d\u0928\u0924\u093e \u0915\u093e\u0922\u0942\u0928 \u091f\u093e\u0915\u093e"
29 | },
30 | "newChatDialog": {
31 | "createNewChat": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f \u0924\u092f\u093e\u0930 \u0915\u0930\u093e?",
32 | "clearChat": "\u092f\u093e\u092e\u0941\u0933\u0947 \u0938\u0927\u094d\u092f\u093e\u091a\u0947 \u092e\u0947\u0938\u0947\u091c \u0915\u094d\u0932\u093f\u0905\u0930 \u0939\u094b\u0924\u0940\u0932 \u0906\u0923\u093f \u0928\u0935\u0940\u0928 \u091a\u0945\u091f \u0938\u0941\u0930\u0942 \u0939\u094b\u0908\u0932.",
33 | "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u093e",
34 | "confirm": "\u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e"
35 | },
36 | "settingsModal": {
37 | "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938",
38 | "expandMessages": "\u0938\u0902\u0926\u0947\u0936 \u093e\u0902\u091a\u093e \u0935\u093f\u0938\u094d\u0924\u093e\u0930 \u0915\u0930\u093e",
39 | "hideChainOfThought": "\u0935\u093f\u091a\u093e\u0930\u093e\u0902\u091a\u0940 \u0938\u093e\u0916\u0933\u0940 \u0932\u092a\u0935\u093e",
40 | "darkMode": "\u0921\u093e\u0930\u094d\u0915 \u092e\u094b\u0921"
41 | },
42 | "detailsButton": {
43 | "using": "\u0935\u093e\u092a\u0930\u0924",
44 | "running": "\u0927\u093e\u0935\u0924 \u0906\u0939\u0947.",
45 | "took_one": "{{count}} \u092a\u093e\u090a\u0932 \u0909\u091a\u0932\u0932\u0947",
46 | "took_other": "{{count}} \u092a\u093e\u0935\u0932\u0947 \u0909\u091a\u0932\u0932\u0940"
47 | },
48 | "auth": {
49 | "authLogin": {
50 | "title": "\u0905 \u0945\u092a\u092e\u0927\u094d\u092f\u0947 \u092a\u094d\u0930\u0935\u0947\u0936 \u0915\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u093e.",
51 | "form": {
52 | "email": "\u0908\u092e\u0947\u0932 \u092a\u0924\u094d\u0924\u093e",
53 | "password": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921",
54 | "noAccount": "\u0916\u093e\u0924\u0947 \u0928\u093e\u0939\u0940 \u0915\u093e?",
55 | "alreadyHaveAccount": "\u0906\u0927\u0940\u091a \u0916\u093e\u0924\u0947 \u0906\u0939\u0947 \u0915\u093e?",
56 | "signup": "\u0938\u093e\u0907\u0928 \u0905\u092a \u0915\u0930\u093e",
57 | "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928",
58 | "or": "\u0915\u093f\u0902\u0935\u093e",
59 | "continue": "\u091a\u093e\u0932\u0942 \u0920\u0947\u0935\u093e",
60 | "forgotPassword": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0935\u093f\u0938\u0930\u0932\u093e?",
61 | "passwordMustContain": "\u0906\u092a\u0932\u094d\u092f\u093e \u092a\u093e\u0938\u0935\u0930\u094d\u0921\u092e\u0927\u094d\u092f\u0947 \u0939\u0947 \u0905\u0938\u0923\u0947 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947:",
62 | "emailRequired": "\u0908\u092e\u0947\u0932 \u0939\u0947 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u0906\u0939\u0947",
63 | "passwordRequired": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0939\u0947 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u0906\u0939\u0947"
64 | },
65 | "error": {
66 | "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u0938 \u0905\u0915\u094d\u0937\u092e.",
67 | "signin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0938\u0939 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e.",
68 | "oauthsignin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0938\u0939 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e.",
69 | "redirect_uri_mismatch": "\u0930\u093f\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f \u092f\u0942\u0906\u0930\u0906\u092f \u0911\u0925 \u0905\u0945\u092a \u0915\u0949\u0928\u094d\u092b\u093f\u0917\u0930\u0947\u0936\u0928\u0936\u0940 \u091c\u0941\u0933\u0924 \u0928\u093e\u0939\u0940.",
70 | "oauthcallbackerror": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0938\u0939 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e.",
71 | "oauthcreateaccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0938\u0939 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e.",
72 | "emailcreateaccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0938\u0939 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e.",
73 | "callback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0938\u0939 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e.",
74 | "oauthaccountnotlinked": "\u0906\u092a\u0932\u0940 \u0913\u0933\u0916 \u0928\u093f\u0936\u094d\u091a\u093f\u0924 \u0915\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940, \u0906\u092a\u0923 \u092e\u0942\u0933\u0935\u093e\u092a\u0930\u0932\u0947\u0932\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0938\u0939 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e.",
75 | "emailsignin": "\u0908-\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0924\u093e \u0906\u0932\u093e \u0928\u093e\u0939\u0940.",
76 | "emailverify": "\u0915\u0943\u092a\u092f\u093e \u0906\u092a\u0932\u094d\u092f\u093e \u0908\u092e\u0947\u0932\u091a\u0940 \u092a\u0921\u0924\u093e\u0933\u0923\u0940 \u0915\u0930\u093e, \u090f\u0915 \u0928\u0935\u0940\u0928 \u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u093f\u0932\u093e \u0917\u0947\u0932\u093e \u0906\u0939\u0947.",
77 | "credentialssignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0905\u092f\u0936\u0938\u094d\u0935\u0940 \u091d\u093e\u0932\u0947. \u0906\u092a\u0923 \u0926\u093f\u0932\u0947\u0932\u093e \u0924\u092a\u0936\u0940\u0932 \u092f\u094b\u0917\u094d\u092f \u0906\u0939\u0947 \u0939\u0947 \u0924\u092a\u093e\u0938\u093e.",
78 | "sessionrequired": "\u0915\u0943\u092a\u092f\u093e \u092f\u093e \u092a\u0943\u0937\u094d\u0920\u093e\u0935\u0930 \u092a\u094d\u0930\u0935\u0947\u0936 \u0915\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e."
79 | }
80 | },
81 | "authVerifyEmail": {
82 | "almostThere": "\u0924\u0942 \u091c\u0935\u0933\u091c\u0935\u0933 \u0924\u093f\u0925\u0947\u091a \u0906\u0939\u0947\u0938! \u0906\u092e\u094d\u0939\u0940 \u090f\u0915 \u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0932\u093e \u0906\u0939\u0947. ",
83 | "verifyEmailLink": "\u0906\u092a\u0932\u0947 \u0938\u093e\u0907\u0928\u0905\u092a \u092a\u0942\u0930\u094d\u0923 \u0915\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0915\u0943\u092a\u092f\u093e \u0924\u094d\u092f\u093e \u0908\u092e\u0947\u0932\u092e\u0927\u0940\u0932 \u0932\u093f\u0902\u0915\u0935\u0930 \u0915\u094d\u0932\u093f\u0915 \u0915\u0930\u093e.",
84 | "didNotReceive": "\u0908\u092e\u0947\u0932 \u0938\u093e\u092a\u0921\u0924 \u0928\u093e\u0939\u0940 \u0915\u093e?",
85 | "resendEmail": "\u0908\u092e\u0947\u0932 \u092a\u0941\u0928\u094d\u0939\u093e \u092a\u093e\u0920\u0935\u093e",
86 | "goBack": "\u092a\u0930\u0924 \u091c\u093e",
87 | "emailSent": "\u0908\u092e\u0947\u0932 \u092f\u0936\u0938\u094d\u0935\u0940\u0930\u093f\u0924\u094d\u092f\u093e \u092a\u093e\u0920\u0935\u093f\u0932\u093e.",
88 | "verifyEmail": "\u0906\u092a\u0932\u093e \u0908\u092e\u0947\u0932 \u092a\u0924\u094d\u0924\u093e \u092a\u0921\u0924\u093e\u0933\u0942\u0928 \u092a\u0939\u093e"
89 | },
90 | "providerButton": {
91 | "continue": "{{provider}} \u091a\u093e\u0932\u0942 \u0920\u0947\u0935\u093e",
92 | "signup": "{{provider}} \u0938\u0939 \u0938\u093e\u0907\u0928 \u0905\u092a \u0915\u0930\u093e"
93 | },
94 | "authResetPassword": {
95 | "newPasswordRequired": "\u0928\u0935\u0940\u0928 \u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0939\u0947 \u0906\u0935\u0936\u094d\u092f\u0915 \u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u0906\u0939\u0947",
96 | "passwordsMustMatch": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u091c\u0941\u0933\u0923\u0947 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947",
97 | "confirmPasswordRequired": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0906\u0935\u0936\u094d\u092f\u0915 \u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u0906\u0939\u0947 \u092f\u093e\u091a\u0940 \u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e",
98 | "newPassword": "\u0928\u0935\u0940\u0928 \u092a\u093e\u0938\u0935\u0930\u094d\u0921",
99 | "confirmPassword": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u091a\u0940 \u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e",
100 | "resetPassword": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0930\u0940\u0938\u0947\u091f \u0915\u0930\u093e"
101 | },
102 | "authForgotPassword": {
103 | "email": "\u0908\u092e\u0947\u0932 \u092a\u0924\u094d\u0924\u093e",
104 | "emailRequired": "\u0908\u092e\u0947\u0932 \u0939\u0947 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u0906\u0939\u0947",
105 | "emailSent": "\u0906\u092a\u0932\u093e \u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0930\u0940\u0938\u0947\u091f \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u094d\u092f\u093e \u0938\u0942\u091a\u0928\u093e\u0902\u0938\u093e\u0920\u0940 \u0915\u0943\u092a\u092f\u093e \u0908\u092e\u0947\u0932 \u092a\u0924\u094d\u0924\u093e {{email}} \u0924\u092a\u093e\u0938\u093e.",
106 | "enterEmail": "\u0906\u092a\u0932\u093e \u0908\u092e\u0947\u0932 \u092a\u0924\u094d\u0924\u093e \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e \u0906\u0923\u093f \u0906\u092e\u094d\u0939\u0940 \u0906\u092a\u0932\u094d\u092f\u093e\u0932\u093e \u0906\u092a\u0932\u093e \u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0930\u0940\u0938\u0947\u091f \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u094d\u092f\u093e \u0938\u0942\u091a\u0928\u093e \u092a\u093e\u0920\u0935\u0942.",
107 | "resendEmail": "\u0908\u092e\u0947\u0932 \u092a\u0941\u0928\u094d\u0939\u093e \u092a\u093e\u0920\u0935\u093e",
108 | "continue": "\u091a\u093e\u0932\u0942 \u0920\u0947\u0935\u093e",
109 | "goBack": "\u092a\u0930\u0924 \u091c\u093e"
110 | }
111 | }
112 | },
113 | "organisms": {
114 | "chat": {
115 | "history": {
116 | "index": {
117 | "showHistory": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093e\u0916\u0935\u093e",
118 | "lastInputs": "\u0936\u0947\u0935\u091f\u091a\u0940 \u092e\u093e\u0939\u093f\u0924\u0940",
119 | "noInputs": "\u0907\u0924\u0915\u0940 \u0930\u093f\u0915\u093e\u092e\u0940...",
120 | "loading": "\u0932\u094b\u0921\u093f\u0902\u0917..."
121 | }
122 | },
123 | "inputBox": {
124 | "input": {
125 | "placeholder": "\u0924\u0941\u092e\u091a\u093e \u092e\u0947\u0938\u0947\u091c \u0907\u0925\u0947 \u091f\u093e\u0908\u092a \u0915\u0930\u093e..."
126 | },
127 | "speechButton": {
128 | "start": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0938\u0941\u0930\u0942 \u0915\u0930\u093e",
129 | "stop": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0925\u093e\u0902\u092c\u0935\u093e"
130 | },
131 | "SubmitButton": {
132 | "sendMessage": "\u0938\u0902\u0926\u0947\u0936 \u092a\u093e\u0920\u0935\u093e",
133 | "stopTask": "\u0915\u093e\u0930\u094d\u092f \u0925\u093e\u0902\u092c\u0935\u093e"
134 | },
135 | "UploadButton": {
136 | "attachFiles": "\u092b\u093e\u0908\u0932\u094d\u0938 \u0938\u0902\u0932\u0917\u094d\u0928 \u0915\u0930\u093e"
137 | },
138 | "waterMark": {
139 | "text": "\u092f\u093e\u0938\u0939 \u092c\u093e\u0902\u0927\u0932\u0947 \u0906\u0939\u0947"
140 | }
141 | },
142 | "Messages": {
143 | "index": {
144 | "running": "\u0927\u093e\u0935\u0924 \u0906\u0939\u0947.",
145 | "executedSuccessfully": "\u092f\u0936\u0938\u094d\u0935\u0940\u0930\u093f\u0924\u094d\u092f\u093e \u0930\u093e\u092c\u0935\u093f\u0932\u0940",
146 | "failed": "\u0905\u092a\u092f\u0936\u0940 \u0920\u0930\u0932\u0947",
147 | "feedbackUpdated": "\u0905\u092d\u093f\u092a\u094d\u0930\u093e\u092f \u0905\u0926\u094d\u092f\u092f\u093e\u0935\u0924",
148 | "updating": "\u0905\u0926\u094d\u092f\u092f\u093e\u0935\u0924 \u0915\u0930\u0923\u0947"
149 | }
150 | },
151 | "dropScreen": {
152 | "dropYourFilesHere": "\u0906\u092a\u0932\u094d\u092f\u093e \u092b\u093e\u092f\u0932\u0940 \u092f\u0947\u0925\u0947 \u091f\u093e\u0915\u093e"
153 | },
154 | "index": {
155 | "failedToUpload": "\u0905\u092a\u0932\u094b\u0921 \u0915\u0930\u0923\u094d\u092f\u093e\u0924 \u0905\u092a\u092f\u0936 \u0906\u0932\u0947",
156 | "cancelledUploadOf": "\u0930\u0926\u094d\u0926 \u0915\u0947\u0932\u0947\u0932\u0947 \u0905\u092a\u0932\u094b\u0921",
157 | "couldNotReachServer": "\u0938\u0930\u094d\u0935\u094d\u0939\u0930\u092a\u0930\u094d\u092f\u0902\u0924 \u092a\u094b\u0939\u094b\u091a\u0942 \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940",
158 | "continuingChat": "\u092e\u093e\u0917\u0940\u0932 \u0917\u092a\u094d\u092a\u093e \u091a\u093e\u0932\u0942 \u0920\u0947\u0935\u093e"
159 | },
160 | "settings": {
161 | "settingsPanel": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 \u092a\u0945\u0928\u0947\u0932",
162 | "reset": "\u0930\u0940\u0938\u0947\u091f \u0915\u0930\u093e",
163 | "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u093e",
164 | "confirm": "\u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e"
165 | }
166 | },
167 | "threadHistory": {
168 | "sidebar": {
169 | "filters": {
170 | "FeedbackSelect": {
171 | "feedbackAll": "\u0905\u092d\u093f\u092a\u094d\u0930\u093e\u092f: \u0938\u0930\u094d\u0935",
172 | "feedbackPositive": "\u0905\u092d\u093f\u092a\u094d\u0930\u093e\u092f: \u0938\u0915\u093e\u0930\u093e\u0924\u094d\u092e\u0915",
173 | "feedbackNegative": "\u0905\u092d\u093f\u092a\u094d\u0930\u093e\u092f: \u0928\u0915\u093e\u0930\u093e\u0924\u094d\u092e\u0915"
174 | },
175 | "SearchBar": {
176 | "search": "\u0936\u094b\u0927\u0923\u0947"
177 | }
178 | },
179 | "DeleteThreadButton": {
180 | "confirmMessage": "\u0939\u0947 \u0927\u093e\u0917\u093e \u0924\u0938\u0947\u091a \u0924\u094d\u092f\u093e\u0924\u0940\u0932 \u0938\u0902\u0926\u0947\u0936 \u0906\u0923\u093f \u0918\u091f\u0915 \u0921\u093f\u0932\u0940\u091f \u0915\u0930\u0947\u0932.",
181 | "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u093e",
182 | "confirm": "\u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e",
183 | "deletingChat": "\u091a\u0945\u091f \u0921\u093f\u0932\u0940\u091f \u0915\u0930\u0923\u0947",
184 | "chatDeleted": "\u091a\u0945\u091f \u0921\u093f\u0932\u0940\u091f"
185 | },
186 | "index": {
187 | "pastChats": "\u092e\u093e\u0917\u0940\u0932 \u0917\u092a\u094d\u092a\u093e"
188 | },
189 | "ThreadList": {
190 | "empty": "\u0930\u093f\u0915\u094d\u0924\u0964\u0964\u0964",
191 | "today": "\u0906\u091c",
192 | "yesterday": "\u0915\u093e\u0932",
193 | "previous7days": "\u092e\u093e\u0917\u0940\u0932 7 \u0926\u093f\u0935\u0938",
194 | "previous30days": "\u092e\u093e\u0917\u0940\u0932 \u0969\u0966 \u0926\u093f\u0935\u0938"
195 | },
196 | "TriggerButton": {
197 | "closeSidebar": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u093e",
198 | "openSidebar": "\u0913\u092a\u0928 \u0938\u093e\u0907\u0921\u092c\u093e\u0930"
199 | }
200 | },
201 | "Thread": {
202 | "backToChat": "\u092a\u0930\u0924 \u0917\u092a\u094d\u092a\u093e \u092e\u093e\u0930\u093e\u092f\u0932\u093e \u091c\u093e",
203 | "chatCreatedOn": "\u0939\u0947 \u091a\u0945\u091f \u0924\u092f\u093e\u0930 \u0915\u0930\u0923\u094d\u092f\u093e\u0924 \u0906\u0932\u0947 \u0939\u094b\u0924\u0947."
204 | }
205 | },
206 | "header": {
207 | "chat": "\u092c\u0915\u0935\u093e\u0926 \u0915\u0930\u0923\u0947\u0902",
208 | "readme": "\u0935\u093e\u091a\u093e"
209 | }
210 | }
211 | },
212 | "hooks": {
213 | "useLLMProviders": {
214 | "failedToFetchProviders": "\u092a\u094d\u0930\u0926\u093e\u0924\u094d\u092f\u093e\u0902\u0928\u093e \u0906\u0923\u0923\u094d\u092f\u093e\u0924 \u0905\u092a\u092f\u0936\u0940:"
215 | }
216 | },
217 | "pages": {
218 | "Design": {},
219 | "Env": {
220 | "savedSuccessfully": "\u092f\u0936\u0938\u094d\u0935\u0940\u0930\u093f\u0924\u094d\u092f\u093e \u0935\u093e\u091a\u0935\u0932\u0947",
221 | "requiredApiKeys": "\u0906\u0935\u0936\u094d\u092f\u0915 \u090f\u092a\u0940\u0906\u092f \u091a\u093e\u0935\u094d\u092f\u093e",
222 | "requiredApiKeysInfo": "\u0939\u0947 \u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0916\u093e\u0932\u0940\u0932 \u090f\u092a\u0940\u0906\u092f \u091a\u093e\u0935\u094d\u092f\u093e \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947\u0924. \u091a\u093e\u0935\u094d\u092f\u093e \u0906\u092a\u0932\u094d\u092f\u093e \u0921\u093f\u0935\u094d\u0939\u093e\u0907\u0938\u091a\u094d\u092f\u093e \u0938\u094d\u0925\u093e\u0928\u093f\u0915 \u0938\u094d\u091f\u094b\u0930\u0947\u091c\u0935\u0930 \u0938\u0902\u0917\u094d\u0930\u0939\u093f\u0924 \u0915\u0947\u0932\u094d\u092f\u093e \u091c\u093e\u0924\u093e\u0924."
223 | },
224 | "Page": {
225 | "notPartOfProject": "\u0924\u0941\u092e\u094d\u0939\u0940 \u092f\u093e \u092a\u094d\u0930\u0915\u0932\u094d\u092a\u093e\u091a\u093e \u092d\u093e\u0917 \u0928\u093e\u0939\u0940."
226 | },
227 | "ResumeButton": {
228 | "resumeChat": "\u091a\u0945\u091f \u092a\u0941\u0928\u094d\u0939\u093e \u0938\u0941\u0930\u0942 \u0915\u0930\u093e"
229 | }
230 | }
231 | }
--------------------------------------------------------------------------------
/app/.chainlit/translations/zh-CN.json:
--------------------------------------------------------------------------------
1 | {
2 | "components": {
3 | "atoms": {
4 | "buttons": {
5 | "userButton": {
6 | "menu": {
7 | "settings": "\u8bbe\u7f6e",
8 | "settingsKey": "S",
9 | "APIKeys": "API \u5bc6\u94a5",
10 | "logout": "\u767b\u51fa"
11 | }
12 | }
13 | }
14 | },
15 | "molecules": {
16 | "newChatButton": {
17 | "newChat": "\u65b0\u5efa\u5bf9\u8bdd"
18 | },
19 | "tasklist": {
20 | "TaskList": {
21 | "title": "\ud83d\uddd2\ufe0f \u4efb\u52a1\u5217\u8868",
22 | "loading": "\u52a0\u8f7d\u4e2d...",
23 | "error": "\u53d1\u751f\u9519\u8bef"
24 | }
25 | },
26 | "attachments": {
27 | "cancelUpload": "\u53d6\u6d88\u4e0a\u4f20",
28 | "removeAttachment": "\u79fb\u9664\u9644\u4ef6"
29 | },
30 | "newChatDialog": {
31 | "createNewChat": "\u521b\u5efa\u65b0\u5bf9\u8bdd\uff1f",
32 | "clearChat": "\u8fd9\u5c06\u6e05\u9664\u5f53\u524d\u6d88\u606f\u5e76\u5f00\u59cb\u65b0\u7684\u5bf9\u8bdd\u3002",
33 | "cancel": "\u53d6\u6d88",
34 | "confirm": "\u786e\u8ba4"
35 | },
36 | "settingsModal": {
37 | "settings": "\u8bbe\u7f6e",
38 | "expandMessages": "\u5c55\u5f00\u6d88\u606f",
39 | "hideChainOfThought": "\u9690\u85cf\u601d\u8003\u94fe",
40 | "darkMode": "\u6697\u8272\u6a21\u5f0f"
41 | },
42 | "detailsButton": {
43 | "using": "\u4f7f\u7528",
44 | "used": "\u5df2\u7528"
45 | },
46 | "auth": {
47 | "authLogin": {
48 | "title": "\u767b\u5f55\u4ee5\u8bbf\u95ee\u5e94\u7528\u3002",
49 | "form": {
50 | "email": "\u7535\u5b50\u90ae\u7bb1\u5730\u5740",
51 | "password": "\u5bc6\u7801",
52 | "noAccount": "\u6ca1\u6709\u8d26\u6237\uff1f",
53 | "alreadyHaveAccount": "\u5df2\u6709\u8d26\u6237\uff1f",
54 | "signup": "\u6ce8\u518c",
55 | "signin": "\u767b\u5f55",
56 | "or": "\u6216\u8005",
57 | "continue": "\u7ee7\u7eed",
58 | "forgotPassword": "\u5fd8\u8bb0\u5bc6\u7801\uff1f",
59 | "passwordMustContain": "\u60a8\u7684\u5bc6\u7801\u5fc5\u987b\u5305\u542b\uff1a",
60 | "emailRequired": "\u7535\u5b50\u90ae\u7bb1\u662f\u5fc5\u586b\u9879",
61 | "passwordRequired": "\u5bc6\u7801\u662f\u5fc5\u586b\u9879"
62 | },
63 | "error": {
64 | "default": "\u65e0\u6cd5\u767b\u5f55\u3002",
65 | "signin": "\u5c1d\u8bd5\u4f7f\u7528\u4e0d\u540c\u7684\u8d26\u6237\u767b\u5f55\u3002",
66 | "oauthsignin": "\u5c1d\u8bd5\u4f7f\u7528\u4e0d\u540c\u7684\u8d26\u6237\u767b\u5f55\u3002",
67 | "redirect_uri_mismatch": "\u91cd\u5b9a\u5411URI\u4e0eOAuth\u5e94\u7528\u914d\u7f6e\u4e0d\u5339\u914d\u3002",
68 | "oauthcallbackerror": "\u5c1d\u8bd5\u4f7f\u7528\u4e0d\u540c\u7684\u8d26\u6237\u767b\u5f55\u3002",
69 | "oauthcreateaccount": "\u5c1d\u8bd5\u4f7f\u7528\u4e0d\u540c\u7684\u8d26\u6237\u767b\u5f55\u3002",
70 | "emailcreateaccount": "\u5c1d\u8bd5\u4f7f\u7528\u4e0d\u540c\u7684\u8d26\u6237\u767b\u5f55\u3002",
71 | "callback": "\u5c1d\u8bd5\u4f7f\u7528\u4e0d\u540c\u7684\u8d26\u6237\u767b\u5f55\u3002",
72 | "oauthaccountnotlinked": "\u4e3a\u4e86\u9a8c\u8bc1\u60a8\u7684\u8eab\u4efd\uff0c\u8bf7\u4f7f\u7528\u6700\u521d\u4f7f\u7528\u7684\u540c\u4e00\u8d26\u6237\u767b\u5f55\u3002",
73 | "emailsignin": "\u65e0\u6cd5\u53d1\u9001\u90ae\u4ef6\u3002",
74 | "emailverify": "\u8bf7\u9a8c\u8bc1\u60a8\u7684\u7535\u5b50\u90ae\u4ef6\uff0c\u5df2\u53d1\u9001\u4e00\u5c01\u65b0\u90ae\u4ef6\u3002",
75 | "credentialssignin": "\u767b\u5f55\u5931\u8d25\u3002\u8bf7\u68c0\u67e5\u60a8\u63d0\u4f9b\u7684\u8be6\u7ec6\u4fe1\u606f\u662f\u5426\u6b63\u786e\u3002",
76 | "sessionrequired": "\u8bf7\u767b\u5f55\u4ee5\u8bbf\u95ee\u6b64\u9875\u9762\u3002"
77 | }
78 | },
79 | "authVerifyEmail": {
80 | "almostThere": "\u60a8\u5feb\u6210\u529f\u4e86\uff01\u6211\u4eec\u5df2\u5411 ",
81 | "verifyEmailLink": "\u8bf7\u5355\u51fb\u8be5\u90ae\u4ef6\u4e2d\u7684\u94fe\u63a5\u4ee5\u5b8c\u6210\u6ce8\u518c\u3002",
82 | "didNotReceive": "\u6ca1\u627e\u5230\u90ae\u4ef6\uff1f",
83 | "resendEmail": "\u91cd\u65b0\u53d1\u9001\u90ae\u4ef6",
84 | "goBack": "\u8fd4\u56de",
85 | "emailSent": "\u90ae\u4ef6\u5df2\u6210\u529f\u53d1\u9001\u3002",
86 | "verifyEmail": "\u9a8c\u8bc1\u60a8\u7684\u7535\u5b50\u90ae\u4ef6\u5730\u5740"
87 | },
88 | "providerButton": {
89 | "continue": "\u4f7f\u7528{{provider}}\u7ee7\u7eed",
90 | "signup": "\u4f7f\u7528{{provider}}\u6ce8\u518c"
91 | },
92 | "authResetPassword": {
93 | "newPasswordRequired": "\u65b0\u5bc6\u7801\u662f\u5fc5\u586b\u9879",
94 | "passwordsMustMatch": "\u5bc6\u7801\u5fc5\u987b\u4e00\u81f4",
95 | "confirmPasswordRequired": "\u786e\u8ba4\u5bc6\u7801\u662f\u5fc5\u586b\u9879",
96 | "newPassword": "\u65b0\u5bc6\u7801",
97 | "confirmPassword": "\u786e\u8ba4\u5bc6\u7801",
98 | "resetPassword": "\u91cd\u7f6e\u5bc6\u7801"
99 | },
100 | "authForgotPassword": {
101 | "email": "\u7535\u5b50\u90ae\u7bb1\u5730\u5740",
102 | "emailRequired": "\u7535\u5b50\u90ae\u7bb1\u662f\u5fc5\u586b\u9879",
103 | "emailSent": "\u8bf7\u68c0\u67e5\u7535\u5b50\u90ae\u7bb1{{email}}\u4ee5\u83b7\u53d6\u91cd\u7f6e\u5bc6\u7801\u7684\u6307\u793a\u3002",
104 | "enterEmail": "\u8bf7\u8f93\u5165\u60a8\u7684\u7535\u5b50\u90ae\u7bb1\u5730\u5740\uff0c\u6211\u4eec\u5c06\u53d1\u9001\u91cd\u7f6e\u5bc6\u7801\u7684\u6307\u793a\u3002",
105 | "resendEmail": "\u91cd\u65b0\u53d1\u9001\u90ae\u4ef6",
106 | "continue": "\u7ee7\u7eed",
107 | "goBack": "\u8fd4\u56de"
108 | }
109 | }
110 | },
111 | "organisms": {
112 | "chat": {
113 | "history": {
114 | "index": {
115 | "showHistory": "\u663e\u793a\u5386\u53f2",
116 | "lastInputs": "\u6700\u540e\u8f93\u5165",
117 | "noInputs": "\u5982\u6b64\u7a7a\u65f7...",
118 | "loading": "\u52a0\u8f7d\u4e2d..."
119 | }
120 | },
121 | "inputBox": {
122 | "input": {
123 | "placeholder": "\u5728\u8fd9\u91cc\u8f93\u5165\u60a8\u7684\u6d88\u606f..."
124 | },
125 | "speechButton": {
126 | "start": "\u5f00\u59cb\u5f55\u97f3",
127 | "stop": "\u505c\u6b62\u5f55\u97f3"
128 | },
129 | "SubmitButton": {
130 | "sendMessage": "\u53d1\u9001\u6d88\u606f",
131 | "stopTask": "\u505c\u6b62\u4efb\u52a1"
132 | },
133 | "UploadButton": {
134 | "attachFiles": "\u9644\u52a0\u6587\u4ef6"
135 | },
136 | "waterMark": {
137 | "text": "\u4f7f\u7528"
138 | }
139 | },
140 | "Messages": {
141 | "index": {
142 | "running": "\u8fd0\u884c\u4e2d",
143 | "executedSuccessfully": "\u6267\u884c\u6210\u529f",
144 | "failed": "\u5931\u8d25",
145 | "feedbackUpdated": "\u53cd\u9988\u66f4\u65b0",
146 | "updating": "\u6b63\u5728\u66f4\u65b0"
147 | }
148 | },
149 | "dropScreen": {
150 | "dropYourFilesHere": "\u5728\u8fd9\u91cc\u62d6\u653e\u60a8\u7684\u6587\u4ef6"
151 | },
152 | "index": {
153 | "failedToUpload": "\u4e0a\u4f20\u5931\u8d25",
154 | "cancelledUploadOf": "\u53d6\u6d88\u4e0a\u4f20",
155 | "couldNotReachServer": "\u65e0\u6cd5\u8fde\u63a5\u5230\u670d\u52a1\u5668",
156 | "continuingChat": "\u7ee7\u7eed\u4e4b\u524d\u7684\u5bf9\u8bdd"
157 | },
158 | "settings": {
159 | "settingsPanel": "\u8bbe\u7f6e\u9762\u677f",
160 | "reset": "\u91cd\u7f6e",
161 | "cancel": "\u53d6\u6d88",
162 | "confirm": "\u786e\u8ba4"
163 | }
164 | },
165 | "threadHistory": {
166 | "sidebar": {
167 | "filters": {
168 | "FeedbackSelect": {
169 | "feedbackAll": "\u53cd\u9988\uff1a\u5168\u90e8",
170 | "feedbackPositive": "\u53cd\u9988\uff1a\u6b63\u9762",
171 | "feedbackNegative": "\u53cd\u9988\uff1a\u8d1f\u9762"
172 | },
173 | "SearchBar": {
174 | "search": "\u641c\u7d22"
175 | }
176 | },
177 | "DeleteThreadButton": {
178 | "confirmMessage": "\u8fd9\u5c06\u5220\u9664\u7ebf\u7a0b\u53ca\u5176\u6d88\u606f\u548c\u5143\u7d20\u3002",
179 | "cancel": "\u53d6\u6d88",
180 | "confirm": "\u786e\u8ba4",
181 | "deletingChat": "\u5220\u9664\u5bf9\u8bdd",
182 | "chatDeleted": "\u5bf9\u8bdd\u5df2\u5220\u9664"
183 | },
184 | "index": {
185 | "pastChats": "\u8fc7\u5f80\u5bf9\u8bdd"
186 | },
187 | "ThreadList": {
188 | "empty": "\u7a7a\u7684...",
189 | "today": "\u4eca\u5929",
190 | "yesterday": "\u6628\u5929",
191 | "previous7days": "\u524d7\u5929",
192 | "previous30days": "\u524d30\u5929"
193 | },
194 | "TriggerButton": {
195 | "closeSidebar": "\u5173\u95ed\u4fa7\u8fb9\u680f",
196 | "openSidebar": "\u6253\u5f00\u4fa7\u8fb9\u680f"
197 | }
198 | },
199 | "Thread": {
200 | "backToChat": "\u8fd4\u56de\u5bf9\u8bdd",
201 | "chatCreatedOn": "\u6b64\u5bf9\u8bdd\u521b\u5efa\u4e8e"
202 | }
203 | },
204 | "header": {
205 | "chat": "\u5bf9\u8bdd",
206 | "readme": "\u8bf4\u660e"
207 | }
208 | }
209 | },
210 | "hooks": {
211 | "useLLMProviders": {
212 | "failedToFetchProviders": "\u83b7\u53d6\u63d0\u4f9b\u8005\u5931\u8d25:"
213 | }
214 | },
215 | "pages": {
216 | "Design": {},
217 | "Env": {
218 | "savedSuccessfully": "\u4fdd\u5b58\u6210\u529f",
219 | "requiredApiKeys": "\u5fc5\u9700\u7684API\u5bc6\u94a5",
220 | "requiredApiKeysInfo": "\u8981\u4f7f\u7528\u6b64\u5e94\u7528\uff0c\u9700\u8981\u4ee5\u4e0bAPI\u5bc6\u94a5\u3002\u8fd9\u4e9b\u5bc6\u94a5\u5b58\u50a8\u5728\u60a8\u7684\u8bbe\u5907\u672c\u5730\u5b58\u50a8\u4e2d\u3002"
221 | },
222 | "Page": {
223 | "notPartOfProject": "\u60a8\u4e0d\u662f\u6b64\u9879\u76ee\u7684\u4e00\u90e8\u5206\u3002"
224 | },
225 | "ResumeButton": {
226 | "resumeChat": "\u6062\u590d\u5bf9\u8bdd"
227 | }
228 | }
229 | }
--------------------------------------------------------------------------------
/app/chainlit.md:
--------------------------------------------------------------------------------
1 | # Meet Samantha
2 |
3 | Samantha is your real-time voice AI assistant inspired by the movie *Her*. She can help you:
4 |
5 | - **Create Python files** based on a topic you provide.
6 | - **Execute Python scripts** and show you the results instantly.
7 | - **Open browser tabs** with URLs based on your requests.
8 | - **Query stock prices** for the latest information on your favorite companies.
9 | - **Draw Plotly charts** to visualize data in an engaging way.
10 | - **Generate images** based on creative prompts.
11 | - **Perform internet searches** to find quick answers or useful resources.
12 | - **Draft LinkedIn posts** to help you share your ideas effectively.
13 |
14 | With Samantha, you have a versatile assistant who can generate and execute code, visualize data, create content, and find information—all seamlessly integrated to help you accomplish tasks efficiently.
--------------------------------------------------------------------------------
/app/config/ai_models.yaml:
--------------------------------------------------------------------------------
1 | # AI model configurations for different tasks
2 | models:
3 | default:
4 | provider: groq
5 | name: llama-3.3-70b-versatile
6 | temperature: 0.1
7 | max_retries: 2
8 |
9 | # Task-specific configurations (override default settings)
10 | sql_generation:
11 | temperature: 0.1 # Lower temperature for more precise SQL generation
12 |
13 | image_prompt:
14 | temperature: 0.25 # Higher temperature for creative prompts
15 |
16 | linkedin_post:
17 | temperature: 0.5 # Higher temperature for creative writing
18 |
19 | python_code:
20 | temperature: 0.1 # Lower temperature for code generation
21 |
22 | creative_content:
23 | temperature: 0.5 # Higher temperature for creative scene descriptions
24 |
25 | # Image generation models
26 | image_generation:
27 | provider: together
28 | name: black-forest-labs/FLUX.1.1-pro
29 | width: 1024
30 | height: 768
31 | steps: 4
32 | n: 1
33 | response_format: b64_json
--------------------------------------------------------------------------------
/app/config/database.py:
--------------------------------------------------------------------------------
1 | """Database configuration and connection management."""
2 |
3 | import os
4 | from typing import Any, Dict, Optional
5 |
6 | from pydantic import BaseModel, Field
7 | from sqlalchemy import create_engine, text
8 | from utils.common import logger
9 |
10 |
11 | class DatabaseConfig(BaseModel):
12 | """Database configuration."""
13 |
14 | dialect: str = Field(
15 | ...,
16 | description="Database dialect (e.g., 'postgresql', 'mysql', 'sqlite')",
17 | )
18 | username: Optional[str] = Field(
19 | None,
20 | description="Database username",
21 | )
22 | password: Optional[str] = Field(
23 | None,
24 | description="Database password",
25 | )
26 | host: Optional[str] = Field(
27 | None,
28 | description="Database host",
29 | )
30 | port: Optional[int] = Field(
31 | None,
32 | description="Database port",
33 | )
34 | database: str = Field(
35 | ...,
36 | description="Database name",
37 | )
38 |
39 |
40 | class DatabaseConnection:
41 | """Manages database connections and operations."""
42 |
43 | def __init__(self):
44 | self._engine = None
45 | self._connection_string = None
46 |
47 | def connect(self, config: DatabaseConfig) -> bool:
48 | """Creates a database connection based on the provided configuration."""
49 | try:
50 | # Build connection string based on dialect
51 | if config.dialect == "sqlite":
52 | self._connection_string = f"sqlite:///{config.database}"
53 | else:
54 | # For PostgreSQL, MySQL, etc.
55 | auth = f"{config.username}:{config.password}@" if config.username else ""
56 | host = f"{config.host}:{config.port}" if config.host else "localhost"
57 | self._connection_string = f"{config.dialect}://{auth}{host}/{config.database}"
58 |
59 | self._engine = create_engine(self._connection_string)
60 | # Test connection
61 | with self._engine.connect() as conn:
62 | conn.execute(text("SELECT 1"))
63 |
64 | logger.info(f"Successfully connected to {config.dialect} database: {config.database}")
65 | return True
66 |
67 | except Exception as e:
68 | logger.error(f"Error connecting to database: {str(e)}")
69 | return False
70 |
71 | def execute_query(self, query: str) -> Dict[str, Any]:
72 | """Executes a SQL query and returns the results."""
73 | if not self._engine:
74 | return {"error": "No database connection established"}
75 |
76 | try:
77 | with self._engine.connect() as conn:
78 | result = conn.execute(text(query))
79 |
80 | if query.strip().lower().startswith("select"):
81 | # For SELECT queries, return the results
82 | columns = result.keys()
83 | rows = [dict(zip(columns, row)) for row in result.fetchall()]
84 | return {"columns": columns, "rows": rows}
85 | else:
86 | # For INSERT, UPDATE, DELETE queries, return affected rows
87 | return {"affected_rows": result.rowcount}
88 |
89 | except Exception as e:
90 | logger.error(f"Error executing query: {str(e)}")
91 | return {"error": str(e)}
92 |
93 |
94 | # Create a global database connection instance
95 | db_connection = DatabaseConnection()
96 |
97 | # Configure the database connection from environment variables or configuration file
98 | db_config = DatabaseConfig(
99 | dialect=os.getenv("DB_DIALECT", "sqlite"),
100 | username=os.getenv("DB_USERNAME"),
101 | password=os.getenv("DB_PASSWORD"),
102 | host=os.getenv("DB_HOST"),
103 | port=os.getenv("DB_PORT", 5432) if os.getenv("DB_PORT") else None,
104 | database=os.getenv("DB_DATABASE", "database.db"),
105 | )
106 |
107 | # Initialize the database connection
108 | db_connection.connect(db_config)
109 |
110 | # Get database dialect-specific information
111 | dialect_info = {
112 | "sqlite": {
113 | "notes": """
114 | - Use SQLite date/time functions (strftime, datetime)
115 | - For current date, use 'date("now")'
116 | - For date arithmetic, use strftime functions
117 | - Dates are stored as TEXT in ISO format (YYYY-MM-DD HH:MM:SS)
118 | """,
119 | "examples": """
120 | - Last month's data:
121 | WHERE created_at >= date('now', 'start of month', '-1 month')
122 | AND created_at < date('now', 'start of month')
123 | """,
124 | },
125 | "postgresql": {
126 | "notes": """
127 | - Use PostgreSQL date/time functions (date_trunc, interval)
128 | - For current date, use CURRENT_DATE
129 | - For date arithmetic, use interval
130 | - Dates are stored in native timestamp format
131 | """,
132 | "examples": """
133 | - Last month's data:
134 | WHERE created_at >= date_trunc('month', current_date - interval '1 month')
135 | AND created_at < date_trunc('month', current_date)
136 | """,
137 | },
138 | }
139 |
--------------------------------------------------------------------------------
/app/config/realtime_instructions.txt:
--------------------------------------------------------------------------------
1 | System settings:
2 | Tool use: enabled.
3 |
4 | Instructions:
5 | - You are an artificial intelligence agent called Samantha responsible for helping test realtime voice capabilities
6 | - You have access to a classic literature bookstore database with information about:
7 | * Customers (their names, emails, and activity status)
8 | * Books (classic titles, authors, genres, prices, and stock)
9 | * Orders (purchase history, quantities, amounts, and status)
10 | - You can help analyze sales trends, customer behavior, and book popularity
11 | - You can answer questions like "What were the most popular books last week?" or "Which authors are trending?" using the database tool
12 | - Please make sure to respond with a helpful voice via audio
13 | - Be kind, helpful, and courteous
14 | - It is okay to ask the user questions about their bookstore data needs
15 | - Use tools and functions you have available liberally, it is part of the training apparatus
16 | - Be open to exploration and conversation about books and business insights
17 | - Remember: this is just for fun and testing!
18 |
19 | Personality:
20 | - Be upbeat and genuine
21 | - Show enthusiasm about books and literature
22 | - Express excitement when discovering interesting patterns in the data
23 | - Try speaking quickly as if excited about sharing bookstore insights
--------------------------------------------------------------------------------
/app/config/realtime_instructions_base.txt:
--------------------------------------------------------------------------------
1 | System settings:
2 | Tool use: enabled.
3 |
4 | Instructions:
5 | - You are an artificial intelligence agent called Samantha responsible for helping test realtime voice capabilities
6 | - Please make sure to respond with a helpful voice via audio
7 | - Be kind, helpful, and curteous
8 | - It is okay to ask the user questions
9 | - Use tools and functions you have available liberally, it is part of the training apparatus
10 | - Be open to exploration and conversation
11 | - Remember: this is just for fun and testing!
12 |
13 | Personality:
14 | - Be upbeat and genuine
15 | - Try speaking quickly as if excited
--------------------------------------------------------------------------------
/app/config/schema.yaml:
--------------------------------------------------------------------------------
1 | # Database schema description for natural language to SQL conversion
2 | schema:
3 | tables:
4 | users:
5 | description: Customer accounts in the bookstore
6 | columns:
7 | - name: id
8 | type: integer
9 | description: Primary key
10 | constraints: primary key
11 | - name: first_name
12 | type: text
13 | description: Customer's first name
14 | constraints: not null
15 | - name: last_name
16 | type: text
17 | description: Customer's last name
18 | constraints: not null
19 | - name: email
20 | type: text
21 | description: Customer's email address
22 | constraints: not null
23 | - name: created_at
24 | type: timestamp
25 | description: When the customer account was created
26 | constraints: default current_timestamp
27 | - name: is_active
28 | type: boolean
29 | description: Whether the customer account is active
30 | constraints: not null
31 |
32 | books:
33 | description: Classic literature books available in the store
34 | columns:
35 | - name: id
36 | type: integer
37 | description: Primary key
38 | constraints: primary key
39 | - name: title
40 | type: text
41 | description: Book title
42 | constraints: not null
43 | - name: author
44 | type: text
45 | description: Book author
46 | constraints: not null
47 | - name: price
48 | type: decimal
49 | description: Book price in USD
50 | constraints: not null
51 | - name: genre
52 | type: text
53 | description: Book genre (e.g., Science Fiction, Literary Fiction)
54 | constraints: not null
55 | - name: publication_year
56 | type: integer
57 | description: Year when the book was first published
58 | constraints: not null
59 | - name: stock
60 | type: integer
61 | description: Current available stock
62 | constraints: default 100
63 |
64 | orders:
65 | description: Customer book orders and their details
66 | columns:
67 | - name: id
68 | type: integer
69 | description: Primary key
70 | constraints: primary key
71 | - name: user_id
72 | type: integer
73 | description: Reference to the customer who placed the order
74 | constraints: foreign key to users.id
75 | - name: book_id
76 | type: integer
77 | description: Reference to the purchased book
78 | constraints: foreign key to books.id
79 | - name: quantity
80 | type: integer
81 | description: Number of books purchased
82 | constraints: not null
83 | - name: total_amount
84 | type: decimal
85 | description: Total order amount in USD
86 | constraints: not null
87 | - name: status
88 | type: text
89 | description: Order status
90 | constraints: "in ('pending', 'completed', 'cancelled')"
91 | - name: created_at
92 | type: timestamp
93 | description: When the order was placed
94 | constraints: default current_timestamp
95 |
96 | example_queries:
97 | - question: "What were the most popular books last week?"
98 | sql: |
99 | SELECT b.title,
100 | b.author,
101 | SUM(o.quantity) as copies_sold,
102 | SUM(o.total_amount) as revenue
103 | FROM books b
104 | JOIN orders o ON b.id = o.book_id
105 | WHERE o.status = 'completed'
106 | AND o.created_at >= date('now', '-7 days')
107 | GROUP BY b.id, b.title, b.author
108 | ORDER BY copies_sold DESC
109 | LIMIT 5
110 | explanation: "Lists top 5 books by number of copies sold in the last 7 days"
111 |
112 | - question: "Who are our most valuable customers?"
113 | sql: |
114 | SELECT
115 | u.first_name,
116 | u.last_name,
117 | COUNT(o.id) as order_count,
118 | SUM(o.quantity) as total_books_bought,
119 | ROUND(SUM(o.total_amount), 2) as total_spent
120 | FROM users u
121 | JOIN orders o ON u.id = o.user_id
122 | WHERE o.status = 'completed'
123 | GROUP BY u.id, u.first_name, u.last_name
124 | ORDER BY total_spent DESC
125 | LIMIT 5
126 | explanation: "Shows top 5 customers by total spending, including their order count and total books purchased"
127 |
128 | - question: "What are the trending genres this month?"
129 | sql: |
130 | SELECT
131 | b.genre,
132 | COUNT(DISTINCT o.id) as order_count,
133 | SUM(o.quantity) as books_sold,
134 | ROUND(SUM(o.total_amount), 2) as revenue
135 | FROM books b
136 | JOIN orders o ON b.id = o.book_id
137 | WHERE o.status = 'completed'
138 | AND o.created_at >= date('now', 'start of month')
139 | GROUP BY b.genre
140 | ORDER BY books_sold DESC
141 | explanation: "Analyzes book sales by genre for the current month"
142 |
143 | - question: "Which authors are generating the most revenue?"
144 | sql: |
145 | SELECT
146 | b.author,
147 | COUNT(DISTINCT b.id) as books_in_store,
148 | SUM(o.quantity) as total_books_sold,
149 | ROUND(SUM(o.total_amount), 2) as total_revenue
150 | FROM books b
151 | LEFT JOIN orders o ON b.id = o.book_id AND o.status = 'completed'
152 | GROUP BY b.author
153 | ORDER BY total_revenue DESC
154 | LIMIT 10
155 | explanation: "Lists top 10 authors by revenue, including their book count and total sales"
--------------------------------------------------------------------------------
/app/public/avatars/my-assistant.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jesuscopado/samantha-os1/f327bb294c92537a197c1be4d4e0bba97075efe7/app/public/avatars/my-assistant.png
--------------------------------------------------------------------------------
/app/public/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jesuscopado/samantha-os1/f327bb294c92537a197c1be4d4e0bba97075efe7/app/public/favicon.png
--------------------------------------------------------------------------------
/app/public/logo_dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jesuscopado/samantha-os1/f327bb294c92537a197c1be4d4e0bba97075efe7/app/public/logo_dark.png
--------------------------------------------------------------------------------
/app/public/logo_light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jesuscopado/samantha-os1/f327bb294c92537a197c1be4d4e0bba97075efe7/app/public/logo_light.png
--------------------------------------------------------------------------------
/app/public/stylesheet.css:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jesuscopado/samantha-os1/f327bb294c92537a197c1be4d4e0bba97075efe7/app/public/stylesheet.css
--------------------------------------------------------------------------------
/app/samantha.py:
--------------------------------------------------------------------------------
1 | """
2 | Derived from https://github.com/Chainlit/cookbook/tree/main/realtime-assistant
3 | """
4 |
5 | import os
6 | import asyncio
7 | import traceback
8 |
9 | import chainlit as cl
10 | from uuid import uuid4
11 | from chainlit.logger import logger
12 |
13 | from realtime import RealtimeClient
14 | from tools import tools
15 |
16 |
17 | async def setup_openai_realtime():
18 | """Instantiate and configure the OpenAI Realtime Client"""
19 | openai_realtime = RealtimeClient()
20 | cl.user_session.set("track_id", str(uuid4()))
21 |
22 | async def handle_conversation_updated(event):
23 | item = event.get("item")
24 | delta = event.get("delta")
25 | """Currently used to stream audio back to the client."""
26 | if delta:
27 | # Only one of the following will be populated for any given event
28 | if "audio" in delta:
29 | audio = delta["audio"] # Int16Array, audio added
30 | await cl.context.emitter.send_audio_chunk(
31 | cl.OutputAudioChunk(
32 | mimeType="pcm16",
33 | data=audio,
34 | track=cl.user_session.get("track_id"),
35 | )
36 | )
37 | if "transcript" in delta:
38 | transcript = delta["transcript"] # string, transcript added
39 | pass
40 | if "arguments" in delta:
41 | arguments = delta["arguments"] # string, function arguments added
42 | pass
43 |
44 | async def handle_item_completed(item):
45 | """Used to populate the chat context with transcription once an item is completed."""
46 | # print(item) # TODO
47 | pass
48 |
49 | async def handle_conversation_interrupt(event):
50 | """Used to cancel the client previous audio playback."""
51 | cl.user_session.set("track_id", str(uuid4()))
52 | await cl.context.emitter.send_audio_interrupt()
53 |
54 | async def handle_error(event):
55 | logger.error(event)
56 |
57 | openai_realtime.on("conversation.updated", handle_conversation_updated)
58 | openai_realtime.on("conversation.item.completed", handle_item_completed)
59 | openai_realtime.on("conversation.interrupted", handle_conversation_interrupt)
60 | openai_realtime.on("error", handle_error)
61 |
62 | cl.user_session.set("openai_realtime", openai_realtime)
63 | coros = [
64 | openai_realtime.add_tool(tool_def, tool_handler)
65 | for tool_def, tool_handler in tools
66 | ]
67 | await asyncio.gather(*coros)
68 |
69 |
70 | @cl.on_chat_start
71 | async def start():
72 | await cl.Message(content="Hello! I'm here. Press `P` to talk!").send()
73 | await setup_openai_realtime()
74 |
75 |
76 | @cl.on_message
77 | async def on_message(message: cl.Message):
78 | openai_realtime: RealtimeClient = cl.user_session.get("openai_realtime")
79 | if openai_realtime and openai_realtime.is_connected():
80 | # TODO: Try image processing with message.elements
81 | await openai_realtime.send_user_message_content(
82 | [{"type": "input_text", "text": message.content}]
83 | )
84 | else:
85 | await cl.Message(
86 | content="Please activate voice mode before sending messages!"
87 | ).send()
88 |
89 |
90 | @cl.on_audio_start
91 | async def on_audio_start():
92 | try:
93 | openai_realtime: RealtimeClient = cl.user_session.get("openai_realtime")
94 | await openai_realtime.connect()
95 | logger.info("Connected to OpenAI realtime")
96 | # TODO: might want to recreate items to restore context
97 | # openai_realtime.create_conversation_item(item)
98 | return True
99 | except Exception as e:
100 | print(traceback.format_exc())
101 | await cl.ErrorMessage(
102 | content=f"Failed to connect to OpenAI realtime: {e}"
103 | ).send()
104 | return False
105 |
106 |
107 | @cl.on_audio_chunk
108 | async def on_audio_chunk(chunk: cl.InputAudioChunk):
109 | openai_realtime: RealtimeClient = cl.user_session.get("openai_realtime")
110 | if openai_realtime.is_connected():
111 | await openai_realtime.append_input_audio(chunk.data)
112 | else:
113 | logger.info("RealtimeClient is not connected")
114 |
115 |
116 | @cl.on_audio_end
117 | @cl.on_chat_end
118 | @cl.on_stop
119 | async def on_end():
120 | openai_realtime: RealtimeClient = cl.user_session.get("openai_realtime")
121 | if openai_realtime and openai_realtime.is_connected():
122 | await openai_realtime.disconnect()
123 |
--------------------------------------------------------------------------------
/app/scripts/create_sample_db.py:
--------------------------------------------------------------------------------
1 | """Script to create a sample SQLite database for a classic literature bookstore."""
2 |
3 | import os
4 | import sqlite3
5 | from datetime import datetime, timedelta
6 | import random
7 |
8 | # Database path
9 | DB_PATH = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "scratchpad", "bookstore.db")
10 | os.makedirs(os.path.dirname(DB_PATH), exist_ok=True)
11 |
12 | # Sample data
13 | SAMPLE_USERS = [
14 | ("John", "Doe", "john@example.com", True),
15 | ("Jane", "Smith", "jane@example.com", True),
16 | ("Robert", "Wilson", "bob@example.com", False),
17 | ("Alice", "Brown", "alice@example.com", True),
18 | ("Charles", "Davis", "charlie@example.com", True),
19 | ("Emma", "Jones", "emma@example.com", False),
20 | ("David", "Miller", "david@example.com", True),
21 | ("Sophia", "Wilson", "sophia@example.com", True),
22 | ("James", "Taylor", "james@example.com", True),
23 | ("Olivia", "Moore", "olivia@example.com", False),
24 | ("Michael", "Anderson", "michael@example.com", True),
25 | ("Elena", "Garcia", "elena@example.com", True),
26 | ("William", "Martinez", "william@example.com", True),
27 | ("Isabella", "Lopez", "isabella@example.com", True),
28 | ("Alexander", "Lee", "alex@example.com", True),
29 | ]
30 |
31 | SAMPLE_BOOKS = [
32 | ("I, Robot", "Isaac Asimov", 15.99, "Science Fiction", 1950),
33 | ("Foundation", "Isaac Asimov", 14.99, "Science Fiction", 1951),
34 | ("The Metamorphosis", "Franz Kafka", 12.99, "Fiction", 1915),
35 | ("The Trial", "Franz Kafka", 13.99, "Fiction", 1925),
36 | ("Crime and Punishment", "Fyodor Dostoevsky", 16.99, "Literary Fiction", 1866),
37 | ("The Brothers Karamazov", "Fyodor Dostoevsky", 17.99, "Literary Fiction", 1880),
38 | ("Siddhartha", "Hermann Hesse", 11.99, "Philosophical Fiction", 1922),
39 | ("Steppenwolf", "Hermann Hesse", 13.99, "Philosophical Fiction", 1927),
40 | ("The Glass Bead Game", "Hermann Hesse", 14.99, "Philosophical Fiction", 1943),
41 | ("1984", "George Orwell", 13.99, "Dystopian Fiction", 1949),
42 | ("Animal Farm", "George Orwell", 12.99, "Political Satire", 1945),
43 | ("Brave New World", "Aldous Huxley", 14.99, "Dystopian Fiction", 1932),
44 | ("The Old Man and the Sea", "Ernest Hemingway", 11.99, "Literary Fiction", 1952),
45 | ("To Kill a Mockingbird", "Harper Lee", 13.99, "Literary Fiction", 1960),
46 | ("One Hundred Years of Solitude", "Gabriel García Márquez", 15.99, "Magical Realism", 1967),
47 | ]
48 |
49 |
50 | def create_sample_database():
51 | """Creates a sample bookstore database with users, books, and orders tables."""
52 |
53 | # Set the store opening date (3 months ago from Dec 25, 2024)
54 | STORE_OPENING_DATE = datetime(2024, 9, 25)
55 | CURRENT_DATE = datetime(2024, 12, 25)
56 |
57 | # Connect to SQLite database (creates it if it doesn't exist)
58 | conn = sqlite3.connect(DB_PATH)
59 | cursor = conn.cursor()
60 |
61 | try:
62 | # Create users table
63 | cursor.execute(
64 | """
65 | CREATE TABLE users (
66 | id INTEGER PRIMARY KEY AUTOINCREMENT,
67 | first_name TEXT NOT NULL,
68 | last_name TEXT NOT NULL,
69 | email TEXT NOT NULL,
70 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
71 | is_active BOOLEAN NOT NULL
72 | )
73 | """
74 | )
75 |
76 | # Create books table
77 | cursor.execute(
78 | """
79 | CREATE TABLE books (
80 | id INTEGER PRIMARY KEY AUTOINCREMENT,
81 | title TEXT NOT NULL,
82 | author TEXT NOT NULL,
83 | price DECIMAL(10,2) NOT NULL,
84 | genre TEXT NOT NULL,
85 | publication_year INTEGER NOT NULL,
86 | stock INTEGER DEFAULT 100
87 | )
88 | """
89 | )
90 |
91 | # Create orders table
92 | cursor.execute(
93 | """
94 | CREATE TABLE orders (
95 | id INTEGER PRIMARY KEY AUTOINCREMENT,
96 | user_id INTEGER NOT NULL,
97 | book_id INTEGER NOT NULL,
98 | quantity INTEGER NOT NULL,
99 | total_amount DECIMAL(10,2) NOT NULL,
100 | status TEXT CHECK(status IN ('pending', 'completed', 'cancelled')) NOT NULL,
101 | created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
102 | FOREIGN KEY (user_id) REFERENCES users (id),
103 | FOREIGN KEY (book_id) REFERENCES books (id)
104 | )
105 | """
106 | )
107 |
108 | # Insert sample users
109 | current_time = CURRENT_DATE
110 | for first_name, last_name, email, is_active in SAMPLE_USERS:
111 | cursor.execute(
112 | "INSERT INTO users (first_name, last_name, email, created_at, is_active) VALUES (?, ?, ?, ?, ?)",
113 | (first_name, last_name, email, current_time, is_active),
114 | )
115 | current_time -= timedelta(days=random.randint(1, 90))
116 |
117 | # Insert sample books
118 | for title, author, price, genre, year in SAMPLE_BOOKS:
119 | cursor.execute(
120 | "INSERT INTO books (title, author, price, genre, publication_year) VALUES (?, ?, ?, ?, ?)",
121 | (title, author, price, genre, year),
122 | )
123 |
124 | # Insert sample orders
125 | statuses = ["completed"] * 8 + ["pending"] * 1 + ["cancelled"] * 1 # 80% completed, 10% pending, 10% cancelled
126 | current_time = CURRENT_DATE
127 |
128 | # Create multiple orders for each user
129 | for user_id in range(1, len(SAMPLE_USERS) + 1):
130 | # Generate 5-15 orders per user
131 | num_orders = random.randint(5, 15)
132 | for _ in range(num_orders):
133 | book_id = random.randint(1, len(SAMPLE_BOOKS))
134 | quantity = random.randint(1, 3)
135 | # Get the book price directly from SAMPLE_BOOKS using book_id - 1 as index
136 | book_price = SAMPLE_BOOKS[book_id - 1][2] # Index 2 is the price in the book tuple
137 | total_amount = round(quantity * book_price, 2)
138 | status = random.choice(statuses)
139 |
140 | # Orders within the last 3 months
141 | order_date = STORE_OPENING_DATE + timedelta(
142 | days=random.randint(0, 90), hours=random.randint(0, 23), minutes=random.randint(0, 59)
143 | )
144 |
145 | cursor.execute(
146 | "INSERT INTO orders (user_id, book_id, quantity, total_amount, status, created_at) VALUES (?, ?, ?, ?, ?, ?)",
147 | (user_id, book_id, quantity, total_amount, status, order_date),
148 | )
149 |
150 | # Commit the changes
151 | conn.commit()
152 | print(f"✅ Sample bookstore database created successfully at {DB_PATH}")
153 |
154 | # Print some sample data
155 | print("\n📊 Sample Queries:")
156 |
157 | print("\nActive Users:")
158 | cursor.execute(
159 | """
160 | SELECT first_name, last_name, email
161 | FROM users
162 | WHERE is_active = 1
163 | LIMIT 3
164 | """
165 | )
166 | print(cursor.fetchall())
167 |
168 | print("\nAvailable Books:")
169 | cursor.execute(
170 | """
171 | SELECT title, author, price
172 | FROM books
173 | LIMIT 3
174 | """
175 | )
176 | print(cursor.fetchall())
177 |
178 | print("\nRecent Orders:")
179 | cursor.execute(
180 | """
181 | SELECT u.first_name, u.last_name, b.title, o.quantity, o.total_amount, o.created_at
182 | FROM orders o
183 | JOIN users u ON o.user_id = u.id
184 | JOIN books b ON o.book_id = b.id
185 | ORDER BY o.created_at DESC
186 | LIMIT 3
187 | """
188 | )
189 | print(cursor.fetchall())
190 |
191 | except Exception as e:
192 | print(f"❌ Error creating database: {str(e)}")
193 | conn.rollback()
194 | finally:
195 | conn.close()
196 |
197 |
198 | if __name__ == "__main__":
199 | create_sample_database()
200 |
--------------------------------------------------------------------------------
/app/scripts/test_tools/mock_chainlit.py:
--------------------------------------------------------------------------------
1 | """Mock chainlit for testing."""
2 |
3 | from contextlib import contextmanager
4 | from unittest.mock import patch
5 |
6 |
7 | class MockMessage:
8 | """Mock chainlit Message for testing."""
9 |
10 | def __init__(self, content: str, *args, **kwargs):
11 | self.content = content
12 |
13 | async def send(self):
14 | """Print message content instead of sending to chainlit."""
15 | print(f"\n=== Chainlit Message ===\n{self.content}\n=====================")
16 |
17 |
18 | @contextmanager
19 | def mock_chainlit():
20 | """Context manager to temporarily replace chainlit's Message class."""
21 | with patch("chainlit.Message", MockMessage):
22 | yield
23 |
--------------------------------------------------------------------------------
/app/scripts/test_tools/test_create_python_file.py:
--------------------------------------------------------------------------------
1 | """Test for Python file creation using LLM."""
2 |
3 | from dotenv import load_dotenv
4 | from langchain.prompts import PromptTemplate
5 | from pydantic import BaseModel, Field
6 | from utils.ai_models import get_llm
7 |
8 | load_dotenv()
9 |
10 |
11 | class PythonFile(BaseModel):
12 | """Python file content."""
13 |
14 | filename: str = Field(
15 | ...,
16 | description="The name of the Python file with the extension .py",
17 | )
18 | content: str = Field(
19 | ...,
20 | description="The Python code to be saved in the file",
21 | )
22 |
23 |
24 | # Get LLM instance configured for Python code generation
25 | llm = get_llm("python_code")
26 | structured_llm = llm.with_structured_output(PythonFile)
27 |
28 | system_template = """
29 | Create a Python script for the given topic. The script should be well-commented, use best practices, and aim to be simple yet effective.
30 | Include informative docstrings and comments where necessary.
31 |
32 | # Topic
33 | {topic}
34 |
35 | # Requirements
36 | 1. **Define Purpose**: Write a brief docstring explaining the purpose of the script.
37 | 2. **Implement Logic**: Implement the logic related to the topic, keeping the script easy to understand.
38 | 3. **Best Practices**: Follow Python best practices, such as using functions where appropriate and adding comments to clarify the code.
39 | """
40 |
41 | prompt_template = PromptTemplate(
42 | input_variables=["topic"],
43 | template=system_template,
44 | )
45 |
46 | chain = prompt_template | structured_llm
47 |
48 | if __name__ == "__main__":
49 | response = chain.invoke({"topic": "Print a random number from 500 to 1000."})
50 | print(response.filename)
51 | print(response.content)
52 |
--------------------------------------------------------------------------------
/app/scripts/test_tools/test_database_tool.py:
--------------------------------------------------------------------------------
1 | """Test suite for tools."""
2 |
3 | import asyncio
4 |
5 | from dotenv import load_dotenv
6 | from mock_chainlit import mock_chainlit
7 | from tools.database import execute_sql_handler
8 |
9 | load_dotenv()
10 |
11 |
12 | async def test_database_tools():
13 | """Test database queries with mocked chainlit."""
14 | with mock_chainlit():
15 | await execute_sql_handler("Show me all active users")
16 | await execute_sql_handler("How many orders were placed last month?")
17 | await execute_sql_handler("Who are the top 5 users by order amount?")
18 |
19 |
20 | if __name__ == "__main__":
21 | asyncio.run(test_database_tools())
22 |
--------------------------------------------------------------------------------
/app/scripts/test_tools/test_flux_togetherai.py:
--------------------------------------------------------------------------------
1 | """Test for image generation using Together AI's FLUX model."""
2 |
3 | import os
4 | import base64
5 | from together import Together
6 | from dotenv import load_dotenv
7 | from ..utils.ai_models import get_image_generation_config
8 |
9 | load_dotenv()
10 |
11 | client = Together(api_key=os.environ.get("TOGETHER_API_KEY"))
12 |
13 | if __name__ == "__main__":
14 | # Get image generation configuration
15 | img_config = get_image_generation_config()
16 |
17 | # Generate image using the Together API
18 | response = client.images.generate(
19 | prompt="A beautiful sunset over a mountain range",
20 | model=img_config["name"],
21 | width=img_config["width"],
22 | height=img_config["height"],
23 | steps=img_config["steps"],
24 | n=img_config["n"],
25 | response_format=img_config["response_format"],
26 | )
27 |
28 | # Get the base64-encoded image from the response
29 | b64_image = response.data[0].b64_json
30 |
31 | # Decode the base64 string to binary data
32 | image_data = base64.b64decode(b64_image)
33 |
34 | # Save the image to your local system as a .png file
35 | with open("generated_image.png", "wb") as f:
36 | f.write(image_data)
37 |
38 | print("Image saved as 'generated_image.png'")
39 |
--------------------------------------------------------------------------------
/app/scripts/test_tools/test_llama_32.py:
--------------------------------------------------------------------------------
1 | """Test for Llama 3.2 vision model capabilities."""
2 |
3 | import os
4 | import base64
5 | from groq import Groq
6 | from dotenv import load_dotenv
7 |
8 | load_dotenv()
9 |
10 |
11 | def encode_image(image_path: str) -> str:
12 | """Encodes an image file to base64 string."""
13 | with open(image_path, "rb") as image_file:
14 | return base64.b64encode(image_file.read()).decode("utf-8")
15 |
16 |
17 | if __name__ == "__main__":
18 | # Path to your image
19 | image_path = "path/to/your/image.png"
20 | base64_image = encode_image(image_path)
21 |
22 | client = Groq()
23 | chat_completion = client.chat.completions.create(
24 | messages=[
25 | {
26 | "role": "user",
27 | "content": [
28 | {
29 | "type": "text",
30 | "text": "You're an image caption expert specifically designed to write image captions that will be used in text-to-image models like Midjourney or FLUX. I'll give you an image and you directly need to answer with the caption that best describes the image. Every description must be complete, describing character, composition, lightning, style, artist, etc.",
31 | },
32 | {
33 | "type": "text",
34 | "text": "An example of a caption could be: 'A black-and-white portrait of a young woman laughing with her eyes closed, capturing a spontaneous and joyful expression. She has straight, shoulder-length hair and wears small hoop earrings. The high contrast lighting enhances her facial features and creates a striking shadow on her bare shoulders against the plain white background. The photograph's minimalist composition and raw emotion evoke a sense of authenticity and freedom, reminiscent of classic, candid portraiture in fashion and editorial photography.'",
35 | },
36 | {
37 | "type": "text",
38 | "text": "Please write a caption for the following image:",
39 | },
40 | {
41 | "type": "image_url",
42 | "image_url": {
43 | "url": f"data:image/jpeg;base64,{base64_image}",
44 | },
45 | },
46 | ],
47 | }
48 | ],
49 | model="llama-3.2-11b-vision-preview",
50 | )
51 |
52 | print(chat_completion.choices[0].message.content)
53 |
--------------------------------------------------------------------------------
/app/scripts/test_tools/test_structured_output_list.py:
--------------------------------------------------------------------------------
1 | """Test for structured output list generation using LLM."""
2 |
3 | import os
4 | from typing import List
5 | from langchain.prompts import PromptTemplate
6 | from pydantic import BaseModel, Field
7 | from langchain.output_parsers import CommaSeparatedListOutputParser
8 | from utils.ai_models import get_llm
9 |
10 |
11 | class CommercialScenes(BaseModel):
12 | """A structured output for commercial scenes."""
13 |
14 | scene_descriptions: List[str] = Field(
15 | ...,
16 | description="A list of scene descriptions for a commercial",
17 | )
18 |
19 |
20 | # Get LLM instance with creative temperature for scene descriptions
21 | llm = get_llm("creative_content")
22 | structured_llm = llm.with_structured_output(CommercialScenes)
23 |
24 | system_template = """
25 | Create a list of {{number_of_scenes}} scene descriptions for a {{topic}} commercial in the location {{location}}. Each scene should be a short paragraph that describes the scene in detail.
26 | """
27 |
28 | prompt_template = PromptTemplate(
29 | input_variables=["number_of_scenes", "topic", "location"],
30 | template=system_template,
31 | )
32 |
33 | # Define an output parser
34 | output_parser = CommaSeparatedListOutputParser()
35 |
36 | if __name__ == "__main__":
37 | chain = prompt_template | llm | output_parser
38 | scene_list = chain.invoke({"number_of_scenes": 5, "topic": "range rover", "location": "Lanzarote"})
39 | print(scene_list)
40 |
--------------------------------------------------------------------------------
/app/scripts/test_tools/test_subprocess.py:
--------------------------------------------------------------------------------
1 | from subprocess import run
2 |
3 | result = run(
4 | ["python", "-c", "import sys; print(sys.executable)"],
5 | capture_output=True,
6 | text=True,
7 | )
8 | print(result.stdout)
9 |
--------------------------------------------------------------------------------
/app/scripts/test_tools/test_tavily.py:
--------------------------------------------------------------------------------
1 | from tavily import TavilyClient
2 | import os
3 |
4 | tavily_client = TavilyClient(api_key=os.environ.get("TAVILY_API_KEY"))
5 |
6 | response = tavily_client.qna_search("What's the weather like in Madrid tomorrow?")
7 | print(response)
8 |
9 | response = tavily_client.search("What's the weather like in Madrid tomorrow?")
10 | print(response)
11 |
12 | type(response)
13 |
--------------------------------------------------------------------------------
/app/tools/__init__.py:
--------------------------------------------------------------------------------
1 | """Tool definitions and handlers."""
2 |
3 | from .stock import query_stock_price
4 | from .chart import draw_plotly_chart
5 | from .image import generate_image
6 | from .search import internet_search
7 | from .linkedin import draft_linkedin_post
8 | from .python_file import create_python_file, execute_python_file
9 | from .browser import open_browser
10 | from .database import execute_sql
11 | from .email import draft_email
12 |
13 | tools = [
14 | query_stock_price,
15 | draw_plotly_chart,
16 | generate_image,
17 | internet_search,
18 | draft_linkedin_post,
19 | create_python_file,
20 | execute_python_file,
21 | open_browser,
22 | execute_sql,
23 | draft_email,
24 | ]
25 |
26 | __all__ = ["tools"]
27 |
--------------------------------------------------------------------------------
/app/tools/browser.py:
--------------------------------------------------------------------------------
1 | """Browser interaction tool."""
2 |
3 | import asyncio
4 | import webbrowser
5 | from concurrent.futures import ThreadPoolExecutor
6 |
7 | from pydantic import BaseModel, Field
8 | from utils.ai_models import get_llm
9 | from utils.common import logger
10 |
11 |
12 | class WebUrl(BaseModel):
13 | """Web URL response."""
14 |
15 | url: str = Field(
16 | ...,
17 | description="The URL to open in the browser",
18 | )
19 |
20 |
21 | open_browser_def = {
22 | "name": "open_browser",
23 | "description": "Opens a browser tab with the best-fitting URL based on the user's prompt.",
24 | "parameters": {
25 | "type": "object",
26 | "properties": {
27 | "prompt": {
28 | "type": "string",
29 | "description": "The user's prompt to determine which URL to open.",
30 | },
31 | },
32 | "required": ["prompt"],
33 | },
34 | }
35 |
36 |
37 | async def open_browser_handler(prompt: str):
38 | """Open a browser tab with the best-fitting URL based on the user's prompt."""
39 | try:
40 | logger.info(f"📖 open_browser() Prompt: {prompt}")
41 |
42 | browser_urls = [
43 | "https://www.chatgpt.com",
44 | "https://www.tesla.com",
45 | "https://www.spacex.com",
46 | "https://www.goodreads.com",
47 | ]
48 | browser_urls_str = "\n".join(browser_urls)
49 | browser = "chrome"
50 |
51 | prompt_structure = f"""
52 | Select a browser URL from the list of browser URLs based on the user's prompt.
53 |
54 | # Steps:
55 | 1. Infer the browser URL that the user wants to open from the user-prompt and the list of browser URLs.
56 | 2. If the user-prompt is not related to the browser URLs, return an empty string.
57 |
58 | # Browser URLs:
59 | {browser_urls_str}
60 |
61 | # Prompt:
62 | {prompt}
63 | """
64 |
65 | llm = get_llm()
66 | structured_llm = llm.with_structured_output(WebUrl)
67 | response = structured_llm.invoke(prompt_structure)
68 |
69 | logger.info(f"📖 open_browser() Response: {response}")
70 |
71 | # Open the URL if it's not empty
72 | if response.url:
73 | logger.info(f"📖 open_browser() Opening URL: {response.url}")
74 | loop = asyncio.get_running_loop()
75 | with ThreadPoolExecutor() as pool:
76 | await loop.run_in_executor(pool, webbrowser.get(browser).open, response.url)
77 | return f"URL opened successfully in the browser: {response.url}"
78 | else:
79 | error_message = f"Error retrieving URL from the prompt: {prompt}"
80 | logger.error(f"❌ {error_message}")
81 | return error_message
82 |
83 | except Exception as e:
84 | logger.error(f"❌ Error opening browser: {str(e)}")
85 | return {"status": "Error", "message": str(e)}
86 |
87 |
88 | open_browser = (open_browser_def, open_browser_handler)
89 |
--------------------------------------------------------------------------------
/app/tools/chart.py:
--------------------------------------------------------------------------------
1 | """Plotly chart drawing tool."""
2 |
3 | import chainlit as cl
4 | import plotly
5 | from utils.common import logger
6 |
7 | draw_plotly_chart_def = {
8 | "name": "draw_plotly_chart",
9 | "description": "Draws a Plotly chart based on the provided JSON figure and displays it with an accompanying message.",
10 | "parameters": {
11 | "type": "object",
12 | "properties": {
13 | "message": {
14 | "type": "string",
15 | "description": "The message to display alongside the chart",
16 | },
17 | "plotly_json_fig": {
18 | "type": "string",
19 | "description": "A JSON string representing the Plotly figure to be drawn",
20 | },
21 | },
22 | "required": ["message", "plotly_json_fig"],
23 | },
24 | }
25 |
26 |
27 | async def draw_plotly_chart_handler(message: str, plotly_json_fig):
28 | try:
29 | logger.info(f"🎨 Drawing Plotly chart with message: {message}")
30 | fig = plotly.io.from_json(plotly_json_fig)
31 | elements = [cl.Plotly(name="chart", figure=fig, display="inline")]
32 | await cl.Message(content=message, elements=elements).send()
33 | logger.info(f"💡 Plotly chart displayed successfully.")
34 | except Exception as e:
35 | logger.error(f"❌ Error drawing Plotly chart: {str(e)}")
36 | return {"error": str(e)}
37 |
38 |
39 | draw_plotly_chart = (draw_plotly_chart_def, draw_plotly_chart_handler)
40 |
--------------------------------------------------------------------------------
/app/tools/database.py:
--------------------------------------------------------------------------------
1 | """Database query tool with natural language to SQL conversion."""
2 |
3 | import os
4 |
5 | import chainlit as cl
6 | import yaml
7 | from config.database import db_config, db_connection, dialect_info
8 | from langchain.prompts import PromptTemplate
9 | from pydantic import BaseModel, Field
10 | from utils.ai_models import get_llm
11 | from utils.common import logger
12 |
13 |
14 | def load_schema_description():
15 | """Loads and formats the schema description from YAML file."""
16 | schema_path = os.path.join(os.path.dirname(__file__), "../config/schema.yaml")
17 | with open(schema_path, "r") as f:
18 | schema_data = yaml.safe_load(f)
19 |
20 | # Format the schema description
21 | description = "Available tables and their structures:\n\n"
22 |
23 | # Add tables and their columns
24 | for table_name, table_info in schema_data["schema"]["tables"].items():
25 | description += f"{table_name}\n"
26 | for column in table_info["columns"]:
27 | constraints = f", {column['constraints']}" if "constraints" in column else ""
28 | description += f"- {column['name']} ({column['type']}{constraints})\n"
29 | description += "\n"
30 |
31 | # Add example queries
32 | description += "Example queries:\n"
33 | for example in schema_data["schema"]["example_queries"]:
34 | description += f"Q: {example['question']}\n"
35 | description += f"A: {example['sql']}\n\n"
36 |
37 | return description
38 |
39 |
40 | # Load schema description when module is imported
41 | SCHEMA_DESCRIPTION = load_schema_description()
42 |
43 |
44 | class SQLQuery(BaseModel):
45 | """SQL query generated from natural language."""
46 |
47 | query: str = Field(
48 | ...,
49 | description="The SQL query to execute",
50 | )
51 | explanation: str = Field(
52 | ...,
53 | description="Explanation of what the SQL query does",
54 | )
55 |
56 |
57 | execute_sql_def = {
58 | "name": "execute_sql",
59 | "description": "Converts natural language to SQL and executes the query on the database.",
60 | "parameters": {
61 | "type": "object",
62 | "properties": {
63 | "question": {
64 | "type": "string",
65 | "description": "Natural language question about the data (e.g., 'Show me all users who joined last month')",
66 | },
67 | },
68 | "required": ["question"],
69 | },
70 | }
71 |
72 |
73 | async def execute_sql_handler(question: str):
74 | """Converts natural language to SQL, executes the query, and returns results."""
75 | try:
76 | logger.info(f"🤔 Processing natural language query: '{question}'")
77 |
78 | llm = get_llm("sql_generation")
79 | structured_llm = llm.with_structured_output(SQLQuery)
80 |
81 | dialect = db_config.dialect.lower()
82 | dialect_help = dialect_info.get(dialect, {"notes": "", "examples": ""})
83 |
84 | system_template = f"""
85 | You are an expert SQL query generator for {dialect.upper()} databases. Convert the given natural language question into a {dialect.upper()}-compatible SQL query.
86 | Ensure the query is efficient and follows {dialect.upper()} syntax and best practices.
87 |
88 | # Important Notes for {dialect.upper()}
89 | {dialect_help["notes"]}
90 |
91 | # Database Schema
92 | {SCHEMA_DESCRIPTION}
93 |
94 | # Example Queries for {dialect.upper()}
95 | {dialect_help["examples"]}
96 |
97 | # Question
98 | {{question}}
99 |
100 | # Task
101 | 1. Analyze the question and the schema
102 | 2. Generate a {dialect.upper()}-compatible SQL query
103 | 3. Provide a brief explanation of what the query does
104 | 4. Return both the query and explanation
105 | """
106 |
107 | prompt_template = PromptTemplate(
108 | input_variables=["question"],
109 | template=system_template,
110 | )
111 |
112 | chain = prompt_template | structured_llm
113 | sql_response = chain.invoke({"question": question})
114 |
115 | # Log the generated SQL
116 | logger.info(f"💡 Generated SQL query: {sql_response.query}")
117 | logger.info(f"💡 Generated SQL explanation: {sql_response.explanation}")
118 |
119 | # Group SQL query and explanation in one message with elements
120 | formatted_sql = (
121 | sql_response.query.replace(" FROM ", "\nFROM ")
122 | .replace(" JOIN ", "\nJOIN ")
123 | .replace(" WHERE ", "\nWHERE ")
124 | .replace(" GROUP BY ", "\nGROUP BY ")
125 | .replace(" ORDER BY ", "\nORDER BY ")
126 | )
127 |
128 | await cl.Message(content=formatted_sql, language="sql").send()
129 | await cl.Message(content=f"**Explanation:** {sql_response.explanation}").send()
130 |
131 | # Execute the generated SQL query
132 | result = db_connection.execute_query(sql_response.query)
133 |
134 | if "error" in result:
135 | await cl.Message(content=f"❌ Error executing query: {result['error']}", type="error").send()
136 | return result
137 |
138 | if "rows" in result:
139 | # Format SELECT query results
140 | columns = result["columns"]
141 | rows = result["rows"]
142 |
143 | if not rows:
144 | await cl.Message(content="Query executed successfully. No results found.").send()
145 | return {"message": "No results"}
146 |
147 | # Create a markdown table for better formatting
148 | header = "| " + " | ".join(f"**{str(col)}**" for col in columns) + " |"
149 | separator = "|" + "|".join("---" for _ in columns) + "|"
150 | rows_formatted = ["| " + " | ".join(str(value) for value in row.values()) + " |" for row in rows]
151 |
152 | table = "\n".join([header, separator] + rows_formatted)
153 | await cl.Message(content=f"**Query Results:**\n\n{table}").send()
154 | return {"rows": rows}
155 | else:
156 | # Format INSERT/UPDATE/DELETE results
157 | message = f"✅ Query executed successfully. Affected rows: {result['affected_rows']}"
158 | await cl.Message(content=message).send()
159 | return result
160 |
161 | except Exception as e:
162 | error_message = f"Error processing query: {str(e)}"
163 | logger.error(f"❌ {error_message}")
164 | await cl.Message(content=error_message, type="error").send()
165 | return {"error": error_message}
166 |
167 |
168 | execute_sql = (execute_sql_def, execute_sql_handler)
169 |
--------------------------------------------------------------------------------
/app/tools/email.py:
--------------------------------------------------------------------------------
1 | """Email drafting tool for composing personalized messages."""
2 |
3 | import chainlit as cl
4 | from pydantic import BaseModel, Field
5 | from utils.ai_models import get_llm
6 | from utils.common import logger
7 |
8 |
9 | class EmailDraft(BaseModel):
10 | """Email draft generated from context."""
11 |
12 | subject: str = Field(..., description="Email subject line")
13 | body: str = Field(..., description="Email body content")
14 |
15 |
16 | draft_email_def = {
17 | "name": "draft_email",
18 | "description": "Drafts a personalized email based on recipient and context.",
19 | "parameters": {
20 | "type": "object",
21 | "properties": {
22 | "to": {
23 | "type": "string",
24 | "description": "Name or title of the recipient (e.g., 'John Smith', 'HR Manager')",
25 | },
26 | "context": {
27 | "type": "string",
28 | "description": "Description of what the email should be about (e.g., 'Thank them for their recent purchase and offer a 10% discount on their next order')",
29 | },
30 | },
31 | "required": ["to", "context"],
32 | },
33 | }
34 |
35 |
36 | async def draft_email_handler(to: str, context: str):
37 | """Drafts a personalized email using recipient info and context."""
38 | try:
39 | logger.info(f"📧 Drafting email to: {to}")
40 | logger.info(f"Context: {context}")
41 |
42 | llm = get_llm("email_generation")
43 | structured_llm = llm.with_structured_output(EmailDraft)
44 |
45 | system_template = """
46 | You are an expert email composer. Draft a professional and engaging email based on the recipient and context provided.
47 |
48 | # Recipient
49 | {to}
50 |
51 | # Purpose/Context
52 | {context}
53 |
54 | # Guidelines
55 | 1. Keep the tone professional but friendly
56 | 2. Be concise and clear
57 | 3. Include a clear call-to-action when appropriate
58 | 4. Personalize the content for the recipient
59 | 5. Make sure the subject line is attention-grabbing and relevant
60 | 6. Use appropriate greetings and closings
61 |
62 | Return both the subject and body of the email.
63 | """
64 |
65 | chain_input = {"to": to, "context": context}
66 |
67 | email_draft = structured_llm.invoke(system_template.format(**chain_input))
68 |
69 | # Send the draft email as a message
70 | await cl.Message(
71 | content=f"📧 **Draft Email**\n\n**To:** {to}\n**Subject:** {email_draft.subject}\n\n{email_draft.body}"
72 | ).send()
73 |
74 | return {
75 | "subject": email_draft.subject,
76 | "body": email_draft.body,
77 | }
78 |
79 | except Exception as e:
80 | error_message = f"Error drafting email: {str(e)}"
81 | logger.error(f"❌ {error_message}")
82 | await cl.Message(content=error_message, type="error").send()
83 | return {"error": error_message}
84 |
85 |
86 | draft_email = (draft_email_def, draft_email_handler)
87 |
--------------------------------------------------------------------------------
/app/tools/image.py:
--------------------------------------------------------------------------------
1 | """Image generation tool."""
2 |
3 | import base64
4 | import os
5 |
6 | import chainlit as cl
7 | from langchain.prompts import PromptTemplate
8 | from pydantic import BaseModel, Field
9 | from utils.ai_models import get_image_generation_config, get_llm
10 | from utils.common import logger, scratch_pad_dir, together_client
11 |
12 |
13 | class EnhancedPrompt(BaseModel):
14 | """Class for the text prompt"""
15 |
16 | content: str = Field(
17 | ...,
18 | description="The enhanced text prompt to generate an image",
19 | )
20 |
21 |
22 | generate_image_def = {
23 | "name": "generate_image",
24 | "description": "Generates an image based on a given prompt.",
25 | "parameters": {
26 | "type": "object",
27 | "properties": {
28 | "prompt": {
29 | "type": "string",
30 | "description": "The prompt to generate an image (e.g., 'A beautiful sunset over the mountains')",
31 | },
32 | },
33 | "required": ["prompt"],
34 | },
35 | }
36 |
37 |
38 | async def generate_image_handler(prompt):
39 | """Generates an image based on a given prompt using the Together API."""
40 | try:
41 | logger.info(f"✨ Enhancing prompt: '{prompt}'")
42 |
43 | llm = get_llm("image_prompt")
44 |
45 | structured_llm = llm.with_structured_output(EnhancedPrompt)
46 |
47 | system_template = """
48 | Enhance the given prompt the best prompt engineering techniques such as providing context, specifying style, medium, lighting, and camera details if applicable. If the prompt requests a realistic style, the enhanced prompt should include the image extension .HEIC.
49 |
50 | # Original Prompt
51 | {prompt}
52 |
53 | # Objective
54 | **Enhance Prompt**: Add relevant details to the prompt, including context, description, specific visual elements, mood, and technical details. For realistic prompts, add '.HEIC' in the output specification.
55 |
56 | # Example
57 | "realistic photo of a person having a coffee" -> "photo of a person having a coffee in a cozy cafe, natural morning light, shot with a 50mm f/1.8 lens, 8425.HEIC"
58 | """
59 |
60 | prompt_template = PromptTemplate(
61 | input_variables=["prompt"],
62 | template=system_template,
63 | )
64 |
65 | chain = prompt_template | structured_llm
66 | enhanced_prompt = chain.invoke({"prompt": prompt}).content
67 |
68 | logger.info(f"🌄 Generating image based on prompt: '{enhanced_prompt}'")
69 |
70 | # Get image generation configuration
71 | img_config = get_image_generation_config()
72 | response = together_client.images.generate(
73 | prompt=prompt,
74 | model=img_config["name"],
75 | width=img_config["width"],
76 | height=img_config["height"],
77 | steps=img_config["steps"],
78 | n=img_config["n"],
79 | response_format=img_config["response_format"],
80 | )
81 |
82 | b64_image = response.data[0].b64_json
83 | image_data = base64.b64decode(b64_image)
84 |
85 | img_path = os.path.join(scratch_pad_dir, "generated_image.jpeg")
86 | with open(img_path, "wb") as f:
87 | f.write(image_data)
88 |
89 | logger.info(f"🖼️ Image generated and saved successfully at {img_path}")
90 | image = cl.Image(path=img_path, name="Generated Image", display="inline")
91 | await cl.Message(
92 | content=f"Image generated with the prompt '{enhanced_prompt}'",
93 | elements=[image],
94 | ).send()
95 |
96 | return "Image successfully generated"
97 |
98 | except Exception as e:
99 | logger.error(f"❌ Error generating image: {str(e)}")
100 | return {"error": str(e)}
101 |
102 |
103 | generate_image = (generate_image_def, generate_image_handler)
104 |
--------------------------------------------------------------------------------
/app/tools/linkedin.py:
--------------------------------------------------------------------------------
1 | """LinkedIn post drafting tool."""
2 |
3 | import os
4 |
5 | import chainlit as cl
6 | from langchain.prompts import PromptTemplate
7 | from pydantic import BaseModel, Field
8 | from utils.ai_models import get_llm
9 | from utils.common import logger, scratch_pad_dir
10 |
11 |
12 | class LinkedInPost(BaseModel):
13 | """LinkedIn post draft."""
14 |
15 | content: str = Field(
16 | ...,
17 | description="The drafted LinkedIn post content",
18 | )
19 |
20 |
21 | draft_linkedin_post_def = {
22 | "name": "draft_linkedin_post",
23 | "description": "Creates a LinkedIn post draft based on a given topic or content description.",
24 | "parameters": {
25 | "type": "object",
26 | "properties": {
27 | "topic": {
28 | "type": "string",
29 | "description": "The topic or content description for the LinkedIn post (e.g., 'The importance of AI ethics in modern technology').",
30 | },
31 | },
32 | "required": ["topic"],
33 | },
34 | }
35 |
36 |
37 | async def draft_linkedin_post_handler(topic):
38 | """Creates a LinkedIn post draft based on a given topic."""
39 | try:
40 | logger.info(f"📝 Drafting LinkedIn post on topic: '{topic}'")
41 |
42 | llm = get_llm("linkedin_post")
43 |
44 | structured_llm = llm.with_structured_output(LinkedInPost)
45 |
46 | system_template = """
47 | Create an engaging LinkedIn post for a given topic incorporating relevant emojis to capture attention and convey the message effectively.
48 |
49 | # Topic
50 | {topic}
51 |
52 | # Steps
53 | 1. **Identify the main message**: Determine the core topic or idea you want to communicate in the post.
54 | 2. **Audience Consideration**: Tailor your language and tone to fit the audience you are addressing on LinkedIn.
55 | 3. **Incorporate Emojis**: Select emojis that complement the text and reinforce the message without overwhelming it.
56 | 4. **Structure the Post**: Organize the content to include an engaging opening, informative content, and a clear call-to-action if applicable.
57 | """
58 |
59 | prompt_template = PromptTemplate(
60 | input_variables=["topic"],
61 | template=system_template,
62 | )
63 |
64 | chain = prompt_template | structured_llm
65 | linkedin_post = chain.invoke({"topic": topic}).content
66 |
67 | filepath = os.path.join(scratch_pad_dir, "linkedin_post.md")
68 | with open(filepath, "w") as f:
69 | f.write(linkedin_post)
70 |
71 | logger.info(f"💾 LinkedIn post saved successfully at {filepath}")
72 | await cl.Message(content=f"LinkedIn post about '{topic}':\n\n{linkedin_post}").send()
73 |
74 | return linkedin_post
75 |
76 | except Exception as e:
77 | logger.error(f"❌ Error drafting LinkedIn post: {str(e)}")
78 | await cl.Message(content=f"An error occurred while drafting the LinkedIn post: {str(e)}").send()
79 |
80 |
81 | draft_linkedin_post = (draft_linkedin_post_def, draft_linkedin_post_handler)
82 |
--------------------------------------------------------------------------------
/app/tools/python_file.py:
--------------------------------------------------------------------------------
1 | """Python file creation and execution tools."""
2 |
3 | import os
4 | import subprocess
5 |
6 | import chainlit as cl
7 | from langchain.prompts import PromptTemplate
8 | from pydantic import BaseModel, Field
9 | from utils.ai_models import get_llm
10 | from utils.common import logger, scratch_pad_dir
11 |
12 |
13 | class PythonFile(BaseModel):
14 | """Python file content."""
15 |
16 | filename: str = Field(
17 | ...,
18 | description="The name of the Python file with the extension .py",
19 | )
20 | content: str = Field(
21 | ...,
22 | description="The Python code to be saved in the file",
23 | )
24 |
25 |
26 | create_python_file_def = {
27 | "name": "create_python_file",
28 | "description": "Creates a Python file based on a given topic or content description.",
29 | "parameters": {
30 | "type": "object",
31 | "properties": {
32 | "filename": {
33 | "type": "string",
34 | "description": "The name of the Python file to be created (e.g., 'script.py').",
35 | },
36 | "content_description": {
37 | "type": "string",
38 | "description": "The content description for the Python file (e.g., 'Generate a random number').",
39 | },
40 | },
41 | "required": ["filename", "content_description"],
42 | },
43 | }
44 |
45 |
46 | async def create_python_file_handler(filename: str, content_description: str):
47 | """Creates a Python file with the provided filename based on content description."""
48 | try:
49 | logger.info(f"📝 Drafting Python file that '{content_description}'")
50 |
51 | llm = get_llm("python_code")
52 |
53 | structured_llm = llm.with_structured_output(PythonFile)
54 |
55 | system_template = """
56 | Create a Python script for the given topic. The script should be well-commented, use best practices, and aim to be simple yet effective.
57 | Include informative docstrings and comments where necessary.
58 |
59 | # Topic
60 | {content_description}
61 |
62 | # Requirements
63 | 1. **Define Purpose**: Write a brief docstring explaining the purpose of the script.
64 | 2. **Implement Logic**: Implement the logic related to the topic, keeping the script easy to understand.
65 | 3. **Best Practices**: Follow Python best practices, such as using functions where appropriate and adding comments to clarify the code.
66 | """
67 |
68 | prompt_template = PromptTemplate(
69 | input_variables=["content_description"],
70 | template=system_template,
71 | )
72 |
73 | chain = prompt_template | structured_llm
74 | python_file = chain.invoke({"content_description": content_description})
75 | content = python_file.content
76 |
77 | filepath = os.path.join(scratch_pad_dir, filename)
78 | with open(filepath, "w") as f:
79 | f.write(content)
80 |
81 | logger.info(f"💾 Python file '{filename}' created successfully at {filepath}")
82 | await cl.Message(
83 | content=f"Python file '{filename}' created successfully based on the topic '{content_description}'."
84 | ).send()
85 | return f"Python file '{filename}' created successfully."
86 |
87 | except Exception as e:
88 | logger.error(f"❌ Error creating Python file: {str(e)}")
89 | await cl.Message(content=f"An error occurred while creating the Python file: {str(e)}").send()
90 | return f"An error occurred while creating the Python file: {str(e)}"
91 |
92 |
93 | execute_python_file_def = {
94 | "name": "execute_python_file",
95 | "description": "Executes a Python file in the scratchpad directory.",
96 | "parameters": {
97 | "type": "object",
98 | "properties": {
99 | "filename": {
100 | "type": "string",
101 | "description": "The name of the Python file to be executed (e.g., 'script.py').",
102 | },
103 | },
104 | "required": ["filename"],
105 | },
106 | }
107 |
108 |
109 | async def execute_python_file_handler(filename: str):
110 | """Executes a Python file in the scratchpad directory."""
111 | try:
112 | filepath = os.path.join(scratch_pad_dir, filename)
113 |
114 | if not os.path.exists(filepath):
115 | error_message = f"Python file '{filename}' not found in scratchpad directory."
116 | logger.error(f"❌ {error_message}")
117 | await cl.Message(content=error_message).send()
118 | return error_message
119 |
120 | result = subprocess.run(
121 | ["python", filepath],
122 | capture_output=True,
123 | text=True,
124 | )
125 |
126 | if result.returncode == 0:
127 | logger.info(f"✅ Successfully executed Python file '{filename}'")
128 | output_message = result.stdout
129 | await cl.Message(content=f"Output of '{filename}':\n\n{output_message}").send()
130 | return output_message
131 | else:
132 | error_message = f"Error executing Python file '{filename}': {result.stderr}"
133 | logger.error(f"❌ {error_message}")
134 | await cl.Message(content=error_message).send()
135 | return error_message
136 |
137 | except Exception as e:
138 | logger.error(f"❌ Error executing Python file: {str(e)}")
139 | await cl.Message(content=f"An error occurred while executing the Python file: {str(e)}").send()
140 | return f"An error occurred while executing the Python file: {str(e)}"
141 |
142 |
143 | create_python_file = (create_python_file_def, create_python_file_handler)
144 | execute_python_file = (execute_python_file_def, execute_python_file_handler)
145 |
--------------------------------------------------------------------------------
/app/tools/search.py:
--------------------------------------------------------------------------------
1 | """Internet search tool using Tavily API."""
2 |
3 | import chainlit as cl
4 | from utils.common import logger, tavily_client
5 |
6 | internet_search_def = {
7 | "name": "internet_search",
8 | "description": "Performs an internet search using the Tavily API.",
9 | "parameters": {
10 | "type": "object",
11 | "properties": {
12 | "query": {
13 | "type": "string",
14 | "description": "The search query to look up on the internet (e.g., 'What's the weather like in Madrid tomorrow?').",
15 | },
16 | },
17 | "required": ["query"],
18 | },
19 | }
20 |
21 |
22 | async def internet_search_handler(query):
23 | """Executes an internet search using the Tavily API and returns the result."""
24 | try:
25 | logger.info(f"🕵 Performing internet search for query: '{query}'")
26 | response = tavily_client.search(query)
27 |
28 | results = response.get("results", [])
29 | if not results:
30 | await cl.Message(content=f"No results found for '{query}'.").send()
31 | return None
32 |
33 | formatted_results = "\n".join(
34 | [
35 | f"{i+1}. [{result['title']}]({result['url']})\n{result['content'][:200]}..."
36 | for i, result in enumerate(results)
37 | ]
38 | )
39 |
40 | message_content = f"Search Results for '{query}':\n\n{formatted_results}"
41 | await cl.Message(content=message_content).send()
42 |
43 | logger.info(f"📏 Search results for '{query}' retrieved successfully.")
44 | return response["results"]
45 | except Exception as e:
46 | logger.error(f"❌ Error performing internet search: {str(e)}")
47 | await cl.Message(content=f"An error occurred while performing the search: {str(e)}").send()
48 |
49 |
50 | internet_search = (internet_search_def, internet_search_handler)
51 |
--------------------------------------------------------------------------------
/app/tools/stock.py:
--------------------------------------------------------------------------------
1 | """Stock price querying tool."""
2 |
3 | import yfinance as yf
4 | from utils.common import logger
5 |
6 | query_stock_price_def = {
7 | "name": "query_stock_price",
8 | "description": "Queries the latest stock price information for a given stock symbol.",
9 | "parameters": {
10 | "type": "object",
11 | "properties": {
12 | "symbol": {
13 | "type": "string",
14 | "description": "The stock symbol to query (e.g., 'AAPL' for Apple Inc.)",
15 | },
16 | "period": {
17 | "type": "string",
18 | "description": "The time period for which to retrieve stock data (e.g., '1d' for one day, '1mo' for one month)",
19 | },
20 | },
21 | "required": ["symbol", "period"],
22 | },
23 | }
24 |
25 |
26 | async def query_stock_price_handler(symbol, period):
27 | """Queries the latest stock price information for a given stock symbol."""
28 | try:
29 | logger.info(f"📈 Fetching stock price for symbol: {symbol}, period: {period}")
30 | stock = yf.Ticker(symbol)
31 | hist = stock.history(period=period)
32 | if hist.empty:
33 | logger.warning(f"⚠️ No data found for symbol: {symbol}")
34 | return {"error": "No data found for the given symbol."}
35 | logger.info(f"💸 Stock data retrieved successfully for symbol: {symbol}")
36 | return hist.to_json()
37 | except Exception as e:
38 | logger.error(f"❌ Error querying stock price for symbol: {symbol} - {str(e)}")
39 | return {"error": str(e)}
40 |
41 |
42 | query_stock_price = (query_stock_price_def, query_stock_price_handler)
43 |
--------------------------------------------------------------------------------
/app/utils/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jesuscopado/samantha-os1/f327bb294c92537a197c1be4d4e0bba97075efe7/app/utils/__init__.py
--------------------------------------------------------------------------------
/app/utils/ai_models.py:
--------------------------------------------------------------------------------
1 | """AI model configuration and initialization."""
2 |
3 | import os
4 |
5 | import yaml
6 | from langchain_groq import ChatGroq
7 | from utils.common import logger
8 |
9 |
10 | def load_model_config():
11 | """Loads the AI model configuration from YAML file."""
12 | config_path = os.path.join(os.path.dirname(__file__), "../config/ai_models.yaml")
13 | with open(config_path, "r") as f:
14 | return yaml.safe_load(f)["models"]
15 |
16 |
17 | def get_llm(task: str = "default") -> ChatGroq:
18 | """Returns a configured LLM instance for the specified task."""
19 | try:
20 | config = load_model_config()
21 | default_config = config["default"]
22 | task_config = config.get(task, {})
23 |
24 | # Merge default config with task-specific config
25 | model_config = {**default_config, **task_config}
26 |
27 | return ChatGroq(
28 | model=model_config["name"],
29 | api_key=os.environ.get("GROQ_API_KEY"),
30 | temperature=model_config["temperature"],
31 | max_retries=model_config["max_retries"],
32 | )
33 | except Exception as e:
34 | logger.error(f"❌ Error initializing LLM for task '{task}': {str(e)}")
35 | # Fallback to default configuration
36 | return ChatGroq(
37 | model="llama-3.3-70b-versatile",
38 | api_key=os.environ.get("GROQ_API_KEY"),
39 | temperature=0.1,
40 | max_retries=2,
41 | )
42 |
43 |
44 | def get_image_generation_config(task: str = "image_generation") -> dict:
45 | """Returns configuration for image generation."""
46 | try:
47 | config = load_model_config()
48 | return config[task]
49 | except Exception as e:
50 | logger.error(f"❌ Error loading image generation config: {str(e)}")
51 | # Fallback to default configuration
52 | return {
53 | "provider": "together",
54 | "name": "black-forest-labs/FLUX.1.1-pro",
55 | "width": 1024,
56 | "height": 768,
57 | "steps": 4,
58 | "n": 1,
59 | "response_format": "b64_json",
60 | }
61 |
--------------------------------------------------------------------------------
/app/utils/common.py:
--------------------------------------------------------------------------------
1 | """Common utilities and configurations."""
2 |
3 | import os
4 | import logging
5 | from dotenv import load_dotenv
6 | from together import Together
7 | from tavily import TavilyClient
8 |
9 | # Load environment variables
10 | load_dotenv()
11 |
12 | # Setup logging
13 | logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
14 | logger = logging.getLogger(__name__)
15 |
16 | # Scratchpad directory
17 | scratch_pad_dir = "../scratchpad"
18 | os.makedirs(scratch_pad_dir, exist_ok=True)
19 |
20 | # Initialize clients
21 | together_client = Together(api_key=os.environ.get("TOGETHER_API_KEY"))
22 | tavily_client = TavilyClient(api_key=os.environ.get("TAVILY_API_KEY"))
23 |
--------------------------------------------------------------------------------
/compose.yaml:
--------------------------------------------------------------------------------
1 | version: '3.9'
2 | services:
3 |
4 | samantha-os1:
5 | container_name: samantha-os1
6 | build: .
7 | image: samantha-os1:latest
8 | restart: unless-stopped
9 | env_file:
10 | - .env
11 | ports:
12 | - 8000:8000
13 |
--------------------------------------------------------------------------------
/images/os1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jesuscopado/samantha-os1/f327bb294c92537a197c1be4d4e0bba97075efe7/images/os1.gif
--------------------------------------------------------------------------------
/images/thumbnail_short_demo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jesuscopado/samantha-os1/f327bb294c92537a197c1be4d4e0bba97075efe7/images/thumbnail_short_demo.png
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [project]
2 | name = "samantha-os1"
3 | version = "0.1.0"
4 | description = "Samantha OS1 is a conversational AI assistant."
5 | readme = "README.md"
6 | requires-python = ">=3.12"
7 |
8 | dependencies = [
9 | "chainlit==2.0.dev0",
10 | "langchain-groq>=0.2.0",
11 | "langchain-openai>=0.2.2",
12 | "langchain>=0.3.3",
13 | "openai==1.51.2",
14 | "plotly>=5.24.1",
15 | "tavily-python>=0.5.0",
16 | "together>=1.3.1",
17 | "websockets==13.1",
18 | "yfinance>=0.2.44",
19 | ]
20 |
--------------------------------------------------------------------------------