This is page 1 of 3. Use http://codebase.md/deepspringai/search_mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .chainlit
│ ├── config.toml
│ └── translations
│ ├── bn.json
│ ├── en-US.json
│ ├── gu.json
│ ├── he-IL.json
│ ├── hi.json
│ ├── ja.json
│ ├── kn.json
│ ├── ml.json
│ ├── mr.json
│ ├── nl.json
│ ├── ta.json
│ ├── te.json
│ └── zh-CN.json
├── .gitignore
├── .python-version
├── chainlit.md
├── Dockerfile
├── embedding_server.log
├── final_response_output.txt
├── pyproject.toml
├── README.md
├── smithery.yaml
├── src
│ ├── parquet_mcp_server
│ │ ├── __init__.py
│ │ ├── chainlit.md
│ │ ├── chatAgent.py
│ │ ├── client.py
│ │ ├── main.py
│ │ └── src
│ │ ├── search_helper.py
│ │ └── supabase_db.py
│ └── tests
│ ├── test_search.py
│ └── test_similarity.py
└── uv.lock
```
# Files
--------------------------------------------------------------------------------
/.python-version:
--------------------------------------------------------------------------------
```
1 | 3.12
2 |
```
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
```
1 | # Python-generated files
2 | __pycache__/
3 | *.py[oc]
4 | build/
5 | dist/
6 | wheels/
7 | *.egg-info
8 | .venv
9 | venv
10 | # Virtual environments
11 | .venv
12 | .env
13 | *.parquet
14 |
15 | *.log
16 | src/parquet_mcp_server/*.log
17 | src/parquet_mcp_server/.chainlit/
18 | src/parquet_mcp_server/output.json
19 |
20 | temp/
21 | output.json
22 | tmp/
23 |
```
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
```markdown
1 | # parquet_mcp_server
2 | [](https://smithery.ai/server/@DeepSpringAI/parquet_mcp_server)
3 |
4 | A powerful MCP (Model Control Protocol) server that provides tools for performing web searches and finding similar content. This server is designed to work with Claude Desktop and offers two main functionalities:
5 |
6 | 1. **Web Search**: Perform a web search and scrape results
7 | 2. **Similarity Search**: Extract relevant information from previous searches
8 |
9 | This server is particularly useful for:
10 | - Applications requiring web search capabilities
11 | - Projects needing to find similar content based on search queries
12 |
13 | ## Installation
14 |
15 | ### Installing via Smithery
16 |
17 | To install Parquet MCP Server for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@DeepSpringAI/parquet_mcp_server):
18 |
19 | ```bash
20 | npx -y @smithery/cli install @DeepSpringAI/parquet_mcp_server --client claude
21 | ```
22 |
23 | ### Clone this repository
24 |
25 | ```bash
26 | git clone ...
27 | cd parquet_mcp_server
28 | ```
29 |
30 | ### Create and activate virtual environment
31 |
32 | ```bash
33 | uv venv
34 | .venv\Scripts\activate # On Windows
35 | source .venv/bin/activate # On macOS/Linux
36 | ```
37 |
38 | ### Install the package
39 |
40 | ```bash
41 | uv pip install -e .
42 | ```
43 |
44 | ### Environment
45 |
46 | Create a `.env` file with the following variables:
47 |
48 | ```bash
49 | EMBEDDING_URL=http://sample-url.com/api/embed # URL for the embedding service
50 | OLLAMA_URL=http://sample-url.com/ # URL for Ollama server
51 | EMBEDDING_MODEL=sample-model # Model to use for generating embeddings
52 | SEARCHAPI_API_KEY=your_searchapi_api_key
53 | FIRECRAWL_API_KEY=your_firecrawl_api_key
54 | VOYAGE_API_KEY=your_voyage_api_key
55 | AZURE_OPENAI_ENDPOINT=http://sample-url.com/azure_openai
56 | AZURE_OPENAI_API_KEY=your_azure_openai_api_key
57 | ```
58 |
59 | ## Usage with Claude Desktop
60 |
61 | Add this to your Claude Desktop configuration file (`claude_desktop_config.json`):
62 |
63 | ```json
64 | {
65 | "mcpServers": {
66 | "parquet-mcp-server": {
67 | "command": "uv",
68 | "args": [
69 | "--directory",
70 | "/home/${USER}/workspace/parquet_mcp_server/src/parquet_mcp_server",
71 | "run",
72 | "main.py"
73 | ]
74 | }
75 | }
76 | }
77 | ```
78 |
79 | ## Available Tools
80 |
81 | The server provides two main tools:
82 |
83 | 1. **Search Web**: Perform a web search and scrape results
84 | - Required parameters:
85 | - `queries`: List of search queries
86 | - Optional parameters:
87 | - `page_number`: Page number for the search results (defaults to 1)
88 |
89 | 2. **Extract Info from Search**: Extract relevant information from previous searches
90 | - Required parameters:
91 | - `queries`: List of search queries to merge
92 |
93 | ## Example Prompts
94 |
95 | Here are some example prompts you can use with the agent:
96 |
97 | ### For Web Search:
98 | ```
99 | "Please perform a web search for 'macbook' and 'laptop' and scrape the results from page 1"
100 | ```
101 |
102 | ### For Extracting Info from Search:
103 | ```
104 | "Please extract relevant information from the previous searches for 'macbook'"
105 | ```
106 |
107 | ## Testing the MCP Server
108 |
109 | The project includes a comprehensive test suite in the `src/tests` directory. You can run all tests using:
110 |
111 | ```bash
112 | python src/tests/run_tests.py
113 | ```
114 |
115 | Or run individual tests:
116 |
117 | ```bash
118 | # Test Web Search
119 | python src/tests/test_search_web.py
120 |
121 | # Test Extract Info from Search
122 | python src/tests/test_extract_info_from_search.py
123 | ```
124 |
125 | You can also test the server using the client directly:
126 |
127 | ```python
128 | from parquet_mcp_server.client import (
129 | perform_search_and_scrape, # New web search function
130 | find_similar_chunks # New extract info function
131 | )
132 |
133 | # Perform a web search
134 | perform_search_and_scrape(["macbook", "laptop"], page_number=1)
135 |
136 | # Extract information from the search results
137 | find_similar_chunks(["macbook"])
138 | ```
139 |
140 | ### Troubleshooting
141 |
142 | 1. If you get SSL verification errors, make sure the SSL settings in your `.env` file are correct
143 | 2. If embeddings are not generated, check:
144 | - The Ollama server is running and accessible
145 | - The model specified is available on your Ollama server
146 | - The text column exists in your input Parquet file
147 | 3. If DuckDB conversion fails, check:
148 | - The input Parquet file exists and is readable
149 | - You have write permissions in the output directory
150 | - The Parquet file is not corrupted
151 | 4. If PostgreSQL conversion fails, check:
152 | - The PostgreSQL connection settings in your `.env` file are correct
153 | - The PostgreSQL server is running and accessible
154 | - You have the necessary permissions to create/modify tables
155 | - The pgvector extension is installed in your database
156 |
157 | ## PostgreSQL Function for Vector Similarity Search
158 |
159 | To perform vector similarity searches in PostgreSQL, you can use the following function:
160 |
161 | ```sql
162 | -- Create the function for vector similarity search
163 | CREATE OR REPLACE FUNCTION match_web_search(
164 | query_embedding vector(1024), -- Adjusted vector size
165 | match_threshold float,
166 | match_count int -- User-defined limit for number of results
167 | )
168 | RETURNS TABLE (
169 | id bigint,
170 | metadata jsonb,
171 | text TEXT, -- Added text column to the result
172 | date TIMESTAMP, -- Using the date column instead of created_at
173 | similarity float
174 | )
175 | LANGUAGE plpgsql
176 | AS $$
177 | BEGIN
178 | RETURN QUERY
179 | SELECT
180 | web_search.id,
181 | web_search.metadata,
182 | web_search.text, -- Returning the full text of the chunk
183 | web_search.date, -- Returning the date timestamp
184 | 1 - (web_search.embedding <=> query_embedding) as similarity
185 | FROM web_search
186 | WHERE 1 - (web_search.embedding <=> query_embedding) > match_threshold
187 | ORDER BY web_search.date DESC, -- Sort by date in descending order (newest first)
188 | web_search.embedding <=> query_embedding -- Sort by similarity
189 | LIMIT match_count; -- Limit the results to the match_count specified by the user
190 | END;
191 | $$;
192 | ```
193 |
194 | This function allows you to perform similarity searches on vector embeddings stored in a PostgreSQL database, returning results that meet a specified similarity threshold and limiting the number of results based on user input. The results are sorted by date and similarity.
195 |
196 |
197 |
198 | ## Postgres table creation
199 | ```
200 | CREATE TABLE web_search (
201 | id SERIAL PRIMARY KEY,
202 | text TEXT,
203 | metadata JSONB,
204 | embedding VECTOR(1024),
205 |
206 | -- This will be auto-updated
207 | date TIMESTAMP DEFAULT NOW()
208 | );
209 | ```
```
--------------------------------------------------------------------------------
/src/parquet_mcp_server/__init__.py:
--------------------------------------------------------------------------------
```python
1 |
```
--------------------------------------------------------------------------------
/src/tests/test_similarity.py:
--------------------------------------------------------------------------------
```python
1 | import sys
2 | import os
3 | from parquet_mcp_server.client import find_similar_chunks
4 |
5 | def test_find_similar_chunks():
6 | """Test the find similar chunks functionality"""
7 | try:
8 | # Example test data
9 | test_data = {
10 | "queries": ["macbook"]
11 | }
12 |
13 | # Call the find similar chunks function
14 | result = find_similar_chunks(
15 | queries=test_data["queries"]
16 | )
17 |
18 |
19 | return result # Return the success status
20 |
21 | except Exception as e:
22 | print(f"Find Similar Chunks Test Error: {str(e)}")
23 | return False
24 |
25 | if __name__ == "__main__":
26 | result = test_find_similar_chunks()
27 | print(result)
28 |
```
--------------------------------------------------------------------------------
/src/tests/test_search.py:
--------------------------------------------------------------------------------
```python
1 | import json
2 | import sys
3 | import os
4 | from parquet_mcp_server.client import perform_search_and_scrape
5 |
6 | def test_search_and_scrape():
7 | """Test the search and scrape functionality"""
8 | try:
9 | # Example test data
10 | test_data = {
11 | "queries": ["macbook"],
12 | }
13 |
14 | # Call the search and scrape function
15 | result = perform_search_and_scrape(
16 | queries=test_data["queries"],
17 | )
18 |
19 | return result # Return the success status
20 |
21 | except Exception as e:
22 | print(f"Search and Scrape Test Error: {str(e)}")
23 | return False
24 |
25 | if __name__ == "__main__":
26 | success = test_search_and_scrape()
27 | sys.exit(0 if success else 1)
```
--------------------------------------------------------------------------------
/chainlit.md:
--------------------------------------------------------------------------------
```markdown
1 | # Welcome to Chainlit! 🚀🤖
2 |
3 | Hi there, Developer! 👋 We're excited to have you on board. Chainlit is a powerful tool designed to help you prototype, debug and share applications built on top of LLMs.
4 |
5 | ## Useful Links 🔗
6 |
7 | - **Documentation:** Get started with our comprehensive [Chainlit Documentation](https://docs.chainlit.io) 📚
8 | - **Discord Community:** Join our friendly [Chainlit Discord](https://discord.gg/k73SQ3FyUh) to ask questions, share your projects, and connect with other developers! 💬
9 |
10 | We can't wait to see what you create with Chainlit! Happy coding! 💻😊
11 |
12 | ## Welcome screen
13 |
14 | To modify the welcome screen, edit the `chainlit.md` file at the root of your project. If you do not want a welcome screen, just leave this file empty.
15 |
```
--------------------------------------------------------------------------------
/src/parquet_mcp_server/chainlit.md:
--------------------------------------------------------------------------------
```markdown
1 | # Welcome to Chainlit! 🚀🤖
2 |
3 | Hi there, Developer! 👋 We're excited to have you on board. Chainlit is a powerful tool designed to help you prototype, debug and share applications built on top of LLMs.
4 |
5 | ## Useful Links 🔗
6 |
7 | - **Documentation:** Get started with our comprehensive [Chainlit Documentation](https://docs.chainlit.io) 📚
8 | - **Discord Community:** Join our friendly [Chainlit Discord](https://discord.gg/k73SQ3FyUh) to ask questions, share your projects, and connect with other developers! 💬
9 |
10 | We can't wait to see what you create with Chainlit! Happy coding! 💻😊
11 |
12 | ## Welcome screen
13 |
14 | To modify the welcome screen, edit the `chainlit.md` file at the root of your project. If you do not want a welcome screen, just leave this file empty.
15 |
```
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
```dockerfile
1 | # Use Python 3.8 as base image
2 | FROM python:3.8-slim
3 |
4 | # Set working directory
5 | WORKDIR /app
6 |
7 | # Install system dependencies
8 | RUN apt-get update && apt-get install -y \
9 | build-essential \
10 | libpq-dev \
11 | && rm -rf /var/lib/apt/lists/*
12 |
13 | # Install uv for Python package management
14 | RUN pip install uv
15 |
16 | # Copy the project files
17 | COPY . .
18 |
19 | # Create and activate virtual environment
20 | RUN uv venv
21 | ENV PATH="/app/.venv/bin:$PATH"
22 |
23 | # Install the project and its dependencies
24 | RUN uv pip install -e .
25 |
26 | # Set environment variables with default values
27 | ENV OLLAMA_URL=""
28 | ENV EMBEDDING_URL=""
29 | ENV EMBEDDING_MODEL="nomic-embed-text"
30 | ENV POSTGRES_DB=""
31 | ENV POSTGRES_USER=""
32 | ENV POSTGRES_PASSWORD=""
33 | ENV POSTGRES_HOST=""
34 | ENV POSTGRES_PORT="5432"
35 |
36 | # Use bash as the entrypoint
37 | ENTRYPOINT ["/bin/bash"]
38 |
```
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
```toml
1 | [project]
2 | name = "parquet_mcp_server"
3 | version = "0.1.0"
4 | description = "A server that provides tools for manipulating and analyzing Parquet files"
5 | authors = [
6 | { name = "Your Name", email = "[email protected]" },
7 | ]
8 | dependencies = [
9 | "mcp",
10 | "pyarrow",
11 | "pandas",
12 | "numpy",
13 | "requests",
14 | "langchain",
15 | "langgraph",
16 | "langchain-ollama",
17 | "chainlit",
18 | "streamlit",
19 | "duckdb",
20 | "psycopg2-binary",
21 | "markdown",
22 | "beautifulsoup4",
23 | "clear>=2.0.0",
24 | "firecrawl-py>=1.16.0",
25 | "langchain-mcp-adapters>=0.0.7",
26 | "langchain-openai>=0.3.12",
27 | "autogen-ext>=0.5.3",
28 | "autogen-core>=0.5.3",
29 | "supabase>=2.15.0",
30 | ]
31 | requires-python = ">=3.10"
32 |
33 | [build-system]
34 | requires = ["hatchling"]
35 | build-backend = "hatchling.build"
36 |
37 | [tool.hatch.build.targets.wheel]
38 | packages = ["src/parquet_mcp_server"]
39 |
```
--------------------------------------------------------------------------------
/smithery.yaml:
--------------------------------------------------------------------------------
```yaml
1 | # Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml
2 |
3 | build:
4 | dockerfile: Dockerfile
5 | dockerBuildPath: .
6 | startCommand:
7 | type: stdio
8 | configSchema:
9 | # JSON Schema defining the configuration options for the MCP.
10 | type: object
11 | required:
12 | - ollama_url
13 | - embedding_url
14 | - embedding_model
15 | properties:
16 | ollama_url:
17 | type: string
18 | description: URL for the Ollama server
19 | postgres_db:
20 | type: string
21 | description: PostgreSQL database name
22 | embedding_url:
23 | type: string
24 | description: URL for the embedding service
25 | postgres_host:
26 | type: string
27 | description: PostgreSQL host
28 | postgres_port:
29 | type: string
30 | description: PostgreSQL port
31 | postgres_user:
32 | type: string
33 | description: PostgreSQL username
34 | embedding_model:
35 | type: string
36 | description: Model to use for generating embeddings
37 | postgres_password:
38 | type: string
39 | description: PostgreSQL password
40 | commandFunction:
41 | # A JS function that produces the CLI command based on the given config to start the MCP on stdio.
42 | |-
43 | (config) => ({
44 | "command": "uv",
45 | "args": [
46 | "--directory",
47 | "./src/parquet_mcp_server",
48 | "run",
49 | "main.py"
50 | ],
51 | "env": {
52 | "OLLAMA_URL": config.ollama_url,
53 | "EMBEDDING_URL": config.embedding_url,
54 | "EMBEDDING_MODEL": config.embedding_model,
55 | "POSTGRES_DB": config.postgres_db || "",
56 | "POSTGRES_USER": config.postgres_user || "",
57 | "POSTGRES_PASSWORD": config.postgres_password || "",
58 | "POSTGRES_HOST": config.postgres_host || "",
59 | "POSTGRES_PORT": config.postgres_port || "5432"
60 | }
61 | })
62 |
```
--------------------------------------------------------------------------------
/src/parquet_mcp_server/main.py:
--------------------------------------------------------------------------------
```python
1 | from mcp.server import NotificationOptions, Server
2 | from mcp.server.models import InitializationOptions
3 | from typing import Any, Optional
4 | from dotenv import load_dotenv
5 | import pyarrow.parquet as pq
6 | import mcp.types as types
7 | import mcp.server.stdio
8 | import pandas as pd
9 | import numpy as np
10 | import requests
11 | import asyncio
12 | import json
13 | import os
14 | import logging
15 |
16 | from parquet_mcp_server.src.search_helper import perform_search_and_scrape, find_similar_chunks
17 |
18 | # Set up logging
19 | logging.basicConfig(
20 | level=logging.INFO,
21 | format='%(asctime)s - %(levelname)s - %(message)s'
22 | )
23 |
24 | # Initialize server
25 | server = Server("parquet-tools")
26 |
27 | @server.list_tools()
28 | async def handle_list_tools() -> list[types.Tool]:
29 | """List available parquet manipulation tools."""
30 | return [
31 | types.Tool(
32 | name="search-web",
33 | description="Perform a web search and scrape results",
34 | inputSchema={
35 | "type": "object",
36 | "properties": {
37 | "queries": {
38 | "type": "array",
39 | "items": {
40 | "type": "string"
41 | },
42 | "description": "List of search queries"
43 | },
44 | "page_number": {
45 | "type": "integer",
46 | "description": "Page number for the search results"
47 | }
48 | },
49 | "required": ["queries"]
50 | }
51 | ),
52 | types.Tool(
53 | name="extract-info-from-search",
54 | description="Extract relative information from previous searches",
55 | inputSchema={
56 | "type": "object",
57 | "properties": {
58 | "queries": {
59 | "type": "array",
60 | "items": {
61 | "type": "string"
62 | },
63 | "description": "List of search queries to merge"
64 | },
65 | },
66 | "required": ["queries"]
67 | }
68 | ),
69 | ]
70 |
71 | @server.call_tool()
72 | async def handle_call_tool(
73 | name: str, arguments: dict | None
74 | ) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]:
75 | """Handle parquet tool execution requests."""
76 | if not arguments:
77 | raise ValueError("Missing arguments")
78 |
79 | if name == "search-web":
80 | queries = arguments.get("queries")
81 | page_number = arguments.get("page_number", 1) # Default to page 1 if not provided
82 |
83 | if not queries:
84 | raise ValueError("Missing queries argument")
85 |
86 | success, message = await perform_search_and_scrape(queries, page_number)
87 | return [types.TextContent(type="text", text=message)]
88 |
89 | elif name == "extract-info-from-search":
90 | queries = arguments.get("queries")
91 |
92 | if not queries:
93 | raise ValueError("Missing queries argument")
94 |
95 | logging.info(f"Starting extract-info-from-search with queries: {queries}")
96 | success, message = await find_similar_chunks(queries)
97 | logging.info(f"Extract-info-from-search completed with success: {success}")
98 | return [types.TextContent(type="text", text=message)]
99 |
100 | else:
101 | raise ValueError(f"Unknown tool: {name}")
102 |
103 | async def main():
104 | """Run the server using stdin/stdout streams."""
105 | async with mcp.server.stdio.stdio_server() as (read_stream, write_stream):
106 | await server.run(
107 | read_stream,
108 | write_stream,
109 | InitializationOptions(
110 | server_name="search-tools",
111 | server_version="0.1.0",
112 | capabilities=server.get_capabilities(
113 | notification_options=NotificationOptions(),
114 | experimental_capabilities={},
115 | ),
116 | ),
117 | )
118 |
119 | if __name__ == "__main__":
120 | asyncio.run(main())
121 |
```
--------------------------------------------------------------------------------
/.chainlit/config.toml:
--------------------------------------------------------------------------------
```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 | # Duration (in seconds) of the user session expiry
13 | user_session_timeout = 1296000 # 15 days
14 |
15 | # Enable third parties caching (e.g., LangChain cache)
16 | cache = false
17 |
18 | # Authorized origins
19 | allow_origins = ["*"]
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 | # Autoscroll new user messages at the top of the window
29 | user_message_autoscroll = true
30 |
31 | # Automatically tag threads with the current chat profile (if a chat profile is used)
32 | auto_tag_thread = true
33 |
34 | # Allow users to edit their own messages
35 | edit_message = true
36 |
37 | # Authorize users to spontaneously upload files with messages
38 | [features.spontaneous_file_upload]
39 | enabled = true
40 | # Define accepted file types using MIME types
41 | # Examples:
42 | # 1. For specific file types:
43 | # accept = ["image/jpeg", "image/png", "application/pdf"]
44 | # 2. For all files of certain type:
45 | # accept = ["image/*", "audio/*", "video/*"]
46 | # 3. For specific file extensions:
47 | # accept = { "application/octet-stream" = [".xyz", ".pdb"] }
48 | # Note: Using "*/*" is not recommended as it may cause browser warnings
49 | accept = ["*/*"]
50 | max_files = 20
51 | max_size_mb = 500
52 |
53 | [features.audio]
54 | # Sample rate of the audio
55 | sample_rate = 24000
56 |
57 | [features.mcp.sse]
58 | enabled = true
59 |
60 | [features.mcp.stdio]
61 | enabled = true
62 | # Only the executables in the allow list can be used for MCP stdio server.
63 | # Only need the base name of the executable, e.g. "npx", not "/usr/bin/npx".
64 | # Please don't comment this line for now, we need it to parse the executable name.
65 | allowed_executables = [ "npx", "uvx" ]
66 |
67 | [UI]
68 | # Name of the assistant.
69 | name = "Assistant"
70 |
71 | # default_theme = "dark"
72 |
73 | # layout = "wide"
74 |
75 | # default_sidebar_state = "open"
76 |
77 | # Description of the assistant. This is used for HTML tags.
78 | # description = ""
79 |
80 | # Chain of Thought (CoT) display mode. Can be "hidden", "tool_call" or "full".
81 | cot = "full"
82 |
83 | # Specify a CSS file that can be used to customize the user interface.
84 | # The CSS file can be served from the public directory or via an external link.
85 | # custom_css = "/public/test.css"
86 |
87 | # Specify additional attributes for a custom CSS file
88 | # custom_css_attributes = "media=\"print\""
89 |
90 | # Specify a JavaScript file that can be used to customize the user interface.
91 | # The JavaScript file can be served from the public directory.
92 | # custom_js = "/public/test.js"
93 |
94 | # Specify additional attributes for custom JS file
95 | # custom_js_attributes = "async type = \"module\""
96 |
97 | # Custom login page image, relative to public directory or external URL
98 | # login_page_image = "/public/custom-background.jpg"
99 |
100 | # Custom login page image filter (Tailwind internal filters, no dark/light variants)
101 | # login_page_image_filter = "brightness-50 grayscale"
102 | # login_page_image_dark_filter = "contrast-200 blur-sm"
103 |
104 | # Specify a custom meta image url.
105 | # custom_meta_image_url = "https://chainlit-cloud.s3.eu-west-3.amazonaws.com/logo/chainlit_banner.png"
106 |
107 | # Specify a custom build directory for the frontend.
108 | # This can be used to customize the frontend code.
109 | # Be careful: If this is a relative path, it should not start with a slash.
110 | # custom_build = "./public/build"
111 |
112 | # Specify optional one or more custom links in the header.
113 | # [[UI.header_links]]
114 | # name = "Issues"
115 | # display_name = "Report Issue"
116 | # icon_url = "https://avatars.githubusercontent.com/u/128686189?s=200&v=4"
117 | # url = "https://github.com/Chainlit/chainlit/issues"
118 |
119 | [meta]
120 | generated_by = "2.5.5"
121 |
```
--------------------------------------------------------------------------------
/src/parquet_mcp_server/src/supabase_db.py:
--------------------------------------------------------------------------------
```python
1 | import os
2 | from dotenv import load_dotenv
3 | from supabase import create_client, Client
4 | import numpy as np
5 | from typing import Dict, List, Any, Optional
6 |
7 | # Load environment variables
8 | load_dotenv()
9 |
10 | class SupabaseDB:
11 | def __init__(self):
12 | """Initialize Supabase client with environment variables."""
13 | url: str = os.environ.get("SUPABASE_URL")
14 | key: str = os.environ.get("SUPABASE_KEY")
15 | self.supabase: Client = create_client(url, key)
16 |
17 | def add_new_data(self, data: Dict[str, Any]) -> Dict[str, Any]:
18 | """
19 | Add new data to the web_search table.
20 |
21 | Args:
22 | data: Dictionary containing text, metadata, and embedding
23 |
24 | Returns:
25 | Dict containing the inserted data or error information
26 | """
27 | try:
28 | # Extract URL and search_id from metadata (assuming metadata is a dictionary)
29 | url_to_delete = data.get("metadata", {}).get("url")
30 | new_search_id = data.get("metadata", {}).get("search_id")
31 |
32 | if url_to_delete and new_search_id:
33 | # Step 1: Get rows with the same URL and check that search_id is different
34 | response = self.supabase.table('web_search').select("id, metadata").filter('metadata->>url', 'eq', url_to_delete).execute()
35 |
36 | rows_to_delete = []
37 | for row in response.data:
38 | # Check if the search_id is different in the existing row
39 | existing_search_id = row['metadata'].get('search_id')
40 | if existing_search_id != new_search_id:
41 | rows_to_delete.append(row['id'])
42 |
43 | if rows_to_delete:
44 | # Step 2: Delete rows with the same URL and different search_id
45 | delete_response = self.supabase.table('web_search').delete().in_('id', rows_to_delete).execute()
46 |
47 | # If there's an error with deletion, raise an exception
48 | if 'error' in delete_response:
49 | raise Exception(f"Failed to delete old data: {delete_response['error']}")
50 |
51 | # Step 3: Insert new data
52 | insert_response = self.supabase.table('web_search').insert(data).execute()
53 |
54 | # If there's an error with insertion, raise an exception
55 | if 'error' in insert_response:
56 | raise Exception(f"Failed to insert new data: {insert_response['error']}")
57 |
58 | return {"success": True, "data": insert_response.data}
59 | else:
60 | raise Exception("URL or search_id not found in the provided data metadata.")
61 |
62 | except Exception as e:
63 | raise Exception(f"Failed to insert data into Supabase: {str(e)}")
64 |
65 | def get_top_10_results(self) -> Dict[str, Any]:
66 | """
67 | Get top 10 results from the web_search table.
68 |
69 | Returns:
70 | Dict containing the results or error information
71 | """
72 | try:
73 | response = self.supabase.table('web_search').select(
74 | "id, metadata, text, embedding"
75 | ).limit(10).execute()
76 | return {"success": True, "data": response.data}
77 | except Exception as e:
78 | return {"success": False, "error": str(e)}
79 |
80 | def search_results_by_similarity(
81 | self,
82 | query_embedding: List[float],
83 | threshold: float = 0.55,
84 | match_count: int = 10
85 | ) -> Dict[str, Any]:
86 | """
87 | Search results by similarity using the match_web_search RPC function.
88 |
89 | Args:
90 | query_embedding: The embedding vector to search with
91 | threshold: Similarity threshold (default: 0.55)
92 | match_count: Number of matches to return (default: 10)
93 |
94 | Returns:
95 | Dict containing the search results or error information
96 | """
97 | try:
98 | response = self.supabase.rpc(
99 | 'match_web_search',
100 | {
101 | 'query_embedding': query_embedding,
102 | 'match_threshold': threshold,
103 | 'match_count': match_count
104 | }
105 | ).execute()
106 | return {"success": True, "data": response.data}
107 | except Exception as e:
108 | return {"success": False, "error": str(e)}
109 |
110 | # Example usage
111 | if __name__ == "__main__":
112 | # Initialize the database client
113 | db = SupabaseDB()
114 |
115 | # Example data
116 | sample_data = {
117 | "text": "This is a sample chunk of text from a web search result.",
118 | "metadata": {
119 | "title": "Sample Web Search Result",
120 | "search_id": "2",
121 | "url": "https://example.com",
122 | "description": "This is a sample web search result",
123 | "timestamp": "2024-03-20T12:00:00Z"
124 | },
125 | "embedding": np.random.rand(1024).tolist()
126 | }
127 |
128 | # Example query embedding
129 | query_embedding = np.random.rand(1024).tolist()
130 |
131 | # Add new data
132 | insert_result = db.add_new_data(sample_data)
133 |
134 | # # Get top 10 results
135 | # top_results = db.get_top_10_results()
136 |
137 | # # Search results by similarity
138 | # similarity_results = db.search_results_by_similarity(
139 | # query_embedding,
140 | # threshold=0.55,
141 | # match_count=10
142 | # )
143 |
144 | # print(similarity_results)
145 |
```
--------------------------------------------------------------------------------
/src/parquet_mcp_server/client.py:
--------------------------------------------------------------------------------
```python
1 | from langchain_core.messages import HumanMessage, ToolMessage, AIMessage
2 | from langchain_openai import AzureChatOpenAI
3 | from langchain_mcp_adapters.tools import load_mcp_tools
4 | from mcp import ClientSession, StdioServerParameters
5 | from langgraph.prebuilt import create_react_agent
6 | from mcp.client.stdio import stdio_client
7 | from langchain_ollama import ChatOllama
8 | from dotenv import load_dotenv
9 | import asyncio
10 | import json
11 | import os
12 | import logging
13 |
14 |
15 | load_dotenv()
16 |
17 | # Configure logging
18 | logging.basicConfig(
19 | level=logging.INFO,
20 | format='%(asctime)s - %(levelname)s - %(message)s',
21 | handlers=[
22 | logging.StreamHandler()
23 | ]
24 | )
25 |
26 |
27 | # Initialize Ollama LangChain model
28 | model = ChatOllama(
29 | base_url=os.getenv("OLLAMA_URL"),
30 | model="llama3.1:8b",
31 | )
32 |
33 | openai_model = AzureChatOpenAI(
34 | azure_deployment="gpt-4o-mini", # or your deployment
35 | api_version="2024-08-01-preview", # or your api version
36 | )
37 |
38 |
39 |
40 | server_params = StdioServerParameters(
41 | command="uv",
42 | args=[
43 | "--directory", os.getenv("SERVER_DIRECTORY", "./src/parquet_mcp_server"),
44 | "run", os.getenv("MAIN_SCRIPT", "main.py")
45 | ],
46 | env={
47 | "EMBEDDING_URL": os.getenv("EMBEDDING_URL"),
48 | "OLLAMA_URL": os.getenv("OLLAMA_URL"),
49 | "EMBEDDING_MODEL": os.getenv("EMBEDDING_MODEL"),
50 | "SEARCHAPI_API_KEY": os.getenv("SEARCHAPI_API_KEY"),
51 | "FIRECRAWL_API_KEY": os.getenv("FIRECRAWL_API_KEY"),
52 | }
53 | )
54 |
55 | async def main():
56 | async with stdio_client(server_params) as (read, write):
57 | async with ClientSession(read, write) as session:
58 | await session.initialize()
59 |
60 | tools = await load_mcp_tools(session)
61 | agent = create_react_agent(model, tools)
62 |
63 | print("🔁 Interactive Agent Started. Type 'exit' to stop.")
64 | while True:
65 | user_input = input("\n🧑💻 Your query: ")
66 | if user_input.strip().lower() == "exit":
67 | print("👋 Exiting.")
68 | break
69 | # user_input = "قیمت ایفون ۱۳ از سرچ قبلی بکش بیرون"
70 |
71 | conversation = [HumanMessage(content=user_input)]
72 |
73 | while True:
74 | response = await agent.ainvoke({"messages": conversation})
75 | new_messages = response["messages"]
76 | conversation.extend(new_messages)
77 |
78 | print("\n--- 💬 New Messages ---")
79 | tool_result = None
80 | tool_function_name = None
81 |
82 | for msg in new_messages:
83 | role = "**User**" if isinstance(msg, HumanMessage) else "**AI**" if isinstance(msg, AIMessage) else "**Tool**"
84 |
85 | if isinstance(msg.content, list):
86 | for c in msg.content:
87 | if role != "**Tool**":
88 | print(f"{role}: {c.get('text', '')}")
89 | else:
90 | if role != "**Tool**":
91 | print(f"{role}: {msg.content}")
92 |
93 | # Tool call detection
94 | if isinstance(msg, AIMessage) and msg.tool_calls:
95 | for tool_call in msg.tool_calls:
96 | print(f"🔧 AI is calling tool: {tool_call['name']} with arguments: {tool_call['args']}")
97 | tool_function_name = tool_call["name"]
98 |
99 | # Tool response
100 | if isinstance(msg, ToolMessage):
101 | tool_result = msg
102 | print(f"{role} (tool output preview): {msg.content[:20]}...") # Preview
103 |
104 | # 🧠 Use Ollama LLM directly for 'extract-info-from-search'
105 | if tool_result:
106 | prompt_content = f"Here is the user's query: {user_input}\nAnd here is the extracted information from the internet. Please organize the information based on the user's query and include the source links: \n{tool_result.content}"
107 | print(prompt_content)
108 | print("\n--- 🧠 Using OpenAI to extract info ---")
109 |
110 | final_response = await model.ainvoke([HumanMessage(content=prompt_content)])
111 |
112 | print("\n--- ✅ Final Answer ---")
113 | print("**AI (Azure OpenAI)**:", final_response.content)
114 | break
115 |
116 | break
117 |
118 |
119 |
120 |
121 | async def perform_search_and_scrape_async(queries: list[str], page_number: int = 1) -> tuple[bool, str]:
122 | """
123 | Process a markdown file into chunks and save as parquet
124 |
125 | Args:
126 | queries (list[str]): List of search queries
127 | page_number (int, optional): Page number for the search results
128 |
129 | Returns:
130 | tuple[bool, str]: Success status and message with output location
131 | """
132 | server_params = StdioServerParameters(
133 | command="uv",
134 | args=["--directory", "./src/parquet_mcp_server", "run", "main.py"],
135 | )
136 |
137 | async with stdio_client(server_params) as (read, write):
138 | async with ClientSession(read, write) as session:
139 | # Initialize the connection
140 | await session.initialize()
141 |
142 | # Call the process-markdown tool
143 | result = await session.call_tool(
144 | "search-web",
145 | {
146 | "queries": queries,
147 | "page_number": page_number
148 | }
149 | )
150 | return result
151 |
152 |
153 | def perform_search_and_scrape(queries: list[str], page_number: int = 1) -> tuple[bool, str]:
154 | """
155 | Perform a web search and scrape results (synchronous version)
156 |
157 | Args:
158 | queries (list[str]): List of search queries
159 | page_number (int, optional): Page number for the search results
160 |
161 | Returns:
162 | tuple[bool, str]: Success status and message with output location
163 | """
164 | return asyncio.run(perform_search_and_scrape_async(queries, page_number))
165 |
166 | async def find_similar_chunks_async(queries: list[str]):
167 | server_params = StdioServerParameters(
168 | command="uv",
169 | args=["--directory", "./src/parquet_mcp_server", "run", "main.py"],
170 | )
171 |
172 | async with stdio_client(server_params) as (read, write):
173 | async with ClientSession(read, write) as session:
174 | # Initialize the connection
175 | await session.initialize()
176 |
177 | # Call the find-similar-chunks tool
178 | result = await session.call_tool(
179 | "extract-info-from-search",
180 | {
181 | "queries": queries,
182 | }
183 | )
184 | return result
185 |
186 | def find_similar_chunks(queries: list[str]):
187 | """
188 | Find similar chunks based on a merged query and a JSON file of embeddings
189 |
190 | Args:
191 | queries (list[str]): List of search queries to merge
192 |
193 | Returns:
194 | The result of the similarity search
195 | """
196 | return asyncio.run(find_similar_chunks_async(queries))
197 |
198 | if __name__ == "__main__":
199 | asyncio.run(main())
200 |
201 |
```
--------------------------------------------------------------------------------
/.chainlit/translations/en-US.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "common": {
3 | "actions": {
4 | "cancel": "Cancel",
5 | "confirm": "Confirm",
6 | "continue": "Continue",
7 | "goBack": "Go Back",
8 | "reset": "Reset",
9 | "submit": "Submit"
10 | },
11 | "status": {
12 | "loading": "Loading...",
13 | "error": {
14 | "default": "An error occurred",
15 | "serverConnection": "Could not reach the server"
16 | }
17 | }
18 | },
19 | "auth": {
20 | "login": {
21 | "title": "Login to access the app",
22 | "form": {
23 | "email": {
24 | "label": "Email address",
25 | "required": "email is a required field"
26 | },
27 | "password": {
28 | "label": "Password",
29 | "required": "password is a required field"
30 | },
31 | "actions": {
32 | "signin": "Sign In"
33 | },
34 | "alternativeText": {
35 | "or": "OR"
36 | }
37 | },
38 | "errors": {
39 | "default": "Unable to sign in",
40 | "signin": "Try signing in with a different account",
41 | "oauthSignin": "Try signing in with a different account",
42 | "redirectUriMismatch": "The redirect URI is not matching the oauth app configuration",
43 | "oauthCallback": "Try signing in with a different account",
44 | "oauthCreateAccount": "Try signing in with a different account",
45 | "emailCreateAccount": "Try signing in with a different account",
46 | "callback": "Try signing in with a different account",
47 | "oauthAccountNotLinked": "To confirm your identity, sign in with the same account you used originally",
48 | "emailSignin": "The e-mail could not be sent",
49 | "emailVerify": "Please verify your email, a new email has been sent",
50 | "credentialsSignin": "Sign in failed. Check the details you provided are correct",
51 | "sessionRequired": "Please sign in to access this page"
52 | }
53 | },
54 | "provider": {
55 | "continue": "Continue with {{provider}}"
56 | }
57 | },
58 | "chat": {
59 | "input": {
60 | "placeholder": "Type your message here...",
61 | "actions": {
62 | "send": "Send message",
63 | "stop": "Stop Task",
64 | "attachFiles": "Attach files"
65 | }
66 | },
67 | "speech": {
68 | "start": "Start recording",
69 | "stop": "Stop recording",
70 | "connecting": "Connecting"
71 | },
72 | "fileUpload": {
73 | "dragDrop": "Drag and drop files here",
74 | "browse": "Browse Files",
75 | "sizeLimit": "Limit:",
76 | "errors": {
77 | "failed": "Failed to upload",
78 | "cancelled": "Cancelled upload of"
79 | }
80 | },
81 | "messages": {
82 | "status": {
83 | "using": "Using",
84 | "used": "Used"
85 | },
86 | "actions": {
87 | "copy": {
88 | "button": "Copy to clipboard",
89 | "success": "Copied!"
90 | }
91 | },
92 | "feedback": {
93 | "positive": "Helpful",
94 | "negative": "Not helpful",
95 | "edit": "Edit feedback",
96 | "dialog": {
97 | "title": "Add a comment",
98 | "submit": "Submit feedback"
99 | },
100 | "status": {
101 | "updating": "Updating",
102 | "updated": "Feedback updated"
103 | }
104 | }
105 | },
106 | "history": {
107 | "title": "Last Inputs",
108 | "empty": "Such empty...",
109 | "show": "Show history"
110 | },
111 | "settings": {
112 | "title": "Settings panel"
113 | },
114 | "watermark": "Built with"
115 | },
116 | "threadHistory": {
117 | "sidebar": {
118 | "title": "Past Chats",
119 | "filters": {
120 | "search": "Search",
121 | "placeholder": "Search conversations..."
122 | },
123 | "timeframes": {
124 | "today": "Today",
125 | "yesterday": "Yesterday",
126 | "previous7days": "Previous 7 days",
127 | "previous30days": "Previous 30 days"
128 | },
129 | "empty": "No threads found",
130 | "actions": {
131 | "close": "Close sidebar",
132 | "open": "Open sidebar"
133 | }
134 | },
135 | "thread": {
136 | "untitled": "Untitled Conversation",
137 | "menu": {
138 | "rename": "Rename",
139 | "delete": "Delete"
140 | },
141 | "actions": {
142 | "delete": {
143 | "title": "Confirm deletion",
144 | "description": "This will delete the thread as well as its messages and elements. This action cannot be undone",
145 | "success": "Chat deleted",
146 | "inProgress": "Deleting chat"
147 | },
148 | "rename": {
149 | "title": "Rename Thread",
150 | "description": "Enter a new name for this thread",
151 | "form": {
152 | "name": {
153 | "label": "Name",
154 | "placeholder": "Enter new name"
155 | }
156 | },
157 | "success": "Thread renamed!",
158 | "inProgress": "Renaming thread"
159 | }
160 | }
161 | }
162 | },
163 | "navigation": {
164 | "header": {
165 | "chat": "Chat",
166 | "readme": "Readme",
167 | "theme": {
168 | "light": "Light Theme",
169 | "dark": "Dark Theme",
170 | "system": "Follow System"
171 | }
172 | },
173 | "newChat": {
174 | "button": "New Chat",
175 | "dialog": {
176 | "title": "Create New Chat",
177 | "description": "This will clear your current chat history. Are you sure you want to continue?",
178 | "tooltip": "New Chat"
179 | }
180 | },
181 | "user": {
182 | "menu": {
183 | "settings": "Settings",
184 | "settingsKey": "S",
185 | "apiKeys": "API Keys",
186 | "logout": "Logout"
187 | }
188 | }
189 | },
190 | "apiKeys": {
191 | "title": "Required API Keys",
192 | "description": "To use this app, the following API keys are required. The keys are stored on your device's local storage.",
193 | "success": {
194 | "saved": "Saved successfully"
195 | }
196 | },
197 | "alerts": {
198 | "info": "Info",
199 | "note": "Note",
200 | "tip": "Tip",
201 | "important": "Important",
202 | "warning": "Warning",
203 | "caution": "Caution",
204 | "debug": "Debug",
205 | "example": "Example",
206 | "success": "Success",
207 | "help": "Help",
208 | "idea": "Idea",
209 | "pending": "Pending",
210 | "security": "Security",
211 | "beta": "Beta",
212 | "best-practice": "Best Practice"
213 | }
214 | }
```
--------------------------------------------------------------------------------
/src/parquet_mcp_server/chatAgent.py:
--------------------------------------------------------------------------------
```python
1 | import asyncio
2 | import os
3 | from dotenv import load_dotenv
4 | from typing import cast
5 |
6 | import chainlit as cl
7 | from autogen_agentchat.agents import AssistantAgent, UserProxyAgent
8 | from autogen_agentchat.base import TaskResult
9 | from autogen_agentchat.conditions import TextMentionTermination
10 | from autogen_agentchat.messages import ModelClientStreamingChunkEvent, TextMessage
11 | from autogen_agentchat.teams import RoundRobinGroupChat
12 | from autogen_core import CancellationToken
13 | from autogen_ext.models.openai import OpenAIChatCompletionClient
14 | from autogen_ext.tools.mcp import StdioServerParams, mcp_server_tools
15 |
16 | import logging
17 | from autogen_core import TRACE_LOGGER_NAME, EVENT_LOGGER_NAME, ROOT_LOGGER_NAME
18 |
19 | # Silence all logs
20 | logging.getLogger(TRACE_LOGGER_NAME).setLevel(logging.CRITICAL + 1)
21 | logging.getLogger(EVENT_LOGGER_NAME).setLevel(logging.CRITICAL + 1)
22 | logging.getLogger(ROOT_LOGGER_NAME).setLevel(logging.ERROR)
23 |
24 |
25 |
26 | from autogen_ext.auth.azure import AzureTokenProvider
27 | from autogen_ext.models.openai import AzureOpenAIChatCompletionClient
28 | from azure.identity import DefaultAzureCredential
29 |
30 | load_dotenv()
31 |
32 | az_model_client = AzureOpenAIChatCompletionClient(
33 | azure_deployment="gpt-4o-mini",
34 | model="gpt-4o-mini",
35 | api_version=os.getenv("AZURE_OPENAI_VERSION"),
36 | azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
37 | api_key=os.getenv("AZURE_OPENAI_API_KEY"), # For key-based authentication.
38 | )
39 |
40 |
41 |
42 | # Base model for demonstration
43 | model = OpenAIChatCompletionClient(
44 | model="llama3.1:8b",
45 | base_url=os.getenv("BASE_OLLAMA_URL"),
46 | api_key="ollama",
47 | model_info={
48 | "model": "llama3.1:8b",
49 | "vision": False,
50 | "function_calling": True,
51 | "json_output": False,
52 | "family": "unknown",
53 | },
54 | )
55 |
56 | # Define server parameters
57 | server_params = StdioServerParams(
58 | command="uv",
59 | args=[
60 | "--directory",
61 | "/home/agent/workspace/search_mcp_server/src/parquet_mcp_server",
62 | "run",
63 | "main.py",
64 | ],
65 | )
66 |
67 |
68 |
69 |
70 |
71 | # User input function
72 | async def user_input_func(prompt: str, cancellation_token: CancellationToken | None = None) -> str:
73 | try:
74 | response = await cl.AskUserMessage(content=prompt).send()
75 | except TimeoutError:
76 | return "User did not provide any input within the time limit."
77 | return response["output"] if response else "User did not provide any input."
78 |
79 |
80 |
81 | # Recreate team dynamically based on user-selected mode
82 | async def recreate_team_based_on_mode() -> RoundRobinGroupChat:
83 | mode = cl.user_session.get("mode", "scratch")
84 | tools = await mcp_server_tools(server_params)
85 |
86 | if mode == "scratch":
87 | print("==================================")
88 | fetcher_system = """
89 | You are a web search assistant.
90 | Pass user prompt to mcp_server and get results.
91 | Pass All information along with their sources at the end to summerizer.
92 | """
93 | else: # "previous"
94 | fetcher_system = """
95 | You are a retriver, get data from previous searches do not search or scrape anything.
96 | Pass All information along with their sources at the end to summerizer.
97 | """
98 |
99 | fetcher = AssistantAgent(
100 | name="fetcher",
101 | system_message=fetcher_system,
102 | model_client=az_model_client,
103 | # OpenAIChatCompletionClient(model="gpt-4o-mini"),
104 | # az_model_client,
105 | tools=tools,
106 | reflect_on_tool_use=True,
107 | model_client_stream=True,
108 | )
109 |
110 | summarizer = AssistantAgent(
111 | name="summarizer",
112 | system_message="""
113 | 1. Format the 'fetcher' information in a readable table, focusing on key details like prices and specifications.
114 | 2. DO NOT GIVE INFO FROM YOURSELF.
115 | 3. Return the pricing in both Iran and globally based on the fetcher results.
116 | 4. DO NOT CONVERT PRICES TO EACH OTHER. ONLY ADD PRICES YOU ACTUALLY GET.
117 | 5. After completing the above steps, hand off the conversation to the user.
118 | """,
119 | model_client=az_model_client,
120 | # az_model_client,
121 | # OpenAIChatCompletionClient(model="gpt-4o-mini"),
122 | model_client_stream=True,
123 | )
124 |
125 | user = UserProxyAgent(name="user", input_func=user_input_func)
126 | termination = TextMentionTermination("TERMINATE", sources=["user"])
127 |
128 | return RoundRobinGroupChat([fetcher, summarizer, user], termination_condition=termination)
129 |
130 | # Streaming logic
131 | async def run_agent_stream(user_message: str):
132 | loading_message = await cl.Message(content="Processing... Please wait.", author="system").send()
133 |
134 | team = await recreate_team_based_on_mode()
135 | cl.user_session.set("team", team) # optionally update session
136 | streaming_response: cl.Message | None = None
137 |
138 | try:
139 | async for msg in team.run_stream(
140 | task=[TextMessage(content=user_message, source="user")],
141 | cancellation_token=CancellationToken(),
142 | ):
143 | if isinstance(msg, ModelClientStreamingChunkEvent):
144 | if streaming_response is None:
145 | streaming_response = cl.Message(content="", author=msg.source)
146 | await streaming_response.stream_token(msg.content)
147 | elif streaming_response is not None:
148 | await streaming_response.send()
149 | streaming_response = None
150 | elif isinstance(msg, TaskResult):
151 | final_message = "Task terminated. "
152 | if msg.stop_reason:
153 | final_message += msg.stop_reason
154 | await cl.Message(content=final_message).send()
155 |
156 | finally:
157 | # Once the task is complete, remove the "Processing..." message
158 | if loading_message:
159 | loading_message.content = "Processing complete! Task finished."
160 | await loading_message.update()
161 |
162 |
163 |
164 | # Initial chat start: shows feature options
165 | @cl.on_chat_start
166 | async def start_chat() -> None:
167 | actions = [
168 | cl.Action(name="search_from_scratch", label="Search from Scratch", icon="🔍", payload={"option": "scratch"}),
169 | cl.Action(name="check_previous_results", label="Check Previous Results", icon="🕘", payload={"option": "previous"})
170 | ]
171 | await cl.Message(content="Hi👋, please choose one of the features.", actions=actions).send()
172 | cl.user_session.set("mode", "scratch") # default mode
173 |
174 | # Handle action: Search from Scratch
175 | @cl.action_callback("search_from_scratch")
176 | async def handle_search_from_scratch(action: cl.Action):
177 | cl.user_session.set("mode", "scratch")
178 | response = await cl.AskUserMessage(content="Please enter the product name you want to search for like this 'product x price, قیمت محصول ایکس' .").send()
179 | if response and response.get("output"):
180 | await run_agent_stream(response["output"])
181 |
182 | # Handle action: Check Previous Results
183 | @cl.action_callback("check_previous_results")
184 | async def handle_check_previous_results(action: cl.Action):
185 | cl.user_session.set("mode", "previous")
186 | response = await cl.AskUserMessage(content="I will fetch results from your previous searches. Please enter the product name like this 'product x price, قیمت محصول ایکس' .").send()
187 | if response and response.get("output"):
188 | await run_agent_stream(response["output"])
189 |
190 | # Catch all for free-form user messages
191 | @cl.on_message
192 | async def chat(message: cl.Message) -> None:
193 | await run_agent_stream(message.content)
194 |
```
--------------------------------------------------------------------------------
/.chainlit/translations/nl.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "common": {
3 | "actions": {
4 | "cancel": "Annuleren",
5 | "confirm": "Bevestigen",
6 | "continue": "Doorgaan",
7 | "goBack": "Terug",
8 | "reset": "Herstellen",
9 | "submit": "Versturen"
10 | },
11 | "status": {
12 | "loading": "Laden...",
13 | "error": {
14 | "default": "Er is een fout opgetreden",
15 | "serverConnection": "Kon geen verbinding maken met de server"
16 | }
17 | }
18 | },
19 | "auth": {
20 | "login": {
21 | "title": "Inloggen om toegang te krijgen tot de app",
22 | "form": {
23 | "email": {
24 | "label": "E-mailadres",
25 | "required": "e-mail is een verplicht veld"
26 | },
27 | "password": {
28 | "label": "Wachtwoord",
29 | "required": "wachtwoord is een verplicht veld"
30 | },
31 | "actions": {
32 | "signin": "Inloggen"
33 | },
34 | "alternativeText": {
35 | "or": "OF"
36 | }
37 | },
38 | "errors": {
39 | "default": "Kan niet inloggen",
40 | "signin": "Probeer in te loggen met een ander account",
41 | "oauthSignin": "Probeer in te loggen met een ander account",
42 | "redirectUriMismatch": "De redirect URI komt niet overeen met de oauth app configuratie",
43 | "oauthCallback": "Probeer in te loggen met een ander account",
44 | "oauthCreateAccount": "Probeer in te loggen met een ander account",
45 | "emailCreateAccount": "Probeer in te loggen met een ander account",
46 | "callback": "Probeer in te loggen met een ander account",
47 | "oauthAccountNotLinked": "Om je identiteit te bevestigen, log in met hetzelfde account dat je oorspronkelijk hebt gebruikt",
48 | "emailSignin": "De e-mail kon niet worden verzonden",
49 | "emailVerify": "Verifieer je e-mail, er is een nieuwe e-mail verzonden",
50 | "credentialsSignin": "Inloggen mislukt. Controleer of de ingevoerde gegevens correct zijn",
51 | "sessionRequired": "Log in om toegang te krijgen tot deze pagina"
52 | }
53 | },
54 | "provider": {
55 | "continue": "Doorgaan met {{provider}}"
56 | }
57 | },
58 | "chat": {
59 | "input": {
60 | "placeholder": "Typ hier je bericht...",
61 | "actions": {
62 | "send": "Bericht versturen",
63 | "stop": "Taak stoppen",
64 | "attachFiles": "Bestanden bijvoegen"
65 | }
66 | },
67 | "speech": {
68 | "start": "Start opname",
69 | "stop": "Stop opname",
70 | "connecting": "Verbinden"
71 | },
72 | "fileUpload": {
73 | "dragDrop": "Sleep bestanden hierheen",
74 | "browse": "Bestanden zoeken",
75 | "sizeLimit": "Limiet:",
76 | "errors": {
77 | "failed": "Uploaden mislukt",
78 | "cancelled": "Upload geannuleerd van"
79 | }
80 | },
81 | "messages": {
82 | "status": {
83 | "using": "In gebruik",
84 | "used": "Gebruikt"
85 | },
86 | "actions": {
87 | "copy": {
88 | "button": "Kopi\u00ebren naar klembord",
89 | "success": "Gekopieerd!"
90 | }
91 | },
92 | "feedback": {
93 | "positive": "Nuttig",
94 | "negative": "Niet nuttig",
95 | "edit": "Feedback bewerken",
96 | "dialog": {
97 | "title": "Voeg een opmerking toe",
98 | "submit": "Feedback versturen"
99 | },
100 | "status": {
101 | "updating": "Bijwerken",
102 | "updated": "Feedback bijgewerkt"
103 | }
104 | }
105 | },
106 | "history": {
107 | "title": "Laatste invoer",
108 | "empty": "Zo leeg...",
109 | "show": "Toon geschiedenis"
110 | },
111 | "settings": {
112 | "title": "Instellingenpaneel"
113 | },
114 | "watermark": "Gebouwd met"
115 | },
116 | "threadHistory": {
117 | "sidebar": {
118 | "title": "Eerdere chats",
119 | "filters": {
120 | "search": "Zoeken",
121 | "placeholder": "Search conversations..."
122 | },
123 | "timeframes": {
124 | "today": "Vandaag",
125 | "yesterday": "Gisteren",
126 | "previous7days": "Afgelopen 7 dagen",
127 | "previous30days": "Afgelopen 30 dagen"
128 | },
129 | "empty": "Geen gesprekken gevonden",
130 | "actions": {
131 | "close": "Zijbalk sluiten",
132 | "open": "Zijbalk openen"
133 | }
134 | },
135 | "thread": {
136 | "untitled": "Naamloos gesprek",
137 | "menu": {
138 | "rename": "Rename",
139 | "delete": "Delete"
140 | },
141 | "actions": {
142 | "delete": {
143 | "title": "Verwijdering bevestigen",
144 | "description": "Dit zal het gesprek en bijbehorende berichten en elementen verwijderen. Deze actie kan niet ongedaan worden gemaakt",
145 | "success": "Chat verwijderd",
146 | "inProgress": "Chat verwijderen"
147 | },
148 | "rename": {
149 | "title": "Gesprek hernoemen",
150 | "description": "Voer een nieuwe naam in voor dit gesprek",
151 | "form": {
152 | "name": {
153 | "label": "Naam",
154 | "placeholder": "Voer nieuwe naam in"
155 | }
156 | },
157 | "success": "Gesprek hernoemd!",
158 | "inProgress": "Gesprek hernoemen"
159 | }
160 | }
161 | }
162 | },
163 | "navigation": {
164 | "header": {
165 | "chat": "Chat",
166 | "readme": "Leesmij",
167 | "theme": {
168 | "light": "Light Theme",
169 | "dark": "Dark Theme",
170 | "system": "Follow System"
171 | }
172 | },
173 | "newChat": {
174 | "button": "Nieuwe chat",
175 | "dialog": {
176 | "title": "Nieuwe chat aanmaken",
177 | "description": "Dit zal je huidige chatgeschiedenis wissen. Weet je zeker dat je door wilt gaan?",
178 | "tooltip": "Nieuwe chat"
179 | }
180 | },
181 | "user": {
182 | "menu": {
183 | "settings": "Instellingen",
184 | "settingsKey": "I",
185 | "apiKeys": "API-sleutels",
186 | "logout": "Uitloggen"
187 | }
188 | }
189 | },
190 | "apiKeys": {
191 | "title": "Vereiste API-sleutels",
192 | "description": "Om deze app te gebruiken zijn de volgende API-sleutels vereist. De sleutels worden opgeslagen in de lokale opslag van je apparaat.",
193 | "success": {
194 | "saved": "Succesvol opgeslagen"
195 | }
196 | },
197 | "alerts": {
198 | "info": "Info",
199 | "note": "Note",
200 | "tip": "Tip",
201 | "important": "Important",
202 | "warning": "Warning",
203 | "caution": "Caution",
204 | "debug": "Debug",
205 | "example": "Example",
206 | "success": "Success",
207 | "help": "Help",
208 | "idea": "Idea",
209 | "pending": "Pending",
210 | "security": "Security",
211 | "beta": "Beta",
212 | "best-practice": "Best Practice"
213 | }
214 | }
```
--------------------------------------------------------------------------------
/.chainlit/translations/zh-CN.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "common": {
3 | "actions": {
4 | "cancel": "\u53d6\u6d88",
5 | "confirm": "\u786e\u8ba4",
6 | "continue": "\u7ee7\u7eed",
7 | "goBack": "\u8fd4\u56de",
8 | "reset": "\u91cd\u7f6e",
9 | "submit": "\u63d0\u4ea4"
10 | },
11 | "status": {
12 | "loading": "\u52a0\u8f7d\u4e2d...",
13 | "error": {
14 | "default": "\u53d1\u751f\u9519\u8bef",
15 | "serverConnection": "\u65e0\u6cd5\u8fde\u63a5\u5230\u670d\u52a1\u5668"
16 | }
17 | }
18 | },
19 | "auth": {
20 | "login": {
21 | "title": "\u767b\u5f55\u4ee5\u8bbf\u95ee\u5e94\u7528",
22 | "form": {
23 | "email": {
24 | "label": "\u7535\u5b50\u90ae\u7bb1",
25 | "required": "\u90ae\u7bb1\u662f\u5fc5\u586b\u9879"
26 | },
27 | "password": {
28 | "label": "\u5bc6\u7801",
29 | "required": "\u5bc6\u7801\u662f\u5fc5\u586b\u9879"
30 | },
31 | "actions": {
32 | "signin": "\u767b\u5f55"
33 | },
34 | "alternativeText": {
35 | "or": "\u6216"
36 | }
37 | },
38 | "errors": {
39 | "default": "\u65e0\u6cd5\u767b\u5f55",
40 | "signin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
41 | "oauthSignin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
42 | "redirectUriMismatch": "\u91cd\u5b9a\u5411URI\u4e0eOAuth\u5e94\u7528\u914d\u7f6e\u4e0d\u5339\u914d",
43 | "oauthCallback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
44 | "oauthCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
45 | "emailCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
46 | "callback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
47 | "oauthAccountNotLinked": "\u4e3a\u786e\u8ba4\u60a8\u7684\u8eab\u4efd\uff0c\u8bf7\u4f7f\u7528\u539f\u59cb\u8d26\u53f7\u767b\u5f55",
48 | "emailSignin": "\u90ae\u4ef6\u53d1\u9001\u5931\u8d25",
49 | "emailVerify": "\u8bf7\u9a8c\u8bc1\u60a8\u7684\u90ae\u7bb1\uff0c\u65b0\u7684\u9a8c\u8bc1\u90ae\u4ef6\u5df2\u53d1\u9001",
50 | "credentialsSignin": "\u767b\u5f55\u5931\u8d25\u3002\u8bf7\u68c0\u67e5\u60a8\u63d0\u4f9b\u7684\u4fe1\u606f\u662f\u5426\u6b63\u786e",
51 | "sessionRequired": "\u8bf7\u767b\u5f55\u4ee5\u8bbf\u95ee\u6b64\u9875\u9762"
52 | }
53 | },
54 | "provider": {
55 | "continue": "\u7ee7\u7eed\u4f7f\u7528{{provider}}"
56 | }
57 | },
58 | "chat": {
59 | "input": {
60 | "placeholder": "\u5728\u6b64\u8f93\u5165\u60a8\u7684\u6d88\u606f...",
61 | "actions": {
62 | "send": "\u53d1\u9001\u6d88\u606f",
63 | "stop": "\u505c\u6b62\u4efb\u52a1",
64 | "attachFiles": "\u9644\u52a0\u6587\u4ef6"
65 | }
66 | },
67 | "speech": {
68 | "start": "\u5f00\u59cb\u5f55\u97f3",
69 | "stop": "\u505c\u6b62\u5f55\u97f3",
70 | "connecting": "\u8fde\u63a5\u4e2d"
71 | },
72 | "fileUpload": {
73 | "dragDrop": "\u5c06\u6587\u4ef6\u62d6\u653e\u5230\u8fd9\u91cc",
74 | "browse": "\u6d4f\u89c8\u6587\u4ef6",
75 | "sizeLimit": "\u9650\u5236\uff1a",
76 | "errors": {
77 | "failed": "\u4e0a\u4f20\u5931\u8d25",
78 | "cancelled": "\u5df2\u53d6\u6d88\u4e0a\u4f20"
79 | }
80 | },
81 | "messages": {
82 | "status": {
83 | "using": "\u4f7f\u7528\u4e2d",
84 | "used": "\u5df2\u4f7f\u7528"
85 | },
86 | "actions": {
87 | "copy": {
88 | "button": "\u590d\u5236\u5230\u526a\u8d34\u677f",
89 | "success": "\u5df2\u590d\u5236\uff01"
90 | }
91 | },
92 | "feedback": {
93 | "positive": "\u6709\u5e2e\u52a9",
94 | "negative": "\u6ca1\u6709\u5e2e\u52a9",
95 | "edit": "\u7f16\u8f91\u53cd\u9988",
96 | "dialog": {
97 | "title": "\u6dfb\u52a0\u8bc4\u8bba",
98 | "submit": "\u63d0\u4ea4\u53cd\u9988"
99 | },
100 | "status": {
101 | "updating": "\u66f4\u65b0\u4e2d",
102 | "updated": "\u53cd\u9988\u5df2\u66f4\u65b0"
103 | }
104 | }
105 | },
106 | "history": {
107 | "title": "\u6700\u8fd1\u8f93\u5165",
108 | "empty": "\u7a7a\u7a7a\u5982\u4e5f...",
109 | "show": "\u663e\u793a\u5386\u53f2"
110 | },
111 | "settings": {
112 | "title": "\u8bbe\u7f6e\u9762\u677f"
113 | },
114 | "watermark": "\u6280\u672f\u652f\u6301"
115 | },
116 | "threadHistory": {
117 | "sidebar": {
118 | "title": "\u5386\u53f2\u5bf9\u8bdd",
119 | "filters": {
120 | "search": "\u641c\u7d22",
121 | "placeholder": "\u641c\u7d22\u4f1a\u8bdd..."
122 | },
123 | "timeframes": {
124 | "today": "\u4eca\u5929",
125 | "yesterday": "\u6628\u5929",
126 | "previous7days": "\u8fc7\u53bb7\u5929",
127 | "previous30days": "\u8fc7\u53bb30\u5929"
128 | },
129 | "empty": "\u672a\u627e\u5230\u5bf9\u8bdd",
130 | "actions": {
131 | "close": "\u5173\u95ed\u4fa7\u8fb9\u680f",
132 | "open": "\u6253\u5f00\u4fa7\u8fb9\u680f"
133 | }
134 | },
135 | "thread": {
136 | "untitled": "\u672a\u547d\u540d\u5bf9\u8bdd",
137 | "menu": {
138 | "rename": "\u91cd\u547d\u540d",
139 | "delete": "\u5220\u9664"
140 | },
141 | "actions": {
142 | "delete": {
143 | "title": "\u786e\u8ba4\u5220\u9664",
144 | "description": "\u8fd9\u5c06\u5220\u9664\u8be5\u5bf9\u8bdd\u53ca\u5176\u6240\u6709\u6d88\u606f\u548c\u5143\u7d20\u3002\u6b64\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500",
145 | "success": "\u5bf9\u8bdd\u5df2\u5220\u9664",
146 | "inProgress": "\u6b63\u5728\u5220\u9664\u5bf9\u8bdd"
147 | },
148 | "rename": {
149 | "title": "\u91cd\u547d\u540d\u5bf9\u8bdd",
150 | "description": "\u4e3a\u6b64\u5bf9\u8bdd\u8f93\u5165\u65b0\u540d\u79f0",
151 | "form": {
152 | "name": {
153 | "label": "\u540d\u79f0",
154 | "placeholder": "\u8f93\u5165\u65b0\u540d\u79f0"
155 | }
156 | },
157 | "success": "\u5bf9\u8bdd\u5df2\u91cd\u547d\u540d\uff01",
158 | "inProgress": "\u6b63\u5728\u91cd\u547d\u540d\u5bf9\u8bdd"
159 | }
160 | }
161 | }
162 | },
163 | "navigation": {
164 | "header": {
165 | "chat": "\u804a\u5929",
166 | "readme": "\u8bf4\u660e",
167 | "theme": {
168 | "light": "\u6d45\u8272\u4e3b\u9898",
169 | "dark": "\u6df1\u8272\u4e3b\u9898",
170 | "system": "\u8ddf\u968f\u7cfb\u7edf"
171 | }
172 | },
173 | "newChat": {
174 | "button": "\u65b0\u5efa\u5bf9\u8bdd",
175 | "dialog": {
176 | "title": "\u521b\u5efa\u65b0\u5bf9\u8bdd",
177 | "description": "\u8fd9\u5c06\u6e05\u9664\u60a8\u5f53\u524d\u7684\u804a\u5929\u8bb0\u5f55\u3002\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f",
178 | "tooltip": "\u65b0\u5efa\u5bf9\u8bdd"
179 | }
180 | },
181 | "user": {
182 | "menu": {
183 | "settings": "\u8bbe\u7f6e",
184 | "settingsKey": "S",
185 | "apiKeys": "API\u5bc6\u94a5",
186 | "logout": "\u9000\u51fa\u767b\u5f55"
187 | }
188 | }
189 | },
190 | "apiKeys": {
191 | "title": "\u6240\u9700API\u5bc6\u94a5",
192 | "description": "\u4f7f\u7528\u6b64\u5e94\u7528\u9700\u8981\u4ee5\u4e0bAPI\u5bc6\u94a5\u3002\u8fd9\u4e9b\u5bc6\u94a5\u5b58\u50a8\u5728\u60a8\u8bbe\u5907\u7684\u672c\u5730\u5b58\u50a8\u4e2d\u3002",
193 | "success": {
194 | "saved": "\u4fdd\u5b58\u6210\u529f"
195 | }
196 | },
197 | "alerts": {
198 | "info": "\u4fe1\u606f",
199 | "note": "\u6ce8\u91ca",
200 | "tip": "\u63d0\u793a",
201 | "important": "\u91cd\u8981",
202 | "warning": "\u8b66\u544a",
203 | "caution": "\u6ce8\u610f",
204 | "debug": "\u8c03\u8bd5",
205 | "example": "\u793a\u4f8b",
206 | "success": "\u6210\u529f",
207 | "help": "\u5e2e\u52a9",
208 | "idea": "\u60f3\u6cd5",
209 | "pending": "\u5f85\u5904\u7406",
210 | "security": "\u5b89\u5168",
211 | "beta": "\u6d4b\u8bd5",
212 | "best-practice": "\u6700\u4f73\u5b9e\u8df5"
213 | }
214 | }
```
--------------------------------------------------------------------------------
/.chainlit/translations/ja.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "common": {
3 | "actions": {
4 | "cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb",
5 | "confirm": "\u78ba\u8a8d",
6 | "continue": "\u7d9a\u3051\u308b",
7 | "goBack": "\u623b\u308b",
8 | "reset": "\u30ea\u30bb\u30c3\u30c8",
9 | "submit": "\u9001\u4fe1"
10 | },
11 | "status": {
12 | "loading": "\u8aad\u307f\u8fbc\u307f\u4e2d...",
13 | "error": {
14 | "default": "\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f",
15 | "serverConnection": "\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f"
16 | }
17 | }
18 | },
19 | "auth": {
20 | "login": {
21 | "title": "\u30a2\u30d7\u30ea\u306b\u30ed\u30b0\u30a4\u30f3",
22 | "form": {
23 | "email": {
24 | "label": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9",
25 | "required": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059"
26 | },
27 | "password": {
28 | "label": "\u30d1\u30b9\u30ef\u30fc\u30c9",
29 | "required": "\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059"
30 | },
31 | "actions": {
32 | "signin": "\u30b5\u30a4\u30f3\u30a4\u30f3"
33 | },
34 | "alternativeText": {
35 | "or": "\u307e\u305f\u306f"
36 | }
37 | },
38 | "errors": {
39 | "default": "\u30b5\u30a4\u30f3\u30a4\u30f3\u3067\u304d\u307e\u305b\u3093",
40 | "signin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
41 | "oauthSignin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
42 | "redirectUriMismatch": "\u30ea\u30c0\u30a4\u30ec\u30af\u30c8URI\u304cOAuth\u30a2\u30d7\u30ea\u306e\u8a2d\u5b9a\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093",
43 | "oauthCallback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
44 | "oauthCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
45 | "emailCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
46 | "callback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
47 | "oauthAccountNotLinked": "\u672c\u4eba\u78ba\u8a8d\u306e\u305f\u3081\u3001\u6700\u521d\u306b\u4f7f\u7528\u3057\u305f\u306e\u3068\u540c\u3058\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
48 | "emailSignin": "\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f",
49 | "emailVerify": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u65b0\u3057\u3044\u30e1\u30fc\u30eb\u304c\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f",
50 | "credentialsSignin": "\u30b5\u30a4\u30f3\u30a4\u30f3\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u5165\u529b\u3057\u305f\u60c5\u5831\u304c\u6b63\u3057\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044",
51 | "sessionRequired": "\u3053\u306e\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306b\u306f\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044"
52 | }
53 | },
54 | "provider": {
55 | "continue": "{{provider}}\u3067\u7d9a\u3051\u308b"
56 | }
57 | },
58 | "chat": {
59 | "input": {
60 | "placeholder": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044...",
61 | "actions": {
62 | "send": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1",
63 | "stop": "\u30bf\u30b9\u30af\u3092\u505c\u6b62",
64 | "attachFiles": "\u30d5\u30a1\u30a4\u30eb\u3092\u6dfb\u4ed8"
65 | }
66 | },
67 | "speech": {
68 | "start": "\u9332\u97f3\u958b\u59cb",
69 | "stop": "\u9332\u97f3\u505c\u6b62",
70 | "connecting": "\u63a5\u7d9a\u4e2d"
71 | },
72 | "fileUpload": {
73 | "dragDrop": "\u3053\u3053\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30c9\u30e9\u30c3\u30b0\uff06\u30c9\u30ed\u30c3\u30d7",
74 | "browse": "\u30d5\u30a1\u30a4\u30eb\u3092\u53c2\u7167",
75 | "sizeLimit": "\u5236\u9650\uff1a",
76 | "errors": {
77 | "failed": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f",
78 | "cancelled": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3057\u305f\uff1a"
79 | }
80 | },
81 | "messages": {
82 | "status": {
83 | "using": "\u4f7f\u7528\u4e2d",
84 | "used": "\u4f7f\u7528\u6e08\u307f"
85 | },
86 | "actions": {
87 | "copy": {
88 | "button": "\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc",
89 | "success": "\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\uff01"
90 | }
91 | },
92 | "feedback": {
93 | "positive": "\u5f79\u306b\u7acb\u3063\u305f",
94 | "negative": "\u5f79\u306b\u7acb\u305f\u306a\u304b\u3063\u305f",
95 | "edit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u7de8\u96c6",
96 | "dialog": {
97 | "title": "\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0",
98 | "submit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u9001\u4fe1"
99 | },
100 | "status": {
101 | "updating": "\u66f4\u65b0\u4e2d",
102 | "updated": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f"
103 | }
104 | }
105 | },
106 | "history": {
107 | "title": "\u6700\u8fd1\u306e\u5165\u529b",
108 | "empty": "\u4f55\u3082\u3042\u308a\u307e\u305b\u3093...",
109 | "show": "\u5c65\u6b74\u3092\u8868\u793a"
110 | },
111 | "settings": {
112 | "title": "\u8a2d\u5b9a\u30d1\u30cd\u30eb"
113 | },
114 | "watermark": "\u958b\u767a\u5143\uff1a"
115 | },
116 | "threadHistory": {
117 | "sidebar": {
118 | "title": "\u904e\u53bb\u306e\u30c1\u30e3\u30c3\u30c8",
119 | "filters": {
120 | "search": "\u691c\u7d22",
121 | "placeholder": "Search conversations..."
122 | },
123 | "timeframes": {
124 | "today": "\u4eca\u65e5",
125 | "yesterday": "\u6628\u65e5",
126 | "previous7days": "\u904e\u53bb7\u65e5\u9593",
127 | "previous30days": "\u904e\u53bb30\u65e5\u9593"
128 | },
129 | "empty": "\u30b9\u30ec\u30c3\u30c9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093",
130 | "actions": {
131 | "close": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u9589\u3058\u308b",
132 | "open": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u958b\u304f"
133 | }
134 | },
135 | "thread": {
136 | "untitled": "\u7121\u984c\u306e\u4f1a\u8a71",
137 | "menu": {
138 | "rename": "Rename",
139 | "delete": "Delete"
140 | },
141 | "actions": {
142 | "delete": {
143 | "title": "\u524a\u9664\u306e\u78ba\u8a8d",
144 | "description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u3068\u305d\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3001\u8981\u7d20\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u64cd\u4f5c\u306f\u53d6\u308a\u6d88\u305b\u307e\u305b\u3093",
145 | "success": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u3057\u307e\u3057\u305f",
146 | "inProgress": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u4e2d"
147 | },
148 | "rename": {
149 | "title": "\u30b9\u30ec\u30c3\u30c9\u306e\u540d\u524d\u3092\u5909\u66f4",
150 | "description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306e\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044",
151 | "form": {
152 | "name": {
153 | "label": "\u540d\u524d",
154 | "placeholder": "\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b"
155 | }
156 | },
157 | "success": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u3057\u307e\u3057\u305f\uff01",
158 | "inProgress": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u4e2d"
159 | }
160 | }
161 | }
162 | },
163 | "navigation": {
164 | "header": {
165 | "chat": "\u30c1\u30e3\u30c3\u30c8",
166 | "readme": "\u8aac\u660e\u66f8",
167 | "theme": {
168 | "light": "Light Theme",
169 | "dark": "Dark Theme",
170 | "system": "Follow System"
171 | }
172 | },
173 | "newChat": {
174 | "button": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8",
175 | "dialog": {
176 | "title": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8\u306e\u4f5c\u6210",
177 | "description": "\u73fe\u5728\u306e\u30c1\u30e3\u30c3\u30c8\u5c65\u6b74\u304c\u30af\u30ea\u30a2\u3055\u308c\u307e\u3059\u3002\u7d9a\u884c\u3057\u307e\u3059\u304b\uff1f",
178 | "tooltip": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8"
179 | }
180 | },
181 | "user": {
182 | "menu": {
183 | "settings": "\u8a2d\u5b9a",
184 | "settingsKey": "S",
185 | "apiKeys": "API\u30ad\u30fc",
186 | "logout": "\u30ed\u30b0\u30a2\u30a6\u30c8"
187 | }
188 | }
189 | },
190 | "apiKeys": {
191 | "title": "\u5fc5\u8981\u306aAPI\u30ad\u30fc",
192 | "description": "\u3053\u306e\u30a2\u30d7\u30ea\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001\u4ee5\u4e0b\u306eAPI\u30ad\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u30ad\u30fc\u306f\u304a\u4f7f\u3044\u306e\u30c7\u30d0\u30a4\u30b9\u306e\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002",
193 | "success": {
194 | "saved": "\u4fdd\u5b58\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f"
195 | }
196 | },
197 | "alerts": {
198 | "info": "Info",
199 | "note": "Note",
200 | "tip": "Tip",
201 | "important": "Important",
202 | "warning": "Warning",
203 | "caution": "Caution",
204 | "debug": "Debug",
205 | "example": "Example",
206 | "success": "Success",
207 | "help": "Help",
208 | "idea": "Idea",
209 | "pending": "Pending",
210 | "security": "Security",
211 | "beta": "Beta",
212 | "best-practice": "Best Practice"
213 | }
214 | }
```
--------------------------------------------------------------------------------
/.chainlit/translations/he-IL.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "common": {
3 | "actions": {
4 | "cancel": "\u05d1\u05d9\u05d8\u05d5\u05dc",
5 | "confirm": "\u05d0\u05d9\u05e9\u05d5\u05e8",
6 | "continue": "\u05d4\u05de\u05e9\u05da",
7 | "goBack": "\u05d7\u05d6\u05d5\u05e8",
8 | "reset": "\u05d0\u05d9\u05e4\u05d5\u05e1",
9 | "submit": "\u05e9\u05dc\u05d7"
10 | },
11 | "status": {
12 | "loading": "\u05d8\u05d5\u05e2\u05df...",
13 | "error": {
14 | "default": "\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4",
15 | "serverConnection": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05dc\u05e9\u05e8\u05ea"
16 | }
17 | }
18 | },
19 | "auth": {
20 | "login": {
21 | "title": "\u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4",
22 | "form": {
23 | "email": {
24 | "label": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05d9\u05de\u05d9\u05d9\u05dc",
25 | "required": "\u05e9\u05d3\u05d4 \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4"
26 | },
27 | "password": {
28 | "label": "\u05e1\u05d9\u05e1\u05de\u05d4",
29 | "required": "\u05e9\u05d3\u05d4 \u05d4\u05e1\u05d9\u05e1\u05de\u05d4 \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4"
30 | },
31 | "actions": {
32 | "signin": "\u05d4\u05ea\u05d7\u05d1\u05e8"
33 | },
34 | "alternativeText": {
35 | "or": "\u05d0\u05d5"
36 | }
37 | },
38 | "errors": {
39 | "default": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8",
40 | "signin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
41 | "oauthSignin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
42 | "redirectUriMismatch": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05d4\u05e4\u05e0\u05d9\u05d4 \u05d0\u05d9\u05e0\u05d4 \u05ea\u05d5\u05d0\u05de\u05ea \u05d0\u05ea \u05ea\u05e6\u05d5\u05e8\u05ea \u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d9\u05ea OAuth",
43 | "oauthCallback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
44 | "oauthCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
45 | "emailCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
46 | "callback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
47 | "oauthAccountNotLinked": "\u05db\u05d3\u05d9 \u05dc\u05d0\u05de\u05ea \u05d0\u05ea \u05d6\u05d4\u05d5\u05ea\u05da, \u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d0\u05d5\u05ea\u05d5 \u05d7\u05e9\u05d1\u05d5\u05df \u05d1\u05d5 \u05d4\u05e9\u05ea\u05de\u05e9\u05ea \u05d1\u05de\u05e7\u05d5\u05e8",
48 | "emailSignin": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05d4\u05d9\u05d4 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc",
49 | "emailVerify": "\u05d0\u05e0\u05d0 \u05d0\u05de\u05ea \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05e9\u05dc\u05da, \u05e0\u05e9\u05dc\u05d7 \u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d7\u05d3\u05e9",
50 | "credentialsSignin": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4. \u05d1\u05d3\u05d5\u05e7 \u05e9\u05d4\u05e4\u05e8\u05d8\u05d9\u05dd \u05e9\u05d4\u05d6\u05e0\u05ea \u05e0\u05db\u05d5\u05e0\u05d9\u05dd",
51 | "sessionRequired": "\u05d0\u05e0\u05d0 \u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d3\u05e3 \u05d6\u05d4"
52 | }
53 | },
54 | "provider": {
55 | "continue": "\u05d4\u05de\u05e9\u05da \u05e2\u05dd {{provider}}"
56 | }
57 | },
58 | "chat": {
59 | "input": {
60 | "placeholder": "\u05d4\u05e7\u05dc\u05d3 \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d4 \u05e9\u05dc\u05da \u05db\u05d0\u05df...",
61 | "actions": {
62 | "send": "\u05e9\u05dc\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4",
63 | "stop": "\u05e2\u05e6\u05d5\u05e8 \u05de\u05e9\u05d9\u05de\u05d4",
64 | "attachFiles": "\u05e6\u05e8\u05e3 \u05e7\u05d1\u05e6\u05d9\u05dd"
65 | }
66 | },
67 | "speech": {
68 | "start": "\u05d4\u05ea\u05d7\u05dc \u05d4\u05e7\u05dc\u05d8\u05d4",
69 | "stop": "\u05e2\u05e6\u05d5\u05e8 \u05d4\u05e7\u05dc\u05d8\u05d4",
70 | "connecting": "\u05de\u05ea\u05d7\u05d1\u05e8"
71 | },
72 | "fileUpload": {
73 | "dragDrop": "\u05d2\u05e8\u05d5\u05e8 \u05d5\u05e9\u05d7\u05e8\u05e8 \u05e7\u05d1\u05e6\u05d9\u05dd \u05db\u05d0\u05df",
74 | "browse": "\u05e2\u05d9\u05d9\u05df \u05d1\u05e7\u05d1\u05e6\u05d9\u05dd",
75 | "sizeLimit": "\u05de\u05d2\u05d1\u05dc\u05d4:",
76 | "errors": {
77 | "failed": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4",
78 | "cancelled": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05d1\u05d5\u05d8\u05dc\u05d4 \u05e9\u05dc"
79 | }
80 | },
81 | "messages": {
82 | "status": {
83 | "using": "\u05de\u05e9\u05ea\u05de\u05e9 \u05d1",
84 | "used": "\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1"
85 | },
86 | "actions": {
87 | "copy": {
88 | "button": "\u05d4\u05e2\u05ea\u05e7 \u05dc\u05dc\u05d5\u05d7",
89 | "success": "\u05d4\u05d5\u05e2\u05ea\u05e7!"
90 | }
91 | },
92 | "feedback": {
93 | "positive": "\u05de\u05d5\u05e2\u05d9\u05dc",
94 | "negative": "\u05dc\u05d0 \u05de\u05d5\u05e2\u05d9\u05dc",
95 | "edit": "\u05e2\u05e8\u05d5\u05da \u05de\u05e9\u05d5\u05d1",
96 | "dialog": {
97 | "title": "\u05d4\u05d5\u05e1\u05e3 \u05ea\u05d2\u05d5\u05d1\u05d4",
98 | "submit": "\u05e9\u05dc\u05d7 \u05de\u05e9\u05d5\u05d1"
99 | },
100 | "status": {
101 | "updating": "\u05de\u05e2\u05d3\u05db\u05df",
102 | "updated": "\u05d4\u05de\u05e9\u05d5\u05d1 \u05e2\u05d5\u05d3\u05db\u05df"
103 | }
104 | }
105 | },
106 | "history": {
107 | "title": "\u05e7\u05dc\u05d8\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd",
108 | "empty": "\u05db\u05dc \u05db\u05da \u05e8\u05d9\u05e7...",
109 | "show": "\u05d4\u05e6\u05d2 \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4"
110 | },
111 | "settings": {
112 | "title": "\u05e4\u05d0\u05e0\u05dc \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea"
113 | },
114 | "watermark": "\u05e0\u05d1\u05e0\u05d4 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea"
115 | },
116 | "threadHistory": {
117 | "sidebar": {
118 | "title": "\u05e6'\u05d0\u05d8\u05d9\u05dd \u05e7\u05d5\u05d3\u05de\u05d9\u05dd",
119 | "filters": {
120 | "search": "\u05d7\u05d9\u05e4\u05d5\u05e9",
121 | "placeholder": "Search conversations..."
122 | },
123 | "timeframes": {
124 | "today": "\u05d4\u05d9\u05d5\u05dd",
125 | "yesterday": "\u05d0\u05ea\u05de\u05d5\u05dc",
126 | "previous7days": "7 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd",
127 | "previous30days": "30 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd"
128 | },
129 | "empty": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05e9\u05d9\u05d7\u05d5\u05ea",
130 | "actions": {
131 | "close": "\u05e1\u05d2\u05d5\u05e8 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3",
132 | "open": "\u05e4\u05ea\u05d7 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3"
133 | }
134 | },
135 | "thread": {
136 | "untitled": "\u05e9\u05d9\u05d7\u05d4 \u05dc\u05dc\u05d0 \u05db\u05d5\u05ea\u05e8\u05ea",
137 | "menu": {
138 | "rename": "Rename",
139 | "delete": "Delete"
140 | },
141 | "actions": {
142 | "delete": {
143 | "title": "\u05d0\u05e9\u05e8 \u05de\u05d7\u05d9\u05e7\u05d4",
144 | "description": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05de\u05d7\u05e7 \u05d0\u05ea \u05d4\u05e9\u05d9\u05d7\u05d4 \u05d5\u05db\u05df \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05d5\u05d4\u05d0\u05dc\u05de\u05e0\u05d8\u05d9\u05dd \u05e9\u05dc\u05d4. \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d1\u05d8\u05dc \u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5",
145 | "success": "\u05d4\u05e6'\u05d0\u05d8 \u05e0\u05de\u05d7\u05e7",
146 | "inProgress": "\u05de\u05d5\u05d7\u05e7 \u05e6'\u05d0\u05d8"
147 | },
148 | "rename": {
149 | "title": "\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4",
150 | "description": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9 \u05dc\u05e9\u05d9\u05d7\u05d4 \u05d6\u05d5",
151 | "form": {
152 | "name": {
153 | "label": "\u05e9\u05dd",
154 | "placeholder": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9"
155 | }
156 | },
157 | "success": "\u05e9\u05dd \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e9\u05d5\u05e0\u05d4!",
158 | "inProgress": "\u05de\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4"
159 | }
160 | }
161 | }
162 | },
163 | "navigation": {
164 | "header": {
165 | "chat": "\u05e6'\u05d0\u05d8",
166 | "readme": "\u05e7\u05e8\u05d0 \u05d0\u05d5\u05ea\u05d9",
167 | "theme": {
168 | "light": "Light Theme",
169 | "dark": "Dark Theme",
170 | "system": "Follow System"
171 | }
172 | },
173 | "newChat": {
174 | "button": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9",
175 | "dialog": {
176 | "title": "\u05e6\u05d5\u05e8 \u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9",
177 | "description": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05e0\u05e7\u05d4 \u05d0\u05ea \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d9\u05ea \u05d4\u05e6'\u05d0\u05d8 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea \u05e9\u05dc\u05da. \u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05de\u05e9\u05d9\u05da?",
178 | "tooltip": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9"
179 | }
180 | },
181 | "user": {
182 | "menu": {
183 | "settings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea",
184 | "settingsKey": "\u05d4",
185 | "apiKeys": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API",
186 | "logout": "\u05d4\u05ea\u05e0\u05ea\u05e7"
187 | }
188 | }
189 | },
190 | "apiKeys": {
191 | "title": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd",
192 | "description": "\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 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.",
193 | "success": {
194 | "saved": "\u05e0\u05e9\u05de\u05e8 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4"
195 | }
196 | },
197 | "alerts": {
198 | "info": "Info",
199 | "note": "Note",
200 | "tip": "Tip",
201 | "important": "Important",
202 | "warning": "Warning",
203 | "caution": "Caution",
204 | "debug": "Debug",
205 | "example": "Example",
206 | "success": "Success",
207 | "help": "Help",
208 | "idea": "Idea",
209 | "pending": "Pending",
210 | "security": "Security",
211 | "beta": "Beta",
212 | "best-practice": "Best Practice"
213 | }
214 | }
```
--------------------------------------------------------------------------------
/.chainlit/translations/gu.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "common": {
3 | "actions": {
4 | "cancel": "\u0ab0\u0aa6 \u0a95\u0ab0\u0acb",
5 | "confirm": "\u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb",
6 | "continue": "\u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb",
7 | "goBack": "\u0aaa\u0abe\u0a9b\u0abe \u0a9c\u0abe\u0a93",
8 | "reset": "\u0ab0\u0ac0\u0ab8\u0ac7\u0a9f \u0a95\u0ab0\u0acb",
9 | "submit": "\u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb"
10 | },
11 | "status": {
12 | "loading": "\u0ab2\u0acb\u0aa1 \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7...",
13 | "error": {
14 | "default": "\u0a8f\u0a95 \u0aad\u0ac2\u0ab2 \u0aa5\u0a88",
15 | "serverConnection": "\u0ab8\u0ab0\u0acd\u0ab5\u0ab0 \u0ab8\u0ac1\u0aa7\u0ac0 \u0aaa\u0ab9\u0acb\u0a82\u0a9a\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0"
16 | }
17 | }
18 | },
19 | "auth": {
20 | "login": {
21 | "title": "\u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0ab2\u0ac9\u0a97\u0abf\u0aa8 \u0a95\u0ab0\u0acb",
22 | "form": {
23 | "email": {
24 | "label": "\u0a88\u0aae\u0ac7\u0ab2 \u0a8f\u0aa1\u0acd\u0ab0\u0ac7\u0ab8",
25 | "required": "\u0a88\u0aae\u0ac7\u0ab2 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7"
26 | },
27 | "password": {
28 | "label": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1",
29 | "required": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7"
30 | },
31 | "actions": {
32 | "signin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb"
33 | },
34 | "alternativeText": {
35 | "or": "\u0a85\u0aa5\u0ab5\u0abe"
36 | }
37 | },
38 | "errors": {
39 | "default": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0",
40 | "signin": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
41 | "oauthSignin": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
42 | "redirectUriMismatch": "\u0ab0\u0ac0\u0aa1\u0abe\u0aaf\u0ab0\u0ac7\u0a95\u0acd\u0a9f URI oauth \u0a8d\u0aaa \u0a95\u0aa8\u0acd\u0aab\u0abf\u0a97\u0ab0\u0ac7\u0ab6\u0aa8 \u0ab8\u0abe\u0aa5\u0ac7 \u0aae\u0ac7\u0ab3 \u0a96\u0abe\u0aa4\u0acb \u0aa8\u0aa5\u0ac0",
43 | "oauthCallback": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
44 | "oauthCreateAccount": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
45 | "emailCreateAccount": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
46 | "callback": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
47 | "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, \u0aae\u0ac2\u0ab3 \u0ab0\u0ac2\u0aaa\u0ac7 \u0ab5\u0abe\u0aaa\u0ab0\u0ac7\u0ab2\u0abe \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb",
48 | "emailSignin": "\u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0acb \u0aa8\u0aa5\u0ac0",
49 | "emailVerify": "\u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0a88\u0aae\u0ac7\u0ab2 \u0a9a\u0a95\u0abe\u0ab8\u0acb, \u0aa8\u0ab5\u0acb \u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0a86\u0ab5\u0acd\u0aaf\u0acb \u0a9b\u0ac7",
50 | "credentialsSignin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3. \u0a86\u0aaa\u0ac7\u0ab2\u0ac0 \u0ab5\u0abf\u0a97\u0aa4\u0acb \u0ab8\u0abe\u0a9a\u0ac0 \u0a9b\u0ac7 \u0a95\u0ac7 \u0aa8\u0ab9\u0ac0\u0a82 \u0aa4\u0ac7 \u0a9a\u0a95\u0abe\u0ab8\u0acb",
51 | "sessionRequired": "\u0a86 \u0aaa\u0ac7\u0a9c\u0aa8\u0ac7 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb"
52 | }
53 | },
54 | "provider": {
55 | "continue": "{{provider}} \u0ab8\u0abe\u0aa5\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb"
56 | }
57 | },
58 | "chat": {
59 | "input": {
60 | "placeholder": "\u0a85\u0ab9\u0ac0\u0a82 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0ab2\u0a96\u0acb...",
61 | "actions": {
62 | "send": "\u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0aae\u0acb\u0a95\u0ab2\u0acb",
63 | "stop": "\u0a95\u0abe\u0ab0\u0acd\u0aaf \u0ab0\u0acb\u0a95\u0acb",
64 | "attachFiles": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a9c\u0acb\u0aa1\u0acb"
65 | }
66 | },
67 | "speech": {
68 | "start": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0ab6\u0ab0\u0ac2 \u0a95\u0ab0\u0acb",
69 | "stop": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb",
70 | "connecting": "\u0a95\u0aa8\u0ac7\u0a95\u0acd\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7"
71 | },
72 | "fileUpload": {
73 | "dragDrop": "\u0a85\u0ab9\u0ac0\u0a82 \u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a96\u0ac7\u0a82\u0a9a\u0acb \u0a85\u0aa8\u0ac7 \u0a9b\u0acb\u0aa1\u0acb",
74 | "browse": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0aac\u0acd\u0ab0\u0abe\u0a89\u0a9d \u0a95\u0ab0\u0acb",
75 | "sizeLimit": "\u0aae\u0ab0\u0acd\u0aaf\u0abe\u0aa6\u0abe:",
76 | "errors": {
77 | "failed": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0a95\u0ab0\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3",
78 | "cancelled": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0ab0\u0aa6 \u0a95\u0ab0\u0acd\u0aaf\u0ac1\u0a82"
79 | }
80 | },
81 | "messages": {
82 | "status": {
83 | "using": "\u0ab5\u0abe\u0aaa\u0ab0\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac7",
84 | "used": "\u0ab5\u0aaa\u0ab0\u0abe\u0aaf\u0ac7\u0ab2"
85 | },
86 | "actions": {
87 | "copy": {
88 | "button": "\u0a95\u0acd\u0ab2\u0abf\u0aaa\u0aac\u0acb\u0ab0\u0acd\u0aa1 \u0aaa\u0ab0 \u0a95\u0ac9\u0aaa\u0abf \u0a95\u0ab0\u0acb",
89 | "success": "\u0a95\u0ac9\u0aaa\u0abf \u0aa5\u0aaf\u0ac1\u0a82!"
90 | }
91 | },
92 | "feedback": {
93 | "positive": "\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0",
94 | "negative": "\u0aac\u0abf\u0aa8\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0",
95 | "edit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0a82\u0aaa\u0abe\u0aa6\u0abf\u0aa4 \u0a95\u0ab0\u0acb",
96 | "dialog": {
97 | "title": "\u0a9f\u0abf\u0aaa\u0acd\u0aaa\u0aa3\u0ac0 \u0a89\u0aae\u0ac7\u0ab0\u0acb",
98 | "submit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb"
99 | },
100 | "status": {
101 | "updating": "\u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7",
102 | "updated": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0aaf\u0acb"
103 | }
104 | }
105 | },
106 | "history": {
107 | "title": "\u0a9b\u0ac7\u0ab2\u0acd\u0ab2\u0abe \u0a87\u0aa8\u0aaa\u0ac1\u0a9f\u0acd\u0ab8",
108 | "empty": "\u0a96\u0abe\u0ab2\u0ac0 \u0a9b\u0ac7...",
109 | "show": "\u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0aac\u0aa4\u0abe\u0ab5\u0acb"
110 | },
111 | "settings": {
112 | "title": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8 \u0aaa\u0ac7\u0aa8\u0ab2"
113 | },
114 | "watermark": "\u0ab8\u0abe\u0aa5\u0ac7 \u0aac\u0aa8\u0abe\u0ab5\u0ac7\u0ab2"
115 | },
116 | "threadHistory": {
117 | "sidebar": {
118 | "title": "\u0aaa\u0abe\u0a9b\u0ab2\u0ac0 \u0a9a\u0ac7\u0a9f\u0acd\u0ab8",
119 | "filters": {
120 | "search": "\u0ab6\u0acb\u0aa7\u0acb",
121 | "placeholder": "Search conversations..."
122 | },
123 | "timeframes": {
124 | "today": "\u0a86\u0a9c\u0ac7",
125 | "yesterday": "\u0a97\u0a88\u0a95\u0abe\u0ab2\u0ac7",
126 | "previous7days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 7 \u0aa6\u0abf\u0ab5\u0ab8",
127 | "previous30days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 30 \u0aa6\u0abf\u0ab5\u0ab8"
128 | },
129 | "empty": "\u0a95\u0acb\u0a88 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0acd\u0ab8 \u0aae\u0ab3\u0acd\u0aaf\u0abe \u0aa8\u0aa5\u0ac0",
130 | "actions": {
131 | "close": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb",
132 | "open": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0a96\u0acb\u0ab2\u0acb"
133 | }
134 | },
135 | "thread": {
136 | "untitled": "\u0ab6\u0ac0\u0ab0\u0acd\u0ab7\u0a95 \u0ab5\u0a97\u0ab0\u0aa8\u0ac0 \u0ab5\u0abe\u0aa4\u0a9a\u0ac0\u0aa4",
137 | "menu": {
138 | "rename": "Rename",
139 | "delete": "Delete"
140 | },
141 | "actions": {
142 | "delete": {
143 | "title": "\u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab5\u0abe\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb",
144 | "description": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0a85\u0aa8\u0ac7 \u0aa4\u0ac7\u0aa8\u0abe \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0abe\u0a93 \u0a85\u0aa8\u0ac7 \u0aa4\u0aa4\u0acd\u0ab5\u0acb\u0aa8\u0ac7 \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab6\u0ac7. \u0a86 \u0a95\u0acd\u0ab0\u0abf\u0aaf\u0abe \u0aaa\u0abe\u0a9b\u0ac0 \u0aab\u0ac7\u0ab0\u0ab5\u0ac0 \u0ab6\u0a95\u0abe\u0ab6\u0ac7 \u0aa8\u0ab9\u0ac0\u0a82",
145 | "success": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0",
146 | "inProgress": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f"
147 | },
148 | "rename": {
149 | "title": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0acb",
150 | "description": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0aae\u0abe\u0a9f\u0ac7 \u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb",
151 | "form": {
152 | "name": {
153 | "label": "\u0aa8\u0abe\u0aae",
154 | "placeholder": "\u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb"
155 | }
156 | },
157 | "success": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0abe\u0aaf\u0ac1\u0a82!",
158 | "inProgress": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f"
159 | }
160 | }
161 | }
162 | },
163 | "navigation": {
164 | "header": {
165 | "chat": "\u0a9a\u0ac7\u0a9f",
166 | "readme": "\u0ab5\u0abe\u0a82\u0a9a\u0acb",
167 | "theme": {
168 | "light": "Light Theme",
169 | "dark": "Dark Theme",
170 | "system": "Follow System"
171 | }
172 | },
173 | "newChat": {
174 | "button": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f",
175 | "dialog": {
176 | "title": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f \u0aac\u0aa8\u0abe\u0ab5\u0acb",
177 | "description": "\u0a86 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab5\u0ab0\u0acd\u0aa4\u0aae\u0abe\u0aa8 \u0a9a\u0ac7\u0a9f \u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0ab8\u0abe\u0aab \u0a95\u0ab0\u0ab6\u0ac7. \u0ab6\u0ac1\u0a82 \u0aa4\u0aae\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0ab5\u0abe \u0aae\u0abe\u0a82\u0a97\u0acb \u0a9b\u0acb?",
178 | "tooltip": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f"
179 | }
180 | },
181 | "user": {
182 | "menu": {
183 | "settings": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8",
184 | "settingsKey": "S",
185 | "apiKeys": "API \u0a95\u0ac0",
186 | "logout": "\u0ab2\u0ac9\u0a97\u0a86\u0a89\u0a9f"
187 | }
188 | }
189 | },
190 | "apiKeys": {
191 | "title": "\u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 API \u0a95\u0ac0",
192 | "description": "\u0a86 \u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0ab5\u0abe\u0aaa\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aa8\u0ac0\u0a9a\u0ac7\u0aa8\u0ac0 API \u0a95\u0ac0 \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a9b\u0ac7. \u0a95\u0ac0 \u0aa4\u0aae\u0abe\u0ab0\u0abe \u0aa1\u0abf\u0ab5\u0abe\u0a87\u0ab8\u0aa8\u0abe \u0ab2\u0acb\u0a95\u0ab2 \u0ab8\u0acd\u0a9f\u0acb\u0ab0\u0ac7\u0a9c\u0aae\u0abe\u0a82 \u0ab8\u0a82\u0a97\u0acd\u0ab0\u0ab9\u0abf\u0aa4 \u0aa5\u0ab6\u0ac7.",
193 | "success": {
194 | "saved": "\u0ab8\u0aab\u0ab3\u0aa4\u0abe\u0aaa\u0ac2\u0ab0\u0acd\u0ab5\u0a95 \u0ab8\u0abe\u0a9a\u0ab5\u0acd\u0aaf\u0ac1\u0a82"
195 | }
196 | },
197 | "alerts": {
198 | "info": "Info",
199 | "note": "Note",
200 | "tip": "Tip",
201 | "important": "Important",
202 | "warning": "Warning",
203 | "caution": "Caution",
204 | "debug": "Debug",
205 | "example": "Example",
206 | "success": "Success",
207 | "help": "Help",
208 | "idea": "Idea",
209 | "pending": "Pending",
210 | "security": "Security",
211 | "beta": "Beta",
212 | "best-practice": "Best Practice"
213 | }
214 | }
```
--------------------------------------------------------------------------------
/.chainlit/translations/mr.json:
--------------------------------------------------------------------------------
```json
1 | {
2 | "common": {
3 | "actions": {
4 | "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u093e",
5 | "confirm": "\u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e",
6 | "continue": "\u092a\u0941\u0922\u0947 \u091c\u093e",
7 | "goBack": "\u092e\u093e\u0917\u0947 \u091c\u093e",
8 | "reset": "\u0930\u0940\u0938\u0947\u091f \u0915\u0930\u093e",
9 | "submit": "\u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e"
10 | },
11 | "status": {
12 | "loading": "\u0932\u094b\u0921 \u0915\u0930\u0924 \u0906\u0939\u0947...",
13 | "error": {
14 | "default": "\u090f\u0915 \u0924\u094d\u0930\u0941\u091f\u0940 \u0906\u0932\u0940",
15 | "serverConnection": "\u0938\u0930\u094d\u0935\u094d\u0939\u0930\u0936\u0940 \u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b\u090a \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940"
16 | }
17 | }
18 | },
19 | "auth": {
20 | "login": {
21 | "title": "\u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u093e",
22 | "form": {
23 | "email": {
24 | "label": "\u0908\u092e\u0947\u0932 \u092a\u0924\u094d\u0924\u093e",
25 | "required": "\u0908\u092e\u0947\u0932 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947"
26 | },
27 | "password": {
28 | "label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921",
29 | "required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947"
30 | },
31 | "actions": {
32 | "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e"
33 | },
34 | "alternativeText": {
35 | "or": "\u0915\u093f\u0902\u0935\u093e"
36 | }
37 | },
38 | "errors": {
39 | "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0942 \u0936\u0915\u0924 \u0928\u093e\u0939\u0940",
40 | "signin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
41 | "oauthSignin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
42 | "redirectUriMismatch": "\u0930\u0940\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f URI \u0913\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",
43 | "oauthCallback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
44 | "oauthCreateAccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
45 | "emailCreateAccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
46 | "callback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
47 | "oauthAccountNotLinked": "\u0924\u0941\u092e\u091a\u0940 \u0913\u0933\u0916 \u092a\u091f\u0935\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940, \u092e\u0942\u0933 \u0935\u093e\u092a\u0930\u0932\u0947\u0932\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947\u091a \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e",
48 | "emailSignin": "\u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0942 \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940",
49 | "emailVerify": "\u0915\u0943\u092a\u092f\u093e \u0924\u0941\u092e\u091a\u093e \u0908\u092e\u0947\u0932 \u0924\u092a\u093e\u0938\u093e, \u0928\u0935\u0940\u0928 \u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0932\u093e \u0917\u0947\u0932\u093e \u0906\u0939\u0947",
50 | "credentialsSignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0905\u092f\u0936\u0938\u094d\u0935\u0940. \u0924\u0941\u092e\u094d\u0939\u0940 \u0926\u093f\u0932\u0947\u0932\u0940 \u092e\u093e\u0939\u093f\u0924\u0940 \u092f\u094b\u0917\u094d\u092f \u0906\u0939\u0947 \u0915\u093e \u0924\u0947 \u0924\u092a\u093e\u0938\u093e",
51 | "sessionRequired": "\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 \u0915\u0943\u092a\u092f\u093e \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e"
52 | }
53 | },
54 | "provider": {
55 | "continue": "{{provider}} \u0938\u0939 \u092a\u0941\u0922\u0947 \u091c\u093e"
56 | }
57 | },
58 | "chat": {
59 | "input": {
60 | "placeholder": "\u0924\u0941\u092e\u091a\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0947\u0925\u0947 \u091f\u093e\u0907\u092a \u0915\u0930\u093e...",
61 | "actions": {
62 | "send": "\u0938\u0902\u0926\u0947\u0936 \u092a\u093e\u0920\u0935\u093e",
63 | "stop": "\u0915\u093e\u0930\u094d\u092f \u0925\u093e\u0902\u092c\u0935\u093e",
64 | "attachFiles": "\u092b\u093e\u0907\u0932\u094d\u0938 \u091c\u094b\u0921\u093e"
65 | }
66 | },
67 | "speech": {
68 | "start": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0938\u0941\u0930\u0942 \u0915\u0930\u093e",
69 | "stop": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0925\u093e\u0902\u092c\u0935\u093e",
70 | "connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0924 \u0906\u0939\u0947"
71 | },
72 | "fileUpload": {
73 | "dragDrop": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092f\u0947\u0925\u0947 \u0921\u094d\u0930\u0945\u0917 \u0906\u0923\u093f \u0921\u094d\u0930\u0949\u092a \u0915\u0930\u093e",
74 | "browse": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092c\u094d\u0930\u093e\u0909\u091d \u0915\u0930\u093e",
75 | "sizeLimit": "\u092e\u0930\u094d\u092f\u093e\u0926\u093e:",
76 | "errors": {
77 | "failed": "\u0905\u092a\u0932\u094b\u0921 \u0905\u092f\u0936\u0938\u094d\u0935\u0940",
78 | "cancelled": "\u092f\u093e\u0902\u091a\u0947 \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0947\u0932\u0947"
79 | }
80 | },
81 | "messages": {
82 | "status": {
83 | "using": "\u0935\u093e\u092a\u0930\u0924 \u0906\u0939\u0947",
84 | "used": "\u0935\u093e\u092a\u0930\u0932\u0947"
85 | },
86 | "actions": {
87 | "copy": {
88 | "button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921\u0935\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u093e",
89 | "success": "\u0915\u0949\u092a\u0940 \u0915\u0947\u0932\u0947!"
90 | }
91 | },
92 | "feedback": {
93 | "positive": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924",
94 | "negative": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924 \u0928\u093e\u0939\u0940",
95 | "edit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u093e",
96 | "dialog": {
97 | "title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093e",
98 | "submit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e"
99 | },
100 | "status": {
101 | "updating": "\u0905\u092a\u0921\u0947\u091f \u0915\u0930\u0924 \u0906\u0939\u0947",
102 | "updated": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0905\u092a\u0921\u0947\u091f \u0915\u0947\u0932\u0947"
103 | }
104 | }
105 | },
106 | "history": {
107 | "title": "\u0936\u0947\u0935\u091f\u091a\u0947 \u0907\u0928\u092a\u0941\u091f",
108 | "empty": "\u0930\u093f\u0915\u093e\u092e\u0947 \u0906\u0939\u0947...",
109 | "show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093e\u0916\u0935\u093e"
110 | },
111 | "settings": {
112 | "title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c \u092a\u0945\u0928\u0932"
113 | },
114 | "watermark": "\u0938\u0939 \u092c\u0928\u0935\u0932\u0947"
115 | },
116 | "threadHistory": {
117 | "sidebar": {
118 | "title": "\u092e\u093e\u0917\u0940\u0932 \u091a\u0945\u091f\u094d\u0938",
119 | "filters": {
120 | "search": "\u0936\u094b\u0927\u093e",
121 | "placeholder": "Search conversations..."
122 | },
123 | "timeframes": {
124 | "today": "\u0906\u091c",
125 | "yesterday": "\u0915\u093e\u0932",
126 | "previous7days": "\u092e\u093e\u0917\u0940\u0932 7 \u0926\u093f\u0935\u0938",
127 | "previous30days": "\u092e\u093e\u0917\u0940\u0932 30 \u0926\u093f\u0935\u0938"
128 | },
129 | "empty": "\u0915\u094b\u0923\u0924\u0947\u0939\u0940 \u0925\u094d\u0930\u0947\u0921 \u0938\u093e\u092a\u0921\u0932\u0947 \u0928\u093e\u0939\u0940\u0924",
130 | "actions": {
131 | "close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u093e",
132 | "open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0909\u0918\u0921\u093e"
133 | }
134 | },
135 | "thread": {
136 | "untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0935\u093f\u0930\u0939\u093f\u0924 \u0938\u0902\u092d\u093e\u0937\u0923",
137 | "menu": {
138 | "rename": "Rename",
139 | "delete": "Delete"
140 | },
141 | "actions": {
142 | "delete": {
143 | "title": "\u0939\u091f\u0935\u093f\u0923\u094d\u092f\u093e\u091a\u0940 \u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e",
144 | "description": "\u0939\u0947 \u0925\u094d\u0930\u0947\u0921 \u0906\u0923\u093f \u0924\u094d\u092f\u093e\u091a\u0947 \u0938\u0902\u0926\u0947\u0936 \u0935 \u0918\u091f\u0915 \u0939\u091f\u0935\u0947\u0932. \u0939\u0940 \u0915\u094d\u0930\u093f\u092f\u093e \u092a\u0942\u0930\u094d\u0935\u0935\u0924 \u0915\u0947\u0932\u0940 \u091c\u093e\u090a \u0936\u0915\u0924 \u0928\u093e\u0939\u0940",
145 | "success": "\u091a\u0945\u091f \u0939\u091f\u0935\u0932\u093e",
146 | "inProgress": "\u091a\u0945\u091f \u0939\u091f\u0935\u0924 \u0906\u0939\u0947"
147 | },
148 | "rename": {
149 | "title": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u093e",
150 | "description": "\u092f\u093e \u0925\u094d\u0930\u0947\u0921\u0938\u093e\u0920\u0940 \u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e",
151 | "form": {
152 | "name": {
153 | "label": "\u0928\u093e\u0935",
154 | "placeholder": "\u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e"
155 | }
156 | },
157 | "success": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0932\u0947!",
158 | "inProgress": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0924 \u0906\u0939\u0947"
159 | }
160 | }
161 | }
162 | },
163 | "navigation": {
164 | "header": {
165 | "chat": "\u091a\u0945\u091f",
166 | "readme": "\u0935\u093e\u091a\u093e",
167 | "theme": {
168 | "light": "Light Theme",
169 | "dark": "Dark Theme",
170 | "system": "Follow System"
171 | }
172 | },
173 | "newChat": {
174 | "button": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f",
175 | "dialog": {
176 | "title": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f \u0924\u092f\u093e\u0930 \u0915\u0930\u093e",
177 | "description": "\u0939\u0947 \u0924\u0941\u092e\u091a\u093e \u0938\u0927\u094d\u092f\u093e\u091a\u093e \u091a\u0945\u091f \u0907\u0924\u093f\u0939\u093e\u0938 \u0938\u093e\u092b \u0915\u0930\u0947\u0932. \u0924\u0941\u092e\u094d\u0939\u093e\u0932\u093e \u0916\u093e\u0924\u094d\u0930\u0940 \u0906\u0939\u0947 \u0915\u0940 \u0924\u0941\u092e\u094d\u0939\u0940 \u092a\u0941\u0922\u0947 \u091c\u093e\u090a \u0907\u091a\u094d\u091b\u093f\u0924\u093e?",
178 | "tooltip": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f"
179 | }
180 | },
181 | "user": {
182 | "menu": {
183 | "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c",
184 | "settingsKey": "S",
185 | "apiKeys": "API \u0915\u0940\u091c",
186 | "logout": "\u0932\u0949\u0917\u0906\u0909\u091f"
187 | }
188 | }
189 | },
190 | "apiKeys": {
191 | "title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0940\u091c",
192 | "description": "\u0939\u0947 \u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0916\u093e\u0932\u0940\u0932 API \u0915\u0940\u091c \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947\u0924. \u0915\u0940\u091c \u0924\u0941\u092e\u091a\u094d\u092f\u093e \u0921\u093f\u0935\u094d\u0939\u093e\u0907\u0938\u091a\u094d\u092f\u093e \u0932\u094b\u0915\u0932 \u0938\u094d\u091f\u094b\u0930\u0947\u091c\u092e\u0927\u094d\u092f\u0947 \u0938\u093e\u0920\u0935\u0932\u094d\u092f\u093e \u091c\u093e\u0924\u093e\u0924.",
193 | "success": {
194 | "saved": "\u092f\u0936\u0938\u094d\u0935\u0940\u0930\u093f\u0924\u094d\u092f\u093e \u091c\u0924\u0928 \u0915\u0947\u0932\u0947"
195 | }
196 | },
197 | "alerts": {
198 | "info": "Info",
199 | "note": "Note",
200 | "tip": "Tip",
201 | "important": "Important",
202 | "warning": "Warning",
203 | "caution": "Caution",
204 | "debug": "Debug",
205 | "example": "Example",
206 | "success": "Success",
207 | "help": "Help",
208 | "idea": "Idea",
209 | "pending": "Pending",
210 | "security": "Security",
211 | "beta": "Beta",
212 | "best-practice": "Best Practice"
213 | }
214 | }
```