AlaBoussoffara commited on
Commit
b22e8ba
·
1 Parent(s): 6e475f4

added infer docker & /config option & various bug fixes & new tests

Browse files
Files changed (47) hide show
  1. .chainlit/config.toml +152 -0
  2. .chainlit/translations/bn.json +245 -0
  3. .chainlit/translations/de-DE.json +245 -0
  4. .chainlit/translations/el-GR.json +245 -0
  5. .chainlit/translations/en-US.json +245 -0
  6. .chainlit/translations/es.json +245 -0
  7. .chainlit/translations/fr-FR.json +245 -0
  8. .chainlit/translations/gu.json +245 -0
  9. .chainlit/translations/he-IL.json +245 -0
  10. .chainlit/translations/hi.json +245 -0
  11. .chainlit/translations/ja.json +244 -0
  12. .chainlit/translations/kn.json +245 -0
  13. .chainlit/translations/ko.json +245 -0
  14. .chainlit/translations/ml.json +245 -0
  15. .chainlit/translations/mr.json +245 -0
  16. .chainlit/translations/nl.json +245 -0
  17. .chainlit/translations/ta.json +245 -0
  18. .chainlit/translations/te.json +245 -0
  19. .chainlit/translations/zh-CN.json +245 -0
  20. .chainlit/translations/zh-TW.json +245 -0
  21. .dockerignore +1 -1
  22. .gitignore +4 -4
  23. .pre-commit-config.yaml +25 -16
  24. CONTRIBUTING.md +32 -19
  25. Dockerfile.dev +2 -8
  26. Dockerfile.infer +22 -0
  27. Makefile +13 -5
  28. README.md +28 -2
  29. configs/generation/generation.yaml +2 -2
  30. configs/optim/Adamw.yaml +0 -1
  31. configs/train_mode.yaml +1 -1
  32. configs/trainer/default.yaml +2 -2
  33. data/README.md +23 -0
  34. docker-compose.yml +19 -0
  35. notebooks/load_data.ipynb +22 -44
  36. notebooks/tokenizer.ipynb +22 -44
  37. notebooks/train.ipynb +189 -47
  38. pyproject.toml +8 -0
  39. src/mini_transformer/apps/chainlit_app.py +141 -0
  40. src/mini_transformer/configs.py +0 -1
  41. src/mini_transformer/utils.py +21 -10
  42. tests/units/test_utils.py +686 -601
  43. tokenizer/bpe_16k.json +0 -0
  44. tokenizer/bpe_32k.json +0 -0
  45. tokenizer/bpe_4k.json +0 -0
  46. tokenizer/bpe_8k.json +0 -0
  47. trained_models/README.md +21 -0
.chainlit/config.toml ADDED
@@ -0,0 +1,152 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ # List of environment variables to be provided by each user to use the app.
3
+ user_env = []
4
+
5
+ # Duration (in seconds) during which the session is saved when the connection is lost
6
+ session_timeout = 3600
7
+
8
+ # Duration (in seconds) of the user session expiry
9
+ user_session_timeout = 1296000 # 15 days
10
+
11
+ # Enable third parties caching (e.g., LangChain cache)
12
+ cache = false
13
+
14
+ # Whether to persist user environment variables (API keys) to the database
15
+ # Set to true to store user env vars in DB, false to exclude them for security
16
+ persist_user_env = false
17
+
18
+ # Whether to mask user environment variables (API keys) in the UI with password type
19
+ # Set to true to show API keys as ***, false to show them as plain text
20
+ mask_user_env = false
21
+
22
+ # Authorized origins
23
+ allow_origins = ["*"]
24
+
25
+ [features]
26
+ # 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)
27
+ unsafe_allow_html = false
28
+
29
+ # Process and display mathematical expressions. This can clash with "$" characters in messages.
30
+ latex = false
31
+
32
+ # Autoscroll new user messages at the top of the window
33
+ user_message_autoscroll = true
34
+
35
+ # Automatically tag threads with the current chat profile (if a chat profile is used)
36
+ auto_tag_thread = true
37
+
38
+ # Allow users to edit their own messages
39
+ edit_message = true
40
+
41
+ # Allow users to share threads (backend + UI). Requires an app-defined on_shared_thread_view callback.
42
+ allow_thread_sharing = false
43
+
44
+ [features.slack]
45
+ # Add emoji reaction when message is received (requires reactions:write OAuth scope)
46
+ reaction_on_message_received = false
47
+
48
+ # Authorize users to spontaneously upload files with messages
49
+ [features.spontaneous_file_upload]
50
+ enabled = true
51
+ # Define accepted file types using MIME types
52
+ # Examples:
53
+ # 1. For specific file types:
54
+ # accept = ["image/jpeg", "image/png", "application/pdf"]
55
+ # 2. For all files of certain type:
56
+ # accept = ["image/*", "audio/*", "video/*"]
57
+ # 3. For specific file extensions:
58
+ # accept = { "application/octet-stream" = [".xyz", ".pdb"] }
59
+ # Note: Using "*/*" is not recommended as it may cause browser warnings
60
+ accept = ["*/*"]
61
+ max_files = 20
62
+ max_size_mb = 500
63
+
64
+ [features.audio]
65
+ # Enable audio features
66
+ enabled = false
67
+ # Sample rate of the audio
68
+ sample_rate = 24000
69
+
70
+ [features.mcp]
71
+ # Enable Model Context Protocol (MCP) features
72
+ enabled = false
73
+
74
+ [features.mcp.sse]
75
+ enabled = true
76
+
77
+ [features.mcp.streamable-http]
78
+ enabled = true
79
+
80
+ [features.mcp.stdio]
81
+ enabled = true
82
+ # Only the executables in the allow list can be used for MCP stdio server.
83
+ # Only need the base name of the executable, e.g. "npx", not "/usr/bin/npx".
84
+ # Please don't comment this line for now, we need it to parse the executable name.
85
+ allowed_executables = [ "npx", "uvx" ]
86
+
87
+ [UI]
88
+ # Name of the assistant.
89
+ name = "Assistant"
90
+
91
+ # default_theme = "dark"
92
+
93
+ # layout = "wide"
94
+
95
+ # default_sidebar_state = "open"
96
+
97
+ # Description of the assistant. This is used for HTML tags.
98
+ # description = ""
99
+
100
+ # Chain of Thought (CoT) display mode. Can be "hidden", "tool_call" or "full".
101
+ cot = "full"
102
+
103
+ # Specify a CSS file that can be used to customize the user interface.
104
+ # The CSS file can be served from the public directory or via an external link.
105
+ # custom_css = "/public/test.css"
106
+
107
+ # Specify additional attributes for a custom CSS file
108
+ # custom_css_attributes = "media=\"print\""
109
+
110
+ # Specify a JavaScript file that can be used to customize the user interface.
111
+ # The JavaScript file can be served from the public directory.
112
+ # custom_js = "/public/test.js"
113
+
114
+ # The style of alert boxes. Can be "classic" or "modern".
115
+ alert_style = "classic"
116
+
117
+ # Specify additional attributes for custom JS file
118
+ # custom_js_attributes = "async type = \"module\""
119
+
120
+ # Custom login page image, relative to public directory or external URL
121
+ # login_page_image = "/public/custom-background.jpg"
122
+
123
+ # Custom login page image filter (Tailwind internal filters, no dark/light variants)
124
+ # login_page_image_filter = "brightness-50 grayscale"
125
+ # login_page_image_dark_filter = "contrast-200 blur-sm"
126
+
127
+ # Specify a custom meta URL (used for meta tags like og:url)
128
+ # custom_meta_url = "https://github.com/Chainlit/chainlit"
129
+
130
+ # Specify a custom meta image url.
131
+ # custom_meta_image_url = "https://chainlit-cloud.s3.eu-west-3.amazonaws.com/logo/chainlit_banner.png"
132
+
133
+ # Load assistant logo directly from URL.
134
+ logo_file_url = ""
135
+
136
+ # Load assistant avatar image directly from URL.
137
+ default_avatar_file_url = ""
138
+
139
+ # Specify a custom build directory for the frontend.
140
+ # This can be used to customize the frontend code.
141
+ # Be careful: If this is a relative path, it should not start with a slash.
142
+ # custom_build = "./public/build"
143
+
144
+ # Specify optional one or more custom links in the header.
145
+ # [[UI.header_links]]
146
+ # name = "Issues"
147
+ # display_name = "Report Issue"
148
+ # icon_url = "https://avatars.githubusercontent.com/u/128686189?s=200&v=4"
149
+ # url = "https://github.com/Chainlit/chainlit/issues"
150
+
151
+ [meta]
152
+ generated_by = "2.8.2"
.chainlit/translations/bn.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8",
5
+ "confirm": "\u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8",
6
+ "continue": "\u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8",
7
+ "goBack": "\u09aa\u09bf\u099b\u09a8\u09c7 \u09af\u09be\u09a8",
8
+ "reset": "\u09b0\u09bf\u09b8\u09c7\u099f \u0995\u09b0\u09c1\u09a8",
9
+ "submit": "\u099c\u09ae\u09be \u09a6\u09bf\u09a8"
10
+ },
11
+ "status": {
12
+ "loading": "\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...",
13
+ "error": {
14
+ "default": "\u098f\u0995\u099f\u09bf \u09a4\u09cd\u09b0\u09c1\u099f\u09bf \u0998\u099f\u09c7\u099b\u09c7",
15
+ "serverConnection": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09b8\u0982\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09af\u09be\u099a\u09cd\u099b\u09c7 \u09a8\u09be"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\u0985\u09cd\u09af\u09be\u09aa\u09cd\u09b2\u09bf\u0995\u09c7\u09b6\u09a8 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09b2\u0997\u0987\u09a8 \u0995\u09b0\u09c1\u09a8",
22
+ "form": {
23
+ "email": {
24
+ "label": "\u0987\u09ae\u09c7\u0987\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be",
25
+ "required": "\u0987\u09ae\u09c7\u0987\u09b2 \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1",
30
+ "required": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0"
31
+ },
32
+ "actions": {
33
+ "signin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u0985\u09a5\u09ac\u09be"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be \u09b8\u09ae\u09cd\u09ad\u09ac \u09b9\u099a\u09cd\u099b\u09c7 \u09a8\u09be",
41
+ "signin": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
42
+ "oauthSignin": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
43
+ "redirectUriMismatch": "\u09b0\u09bf\u09a1\u09be\u0987\u09b0\u09c7\u0995\u09cd\u099f URI \u0993\u0986\u09a5 \u0985\u09cd\u09af\u09be\u09aa \u0995\u09a8\u09ab\u09bf\u0997\u09be\u09b0\u09c7\u09b6\u09a8\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09ae\u09bf\u09b2\u099b\u09c7 \u09a8\u09be",
44
+ "oauthCallback": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
45
+ "oauthCreateAccount": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
46
+ "emailCreateAccount": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
47
+ "callback": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
48
+ "oauthAccountNotLinked": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09b0\u09bf\u099a\u09af\u09bc \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09a4\u09c7, \u0986\u09aa\u09a8\u09bf \u09af\u09c7 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f\u099f\u09bf \u09ae\u09c2\u09b2\u09a4 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c7\u099b\u09bf\u09b2\u09c7\u09a8 \u09b8\u09c7\u099f\u09bf \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8",
49
+ "emailSignin": "\u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09be\u09a0\u09be\u09a8\u09cb \u09af\u09be\u09af\u09bc\u09a8\u09bf",
50
+ "emailVerify": "\u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u0987\u09ae\u09c7\u0987\u09b2 \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09c1\u09a8, \u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09be\u09a0\u09be\u09a8\u09cb \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
51
+ "credentialsSignin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964 \u0986\u09aa\u09a8\u09be\u09b0 \u09a6\u09c7\u0993\u09af\u09bc\u09be \u09a4\u09a5\u09cd\u09af \u09b8\u09a0\u09bf\u0995 \u0995\u09bf\u09a8\u09be \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09c1\u09a8",
52
+ "sessionRequired": "\u098f\u0987 \u09aa\u09c3\u09b7\u09cd\u09a0\u09be \u09a6\u09c7\u0996\u09a4\u09c7 \u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "{{provider}} \u09a6\u09bf\u09af\u09bc\u09c7 \u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09be\u09b0\u09cd\u09a4\u09be \u098f\u0996\u09be\u09a8\u09c7 \u099f\u09be\u0987\u09aa \u0995\u09b0\u09c1\u09a8...",
62
+ "actions": {
63
+ "send": "\u09ac\u09be\u09b0\u09cd\u09a4\u09be \u09aa\u09be\u09a0\u09be\u09a8",
64
+ "stop": "\u0995\u09be\u099c \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8",
65
+ "attachFiles": "\u09ab\u09be\u0987\u09b2 \u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4 \u0995\u09b0\u09c1\u09a8"
66
+ }
67
+ },
68
+ "speech": {
69
+ "start": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09c1\u09a8",
70
+ "stop": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8",
71
+ "connecting": "\u09b8\u0982\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7"
72
+ },
73
+ "commands": {
74
+ "button": "\u099f\u09c1\u09b2\u09b8",
75
+ "changeTool": "\u099f\u09c1\u09b2 \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09c1\u09a8",
76
+ "availableTools": "\u0989\u09aa\u09b2\u09ac\u09cd\u09a7 \u099f\u09c1\u09b2\u09b8"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "\u098f\u0996\u09be\u09a8\u09c7 \u09ab\u09be\u0987\u09b2 \u099f\u09c7\u09a8\u09c7 \u0986\u09a8\u09c1\u09a8",
80
+ "browse": "\u09ab\u09be\u0987\u09b2 \u09ac\u09cd\u09b0\u09be\u0989\u099c \u0995\u09b0\u09c1\u09a8",
81
+ "sizeLimit": "\u09b8\u09c0\u09ae\u09be:",
82
+ "errors": {
83
+ "failed": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
84
+ "cancelled": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8",
88
+ "removeAttachment": "\u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4\u09bf \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09c1\u09a8"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u099b\u09c7",
94
+ "used": "\u09ac\u09cd\u09af\u09ac\u09b9\u09c3\u09a4"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u0995\u09cd\u09b2\u09bf\u09aa\u09ac\u09cb\u09b0\u09cd\u09a1\u09c7 \u0995\u09aa\u09bf \u0995\u09b0\u09c1\u09a8",
99
+ "success": "\u0995\u09aa\u09bf \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u09b8\u09b9\u09be\u09af\u09bc\u0995",
104
+ "negative": "\u09b8\u09b9\u09be\u09af\u09bc\u0995 \u09a8\u09af\u09bc",
105
+ "edit": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8",
106
+ "dialog": {
107
+ "title": "\u09ae\u09a8\u09cd\u09a4\u09ac\u09cd\u09af \u09af\u09cb\u0997 \u0995\u09b0\u09c1\u09a8",
108
+ "submit": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u099c\u09ae\u09be \u09a6\u09bf\u09a8",
109
+ "yourFeedback": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be..."
110
+ },
111
+ "status": {
112
+ "updating": "\u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7",
113
+ "updated": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u09b8\u09b0\u09cd\u09ac\u09b6\u09c7\u09b7 \u0987\u09a8\u09aa\u09c1\u099f",
119
+ "empty": "\u0995\u09cb\u09a8\u09cb \u09a4\u09a5\u09cd\u09af \u09a8\u09c7\u0987...",
120
+ "show": "\u0987\u09a4\u09bf\u09b9\u09be\u09b8 \u09a6\u09c7\u0996\u09c1\u09a8"
121
+ },
122
+ "settings": {
123
+ "title": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8 \u09aa\u09cd\u09af\u09be\u09a8\u09c7\u09b2",
124
+ "customize": "\u098f\u0996\u09be\u09a8\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u099a\u09cd\u09af\u09be\u099f \u09b8\u09c7\u099f\u09bf\u0982\u09b8 \u0995\u09be\u09b8\u09cd\u099f\u09ae\u09be\u0987\u099c \u0995\u09b0\u09c1\u09a8"
125
+ },
126
+ "watermark": "\u098f\u09b2\u098f\u09b2\u098f\u09ae \u09ad\u09c1\u09b2 \u0995\u09b0\u09a4\u09c7 \u09aa\u09be\u09b0\u09c7\u0964 \u0997\u09c1\u09b0\u09c1\u09a4\u09cd\u09ac\u09aa\u09c2\u09b0\u09cd\u09a3 \u09a4\u09a5\u09cd\u09af \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09be\u09b0 \u0995\u09a5\u09be \u09ac\u09bf\u09ac\u09c7\u099a\u09a8\u09be \u0995\u09b0\u09c1\u09a8\u0964"
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0 \u099a\u09cd\u09af\u09be\u099f",
131
+ "filters": {
132
+ "search": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u0986\u099c",
137
+ "yesterday": "\u0997\u09a4\u0995\u09be\u09b2",
138
+ "previous7days": "\u0997\u09a4 \u09ed \u09a6\u09bf\u09a8",
139
+ "previous30days": "\u0997\u09a4 \u09e9\u09e6 \u09a6\u09bf\u09a8"
140
+ },
141
+ "empty": "\u0995\u09cb\u09a8\u09cb \u09a5\u09cd\u09b0\u09c7\u09a1 \u09aa\u09be\u0993\u09af\u09bc\u09be \u09af\u09be\u09af\u09bc\u09a8\u09bf",
142
+ "actions": {
143
+ "close": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8",
144
+ "open": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u0996\u09c1\u09b2\u09c1\u09a8"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae\u09b9\u09c0\u09a8 \u0986\u09b2\u09cb\u099a\u09a8\u09be",
149
+ "menu": {
150
+ "rename": "\u09aa\u09c1\u09a8\u0983\u09a8\u09be\u09ae\u0995\u09b0\u09a3",
151
+ "share": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0",
152
+ "delete": "Delete"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u099a\u09cd\u09af\u09be\u099f\u09c7\u09b0 \u09b2\u09bf\u0999\u09cd\u0995 \u09b6\u09c7\u09af\u09bc\u09be\u09b0 \u0995\u09b0\u09c1\u09a8",
157
+ "button": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0",
158
+ "status": {
159
+ "copied": "\u09b2\u09bf\u0999\u09cd\u0995 \u0995\u09aa\u09bf \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
160
+ "created": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0 \u09b2\u09bf\u0999\u09cd\u0995 \u09a4\u09c8\u09b0\u09bf \u09b9\u09af\u09bc\u09c7\u099b\u09c7!",
161
+ "unshared": "\u098f\u0987 \u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u099c\u09a8\u09cd\u09af \u09b6\u09c7\u09af\u09bc\u09be\u09b0\u09bf\u0982 \u0985\u0995\u09cd\u09b7\u09ae \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7"
162
+ },
163
+ "error": {
164
+ "create": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0 \u09b2\u09bf\u0999\u09cd\u0995 \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5",
165
+ "unshare": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09b6\u09c7\u09af\u09bc\u09be\u09b0\u09bf\u0982 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8",
170
+ "description": "\u098f\u099f\u09bf \u09a5\u09cd\u09b0\u09c7\u09a1 \u098f\u09ac\u0982 \u098f\u09b0 \u09ac\u09be\u09b0\u09cd\u09a4\u09be \u0993 \u0989\u09aa\u09be\u09a6\u09be\u09a8\u0997\u09c1\u09b2\u09bf \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09ac\u09c7\u0964 \u098f\u0987 \u0995\u09be\u099c\u099f\u09bf \u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09ac\u09b8\u09cd\u09a5\u09be\u09af\u09bc \u09ab\u09c7\u09b0\u09be\u09a8\u09cb \u09af\u09be\u09ac\u09c7 \u09a8\u09be",
171
+ "success": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
172
+ "inProgress": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09b9\u099a\u09cd\u099b\u09c7"
173
+ },
174
+ "rename": {
175
+ "title": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09c1\u09a8",
176
+ "description": "\u098f\u0987 \u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u099c\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u09a8\u09be\u09ae \u09a6\u09bf\u09a8",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u09a8\u09be\u09ae",
180
+ "placeholder": "\u09a8\u09a4\u09c1\u09a8 \u09a8\u09be\u09ae \u09b2\u09bf\u0996\u09c1\u09a8"
181
+ }
182
+ },
183
+ "success": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7!",
184
+ "inProgress": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u099a\u09cd\u09af\u09be\u099f",
192
+ "readme": "\u09b0\u09bf\u09a1\u09ae\u09bf",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f",
201
+ "dialog": {
202
+ "title": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09c1\u09a8",
203
+ "description": "\u098f\u099f\u09bf \u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u099a\u09cd\u09af\u09be\u099f \u0987\u09a4\u09bf\u09b9\u09be\u09b8 \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09ac\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u0995\u09bf \u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09c7\u09a4\u09c7 \u099a\u09be\u09a8?",
204
+ "tooltip": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8",
210
+ "settingsKey": "S",
211
+ "apiKeys": "\u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0",
212
+ "logout": "\u09b2\u0997\u0986\u0989\u099f"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc \u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0",
218
+ "description": "\u098f\u0987 \u0985\u09cd\u09af\u09be\u09aa\u09cd\u09b2\u09bf\u0995\u09c7\u09b6\u09a8 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09a8\u09bf\u09ae\u09cd\u09a8\u09b2\u09bf\u0996\u09bf\u09a4 \u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0 \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u0964 \u0995\u09c0\u0997\u09c1\u09b2\u09bf \u0986\u09aa\u09a8\u09be\u09b0 \u09a1\u09bf\u09ad\u09be\u0987\u09b8\u09c7\u09b0 \u09b2\u09cb\u0995\u09be\u09b2 \u09b8\u09cd\u099f\u09cb\u09b0\u09c7\u099c\u09c7 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09a5\u09be\u0995\u09c7\u0964",
219
+ "success": {
220
+ "saved": "\u09b8\u09ab\u09b2\u09ad\u09be\u09ac\u09c7 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09b9\u09af\u09bc\u09c7\u099b\u09c7"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u09ac\u09c7\u099b\u09c7 \u09a8\u09bf\u09a8..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/de-DE.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "Abbrechen",
5
+ "confirm": "Best\u00e4tigen",
6
+ "continue": "Fortfahren",
7
+ "goBack": "Zur\u00fcck",
8
+ "reset": "Zur\u00fccksetzen",
9
+ "submit": "Absenden"
10
+ },
11
+ "status": {
12
+ "loading": "L\u00e4dt...",
13
+ "error": {
14
+ "default": "Ein Fehler ist aufgetreten",
15
+ "serverConnection": "Server konnte nicht erreicht werden"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "Melde dich an, um auf die App zuzugreifen",
22
+ "form": {
23
+ "email": {
24
+ "label": "E-Mail Adresse",
25
+ "required": "E-Mail Adresse ist ein Pflichtfeld",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "Passwort",
30
+ "required": "Passwort ist ein Pflichtfeld"
31
+ },
32
+ "actions": {
33
+ "signin": "Anmelden"
34
+ },
35
+ "alternativeText": {
36
+ "or": "ODER"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "Anmeldung fehlgeschlagen",
41
+ "signin": "Versuche dich mit einem anderen Konto anzumelden",
42
+ "oauthSignin": "Versuche dich mit einem anderen Konto anzumelden",
43
+ "redirectUriMismatch": "Der Redirect-URI stimmt nicht mit der Konfiguration der Oauth-Anwendung \u00fcberein",
44
+ "oauthCallback": "Versuche dich mit einem anderen Konto anzumelden",
45
+ "oauthCreateAccount": "Versuche dich mit einem anderen Konto anzumelden",
46
+ "emailCreateAccount": "Versuche dich mit einem anderen Konto anzumelden",
47
+ "callback": "Versuche dich mit einem anderen Konto anzumelden",
48
+ "oauthAccountNotLinked": "Um die Identit\u00e4t zu best\u00e4tigen, melde dich mit demselben Konto an, das du urspr\u00fcnglich verwendet hast",
49
+ "emailSignin": "Die E-Mail konnte nicht gesendet werden",
50
+ "emailVerify": "Es wurde eine neue E-Mail versandt. Bitte \u00fcberpr\u00fcfe dein E-Mail Postfach",
51
+ "credentialsSignin": "Anmeldung fehlgeschlagen. \u00dcberpr\u00fcfe, ob die angegebenen Benutzerdaten korrekt sind",
52
+ "sessionRequired": "Bitte melde dich an, um auf diese Seite zuzugreifen"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "Fortfahren mit {{provider}}"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "Nachricht eingeben...",
62
+ "actions": {
63
+ "send": "Nachricht senden",
64
+ "stop": "Aufgabe stoppen",
65
+ "attachFiles": "Dateien anh\u00e4ngen"
66
+ }
67
+ },
68
+ "commands": {
69
+ "button": "Tools",
70
+ "changeTool": "Tool wechseln",
71
+ "availableTools": "Verf\u00fcgbare Tools"
72
+ },
73
+ "speech": {
74
+ "start": "Aufnahme starten",
75
+ "stop": "Aufnahme stoppen",
76
+ "connecting": "Verbinde"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "Ziehe deine Dateien hierher",
80
+ "browse": "Dateien durchsuchen",
81
+ "sizeLimit": "Limit:",
82
+ "errors": {
83
+ "failed": "Hochladen fehlgeschlagen",
84
+ "cancelled": "Abbruch des hochladens von"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "Upload abbrechen",
88
+ "removeAttachment": "Anhang entfernen"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "Verwendet",
94
+ "used": "Verwendete"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "In Zwischenablage kopieren",
99
+ "success": "Kopiert!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "Hilfreich",
104
+ "negative": "Nicht hilfreich",
105
+ "edit": "Feedback editieren",
106
+ "dialog": {
107
+ "title": "F\u00fcge einen Kommentar hinzu",
108
+ "submit": "Feedback absenden",
109
+ "yourFeedback": "Dein Feedback..."
110
+ },
111
+ "status": {
112
+ "updating": "Aktualisiert",
113
+ "updated": "Feedback aktualisiert"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "Vergangene Eingaben",
119
+ "empty": "Leer...",
120
+ "show": "Historie anzeigen"
121
+ },
122
+ "settings": {
123
+ "title": "Einstellungen",
124
+ "customize": "Passe die Chat Einstellungen hier an"
125
+ },
126
+ "watermark": "LLMs k\u00f6nnen Fehler machen. \u00dcberpr\u00fcfe bitte stets die Inhalte."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "Vergangene Chats",
131
+ "filters": {
132
+ "search": "Suche",
133
+ "placeholder": "Suche konversationen..."
134
+ },
135
+ "timeframes": {
136
+ "today": "Heute",
137
+ "yesterday": "Gestern",
138
+ "previous7days": "Vor 7 Tagen",
139
+ "previous30days": "Vor 30 Tagen"
140
+ },
141
+ "empty": "Kein Chat gefunden",
142
+ "actions": {
143
+ "close": "Seitenleiste schlie\u00dfen",
144
+ "open": "Seitenleiste \u00f6ffnen"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "Unbenannter Thread",
149
+ "menu": {
150
+ "rename": "Umbenennen",
151
+ "share": "Teilen",
152
+ "delete": "L\u00f6schen"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "Thread l\u00f6schen best\u00e4tigen",
157
+ "button": "Teilen",
158
+ "status": {
159
+ "copied": "Link kopiert",
160
+ "created": "Freigabelink erstellt!",
161
+ "unshared": "Teilen ist f\u00fcr diesen Thread deaktiviert"
162
+ },
163
+ "error": {
164
+ "create": "Fehler beim Erstellen des Freigabelinks",
165
+ "unshare": "Freigabe des Threads konnte nicht aufgehoben werden"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "L\u00f6schen best\u00e4tigen",
170
+ "description": "Dies wird den Thread sowie seine Nachrichten und Elemente l\u00f6schen. Dies kann nicht r\u00fcckg\u00e4ngig gemacht werden",
171
+ "success": "Chat gel\u00f6scht",
172
+ "inProgress": "Chat wird gel\u00f6scht"
173
+ },
174
+ "rename": {
175
+ "title": "Thread umbenennen",
176
+ "description": "Gebe einen neuen Namen f\u00fcr den Thread ein",
177
+ "form": {
178
+ "name": {
179
+ "label": "Name",
180
+ "placeholder": "Neuen Namen eingeben"
181
+ }
182
+ },
183
+ "success": "Thread umbenannt!",
184
+ "inProgress": "Thread wird umbenannt"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "Chat",
192
+ "readme": "Anleitung",
193
+ "theme": {
194
+ "light": "Helles Design",
195
+ "dark": "Dunkles Design",
196
+ "system": "System Design"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "Neuer Chat",
201
+ "dialog": {
202
+ "title": "M\u00f6chtest du einen neuen Chat erstellen?",
203
+ "description": "Es werden die aktuellen Nachrichten gel\u00f6scht und ein neuer Chat ge\u00f6ffnet.",
204
+ "tooltip": "Neuer Chat"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "Einstellungen",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API Schl\u00fcssel",
212
+ "logout": "Abmelden"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "Ben\u00f6tigte API Schl\u00fcssel",
218
+ "description": "Um diese App zu nutzen, werden die folgenden API Schl\u00fcssel ben\u00f6tigt. Die Schl\u00fcssel werden im lokalen Speicher Ihres Ger\u00e4ts gespeichert.",
219
+ "success": {
220
+ "saved": "Erfolgreich gespeichert"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Hinweis",
226
+ "tip": "Tipp",
227
+ "important": "Wichtig",
228
+ "warning": "Warnung",
229
+ "caution": "Vorsicht",
230
+ "debug": "Debug",
231
+ "example": "Beispiel",
232
+ "success": "Erfolg",
233
+ "help": "Hilfe",
234
+ "idea": "Idee",
235
+ "pending": "Ausstehend",
236
+ "security": "Sicherheit",
237
+ "beta": "Beta",
238
+ "best-practice": "Bew\u00e4hrte Praxis"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "W\u00e4hle aus..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/el-GR.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\u0386\u03ba\u03c5\u03c1\u03bf",
5
+ "confirm": "\u0395\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7",
6
+ "continue": "\u03a3\u03c5\u03bd\u03ad\u03c7\u03b5\u03b9\u03b1",
7
+ "goBack": "\u0395\u03c0\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae",
8
+ "reset": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac",
9
+ "submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae"
10
+ },
11
+ "status": {
12
+ "loading": "\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7...",
13
+ "error": {
14
+ "default": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1",
15
+ "serverConnection": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\u03a3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b1\u03c0\u03bf\u03ba\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03b7\u03bd \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae",
22
+ "form": {
23
+ "email": {
24
+ "label": "\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b7\u03bb\u03b5\u03ba\u03c4\u03c1\u03bf\u03bd\u03b9\u03ba\u03bf\u03cd \u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b5\u03af\u03bf\u03c5",
25
+ "required": "\u03a4\u03bf email \u03b5\u03af\u03bd\u03b1\u03b9 \u03c5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
30
+ "required": "\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf"
31
+ },
32
+ "actions": {
33
+ "signin": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u03ae"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7",
41
+ "signin": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
42
+ "oauthSignin": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
43
+ "redirectUriMismatch": "\u039f \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2 \u03b1\u03bd\u03b1\u03ba\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7\u03c2 \u03b4\u03b5\u03bd \u03c4\u03b1\u03b9\u03c1\u03b9\u03ac\u03b6\u03b5\u03b9 \u03bc\u03b5 \u03c4\u03b7 \u03c1\u03cd\u03b8\u03bc\u03b9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b1\u03c5\u03b8\u03b5\u03bd\u03c4\u03b9\u03ba\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae\u03c2",
44
+ "oauthCallback": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
45
+ "oauthCreateAccount": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
46
+ "emailCreateAccount": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
47
+ "callback": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
48
+ "oauthAccountNotLinked": "\u0393\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03ac \u03c3\u03b1\u03c2, \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03af\u03b4\u03b9\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03bf\u03c5 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b1\u03c4\u03b5 \u03b1\u03c1\u03c7\u03b9\u03ba\u03ac",
49
+ "emailSignin": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03c4\u03bf\u03c5 email",
50
+ "emailVerify": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03c0\u03b1\u03bb\u03b7\u03b8\u03b5\u03cd\u03c3\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b7\u03bb\u03b5\u03ba\u03c4\u03c1\u03bf\u03bd\u03b9\u03ba\u03bf\u03cd \u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b5\u03af\u03bf\u03c5 \u03c3\u03b1\u03c2, \u03ad\u03bd\u03b1 \u03bd\u03ad\u03bf email \u03c3\u03b1\u03c2 \u03ad\u03c7\u03b5\u03b9 \u03c3\u03c4\u03b1\u03bb\u03b5\u03af",
51
+ "credentialsSignin": "\u0397 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5. \u0395\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c0\u03bf\u03c5 \u03b4\u03ce\u03c3\u03b1\u03c4\u03b5 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03c9\u03c3\u03c4\u03ac",
52
+ "sessionRequired": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b1\u03c0\u03bf\u03ba\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "\u03a3\u03c5\u03bd\u03ad\u03c7\u03b5\u03b9\u03b1 \u03bc\u03b5 {{provider}}"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u03a0\u03bb\u03b7\u03ba\u03c4\u03c1\u03bf\u03bb\u03bf\u03b3\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf \u03bc\u03ae\u03bd\u03c5\u03bc\u03ac \u03c3\u03b1\u03c2 \u03b5\u03b4\u03ce...",
62
+ "actions": {
63
+ "send": "\u0391\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2",
64
+ "stop": "\u0394\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2",
65
+ "attachFiles": "\u0395\u03c0\u03b9\u03c3\u03cd\u03bd\u03b1\u03c8\u03b7 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd"
66
+ }
67
+ },
68
+ "commands": {
69
+ "button": "\u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03b1",
70
+ "changeTool": "\u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf\u03c5",
71
+ "availableTools": "\u0394\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03b1"
72
+ },
73
+ "speech": {
74
+ "start": "\u0388\u03bd\u03b1\u03c1\u03be\u03b7 \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2",
75
+ "stop": "\u0394\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2",
76
+ "connecting": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "\u03a3\u03cd\u03c1\u03b5\u03c4\u03b5 \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 \u03b5\u03b4\u03ce",
80
+ "browse": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd",
81
+ "sizeLimit": "\u038c\u03c1\u03b9\u03bf:",
82
+ "errors": {
83
+ "failed": "\u0397 \u03bc\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5",
84
+ "cancelled": "\u0391\u03ba\u03c5\u03c1\u03ce\u03b8\u03b7\u03ba\u03b5 \u03b7 \u03bc\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "\u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7 \u03bc\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7\u03c2",
88
+ "removeAttachment": "\u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b5\u03c0\u03b9\u03c3\u03cd\u03bd\u03b1\u03c8\u03b7\u03c2"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u039c\u03b5 \u03c4\u03b7 \u03c7\u03c1\u03ae\u03c3\u03b7",
94
+ "used": "\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03b8\u03b7\u03ba\u03b5"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03c4\u03bf \u03c0\u03c1\u03cc\u03c7\u03b5\u03b9\u03c1\u03bf",
99
+ "success": "\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c6\u03b7\u03ba\u03b5!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u03a7\u03c1\u03ae\u03c3\u03b9\u03bc\u03bf\u03c2",
104
+ "negative": "\u039c\u03b7 \u03c7\u03c1\u03ae\u03c3\u03b9\u03bc\u03bf\u03c2",
105
+ "edit": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c3\u03c7\u03bf\u03bb\u03af\u03c9\u03bd",
106
+ "dialog": {
107
+ "title": "\u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03c3\u03c7\u03bf\u03bb\u03af\u03bf\u03c5",
108
+ "submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae \u03c3\u03c7\u03bf\u03bb\u03af\u03c9\u03bd",
109
+ "yourFeedback": "\u0397 \u03b3\u03bd\u03ce\u03bc\u03b7 \u03c3\u03b1\u03c2"
110
+ },
111
+ "status": {
112
+ "updating": "\u0395\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9",
113
+ "updated": "\u03a4\u03b1 \u03c3\u03c7\u03cc\u03bb\u03b9\u03b1 \u03b5\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03b8\u03b7\u03ba\u03b1\u03bd"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u03a4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03b5\u03c2 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ad\u03c2",
119
+ "empty": "\u03a4\u03cc\u03c3\u03bf \u03ac\u03b4\u03b5\u03b9\u03bf...",
120
+ "show": "\u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03bf\u03cd"
121
+ },
122
+ "settings": {
123
+ "title": "\u03a0\u03af\u03bd\u03b1\u03ba\u03b1\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03c9\u03bd",
124
+ "customize": "\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae"
125
+ },
126
+ "watermark": "\u03a4\u03b1 \u039c\u0393\u039c \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03ac\u03bd\u03bf\u03c5\u03bd \u03bb\u03ac\u03b8\u03b7. \u0395\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c3\u03b7\u03bc\u03b1\u03bd\u03c4\u03b9\u03ba\u03ad\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u03a0\u03b1\u03bb\u03b1\u03b9\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b5\u03c2",
131
+ "filters": {
132
+ "search": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7",
133
+ "placeholder": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03b9\u03ce\u03bd..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1",
137
+ "yesterday": "\u03a7\u03b8\u03b5\u03c2",
138
+ "previous7days": "\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b5\u03c2 7 \u03b7\u03bc\u03ad\u03c1\u03b5\u03c2",
139
+ "previous30days": "\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b5\u03c2 30 \u03b7\u03bc\u03ad\u03c1\u03b5\u03c2"
140
+ },
141
+ "empty": "\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03bd\u03ae\u03bc\u03b1\u03c4\u03b1",
142
+ "actions": {
143
+ "close": "\u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03c0\u03bb\u03b1\u03ca\u03bd\u03ae\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2",
144
+ "open": "\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c0\u03bb\u03b1\u03ca\u03bd\u03ae\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1 \u03c7\u03c9\u03c1\u03af\u03c2 \u03c4\u03af\u03c4\u03bb\u03bf",
149
+ "menu": {
150
+ "rename": "\u039c\u03b5\u03c4\u03bf\u03bd\u03bf\u03bc\u03b1\u03c3\u03af\u03b1",
151
+ "share": "\u039a\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7",
152
+ "delete": "\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u039a\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2",
157
+ "button": "\u039a\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7",
158
+ "status": {
159
+ "copied": "\u039f \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2 \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c6\u03b7\u03ba\u03b5",
160
+ "created": "\u039f \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2 \u03ba\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03ae\u03b8\u03b7\u03ba\u03b5!",
161
+ "unshared": "\u0397 \u03ba\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03b8\u03b7\u03ba\u03b5 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bd\u03ae\u03bc\u03b1"
162
+ },
163
+ "error": {
164
+ "create": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1\u03c2 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5 \u03ba\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2",
165
+ "unshare": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03b4\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae\u03c2 \u03ba\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 \u03bd\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u0395\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2",
170
+ "description": "\u0391\u03c5\u03c4\u03cc \u03b8\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03b9 \u03c4\u03bf \u03bd\u03ae\u03bc\u03b1 \u03ba\u03b1\u03b8\u03ce\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03b1 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03b1 \u03ba\u03b1\u03b9 \u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c4\u03bf\u03c5. \u0391\u03c5\u03c4\u03ae \u03b7 \u03b5\u03bd\u03ad\u03c1\u03b3\u03b5\u03b9\u03b1 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b1\u03bd\u03b1\u03b9\u03c1\u03b5\u03b8\u03b5\u03af.",
171
+ "success": "\u0397 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c6\u03b7\u03ba\u03b5",
172
+ "inProgress": "\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2"
173
+ },
174
+ "rename": {
175
+ "title": "\u039c\u03b5\u03c4\u03bf\u03bd\u03bf\u03bc\u03b1\u03c3\u03af\u03b1 \u039d\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2",
176
+ "description": "\u0395\u03b9\u03c3\u03b1\u03b3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03bd\u03ad\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bd\u03ae\u03bc\u03b1",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u038c\u03bd\u03bf\u03bc\u03b1",
180
+ "placeholder": "\u0395\u03b9\u03c3\u03b1\u03b3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03bd\u03ad\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1"
181
+ }
182
+ },
183
+ "success": "\u03a4\u03bf \u03bd\u03ae\u03bc\u03b1 \u03bc\u03b5\u03c4\u03bf\u03bd\u03bf\u03bc\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5!",
184
+ "inProgress": "\u039c\u03b5\u03c4\u03bf\u03bd\u03bf\u03bc\u03b1\u03c3\u03af\u03b1 \u039d\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1",
192
+ "readme": "\u0394\u03b9\u03ac\u03b2\u03b1\u03c3\u03ad \u03bc\u03b5",
193
+ "theme": {
194
+ "light": "\u03a6\u03c9\u03c4\u03b5\u03b9\u03bd\u03cc \u0398\u03ad\u03bc\u03b1",
195
+ "dark": "\u03a3\u03ba\u03bf\u03c4\u03b5\u03b9\u03bd\u03cc \u03b8\u03ad\u03bc\u03b1",
196
+ "system": "\u0391\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf \u03c3\u03cd\u03c3\u03c4\u03b7\u03bc\u03b1"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u039d\u03ad\u03b1 \u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1",
201
+ "dialog": {
202
+ "title": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u039d\u03ad\u03b1\u03c2 \u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2",
203
+ "description": "\u0391\u03c5\u03c4\u03cc \u03b8\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03b9 \u03c4\u03bf \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03cc \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2 \u03c3\u03b1\u03c2. \u0395\u03af\u03c3\u03c4\u03b5 \u03b2\u03ad\u03b2\u03b1\u03b9\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5;",
204
+ "tooltip": "\u039d\u03ad\u03b1 \u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2",
210
+ "settingsKey": "S",
211
+ "apiKeys": "\u039a\u03bb\u03b5\u03b9\u03b4\u03b9\u03ac API",
212
+ "logout": "\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u0391\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bc\u03b5\u03bd\u03b1 \u03ba\u03bb\u03b5\u03b9\u03b4\u03b9\u03ac API",
218
+ "description": "\u0393\u03b9\u03b1 \u03bd\u03b1 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae, \u03b1\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 \u03c4\u03b1 \u03b1\u03ba\u03cc\u03bb\u03bf\u03c5\u03b8\u03b1 \u03ba\u03bb\u03b5\u03b9\u03b4\u03b9\u03ac API. \u03a4\u03b1 \u03ba\u03bb\u03b5\u03b9\u03b4\u03b9\u03ac \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b1 \u03c3\u03c4\u03bf\u03bd \u03c4\u03bf\u03c0\u03b9\u03ba\u03cc \u03c7\u03ce\u03c1\u03bf \u03b1\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae\u03c2 \u03c3\u03b1\u03c2.",
219
+ "success": {
220
+ "saved": "\u0391\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b5 \u03bc\u03b5 \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "\u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2",
225
+ "note": "\u03a3\u03b7\u03bc\u03b5\u03af\u03c9\u03c3\u03b7",
226
+ "tip": "\u03a3\u03c5\u03bc\u03b2\u03bf\u03c5\u03bb\u03ae",
227
+ "important": "\u03a3\u03b7\u03bc\u03b1\u03bd\u03c4\u03b9\u03ba\u03cc",
228
+ "warning": "\u03a0\u03c1\u03bf\u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7",
229
+ "caution": "\u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae",
230
+ "debug": "\u0395\u03bd\u03c4\u03bf\u03c0\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c3\u03c6\u03b1\u03bb\u03bc\u03ac\u03c4\u03c9\u03bd",
231
+ "example": "\u03a0\u03b1\u03c1\u03ac\u03b4\u03b5\u03b9\u03b3\u03bc\u03b1",
232
+ "success": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1",
233
+ "help": "\u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1",
234
+ "idea": "\u0399\u03b4\u03ad\u03b1",
235
+ "pending": "\u03a3\u03b5 \u03b5\u03ba\u03ba\u03c1\u03b5\u03bc\u03cc\u03c4\u03b7\u03c4\u03b1",
236
+ "security": "\u0391\u03c3\u03c6\u03ac\u03bb\u03b5\u03b9\u03b1",
237
+ "beta": "Beta",
238
+ "best-practice": "\u0392\u03ad\u03bb\u03c4\u03b9\u03c3\u03c4\u03b7 \u03a0\u03c1\u03b1\u03ba\u03c4\u03b9\u03ba\u03ae"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/en-US.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "Password",
30
+ "required": "password is a required field"
31
+ },
32
+ "actions": {
33
+ "signin": "Sign In"
34
+ },
35
+ "alternativeText": {
36
+ "or": "OR"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "Unable to sign in",
41
+ "signin": "Try signing in with a different account",
42
+ "oauthSignin": "Try signing in with a different account",
43
+ "redirectUriMismatch": "The redirect URI is not matching the oauth app configuration",
44
+ "oauthCallback": "Try signing in with a different account",
45
+ "oauthCreateAccount": "Try signing in with a different account",
46
+ "emailCreateAccount": "Try signing in with a different account",
47
+ "callback": "Try signing in with a different account",
48
+ "oauthAccountNotLinked": "To confirm your identity, sign in with the same account you used originally",
49
+ "emailSignin": "The e-mail could not be sent",
50
+ "emailVerify": "Please verify your email, a new email has been sent",
51
+ "credentialsSignin": "Sign in failed. Check the details you provided are correct",
52
+ "sessionRequired": "Please sign in to access this page"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "Continue with {{provider}}"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "Type your message here...",
62
+ "actions": {
63
+ "send": "Send message",
64
+ "stop": "Stop Task",
65
+ "attachFiles": "Attach files"
66
+ }
67
+ },
68
+ "commands": {
69
+ "button": "Tools",
70
+ "changeTool": "Change Tool",
71
+ "availableTools": "Available Tools"
72
+ },
73
+ "speech": {
74
+ "start": "Start recording",
75
+ "stop": "Stop recording",
76
+ "connecting": "Connecting"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "Drag and drop files here",
80
+ "browse": "Browse Files",
81
+ "sizeLimit": "Limit:",
82
+ "errors": {
83
+ "failed": "Failed to upload",
84
+ "cancelled": "Cancelled upload of"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "Cancel upload",
88
+ "removeAttachment": "Remove attachment"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "Using",
94
+ "used": "Used"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "Copy to clipboard",
99
+ "success": "Copied!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "Helpful",
104
+ "negative": "Not helpful",
105
+ "edit": "Edit feedback",
106
+ "dialog": {
107
+ "title": "Add a comment",
108
+ "submit": "Submit feedback",
109
+ "yourFeedback": "Your feedback..."
110
+ },
111
+ "status": {
112
+ "updating": "Updating",
113
+ "updated": "Feedback updated"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "Last Inputs",
119
+ "empty": "Such empty...",
120
+ "show": "Show history"
121
+ },
122
+ "settings": {
123
+ "title": "Settings panel",
124
+ "customize": "Customize your chat settings here"
125
+ },
126
+ "watermark": "LLMs can make mistakes. Check important info."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "Past Chats",
131
+ "filters": {
132
+ "search": "Search",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "Today",
137
+ "yesterday": "Yesterday",
138
+ "previous7days": "Previous 7 days",
139
+ "previous30days": "Previous 30 days"
140
+ },
141
+ "empty": "No threads found",
142
+ "actions": {
143
+ "close": "Close sidebar",
144
+ "open": "Open sidebar"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "Untitled Conversation",
149
+ "menu": {
150
+ "rename": "Rename",
151
+ "share": "Share",
152
+ "delete": "Delete"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "Share link to chat",
157
+ "button": "Share",
158
+ "status": {
159
+ "copied": "Link copied",
160
+ "created": "Share link created!",
161
+ "unshared": "Sharing disabled for this thread"
162
+ },
163
+ "error": {
164
+ "create": "Failed to create share link",
165
+ "unshare": "Failed to unshare thread"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "Confirm deletion",
170
+ "description": "This will delete the thread as well as its messages and elements. This action cannot be undone",
171
+ "success": "Chat deleted",
172
+ "inProgress": "Deleting chat"
173
+ },
174
+ "rename": {
175
+ "title": "Rename Thread",
176
+ "description": "Enter a new name for this thread",
177
+ "form": {
178
+ "name": {
179
+ "label": "Name",
180
+ "placeholder": "Enter new name"
181
+ }
182
+ },
183
+ "success": "Thread renamed!",
184
+ "inProgress": "Renaming thread"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "Chat",
192
+ "readme": "Readme",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "New Chat",
201
+ "dialog": {
202
+ "title": "Create New Chat",
203
+ "description": "This will clear your current chat history. Are you sure you want to continue?",
204
+ "tooltip": "New Chat"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "Settings",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API Keys",
212
+ "logout": "Logout"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "Required API Keys",
218
+ "description": "To use this app, the following API keys are required. The keys are stored on your device's local storage.",
219
+ "success": {
220
+ "saved": "Saved successfully"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "Select..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/es.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "Cancelar",
5
+ "confirm": "Confirmar",
6
+ "continue": "Continuar",
7
+ "goBack": "Volver",
8
+ "reset": "Restablecer",
9
+ "submit": "Enviar"
10
+ },
11
+ "status": {
12
+ "loading": "Cargando...",
13
+ "error": {
14
+ "default": "Ocurri\u00f3 un error",
15
+ "serverConnection": "No se pudo conectar con el servidor"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "Inicia sesi\u00f3n para acceder a la aplicaci\u00f3n",
22
+ "form": {
23
+ "email": {
24
+ "label": "Correo electr\u00f3nico",
25
+ "required": "el correo electr\u00f3nico es obligatorio",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "Contrase\u00f1a",
30
+ "required": "la contrase\u00f1a es obligatoria"
31
+ },
32
+ "actions": {
33
+ "signin": "Iniciar sesi\u00f3n"
34
+ },
35
+ "alternativeText": {
36
+ "or": "O"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "No se pudo iniciar sesi\u00f3n",
41
+ "signin": "Intenta iniciar sesi\u00f3n con otra cuenta",
42
+ "oauthSignin": "Intenta iniciar sesi\u00f3n con otra cuenta",
43
+ "redirectUriMismatch": "El URI de redirecci\u00f3n no coincide con la configuraci\u00f3n de la aplicaci\u00f3n OAuth",
44
+ "oauthCallback": "Intenta iniciar sesi\u00f3n con otra cuenta",
45
+ "oauthCreateAccount": "Intenta iniciar sesi\u00f3n con otra cuenta",
46
+ "emailCreateAccount": "Intenta iniciar sesi\u00f3n con otra cuenta",
47
+ "callback": "Intenta iniciar sesi\u00f3n con otra cuenta",
48
+ "oauthAccountNotLinked": "Para confirmar tu identidad, inicia sesi\u00f3n con la misma cuenta que usaste originalmente",
49
+ "emailSignin": "No se pudo enviar el correo electr\u00f3nico",
50
+ "emailVerify": "Por favor verifica tu correo, se ha enviado un nuevo correo",
51
+ "credentialsSignin": "Error al iniciar sesi\u00f3n. Verifica que los datos proporcionados sean correctos",
52
+ "sessionRequired": "Por favor inicia sesi\u00f3n para acceder a esta p\u00e1gina"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "Continuar con {{provider}}"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "Escribe tu mensaje aqu\u00ed...",
62
+ "actions": {
63
+ "send": "Enviar mensaje",
64
+ "stop": "Detener tarea",
65
+ "attachFiles": "Adjuntar archivos"
66
+ }
67
+ },
68
+ "commands": {
69
+ "button": "Herramientas",
70
+ "changeTool": "Cambiar herramienta",
71
+ "availableTools": "Herramientas disponibles"
72
+ },
73
+ "speech": {
74
+ "start": "Comenzar grabaci\u00f3n",
75
+ "stop": "Detener grabaci\u00f3n",
76
+ "connecting": "Conectando"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "Arrastra y suelta archivos aqu\u00ed",
80
+ "browse": "Buscar archivos",
81
+ "sizeLimit": "L\u00edmite:",
82
+ "errors": {
83
+ "failed": "Error al subir",
84
+ "cancelled": "Carga cancelada de"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "Cancelar subida",
88
+ "removeAttachment": "Eliminar adjunto"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "Usando",
94
+ "used": "Usado"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "Copiar al portapapeles",
99
+ "success": "\u00a1Copiado!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u00datil",
104
+ "negative": "No \u00fatil",
105
+ "edit": "Editar comentario",
106
+ "dialog": {
107
+ "title": "Agregar un comentario",
108
+ "submit": "Enviar comentario",
109
+ "yourFeedback": "Tu comentario..."
110
+ },
111
+ "status": {
112
+ "updating": "Actualizando",
113
+ "updated": "Comentario actualizado"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u00daltimas entradas",
119
+ "empty": "Tan vac\u00edo...",
120
+ "show": "Mostrar historial"
121
+ },
122
+ "settings": {
123
+ "title": "Panel de configuraci\u00f3n",
124
+ "customize": "Personaliza la configuraci\u00f3n de tu chat aqu\u00ed"
125
+ },
126
+ "watermark": "Los LLM pueden cometer errores. Verifica la informaci\u00f3n importante."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "Chats anteriores",
131
+ "filters": {
132
+ "search": "Buscar",
133
+ "placeholder": "Buscar conversaciones..."
134
+ },
135
+ "timeframes": {
136
+ "today": "Hoy",
137
+ "yesterday": "Ayer",
138
+ "previous7days": "\u00daltimos 7 d\u00edas",
139
+ "previous30days": "\u00daltimos 30 d\u00edas"
140
+ },
141
+ "empty": "No se encontraron conversaciones",
142
+ "actions": {
143
+ "close": "Cerrar barra lateral",
144
+ "open": "Abrir barra lateral"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "Conversaci\u00f3n sin t\u00edtulo",
149
+ "menu": {
150
+ "rename": "Renombrar",
151
+ "share": "Compartir",
152
+ "delete": "Eliminar"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "Compartir enlace del chat",
157
+ "button": "Compartir",
158
+ "status": {
159
+ "copied": "Enlace copiado",
160
+ "created": "\u00a1Enlace de uso compartido creado!",
161
+ "unshared": "Uso compartido deshabilitado para este hilo"
162
+ },
163
+ "error": {
164
+ "create": "Error al crear el enlace de uso compartido",
165
+ "unshare": "Error al dejar de compartir el hilo"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "Confirmar eliminaci\u00f3n",
170
+ "description": "Esto eliminar\u00e1 la conversaci\u00f3n, sus mensajes y elementos. Esta acci\u00f3n no se puede deshacer",
171
+ "success": "Chat eliminado",
172
+ "inProgress": "Eliminando chat"
173
+ },
174
+ "rename": {
175
+ "title": "Renombrar conversaci\u00f3n",
176
+ "description": "Ingresa un nuevo nombre para esta conversaci\u00f3n",
177
+ "form": {
178
+ "name": {
179
+ "label": "Nombre",
180
+ "placeholder": "Ingresa nuevo nombre"
181
+ }
182
+ },
183
+ "success": "\u00a1Conversaci\u00f3n renombrada!",
184
+ "inProgress": "Renombrando conversaci\u00f3n"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "Chat",
192
+ "readme": "L\u00e9eme",
193
+ "theme": {
194
+ "light": "Tema claro",
195
+ "dark": "Tema oscuro",
196
+ "system": "Seguir sistema"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "Nuevo chat",
201
+ "dialog": {
202
+ "title": "Crear nuevo chat",
203
+ "description": "Esto borrar\u00e1 tu historial de chat actual. \u00bfSeguro que quieres continuar?",
204
+ "tooltip": "Nuevo chat"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "Configuraci\u00f3n",
210
+ "settingsKey": "S",
211
+ "apiKeys": "Claves API",
212
+ "logout": "Cerrar sesi\u00f3n"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "Claves API requeridas",
218
+ "description": "Para usar esta aplicaci\u00f3n, se requieren las siguientes claves API. Las claves se almacenan en el almacenamiento local de tu dispositivo.",
219
+ "success": {
220
+ "saved": "Guardado exitosamente"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Informaci\u00f3n",
225
+ "note": "Nota",
226
+ "tip": "Consejo",
227
+ "important": "Importante",
228
+ "warning": "Advertencia",
229
+ "caution": "Precauci\u00f3n",
230
+ "debug": "Depuraci\u00f3n",
231
+ "example": "Ejemplo",
232
+ "success": "\u00c9xito",
233
+ "help": "Ayuda",
234
+ "idea": "Idea",
235
+ "pending": "Pendiente",
236
+ "security": "Seguridad",
237
+ "beta": "Beta",
238
+ "best-practice": "Mejor pr\u00e1ctica"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "Seleccionar..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/fr-FR.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "Annuler",
5
+ "confirm": "Confirmer",
6
+ "continue": "Continuer",
7
+ "goBack": "Retour",
8
+ "reset": "R\u00e9initialiser",
9
+ "submit": "Envoyer"
10
+ },
11
+ "status": {
12
+ "loading": "Chargement...",
13
+ "error": {
14
+ "default": "Une erreur est survenue",
15
+ "serverConnection": "Impossible de joindre le serveur"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "Connectez-vous pour acc\u00e9der \u00e0 l'application",
22
+ "form": {
23
+ "email": {
24
+ "label": "Adresse e-mail",
25
+ "required": "l'e-mail est un champ obligatoire",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "Mot de passe",
30
+ "required": "le mot de passe est un champ obligatoire"
31
+ },
32
+ "actions": {
33
+ "signin": "Se connecter"
34
+ },
35
+ "alternativeText": {
36
+ "or": "OU"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "Impossible de se connecter",
41
+ "signin": "Essayez de vous connecter avec un autre compte",
42
+ "oauthSignin": "Essayez de vous connecter avec un autre compte",
43
+ "redirectUriMismatch": "L'URI de redirection ne correspond pas \u00e0 la configuration de l'application oauth",
44
+ "oauthCallback": "Essayez de vous connecter avec un autre compte",
45
+ "oauthCreateAccount": "Essayez de vous connecter avec un autre compte",
46
+ "emailCreateAccount": "Essayez de vous connecter avec un autre compte",
47
+ "callback": "Essayez de vous connecter avec un autre compte",
48
+ "oauthAccountNotLinked": "Pour confirmer votre identit\u00e9, connectez-vous avec le m\u00eame compte que vous avez utilis\u00e9 \u00e0 l'origine",
49
+ "emailSignin": "L'e-mail n'a pas pu \u00eatre envoy\u00e9",
50
+ "emailVerify": "Veuillez v\u00e9rifier votre e-mail, un nouvel e-mail a \u00e9t\u00e9 envoy\u00e9",
51
+ "credentialsSignin": "La connexion a \u00e9chou\u00e9. V\u00e9rifiez que les informations que vous avez fournies sont correctes",
52
+ "sessionRequired": "Veuillez vous connecter pour acc\u00e9der \u00e0 cette page"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "Continuer avec {{provider}}"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "Tapez votre message ici...",
62
+ "actions": {
63
+ "send": "Envoyer le message",
64
+ "stop": "Arr\u00eater la t\u00e2che",
65
+ "attachFiles": "Joindre des fichiers"
66
+ }
67
+ },
68
+ "commands": {
69
+ "button": "Outils",
70
+ "changeTool": "Changer d'outil",
71
+ "availableTools": "Outils disponibles"
72
+ },
73
+ "speech": {
74
+ "start": "D\u00e9marrer l'enregistrement",
75
+ "stop": "Arr\u00eater l'enregistrement",
76
+ "connecting": "Connexion en cours"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "Glissez et d\u00e9posez des fichiers ici",
80
+ "browse": "Parcourir les fichiers",
81
+ "sizeLimit": "Limite :",
82
+ "errors": {
83
+ "failed": "\u00c9chec du t\u00e9l\u00e9versement",
84
+ "cancelled": "T\u00e9l\u00e9versement annul\u00e9 de"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "Annuler le t\u00e9l\u00e9versement",
88
+ "removeAttachment": "Supprimer la pi\u00e8ce jointe"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "Utilise",
94
+ "used": "Utilis\u00e9"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "Copier dans le presse-papiers",
99
+ "success": "Copi\u00e9 !"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "Utile",
104
+ "negative": "Pas utile",
105
+ "edit": "Modifier le commentaire",
106
+ "dialog": {
107
+ "title": "Ajouter un commentaire",
108
+ "submit": "Envoyer le commentaire",
109
+ "yourFeedback": "Votre avis..."
110
+ },
111
+ "status": {
112
+ "updating": "Mise \u00e0 jour",
113
+ "updated": "Commentaire mis \u00e0 jour"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "Derni\u00e8res entr\u00e9es",
119
+ "empty": "Tellement vide...",
120
+ "show": "Afficher l'historique"
121
+ },
122
+ "settings": {
123
+ "title": "Panneau des param\u00e8tres",
124
+ "customize": "Personnalisez vos param\u00e8tres de chat ici"
125
+ },
126
+ "watermark": "Construit avec"
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "Discussions pass\u00e9es",
131
+ "filters": {
132
+ "search": "Rechercher",
133
+ "placeholder": "Rechercher des conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "Aujourd'hui",
137
+ "yesterday": "Hier",
138
+ "previous7days": "Les 7 derniers jours",
139
+ "previous30days": "Les 30 derniers jours"
140
+ },
141
+ "empty": "Aucun fil de discussion trouv\u00e9",
142
+ "actions": {
143
+ "close": "Fermer la barre lat\u00e9rale",
144
+ "open": "Ouvrir la barre lat\u00e9rale"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "Conversation sans titre",
149
+ "menu": {
150
+ "rename": "Renommer",
151
+ "share": "Partager",
152
+ "delete": "Supprimer"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "Partager le lien de la discussion",
157
+ "button": "Partager",
158
+ "status": {
159
+ "copied": "Lien copi\u00e9",
160
+ "created": "Lien de partage cr\u00e9\u00e9 !",
161
+ "unshared": "Partage d\u00e9sactiv\u00e9 pour ce fil"
162
+ },
163
+ "error": {
164
+ "create": "\u00c9chec de la cr\u00e9ation du lien de partage",
165
+ "unshare": "\u00c9chec de la d\u00e9sactivation du partage du fil"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "Confirmer la suppression",
170
+ "description": "Cela supprimera le fil de discussion ainsi que ses messages et \u00e9l\u00e9ments. Cette action ne peut pas \u00eatre annul\u00e9e",
171
+ "success": "Discussion supprim\u00e9e",
172
+ "inProgress": "Suppression de la discussion"
173
+ },
174
+ "rename": {
175
+ "title": "Renommer le fil de discussion",
176
+ "description": "Entrez un nouveau nom pour ce fil de discussion",
177
+ "form": {
178
+ "name": {
179
+ "label": "Nom",
180
+ "placeholder": "Entrez le nouveau nom"
181
+ }
182
+ },
183
+ "success": "Fil de discussion renomm\u00e9 !",
184
+ "inProgress": "Renommage du fil de discussion"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "Discussion",
192
+ "readme": "Lisez-moi",
193
+ "theme": {
194
+ "light": "Th\u00e8me clair",
195
+ "dark": "Th\u00e8me sombre",
196
+ "system": "Suivre le syst\u00e8me"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "Nouvelle discussion",
201
+ "dialog": {
202
+ "title": "Cr\u00e9er une nouvelle discussion",
203
+ "description": "Cela effacera votre historique de discussion actuel. \u00cates-vous s\u00fbr de vouloir continuer ?",
204
+ "tooltip": "Nouvelle discussion"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "Param\u00e8tres",
210
+ "settingsKey": "S",
211
+ "apiKeys": "Cl\u00e9s API",
212
+ "logout": "Se d\u00e9connecter"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "Cl\u00e9s API requises",
218
+ "description": "Pour utiliser cette application, les cl\u00e9s API suivantes sont requises. Les cl\u00e9s sont stock\u00e9es dans le stockage local de votre appareil.",
219
+ "success": {
220
+ "saved": "Enregistr\u00e9 avec succ\u00e8s"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Astuce",
227
+ "important": "Important",
228
+ "warning": "Avertissement",
229
+ "caution": "Attention",
230
+ "debug": "D\u00e9bogage",
231
+ "example": "Exemple",
232
+ "success": "Succ\u00e8s",
233
+ "help": "Aide",
234
+ "idea": "Id\u00e9e",
235
+ "pending": "En attente",
236
+ "security": "S\u00e9curit\u00e9",
237
+ "beta": "B\u00eata",
238
+ "best-practice": "Meilleure pratique"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "S\u00e9lectionner..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/gu.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1",
30
+ "required": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7"
31
+ },
32
+ "actions": {
33
+ "signin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u0a85\u0aa5\u0ab5\u0abe"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0",
41
+ "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",
42
+ "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",
43
+ "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",
44
+ "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",
45
+ "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",
46
+ "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",
47
+ "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",
48
+ "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",
49
+ "emailSignin": "\u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0acb \u0aa8\u0aa5\u0ac0",
50
+ "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",
51
+ "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",
52
+ "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"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "{{provider}} \u0ab8\u0abe\u0aa5\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u0a85\u0ab9\u0ac0\u0a82 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0ab2\u0a96\u0acb...",
62
+ "actions": {
63
+ "send": "\u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0aae\u0acb\u0a95\u0ab2\u0acb",
64
+ "stop": "\u0a95\u0abe\u0ab0\u0acd\u0aaf \u0ab0\u0acb\u0a95\u0acb",
65
+ "attachFiles": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a9c\u0acb\u0aa1\u0acb"
66
+ }
67
+ },
68
+ "speech": {
69
+ "start": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0ab6\u0ab0\u0ac2 \u0a95\u0ab0\u0acb",
70
+ "stop": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb",
71
+ "connecting": "\u0a95\u0aa8\u0ac7\u0a95\u0acd\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7"
72
+ },
73
+ "commands": {
74
+ "button": "\u0a9f\u0ac2\u0ab2\u0acd\u0ab8",
75
+ "changeTool": "\u0a9f\u0ac2\u0ab2 \u0aac\u0aa6\u0ab2\u0acb",
76
+ "availableTools": "\u0a89\u0aaa\u0ab2\u0aac\u0acd\u0aa7 \u0a9f\u0ac2\u0ab2\u0acd\u0ab8"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "\u0a85\u0ab9\u0ac0\u0a82 \u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a96\u0ac7\u0a82\u0a9a\u0acb \u0a85\u0aa8\u0ac7 \u0a9b\u0acb\u0aa1\u0acb",
80
+ "browse": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0aac\u0acd\u0ab0\u0abe\u0a89\u0a9d \u0a95\u0ab0\u0acb",
81
+ "sizeLimit": "\u0aae\u0ab0\u0acd\u0aaf\u0abe\u0aa6\u0abe:",
82
+ "errors": {
83
+ "failed": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0a95\u0ab0\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3",
84
+ "cancelled": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0ab0\u0aa6 \u0a95\u0ab0\u0acd\u0aaf\u0ac1\u0a82"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0ab0\u0aa6 \u0a95\u0ab0\u0acb",
88
+ "removeAttachment": "\u0a9c\u0acb\u0aa1\u0abe\u0aa3 \u0aa6\u0ac2\u0ab0 \u0a95\u0ab0\u0acb"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u0ab5\u0abe\u0aaa\u0ab0\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac7",
94
+ "used": "\u0ab5\u0aaa\u0ab0\u0abe\u0aaf\u0ac7\u0ab2"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u0a95\u0acd\u0ab2\u0abf\u0aaa\u0aac\u0acb\u0ab0\u0acd\u0aa1 \u0aaa\u0ab0 \u0a95\u0ac9\u0aaa\u0abf \u0a95\u0ab0\u0acb",
99
+ "success": "\u0a95\u0ac9\u0aaa\u0abf \u0aa5\u0aaf\u0ac1\u0a82!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0",
104
+ "negative": "\u0aac\u0abf\u0aa8\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0",
105
+ "edit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0a82\u0aaa\u0abe\u0aa6\u0abf\u0aa4 \u0a95\u0ab0\u0acb",
106
+ "dialog": {
107
+ "title": "\u0a9f\u0abf\u0aaa\u0acd\u0aaa\u0aa3\u0ac0 \u0a89\u0aae\u0ac7\u0ab0\u0acb",
108
+ "submit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb",
109
+ "yourFeedback": "\u0aa4\u0aae\u0abe\u0ab0\u0acb \u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6..."
110
+ },
111
+ "status": {
112
+ "updating": "\u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7",
113
+ "updated": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0aaf\u0acb"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u0a9b\u0ac7\u0ab2\u0acd\u0ab2\u0abe \u0a87\u0aa8\u0aaa\u0ac1\u0a9f\u0acd\u0ab8",
119
+ "empty": "\u0a96\u0abe\u0ab2\u0ac0 \u0a9b\u0ac7...",
120
+ "show": "\u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0aac\u0aa4\u0abe\u0ab5\u0acb"
121
+ },
122
+ "settings": {
123
+ "title": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8 \u0aaa\u0ac7\u0aa8\u0ab2",
124
+ "customize": "\u0aa4\u0aae\u0abe\u0ab0\u0abe \u0a9a\u0ac7\u0a9f \u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8 \u0a85\u0ab9\u0ac0\u0a82 \u0a95\u0ab8\u0acd\u0a9f\u0aae\u0abe\u0a87\u0a9d \u0a95\u0ab0\u0acb"
125
+ },
126
+ "watermark": "LLM \u0aad\u0ac2\u0ab2\u0acb \u0a95\u0ab0\u0ac0 \u0ab6\u0a95\u0ac7 \u0a9b\u0ac7. \u0aae\u0ab9\u0aa4\u0acd\u0ab5\u0aaa\u0ac2\u0ab0\u0acd\u0aa3 \u0aae\u0abe\u0ab9\u0abf\u0aa4\u0ac0 \u0aa4\u0aaa\u0abe\u0ab8\u0ab5\u0abe\u0aa8\u0ac1\u0a82 \u0ab5\u0abf\u0a9a\u0abe\u0ab0\u0acb."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u0aaa\u0abe\u0a9b\u0ab2\u0ac0 \u0a9a\u0ac7\u0a9f\u0acd\u0ab8",
131
+ "filters": {
132
+ "search": "\u0ab6\u0acb\u0aa7\u0acb",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u0a86\u0a9c\u0ac7",
137
+ "yesterday": "\u0a97\u0a88\u0a95\u0abe\u0ab2\u0ac7",
138
+ "previous7days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 7 \u0aa6\u0abf\u0ab5\u0ab8",
139
+ "previous30days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 30 \u0aa6\u0abf\u0ab5\u0ab8"
140
+ },
141
+ "empty": "\u0a95\u0acb\u0a88 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0acd\u0ab8 \u0aae\u0ab3\u0acd\u0aaf\u0abe \u0aa8\u0aa5\u0ac0",
142
+ "actions": {
143
+ "close": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb",
144
+ "open": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0a96\u0acb\u0ab2\u0acb"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u0ab6\u0ac0\u0ab0\u0acd\u0ab7\u0a95 \u0ab5\u0a97\u0ab0\u0aa8\u0ac0 \u0ab5\u0abe\u0aa4\u0a9a\u0ac0\u0aa4",
149
+ "menu": {
150
+ "rename": "\u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0acb",
151
+ "share": "\u0ab6\u0ac7\u0ab0 \u0a95\u0ab0\u0acb",
152
+ "delete": "Delete"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u0a9a\u0ac7\u0a9f\u0aa8\u0ac0 \u0ab2\u0abf\u0a82\u0a95 \u0ab6\u0ac7\u0ab0 \u0a95\u0ab0\u0acb",
157
+ "button": "\u0ab6\u0ac7\u0ab0 \u0a95\u0ab0\u0acb",
158
+ "status": {
159
+ "copied": "\u0ab2\u0abf\u0a82\u0a95 \u0a95\u0ac9\u0aaa\u0abf \u0aa5\u0a88",
160
+ "created": "\u0ab6\u0ac7\u0ab0 \u0ab2\u0abf\u0a82\u0a95 \u0aac\u0aa8\u0abe\u0ab5\u0abe\u0a88!",
161
+ "unshared": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0aae\u0abe\u0a9f\u0ac7 \u0ab6\u0ac7\u0ab0\u0abf\u0a82\u0a97 \u0aa8\u0abf\u0ab7\u0acd\u0a95\u0acd\u0ab0\u0abf\u0aaf \u0a9b\u0ac7"
162
+ },
163
+ "error": {
164
+ "create": "\u0ab6\u0ac7\u0ab0 \u0ab2\u0abf\u0a82\u0a95 \u0aac\u0aa8\u0abe\u0ab5\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3",
165
+ "unshare": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0a85\u0aa8\u0ab6\u0ac7\u0ab0 \u0a95\u0ab0\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab5\u0abe\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb",
170
+ "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",
171
+ "success": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0",
172
+ "inProgress": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f"
173
+ },
174
+ "rename": {
175
+ "title": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0acb",
176
+ "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",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u0aa8\u0abe\u0aae",
180
+ "placeholder": "\u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb"
181
+ }
182
+ },
183
+ "success": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0abe\u0aaf\u0ac1\u0a82!",
184
+ "inProgress": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u0a9a\u0ac7\u0a9f",
192
+ "readme": "\u0ab5\u0abe\u0a82\u0a9a\u0acb",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f",
201
+ "dialog": {
202
+ "title": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f \u0aac\u0aa8\u0abe\u0ab5\u0acb",
203
+ "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?",
204
+ "tooltip": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API \u0a95\u0ac0",
212
+ "logout": "\u0ab2\u0ac9\u0a97\u0a86\u0a89\u0a9f"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 API \u0a95\u0ac0",
218
+ "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.",
219
+ "success": {
220
+ "saved": "\u0ab8\u0aab\u0ab3\u0aa4\u0abe\u0aaa\u0ac2\u0ab0\u0acd\u0ab5\u0a95 \u0ab8\u0abe\u0a9a\u0ab5\u0acd\u0aaf\u0ac1\u0a82"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u0aac\u0ac7\u0a82\u0a9a\u0ac0 \u0ab2\u0acb..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/he-IL.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u05e1\u05d9\u05e1\u05de\u05d4",
30
+ "required": "\u05e9\u05d3\u05d4 \u05d4\u05e1\u05d9\u05e1\u05de\u05d4 \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4"
31
+ },
32
+ "actions": {
33
+ "signin": "\u05d4\u05ea\u05d7\u05d1\u05e8"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u05d0\u05d5"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8",
41
+ "signin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
42
+ "oauthSignin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
43
+ "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",
44
+ "oauthCallback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
45
+ "oauthCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
46
+ "emailCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
47
+ "callback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
48
+ "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",
49
+ "emailSignin": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05d4\u05d9\u05d4 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc",
50
+ "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",
51
+ "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",
52
+ "sessionRequired": "\u05d0\u05e0\u05d0 \u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d3\u05e3 \u05d6\u05d4"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "\u05d4\u05de\u05e9\u05da \u05e2\u05dd {{provider}}"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u05d4\u05e7\u05dc\u05d3 \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d4 \u05e9\u05dc\u05da \u05db\u05d0\u05df...",
62
+ "actions": {
63
+ "send": "\u05e9\u05dc\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4",
64
+ "stop": "\u05e2\u05e6\u05d5\u05e8 \u05de\u05e9\u05d9\u05de\u05d4",
65
+ "attachFiles": "\u05e6\u05e8\u05e3 \u05e7\u05d1\u05e6\u05d9\u05dd"
66
+ }
67
+ },
68
+ "speech": {
69
+ "start": "\u05d4\u05ea\u05d7\u05dc \u05d4\u05e7\u05dc\u05d8\u05d4",
70
+ "stop": "\u05e2\u05e6\u05d5\u05e8 \u05d4\u05e7\u05dc\u05d8\u05d4",
71
+ "connecting": "\u05de\u05ea\u05d7\u05d1\u05e8"
72
+ },
73
+ "commands": {
74
+ "button": "\u05db\u05dc\u05d9\u05dd",
75
+ "changeTool": "\u05e9\u05e0\u05d4 \u05db\u05dc\u05d9",
76
+ "availableTools": "\u05db\u05dc\u05d9\u05dd \u05d6\u05de\u05d9\u05e0\u05d9\u05dd"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "\u05d2\u05e8\u05d5\u05e8 \u05d5\u05e9\u05d7\u05e8\u05e8 \u05e7\u05d1\u05e6\u05d9\u05dd \u05db\u05d0\u05df",
80
+ "browse": "\u05e2\u05d9\u05d9\u05df \u05d1\u05e7\u05d1\u05e6\u05d9\u05dd",
81
+ "sizeLimit": "\u05de\u05d2\u05d1\u05dc\u05d4:",
82
+ "errors": {
83
+ "failed": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4",
84
+ "cancelled": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05d1\u05d5\u05d8\u05dc\u05d4 \u05e9\u05dc"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "\u05d1\u05d9\u05d8\u05d5\u05dc \u05d4\u05e2\u05dc\u05d0\u05d4",
88
+ "removeAttachment": "\u05d4\u05e1\u05e8\u05ea \u05e7\u05d5\u05d1\u05e5 \u05de\u05e6\u05d5\u05e8\u05e3"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u05de\u05e9\u05ea\u05de\u05e9 \u05d1",
94
+ "used": "\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u05d4\u05e2\u05ea\u05e7 \u05dc\u05dc\u05d5\u05d7",
99
+ "success": "\u05d4\u05d5\u05e2\u05ea\u05e7!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u05de\u05d5\u05e2\u05d9\u05dc",
104
+ "negative": "\u05dc\u05d0 \u05de\u05d5\u05e2\u05d9\u05dc",
105
+ "edit": "\u05e2\u05e8\u05d5\u05da \u05de\u05e9\u05d5\u05d1",
106
+ "dialog": {
107
+ "title": "\u05d4\u05d5\u05e1\u05e3 \u05ea\u05d2\u05d5\u05d1\u05d4",
108
+ "submit": "\u05e9\u05dc\u05d7 \u05de\u05e9\u05d5\u05d1",
109
+ "yourFeedback": "\u05d4\u05de\u05e9\u05d5\u05d1 \u05e9\u05dc\u05da..."
110
+ },
111
+ "status": {
112
+ "updating": "\u05de\u05e2\u05d3\u05db\u05df",
113
+ "updated": "\u05d4\u05de\u05e9\u05d5\u05d1 \u05e2\u05d5\u05d3\u05db\u05df"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u05e7\u05dc\u05d8\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd",
119
+ "empty": "\u05db\u05dc \u05db\u05da \u05e8\u05d9\u05e7...",
120
+ "show": "\u05d4\u05e6\u05d2 \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4"
121
+ },
122
+ "settings": {
123
+ "title": "\u05e4\u05d0\u05e0\u05dc \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea",
124
+ "customize": "\u05d4\u05ea\u05d0\u05dd \u05d0\u05d9\u05e9\u05d9\u05ea \u05d0\u05ea \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d4\u05e6'\u05d0\u05d8 \u05e9\u05dc\u05da \u05db\u05d0\u05df"
125
+ },
126
+ "watermark": "\u05de\u05d5\u05d3\u05dc\u05d9 \u05e9\u05e4\u05d4 \u05d2\u05d3\u05d5\u05dc\u05d9\u05dd \u05e2\u05dc\u05d5\u05dc\u05d9\u05dd \u05dc\u05e2\u05e9\u05d5\u05ea \u05d8\u05e2\u05d5\u05d9\u05d5\u05ea. \u05db\u05d3\u05d0\u05d9 \u05dc\u05d1\u05d3\u05d5\u05e7 \u05de\u05d9\u05d3\u05e2 \u05d7\u05e9\u05d5\u05d1."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u05e6'\u05d0\u05d8\u05d9\u05dd \u05e7\u05d5\u05d3\u05de\u05d9\u05dd",
131
+ "filters": {
132
+ "search": "\u05d7\u05d9\u05e4\u05d5\u05e9",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u05d4\u05d9\u05d5\u05dd",
137
+ "yesterday": "\u05d0\u05ea\u05de\u05d5\u05dc",
138
+ "previous7days": "7 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd",
139
+ "previous30days": "30 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd"
140
+ },
141
+ "empty": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05e9\u05d9\u05d7\u05d5\u05ea",
142
+ "actions": {
143
+ "close": "\u05e1\u05d2\u05d5\u05e8 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3",
144
+ "open": "\u05e4\u05ea\u05d7 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u05e9\u05d9\u05d7\u05d4 \u05dc\u05dc\u05d0 \u05db\u05d5\u05ea\u05e8\u05ea",
149
+ "menu": {
150
+ "rename": "\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e9\u05dd",
151
+ "share": "\u05e9\u05d9\u05ea\u05d5\u05e3",
152
+ "delete": "Delete"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e7\u05d9\u05e9\u05d5\u05e8 \u05dc\u05e9\u05d9\u05d7\u05d4",
157
+ "button": "\u05e9\u05d9\u05ea\u05d5\u05e3",
158
+ "status": {
159
+ "copied": "\u05d4\u05e7\u05d9\u05e9\u05d5\u05e8 \u05d4\u05d5\u05e2\u05ea\u05e7",
160
+ "created": "\u05e7\u05d9\u05e9\u05d5\u05e8 \u05d4\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e0\u05d5\u05e6\u05e8!",
161
+ "unshared": "\u05d4\u05e9\u05d9\u05ea\u05d5\u05e3 \u05d1\u05d5\u05d8\u05dc \u05e2\u05d1\u05d5\u05e8 \u05e9\u05d9\u05d7\u05d4 \u05d6\u05d5"
162
+ },
163
+ "error": {
164
+ "create": "\u05d9\u05e6\u05d9\u05e8\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8 \u05d4\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e0\u05db\u05e9\u05dc\u05d4",
165
+ "unshare": "\u05d1\u05d9\u05d8\u05d5\u05dc \u05d4\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e9\u05dc \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e0\u05db\u05e9\u05dc"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u05d0\u05e9\u05e8 \u05de\u05d7\u05d9\u05e7\u05d4",
170
+ "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",
171
+ "success": "\u05d4\u05e6'\u05d0\u05d8 \u05e0\u05de\u05d7\u05e7",
172
+ "inProgress": "\u05de\u05d5\u05d7\u05e7 \u05e6'\u05d0\u05d8"
173
+ },
174
+ "rename": {
175
+ "title": "\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4",
176
+ "description": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9 \u05dc\u05e9\u05d9\u05d7\u05d4 \u05d6\u05d5",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u05e9\u05dd",
180
+ "placeholder": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9"
181
+ }
182
+ },
183
+ "success": "\u05e9\u05dd \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e9\u05d5\u05e0\u05d4!",
184
+ "inProgress": "\u05de\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u05e6'\u05d0\u05d8",
192
+ "readme": "\u05e7\u05e8\u05d0 \u05d0\u05d5\u05ea\u05d9",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9",
201
+ "dialog": {
202
+ "title": "\u05e6\u05d5\u05e8 \u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9",
203
+ "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?",
204
+ "tooltip": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea",
210
+ "settingsKey": "\u05d4",
211
+ "apiKeys": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API",
212
+ "logout": "\u05d4\u05ea\u05e0\u05ea\u05e7"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd",
218
+ "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.",
219
+ "success": {
220
+ "saved": "\u05e0\u05e9\u05de\u05e8 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u05d1\u05d7\u05e8..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/hi.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u0947\u0902",
5
+ "confirm": "\u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902",
6
+ "continue": "\u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902",
7
+ "goBack": "\u0935\u093e\u092a\u0938 \u091c\u093e\u090f\u0902",
8
+ "reset": "\u0930\u0940\u0938\u0947\u091f \u0915\u0930\u0947\u0902",
9
+ "submit": "\u091c\u092e\u093e \u0915\u0930\u0947\u0902"
10
+ },
11
+ "status": {
12
+ "loading": "\u0932\u094b\u0921 \u0939\u094b \u0930\u0939\u093e \u0939\u0948...",
13
+ "error": {
14
+ "default": "\u090f\u0915 \u0924\u094d\u0930\u0941\u091f\u093f \u0939\u0941\u0908",
15
+ "serverConnection": "\u0938\u0930\u094d\u0935\u0930 \u0938\u0947 \u0938\u0902\u092a\u0930\u094d\u0915 \u0928\u0939\u0940\u0902 \u0939\u094b \u092a\u093e \u0930\u0939\u093e"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\u0910\u092a \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u0947\u0902",
22
+ "form": {
23
+ "email": {
24
+ "label": "\u0908\u092e\u0947\u0932 \u092a\u0924\u093e",
25
+ "required": "\u0908\u092e\u0947\u0932 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921",
30
+ "required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948"
31
+ },
32
+ "actions": {
33
+ "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u092f\u093e"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0905\u0938\u092e\u0930\u094d\u0925",
41
+ "signin": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
42
+ "oauthSignin": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
43
+ "redirectUriMismatch": "\u0930\u0940\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f URI oauth \u0910\u092a \u0915\u0949\u0928\u094d\u092b\u093c\u093f\u0917\u0930\u0947\u0936\u0928 \u0938\u0947 \u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093e \u0930\u0939\u093e",
44
+ "oauthCallback": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
45
+ "oauthCreateAccount": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
46
+ "emailCreateAccount": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
47
+ "callback": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
48
+ "oauthAccountNotLinked": "\u0905\u092a\u0928\u0940 \u092a\u0939\u091a\u093e\u0928 \u0915\u0940 \u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f, \u0909\u0938\u0940 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902 \u091c\u093f\u0938\u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0906\u092a\u0928\u0947 \u092e\u0942\u0932 \u0930\u0942\u092a \u0938\u0947 \u0915\u093f\u092f\u093e \u0925\u093e",
49
+ "emailSignin": "\u0908\u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u092d\u0947\u091c\u093e \u091c\u093e \u0938\u0915\u093e",
50
+ "emailVerify": "\u0915\u0943\u092a\u092f\u093e \u0905\u092a\u0928\u093e \u0908\u092e\u0947\u0932 \u0938\u0924\u094d\u092f\u093e\u092a\u093f\u0924 \u0915\u0930\u0947\u0902, \u090f\u0915 \u0928\u092f\u093e \u0908\u092e\u0947\u0932 \u092d\u0947\u091c\u093e \u0917\u092f\u093e \u0939\u0948",
51
+ "credentialsSignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0935\u093f\u092b\u0932\u0964 \u0906\u092a\u0915\u0947 \u0926\u094d\u0935\u093e\u0930\u093e \u092a\u094d\u0930\u0926\u093e\u0928 \u0915\u093f\u090f \u0917\u090f \u0935\u093f\u0935\u0930\u0923 \u0915\u0940 \u091c\u093e\u0902\u091a \u0915\u0930\u0947\u0902",
52
+ "sessionRequired": "\u0907\u0938 \u092a\u0943\u0937\u094d\u0920 \u0924\u0915 \u092a\u0939\u0941\u0902\u091a\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0915\u0943\u092a\u092f\u093e \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "{{provider}} \u0915\u0947 \u0938\u093e\u0925 \u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u0905\u092a\u0928\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0939\u093e\u0902 \u091f\u093e\u0907\u092a \u0915\u0930\u0947\u0902...",
62
+ "actions": {
63
+ "send": "\u0938\u0902\u0926\u0947\u0936 \u092d\u0947\u091c\u0947\u0902",
64
+ "stop": "\u0915\u093e\u0930\u094d\u092f \u0930\u094b\u0915\u0947\u0902",
65
+ "attachFiles": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u0938\u0902\u0932\u0917\u094d\u0928 \u0915\u0930\u0947\u0902"
66
+ }
67
+ },
68
+ "speech": {
69
+ "start": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
70
+ "stop": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0930\u094b\u0915\u0947\u0902",
71
+ "connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948"
72
+ },
73
+ "fileUpload": {
74
+ "dragDrop": "\u092b\u093c\u093e\u0907\u0932\u094b\u0902 \u0915\u094b \u092f\u0939\u093e\u0902 \u0916\u0940\u0902\u091a\u0947\u0902 \u0914\u0930 \u091b\u094b\u0921\u093c\u0947\u0902",
75
+ "browse": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u092c\u094d\u0930\u093e\u0909\u091c\u093c \u0915\u0930\u0947\u0902",
76
+ "sizeLimit": "\u0938\u0940\u092e\u093e:",
77
+ "errors": {
78
+ "failed": "\u0905\u092a\u0932\u094b\u0921 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932",
79
+ "cancelled": "\u0915\u093e \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u093f\u092f\u093e \u0917\u092f\u093e"
80
+ },
81
+ "actions": {
82
+ "cancelUpload": "\u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0930\u0947\u0902",
83
+ "removeAttachment": "\u0938\u0902\u0932\u0917\u094d\u0928\u0915 \u0939\u091f\u093e\u090f\u0902"
84
+ }
85
+ },
86
+ "commands": {
87
+ "button": "\u0909\u092a\u0915\u0930\u0923",
88
+ "changeTool": "\u0909\u092a\u0915\u0930\u0923 \u092c\u0926\u0932\u0947\u0902",
89
+ "availableTools": "\u0909\u092a\u0932\u092c\u094d\u0927 \u0909\u092a\u0915\u0930\u0923"
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u0909\u092a\u092f\u094b\u0917 \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902",
94
+ "used": "\u0909\u092a\u092f\u094b\u0917 \u0915\u093f\u092f\u093e"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921 \u092a\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u0947\u0902",
99
+ "success": "\u0915\u0949\u092a\u0940 \u0915\u093f\u092f\u093e \u0917\u092f\u093e!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u0938\u0939\u093e\u092f\u0915",
104
+ "negative": "\u0938\u0939\u093e\u092f\u0915 \u0928\u0939\u0940\u0902",
105
+ "edit": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u0947\u0902",
106
+ "dialog": {
107
+ "title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093c\u0947\u0902",
108
+ "submit": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u091c\u092e\u093e \u0915\u0930\u0947\u0902",
109
+ "yourFeedback": "\u0906\u092a\u0915\u0940 \u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e..."
110
+ },
111
+ "status": {
112
+ "updating": "\u0905\u092a\u0921\u0947\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948",
113
+ "updated": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0905\u092a\u0921\u0947\u091f \u0915\u0940 \u0917\u0908"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u092a\u093f\u091b\u0932\u0947 \u0907\u0928\u092a\u0941\u091f",
119
+ "empty": "\u0915\u0941\u091b \u092d\u0940 \u0928\u0939\u0940\u0902 \u0939\u0948...",
120
+ "show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093f\u0916\u093e\u090f\u0902"
121
+ },
122
+ "settings": {
123
+ "title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 \u092a\u0948\u0928\u0932",
124
+ "customize": "\u0905\u092a\u0928\u0947 \u091a\u0948\u091f \u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 \u0915\u094b \u092f\u0939\u093e\u0902 \u0905\u0928\u0941\u0915\u0942\u0932\u093f\u0924 \u0915\u0930\u0947\u0902"
125
+ },
126
+ "watermark": "\u090f\u0932\u090f\u0932\u090f\u092e \u0917\u0932\u0924\u093f\u092f\u093e\u0902 \u0915\u0930 \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964 \u092e\u0939\u0924\u094d\u0935\u092a\u0942\u0930\u094d\u0923 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u0915\u0940 \u091c\u093e\u0902\u091a \u0915\u0930\u0928\u0947 \u092a\u0930 \u0935\u093f\u091a\u093e\u0930 \u0915\u0930\u0947\u0902\u0964"
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u092a\u093f\u091b\u0932\u0940 \u091a\u0948\u091f",
131
+ "filters": {
132
+ "search": "\u0916\u094b\u091c\u0947\u0902",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u0906\u091c",
137
+ "yesterday": "\u0915\u0932",
138
+ "previous7days": "\u092a\u093f\u091b\u0932\u0947 7 \u0926\u093f\u0928",
139
+ "previous30days": "\u092a\u093f\u091b\u0932\u0947 30 \u0926\u093f\u0928"
140
+ },
141
+ "empty": "\u0915\u094b\u0908 \u0925\u094d\u0930\u0947\u0921 \u0928\u0939\u0940\u0902 \u092e\u093f\u0932\u093e",
142
+ "actions": {
143
+ "close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u0947\u0902",
144
+ "open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0916\u094b\u0932\u0947\u0902"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0939\u0940\u0928 \u0935\u093e\u0930\u094d\u0924\u093e\u0932\u093e\u092a",
149
+ "menu": {
150
+ "rename": "\u0928\u093e\u092e \u092c\u0926\u0932\u0947\u0902",
151
+ "share": "\u0938\u093e\u091d\u093e \u0915\u0930\u0947\u0902",
152
+ "delete": "Delete"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u091a\u0948\u091f \u0915\u093e \u0932\u093f\u0902\u0915 \u0938\u093e\u091d\u093e \u0915\u0930\u0947\u0902",
157
+ "button": "\u0938\u093e\u091d\u093e \u0915\u0930\u0947\u0902",
158
+ "status": {
159
+ "copied": "\u0932\u093f\u0902\u0915 \u0915\u0949\u092a\u0940 \u0915\u093f\u092f\u093e \u0917\u092f\u093e",
160
+ "created": "\u0936\u0947\u092f\u0930 \u0932\u093f\u0902\u0915 \u092c\u0928\u093e\u092f\u093e \u0917\u092f\u093e!",
161
+ "unshared": "\u0907\u0938 \u0925\u094d\u0930\u0947\u0921 \u0915\u0947 \u0932\u093f\u090f \u0938\u093e\u091d\u093e \u0915\u0930\u0928\u093e \u0928\u093f\u0937\u094d\u0915\u094d\u0930\u093f\u092f \u0939\u0948"
162
+ },
163
+ "error": {
164
+ "create": "\u0936\u0947\u092f\u0930 \u0932\u093f\u0902\u0915 \u092c\u0928\u093e\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932",
165
+ "unshare": "\u0925\u094d\u0930\u0947\u0921 \u0915\u094b \u0905\u0928\u0936\u0947\u092f\u0930 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u0939\u091f\u093e\u0928\u0947 \u0915\u0940 \u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902",
170
+ "description": "\u092f\u0939 \u0925\u094d\u0930\u0947\u0921 \u0914\u0930 \u0907\u0938\u0915\u0947 \u0938\u0902\u0926\u0947\u0936\u094b\u0902 \u0914\u0930 \u0924\u0924\u094d\u0935\u094b\u0902 \u0915\u094b \u0939\u091f\u093e \u0926\u0947\u0917\u093e\u0964 \u092f\u0939 \u0915\u094d\u0930\u093f\u092f\u093e \u0935\u093e\u092a\u0938 \u0928\u0939\u0940\u0902 \u0915\u0940 \u091c\u093e \u0938\u0915\u0924\u0940",
171
+ "success": "\u091a\u0948\u091f \u0939\u091f\u093e \u0926\u0940 \u0917\u0908",
172
+ "inProgress": "\u091a\u0948\u091f \u0939\u091f\u093e\u0908 \u091c\u093e \u0930\u0939\u0940 \u0939\u0948"
173
+ },
174
+ "rename": {
175
+ "title": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932\u0947\u0902",
176
+ "description": "\u0907\u0938 \u0925\u094d\u0930\u0947\u0921 \u0915\u0947 \u0932\u093f\u090f \u090f\u0915 \u0928\u092f\u093e \u0928\u093e\u092e \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u0928\u093e\u092e",
180
+ "placeholder": "\u0928\u092f\u093e \u0928\u093e\u092e \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902"
181
+ }
182
+ },
183
+ "success": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932 \u0926\u093f\u092f\u093e \u0917\u092f\u093e!",
184
+ "inProgress": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932\u093e \u091c\u093e \u0930\u0939\u093e \u0939\u0948"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u091a\u0948\u091f",
192
+ "readme": "\u0930\u0940\u0921\u092e\u0940",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u0928\u0908 \u091a\u0948\u091f",
201
+ "dialog": {
202
+ "title": "\u0928\u0908 \u091a\u0948\u091f \u092c\u0928\u093e\u090f\u0902",
203
+ "description": "\u092f\u0939 \u0906\u092a\u0915\u093e \u0935\u0930\u094d\u0924\u092e\u093e\u0928 \u091a\u0948\u091f \u0907\u0924\u093f\u0939\u093e\u0938 \u0938\u093e\u092b\u093c \u0915\u0930 \u0926\u0947\u0917\u093e\u0964 \u0915\u094d\u092f\u093e \u0906\u092a \u091c\u093e\u0930\u0940 \u0930\u0916\u0928\u093e \u091a\u093e\u0939\u0924\u0947 \u0939\u0948\u0902?",
204
+ "tooltip": "\u0928\u0908 \u091a\u0948\u091f"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902",
212
+ "logout": "\u0932\u0949\u0917\u0906\u0909\u091f"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902",
218
+ "description": "\u0907\u0938 \u0910\u092a \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f, \u0928\u093f\u092e\u094d\u0928\u0932\u093f\u0916\u093f\u0924 API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902 \u0906\u0935\u0936\u094d\u092f\u0915 \u0939\u0948\u0902\u0964 \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902 \u0906\u092a\u0915\u0947 \u0921\u093f\u0935\u093e\u0907\u0938 \u0915\u0947 \u0938\u094d\u0925\u093e\u0928\u0940\u092f \u0938\u0902\u0917\u094d\u0930\u0939\u0923 \u092e\u0947\u0902 \u0938\u0902\u0917\u094d\u0930\u0939\u0940\u0924 \u0915\u0940 \u091c\u093e\u0924\u0940 \u0939\u0948\u0902\u0964",
219
+ "success": {
220
+ "saved": "\u0938\u092b\u0932\u0924\u093e\u092a\u0942\u0930\u094d\u0935\u0915 \u0938\u0939\u0947\u091c\u093e \u0917\u092f\u093e"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u091a\u0941\u0928\u0947\u0902..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/ja.json ADDED
@@ -0,0 +1,244 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u30d1\u30b9\u30ef\u30fc\u30c9",
30
+ "required": "\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059"
31
+ },
32
+ "actions": {
33
+ "signin": "\u30b5\u30a4\u30f3\u30a4\u30f3"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u307e\u305f\u306f"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u30b5\u30a4\u30f3\u30a4\u30f3\u3067\u304d\u307e\u305b\u3093",
41
+ "signin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
42
+ "oauthSignin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
43
+ "redirectUriMismatch": "\u30ea\u30c0\u30a4\u30ec\u30af\u30c8URI\u304cOAuth\u30a2\u30d7\u30ea\u306e\u8a2d\u5b9a\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093",
44
+ "oauthCallback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
45
+ "oauthCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
46
+ "emailCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
47
+ "callback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
48
+ "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",
49
+ "emailSignin": "\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f",
50
+ "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",
51
+ "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",
52
+ "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"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "{{provider}}\u3067\u7d9a\u3051\u308b"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044...",
62
+ "actions": {
63
+ "send": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1",
64
+ "stop": "\u30bf\u30b9\u30af\u3092\u505c\u6b62",
65
+ "attachFiles": "\u30d5\u30a1\u30a4\u30eb\u3092\u6dfb\u4ed8"
66
+ }
67
+ },
68
+ "speech": {
69
+ "start": "\u9332\u97f3\u958b\u59cb",
70
+ "stop": "\u9332\u97f3\u505c\u6b62",
71
+ "connecting": "\u63a5\u7d9a\u4e2d"
72
+ },
73
+ "commands": {
74
+ "button": "\u30c4\u30fc\u30eb",
75
+ "changeTool": "\u30c4\u30fc\u30eb\u3092\u5909\u66f4",
76
+ "availableTools": "\u5229\u7528\u53ef\u80fd\u306a\u30c4\u30fc\u30eb"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "\u3053\u3053\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30c9\u30e9\u30c3\u30b0\uff06\u30c9\u30ed\u30c3\u30d7",
80
+ "sizeLimit": "\u5236\u9650\uff1a",
81
+ "errors": {
82
+ "failed": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f",
83
+ "cancelled": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3057\u305f\uff1a"
84
+ },
85
+ "actions": {
86
+ "cancelUpload": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u30ad\u30e3\u30f3\u30bb\u30eb",
87
+ "removeAttachment": "\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664"
88
+ }
89
+ },
90
+ "messages": {
91
+ "status": {
92
+ "using": "\u4f7f\u7528\u4e2d",
93
+ "used": "\u4f7f\u7528\u6e08\u307f"
94
+ },
95
+ "actions": {
96
+ "copy": {
97
+ "button": "\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc",
98
+ "success": "\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\uff01"
99
+ }
100
+ },
101
+ "feedback": {
102
+ "positive": "\u5f79\u306b\u7acb\u3063\u305f",
103
+ "negative": "\u5f79\u306b\u7acb\u305f\u306a\u304b\u3063\u305f",
104
+ "edit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u7de8\u96c6",
105
+ "dialog": {
106
+ "title": "\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0",
107
+ "submit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u9001\u4fe1",
108
+ "yourFeedback": "\u3042\u306a\u305f\u306e\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af..."
109
+ },
110
+ "status": {
111
+ "updating": "\u66f4\u65b0\u4e2d",
112
+ "updated": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f"
113
+ }
114
+ }
115
+ },
116
+ "history": {
117
+ "title": "\u6700\u8fd1\u306e\u5165\u529b",
118
+ "empty": "\u4f55\u3082\u3042\u308a\u307e\u305b\u3093...",
119
+ "show": "\u5c65\u6b74\u3092\u8868\u793a"
120
+ },
121
+ "settings": {
122
+ "title": "\u8a2d\u5b9a\u30d1\u30cd\u30eb",
123
+ "customize": "\u3053\u3053\u3067\u30c1\u30e3\u30c3\u30c8\u8a2d\u5b9a\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u307e\u3059"
124
+ },
125
+ "watermark": "\u5927\u898f\u6a21\u8a00\u8a9e\u30e2\u30c7\u30eb\u306f\u9593\u9055\u3044\u3092\u72af\u3059\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u91cd\u8981\u306a\u60c5\u5831\u306b\u3064\u3044\u3066\u306f\u78ba\u8a8d\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002"
126
+ },
127
+ "threadHistory": {
128
+ "sidebar": {
129
+ "title": "\u904e\u53bb\u306e\u30c1\u30e3\u30c3\u30c8",
130
+ "filters": {
131
+ "search": "\u691c\u7d22",
132
+ "placeholder": "Search conversations..."
133
+ },
134
+ "timeframes": {
135
+ "today": "\u4eca\u65e5",
136
+ "yesterday": "\u6628\u65e5",
137
+ "previous7days": "\u904e\u53bb7\u65e5\u9593",
138
+ "previous30days": "\u904e\u53bb30\u65e5\u9593"
139
+ },
140
+ "empty": "\u30b9\u30ec\u30c3\u30c9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093",
141
+ "actions": {
142
+ "close": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u9589\u3058\u308b",
143
+ "open": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u958b\u304f"
144
+ }
145
+ },
146
+ "thread": {
147
+ "untitled": "\u7121\u984c\u306e\u4f1a\u8a71",
148
+ "menu": {
149
+ "rename": "\u540d\u524d\u3092\u5909\u66f4",
150
+ "share": "\u5171\u6709",
151
+ "delete": "\u524a\u9664"
152
+ },
153
+ "actions": {
154
+ "share": {
155
+ "title": "\u30c1\u30e3\u30c3\u30c8\u306e\u30ea\u30f3\u30af\u3092\u5171\u6709",
156
+ "button": "\u5171\u6709",
157
+ "status": {
158
+ "copied": "\u30ea\u30f3\u30af\u3092\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f",
159
+ "created": "\u5171\u6709\u30ea\u30f3\u30af\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\uff01",
160
+ "unshared": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306e\u5171\u6709\u3092\u7121\u52b9\u306b\u3057\u307e\u3057\u305f"
161
+ },
162
+ "error": {
163
+ "create": "\u5171\u6709\u30ea\u30f3\u30af\u306e\u4f5c\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f",
164
+ "unshare": "\u30b9\u30ec\u30c3\u30c9\u306e\u5171\u6709\u89e3\u9664\u306b\u5931\u6557\u3057\u307e\u3057\u305f"
165
+ }
166
+ },
167
+ "delete": {
168
+ "title": "\u524a\u9664\u306e\u78ba\u8a8d",
169
+ "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",
170
+ "success": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u3057\u307e\u3057\u305f",
171
+ "inProgress": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u4e2d"
172
+ },
173
+ "rename": {
174
+ "title": "\u30b9\u30ec\u30c3\u30c9\u306e\u540d\u524d\u3092\u5909\u66f4",
175
+ "description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306e\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044",
176
+ "form": {
177
+ "name": {
178
+ "label": "\u540d\u524d",
179
+ "placeholder": "\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b"
180
+ }
181
+ },
182
+ "success": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u3057\u307e\u3057\u305f\uff01",
183
+ "inProgress": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u4e2d"
184
+ }
185
+ }
186
+ }
187
+ },
188
+ "navigation": {
189
+ "header": {
190
+ "chat": "\u30c1\u30e3\u30c3\u30c8",
191
+ "readme": "\u8aac\u660e\u66f8",
192
+ "theme": {
193
+ "light": "Light Theme",
194
+ "dark": "Dark Theme",
195
+ "system": "Follow System"
196
+ }
197
+ },
198
+ "newChat": {
199
+ "button": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8",
200
+ "dialog": {
201
+ "title": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8\u306e\u4f5c\u6210",
202
+ "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",
203
+ "tooltip": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8"
204
+ }
205
+ },
206
+ "user": {
207
+ "menu": {
208
+ "settings": "\u8a2d\u5b9a",
209
+ "settingsKey": "S",
210
+ "apiKeys": "API\u30ad\u30fc",
211
+ "logout": "\u30ed\u30b0\u30a2\u30a6\u30c8"
212
+ }
213
+ }
214
+ },
215
+ "apiKeys": {
216
+ "title": "\u5fc5\u8981\u306aAPI\u30ad\u30fc",
217
+ "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",
218
+ "success": {
219
+ "saved": "\u4fdd\u5b58\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f"
220
+ }
221
+ },
222
+ "alerts": {
223
+ "info": "Info",
224
+ "note": "Note",
225
+ "tip": "Tip",
226
+ "important": "Important",
227
+ "warning": "Warning",
228
+ "caution": "Caution",
229
+ "debug": "Debug",
230
+ "example": "Example",
231
+ "success": "Success",
232
+ "help": "Help",
233
+ "idea": "Idea",
234
+ "pending": "Pending",
235
+ "security": "Security",
236
+ "beta": "Beta",
237
+ "best-practice": "Best Practice"
238
+ },
239
+ "components": {
240
+ "MultiSelectInput": {
241
+ "placeholder": "\u9078\u629e..."
242
+ }
243
+ }
244
+ }
.chainlit/translations/kn.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0cae\u0cbe\u0ca1\u0cbf",
5
+ "confirm": "\u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cbf",
6
+ "continue": "\u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf",
7
+ "goBack": "\u0cb9\u0cbf\u0c82\u0ca6\u0cc6 \u0cb9\u0ccb\u0c97\u0cbf",
8
+ "reset": "\u0cae\u0cb0\u0cc1\u0cb9\u0cca\u0c82\u0ca6\u0cbf\u0cb8\u0cbf",
9
+ "submit": "\u0cb8\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf"
10
+ },
11
+ "status": {
12
+ "loading": "\u0cb2\u0ccb\u0ca1\u0ccd \u0c86\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6...",
13
+ "error": {
14
+ "default": "\u0ca6\u0ccb\u0cb7 \u0cb8\u0c82\u0cad\u0cb5\u0cbf\u0cb8\u0cbf\u0ca6\u0cc6",
15
+ "serverConnection": "\u0cb8\u0cb0\u0ccd\u0cb5\u0cb0\u0ccd\u200c \u0c85\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca4\u0cb2\u0cc1\u0caa\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0c97\u0cc6 \u0caa\u0ccd\u0cb0\u0cb5\u0cc7\u0cb6\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb2\u0cbe\u0c97\u0cbf\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf",
22
+ "form": {
23
+ "email": {
24
+ "label": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0cb5\u0cbf\u0cb3\u0cbe\u0cb8",
25
+ "required": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 \u0c95\u0ccd\u0cb7\u0cc7\u0ca4\u0ccd\u0cb0",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u0caa\u0cbe\u0cb8\u0ccd\u200c\u0cb5\u0cb0\u0ccd\u0ca1\u0ccd",
30
+ "required": "\u0caa\u0cbe\u0cb8\u0ccd\u200c\u0cb5\u0cb0\u0ccd\u0ca1\u0ccd \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 \u0c95\u0ccd\u0cb7\u0cc7\u0ca4\u0ccd\u0cb0"
31
+ },
32
+ "actions": {
33
+ "signin": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u0c85\u0ca5\u0cb5\u0cbe"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2",
41
+ "signin": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
42
+ "oauthSignin": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
43
+ "redirectUriMismatch": "\u0cb0\u0cc0\u0ca1\u0cc8\u0cb0\u0cc6\u0c95\u0ccd\u0c9f\u0ccd URI \u0c93\u0ca5\u0ccd \u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd \u0c95\u0cbe\u0ca8\u0ccd\u0cab\u0cbf\u0c97\u0cb0\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0c97\u0cc6 \u0cb9\u0cca\u0c82\u0ca6\u0cbf\u0c95\u0cc6\u0caf\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0cb2\u0ccd\u0cb2",
44
+ "oauthCallback": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
45
+ "oauthCreateAccount": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
46
+ "emailCreateAccount": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
47
+ "callback": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
48
+ "oauthAccountNotLinked": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0c97\u0cc1\u0cb0\u0cc1\u0ca4\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cc1, \u0ca8\u0cc0\u0cb5\u0cc1 \u0cae\u0cca\u0ca6\u0cb2\u0cc1 \u0cac\u0cb3\u0cb8\u0cbf\u0ca6 \u0c85\u0ca6\u0cc7 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf",
49
+ "emailSignin": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2",
50
+ "emailVerify": "\u0ca6\u0caf\u0cb5\u0cbf\u0c9f\u0ccd\u0c9f\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0caa\u0cb0\u0cbf\u0cb6\u0cc0\u0cb2\u0cbf\u0cb8\u0cbf, \u0cb9\u0cca\u0cb8 \u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
51
+ "credentialsSignin": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6. \u0ca8\u0cc0\u0cb5\u0cc1 \u0c92\u0ca6\u0c97\u0cbf\u0cb8\u0cbf\u0ca6 \u0cb5\u0cbf\u0cb5\u0cb0\u0c97\u0cb3\u0cc1 \u0cb8\u0cb0\u0cbf\u0caf\u0cbe\u0c97\u0cbf\u0cb5\u0cc6\u0caf\u0cc7 \u0c8e\u0c82\u0ca6\u0cc1 \u0caa\u0cb0\u0cbf\u0cb6\u0cc0\u0cb2\u0cbf\u0cb8\u0cbf",
52
+ "sessionRequired": "\u0c88 \u0caa\u0cc1\u0c9f\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0caa\u0ccd\u0cb0\u0cb5\u0cc7\u0cb6\u0cbf\u0cb8\u0cb2\u0cc1 \u0ca6\u0caf\u0cb5\u0cbf\u0c9f\u0ccd\u0c9f\u0cc1 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "{{provider}} \u0ca8\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0c87\u0cb2\u0ccd\u0cb2\u0cbf \u0c9f\u0cc8\u0caa\u0ccd \u0cae\u0cbe\u0ca1\u0cbf...",
62
+ "actions": {
63
+ "send": "\u0cb8\u0c82\u0ca6\u0cc7\u0cb6 \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cbf",
64
+ "stop": "\u0c95\u0cbe\u0cb0\u0ccd\u0caf \u0ca8\u0cbf\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf",
65
+ "attachFiles": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb2\u0c97\u0ca4\u0ccd\u0ca4\u0cbf\u0cb8\u0cbf"
66
+ }
67
+ },
68
+ "commands": {
69
+ "button": "\u0c89\u0caa\u0c95\u0cb0\u0ca3\u0c97\u0cb3\u0cc1",
70
+ "changeTool": "\u0c89\u0caa\u0c95\u0cb0\u0ca3\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0cac\u0ca6\u0cb2\u0cbf\u0cb8\u0cbf",
71
+ "availableTools": "\u0cb2\u0cad\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 \u0c89\u0caa\u0c95\u0cb0\u0ca3\u0c97\u0cb3\u0cc1"
72
+ },
73
+ "speech": {
74
+ "start": "\u0cb0\u0cc6\u0c95\u0cbe\u0cb0\u0ccd\u0ca1\u0cbf\u0c82\u0c97\u0ccd \u0caa\u0ccd\u0cb0\u0cbe\u0cb0\u0c82\u0cad\u0cbf\u0cb8\u0cbf",
75
+ "stop": "\u0cb0\u0cc6\u0c95\u0cbe\u0cb0\u0ccd\u0ca1\u0cbf\u0c82\u0c97\u0ccd \u0ca8\u0cbf\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf",
76
+ "connecting": "\u0cb8\u0c82\u0caa\u0cb0\u0ccd\u0c95\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c87\u0cb2\u0ccd\u0cb2\u0cbf \u0c8e\u0cb3\u0cc6\u0ca6\u0cc1 \u0cac\u0cbf\u0ca1\u0cbf",
80
+ "browse": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cac\u0ccd\u0cb0\u0ccc\u0cb8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf",
81
+ "sizeLimit": "\u0cae\u0cbf\u0ca4\u0cbf:",
82
+ "errors": {
83
+ "failed": "\u0c85\u0caa\u0ccd\u200c\u0cb2\u0ccb\u0ca1\u0ccd \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
84
+ "cancelled": "\u0c85\u0caa\u0ccd\u200c\u0cb2\u0ccb\u0ca1\u0ccd \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "\u0c85\u0caa\u0ccd\u200c\u0cb2\u0ccb\u0ca1\u0ccd \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cbf",
88
+ "removeAttachment": "\u0c85\u0c9f\u0ccd\u0caf\u0cbe\u0c9a\u0ccd\u200c\u0cae\u0cc6\u0c82\u0c9f\u0ccd \u0c85\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca4\u0cc6\u0c97\u0cc6\u0ca6\u0cc1\u0cb9\u0cbe\u0c95\u0cbf"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u0cac\u0cb3\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0cb0\u0cc1\u0cb5\u0cc1\u0ca6\u0cc1",
94
+ "used": "\u0cac\u0cb3\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u0c95\u0ccd\u0cb2\u0cbf\u0caa\u0ccd\u200c\u0cac\u0ccb\u0cb0\u0ccd\u0ca1\u0ccd\u200c\u0c97\u0cc6 \u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cbf",
99
+ "success": "\u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u0cb8\u0cb9\u0cbe\u0caf\u0c95\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
104
+ "negative": "\u0cb8\u0cb9\u0cbe\u0caf\u0c95\u0cb5\u0cbe\u0c97\u0cbf\u0cb2\u0ccd\u0cb2",
105
+ "edit": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0cb8\u0c82\u0caa\u0cbe\u0ca6\u0cbf\u0cb8\u0cbf",
106
+ "dialog": {
107
+ "title": "\u0c95\u0cbe\u0cae\u0cc6\u0c82\u0c9f\u0ccd \u0cb8\u0cc7\u0cb0\u0cbf\u0cb8\u0cbf",
108
+ "submit": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0cb8\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf",
109
+ "yourFeedback": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6..."
110
+ },
111
+ "status": {
112
+ "updating": "\u0ca8\u0cb5\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6",
113
+ "updated": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0ca8\u0cb5\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u0c95\u0cca\u0ca8\u0cc6\u0caf \u0c87\u0ca8\u0ccd\u200c\u0caa\u0cc1\u0c9f\u0ccd\u200c\u0c97\u0cb3\u0cc1",
119
+ "empty": "\u0c96\u0cbe\u0cb2\u0cbf\u0caf\u0cbe\u0c97\u0cbf\u0ca6\u0cc6...",
120
+ "show": "\u0c87\u0ca4\u0cbf\u0cb9\u0cbe\u0cb8 \u0ca4\u0ccb\u0cb0\u0cbf\u0cb8\u0cbf"
121
+ },
122
+ "settings": {
123
+ "title": "\u0cb8\u0cc6\u0c9f\u0ccd\u0c9f\u0cbf\u0c82\u0c97\u0ccd\u200c\u0c97\u0cb3 \u0caa\u0ccd\u0caf\u0cbe\u0ca8\u0cc6\u0cb2\u0ccd",
124
+ "customize": "\u0c88\u0c97 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0c9a\u0cbe\u0c9f\u0ccd \u0cb8\u0cc6\u0c9f\u0ccd\u0c9f\u0cbf\u0c82\u0c97\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c95\u0cb8\u0ccd\u0c9f\u0cae\u0cc8\u0cb8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf"
125
+ },
126
+ "watermark": "LLM \u0c97\u0cb3\u0cc1 \u0ca4\u0caa\u0ccd\u0caa\u0cc1\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cae\u0cbe\u0ca1\u0cac\u0cb9\u0cc1\u0ca6\u0cc1. \u0caa\u0ccd\u0cb0\u0cae\u0cc1\u0c96 \u0cae\u0cbe\u0cb9\u0cbf\u0ca4\u0cbf\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0caa\u0cb0\u0cbf\u0cb6\u0cc0\u0cb2\u0cbf\u0cb8\u0cc1\u0cb5\u0cc1\u0ca6\u0ca8\u0ccd\u0ca8\u0cc1 \u0caa\u0cb0\u0cbf\u0c97\u0ca3\u0cbf\u0cb8\u0cbf."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cb3\u0cc1",
131
+ "filters": {
132
+ "search": "\u0cb9\u0cc1\u0ca1\u0cc1\u0c95\u0cbf",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u0c87\u0c82\u0ca6\u0cc1",
137
+ "yesterday": "\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6",
138
+ "previous7days": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 7 \u0ca6\u0cbf\u0ca8\u0c97\u0cb3\u0cc1",
139
+ "previous30days": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 30 \u0ca6\u0cbf\u0ca8\u0c97\u0cb3\u0cc1"
140
+ },
141
+ "empty": "\u0caf\u0cbe\u0cb5\u0cc1\u0ca6\u0cc7 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cb3\u0cc1 \u0c95\u0c82\u0ca1\u0cc1\u0cac\u0c82\u0ca6\u0cbf\u0cb2\u0ccd\u0cb2",
142
+ "actions": {
143
+ "close": "\u0caa\u0c95\u0ccd\u0c95\u0ca6 \u0caa\u0c9f\u0ccd\u0c9f\u0cbf \u0cae\u0cc1\u0c9a\u0ccd\u0c9a\u0cbf",
144
+ "open": "\u0caa\u0c95\u0ccd\u0c95\u0ca6 \u0caa\u0c9f\u0ccd\u0c9f\u0cbf \u0ca4\u0cc6\u0cb0\u0cc6\u0caf\u0cbf\u0cb0\u0cbf"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u0cb6\u0cc0\u0cb0\u0ccd\u0cb7\u0cbf\u0c95\u0cc6\u0cb0\u0cb9\u0cbf\u0ca4 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6",
149
+ "menu": {
150
+ "rename": "\u0cae\u0cb0\u0cc1\u0cb9\u0cc6\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
151
+ "share": "\u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cca\u0cb3\u0ccd\u0cb3\u0cbf",
152
+ "delete": "\u0c85\u0cb3\u0cbf\u0cb8\u0cbf"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u0c9a\u0cbe\u0c9f\u0ccd\u200c\u0c97\u0cc6 \u0cb2\u0cbf\u0c82\u0c95\u0ccd \u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cca\u0cb3\u0ccd\u0cb3\u0cbf",
157
+ "button": "\u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cca\u0cb3\u0ccd\u0cb3\u0cbf",
158
+ "status": {
159
+ "copied": "\u0cb2\u0cbf\u0c82\u0c95\u0ccd \u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0cb2\u0cbf\u0caa\u0cbf \u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
160
+ "created": "\u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cc6\u0caf \u0cb2\u0cbf\u0c82\u0c95\u0ccd \u0cb0\u0c9a\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6!",
161
+ "unshared": "\u0c88 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cc6 \u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cc6 \u0ca8\u0cbf\u0cb7\u0ccd\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
162
+ },
163
+ "error": {
164
+ "create": "\u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cc6\u0caf \u0cb2\u0cbf\u0c82\u0c95\u0ccd \u0cb0\u0c9a\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
165
+ "unshare": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1 \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0cb5\u0cbf\u0c95\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cbf",
170
+ "description": "\u0c87\u0ca6\u0cc1 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb9\u0cbe\u0c97\u0cc2 \u0c85\u0ca6\u0cb0 \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0c97\u0cb3\u0cc1 \u0cae\u0ca4\u0ccd\u0ca4\u0cc1 \u0c85\u0c82\u0cb6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6. \u0c88 \u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbf\u0cb2\u0ccd\u0cb2",
171
+ "success": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0c85\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
172
+ "inProgress": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0c85\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6"
173
+ },
174
+ "rename": {
175
+ "title": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cbf",
176
+ "description": "\u0c88 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cc6 \u0cb9\u0cca\u0cb8 \u0cb9\u0cc6\u0cb8\u0cb0\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cae\u0cc2\u0ca6\u0cbf\u0cb8\u0cbf",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u0cb9\u0cc6\u0cb8\u0cb0\u0cc1",
180
+ "placeholder": "\u0cb9\u0cca\u0cb8 \u0cb9\u0cc6\u0cb8\u0cb0\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cae\u0cc2\u0ca6\u0cbf\u0cb8\u0cbf"
181
+ }
182
+ },
183
+ "success": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6!",
184
+ "inProgress": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6",
192
+ "readme": "\u0c93\u0ca6\u0cbf",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6",
201
+ "dialog": {
202
+ "title": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0cb0\u0c9a\u0cbf\u0cb8\u0cbf",
203
+ "description": "\u0c87\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0caa\u0ccd\u0cb0\u0cb8\u0ccd\u0ca4\u0cc1\u0ca4 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0c87\u0ca4\u0cbf\u0cb9\u0cbe\u0cb8\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6. \u0ca8\u0cc0\u0cb5\u0cc1 \u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cc6\u0caf\u0cb2\u0cc1 \u0cac\u0caf\u0cb8\u0cc1\u0cb5\u0cbf\u0cb0\u0cbe?",
204
+ "tooltip": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u0cb8\u0cc6\u0c9f\u0ccd\u0c9f\u0cbf\u0c82\u0c97\u0ccd\u200c\u0c97\u0cb3\u0cc1",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API \u0c95\u0cc0\u0c97\u0cb3\u0cc1",
212
+ "logout": "\u0cb2\u0cbe\u0c97\u0ccd \u0c94\u0c9f\u0ccd"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 API \u0c95\u0cc0\u0c97\u0cb3\u0cc1",
218
+ "description": "\u0c88 \u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd \u0cac\u0cb3\u0cb8\u0cb2\u0cc1, \u0c88 \u0c95\u0cc6\u0cb3\u0c97\u0cbf\u0ca8 API \u0c95\u0cc0\u0c97\u0cb3\u0cc1 \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0ca4\u0ccd\u0ca4\u0cb5\u0cc6. \u0c95\u0cc0\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0cb8\u0cbe\u0ca7\u0ca8\u0ca6 \u0cb8\u0ccd\u0ca5\u0cb3\u0cc0\u0caf \u0cb8\u0c82\u0c97\u0ccd\u0cb0\u0cb9\u0ca3\u0cc6\u0caf\u0cb2\u0ccd\u0cb2\u0cbf \u0cb8\u0c82\u0c97\u0ccd\u0cb0\u0cb9\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6.",
219
+ "success": {
220
+ "saved": "\u0caf\u0cb6\u0cb8\u0ccd\u0cb5\u0cbf\u0caf\u0cbe\u0c97\u0cbf \u0c89\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u0c9a\u0cc1\u0ca8\u0cbe\u0caf\u0cbf\u0cb8\u0cbf..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/ko.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\ucde8\uc18c",
5
+ "confirm": "\ud655\uc778",
6
+ "continue": "\uacc4\uc18d",
7
+ "goBack": "\ub4a4\ub85c \uac00\uae30",
8
+ "reset": "\ucd08\uae30\ud654",
9
+ "submit": "\uc81c\ucd9c"
10
+ },
11
+ "status": {
12
+ "loading": "\ub85c\ub529 \uc911...",
13
+ "error": {
14
+ "default": "\uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4",
15
+ "serverConnection": "\uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\uc571\uc5d0 \uc811\uadfc\ud558\ub824\uba74 \ub85c\uadf8\uc778\ud558\uc138\uc694",
22
+ "form": {
23
+ "email": {
24
+ "label": "\uc774\uba54\uc77c \uc8fc\uc18c",
25
+ "required": "\uc774\uba54\uc77c\uc740 \ud544\uc218 \uc785\ub825 \ud56d\ubaa9\uc785\ub2c8\ub2e4",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\ube44\ubc00\ubc88\ud638",
30
+ "required": "\ube44\ubc00\ubc88\ud638\ub294 \ud544\uc218 \uc785\ub825 \ud56d\ubaa9\uc785\ub2c8\ub2e4"
31
+ },
32
+ "actions": {
33
+ "signin": "\ub85c\uadf8\uc778"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\ub610\ub294"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\ub85c\uadf8\uc778\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4",
41
+ "signin": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
42
+ "oauthSignin": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
43
+ "redirectUriMismatch": "\ub9ac\ub2e4\uc774\ub809\ud2b8 URI\uac00 OAuth \uc571 \uc124\uc815\uacfc \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4",
44
+ "oauthCallback": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
45
+ "oauthCreateAccount": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
46
+ "emailCreateAccount": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
47
+ "callback": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
48
+ "oauthAccountNotLinked": "\uc2e0\uc6d0\uc744 \ud655\uc778\ud558\ub824\uba74 \uc6d0\ub798 \uc0ac\uc6a9\ud588\ub358 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud558\uc138\uc694",
49
+ "emailSignin": "\uc774\uba54\uc77c\uc744 \ubcf4\ub0bc \uc218 \uc5c6\uc2b5\ub2c8\ub2e4",
50
+ "emailVerify": "\uc774\uba54\uc77c\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \uc0c8\ub85c\uc6b4 \uc774\uba54\uc77c\uc774 \ubc1c\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
51
+ "credentialsSignin": "\ub85c\uadf8\uc778 \uc2e4\ud328. \uc81c\uacf5\ud55c \uc815\ubcf4\uac00 \uc62c\ubc14\ub978\uc9c0 \ud655\uc778\ud558\uc138\uc694",
52
+ "sessionRequired": "\uc774 \ud398\uc774\uc9c0\uc5d0 \uc811\uadfc\ud558\ub824\uba74 \ub85c\uadf8\uc778\ud574\uc8fc\uc138\uc694"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "{{provider}}\ub85c \uacc4\uc18d\ud558\uae30"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\uc5ec\uae30\uc5d0 \uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694...",
62
+ "actions": {
63
+ "send": "\uba54\uc2dc\uc9c0 \ubcf4\ub0b4\uae30",
64
+ "stop": "\uc791\uc5c5 \uc911\uc9c0",
65
+ "attachFiles": "\ud30c\uc77c \ucca8\ubd80"
66
+ }
67
+ },
68
+ "commands": {
69
+ "button": "\ub3c4\uad6c",
70
+ "changeTool": "\ub3c4\uad6c \ubcc0\uacbd",
71
+ "availableTools": "\uc0ac\uc6a9 \uac00\ub2a5\ud55c \ub3c4\uad6c"
72
+ },
73
+ "speech": {
74
+ "start": "\ub179\uc74c \uc2dc\uc791",
75
+ "stop": "\ub179\uc74c \uc911\uc9c0",
76
+ "connecting": "\uc5f0\uacb0 \uc911"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "\uc5ec\uae30\uc5d0 \ud30c\uc77c\uc744 \ub4dc\ub798\uadf8 \uc564 \ub4dc\ub86d\ud558\uc138\uc694",
80
+ "browse": "\ud30c\uc77c \ucc3e\uc544\ubcf4\uae30",
81
+ "sizeLimit": "\uc81c\ud55c:",
82
+ "errors": {
83
+ "failed": "\uc5c5\ub85c\ub4dc \uc2e4\ud328",
84
+ "cancelled": "\uc5c5\ub85c\ub4dc \ucde8\uc18c:"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "\uc5c5\ub85c\ub4dc \ucde8\uc18c",
88
+ "removeAttachment": "\ucca8\ubd80 \ud30c\uc77c \uc81c\uac70"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\uc0ac\uc6a9 \uc911",
94
+ "used": "\uc0ac\uc6a9\ub428"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\ud074\ub9bd\ubcf4\ub4dc\ub85c \ubcf5\uc0ac",
99
+ "success": "\ubcf5\uc0ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\ub3c4\uc6c0\uc774 \ub418\uc5c8\uc74c",
104
+ "negative": "\ub3c4\uc6c0\uc774 \ub418\uc9c0 \uc54a\uc74c",
105
+ "edit": "\ud53c\ub4dc\ubc31 \uc218\uc815",
106
+ "dialog": {
107
+ "title": "\ub313\uae00 \ucd94\uac00",
108
+ "submit": "\ud53c\ub4dc\ubc31 \uc81c\ucd9c",
109
+ "yourFeedback": "\uadc0\ud558\uc758 \ud53c\ub4dc\ubc31..."
110
+ },
111
+ "status": {
112
+ "updating": "\uc5c5\ub370\uc774\ud2b8 \uc911",
113
+ "updated": "\ud53c\ub4dc\ubc31\uc774 \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\ucd5c\uadfc \uc785\ub825",
119
+ "empty": "\ube44\uc5b4 \uc788\uc2b5\ub2c8\ub2e4...",
120
+ "show": "\uae30\ub85d \ud45c\uc2dc"
121
+ },
122
+ "settings": {
123
+ "title": "\uc124\uc815 \ud328\ub110",
124
+ "customize": "\uc5ec\uae30\uc5d0\uc11c \ucc44\ud305 \uc124\uc815\uc744 \uc0ac\uc6a9\uc790 \uc9c0\uc815\ud558\uc138\uc694"
125
+ },
126
+ "watermark": "LLM\uc740 \uc2e4\uc218\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc911\uc694\ud55c \uc815\ubcf4\ub294 \ud655\uc778\ud558\uc138\uc694."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\uc774\uc804 \ucc44\ud305",
131
+ "filters": {
132
+ "search": "\uac80\uc0c9",
133
+ "placeholder": "\ub300\ud654 \uac80\uc0c9..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\uc624\ub298",
137
+ "yesterday": "\uc5b4\uc81c",
138
+ "previous7days": "\uc9c0\ub09c 7\uc77c",
139
+ "previous30days": "\uc9c0\ub09c 30\uc77c"
140
+ },
141
+ "empty": "\uc2a4\ub808\ub4dc\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4",
142
+ "actions": {
143
+ "close": "\uc0ac\uc774\ub4dc\ubc14 \ub2eb\uae30",
144
+ "open": "\uc0ac\uc774\ub4dc\ubc14 \uc5f4\uae30"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\uc81c\ubaa9 \uc5c6\ub294 \ub300\ud654",
149
+ "menu": {
150
+ "rename": "\uc774\ub984 \ubcc0\uacbd",
151
+ "share": "\uacf5\uc720",
152
+ "delete": "\uc0ad\uc81c"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\ucc44\ud305 \ub9c1\ud06c \uacf5\uc720",
157
+ "button": "\uacf5\uc720",
158
+ "status": {
159
+ "copied": "\ub9c1\ud06c \ubcf5\uc0ac\ub428",
160
+ "created": "\uacf5\uc720 \ub9c1\ud06c\uac00 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4!",
161
+ "unshared": "\uc774 \uc2a4\ub808\ub4dc\uc758 \uacf5\uc720\uac00 \ube44\ud65c\uc131\ud654\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
162
+ },
163
+ "error": {
164
+ "create": "\uacf5\uc720 \ub9c1\ud06c \uc0dd\uc131 \uc2e4\ud328",
165
+ "unshare": "\uc2a4\ub808\ub4dc \uacf5\uc720 \ud574\uc81c \uc2e4\ud328"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\uc0ad\uc81c \ud655\uc778",
170
+ "description": "\uc774\ub807\uac8c \ud558\uba74 \uc2a4\ub808\ub4dc\uc640 \uadf8 \uba54\uc2dc\uc9c0 \ubc0f \uc694\uc18c\uac00 \uc0ad\uc81c\ub429\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc740 \ucde8\uc18c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4",
171
+ "success": "\ucc44\ud305\uc774 \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
172
+ "inProgress": "\ucc44\ud305 \uc0ad\uc81c \uc911"
173
+ },
174
+ "rename": {
175
+ "title": "\uc2a4\ub808\ub4dc \uc774\ub984 \ubcc0\uacbd",
176
+ "description": "\uc774 \uc2a4\ub808\ub4dc\uc758 \uc0c8 \uc774\ub984\uc744 \uc785\ub825\ud558\uc138\uc694",
177
+ "form": {
178
+ "name": {
179
+ "label": "\uc774\ub984",
180
+ "placeholder": "\uc0c8 \uc774\ub984 \uc785\ub825"
181
+ }
182
+ },
183
+ "success": "\uc2a4\ub808\ub4dc \uc774\ub984\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4!",
184
+ "inProgress": "\uc2a4\ub808\ub4dc \uc774\ub984 \ubcc0\uacbd \uc911"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\ucc44\ud305",
192
+ "readme": "\uc77d\uc5b4\ubcf4\uae30",
193
+ "theme": {
194
+ "light": "\ubc1d\uc740 \ud14c\ub9c8",
195
+ "dark": "\uc5b4\ub450\uc6b4 \ud14c\ub9c8",
196
+ "system": "\uc2dc\uc2a4\ud15c \ub530\ub77c\uac00\uae30"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\uc0c8 \ucc44\ud305",
201
+ "dialog": {
202
+ "title": "\uc0c8 \ucc44\ud305 \ub9cc\ub4e4\uae30",
203
+ "description": "\uc774\ub807\uac8c \ud558\uba74 \ud604\uc7ac \ucc44\ud305 \uae30\ub85d\uc774 \uc9c0\uc6cc\uc9d1\ub2c8\ub2e4. \uacc4\uc18d\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
204
+ "tooltip": "\uc0c8 \ucc44\ud305"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\uc124\uc815",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API \ud0a4",
212
+ "logout": "\ub85c\uadf8\uc544\uc6c3"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\ud544\uc694\ud55c API \ud0a4",
218
+ "description": "\uc774 \uc571\uc744 \uc0ac\uc6a9\ud558\ub824\uba74 \ub2e4\uc74c API \ud0a4\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ud0a4\ub294 \uae30\uae30\uc758 \ub85c\uceec \uc800\uc7a5\uc18c\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4.",
219
+ "success": {
220
+ "saved": "\uc131\uacf5\uc801\uc73c\ub85c \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "\uc815\ubcf4",
225
+ "note": "\ucc38\uace0",
226
+ "tip": "\ud301",
227
+ "important": "\uc911\uc694",
228
+ "warning": "\uacbd\uace0",
229
+ "caution": "\uc8fc\uc758",
230
+ "debug": "\ub514\ubc84\uadf8",
231
+ "example": "\uc608\uc2dc",
232
+ "success": "\uc131\uacf5",
233
+ "help": "\ub3c4\uc6c0\ub9d0",
234
+ "idea": "\uc544\uc774\ub514\uc5b4",
235
+ "pending": "\ub300\uae30 \uc911",
236
+ "security": "\ubcf4\uc548",
237
+ "beta": "\ubca0\ud0c0",
238
+ "best-practice": "\ubaa8\ubc94 \uc0ac\ub840"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\uc120\ud0dd..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/ml.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15",
5
+ "confirm": "\u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
6
+ "continue": "\u0d24\u0d41\u0d1f\u0d30\u0d41\u0d15",
7
+ "goBack": "\u0d24\u0d3f\u0d30\u0d3f\u0d15\u0d46 \u0d2a\u0d4b\u0d15\u0d41\u0d15",
8
+ "reset": "\u0d2a\u0d41\u0d28\u0d03\u0d38\u0d1c\u0d4d\u0d1c\u0d2e\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15",
9
+ "submit": "\u0d38\u0d2e\u0d7c\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15"
10
+ },
11
+ "status": {
12
+ "loading": "\u0d32\u0d4b\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41...",
13
+ "error": {
14
+ "default": "\u0d12\u0d30\u0d41 \u0d2a\u0d3f\u0d36\u0d15\u0d4d \u0d38\u0d02\u0d2d\u0d35\u0d3f\u0d1a\u0d4d\u0d1a\u0d41",
15
+ "serverConnection": "\u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d32\u0d4b\u0d17\u0d3f\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
22
+ "form": {
23
+ "email": {
24
+ "label": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d35\u0d3f\u0d32\u0d3e\u0d38\u0d02",
25
+ "required": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d12\u0d30\u0d41 \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f \u0d2b\u0d40\u0d7d\u0d21\u0d4d \u0d06\u0d23\u0d4d",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u0d2a\u0d3e\u0d38\u0d4d\u200c\u0d35\u0d47\u0d21\u0d4d",
30
+ "required": "\u0d2a\u0d3e\u0d38\u0d4d\u200c\u0d35\u0d47\u0d21\u0d4d \u0d12\u0d30\u0d41 \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f \u0d2b\u0d40\u0d7d\u0d21\u0d4d \u0d06\u0d23\u0d4d"
31
+ },
32
+ "actions": {
33
+ "signin": "\u0d38\u0d48\u0d7b \u0d07\u0d7b"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u0d05\u0d32\u0d4d\u0d32\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32",
41
+ "signin": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
42
+ "oauthSignin": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
43
+ "redirectUriMismatch": "\u0d31\u0d40\u0d21\u0d2f\u0d31\u0d15\u0d4d\u0d1f\u0d4d URI oauth \u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d15\u0d4b\u0d7a\u0d2b\u0d3f\u0d17\u0d31\u0d47\u0d37\u0d28\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2a\u0d4a\u0d30\u0d41\u0d24\u0d4d\u0d24\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32",
44
+ "oauthCallback": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
45
+ "oauthCreateAccount": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
46
+ "emailCreateAccount": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
47
+ "callback": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
48
+ "oauthAccountNotLinked": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d35\u0d4d\u0d2f\u0d15\u0d4d\u0d24\u0d3f\u0d24\u0d4d\u0d35\u0d02 \u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b, \u0d06\u0d26\u0d4d\u0d2f\u0d02 \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a \u0d05\u0d24\u0d47 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
49
+ "emailSignin": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d05\u0d2f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32",
50
+ "emailVerify": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d2a\u0d30\u0d3f\u0d36\u0d4b\u0d27\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15, \u0d12\u0d30\u0d41 \u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d05\u0d2f\u0d1a\u0d4d\u0d1a\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d23\u0d4d\u0d1f\u0d4d",
51
+ "credentialsSignin": "\u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41. \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d7e \u0d28\u0d7d\u0d15\u0d3f\u0d2f \u0d35\u0d3f\u0d35\u0d30\u0d19\u0d4d\u0d19\u0d7e \u0d36\u0d30\u0d3f\u0d2f\u0d3e\u0d23\u0d46\u0d28\u0d4d\u0d28\u0d4d \u0d2a\u0d30\u0d3f\u0d36\u0d4b\u0d27\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
52
+ "sessionRequired": "\u0d08 \u0d2a\u0d47\u0d1c\u0d4d \u0d06\u0d15\u0d4d\u0d38\u0d38\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "{{provider}} \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d24\u0d41\u0d1f\u0d30\u0d41\u0d15"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d02 \u0d07\u0d35\u0d3f\u0d1f\u0d46 \u0d1f\u0d48\u0d2a\u0d4d\u0d2a\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15...",
62
+ "actions": {
63
+ "send": "\u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d02 \u0d05\u0d2f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d15",
64
+ "stop": "\u0d1f\u0d3e\u0d38\u0d4d\u0d15\u0d4d \u0d28\u0d3f\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15",
65
+ "attachFiles": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d05\u0d31\u0d4d\u0d31\u0d3e\u0d1a\u0d4d\u0d1a\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15"
66
+ }
67
+ },
68
+ "commands": {
69
+ "button": "\u0d09\u0d2a\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e",
70
+ "changeTool": "\u0d09\u0d2a\u0d15\u0d30\u0d23\u0d02 \u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d41\u0d15",
71
+ "availableTools": "\u0d32\u0d2d\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f \u0d09\u0d2a\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e"
72
+ },
73
+ "speech": {
74
+ "start": "\u0d31\u0d46\u0d15\u0d4d\u0d15\u0d4b\u0d7c\u0d21\u0d3f\u0d02\u0d17\u0d4d \u0d06\u0d30\u0d02\u0d2d\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
75
+ "stop": "\u0d31\u0d46\u0d15\u0d4d\u0d15\u0d4b\u0d7c\u0d21\u0d3f\u0d02\u0d17\u0d4d \u0d28\u0d3f\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15",
76
+ "connecting": "\u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d07\u0d35\u0d3f\u0d1f\u0d46 \u0d35\u0d32\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d1f\u0d41\u0d15",
80
+ "browse": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d24\u0d3f\u0d30\u0d2f\u0d41\u0d15",
81
+ "sizeLimit": "\u0d2a\u0d30\u0d3f\u0d27\u0d3f:",
82
+ "errors": {
83
+ "failed": "\u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41",
84
+ "cancelled": "\u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d3f"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "\u0d05\u0d2a\u0d4d\u200c\u0cb2\u0d4b\u0d21\u0d4d \u0d31\u0d26\u0d4d\u0d26\u0d41\u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
88
+ "removeAttachment": "\u0d05\u0d31\u0d4d\u0d31\u0d3e\u0d1a\u0d4d\u0d1a\u0d4d\u200c\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d4d \u0d28\u0d40\u0d15\u0d4d\u0d15\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41",
94
+ "used": "\u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d41"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u0d15\u0d4d\u0d32\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d\u0d2c\u0d4b\u0d7c\u0d21\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15",
99
+ "success": "\u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u0d38\u0d39\u0d3e\u0d2f\u0d15\u0d30\u0d02",
104
+ "negative": "\u0d38\u0d39\u0d3e\u0d2f\u0d15\u0d30\u0d2e\u0d32\u0d4d\u0d32",
105
+ "edit": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d0e\u0d21\u0d3f\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
106
+ "dialog": {
107
+ "title": "\u0d12\u0d30\u0d41 \u0d15\u0d2e\u0d28\u0d4d\u0d31\u0d4d \u0d1a\u0d47\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d15",
108
+ "submit": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d38\u0d2e\u0d7c\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
109
+ "yourFeedback": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d4d\u0d30\u0d24\u0d3f\u0d15\u0d30\u0d23\u0d02..."
110
+ },
111
+ "status": {
112
+ "updating": "\u0d05\u0d2a\u0d4d\u0d21\u0d47\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41",
113
+ "updated": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d05\u0d2a\u0d4d\u0d21\u0d47\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u0d05\u0d35\u0d38\u0d3e\u0d28 \u0d07\u0d7b\u0d2a\u0d41\u0d1f\u0d4d\u0d1f\u0d41\u0d15\u0d7e",
119
+ "empty": "\u0d12\u0d28\u0d4d\u0d28\u0d41\u0d2e\u0d3f\u0d32\u0d4d\u0d32...",
120
+ "show": "\u0d39\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d31\u0d3f \u0d15\u0d3e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15"
121
+ },
122
+ "settings": {
123
+ "title": "\u0d15\u0d4d\u0d30\u0d2e\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e \u0d2a\u0d3e\u0d28\u0d7d",
124
+ "customize": "\u0d08 \u0d38\u0d2e\u0d2f\u0d02 \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d15\u0d4d\u0d30\u0d2e\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e \u0d15\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d2e\u0d48\u0d38\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15"
125
+ },
126
+ "watermark": "LLM \u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d46\u0d31\u0d4d\u0d31\u0d41\u0d15\u0d7e \u0d35\u0d30\u0d41\u0d24\u0d4d\u0d24\u0d3e\u0d02. \u0d2a\u0d4d\u0d30\u0d27\u0d3e\u0d28\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f \u0d35\u0d3f\u0d35\u0d30\u0d19\u0d4d\u0d19\u0d7e \u0d2a\u0d30\u0d3f\u0d36\u0d4b\u0d27\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d \u0d2a\u0d30\u0d3f\u0d17\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u0d2e\u0d41\u0d7b \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d41\u0d15\u0d7e",
131
+ "filters": {
132
+ "search": "\u0d24\u0d3f\u0d30\u0d2f\u0d41\u0d15",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u0d07\u0d28\u0d4d\u0d28\u0d4d",
137
+ "yesterday": "\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46",
138
+ "previous7days": "\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e 7 \u0d26\u0d3f\u0d35\u0d38\u0d02",
139
+ "previous30days": "\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e 30 \u0d26\u0d3f\u0d35\u0d38\u0d02"
140
+ },
141
+ "empty": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d41\u0d15\u0d7e \u0d15\u0d23\u0d4d\u0d1f\u0d46\u0d24\u0d4d\u0d24\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32",
142
+ "actions": {
143
+ "close": "\u0d38\u0d48\u0d21\u0d4d\u0d2c\u0d3e\u0d7c \u0d05\u0d1f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d15",
144
+ "open": "\u0d38\u0d48\u0d21\u0d4d\u0d2c\u0d3e\u0d7c \u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d15"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d38\u0d02\u0d2d\u0d3e\u0d37\u0d23\u0d02",
149
+ "menu": {
150
+ "rename": "\u0d2a\u0d47\u0d30\u0d4d \u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d41\u0d15",
151
+ "share": "\u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d41\u0d15",
152
+ "delete": "\u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d32\u0d3f\u0d19\u0d4d\u0d15\u0d4d \u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d41\u0d15",
157
+ "button": "\u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d41\u0d15",
158
+ "status": {
159
+ "copied": "\u0d32\u0d3f\u0d19\u0d4d\u0d15\u0d4d \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f",
160
+ "created": "\u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d7d \u0d32\u0d3f\u0d19\u0d4d\u0d15\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d1a\u0d4d\u0d1a\u0d41!",
161
+ "unshared": "\u0d08 \u0d24\u0d4d\u0d30\u0d46\u0d21\u0d3f\u0d28\u0d3e\u0d2f\u0d3f \u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d7d \u0d05\u0d2a\u0d4d\u0d30\u0d3e\u0d2a\u0d4d\u0d24\u0d2e\u0d3e\u0d15\u0d4d\u0d15\u0d3f"
162
+ },
163
+ "error": {
164
+ "create": "\u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d7d \u0d32\u0d3f\u0d19\u0d4d\u0d15\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d7d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41",
165
+ "unshare": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d7d \u0d05\u0d35\u0d38\u0d3e\u0d28\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d7d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
170
+ "description": "\u0d07\u0d24\u0d4d \u0d24\u0d4d\u0d30\u0d46\u0d21\u0d41\u0d02 \u0d05\u0d24\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d02 \u0d18\u0d1f\u0d15\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d02 \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d02. \u0d08 \u0d2a\u0d4d\u0d30\u0d35\u0d7c\u0d24\u0d4d\u0d24\u0d3f \u0d2a\u0d34\u0d2f\u0d2a\u0d1f\u0d3f\u0d2f\u0d3e\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32",
171
+ "success": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41",
172
+ "inProgress": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41"
173
+ },
174
+ "rename": {
175
+ "title": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
176
+ "description": "\u0d08 \u0d24\u0d4d\u0d30\u0d46\u0d21\u0d3f\u0d28\u0d4d \u0d12\u0d30\u0d41 \u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u0d2a\u0d47\u0d30\u0d4d",
180
+ "placeholder": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15"
181
+ }
182
+ },
183
+ "success": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41!",
184
+ "inProgress": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d",
192
+ "readme": "\u0d35\u0d3e\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d",
201
+ "dialog": {
202
+ "title": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
203
+ "description": "\u0d07\u0d24\u0d4d \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d28\u0d3f\u0d32\u0d35\u0d3f\u0d32\u0d46 \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d39\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d31\u0d3f \u0d2e\u0d3e\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d02. \u0d24\u0d41\u0d1f\u0d30\u0d3e\u0d7b \u0d24\u0d3e\u0d7d\u0d2a\u0d4d\u0d2a\u0d30\u0d4d\u0d2f\u0d2e\u0d41\u0d23\u0d4d\u0d1f\u0d4b?",
204
+ "tooltip": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u0d15\u0d4d\u0d30\u0d2e\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API \u0d15\u0d40\u0d15\u0d7e",
212
+ "logout": "\u0d32\u0d4b\u0d17\u0d4d\u0d14\u0d1f\u0d4d\u0d1f\u0d4d"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f API \u0d15\u0d40\u0d15\u0d7e",
218
+ "description": "\u0d08 \u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b, \u0d24\u0d3e\u0d34\u0d46\u0d2a\u0d4d\u0d2a\u0d31\u0d2f\u0d41\u0d28\u0d4d\u0d28 API \u0d15\u0d40\u0d15\u0d7e \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d23\u0d4d. \u0d15\u0d40\u0d15\u0d7e \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d09\u0d2a\u0d15\u0d30\u0d23\u0d24\u0d4d\u0d24\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d32\u0d4b\u0d15\u0d4d\u0d15\u0d7d \u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4b\u0d31\u0d47\u0d1c\u0d3f\u0d7d \u0d38\u0d02\u0d2d\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d28\u0d4d\u0d28\u0d41.",
219
+ "success": {
220
+ "saved": "\u0d35\u0d3f\u0d1c\u0d2f\u0d15\u0d30\u0d2e\u0d3e\u0d2f\u0d3f \u0d38\u0d02\u0d30\u0d15\u0d4d\u0d37\u0d3f\u0d1a\u0d4d\u0d1a\u0d41"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u0d1a\u0d42\u0d23\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/mr.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921",
30
+ "required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947"
31
+ },
32
+ "actions": {
33
+ "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u0915\u093f\u0902\u0935\u093e"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0942 \u0936\u0915\u0924 \u0928\u093e\u0939\u0940",
41
+ "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",
42
+ "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",
43
+ "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",
44
+ "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",
45
+ "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",
46
+ "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",
47
+ "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",
48
+ "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",
49
+ "emailSignin": "\u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0942 \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940",
50
+ "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",
51
+ "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",
52
+ "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"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "{{provider}} \u0938\u0939 \u092a\u0941\u0922\u0947 \u091c\u093e"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u0924\u0941\u092e\u091a\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0947\u0925\u0947 \u091f\u093e\u0907\u092a \u0915\u0930\u093e...",
62
+ "actions": {
63
+ "send": "\u0938\u0902\u0926\u0947\u0936 \u092a\u093e\u0920\u0935\u093e",
64
+ "stop": "\u0915\u093e\u0930\u094d\u092f \u0925\u093e\u0902\u092c\u0935\u093e",
65
+ "attachFiles": "\u092b\u093e\u0907\u0932\u094d\u0938 \u091c\u094b\u0921\u093e"
66
+ }
67
+ },
68
+ "speech": {
69
+ "start": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0938\u0941\u0930\u0942 \u0915\u0930\u093e",
70
+ "stop": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0925\u093e\u0902\u092c\u0935\u093e",
71
+ "connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0924 \u0906\u0939\u0947"
72
+ },
73
+ "commands": {
74
+ "button": "\u0938\u093e\u0927\u0928\u0947",
75
+ "changeTool": "\u0938\u093e\u0927\u0928 \u092c\u0926\u0932\u093e",
76
+ "availableTools": "\u0909\u092a\u0932\u092c\u094d\u0927 \u0938\u093e\u0927\u0928\u0947"
77
+ },
78
+ "fileUpload": {
79
+ "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",
80
+ "browse": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092c\u094d\u0930\u093e\u0909\u091d \u0915\u0930\u093e",
81
+ "sizeLimit": "\u092e\u0930\u094d\u092f\u093e\u0926\u093e:",
82
+ "errors": {
83
+ "failed": "\u0905\u092a\u0932\u094b\u0921 \u0905\u092f\u0936\u0938\u094d\u0935\u0940",
84
+ "cancelled": "\u092f\u093e\u0902\u091a\u0947 \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0947\u0932\u0947"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "\u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0930\u093e",
88
+ "removeAttachment": "\u0905\u091f\u0945\u091a\u092e\u0947\u0902\u091f \u0915\u093e\u0922\u093e"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u0935\u093e\u092a\u0930\u0924 \u0906\u0939\u0947",
94
+ "used": "\u0935\u093e\u092a\u0930\u0932\u0947"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921\u0935\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u093e",
99
+ "success": "\u0915\u0949\u092a\u0940 \u0915\u0947\u0932\u0947!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924",
104
+ "negative": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924 \u0928\u093e\u0939\u0940",
105
+ "edit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u093e",
106
+ "dialog": {
107
+ "title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093e",
108
+ "submit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e",
109
+ "yourFeedback": "\u0924\u0941\u092e\u091a\u0940 \u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e..."
110
+ },
111
+ "status": {
112
+ "updating": "\u0905\u092a\u0921\u0947\u091f \u0915\u0930\u0924 \u0906\u0939\u0947",
113
+ "updated": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0905\u092a\u0921\u0947\u091f \u0915\u0947\u0932\u0947"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u0936\u0947\u0935\u091f\u091a\u0947 \u0907\u0928\u092a\u0941\u091f",
119
+ "empty": "\u0930\u093f\u0915\u093e\u092e\u0947 \u0906\u0939\u0947...",
120
+ "show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093e\u0916\u0935\u093e"
121
+ },
122
+ "settings": {
123
+ "title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c \u092a\u0945\u0928\u0932",
124
+ "customize": "\u092f\u093e \u0935\u0947\u0933\u0940 \u0924\u0941\u092e\u091a\u094d\u092f\u093e \u091a\u0945\u091f \u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c \u0915\u0938\u094d\u091f\u092e\u093e\u0907\u091d \u0915\u0930\u093e"
125
+ },
126
+ "watermark": "LLM \u091a\u0941\u0915\u093e \u0915\u0930\u0942 \u0936\u0915\u0924\u093e\u0924. \u092e\u0939\u0924\u094d\u0924\u094d\u0935\u093e\u091a\u0940 \u092e\u093e\u0939\u093f\u0924\u0940 \u0924\u092a\u093e\u0938\u0923\u094d\u092f\u093e\u091a\u093e \u0935\u093f\u091a\u093e\u0930 \u0915\u0930\u093e."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u092e\u093e\u0917\u0940\u0932 \u091a\u0945\u091f\u094d\u0938",
131
+ "filters": {
132
+ "search": "\u0936\u094b\u0927\u093e",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u0906\u091c",
137
+ "yesterday": "\u0915\u093e\u0932",
138
+ "previous7days": "\u092e\u093e\u0917\u0940\u0932 7 \u0926\u093f\u0935\u0938",
139
+ "previous30days": "\u092e\u093e\u0917\u0940\u0932 30 \u0926\u093f\u0935\u0938"
140
+ },
141
+ "empty": "\u0915\u094b\u0923\u0924\u0947\u0939\u0940 \u0925\u094d\u0930\u0947\u0921 \u0938\u093e\u092a\u0921\u0932\u0947 \u0928\u093e\u0939\u0940\u0924",
142
+ "actions": {
143
+ "close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u093e",
144
+ "open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0909\u0918\u0921\u093e"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0935\u093f\u0930\u0939\u093f\u0924 \u0938\u0902\u092d\u093e\u0937\u0923",
149
+ "menu": {
150
+ "rename": "\u0928\u093e\u0935 \u092c\u0926\u0932\u093e",
151
+ "share": "\u0936\u0947\u0905\u0930 \u0915\u0930\u093e",
152
+ "delete": "\u0939\u091f\u0935\u093e"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u091a\u0945\u091f\u091a\u093e \u0926\u0941\u0935\u093e \u0936\u0947\u0905\u0930 \u0915\u0930\u093e",
157
+ "button": "\u0936\u0947\u0905\u0930 \u0915\u0930\u093e",
158
+ "status": {
159
+ "copied": "\u0926\u0941\u0935\u093e \u0915\u0949\u092a\u0940 \u0915\u0947\u0932\u093e",
160
+ "created": "\u0936\u0947\u0905\u0930 \u0926\u0941\u0935\u093e \u0924\u092f\u093e\u0930 \u091d\u093e\u0932\u093e!",
161
+ "unshared": "\u092f\u093e \u0925\u094d\u0930\u0947\u0921\u0938\u093e\u0920\u0940 \u0936\u0947\u0905\u0930\u093f\u0902\u0917 \u0905\u0915\u094d\u0937\u092e \u0915\u0947\u0932\u0947"
162
+ },
163
+ "error": {
164
+ "create": "\u0936\u0947\u0905\u0930 \u0926\u0941\u0935\u093e \u0924\u092f\u093e\u0930 \u0915\u0930\u0923\u094d\u092f\u093e\u0924 \u0905\u092a\u092f\u0936",
165
+ "unshare": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0936\u0947\u0905\u0930\u093f\u0902\u0917 \u0925\u093e\u0902\u092c\u0935\u0923\u094d\u092f\u093e\u0924 \u0905\u092a\u092f\u0936"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u0939\u091f\u0935\u093f\u0923\u094d\u092f\u093e\u091a\u0940 \u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e",
170
+ "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",
171
+ "success": "\u091a\u0945\u091f \u0939\u091f\u0935\u0932\u093e",
172
+ "inProgress": "\u091a\u0945\u091f \u0939\u091f\u0935\u0924 \u0906\u0939\u0947"
173
+ },
174
+ "rename": {
175
+ "title": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u093e",
176
+ "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",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u0928\u093e\u0935",
180
+ "placeholder": "\u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e"
181
+ }
182
+ },
183
+ "success": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0932\u0947!",
184
+ "inProgress": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0924 \u0906\u0939\u0947"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u091a\u0945\u091f",
192
+ "readme": "\u0935\u093e\u091a\u093e",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f",
201
+ "dialog": {
202
+ "title": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f \u0924\u092f\u093e\u0930 \u0915\u0930\u093e",
203
+ "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?",
204
+ "tooltip": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API \u0915\u0940\u091c",
212
+ "logout": "\u0932\u0949\u0917\u0906\u0909\u091f"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0940\u091c",
218
+ "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.",
219
+ "success": {
220
+ "saved": "\u092f\u0936\u0938\u094d\u0935\u0940\u0930\u093f\u0924\u094d\u092f\u093e \u091c\u0924\u0928 \u0915\u0947\u0932\u0947"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u091a\u0941\u0928\u0947\u0902..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/nl.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "Wachtwoord",
30
+ "required": "wachtwoord is een verplicht veld"
31
+ },
32
+ "actions": {
33
+ "signin": "Inloggen"
34
+ },
35
+ "alternativeText": {
36
+ "or": "OF"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "Kan niet inloggen",
41
+ "signin": "Probeer in te loggen met een ander account",
42
+ "oauthSignin": "Probeer in te loggen met een ander account",
43
+ "redirectUriMismatch": "De redirect URI komt niet overeen met de oauth app configuratie",
44
+ "oauthCallback": "Probeer in te loggen met een ander account",
45
+ "oauthCreateAccount": "Probeer in te loggen met een ander account",
46
+ "emailCreateAccount": "Probeer in te loggen met een ander account",
47
+ "callback": "Probeer in te loggen met een ander account",
48
+ "oauthAccountNotLinked": "Om je identiteit te bevestigen, log in met hetzelfde account dat je oorspronkelijk hebt gebruikt",
49
+ "emailSignin": "De e-mail kon niet worden verzonden",
50
+ "emailVerify": "Verifieer je e-mail, er is een nieuwe e-mail verzonden",
51
+ "credentialsSignin": "Inloggen mislukt. Controleer of de ingevoerde gegevens correct zijn",
52
+ "sessionRequired": "Log in om toegang te krijgen tot deze pagina"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "Doorgaan met {{provider}}"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "Typ hier je bericht...",
62
+ "actions": {
63
+ "send": "Bericht versturen",
64
+ "stop": "Taak stoppen",
65
+ "attachFiles": "Bestanden bijvoegen"
66
+ }
67
+ },
68
+ "speech": {
69
+ "start": "Start opname",
70
+ "stop": "Stop opname",
71
+ "connecting": "Verbinden"
72
+ },
73
+ "fileUpload": {
74
+ "dragDrop": "Sleep bestanden hierheen",
75
+ "browse": "Bestanden zoeken",
76
+ "sizeLimit": "Limiet:",
77
+ "errors": {
78
+ "failed": "Uploaden mislukt",
79
+ "cancelled": "Upload geannuleerd van"
80
+ },
81
+ "actions": {
82
+ "cancelUpload": "Annuleer upload",
83
+ "removeAttachment": "Verwijder bijlage"
84
+ }
85
+ },
86
+ "commands": {
87
+ "button": "Hulpmiddelen",
88
+ "changeTool": "Wijzig hulpmiddel",
89
+ "availableTools": "Beschikbare hulpmiddelen"
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "In gebruik",
94
+ "used": "Gebruikt"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "Kopi\u00ebren naar klembord",
99
+ "success": "Gekopieerd!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "Nuttig",
104
+ "negative": "Niet nuttig",
105
+ "edit": "Feedback bewerken",
106
+ "dialog": {
107
+ "title": "Voeg een opmerking toe",
108
+ "submit": "Feedback versturen",
109
+ "yourFeedback": "Je feedback..."
110
+ },
111
+ "status": {
112
+ "updating": "Bijwerken",
113
+ "updated": "Feedback bijgewerkt"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "Laatste invoer",
119
+ "empty": "Zo leeg...",
120
+ "show": "Toon geschiedenis"
121
+ },
122
+ "settings": {
123
+ "title": "Instellingenpaneel",
124
+ "customize": "Pas hier je chatinstellingen aan"
125
+ },
126
+ "watermark": "LLM's kunnen fouten maken. Overweeg het controleren van belangrijke informatie."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "Eerdere chats",
131
+ "filters": {
132
+ "search": "Zoeken",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "Vandaag",
137
+ "yesterday": "Gisteren",
138
+ "previous7days": "Afgelopen 7 dagen",
139
+ "previous30days": "Afgelopen 30 dagen"
140
+ },
141
+ "empty": "Geen gesprekken gevonden",
142
+ "actions": {
143
+ "close": "Zijbalk sluiten",
144
+ "open": "Zijbalk openen"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "Naamloos gesprek",
149
+ "menu": {
150
+ "rename": "Hernoemen",
151
+ "share": "Delen",
152
+ "delete": "Verwijderen"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "Deel link naar chat",
157
+ "button": "Delen",
158
+ "status": {
159
+ "copied": "Link gekopieerd",
160
+ "created": "Deellink gemaakt!",
161
+ "unshared": "Delen uitgeschakeld voor dit gesprek"
162
+ },
163
+ "error": {
164
+ "create": "Aanmaken van deellink mislukt",
165
+ "unshare": "Delen van gesprek stoppen mislukt"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "Verwijdering bevestigen",
170
+ "description": "Dit zal het gesprek en bijbehorende berichten en elementen verwijderen. Deze actie kan niet ongedaan worden gemaakt",
171
+ "success": "Chat verwijderd",
172
+ "inProgress": "Chat verwijderen"
173
+ },
174
+ "rename": {
175
+ "title": "Gesprek hernoemen",
176
+ "description": "Voer een nieuwe naam in voor dit gesprek",
177
+ "form": {
178
+ "name": {
179
+ "label": "Naam",
180
+ "placeholder": "Voer nieuwe naam in"
181
+ }
182
+ },
183
+ "success": "Gesprek hernoemd!",
184
+ "inProgress": "Gesprek hernoemen"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "Chat",
192
+ "readme": "Leesmij",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "Nieuwe chat",
201
+ "dialog": {
202
+ "title": "Nieuwe chat aanmaken",
203
+ "description": "Dit zal je huidige chatgeschiedenis wissen. Weet je zeker dat je door wilt gaan?",
204
+ "tooltip": "Nieuwe chat"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "Instellingen",
210
+ "settingsKey": "I",
211
+ "apiKeys": "API-sleutels",
212
+ "logout": "Uitloggen"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "Vereiste API-sleutels",
218
+ "description": "Om deze app te gebruiken zijn de volgende API-sleutels vereist. De sleutels worden opgeslagen in de lokale opslag van je apparaat.",
219
+ "success": {
220
+ "saved": "Succesvol opgeslagen"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "Selecteer..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/ta.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd",
5
+ "confirm": "\u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1",
6
+ "continue": "\u0ba4\u0bca\u0b9f\u0bb0\u0bcd\u0b95",
7
+ "goBack": "\u0ba4\u0bbf\u0bb0\u0bc1\u0bae\u0bcd\u0baa\u0bbf\u0b9a\u0bcd \u0b9a\u0bc6\u0bb2\u0bcd",
8
+ "reset": "\u0bae\u0bc0\u0b9f\u0bcd\u0b9f\u0bae\u0bc8",
9
+ "submit": "\u0b9a\u0bae\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bbf"
10
+ },
11
+ "status": {
12
+ "loading": "\u0b8f\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1...",
13
+ "error": {
14
+ "default": "\u0baa\u0bbf\u0bb4\u0bc8 \u0b8f\u0bb1\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1",
15
+ "serverConnection": "\u0b9a\u0bc7\u0bb5\u0bc8\u0baf\u0b95\u0ba4\u0bcd\u0ba4\u0bc8 \u0b85\u0b9f\u0bc8\u0baf \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc8 \u0b85\u0ba3\u0bc1\u0b95 \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd",
22
+ "form": {
23
+ "email": {
24
+ "label": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf",
25
+ "required": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 \u0baa\u0bc1\u0bb2\u0bae\u0bcd",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u0b95\u0b9f\u0bb5\u0bc1\u0b9a\u0bcd\u0b9a\u0bca\u0bb2\u0bcd",
30
+ "required": "\u0b95\u0b9f\u0bb5\u0bc1\u0b9a\u0bcd\u0b9a\u0bca\u0bb2\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 \u0baa\u0bc1\u0bb2\u0bae\u0bcd"
31
+ },
32
+ "actions": {
33
+ "signin": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0b95"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8",
41
+ "signin": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
42
+ "oauthSignin": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
43
+ "redirectUriMismatch": "\u0ba4\u0bbf\u0b9a\u0bc8\u0ba4\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bb2\u0bcd URI \u0b93\u0b86\u0ba4\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1 \u0b95\u0b9f\u0bcd\u0b9f\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b9f\u0ba9\u0bcd \u0baa\u0bca\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8",
44
+ "oauthCallback": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
45
+ "oauthCreateAccount": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
46
+ "emailCreateAccount": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
47
+ "callback": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
48
+ "oauthAccountNotLinked": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b85\u0b9f\u0bc8\u0baf\u0bbe\u0bb3\u0ba4\u0bcd\u0ba4\u0bc8 \u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4, \u0bae\u0bc1\u0ba4\u0bb2\u0bbf\u0bb2\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0baf \u0b85\u0ba4\u0bc7 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd",
49
+ "emailSignin": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bc8 \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8",
50
+ "emailVerify": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd, \u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bc1",
51
+ "credentialsSignin": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0bb5\u0bc1 \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0b9f\u0bc8\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1. \u0ba8\u0bc0\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bb5\u0bb4\u0b99\u0bcd\u0b95\u0bbf\u0baf \u0bb5\u0bbf\u0bb5\u0bb0\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bb0\u0bbf\u0baf\u0bbe\u0ba9\u0bb5\u0bc8 \u0b8e\u0ba9 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
52
+ "sessionRequired": "\u0b87\u0ba8\u0bcd\u0ba4\u0baa\u0bcd \u0baa\u0b95\u0bcd\u0b95\u0ba4\u0bcd\u0ba4\u0bc8 \u0b85\u0ba3\u0bc1\u0b95 \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "{{provider}} \u0bae\u0bc2\u0bb2\u0bae\u0bcd \u0ba4\u0bca\u0b9f\u0bb0\u0bb5\u0bc1\u0bae\u0bcd"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0baf\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc7 \u0ba4\u0b9f\u0bcd\u0b9f\u0b9a\u0bcd\u0b9a\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0bb5\u0bc1\u0bae\u0bcd...",
62
+ "actions": {
63
+ "send": "\u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa\u0bc1",
64
+ "stop": "\u0baa\u0ba3\u0bbf\u0baf\u0bc8 \u0ba8\u0bbf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1",
65
+ "attachFiles": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b87\u0ba3\u0bc8"
66
+ }
67
+ },
68
+ "commands": {
69
+ "button": "\u0b95\u0bb0\u0bc1\u0bb5\u0bbf\u0b95\u0bb3\u0bcd",
70
+ "changeTool": "\u0b95\u0bb0\u0bc1\u0bb5\u0bbf\u0baf\u0bc8 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bb5\u0bc1\u0bae\u0bcd",
71
+ "availableTools": "\u0b95\u0bbf\u0b9f\u0bc8\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd \u0b95\u0bb0\u0bc1\u0bb5\u0bbf\u0b95\u0bb3\u0bcd"
72
+ },
73
+ "speech": {
74
+ "start": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc1 \u0ba4\u0bca\u0b9f\u0b99\u0bcd\u0b95\u0bc1",
75
+ "stop": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc8 \u0ba8\u0bbf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1",
76
+ "connecting": "\u0b87\u0ba3\u0bc8\u0b95\u0bcd\u0b95\u0bbf\u0bb1\u0ba4\u0bc1"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc7 \u0b87\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1 \u0bb5\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd",
80
+ "browse": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b89\u0bb2\u0bbe\u0bb5\u0bc1",
81
+ "sizeLimit": "\u0bb5\u0bb0\u0bae\u0bcd\u0baa\u0bc1:",
82
+ "errors": {
83
+ "failed": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc7\u0bb1\u0bcd\u0bb1\u0bae\u0bcd \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0b9f\u0bc8\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1",
84
+ "cancelled": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc7\u0bb1\u0bcd\u0bb1\u0bae\u0bcd \u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "\u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd",
88
+ "removeAttachment": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc8 \u0b85\u0b95\u0bb1\u0bcd\u0bb1\u0bc1"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1",
94
+ "used": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u0b95\u0bbf\u0bb3\u0bbf\u0baa\u0bcd\u0baa\u0bcb\u0bb0\u0bcd\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1",
99
+ "success": "\u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u0baa\u0baf\u0ba9\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bbe\u0b95 \u0b87\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1",
104
+ "negative": "\u0baa\u0baf\u0ba9\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bbe\u0b95 \u0b87\u0bb2\u0bcd\u0bb2\u0bc8",
105
+ "edit": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8 \u0ba4\u0bbf\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1",
106
+ "dialog": {
107
+ "title": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8\u0b9a\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd",
108
+ "submit": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8 \u0b9a\u0bae\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bbf",
109
+ "yourFeedback": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1..."
110
+ },
111
+ "status": {
112
+ "updating": "\u0baa\u0bc1\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb1\u0ba4\u0bc1",
113
+ "updated": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1 \u0baa\u0bc1\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u0b95\u0b9f\u0bc8\u0b9a\u0bbf \u0b89\u0bb3\u0bcd\u0bb3\u0bc0\u0b9f\u0bc1\u0b95\u0bb3\u0bcd",
119
+ "empty": "\u0b95\u0bbe\u0bb2\u0bbf\u0baf\u0bbe\u0b95 \u0b89\u0bb3\u0bcd\u0bb3\u0ba4\u0bc1...",
120
+ "show": "\u0bb5\u0bb0\u0bb2\u0bbe\u0bb1\u0bcd\u0bb1\u0bc8\u0b95\u0bcd \u0b95\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1"
121
+ },
122
+ "settings": {
123
+ "title": "\u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd \u0baa\u0bb2\u0b95\u0bae\u0bcd",
124
+ "customize": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc7 \u0ba4\u0ba9\u0bbf\u0baa\u0bcd\u0baa\u0baf\u0ba9\u0bbe\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd"
125
+ },
126
+ "watermark": "LLM \u0b95\u0bb3\u0bcd \u0ba4\u0bb5\u0bb1\u0bc1\u0b95\u0bb3\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0bb2\u0bbe\u0bae\u0bcd. \u0bae\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0baf\u0bae\u0bbe\u0ba9 \u0ba4\u0b95\u0bb5\u0bb2\u0bcd\u0b95\u0bb3\u0bc8\u0b9a\u0bcd \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0ba4\u0bc8\u0b95\u0bcd \u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0bb2\u0bcd \u0b95\u0bca\u0bb3\u0bcd\u0bb3\u0bc1\u0b99\u0bcd\u0b95\u0bb3\u0bcd."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd\u0b95\u0bb3\u0bcd",
131
+ "filters": {
132
+ "search": "\u0ba4\u0bc7\u0b9f\u0bc1",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u0b87\u0ba9\u0bcd\u0bb1\u0bc1",
137
+ "yesterday": "\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1",
138
+ "previous7days": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 7 \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",
139
+ "previous30days": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 30 \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd"
140
+ },
141
+ "empty": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd\u0b95\u0bb3\u0bcd \u0b8e\u0ba4\u0bc1\u0bb5\u0bc1\u0bae\u0bcd \u0b87\u0bb2\u0bcd\u0bb2\u0bc8",
142
+ "actions": {
143
+ "close": "\u0baa\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bc8 \u0bae\u0bc2\u0b9f\u0bc1",
144
+ "open": "\u0baa\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bc8 \u0ba4\u0bbf\u0bb1"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bbf\u0b9f\u0bbe\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd",
149
+ "menu": {
150
+ "rename": "\u0baa\u0bc6\u0baf\u0bb0\u0bcd \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1",
151
+ "share": "\u0baa\u0b95\u0bbf\u0bb0\u0bcd",
152
+ "delete": "\u0b85\u0bb4\u0bbf"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc8 \u0baa\u0b95\u0bbf\u0bb0\u0bb5\u0bc1\u0bae\u0bcd",
157
+ "button": "\u0baa\u0b95\u0bbf\u0bb0\u0bcd",
158
+ "status": {
159
+ "copied": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1",
160
+ "created": "\u0baa\u0b95\u0bbf\u0bb0\u0bcd\u0bb5\u0bc1 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b89\u0bb0\u0bc1\u0bb5\u0bbe\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1!",
161
+ "unshared": "\u0b87\u0ba8\u0bcd\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0baa\u0b95\u0bbf\u0bb0\u0bcd\u0bb5\u0bc1 \u0bae\u0bc1\u0b9f\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1"
162
+ },
163
+ "error": {
164
+ "create": "\u0baa\u0b95\u0bbf\u0bb0\u0bcd\u0bb5\u0bc1 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc8 \u0b89\u0bb0\u0bc1\u0bb5\u0bbe\u0b95\u0bcd\u0b95 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8",
165
+ "unshare": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0baa\u0b95\u0bbf\u0bb0\u0bcd\u0bb5\u0bc8 \u0ba8\u0bbf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0bb5\u0ba4\u0bc8 \u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1",
170
+ "description": "\u0b87\u0ba4\u0bc1 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0b85\u0ba4\u0ba9\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0b95\u0bb3\u0bcd, \u0b89\u0bb1\u0bc1\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd. \u0b87\u0ba8\u0bcd\u0ba4 \u0b9a\u0bc6\u0baf\u0bb2\u0bc8 \u0bae\u0bc0\u0b9f\u0bcd\u0b9f\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bbe\u0ba4\u0bc1",
171
+ "success": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1",
172
+ "inProgress": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1"
173
+ },
174
+ "rename": {
175
+ "title": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0bc1",
176
+ "description": "\u0b87\u0ba8\u0bcd\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0baa\u0bc6\u0baf\u0bb0\u0bc8 \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u0baa\u0bc6\u0baf\u0bb0\u0bcd",
180
+ "placeholder": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0baa\u0bc6\u0baf\u0bb0\u0bc8 \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd"
181
+ }
182
+ },
183
+ "success": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1!",
184
+ "inProgress": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd",
192
+ "readme": "\u0baa\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd",
201
+ "dialog": {
202
+ "title": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0b89\u0bb0\u0bc1\u0bb5\u0bbe\u0b95\u0bcd\u0b95\u0bc1",
203
+ "description": "\u0b87\u0ba4\u0bc1 \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0ba4\u0bb1\u0bcd\u0baa\u0bcb\u0ba4\u0bc8\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bb5\u0bb0\u0bb2\u0bbe\u0bb1\u0bcd\u0bb1\u0bc8 \u0b85\u0bb4\u0bbf\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd. \u0ba4\u0bca\u0b9f\u0bb0 \u0bb5\u0bbf\u0bb0\u0bc1\u0bae\u0bcd\u0baa\u0bc1\u0b95\u0bbf\u0bb1\u0bc0\u0bb0\u0bcd\u0b95\u0bb3\u0bbe?",
204
+ "tooltip": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd",
212
+ "logout": "\u0bb5\u0bc6\u0bb3\u0bbf\u0baf\u0bc7\u0bb1\u0bc1"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd",
218
+ "description": "\u0b87\u0ba8\u0bcd\u0ba4 \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc8\u0baa\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4, \u0baa\u0bbf\u0ba9\u0bcd\u0bb5\u0bb0\u0bc1\u0bae\u0bcd API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8. \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bbe\u0ba4\u0ba9\u0ba4\u0bcd\u0ba4\u0bbf\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0bc2\u0bb0\u0bcd \u0b9a\u0bc7\u0bae\u0bbf\u0baa\u0bcd\u0baa\u0b95\u0ba4\u0bcd\u0ba4\u0bbf\u0bb2\u0bcd \u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0bae\u0bcd.",
219
+ "success": {
220
+ "saved": "\u0bb5\u0bc6\u0bb1\u0bcd\u0bb1\u0bbf\u0b95\u0bb0\u0bae\u0bbe\u0b95 \u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u0ba4\u0bc7\u0bb0\u0bcd\u0ba8\u0bcd\u0ba4\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/te.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
5
+ "confirm": "\u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
6
+ "continue": "\u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
7
+ "goBack": "\u0c35\u0c46\u0c28\u0c15\u0c4d\u0c15\u0c3f \u0c35\u0c46\u0c33\u0c4d\u0c33\u0c02\u0c21\u0c3f",
8
+ "reset": "\u0c30\u0c40\u0c38\u0c46\u0c1f\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
9
+ "submit": "\u0c38\u0c2e\u0c30\u0c4d\u0c2a\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
10
+ },
11
+ "status": {
12
+ "loading": "\u0c32\u0c4b\u0c21\u0c4d \u0c05\u0c35\u0c41\u0c24\u0c4b\u0c02\u0c26\u0c3f...",
13
+ "error": {
14
+ "default": "\u0c32\u0c4b\u0c2a\u0c02 \u0c38\u0c02\u0c2d\u0c35\u0c3f\u0c02\u0c1a\u0c3f\u0c02\u0c26\u0c3f",
15
+ "serverConnection": "\u0c38\u0c30\u0c4d\u0c35\u0c30\u0c4d\u200c\u0c28\u0c3f \u0c1a\u0c47\u0c30\u0c41\u0c15\u0c4b\u0c32\u0c47\u0c15\u0c2a\u0c4b\u0c2f\u0c3e\u0c2e\u0c41"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c32\u0c3e\u0c17\u0c3f\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
22
+ "form": {
23
+ "email": {
24
+ "label": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c1a\u0c3f\u0c30\u0c41\u0c28\u0c3e\u0c2e\u0c3e",
25
+ "required": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c24\u0c2a\u0c4d\u0c2a\u0c28\u0c3f\u0c38\u0c30\u0c3f",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u0c2a\u0c3e\u0c38\u0c4d\u200c\u0c35\u0c30\u0c4d\u0c21\u0c4d",
30
+ "required": "\u0c2a\u0c3e\u0c38\u0c4d\u200c\u0c35\u0c30\u0c4d\u0c21\u0c4d \u0c24\u0c2a\u0c4d\u0c2a\u0c28\u0c3f\u0c38\u0c30\u0c3f"
31
+ },
32
+ "actions": {
33
+ "signin": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u0c32\u0c47\u0c26\u0c3e"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c15\u0c2a\u0c4b\u0c2f\u0c3e\u0c2e\u0c41",
41
+ "signin": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
42
+ "oauthSignin": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
43
+ "redirectUriMismatch": "\u0c30\u0c40\u0c21\u0c48\u0c30\u0c46\u0c15\u0c4d\u0c1f\u0c4d URI oauth \u0c2f\u0c3e\u0c2a\u0c4d \u0c15\u0c3e\u0c28\u0c4d\u0c2b\u0c3f\u0c17\u0c30\u0c47\u0c37\u0c28\u0c4d\u200c\u0c24\u0c4b \u0c38\u0c30\u0c3f\u0c2a\u0c4b\u0c32\u0c21\u0c02 \u0c32\u0c47\u0c26\u0c41",
44
+ "oauthCallback": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
45
+ "oauthCreateAccount": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
46
+ "emailCreateAccount": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
47
+ "callback": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
48
+ "oauthAccountNotLinked": "\u0c2e\u0c40 \u0c17\u0c41\u0c30\u0c4d\u0c24\u0c3f\u0c02\u0c2a\u0c41\u0c28\u0c41 \u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f, \u0c2e\u0c40\u0c30\u0c41 \u0c2e\u0c4a\u0c26\u0c1f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c3f\u0c28 \u0c05\u0c26\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
49
+ "emailSignin": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2a\u0c02\u0c2a\u0c21\u0c02 \u0c38\u0c3e\u0c27\u0c4d\u0c2f\u0c02 \u0c15\u0c3e\u0c32\u0c47\u0c26\u0c41",
50
+ "emailVerify": "\u0c26\u0c2f\u0c1a\u0c47\u0c38\u0c3f \u0c2e\u0c40 \u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d\u200c\u0c28\u0c3f \u0c27\u0c43\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f, \u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2a\u0c02\u0c2a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f",
51
+ "credentialsSignin": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f. \u0c2e\u0c40\u0c30\u0c41 \u0c05\u0c02\u0c26\u0c3f\u0c02\u0c1a\u0c3f\u0c28 \u0c35\u0c3f\u0c35\u0c30\u0c3e\u0c32\u0c41 \u0c38\u0c30\u0c48\u0c28\u0c35\u0c47\u0c28\u0c3e \u0c05\u0c28\u0c3f \u0c24\u0c28\u0c3f\u0c16\u0c40 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
52
+ "sessionRequired": "\u0c08 \u0c2a\u0c47\u0c1c\u0c40\u0c28\u0c3f \u0c2f\u0c3e\u0c15\u0c4d\u0c38\u0c46\u0c38\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c26\u0c2f\u0c1a\u0c47\u0c38\u0c3f \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "{{provider}}\u0c24\u0c4b \u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u0c2e\u0c40 \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c1f\u0c48\u0c2a\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f...",
62
+ "actions": {
63
+ "send": "\u0c38\u0c02\u0c26\u0c47\u0c36\u0c02 \u0c2a\u0c02\u0c2a\u0c02\u0c21\u0c3f",
64
+ "stop": "\u0c2a\u0c28\u0c3f \u0c06\u0c2a\u0c02\u0c21\u0c3f",
65
+ "attachFiles": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d \u0c1c\u0c4b\u0c21\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
66
+ }
67
+ },
68
+ "speech": {
69
+ "start": "\u0c30\u0c3f\u0c15\u0c3e\u0c30\u0c4d\u0c21\u0c3f\u0c02\u0c17\u0c4d \u0c2a\u0c4d\u0c30\u0c3e\u0c30\u0c02\u0c2d\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
70
+ "stop": "\u0c30\u0c3f\u0c15\u0c3e\u0c30\u0c4d\u0c21\u0c3f\u0c02\u0c17\u0c4d \u0c06\u0c2a\u0c02\u0c21\u0c3f",
71
+ "connecting": "\u0c05\u0c28\u0c41\u0c38\u0c02\u0c27\u0c3e\u0c28\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f"
72
+ },
73
+ "commands": {
74
+ "button": "\u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c3e\u0c32\u0c41",
75
+ "changeTool": "\u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c02\u0c21\u0c3f",
76
+ "availableTools": "\u0c32\u0c2d\u0c4d\u0c2f\u0c2e\u0c48\u0c28 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c3e\u0c32\u0c41"
77
+ },
78
+ "fileUpload": {
79
+ "dragDrop": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d\u200c\u0c28\u0c3f \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c21\u0c4d\u0c30\u0c3e\u0c17\u0c4d \u0c1a\u0c47\u0c38\u0c3f \u0c21\u0c4d\u0c30\u0c3e\u0c2a\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
80
+ "browse": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d \u0c2c\u0c4d\u0c30\u0c4c\u0c1c\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
81
+ "sizeLimit": "\u0c2a\u0c30\u0c3f\u0c2e\u0c3f\u0c24\u0c3f:",
82
+ "errors": {
83
+ "failed": "\u0c05\u0c2a\u0c4d\u200c\u0c32\u0c4b\u0c21\u0c4d \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f",
84
+ "cancelled": "\u0c05\u0c2a\u0c4d\u200c\u0c32\u0c4b\u0c21\u0c4d \u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
85
+ },
86
+ "actions": {
87
+ "cancelUpload": "\u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
88
+ "removeAttachment": "\u0c05\u0c28\u0c41\u0c2c\u0c02\u0c27\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
89
+ }
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f",
94
+ "used": "\u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u0c15\u0c4d\u0c32\u0c3f\u0c2a\u0c4d\u200c\u0c2c\u0c4b\u0c30\u0c4d\u0c21\u0c4d\u200c\u0c15\u0c3f \u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
99
+ "success": "\u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u0c38\u0c39\u0c3e\u0c2f\u0c15\u0c30\u0c02",
104
+ "negative": "\u0c38\u0c39\u0c3e\u0c2f\u0c15\u0c30\u0c02 \u0c15\u0c3e\u0c26\u0c41",
105
+ "edit": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c38\u0c35\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
106
+ "dialog": {
107
+ "title": "\u0c35\u0c4d\u0c2f\u0c3e\u0c16\u0c4d\u0c2f \u0c1c\u0c4b\u0c21\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
108
+ "submit": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c38\u0c2e\u0c30\u0c4d\u0c2a\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
109
+ "yourFeedback": "\u0c2e\u0c40 \u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c02..."
110
+ },
111
+ "status": {
112
+ "updating": "\u0c28\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f",
113
+ "updated": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c02 \u0c28\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u0c1a\u0c3f\u0c35\u0c30\u0c3f \u0c07\u0c28\u0c4d\u200c\u0c2a\u0c41\u0c1f\u0c4d\u200c\u0c32\u0c41",
119
+ "empty": "\u0c16\u0c3e\u0c33\u0c40\u0c17\u0c3e \u0c09\u0c02\u0c26\u0c3f...",
120
+ "show": "\u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30\u0c28\u0c41 \u0c1a\u0c42\u0c2a\u0c3f\u0c02\u0c1a\u0c41"
121
+ },
122
+ "settings": {
123
+ "title": "\u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32 \u0c2a\u0c4d\u0c2f\u0c3e\u0c28\u0c46\u0c32\u0c4d",
124
+ "customize": "\u0c2e\u0c40 \u0c1a\u0c3e\u0c1f\u0c4d \u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32\u0c28\u0c41 \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c05\u0c28\u0c41\u0c15\u0c42\u0c32\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
125
+ },
126
+ "watermark": "LLM\u0c32\u0c41 \u0c24\u0c2a\u0c4d\u0c2a\u0c41\u0c32\u0c41 \u0c1a\u0c47\u0c2f\u0c35\u0c1a\u0c4d\u0c1a\u0c41. \u0c2e\u0c41\u0c16\u0c4d\u0c2f\u0c2e\u0c48\u0c28 \u0c38\u0c2e\u0c3e\u0c1a\u0c3e\u0c30\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c24\u0c28\u0c3f\u0c16\u0c40 \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c2a\u0c30\u0c3f\u0c17\u0c23\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f."
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u0c17\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c32\u0c41",
131
+ "filters": {
132
+ "search": "\u0c35\u0c46\u0c24\u0c15\u0c02\u0c21\u0c3f",
133
+ "placeholder": "Search conversations..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u0c08\u0c30\u0c4b\u0c1c\u0c41",
137
+ "yesterday": "\u0c28\u0c3f\u0c28\u0c4d\u0c28",
138
+ "previous7days": "\u0c17\u0c24 7 \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",
139
+ "previous30days": "\u0c17\u0c24 30 \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41"
140
+ },
141
+ "empty": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c32\u0c41 \u0c15\u0c28\u0c41\u0c17\u0c4a\u0c28\u0c2c\u0c21\u0c32\u0c47\u0c26\u0c41",
142
+ "actions": {
143
+ "close": "\u0c38\u0c48\u0c21\u0c4d\u200c\u0c2c\u0c3e\u0c30\u0c4d \u0c2e\u0c42\u0c38\u0c3f\u0c35\u0c47\u0c2f\u0c02\u0c21\u0c3f",
144
+ "open": "\u0c38\u0c48\u0c21\u0c4d\u200c\u0c2c\u0c3e\u0c30\u0c4d \u0c24\u0c46\u0c30\u0c35\u0c02\u0c21\u0c3f"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u0c2a\u0c47\u0c30\u0c41 \u0c32\u0c47\u0c28\u0c3f \u0c38\u0c02\u0c2d\u0c3e\u0c37\u0c23",
149
+ "menu": {
150
+ "rename": "\u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c02\u0c21\u0c3f",
151
+ "share": "\u0c37\u0c47\u0c30\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
152
+ "delete": "\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u0c1a\u0c3e\u0c1f\u0c4d \u0c32\u0c3f\u0c02\u0c15\u0c4d\u200c\u0c28\u0c41 \u0c37\u0c47\u0c30\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
157
+ "button": "\u0c37\u0c47\u0c30\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
158
+ "status": {
159
+ "copied": "\u0c32\u0c3f\u0c02\u0c15\u0c4d \u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f",
160
+ "created": "\u0c37\u0c47\u0c30\u0c4d \u0c32\u0c3f\u0c02\u0c15\u0c4d \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!",
161
+ "unshared": "\u0c08 \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c15\u0c41 \u0c37\u0c47\u0c30\u0c3f\u0c02\u0c17\u0c4d \u0c06\u0c2a\u0c3f\u0c35\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
162
+ },
163
+ "error": {
164
+ "create": "\u0c37\u0c47\u0c30\u0c4d \u0c32\u0c3f\u0c02\u0c15\u0c4d \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c21\u0c02 \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f",
165
+ "unshare": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c37\u0c47\u0c30\u0c3f\u0c02\u0c17\u0c4d \u0c28\u0c3f\u0c32\u0c3f\u0c2a\u0c3f\u0c35\u0c47\u0c2f\u0c21\u0c02 \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c2a\u0c41\u0c28\u0c41 \u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
170
+ "description": "\u0c07\u0c26\u0c3f \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c24\u0c4b \u0c2a\u0c3e\u0c1f\u0c41 \u0c26\u0c3e\u0c28\u0c3f \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c32\u0c28\u0c41 \u0c2e\u0c30\u0c3f\u0c2f\u0c41 \u0c05\u0c02\u0c36\u0c3e\u0c32\u0c28\u0c41 \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f. \u0c08 \u0c1a\u0c30\u0c4d\u0c2f\u0c28\u0c41 \u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c30\u0c41",
171
+ "success": "\u0c1a\u0c3e\u0c1f\u0c4d \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f",
172
+ "inProgress": "\u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c28\u0c3f \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f"
173
+ },
174
+ "rename": {
175
+ "title": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c02\u0c21\u0c3f",
176
+ "description": "\u0c08 \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c15\u0c4b\u0c38\u0c02 \u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c47\u0c30\u0c41\u0c28\u0c41 \u0c28\u0c2e\u0c4b\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u0c2a\u0c47\u0c30\u0c41",
180
+ "placeholder": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c47\u0c30\u0c41\u0c28\u0c41 \u0c28\u0c2e\u0c4b\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f"
181
+ }
182
+ },
183
+ "success": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!",
184
+ "inProgress": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c41\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u0c1a\u0c3e\u0c1f\u0c4d",
192
+ "readme": "\u0c1a\u0c26\u0c35\u0c02\u0c21\u0c3f",
193
+ "theme": {
194
+ "light": "Light Theme",
195
+ "dark": "Dark Theme",
196
+ "system": "Follow System"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d",
201
+ "dialog": {
202
+ "title": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
203
+ "description": "\u0c07\u0c26\u0c3f \u0c2e\u0c40 \u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d \u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30\u0c28\u0c41 \u0c24\u0c41\u0c21\u0c3f\u0c1a\u0c3f\u0c35\u0c47\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f. \u0c2e\u0c40\u0c30\u0c41 \u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c3e\u0c32\u0c28\u0c41\u0c15\u0c41\u0c02\u0c1f\u0c41\u0c28\u0c4d\u0c28\u0c3e\u0c30\u0c3e?",
204
+ "tooltip": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32\u0c41",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API \u0c15\u0c40\u0c32\u0c41",
212
+ "logout": "\u0c32\u0c3e\u0c17\u0c4d \u0c05\u0c35\u0c41\u0c1f\u0c4d"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u0c05\u0c35\u0c38\u0c30\u0c2e\u0c48\u0c28 API \u0c15\u0c40\u0c32\u0c41",
218
+ "description": "\u0c08 \u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f, \u0c15\u0c3f\u0c02\u0c26\u0c3f API \u0c15\u0c40\u0c32\u0c41 \u0c05\u0c35\u0c38\u0c30\u0c02. \u0c15\u0c40\u0c32\u0c41 \u0c2e\u0c40 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02 \u0c2f\u0c4a\u0c15\u0c4d\u0c15 \u0c38\u0c4d\u0c25\u0c3e\u0c28\u0c3f\u0c15 \u0c28\u0c3f\u0c32\u0c4d\u0c35\u0c32\u0c4b \u0c28\u0c3f\u0c32\u0c4d\u0c35 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c24\u0c3e\u0c2f\u0c3f.",
219
+ "success": {
220
+ "saved": "\u0c35\u0c3f\u0c1c\u0c2f\u0c35\u0c02\u0c24\u0c02\u0c17\u0c3e \u0c38\u0c47\u0c35\u0c4d \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "Info",
225
+ "note": "Note",
226
+ "tip": "Tip",
227
+ "important": "Important",
228
+ "warning": "Warning",
229
+ "caution": "Caution",
230
+ "debug": "Debug",
231
+ "example": "Example",
232
+ "success": "Success",
233
+ "help": "Help",
234
+ "idea": "Idea",
235
+ "pending": "Pending",
236
+ "security": "Security",
237
+ "beta": "Beta",
238
+ "best-practice": "Best Practice"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u0c0e\u0c02\u0c1a\u0c41\u0c15\u0c4b\u0c02\u0c21\u0c3f..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/zh-CN.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u5bc6\u7801",
30
+ "required": "\u5bc6\u7801\u662f\u5fc5\u586b\u9879"
31
+ },
32
+ "actions": {
33
+ "signin": "\u767b\u5f55"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u6216"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u65e0\u6cd5\u767b\u5f55",
41
+ "signin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
42
+ "oauthSignin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
43
+ "redirectUriMismatch": "\u91cd\u5b9a\u5411URI\u4e0eOAuth\u5e94\u7528\u914d\u7f6e\u4e0d\u5339\u914d",
44
+ "oauthCallback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
45
+ "oauthCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
46
+ "emailCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
47
+ "callback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
48
+ "oauthAccountNotLinked": "\u4e3a\u786e\u8ba4\u60a8\u7684\u8eab\u4efd\uff0c\u8bf7\u4f7f\u7528\u539f\u59cb\u8d26\u53f7\u767b\u5f55",
49
+ "emailSignin": "\u90ae\u4ef6\u53d1\u9001\u5931\u8d25",
50
+ "emailVerify": "\u8bf7\u9a8c\u8bc1\u60a8\u7684\u90ae\u7bb1\uff0c\u65b0\u7684\u9a8c\u8bc1\u90ae\u4ef6\u5df2\u53d1\u9001",
51
+ "credentialsSignin": "\u767b\u5f55\u5931\u8d25\u3002\u8bf7\u68c0\u67e5\u60a8\u63d0\u4f9b\u7684\u4fe1\u606f\u662f\u5426\u6b63\u786e",
52
+ "sessionRequired": "\u8bf7\u767b\u5f55\u4ee5\u8bbf\u95ee\u6b64\u9875\u9762"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "\u7ee7\u7eed\u4f7f\u7528{{provider}}"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u5728\u6b64\u8f93\u5165\u60a8\u7684\u6d88\u606f...",
62
+ "actions": {
63
+ "send": "\u53d1\u9001\u6d88\u606f",
64
+ "stop": "\u505c\u6b62\u4efb\u52a1",
65
+ "attachFiles": "\u9644\u52a0\u6587\u4ef6"
66
+ }
67
+ },
68
+ "speech": {
69
+ "start": "\u5f00\u59cb\u5f55\u97f3",
70
+ "stop": "\u505c\u6b62\u5f55\u97f3",
71
+ "connecting": "\u8fde\u63a5\u4e2d"
72
+ },
73
+ "fileUpload": {
74
+ "dragDrop": "\u5c06\u6587\u4ef6\u62d6\u653e\u5230\u8fd9\u91cc",
75
+ "browse": "\u6d4f\u89c8\u6587\u4ef6",
76
+ "sizeLimit": "\u9650\u5236\uff1a",
77
+ "errors": {
78
+ "failed": "\u4e0a\u4f20\u5931\u8d25",
79
+ "cancelled": "\u5df2\u53d6\u6d88\u4e0a\u4f20"
80
+ },
81
+ "actions": {
82
+ "cancelUpload": "\u53d6\u6d88\u4e0a\u4f20",
83
+ "removeAttachment": "\u79fb\u9664\u9644\u4ef6"
84
+ }
85
+ },
86
+ "commands": {
87
+ "button": "\u5de5\u5177",
88
+ "changeTool": "\u66f4\u6362\u5de5\u5177",
89
+ "availableTools": "\u53ef\u7528\u5de5\u5177"
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u4f7f\u7528\u4e2d",
94
+ "used": "\u5df2\u4f7f\u7528"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u590d\u5236\u5230\u526a\u8d34\u677f",
99
+ "success": "\u5df2\u590d\u5236\uff01"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u6709\u5e2e\u52a9",
104
+ "negative": "\u6ca1\u6709\u5e2e\u52a9",
105
+ "edit": "\u7f16\u8f91\u53cd\u9988",
106
+ "dialog": {
107
+ "title": "\u6dfb\u52a0\u8bc4\u8bba",
108
+ "submit": "\u63d0\u4ea4\u53cd\u9988",
109
+ "yourFeedback": "\u60a8\u7684\u53cd\u9988..."
110
+ },
111
+ "status": {
112
+ "updating": "\u66f4\u65b0\u4e2d",
113
+ "updated": "\u53cd\u9988\u5df2\u66f4\u65b0"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u6700\u8fd1\u8f93\u5165",
119
+ "empty": "\u7a7a\u7a7a\u5982\u4e5f...",
120
+ "show": "\u663e\u793a\u5386\u53f2"
121
+ },
122
+ "settings": {
123
+ "title": "\u8bbe\u7f6e\u9762\u677f",
124
+ "customize": "\u5728\u6b64\u81ea\u5b9a\u4e49\u60a8\u7684\u804a\u5929\u8bbe\u7f6e"
125
+ },
126
+ "watermark": "\u5927\u8bed\u8a00\u6a21\u578b\u53ef\u80fd\u4f1a\u72af\u9519\u3002\u8bf7\u6838\u5b9e\u91cd\u8981\u4fe1\u606f\u3002"
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u5386\u53f2\u5bf9\u8bdd",
131
+ "filters": {
132
+ "search": "\u641c\u7d22",
133
+ "placeholder": "\u641c\u7d22\u4f1a\u8bdd..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u4eca\u5929",
137
+ "yesterday": "\u6628\u5929",
138
+ "previous7days": "\u8fc7\u53bb7\u5929",
139
+ "previous30days": "\u8fc7\u53bb30\u5929"
140
+ },
141
+ "empty": "\u672a\u627e\u5230\u5bf9\u8bdd",
142
+ "actions": {
143
+ "close": "\u5173\u95ed\u4fa7\u8fb9\u680f",
144
+ "open": "\u6253\u5f00\u4fa7\u8fb9\u680f"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u672a\u547d\u540d\u5bf9\u8bdd",
149
+ "menu": {
150
+ "rename": "\u91cd\u547d\u540d",
151
+ "share": "\u5206\u4eab",
152
+ "delete": "\u5220\u9664"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u5206\u4eab\u804a\u5929\u94fe\u63a5",
157
+ "button": "\u5206\u4eab",
158
+ "status": {
159
+ "copied": "\u94fe\u63a5\u5df2\u590d\u5236",
160
+ "created": "\u5206\u4eab\u94fe\u63a5\u5df2\u521b\u5efa\uff01",
161
+ "unshared": "\u5df2\u7981\u7528\u6b64\u5bf9\u8bdd\u7684\u5206\u4eab"
162
+ },
163
+ "error": {
164
+ "create": "\u521b\u5efa\u5206\u4eab\u94fe\u63a5\u5931\u8d25",
165
+ "unshare": "\u53d6\u6d88\u5bf9\u8bdd\u5206\u4eab\u5931\u8d25"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u786e\u8ba4\u5220\u9664",
170
+ "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",
171
+ "success": "\u5bf9\u8bdd\u5df2\u5220\u9664",
172
+ "inProgress": "\u6b63\u5728\u5220\u9664\u5bf9\u8bdd"
173
+ },
174
+ "rename": {
175
+ "title": "\u91cd\u547d\u540d\u5bf9\u8bdd",
176
+ "description": "\u4e3a\u6b64\u5bf9\u8bdd\u8f93\u5165\u65b0\u540d\u79f0",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u540d\u79f0",
180
+ "placeholder": "\u8f93\u5165\u65b0\u540d\u79f0"
181
+ }
182
+ },
183
+ "success": "\u5bf9\u8bdd\u5df2\u91cd\u547d\u540d\uff01",
184
+ "inProgress": "\u6b63\u5728\u91cd\u547d\u540d\u5bf9\u8bdd"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u804a\u5929",
192
+ "readme": "\u8bf4\u660e",
193
+ "theme": {
194
+ "light": "\u6d45\u8272\u4e3b\u9898",
195
+ "dark": "\u6df1\u8272\u4e3b\u9898",
196
+ "system": "\u8ddf\u968f\u7cfb\u7edf"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u65b0\u5efa\u5bf9\u8bdd",
201
+ "dialog": {
202
+ "title": "\u521b\u5efa\u65b0\u5bf9\u8bdd",
203
+ "description": "\u8fd9\u5c06\u6e05\u9664\u60a8\u5f53\u524d\u7684\u804a\u5929\u8bb0\u5f55\u3002\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f",
204
+ "tooltip": "\u65b0\u5efa\u5bf9\u8bdd"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u8bbe\u7f6e",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API\u5bc6\u94a5",
212
+ "logout": "\u9000\u51fa\u767b\u5f55"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u6240\u9700API\u5bc6\u94a5",
218
+ "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",
219
+ "success": {
220
+ "saved": "\u4fdd\u5b58\u6210\u529f"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "\u4fe1\u606f",
225
+ "note": "\u6ce8\u91ca",
226
+ "tip": "\u63d0\u793a",
227
+ "important": "\u91cd\u8981",
228
+ "warning": "\u8b66\u544a",
229
+ "caution": "\u6ce8\u610f",
230
+ "debug": "\u8c03\u8bd5",
231
+ "example": "\u793a\u4f8b",
232
+ "success": "\u6210\u529f",
233
+ "help": "\u5e2e\u52a9",
234
+ "idea": "\u60f3\u6cd5",
235
+ "pending": "\u5f85\u5904\u7406",
236
+ "security": "\u5b89\u5168",
237
+ "beta": "\u6d4b\u8bd5",
238
+ "best-practice": "\u6700\u4f73\u5b9e\u8df5"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u9009\u62e9..."
243
+ }
244
+ }
245
+ }
.chainlit/translations/zh-TW.json ADDED
@@ -0,0 +1,245 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "common": {
3
+ "actions": {
4
+ "cancel": "\u53d6\u6d88",
5
+ "confirm": "\u78ba\u8a8d",
6
+ "continue": "\u7e7c\u7e8c",
7
+ "goBack": "\u8fd4\u56de",
8
+ "reset": "\u91cd\u8a2d",
9
+ "submit": "\u9001\u51fa"
10
+ },
11
+ "status": {
12
+ "loading": "\u8f09\u5165\u4e2d...",
13
+ "error": {
14
+ "default": "\u767c\u751f\u932f\u8aa4",
15
+ "serverConnection": "\u7121\u6cd5\u9023\u7dda\u5230\u4f3a\u670d\u5668"
16
+ }
17
+ }
18
+ },
19
+ "auth": {
20
+ "login": {
21
+ "title": "\u767b\u5165\u4ee5\u5b58\u53d6\u61c9\u7528\u7a0b\u5f0f",
22
+ "form": {
23
+ "email": {
24
+ "label": "\u96fb\u5b50\u4fe1\u7bb1",
25
+ "required": "\u4fe1\u7bb1\u662f\u5fc5\u586b\u9805\u76ee",
26
+ "placeholder": "me@example.com"
27
+ },
28
+ "password": {
29
+ "label": "\u5bc6\u78bc",
30
+ "required": "\u5bc6\u78bc\u662f\u5fc5\u586b\u9805\u76ee"
31
+ },
32
+ "actions": {
33
+ "signin": "\u767b\u5165"
34
+ },
35
+ "alternativeText": {
36
+ "or": "\u6216"
37
+ }
38
+ },
39
+ "errors": {
40
+ "default": "\u7121\u6cd5\u767b\u5165",
41
+ "signin": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
42
+ "oauthSignin": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
43
+ "redirectUriMismatch": "\u91cd\u65b0\u5c0e\u5411URI\u8207OAuth App\u8a2d\u5b9a\u4e0d\u76f8\u7b26",
44
+ "oauthCallback": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
45
+ "oauthCreateAccount": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
46
+ "emailCreateAccount": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
47
+ "callback": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
48
+ "oauthAccountNotLinked": "\u70ba\u78ba\u8a8d\u60a8\u7684\u8eab\u4efd\uff0c\u8acb\u4ee5\u539f\u672c\u4f7f\u7528\u7684\u5e33\u865f\u767b\u5165",
49
+ "emailSignin": "\u96fb\u5b50\u90f5\u4ef6\u767c\u9001\u5931\u6557",
50
+ "emailVerify": "\u8acb\u9a57\u8b49\u60a8\u7684\u96fb\u5b50\u4fe1\u7bb1\uff0c\u65b0\u7684\u9a57\u8b49\u90f5\u4ef6\u5df2\u767c\u9001",
51
+ "credentialsSignin": "\u767b\u5165\u5931\u6557\u3002\u8acb\u6aa2\u67e5\u60a8\u63d0\u4f9b\u7684\u8cc7\u8a0a\u662f\u5426\u6b63\u78ba",
52
+ "sessionRequired": "\u8acb\u767b\u5165\u4ee5\u5b58\u53d6\u6b64\u9801\u9762"
53
+ }
54
+ },
55
+ "provider": {
56
+ "continue": "\u7e7c\u7e8c\u4f7f\u7528{{provider}}"
57
+ }
58
+ },
59
+ "chat": {
60
+ "input": {
61
+ "placeholder": "\u5728\u6b64\u8f38\u5165\u60a8\u7684\u8a0a\u606f...",
62
+ "actions": {
63
+ "send": "\u767c\u9001\u8a0a\u606f",
64
+ "stop": "\u505c\u6b62\u4efb\u52d9",
65
+ "attachFiles": "\u9644\u52a0\u6a94\u6848"
66
+ }
67
+ },
68
+ "speech": {
69
+ "start": "\u958b\u59cb\u9304\u97f3",
70
+ "stop": "\u505c\u6b62\u9304\u97f3",
71
+ "connecting": "\u9023\u7dda\u4e2d"
72
+ },
73
+ "fileUpload": {
74
+ "dragDrop": "\u62d6\u66f3\u6a94\u6848\u5230\u9019\u88e1",
75
+ "browse": "\u700f\u89bd\u6a94\u6848",
76
+ "sizeLimit": "\u9650\u5236\uff1a",
77
+ "errors": {
78
+ "failed": "\u4e0a\u50b3\u5931\u6557",
79
+ "cancelled": "\u5df2\u53d6\u6d88\u4e0a\u50b3"
80
+ },
81
+ "actions": {
82
+ "cancelUpload": "\u53d6\u6d88\u4e0a\u50b3",
83
+ "removeAttachment": "\u79fb\u9664\u9644\u4ef6"
84
+ }
85
+ },
86
+ "commands": {
87
+ "button": "\u5de5\u5177",
88
+ "changeTool": "\u66f4\u63db\u5de5\u5177",
89
+ "availableTools": "\u53ef\u7528\u5de5\u5177"
90
+ },
91
+ "messages": {
92
+ "status": {
93
+ "using": "\u6b63\u5728\u4f7f\u7528",
94
+ "used": "\u5df2\u4f7f\u7528"
95
+ },
96
+ "actions": {
97
+ "copy": {
98
+ "button": "\u8907\u88fd\u5230\u526a\u8cbc\u7c3f",
99
+ "success": "\u5df2\u8907\u88fd\uff01"
100
+ }
101
+ },
102
+ "feedback": {
103
+ "positive": "\u6709\u5e6b\u52a9",
104
+ "negative": "\u6c92\u6709\u5e6b\u52a9",
105
+ "edit": "\u7de8\u8f2f\u56de\u994b",
106
+ "dialog": {
107
+ "title": "\u65b0\u589e\u8a55\u8ad6",
108
+ "submit": "\u9001\u51fa\u56de\u994b",
109
+ "yourFeedback": "\u60a8\u7684\u56de\u994b..."
110
+ },
111
+ "status": {
112
+ "updating": "\u66f4\u65b0\u4e2d",
113
+ "updated": "\u56de\u994b\u5df2\u66f4\u65b0"
114
+ }
115
+ }
116
+ },
117
+ "history": {
118
+ "title": "\u6700\u8fd1\u8f38\u5165",
119
+ "empty": "\u7a7a\u7a7a\u5982\u4e5f...",
120
+ "show": "\u986f\u793a\u6b77\u53f2"
121
+ },
122
+ "settings": {
123
+ "title": "\u8a2d\u5b9a\u9762\u677f",
124
+ "customize": "\u5728\u6b64\u81ea\u5b9a\u7fa9\u60a8\u7684\u804a\u5929\u8a2d\u5b9a"
125
+ },
126
+ "watermark": "\u5927\u578b\u8a9e\u8a00\u6a21\u578b\u53ef\u80fd\u6703\u72af\u932f\u3002\u8acb\u6838\u5be6\u91cd\u8981\u8cc7\u8a0a\u3002"
127
+ },
128
+ "threadHistory": {
129
+ "sidebar": {
130
+ "title": "\u6b77\u53f2\u5c0d\u8a71",
131
+ "filters": {
132
+ "search": "\u641c\u5c0b",
133
+ "placeholder": "\u641c\u5c0b\u5c0d\u8a71..."
134
+ },
135
+ "timeframes": {
136
+ "today": "\u4eca\u5929",
137
+ "yesterday": "\u6628\u5929",
138
+ "previous7days": "\u904e\u53bb7\u5929",
139
+ "previous30days": "\u904e\u53bb30\u5929"
140
+ },
141
+ "empty": "\u672a\u627e\u5230\u5c0d\u8a71",
142
+ "actions": {
143
+ "close": "\u95dc\u9589\u5074\u908a\u6b04",
144
+ "open": "\u6253\u958b\u5074\u908a\u6b04"
145
+ }
146
+ },
147
+ "thread": {
148
+ "untitled": "\u672a\u547d\u540d\u5c0d\u8a71",
149
+ "menu": {
150
+ "rename": "\u91cd\u65b0\u547d\u540d",
151
+ "share": "\u5206\u4eab",
152
+ "delete": "\u522a\u9664"
153
+ },
154
+ "actions": {
155
+ "share": {
156
+ "title": "\u5206\u4eab\u804a\u5929\u9023\u7d50",
157
+ "button": "\u5206\u4eab",
158
+ "status": {
159
+ "copied": "\u9023\u7d50\u5df2\u8907\u88fd",
160
+ "created": "\u5206\u4eab\u9023\u7d50\u5df2\u5efa\u7acb\uff01",
161
+ "unshared": "\u5df2\u505c\u7528\u6b64\u5c0d\u8a71\u7684\u5206\u4eab"
162
+ },
163
+ "error": {
164
+ "create": "\u5efa\u7acb\u5206\u4eab\u9023\u7d50\u5931\u6557",
165
+ "unshare": "\u53d6\u6d88\u5c0d\u8a71\u5206\u4eab\u5931\u6557"
166
+ }
167
+ },
168
+ "delete": {
169
+ "title": "\u78ba\u8a8d\u522a\u9664",
170
+ "description": "\u9019\u5c07\u522a\u9664\u8a72\u5c0d\u8a71\u53ca\u5176\u6240\u6709\u8a0a\u606f\u548c\u5143\u4ef6\u3002\u6b64\u64cd\u4f5c\u7121\u6cd5\u5fa9\u539f\u3002",
171
+ "success": "\u5c0d\u8a71\u5df2\u522a\u9664",
172
+ "inProgress": "\u6b63\u5728\u522a\u9664\u5c0d\u8a71"
173
+ },
174
+ "rename": {
175
+ "title": "\u91cd\u65b0\u547d\u540d\u5c0d\u8a71",
176
+ "description": "\u70ba\u6b64\u5c0d\u8a71\u8f38\u5165\u65b0\u540d\u7a31",
177
+ "form": {
178
+ "name": {
179
+ "label": "\u540d\u7a31",
180
+ "placeholder": "\u8f38\u5165\u65b0\u540d\u7a31"
181
+ }
182
+ },
183
+ "success": "\u5c0d\u8a71\u5df2\u91cd\u65b0\u547d\u540d\uff01",
184
+ "inProgress": "\u6b63\u5728\u91cd\u65b0\u547d\u540d\u5c0d\u8a71"
185
+ }
186
+ }
187
+ }
188
+ },
189
+ "navigation": {
190
+ "header": {
191
+ "chat": "\u804a\u5929",
192
+ "readme": "\u8aaa\u660e",
193
+ "theme": {
194
+ "light": "\u6dfa\u8272\u4e3b\u984c",
195
+ "dark": "\u6df1\u8272\u4e3b\u984c",
196
+ "system": "\u8ddf\u96a8\u7cfb\u7d71"
197
+ }
198
+ },
199
+ "newChat": {
200
+ "button": "\u65b0\u5efa\u5c0d\u8a71",
201
+ "dialog": {
202
+ "title": "\u5275\u5efa\u65b0\u5c0d\u8a71",
203
+ "description": "\u9019\u5c07\u6e05\u9664\u60a8\u7576\u524d\u7684\u804a\u5929\u8a18\u9304\u3002\u78ba\u5b9a\u8981\u7e7c\u7e8c\u55ce\uff1f",
204
+ "tooltip": "\u65b0\u5efa\u5c0d\u8a71"
205
+ }
206
+ },
207
+ "user": {
208
+ "menu": {
209
+ "settings": "\u8a2d\u5b9a",
210
+ "settingsKey": "S",
211
+ "apiKeys": "API\u91d1\u9470",
212
+ "logout": "\u767b\u51fa"
213
+ }
214
+ }
215
+ },
216
+ "apiKeys": {
217
+ "title": "\u6240\u9700API\u91d1\u9470",
218
+ "description": "\u4f7f\u7528\u6b64\u61c9\u7528\u7a0b\u5f0f\u9700\u8981\u4ee5\u4e0bAPI\u91d1\u9470\u3002\u9019\u4e9b\u91d1\u9470\u5132\u5b58\u5728\u60a8\u8a2d\u5099\u7684\u672c\u5730\u5132\u5b58\u7a7a\u9593\u4e2d\u3002",
219
+ "success": {
220
+ "saved": "\u5132\u5b58\u6210\u529f"
221
+ }
222
+ },
223
+ "alerts": {
224
+ "info": "\u8cc7\u8a0a",
225
+ "note": "\u6ce8\u91cb",
226
+ "tip": "\u63d0\u793a",
227
+ "important": "\u91cd\u8981",
228
+ "warning": "\u8b66\u544a",
229
+ "caution": "\u6ce8\u610f",
230
+ "debug": "\u9664\u932f",
231
+ "example": "\u7bc4\u4f8b",
232
+ "success": "\u6210\u529f",
233
+ "help": "\u5e6b\u52a9",
234
+ "idea": "\u60f3\u6cd5",
235
+ "pending": "\u5f85\u8655\u7406",
236
+ "security": "\u5b89\u5168",
237
+ "beta": "\u6e2c\u8a66",
238
+ "best-practice": "\u6700\u4f73\u5be6\u8e10"
239
+ },
240
+ "components": {
241
+ "MultiSelectInput": {
242
+ "placeholder": "\u9078\u64c7..."
243
+ }
244
+ }
245
+ }
.dockerignore CHANGED
@@ -51,8 +51,8 @@ Thumbs.db
51
  # =========================================
52
  data/
53
  outputs/
54
- runs/
55
  artifacts/
 
56
  *.pt
57
  *.pth
58
  *.ckpt
 
51
  # =========================================
52
  data/
53
  outputs/
 
54
  artifacts/
55
+ trained_models/
56
  *.pt
57
  *.pth
58
  *.ckpt
.gitignore CHANGED
@@ -50,13 +50,13 @@ Thumbs.db
50
  # =========================================
51
  # Machine Learning artifacts
52
  # =========================================
53
- data/
54
- outputs/
 
55
  runs/
56
  artifacts/
57
- trained_models/
58
  !trained_models/README.md
59
- .chainlit/
60
  *.pt
61
  *.pth
62
  *.ckpt
 
50
  # =========================================
51
  # Machine Learning artifacts
52
  # =========================================
53
+ data/*
54
+ !data/README.md
55
+ outputs/*
56
  runs/
57
  artifacts/
58
+ trained_models/*
59
  !trained_models/README.md
 
60
  *.pt
61
  *.pth
62
  *.ckpt
.pre-commit-config.yaml CHANGED
@@ -1,17 +1,26 @@
1
  repos:
2
- - repo: https://github.com/astral-sh/ruff-pre-commit
3
- rev: v0.12.12
4
- hooks:
5
- - id: ruff # lints
6
- - id: ruff-format # formats (ruff's formatter is black-compatible)
7
- - repo: https://github.com/pre-commit/pre-commit-hooks
8
- rev: v6.0.0
9
- hooks:
10
- - id: end-of-file-fixer
11
- - id: trailing-whitespace
12
- - repo: https://github.com/pre-commit/mirrors-mypy
13
- rev: v1.17.1
14
- hooks:
15
- - id: mypy
16
- args: ["--config-file=pyproject.toml"]
17
- additional_dependencies: [pydantic>=2]
 
 
 
 
 
 
 
 
 
 
1
  repos:
2
+ - repo: https://github.com/astral-sh/ruff-pre-commit
3
+ rev: v0.12.12
4
+ hooks:
5
+ - id: ruff
6
+ args: ["--fix"]
7
+ - id: ruff-format
8
+ - repo: https://github.com/psf/black-pre-commit-mirror
9
+ rev: 24.10.0
10
+ hooks:
11
+ - id: black
12
+ - repo: https://github.com/pre-commit/pre-commit-hooks
13
+ rev: v6.0.0
14
+ hooks:
15
+ - id: end-of-file-fixer
16
+ - id: trailing-whitespace
17
+ - repo: https://github.com/pycqa/isort
18
+ rev: 5.13.2
19
+ hooks:
20
+ - id: isort
21
+ - repo: https://github.com/pre-commit/mirrors-mypy
22
+ rev: v1.17.1
23
+ hooks:
24
+ - id: mypy
25
+ args: ["--config-file=pyproject.toml"]
26
+ additional_dependencies: [pydantic>=2]
CONTRIBUTING.md CHANGED
@@ -1,27 +1,40 @@
1
  # Contributing to mini_transformer
2
 
3
- Thanks for your interest in contributing! Follow these steps to get started.
4
 
5
- 1. **Create the development environment**
6
- ```bash
7
- make create-env
8
- ```
 
 
 
9
 
10
- 2. **Run quality checks** before opening a pull request:
11
- ```bash
12
- make fmt
13
- make lint
14
- make type
15
- make test
16
- ```
 
 
 
 
17
 
18
- 3. **Submit changes** via a pull request. Please describe the motivation, relevant issues, and testing performed.
 
 
 
 
19
 
20
- 4. **Code style**
21
- - Keep imports sorted and formatted with `ruff` and `black`.
22
- - Prefer type annotations and existing helper utilities.
23
 
24
- 5. **Doc updates**
25
- - Update the README and any tutorial notebooks if behaviour changes.
 
 
26
 
27
- Feel free to open an issue for questions or proposals before starting larger pieces of work.
 
1
  # Contributing to mini_transformer
2
 
3
+ Thanks for your interest in contributing! The project mirrors the published package, so keeping the repo healthy benefits everyone who installs `mini-transformer`.
4
 
5
+ ## 1. Environment
6
+ ```bash
7
+ make create-env # creates/updates the conda env and installs extras
8
+ # or, if you prefer pip/venv:
9
+ python -m pip install -e .[dev,notebook,viz]
10
+ pre-commit install # optional but recommended
11
+ ```
12
 
13
+ ## 2. Quality Checklist
14
+ Run these commands before opening a pull request (they are quick and automated):
15
+ ```bash
16
+ make fmt # ruff format + black
17
+ make lint-check # ruff lint (no auto-fix)
18
+ make type # mypy
19
+ make test # pytest (currently 130+ unit tests)
20
+ pre-commit run --all-files
21
+ ```
22
+ - Notebook edits: clear execution outputs or re-run cells so they execute top-to-bottom.
23
+ - If you touch attention introspection or training, add/extend tests under `tests/units/`.
24
 
25
+ ## 3. Working Style
26
+ - Prefer existing helper utilities (`mini_transformer.utils.*`, `model_loader`, etc.) instead of re-implementing logic.
27
+ - Keep imports sorted/compact; `ruff` handles this automatically.
28
+ - Default to strict type hints. If you need `Any`, document why in a short comment.
29
+ - For new configuration values, update both the dataclass in `mini_transformer/configs.py` and the YAML in `configs/`.
30
 
31
+ ## 4. Documentation
32
+ - Update `README.md`, relevant notebooks, or in-repo docs when behaviour or flags change.
33
+ - Add docstrings for new public APIs and CLI options.
34
 
35
+ ## 5. Pull Requests
36
+ - Describe the motivation, summarize the change, and list the verification steps you ran.
37
+ - Link any related issues or design discussions.
38
+ - Large or speculative changes? Please open an issue or discussion first so we can align on direction.
39
 
40
+ Thanks again for helping keep mini-transformer robust! Feel free to open issues for questions, proposals, or clarifications.
Dockerfile.dev CHANGED
@@ -1,6 +1,5 @@
1
  # syntax=docker/dockerfile:1
2
- FROM python:3.11-slim
3
- # FROM = choose a base OS + language runtime (Debian slim with Python 3.11)
4
 
5
  ENV DEBIAN_FRONTEND=noninteractive \
6
  PIP_NO_CACHE_DIR=1 \
@@ -10,18 +9,13 @@ ENV DEBIAN_FRONTEND=noninteractive \
10
  RUN apt-get update && apt-get install -y --no-install-recommends \
11
  git build-essential && \
12
  rm -rf /var/lib/apt/lists/*
13
- # RUN = execute at build time
14
- # apt-get update -> refresh package index
15
- # apt-get install -> install tools you might need (git, compilers)
16
- # --no-install-recommends -> fewer extra packages
17
- # rm -rf ... -> clean apt cache to shrink the layer
18
 
19
  WORKDIR /app
20
 
21
  COPY pyproject.toml README.md LICENSE ./
22
  COPY src ./src
23
 
24
- RUN pip install -U pip && pip install -e .[dev,server,viz,notebook]
25
 
26
  COPY . .
27
 
 
1
  # syntax=docker/dockerfile:1
2
+ FROM python:3.10-slim
 
3
 
4
  ENV DEBIAN_FRONTEND=noninteractive \
5
  PIP_NO_CACHE_DIR=1 \
 
9
  RUN apt-get update && apt-get install -y --no-install-recommends \
10
  git build-essential && \
11
  rm -rf /var/lib/apt/lists/*
 
 
 
 
 
12
 
13
  WORKDIR /app
14
 
15
  COPY pyproject.toml README.md LICENSE ./
16
  COPY src ./src
17
 
18
+ RUN pip install -U pip && pip install -e .[dev]
19
 
20
  COPY . .
21
 
Dockerfile.infer ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # syntax=docker/dockerfile:1
2
+ FROM python:3.10-slim
3
+
4
+ ENV DEBIAN_FRONTEND=noninteractive \
5
+ PIP_NO_CACHE_DIR=1 \
6
+ PYTHONDONTWRITEBYTECODE=1 \
7
+ PYTHONUNBUFFERED=1
8
+
9
+ RUN apt-get update && apt-get install -y --no-install-recommends \
10
+ git build-essential && \
11
+ rm -rf /var/lib/apt/lists/*
12
+
13
+ WORKDIR /app
14
+
15
+ COPY pyproject.toml README.md LICENSE ./
16
+ COPY src ./src
17
+
18
+ RUN pip install -U pip && pip install -e .[server,viz,notebook]
19
+
20
+ RUN mkdir -p trained_models
21
+
22
+ CMD ["mini-transformer-ui", "--host", "0.0.0.0", "--port", "8000"]
Makefile CHANGED
@@ -2,7 +2,7 @@ ENV?=mini-transformer
2
  CONDA_RUN=conda run -n $(ENV)
3
  PYTHON?=python
4
 
5
- .PHONY: help create-env install precommit lint lint-check fmt fmt-check type test cov fetch-test fetch-small infer serve ui clean clean-all docker-build docker-run
6
 
7
  help:
8
  @echo "Available targets:"
@@ -23,8 +23,10 @@ help:
23
  @echo " ui - Launch the Chainlit UI"
24
  @echo " clean - Remove build/test caches"
25
  @echo " clean-all - Clean caches plus notebooks outputs"
26
- @echo " docker-build - Build the development Docker image"
27
- @echo " docker-run - Drop into the development container"
 
 
28
 
29
  create-env:
30
  conda env create -n $(ENV) -f environment.yml || conda env update -n $(ENV) -f environment.yml
@@ -81,8 +83,14 @@ clean:
81
  clean-all: clean
82
  rm -rf notebooks/.ipynb_checkpoints outputs/*
83
 
84
- docker-build:
85
  docker compose build dev --no-cache
86
 
87
- docker-run:
88
  docker compose run --rm dev bash
 
 
 
 
 
 
 
2
  CONDA_RUN=conda run -n $(ENV)
3
  PYTHON?=python
4
 
5
+ .PHONY: help create-env install precommit lint lint-check fmt fmt-check type test cov fetch-test fetch-small infer serve ui clean clean-all docker-build-dev docker-run-dev docker-build-infer docker-run-infer
6
 
7
  help:
8
  @echo "Available targets:"
 
23
  @echo " ui - Launch the Chainlit UI"
24
  @echo " clean - Remove build/test caches"
25
  @echo " clean-all - Clean caches plus notebooks outputs"
26
+ @echo " docker-build-dev - Build the development Docker image"
27
+ @echo " docker-run-dev - Drop into the development container"
28
+ @echo " docker-build-infer - Build the inference Docker image"
29
+ @echo " docker-run-infer - Run the inference container exposing the Chainlit UI"
30
 
31
  create-env:
32
  conda env create -n $(ENV) -f environment.yml || conda env update -n $(ENV) -f environment.yml
 
83
  clean-all: clean
84
  rm -rf notebooks/.ipynb_checkpoints outputs/*
85
 
86
+ docker-build-dev:
87
  docker compose build dev --no-cache
88
 
89
+ docker-run-dev:
90
  docker compose run --rm dev bash
91
+
92
+ docker-build-infer:
93
+ docker compose build infer --no-cache
94
+
95
+ docker-run-infer:
96
+ docker compose run --rm --service-ports infer
README.md CHANGED
@@ -27,6 +27,14 @@ pip install "mini-transformer[server,viz]"
27
  - `tests/` – unit and smoke tests.
28
  - Supporting files: `pyproject.toml`, `Makefile`, `Dockerfile.dev`, `environment.yml`, etc.
29
 
 
 
 
 
 
 
 
 
30
  ## Preparing Models
31
  Download the demo models hosted on Hugging Face:
32
  ```bash
@@ -75,6 +83,7 @@ Follow these steps to spin up the bundled Chainlit chat UI for a local inference
75
  mini-transformer-ui --model AlaBoussoffara__transformer_small --host 0.0.0.0 --port 8000
76
  ```
77
  4. Open http://localhost:8000 in your browser, send a prompt, and use `/model` in chat to switch between downloaded checkpoints.
 
78
 
79
  ### Environment Variables
80
  - `MINI_TRANSFORMER_MODELS` – override the models root directory.
@@ -83,6 +92,14 @@ Follow these steps to spin up the bundled Chainlit chat UI for a local inference
83
  - `MINI_TRANSFORMER_UI_HOST` / `MINI_TRANSFORMER_UI_PORT` – defaults for Chainlit binding.
84
  - Optional overrides: `MINI_TRANSFORMER_CHECKPOINT_BEST`, `MINI_TRANSFORMER_TOKENIZER_PATH`, `MINI_TRANSFORMER_OUTPUT_DIR`, etc.
85
 
 
 
 
 
 
 
 
 
86
  ## Programmatic Inference
87
  ```python
88
  from mini_transformer.model_loader import compose_model_config
@@ -99,8 +116,14 @@ make create-env
99
  make lint
100
  make type
101
  make test
 
102
  ```
103
 
 
 
 
 
 
104
  ## Makefile Shortcuts
105
  ```bash
106
  make help # list common tasks
@@ -108,6 +131,7 @@ make create-env # create/update the conda env and install extras
108
  make lint # format + lint (ruff + black)
109
  make lint-check # lint without auto-fixes
110
  make fmt # format code
 
111
  make type # mypy
112
  make test # pytest
113
  make cov # pytest with coverage
@@ -116,8 +140,10 @@ make fetch-small # download AlaBoussoffara/transformer_small
116
  make infer # quick demo inference
117
  make serve # run FastAPI server (reload mode)
118
  make ui # launch Chainlit UI
119
- make docker-build # build the dev container
120
- make docker-run # open an interactive shell in the container
 
 
121
  ```
122
 
123
  ## Full Workflow At A Glance
 
27
  - `tests/` – unit and smoke tests.
28
  - Supporting files: `pyproject.toml`, `Makefile`, `Dockerfile.dev`, `environment.yml`, etc.
29
 
30
+ ## Training Notebook
31
+ `notebooks/train.ipynb` demonstrates the Hydra-driven training loop used during development.
32
+ - All hyper-parameters come from the composed config (see `configs/train_mode.yaml`); the key knobs live under `trainer.*`.
33
+ - Checkpoint cadence is controlled by `trainer.save_interval` (in optimizer steps) and always saves on epoch boundaries.
34
+ - Dataloader behaviour (workers, pinned memory) can be tuned via `trainer.num_workers` and `trainer.pin_memory`.
35
+ - Gradient accumulation is respected even for partial micro-batch sets, so you can safely mix different batch counts.
36
+ For long-running jobs consider exporting the notebook to a script (`jupyter nbconvert --to script`) or reusing the same logic inside a CLI tool.
37
+
38
  ## Preparing Models
39
  Download the demo models hosted on Hugging Face:
40
  ```bash
 
83
  mini-transformer-ui --model AlaBoussoffara__transformer_small --host 0.0.0.0 --port 8000
84
  ```
85
  4. Open http://localhost:8000 in your browser, send a prompt, and use `/model` in chat to switch between downloaded checkpoints.
86
+ Use `/config temperature=0.7 top_k=50` (or `/config reset`) to tweak generation settings on the fly.
87
 
88
  ### Environment Variables
89
  - `MINI_TRANSFORMER_MODELS` – override the models root directory.
 
92
  - `MINI_TRANSFORMER_UI_HOST` / `MINI_TRANSFORMER_UI_PORT` – defaults for Chainlit binding.
93
  - Optional overrides: `MINI_TRANSFORMER_CHECKPOINT_BEST`, `MINI_TRANSFORMER_TOKENIZER_PATH`, `MINI_TRANSFORMER_OUTPUT_DIR`, etc.
94
 
95
+ ## Docker Inference UI
96
+ Build the lean inference image and launch the Chainlit UI in a container:
97
+ ```bash
98
+ make docker-build-infer
99
+ make docker-run-infer # press Ctrl+C to stop
100
+ ```
101
+ Models stay outside the container under `trained_models/`, mounted at runtime with docker compose.
102
+
103
  ## Programmatic Inference
104
  ```python
105
  from mini_transformer.model_loader import compose_model_config
 
116
  make lint
117
  make type
118
  make test
119
+ pre-commit run --all-files # optional: run all hooks locally
120
  ```
121
 
122
+ ## Testing & QA
123
+ - Unit tests live under `tests/units/`; run them with `make test` or `python -m pytest`.
124
+ - The suite covers core building blocks (attention math, masking, sampling), CLI flows, and attention-debug utilities—including both pre- and post-layernorm configurations.
125
+ - Add tests alongside new features; keeping coverage high ensures `mini-transformer` behaves the same whether it runs from the repo or as an installed package.
126
+
127
  ## Makefile Shortcuts
128
  ```bash
129
  make help # list common tasks
 
131
  make lint # format + lint (ruff + black)
132
  make lint-check # lint without auto-fixes
133
  make fmt # format code
134
+ make precommit # run the configured pre-commit hooks (auto-fixes where possible)
135
  make type # mypy
136
  make test # pytest
137
  make cov # pytest with coverage
 
140
  make infer # quick demo inference
141
  make serve # run FastAPI server (reload mode)
142
  make ui # launch Chainlit UI
143
+ make docker-build-dev # build the development container
144
+ make docker-run-dev # open an interactive shell in the development container
145
+ make docker-build-infer # build the inference/UI container
146
+ make docker-run-infer # run the inference service (Ctrl+C to stop)
147
  ```
148
 
149
  ## Full Workflow At A Glance
configs/generation/generation.yaml CHANGED
@@ -2,8 +2,8 @@ max_new_tokens: 128
2
  temperature: 1
3
  top_k: 10
4
  top_p: 0.6
5
- do_sample: true
6
  presence_penalty: 0.6
7
  frequency_penalty: 0.2
8
  no_repeat_ngram: 4
9
- min_steps_before_eos: 2
 
2
  temperature: 1
3
  top_k: 10
4
  top_p: 0.6
5
+ do_sample: false
6
  presence_penalty: 0.6
7
  frequency_penalty: 0.2
8
  no_repeat_ngram: 4
9
+ min_steps_before_eos: 20
configs/optim/Adamw.yaml CHANGED
@@ -3,4 +3,3 @@ lr: 8e-4
3
  betas: [0.9, 0.98]
4
  eps: 1e-8
5
  weight_decay: 0.08
6
- no_decay_on_bias_norm_embed: true
 
3
  betas: [0.9, 0.98]
4
  eps: 1e-8
5
  weight_decay: 0.08
 
configs/train_mode.yaml CHANGED
@@ -1,5 +1,5 @@
1
  defaults:
2
- - model: test_model
3
  - tokenizer: bpe_16k
4
  - dataset: medium_dataset
5
  - optim: Adamw
 
1
  defaults:
2
+ - model: medium_model
3
  - tokenizer: bpe_16k
4
  - dataset: medium_dataset
5
  - optim: Adamw
configs/trainer/default.yaml CHANGED
@@ -1,11 +1,11 @@
1
- epochs: 80
2
  batch_size: 128
3
  shuffle: true
4
  precision: "bf16"
5
  gradient_accumulation: 2
6
  clip_grad_norm: 0.5
7
  eval_interval: 1
8
- save_interval: 1
9
  debug_interval: 1000
10
  mixed_precision: true
11
  gradient_checkpointing: true
 
1
+ epochs: 10
2
  batch_size: 128
3
  shuffle: true
4
  precision: "bf16"
5
  gradient_accumulation: 2
6
  clip_grad_norm: 0.5
7
  eval_interval: 1
8
+ save_interval: 50
9
  debug_interval: 1000
10
  mixed_precision: true
11
  gradient_checkpointing: true
data/README.md ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Data Folder
2
+
3
+ This `data` folder contains datasets and resources used for the Mini-Transformer project.
4
+
5
+ ## Structure
6
+ - **corpus/**: Text corpora for training and evaluation.
7
+ - **raw/**: Original, unprocessed datasets.
8
+ - **processed/**: Cleaned and preprocessed data ready for model training.
9
+ - **README.md**: Documentation for the data folder.
10
+
11
+ ## Usage
12
+
13
+ Place your datasets in the appropriate subfolders. Ensure data is properly formatted before use.
14
+ ## Used Datasets:
15
+ - small dataset: "ahazeemi/iwslt14-en-fr"
16
+ - medium dataset: "Helsinki-NLP/europarl", "en-fr"
17
+ - large dataset: "wmt/wmt14", "fr-en"
18
+
19
+ ## Notes
20
+
21
+ - Do not commit sensitive or proprietary data.
22
+ - Update this README if the folder structure changes.
23
+ - For questions about data formats, refer to the main project documentation.
docker-compose.yml CHANGED
@@ -19,3 +19,22 @@ services:
19
  command: bash
20
  ports:
21
  - "8000:8000"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  command: bash
20
  ports:
21
  - "8000:8000"
22
+
23
+ infer:
24
+ build:
25
+ context: .
26
+ dockerfile: Dockerfile.infer
27
+ image: mini-transformer:infer
28
+ container_name: mini_transformer_infer
29
+ working_dir: /app
30
+ volumes:
31
+ - ./outputs:/app/outputs
32
+ - ./trained_models:/app/trained_models
33
+ environment:
34
+ MINI_TRANSFORMER_MODELS: /app/trained_models
35
+ MINI_TRANSFORMER_UI_HOST: 0.0.0.0
36
+ MINI_TRANSFORMER_UI_PORT: 8000
37
+ stdin_open: true
38
+ tty: true
39
+ ports:
40
+ - "8000:8000"
notebooks/load_data.ipynb CHANGED
@@ -19,7 +19,7 @@
19
  "\n",
20
  "_ = load_dataset(\"ahazeemi/iwslt14-en-fr\", cache_dir=\"./data/raw\")\n",
21
  "_ = load_dataset(\"Helsinki-NLP/europarl\", \"en-fr\", cache_dir=\"./data/raw\")\n",
22
- "# _ = load_dataset(\"wmt/wmt14\", \"fr-en\", cache_dir=\"./data/raw\")"
23
  ]
24
  },
25
  {
@@ -32,29 +32,16 @@
32
  },
33
  {
34
  "cell_type": "code",
35
- "execution_count": 1,
36
  "id": "2e0838f5",
37
  "metadata": {},
38
- "outputs": [
39
- {
40
- "name": "stderr",
41
- "output_type": "stream",
42
- "text": [
43
- "/home/ala-boussoffara/miniconda3/envs/mini-transformer/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
44
- " from .autonotebook import tqdm as notebook_tqdm\n",
45
- "Generating train split: 179435 examples [00:00, 1366541.45 examples/s]\n",
46
- "Generating validation split: 903 examples [00:00, 558869.19 examples/s]\n",
47
- "Generating test split: 3666 examples [00:00, 876193.43 examples/s]\n",
48
- "Generating train split: 2051014 examples [00:01, 2040864.91 examples/s]\n"
49
- ]
50
- }
51
- ],
52
  "source": [
53
  "from datasets import load_dataset\n",
54
  "\n",
55
  "small_dataset = load_dataset(\"./data/raw/ahazeemi___iwslt14-en-fr\")\n",
56
  "medium_dataset = load_dataset(\"./data/raw/Helsinki-NLP___europarl\")\n",
57
- "# large_dataset = load_dataset(\"./data/raw/wmt___wmt14\")"
58
  ]
59
  },
60
  {
@@ -67,31 +54,10 @@
67
  },
68
  {
69
  "cell_type": "code",
70
- "execution_count": 2,
71
  "id": "ca4d1867",
72
  "metadata": {},
73
- "outputs": [
74
- {
75
- "name": "stderr",
76
- "output_type": "stream",
77
- "text": [
78
- "Map: 100%|██████████| 179435/179435 [00:12<00:00, 14545.45 examples/s]\n",
79
- "Map: 100%|██████████| 903/903 [00:00<00:00, 13155.18 examples/s]\n",
80
- "Map: 100%|██████████| 3666/3666 [00:00<00:00, 14699.07 examples/s]\n",
81
- "Filter: 100%|██████████| 179435/179435 [00:01<00:00, 163853.20 examples/s]\n",
82
- "Filter: 100%|██████████| 885/885 [00:00<00:00, 123014.38 examples/s]\n",
83
- "Filter: 100%|██████████| 3620/3620 [00:00<00:00, 142652.68 examples/s]\n",
84
- "Map: 100%|██████████| 2051014/2051014 [02:27<00:00, 13892.40 examples/s]\n",
85
- "Filter: 100%|██████████| 2028907/2028907 [00:12<00:00, 163723.53 examples/s]\n",
86
- "Saving the dataset (1/1 shards): 100%|██████████| 179435/179435 [00:00<00:00, 186519.65 examples/s]\n",
87
- "Saving the dataset (1/1 shards): 100%|██████████| 885/885 [00:00<00:00, 142866.56 examples/s]\n",
88
- "Saving the dataset (1/1 shards): 100%|██████████| 3620/3620 [00:00<00:00, 170674.57 examples/s]\n",
89
- "Saving the dataset (3/3 shards): 100%|██████████| 1826016/1826016 [00:11<00:00, 159762.08 examples/s]\n",
90
- "Saving the dataset (1/1 shards): 100%|██████████| 101445/101445 [00:00<00:00, 193029.72 examples/s]\n",
91
- "Saving the dataset (1/1 shards): 100%|██████████| 101446/101446 [00:00<00:00, 191733.84 examples/s]\n"
92
- ]
93
- }
94
- ],
95
  "source": [
96
  "import re\n",
97
  "\n",
@@ -171,7 +137,7 @@
171
  "\n",
172
  "processed_small_dataset = small_dataset.map(preprocess_data).filter(lambda x: x is not None)\n",
173
  "processed_medium_dataset = medium_dataset.map(preprocess_data).filter(lambda x: x is not None)\n",
174
- "# processed_large_dataset = large_dataset.map(preprocess_data).filter(lambda x: x is not None)\n",
175
  "\n",
176
  "splits = processed_medium_dataset[\"train\"].train_test_split(test_size=0.1, seed=seed)\n",
177
  "train_split = splits[\"train\"]\n",
@@ -202,8 +168,8 @@
202
  "import numpy as np\n",
203
  "from hydra import compose, initialize\n",
204
  "from hydra.core.global_hydra import GlobalHydra\n",
205
- "from mini_transformers import PreTrainedTokenizerFast\n",
206
  "from omegaconf import OmegaConf\n",
 
207
  "\n",
208
  "from mini_transformer.configs import TokenizerCfg\n",
209
  "\n",
@@ -362,11 +328,23 @@
362
  "show_top_k_tokens(processed_medium_dataset, tokenizers, k=20, sample_size=2000)\n",
363
  "plot_token_length_barchart(processed_medium_dataset, tokenizers, sample_size=2000)"
364
  ]
 
 
 
 
 
 
 
 
 
 
 
 
365
  }
366
  ],
367
  "metadata": {
368
  "kernelspec": {
369
- "display_name": "transformer",
370
  "language": "python",
371
  "name": "python3"
372
  },
@@ -380,7 +358,7 @@
380
  "name": "python",
381
  "nbconvert_exporter": "python",
382
  "pygments_lexer": "ipython3",
383
- "version": "3.12.11"
384
  }
385
  },
386
  "nbformat": 4,
 
19
  "\n",
20
  "_ = load_dataset(\"ahazeemi/iwslt14-en-fr\", cache_dir=\"./data/raw\")\n",
21
  "_ = load_dataset(\"Helsinki-NLP/europarl\", \"en-fr\", cache_dir=\"./data/raw\")\n",
22
+ "_ = load_dataset(\"wmt/wmt14\", \"fr-en\", cache_dir=\"./data/raw\")"
23
  ]
24
  },
25
  {
 
32
  },
33
  {
34
  "cell_type": "code",
35
+ "execution_count": null,
36
  "id": "2e0838f5",
37
  "metadata": {},
38
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  "source": [
40
  "from datasets import load_dataset\n",
41
  "\n",
42
  "small_dataset = load_dataset(\"./data/raw/ahazeemi___iwslt14-en-fr\")\n",
43
  "medium_dataset = load_dataset(\"./data/raw/Helsinki-NLP___europarl\")\n",
44
+ "large_dataset = load_dataset(\"./data/raw/wmt___wmt14\")"
45
  ]
46
  },
47
  {
 
54
  },
55
  {
56
  "cell_type": "code",
57
+ "execution_count": null,
58
  "id": "ca4d1867",
59
  "metadata": {},
60
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  "source": [
62
  "import re\n",
63
  "\n",
 
137
  "\n",
138
  "processed_small_dataset = small_dataset.map(preprocess_data).filter(lambda x: x is not None)\n",
139
  "processed_medium_dataset = medium_dataset.map(preprocess_data).filter(lambda x: x is not None)\n",
140
+ "processed_large_dataset = large_dataset.map(preprocess_data).filter(lambda x: x is not None)\n",
141
  "\n",
142
  "splits = processed_medium_dataset[\"train\"].train_test_split(test_size=0.1, seed=seed)\n",
143
  "train_split = splits[\"train\"]\n",
 
168
  "import numpy as np\n",
169
  "from hydra import compose, initialize\n",
170
  "from hydra.core.global_hydra import GlobalHydra\n",
 
171
  "from omegaconf import OmegaConf\n",
172
+ "from transformers import PreTrainedTokenizerFast\n",
173
  "\n",
174
  "from mini_transformer.configs import TokenizerCfg\n",
175
  "\n",
 
328
  "show_top_k_tokens(processed_medium_dataset, tokenizers, k=20, sample_size=2000)\n",
329
  "plot_token_length_barchart(processed_medium_dataset, tokenizers, sample_size=2000)"
330
  ]
331
+ },
332
+ {
333
+ "cell_type": "code",
334
+ "execution_count": null,
335
+ "id": "16332b57",
336
+ "metadata": {},
337
+ "outputs": [],
338
+ "source": [
339
+ "# Large dataset statistics\n",
340
+ "show_top_k_tokens(processed_large_dataset, tokenizers, k=20, sample_size=2000)\n",
341
+ "plot_token_length_barchart(processed_large_dataset, tokenizers, sample_size=2000)"
342
+ ]
343
  }
344
  ],
345
  "metadata": {
346
  "kernelspec": {
347
+ "display_name": "mini-transformer",
348
  "language": "python",
349
  "name": "python3"
350
  },
 
358
  "name": "python",
359
  "nbconvert_exporter": "python",
360
  "pygments_lexer": "ipython3",
361
+ "version": "3.11.13"
362
  }
363
  },
364
  "nbformat": 4,
notebooks/tokenizer.ipynb CHANGED
@@ -10,19 +10,10 @@
10
  },
11
  {
12
  "cell_type": "code",
13
- "execution_count": 1,
14
  "id": "47d34b96",
15
  "metadata": {},
16
- "outputs": [
17
- {
18
- "name": "stderr",
19
- "output_type": "stream",
20
- "text": [
21
- "/home/ala-boussoffara/miniconda3/envs/mini-transformer/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
22
- " from .autonotebook import tqdm as notebook_tqdm\n"
23
- ]
24
- }
25
- ],
26
  "source": [
27
  "from datasets import concatenate_datasets, load_from_disk\n",
28
  "from hydra import compose, initialize\n",
@@ -44,7 +35,7 @@
44
  },
45
  {
46
  "cell_type": "code",
47
- "execution_count": 9,
48
  "id": "8f13dc2b",
49
  "metadata": {},
50
  "outputs": [],
@@ -66,7 +57,7 @@
66
  },
67
  {
68
  "cell_type": "code",
69
- "execution_count": 3,
70
  "id": "d880e59e",
71
  "metadata": {},
72
  "outputs": [],
@@ -94,7 +85,7 @@
94
  },
95
  {
96
  "cell_type": "code",
97
- "execution_count": 4,
98
  "id": "f60ac4b2",
99
  "metadata": {},
100
  "outputs": [],
@@ -118,27 +109,26 @@
118
  },
119
  {
120
  "cell_type": "code",
121
- "execution_count": 10,
122
  "id": "29fc0f7e",
123
  "metadata": {},
124
- "outputs": [
125
- {
126
- "name": "stdout",
127
- "output_type": "stream",
128
- "text": [
129
- "\n",
130
- "\n",
131
- "\n"
132
- ]
133
- }
134
- ],
135
  "source": [
136
- "tokenizer = Tokenizer(models.BPE(unk_token=tokenizer_cfg.unk_token))\n",
 
 
 
 
 
 
 
137
  "tokenizer.pre_tokenizer = pre_tokenizers.Sequence(\n",
138
  " [pre_tokenizers.Whitespace(), pre_tokenizers.Punctuation()]\n",
139
  ")\n",
140
  "trainer = trainers.BpeTrainer(\n",
141
- " vocab_size=tokenizer_cfg.vocab_size, special_tokens=tokenizer_cfg.special_tokens\n",
 
 
142
  ")\n",
143
  "tokenizer.train([tokenizer_cfg.corpus], trainer)\n",
144
  "tokenizer.post_processor = TemplateProcessing(\n",
@@ -161,22 +151,10 @@
161
  },
162
  {
163
  "cell_type": "code",
164
- "execution_count": 6,
165
  "id": "443ed7ee",
166
  "metadata": {},
167
- "outputs": [
168
- {
169
- "name": "stdout",
170
- "output_type": "stream",
171
- "text": [
172
- "['i', 'here', 'by', 'an', 'n', 'ou', 'ce', 'you', 'as', 'the', 'next', 'presi', 'dent']\n",
173
- "PAD: 0\n",
174
- "BOS: 1\n",
175
- "EOS: 2\n",
176
- "UNK: 3\n"
177
- ]
178
- }
179
- ],
180
  "source": [
181
  "from tokenizers import Tokenizer\n",
182
  "\n",
@@ -195,7 +173,7 @@
195
  ],
196
  "metadata": {
197
  "kernelspec": {
198
- "display_name": "transformer",
199
  "language": "python",
200
  "name": "python3"
201
  },
@@ -209,7 +187,7 @@
209
  "name": "python",
210
  "nbconvert_exporter": "python",
211
  "pygments_lexer": "ipython3",
212
- "version": "3.12.11"
213
  }
214
  },
215
  "nbformat": 4,
 
10
  },
11
  {
12
  "cell_type": "code",
13
+ "execution_count": null,
14
  "id": "47d34b96",
15
  "metadata": {},
16
+ "outputs": [],
 
 
 
 
 
 
 
 
 
17
  "source": [
18
  "from datasets import concatenate_datasets, load_from_disk\n",
19
  "from hydra import compose, initialize\n",
 
35
  },
36
  {
37
  "cell_type": "code",
38
+ "execution_count": null,
39
  "id": "8f13dc2b",
40
  "metadata": {},
41
  "outputs": [],
 
57
  },
58
  {
59
  "cell_type": "code",
60
+ "execution_count": null,
61
  "id": "d880e59e",
62
  "metadata": {},
63
  "outputs": [],
 
85
  },
86
  {
87
  "cell_type": "code",
88
+ "execution_count": null,
89
  "id": "f60ac4b2",
90
  "metadata": {},
91
  "outputs": [],
 
109
  },
110
  {
111
  "cell_type": "code",
112
+ "execution_count": null,
113
  "id": "29fc0f7e",
114
  "metadata": {},
115
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
116
  "source": [
117
+ "CONTINUING_SUBWORD_PREFIX = \"##\"\n",
118
+ "\n",
119
+ "tokenizer = Tokenizer(\n",
120
+ " models.BPE(\n",
121
+ " unk_token=tokenizer_cfg.unk_token,\n",
122
+ " continuing_subword_prefix=CONTINUING_SUBWORD_PREFIX,\n",
123
+ " )\n",
124
+ ")\n",
125
  "tokenizer.pre_tokenizer = pre_tokenizers.Sequence(\n",
126
  " [pre_tokenizers.Whitespace(), pre_tokenizers.Punctuation()]\n",
127
  ")\n",
128
  "trainer = trainers.BpeTrainer(\n",
129
+ " vocab_size=tokenizer_cfg.vocab_size,\n",
130
+ " special_tokens=tokenizer_cfg.special_tokens,\n",
131
+ " continuing_subword_prefix=CONTINUING_SUBWORD_PREFIX,\n",
132
  ")\n",
133
  "tokenizer.train([tokenizer_cfg.corpus], trainer)\n",
134
  "tokenizer.post_processor = TemplateProcessing(\n",
 
151
  },
152
  {
153
  "cell_type": "code",
154
+ "execution_count": null,
155
  "id": "443ed7ee",
156
  "metadata": {},
157
+ "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
158
  "source": [
159
  "from tokenizers import Tokenizer\n",
160
  "\n",
 
173
  ],
174
  "metadata": {
175
  "kernelspec": {
176
+ "display_name": "mini-transformer",
177
  "language": "python",
178
  "name": "python3"
179
  },
 
187
  "name": "python",
188
  "nbconvert_exporter": "python",
189
  "pygments_lexer": "ipython3",
190
+ "version": "3.11.13"
191
  }
192
  },
193
  "nbformat": 4,
notebooks/train.ipynb CHANGED
@@ -10,10 +10,19 @@
10
  },
11
  {
12
  "cell_type": "code",
13
- "execution_count": null,
14
  "id": "5a9e6fb4",
15
  "metadata": {},
16
- "outputs": [],
 
 
 
 
 
 
 
 
 
17
  "source": [
18
  "import contextlib\n",
19
  "import json\n",
@@ -30,11 +39,11 @@
30
  "from hydra import compose, initialize\n",
31
  "from hydra.core.global_hydra import GlobalHydra\n",
32
  "from hydra.utils import to_absolute_path\n",
33
- "from mini_transformers import PreTrainedTokenizerFast\n",
34
  "from omegaconf import OmegaConf\n",
35
  "from torch.nn.utils import clip_grad_norm_\n",
36
  "from torch.utils.data import DataLoader\n",
37
  "from tqdm import tqdm\n",
 
38
  "\n",
39
  "from mini_transformer import BasicEncoderDecoderTransformer\n",
40
  "from mini_transformer.configs import ModelCfg, TokenizerCfg, TrainAppCfg\n",
@@ -56,10 +65,18 @@
56
  },
57
  {
58
  "cell_type": "code",
59
- "execution_count": null,
60
  "id": "d1c043be",
61
  "metadata": {},
62
- "outputs": [],
 
 
 
 
 
 
 
 
63
  "source": [
64
  "project_root = Path(__file__).resolve().parent if \"__file__\" in globals() else Path.cwd()\n",
65
  "os.chdir(project_root)\n",
@@ -76,7 +93,7 @@
76
  },
77
  {
78
  "cell_type": "code",
79
- "execution_count": null,
80
  "id": "2bd6dd82",
81
  "metadata": {},
82
  "outputs": [],
@@ -86,12 +103,12 @@
86
  "cfg = compose(\n",
87
  " config_name=\"train_mode\",\n",
88
  " overrides=[\n",
89
- " \"model=test_model\",\n",
90
- " \"tokenizer=bpe_8k\",\n",
91
  " \"dataset=medium_dataset\",\n",
92
- " \"trainer.batch_size=128\",\n",
93
- " \"trainer.gradient_accumulation=2\",\n",
94
- " \"trainer.epochs=80\",\n",
95
  " ],\n",
96
  ")\n",
97
  "scfg_temp = OmegaConf.merge(OmegaConf.structured(TrainAppCfg), cfg)\n",
@@ -114,14 +131,23 @@
114
  },
115
  {
116
  "cell_type": "code",
117
- "execution_count": null,
118
  "id": "8d60e085",
119
  "metadata": {},
120
- "outputs": [],
 
 
 
 
 
 
 
 
 
121
  "source": [
122
  "dataset = load_from_disk(cfg.dataset.path)\n",
123
  "\n",
124
- "train_dataset = dataset[\"train\"].select(range(200000))\n",
125
  "validation_dataset = dataset[\"validation\"]\n",
126
  "test_dataset = dataset[\"test\"]\n",
127
  "\n",
@@ -135,6 +161,9 @@
135
  "\n",
136
  "dataloader_generator = torch.Generator().manual_seed(scfg.runtime.seed)\n",
137
  "worker_init = make_worker_init_fn(scfg.runtime.seed)\n",
 
 
 
138
  "\n",
139
  "train_dataloader = DataLoader(\n",
140
  " train_dataset,\n",
@@ -143,6 +172,9 @@
143
  " collate_fn=tuple_collate_fn,\n",
144
  " generator=dataloader_generator,\n",
145
  " worker_init_fn=worker_init,\n",
 
 
 
146
  ")\n",
147
  "validation_dataloader = DataLoader(\n",
148
  " validation_dataset,\n",
@@ -151,6 +183,9 @@
151
  " collate_fn=tuple_collate_fn,\n",
152
  " generator=dataloader_generator,\n",
153
  " worker_init_fn=worker_init,\n",
 
 
 
154
  ")\n",
155
  "test_dataloader = DataLoader(\n",
156
  " test_dataset,\n",
@@ -159,6 +194,9 @@
159
  " collate_fn=tuple_collate_fn,\n",
160
  " generator=dataloader_generator,\n",
161
  " worker_init_fn=worker_init,\n",
 
 
 
162
  ")\n",
163
  "\n",
164
  "print(\"Number of training samples:\", len(train_dataset))\n",
@@ -175,10 +213,18 @@
175
  },
176
  {
177
  "cell_type": "code",
178
- "execution_count": null,
179
  "id": "f9da0dab",
180
  "metadata": {},
181
- "outputs": [],
 
 
 
 
 
 
 
 
182
  "source": [
183
  "device = torch.device(scfg.runtime.device)\n",
184
  "model = BasicEncoderDecoderTransformer(model_cfg).to(device)\n",
@@ -225,7 +271,7 @@
225
  },
226
  {
227
  "cell_type": "code",
228
- "execution_count": null,
229
  "id": "372dea7e",
230
  "metadata": {},
231
  "outputs": [],
@@ -297,7 +343,7 @@
297
  },
298
  {
299
  "cell_type": "code",
300
- "execution_count": null,
301
  "id": "4ad52841",
302
  "metadata": {},
303
  "outputs": [],
@@ -335,7 +381,7 @@
335
  },
336
  {
337
  "cell_type": "code",
338
- "execution_count": null,
339
  "id": "479390a8",
340
  "metadata": {},
341
  "outputs": [],
@@ -390,10 +436,18 @@
390
  },
391
  {
392
  "cell_type": "code",
393
- "execution_count": null,
394
  "id": "a9843809",
395
  "metadata": {},
396
- "outputs": [],
 
 
 
 
 
 
 
 
397
  "source": [
398
  "output_root = Path(to_absolute_path(scfg.runtime.output_dir))\n",
399
  "output_root.mkdir(parents=True, exist_ok=True)\n",
@@ -468,7 +522,7 @@
468
  " loaded_checkpoint = torch.load(resume_checkpoint_path, map_location=\"cpu\", weights_only=False)\n",
469
  " model_state = loaded_checkpoint.get(\"model_state_dict\")\n",
470
  " if model_state is not None:\n",
471
- " model.load_state_dict(model_state)\n",
472
  " optim_state = loaded_checkpoint.get(\"optimizer_state_dict\")\n",
473
  " if optim_state is not None:\n",
474
  " optimizer.load_state_dict(optim_state)\n",
@@ -596,10 +650,21 @@
596
  },
597
  {
598
  "cell_type": "code",
599
- "execution_count": null,
600
  "id": "ab23bf3c",
601
  "metadata": {},
602
- "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
603
  "source": [
604
  "# src,tgt=next(iter(train_dataloader))\n",
605
  "src = [\"it can be a very complicated thing, the ocean\"]\n",
@@ -621,15 +686,15 @@
621
  },
622
  {
623
  "cell_type": "code",
624
- "execution_count": null,
625
  "id": "689fe371",
626
  "metadata": {},
627
  "outputs": [],
628
  "source": [
629
  "# Optional transformer debugging / attention capture\n",
630
  "debug_forward_options = {\n",
631
- " \"enabled\": True, # flip to True to run debug_transformer_forward\n",
632
- " \"show_attention\": False, # show attention plots interactively\n",
633
  " \"save_attention\": False, # persist attention artefacts\n",
634
  " \"attention_layers\": None, # e.g. [0, 1] to restrict encoder/decoder layers\n",
635
  " \"attention_heads\": None, # e.g. [0, 3] to filter heads\n",
@@ -653,7 +718,7 @@
653
  },
654
  {
655
  "cell_type": "code",
656
- "execution_count": null,
657
  "id": "af2e9c6a",
658
  "metadata": {},
659
  "outputs": [],
@@ -695,11 +760,22 @@
695
  "execution_count": null,
696
  "id": "439d4094",
697
  "metadata": {},
698
- "outputs": [],
 
 
 
 
 
 
 
 
699
  "source": [
700
  "model.to(device)\n",
701
  "model.enable_gradient_checkpointing(cfg.trainer.gradient_checkpointing)\n",
702
  "\n",
 
 
 
703
  "optimizer.zero_grad(set_to_none=True)\n",
704
  "\n",
705
  "optimizer_step = completed_optimizer_steps\n",
@@ -711,6 +787,7 @@
711
  " running_loss = current_resume_running_loss if epoch == start_epoch else 0.0\n",
712
  " batches_processed = 0\n",
713
  " last_batch_idx = -1\n",
 
714
  " for batch_idx, (src, tgt) in enumerate(\n",
715
  " tqdm(train_dataloader, desc=f\"Epoch {epoch + 1} [train]\")\n",
716
  " ):\n",
@@ -749,11 +826,12 @@
749
  " loss = criterion(logits.reshape(-1, logits.size(-1)), labels.reshape(-1))\n",
750
  "\n",
751
  " running_loss += loss.item()\n",
752
- " loss = loss / scfg.trainer.gradient_accumulation\n",
753
  " scaled_loss = scaler.scale(loss)\n",
754
  " scaled_loss.backward()\n",
 
755
  "\n",
756
- " if (batch_idx + 1) % scfg.trainer.gradient_accumulation == 0:\n",
757
  " scaler.unscale_(optimizer)\n",
758
  " clip_grad_norm_(model.parameters(), cfg.trainer.clip_grad_norm)\n",
759
  " scaler.step(optimizer)\n",
@@ -761,27 +839,37 @@
761
  " optimizer.zero_grad(set_to_none=True)\n",
762
  " scheduler.step()\n",
763
  " optimizer_step += 1\n",
764
- " save_checkpoint(\n",
765
- " epoch,\n",
766
- " optimizer_step,\n",
767
- " batch_idx=batch_idx + 1,\n",
768
- " running_loss_value=running_loss,\n",
769
- " )\n",
 
 
770
  "\n",
771
- " if batches_processed and (batches_processed % scfg.trainer.gradient_accumulation != 0):\n",
772
  " scaler.unscale_(optimizer)\n",
 
 
 
 
 
 
773
  " clip_grad_norm_(model.parameters(), cfg.trainer.clip_grad_norm)\n",
774
  " scaler.step(optimizer)\n",
775
  " scaler.update()\n",
776
  " optimizer.zero_grad(set_to_none=True)\n",
777
  " scheduler.step()\n",
778
  " optimizer_step += 1\n",
779
- " save_checkpoint(\n",
780
- " epoch,\n",
781
- " optimizer_step,\n",
782
- " batch_idx=last_batch_idx + 1,\n",
783
- " running_loss_value=running_loss,\n",
784
- " )\n",
 
 
785
  "\n",
786
  " avg_train_loss = running_loss / len(train_dataloader)\n",
787
  " print(f\"Epoch [{epoch + 1}/{scfg.trainer.epochs}] Train Loss: {avg_train_loss:.4f}\")\n",
@@ -814,7 +902,7 @@
814
  " tgt_ids = encoded_tgt[\"input_ids\"].to(device)\n",
815
  " decoder_in = tgt_ids[:, :-1]\n",
816
  " labels = tgt_ids[:, 1:]\n",
817
- " tgt_padd_mask = decoder_in.eq(scfg.tokenizer.pad_id)\n",
818
  "\n",
819
  " logits = model(src_ids, decoder_in, src_padd_mask, tgt_padd_mask)\n",
820
  " loss = criterion(logits.reshape(-1, logits.size(-1)), labels.reshape(-1))\n",
@@ -940,6 +1028,60 @@
940
  " print(\"No training history available to plot.\")"
941
  ]
942
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
943
  {
944
  "cell_type": "markdown",
945
  "id": "f8652b1c",
@@ -965,7 +1107,7 @@
965
  ],
966
  "metadata": {
967
  "kernelspec": {
968
- "display_name": "transformer",
969
  "language": "python",
970
  "name": "python3"
971
  },
@@ -979,7 +1121,7 @@
979
  "name": "python",
980
  "nbconvert_exporter": "python",
981
  "pygments_lexer": "ipython3",
982
- "version": "3.12.11"
983
  }
984
  },
985
  "nbformat": 4,
 
10
  },
11
  {
12
  "cell_type": "code",
13
+ "execution_count": 1,
14
  "id": "5a9e6fb4",
15
  "metadata": {},
16
+ "outputs": [
17
+ {
18
+ "name": "stderr",
19
+ "output_type": "stream",
20
+ "text": [
21
+ "/home/ala-boussoffara/miniconda3/envs/mini-transformer/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
22
+ " from .autonotebook import tqdm as notebook_tqdm\n"
23
+ ]
24
+ }
25
+ ],
26
  "source": [
27
  "import contextlib\n",
28
  "import json\n",
 
39
  "from hydra import compose, initialize\n",
40
  "from hydra.core.global_hydra import GlobalHydra\n",
41
  "from hydra.utils import to_absolute_path\n",
 
42
  "from omegaconf import OmegaConf\n",
43
  "from torch.nn.utils import clip_grad_norm_\n",
44
  "from torch.utils.data import DataLoader\n",
45
  "from tqdm import tqdm\n",
46
+ "from transformers import PreTrainedTokenizerFast\n",
47
  "\n",
48
  "from mini_transformer import BasicEncoderDecoderTransformer\n",
49
  "from mini_transformer.configs import ModelCfg, TokenizerCfg, TrainAppCfg\n",
 
65
  },
66
  {
67
  "cell_type": "code",
68
+ "execution_count": 2,
69
  "id": "d1c043be",
70
  "metadata": {},
71
+ "outputs": [
72
+ {
73
+ "name": "stdout",
74
+ "output_type": "stream",
75
+ "text": [
76
+ "Working directory set to: /mnt/shared/Local/Projets/Mini-Transformer\n"
77
+ ]
78
+ }
79
+ ],
80
  "source": [
81
  "project_root = Path(__file__).resolve().parent if \"__file__\" in globals() else Path.cwd()\n",
82
  "os.chdir(project_root)\n",
 
93
  },
94
  {
95
  "cell_type": "code",
96
+ "execution_count": 3,
97
  "id": "2bd6dd82",
98
  "metadata": {},
99
  "outputs": [],
 
103
  "cfg = compose(\n",
104
  " config_name=\"train_mode\",\n",
105
  " overrides=[\n",
106
+ " \"model=medium_model\",\n",
107
+ " \"tokenizer=bpe_16k\",\n",
108
  " \"dataset=medium_dataset\",\n",
109
+ " \"trainer.batch_size=32\",\n",
110
+ " \"trainer.gradient_accumulation=16\",\n",
111
+ " \"trainer.epochs=10\",\n",
112
  " ],\n",
113
  ")\n",
114
  "scfg_temp = OmegaConf.merge(OmegaConf.structured(TrainAppCfg), cfg)\n",
 
131
  },
132
  {
133
  "cell_type": "code",
134
+ "execution_count": 4,
135
  "id": "8d60e085",
136
  "metadata": {},
137
+ "outputs": [
138
+ {
139
+ "name": "stdout",
140
+ "output_type": "stream",
141
+ "text": [
142
+ "Number of training samples: 1826016\n",
143
+ "Number of training batches: 57063\n"
144
+ ]
145
+ }
146
+ ],
147
  "source": [
148
  "dataset = load_from_disk(cfg.dataset.path)\n",
149
  "\n",
150
+ "train_dataset = dataset[\"train\"]\n",
151
  "validation_dataset = dataset[\"validation\"]\n",
152
  "test_dataset = dataset[\"test\"]\n",
153
  "\n",
 
161
  "\n",
162
  "dataloader_generator = torch.Generator().manual_seed(scfg.runtime.seed)\n",
163
  "worker_init = make_worker_init_fn(scfg.runtime.seed)\n",
164
+ "num_workers = int(getattr(scfg.trainer, \"num_workers\", 0))\n",
165
+ "pin_memory = bool(getattr(scfg.trainer, \"pin_memory\", scfg.runtime.device.startswith(\"cuda\")))\n",
166
+ "persistent_workers = num_workers > 0\n",
167
  "\n",
168
  "train_dataloader = DataLoader(\n",
169
  " train_dataset,\n",
 
172
  " collate_fn=tuple_collate_fn,\n",
173
  " generator=dataloader_generator,\n",
174
  " worker_init_fn=worker_init,\n",
175
+ " num_workers=num_workers,\n",
176
+ " pin_memory=pin_memory,\n",
177
+ " persistent_workers=persistent_workers,\n",
178
  ")\n",
179
  "validation_dataloader = DataLoader(\n",
180
  " validation_dataset,\n",
 
183
  " collate_fn=tuple_collate_fn,\n",
184
  " generator=dataloader_generator,\n",
185
  " worker_init_fn=worker_init,\n",
186
+ " num_workers=num_workers,\n",
187
+ " pin_memory=pin_memory,\n",
188
+ " persistent_workers=persistent_workers,\n",
189
  ")\n",
190
  "test_dataloader = DataLoader(\n",
191
  " test_dataset,\n",
 
194
  " collate_fn=tuple_collate_fn,\n",
195
  " generator=dataloader_generator,\n",
196
  " worker_init_fn=worker_init,\n",
197
+ " num_workers=num_workers,\n",
198
+ " pin_memory=pin_memory,\n",
199
+ " persistent_workers=persistent_workers,\n",
200
  ")\n",
201
  "\n",
202
  "print(\"Number of training samples:\", len(train_dataset))\n",
 
213
  },
214
  {
215
  "cell_type": "code",
216
+ "execution_count": 5,
217
  "id": "f9da0dab",
218
  "metadata": {},
219
+ "outputs": [
220
+ {
221
+ "name": "stdout",
222
+ "output_type": "stream",
223
+ "text": [
224
+ "Total number of parameters: 184705024\n"
225
+ ]
226
+ }
227
+ ],
228
  "source": [
229
  "device = torch.device(scfg.runtime.device)\n",
230
  "model = BasicEncoderDecoderTransformer(model_cfg).to(device)\n",
 
271
  },
272
  {
273
  "cell_type": "code",
274
+ "execution_count": 6,
275
  "id": "372dea7e",
276
  "metadata": {},
277
  "outputs": [],
 
343
  },
344
  {
345
  "cell_type": "code",
346
+ "execution_count": 7,
347
  "id": "4ad52841",
348
  "metadata": {},
349
  "outputs": [],
 
381
  },
382
  {
383
  "cell_type": "code",
384
+ "execution_count": 8,
385
  "id": "479390a8",
386
  "metadata": {},
387
  "outputs": [],
 
436
  },
437
  {
438
  "cell_type": "code",
439
+ "execution_count": 9,
440
  "id": "a9843809",
441
  "metadata": {},
442
+ "outputs": [
443
+ {
444
+ "name": "stdout",
445
+ "output_type": "stream",
446
+ "text": [
447
+ "Starting fresh (no resume checkpoint provided).\n"
448
+ ]
449
+ }
450
+ ],
451
  "source": [
452
  "output_root = Path(to_absolute_path(scfg.runtime.output_dir))\n",
453
  "output_root.mkdir(parents=True, exist_ok=True)\n",
 
522
  " loaded_checkpoint = torch.load(resume_checkpoint_path, map_location=\"cpu\", weights_only=False)\n",
523
  " model_state = loaded_checkpoint.get(\"model_state_dict\")\n",
524
  " if model_state is not None:\n",
525
+ " model.load_state_dict(model_state, strict=False)\n",
526
  " optim_state = loaded_checkpoint.get(\"optimizer_state_dict\")\n",
527
  " if optim_state is not None:\n",
528
  " optimizer.load_state_dict(optim_state)\n",
 
650
  },
651
  {
652
  "cell_type": "code",
653
+ "execution_count": 10,
654
  "id": "ab23bf3c",
655
  "metadata": {},
656
+ "outputs": [
657
+ {
658
+ "data": {
659
+ "text/plain": [
660
+ "'src_ids = torch.randint(0, scfg.tokenizer.vocab_size, (2, 50)).to(device, dtype=torch.long)\\ntgt_ids = torch.randint(0, scfg.tokenizer.vocab_size, (2, 50)).to(device, dtype=torch.long)\\nsrc_padd_mask = (src_ids == scfg.tokenizer.pad_id).to(device, dtype=torch.bool)\\ntgt_padd_mask = (tgt_ids == scfg.tokenizer.pad_id).to(device, dtype=torch.bool)'"
661
+ ]
662
+ },
663
+ "execution_count": 10,
664
+ "metadata": {},
665
+ "output_type": "execute_result"
666
+ }
667
+ ],
668
  "source": [
669
  "# src,tgt=next(iter(train_dataloader))\n",
670
  "src = [\"it can be a very complicated thing, the ocean\"]\n",
 
686
  },
687
  {
688
  "cell_type": "code",
689
+ "execution_count": 11,
690
  "id": "689fe371",
691
  "metadata": {},
692
  "outputs": [],
693
  "source": [
694
  "# Optional transformer debugging / attention capture\n",
695
  "debug_forward_options = {\n",
696
+ " \"enabled\": False, # flip to True to run debug_transformer_forward\n",
697
+ " \"show_attention\": True, # show attention plots interactively\n",
698
  " \"save_attention\": False, # persist attention artefacts\n",
699
  " \"attention_layers\": None, # e.g. [0, 1] to restrict encoder/decoder layers\n",
700
  " \"attention_heads\": None, # e.g. [0, 3] to filter heads\n",
 
718
  },
719
  {
720
  "cell_type": "code",
721
+ "execution_count": 12,
722
  "id": "af2e9c6a",
723
  "metadata": {},
724
  "outputs": [],
 
760
  "execution_count": null,
761
  "id": "439d4094",
762
  "metadata": {},
763
+ "outputs": [
764
+ {
765
+ "name": "stderr",
766
+ "output_type": "stream",
767
+ "text": [
768
+ "Epoch 1 [train]: 2%|▏ | 1380/57063 [10:36<6:56:33, 2.23it/s]"
769
+ ]
770
+ }
771
+ ],
772
  "source": [
773
  "model.to(device)\n",
774
  "model.enable_gradient_checkpointing(cfg.trainer.gradient_checkpointing)\n",
775
  "\n",
776
+ "grad_accum = max(1, int(scfg.trainer.gradient_accumulation))\n",
777
+ "save_every_steps = max(1, int(getattr(scfg.trainer, \"save_interval\", 1)))\n",
778
+ "\n",
779
  "optimizer.zero_grad(set_to_none=True)\n",
780
  "\n",
781
  "optimizer_step = completed_optimizer_steps\n",
 
787
  " running_loss = current_resume_running_loss if epoch == start_epoch else 0.0\n",
788
  " batches_processed = 0\n",
789
  " last_batch_idx = -1\n",
790
+ " accum_counter = 0\n",
791
  " for batch_idx, (src, tgt) in enumerate(\n",
792
  " tqdm(train_dataloader, desc=f\"Epoch {epoch + 1} [train]\")\n",
793
  " ):\n",
 
826
  " loss = criterion(logits.reshape(-1, logits.size(-1)), labels.reshape(-1))\n",
827
  "\n",
828
  " running_loss += loss.item()\n",
829
+ " loss = loss / grad_accum\n",
830
  " scaled_loss = scaler.scale(loss)\n",
831
  " scaled_loss.backward()\n",
832
+ " accum_counter += 1\n",
833
  "\n",
834
+ " if accum_counter == grad_accum:\n",
835
  " scaler.unscale_(optimizer)\n",
836
  " clip_grad_norm_(model.parameters(), cfg.trainer.clip_grad_norm)\n",
837
  " scaler.step(optimizer)\n",
 
839
  " optimizer.zero_grad(set_to_none=True)\n",
840
  " scheduler.step()\n",
841
  " optimizer_step += 1\n",
842
+ " if optimizer_step % save_every_steps == 0:\n",
843
+ " save_checkpoint(\n",
844
+ " epoch,\n",
845
+ " optimizer_step,\n",
846
+ " batch_idx=batch_idx + 1,\n",
847
+ " running_loss_value=running_loss,\n",
848
+ " )\n",
849
+ " accum_counter = 0\n",
850
  "\n",
851
+ " if accum_counter > 0:\n",
852
  " scaler.unscale_(optimizer)\n",
853
+ " if accum_counter < grad_accum:\n",
854
+ " adjust_factor = grad_accum / accum_counter\n",
855
+ " for group in optimizer.param_groups:\n",
856
+ " for param in group[\"params\"]:\n",
857
+ " if param.grad is not None:\n",
858
+ " param.grad.mul_(adjust_factor)\n",
859
  " clip_grad_norm_(model.parameters(), cfg.trainer.clip_grad_norm)\n",
860
  " scaler.step(optimizer)\n",
861
  " scaler.update()\n",
862
  " optimizer.zero_grad(set_to_none=True)\n",
863
  " scheduler.step()\n",
864
  " optimizer_step += 1\n",
865
+ " if optimizer_step % save_every_steps == 0:\n",
866
+ " save_checkpoint(\n",
867
+ " epoch,\n",
868
+ " optimizer_step,\n",
869
+ " batch_idx=last_batch_idx + 1,\n",
870
+ " running_loss_value=running_loss,\n",
871
+ " )\n",
872
+ " accum_counter = 0\n",
873
  "\n",
874
  " avg_train_loss = running_loss / len(train_dataloader)\n",
875
  " print(f\"Epoch [{epoch + 1}/{scfg.trainer.epochs}] Train Loss: {avg_train_loss:.4f}\")\n",
 
902
  " tgt_ids = encoded_tgt[\"input_ids\"].to(device)\n",
903
  " decoder_in = tgt_ids[:, :-1]\n",
904
  " labels = tgt_ids[:, 1:]\n",
905
+ " tgt_padd_mask = decoder_in.eq(scfg.tokenizer.pad_id).to(device)\n",
906
  "\n",
907
  " logits = model(src_ids, decoder_in, src_padd_mask, tgt_padd_mask)\n",
908
  " loss = criterion(logits.reshape(-1, logits.size(-1)), labels.reshape(-1))\n",
 
1028
  " print(\"No training history available to plot.\")"
1029
  ]
1030
  },
1031
+ {
1032
+ "cell_type": "markdown",
1033
+ "id": "17bf7bc8",
1034
+ "metadata": {},
1035
+ "source": [
1036
+ "Test Dataset"
1037
+ ]
1038
+ },
1039
+ {
1040
+ "cell_type": "code",
1041
+ "execution_count": null,
1042
+ "id": "39f61da8",
1043
+ "metadata": {},
1044
+ "outputs": [],
1045
+ "source": [
1046
+ "# test the model\n",
1047
+ "model.eval()\n",
1048
+ "test_loss = 0.0\n",
1049
+ "with torch.no_grad(), autocast_ctx:\n",
1050
+ " for src, tgt in tqdm(test_dataloader, desc=\"Testing\"):\n",
1051
+ " encoded_src = tokenizer(\n",
1052
+ " src,\n",
1053
+ " padding=True,\n",
1054
+ " truncation=True,\n",
1055
+ " return_tensors=\"pt\",\n",
1056
+ " add_special_tokens=False,\n",
1057
+ " )\n",
1058
+ " encoded_tgt = tokenizer(\n",
1059
+ " tgt,\n",
1060
+ " padding=True,\n",
1061
+ " truncation=True,\n",
1062
+ " return_tensors=\"pt\",\n",
1063
+ " )\n",
1064
+ "\n",
1065
+ " src_ids = encoded_src[\"input_ids\"].to(device)\n",
1066
+ " src_padd_mask = (encoded_src[\"attention_mask\"] == 0).to(device)\n",
1067
+ " tgt_ids = encoded_tgt[\"input_ids\"].to(device)\n",
1068
+ " decoder_in = tgt_ids[:, :-1]\n",
1069
+ " labels = tgt_ids[:, 1:]\n",
1070
+ " tgt_padd_mask = decoder_in.eq(scfg.tokenizer.pad_id)\n",
1071
+ "\n",
1072
+ " logits = model(src_ids, decoder_in, src_padd_mask, tgt_padd_mask)\n",
1073
+ " loss = criterion(logits.reshape(-1, logits.size(-1)), labels.reshape(-1))\n",
1074
+ " test_loss += loss.item()\n",
1075
+ "avg_test_loss = test_loss / max(1, len(test_dataloader))\n",
1076
+ "print(f\"Test Loss: {avg_test_loss:.4f}\")\n",
1077
+ "# save test loss to the manifest\n",
1078
+ "manifest_data[\"test\"] = {\n",
1079
+ " \"test_loss\": avg_test_loss,\n",
1080
+ " \"timestamp\": datetime.now().isoformat(),\n",
1081
+ "}\n",
1082
+ "manifest_path.write_text(json.dumps(manifest_data, indent=2))"
1083
+ ]
1084
+ },
1085
  {
1086
  "cell_type": "markdown",
1087
  "id": "f8652b1c",
 
1107
  ],
1108
  "metadata": {
1109
  "kernelspec": {
1110
+ "display_name": "mini-transformer",
1111
  "language": "python",
1112
  "name": "python3"
1113
  },
 
1121
  "name": "python",
1122
  "nbconvert_exporter": "python",
1123
  "pygments_lexer": "ipython3",
1124
+ "version": "3.11.13"
1125
  }
1126
  },
1127
  "nbformat": 4,
pyproject.toml CHANGED
@@ -31,6 +31,8 @@ dev = [
31
  "fastapi",
32
  "uvicorn[standard]",
33
  "chainlit",
 
 
34
  ]
35
  server = [
36
  "fastapi",
@@ -89,3 +91,9 @@ ignore_missing_imports = true
89
  files = ["src"]
90
  mypy_path = ["src"]
91
  explicit_package_bases = true
 
 
 
 
 
 
 
31
  "fastapi",
32
  "uvicorn[standard]",
33
  "chainlit",
34
+ "matplotlib",
35
+ "jupyterlab"
36
  ]
37
  server = [
38
  "fastapi",
 
91
  files = ["src"]
92
  mypy_path = ["src"]
93
  explicit_package_bases = true
94
+
95
+ [tool.isort]
96
+ profile = "black"
97
+ line_length = 100
98
+ known_first_party = ["mini_transformer", "tests"]
99
+ combine_as_imports = true
src/mini_transformer/apps/chainlit_app.py CHANGED
@@ -1,6 +1,7 @@
1
  from __future__ import annotations
2
 
3
  import os
 
4
  from typing import Any
5
 
6
  import chainlit as cl
@@ -17,6 +18,7 @@ from mini_transformer.model_loader import (
17
 
18
  JOB_NAME = "chainlit_app"
19
  MODEL_SESSION_KEY = "selected_model"
 
20
  HAS_ACTION_PROMPT = hasattr(cl, "AskActionMessage") and hasattr(cl, "Action")
21
 
22
 
@@ -32,6 +34,86 @@ def _discover_action_fields() -> set[str]:
32
 
33
 
34
  ACTION_FIELDS = _discover_action_fields()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
 
37
  class ModelOption:
@@ -140,6 +222,11 @@ def build_config(user_input: str, model: ModelOption) -> DictConfig:
140
  if GlobalHydra.instance().is_initialized():
141
  GlobalHydra.instance().clear()
142
  cfg = compose_model_config(model.name, job_name=model.job_name)
 
 
 
 
 
143
  cfg.input_text = user_input
144
  return cfg
145
 
@@ -181,6 +268,56 @@ async def handle_model_command(content: str) -> None:
181
  ).send()
182
 
183
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
184
  @cl.on_chat_start
185
  async def on_chat_start() -> None:
186
  model = await ensure_model_selected()
@@ -189,6 +326,7 @@ async def on_chat_start() -> None:
189
  await cl.Message(
190
  content=(
191
  f"Using trained model `{model.name}`. Send text for generation, or type `/model` to switch models."
 
192
  )
193
  ).send()
194
 
@@ -200,6 +338,9 @@ async def on_message(message: cl.Message) -> None:
200
  if user_input.lower().startswith("/model"):
201
  await handle_model_command(user_input)
202
  return
 
 
 
203
 
204
  if not user_input:
205
  await cl.Message(content="Please provide some text for the model.").send()
 
1
  from __future__ import annotations
2
 
3
  import os
4
+ import shlex
5
  from typing import Any
6
 
7
  import chainlit as cl
 
18
 
19
  JOB_NAME = "chainlit_app"
20
  MODEL_SESSION_KEY = "selected_model"
21
+ GENERATION_SESSION_KEY = "generation_overrides"
22
  HAS_ACTION_PROMPT = hasattr(cl, "AskActionMessage") and hasattr(cl, "Action")
23
 
24
 
 
34
 
35
 
36
  ACTION_FIELDS = _discover_action_fields()
37
+ GENERATION_FIELD_ORDER = [
38
+ "max_new_tokens",
39
+ "temperature",
40
+ "top_k",
41
+ "top_p",
42
+ "do_sample",
43
+ "presence_penalty",
44
+ "frequency_penalty",
45
+ "no_repeat_ngram",
46
+ "min_steps_before_eos",
47
+ ]
48
+ OPTIONAL_KEYS = {"top_k", "top_p", "no_repeat_ngram"}
49
+ BOOL_KEYS = {"do_sample"}
50
+
51
+
52
+ def _parse_bool(value: str) -> bool:
53
+ candidates = {"true", "1", "yes", "y", "on"}
54
+ anti_candidates = {"false", "0", "no", "n", "off"}
55
+ lower = value.lower()
56
+ if lower in candidates:
57
+ return True
58
+ if lower in anti_candidates:
59
+ return False
60
+ raise ValueError("expected a boolean (true/false)")
61
+
62
+
63
+ def _parse_optional(value: str) -> str | None:
64
+ lower = value.lower()
65
+ if lower in {"none", "null", "default"}:
66
+ return None
67
+ return value
68
+
69
+
70
+ def _parse_generation_value(key: str, raw: str) -> Any:
71
+ parsed = _parse_optional(raw) if key in OPTIONAL_KEYS else raw
72
+ if parsed is None:
73
+ return None
74
+ if key in BOOL_KEYS:
75
+ return _parse_bool(parsed)
76
+ if key in {"max_new_tokens", "top_k", "no_repeat_ngram", "min_steps_before_eos"}:
77
+ return int(parsed)
78
+ return float(parsed)
79
+
80
+
81
+ def _get_generation_overrides() -> dict[str, Any]:
82
+ overrides: dict[str, Any] | None = cl.user_session.get(GENERATION_SESSION_KEY)
83
+ return dict(overrides) if overrides else {}
84
+
85
+
86
+ def _set_generation_overrides(overrides: dict[str, Any]) -> None:
87
+ cl.user_session.set(GENERATION_SESSION_KEY, overrides)
88
+
89
+
90
+ def _format_generation_overrides(overrides: dict[str, Any]) -> str:
91
+ if not overrides:
92
+ return " (none)"
93
+ lines: list[str] = []
94
+ for key in GENERATION_FIELD_ORDER:
95
+ if key not in overrides:
96
+ continue
97
+ value = overrides[key]
98
+ if isinstance(value, bool):
99
+ display = "true" if value else "false"
100
+ else:
101
+ display = "None" if value is None else str(value)
102
+ lines.append(f"- {key} = {display}")
103
+ return "\n".join(lines) if lines else " (none)"
104
+
105
+
106
+ def _render_generation_help(overrides: dict[str, Any]) -> str:
107
+ allowed = ", ".join(GENERATION_FIELD_ORDER)
108
+ summary = _format_generation_overrides(overrides)
109
+ return (
110
+ "Current generation overrides:\n"
111
+ f"{summary}\n\n"
112
+ "Usage: /config key=value [key=value ...]\n"
113
+ "Set optional fields to 'none' to restore default values.\n"
114
+ "Run `/config reset` to clear all overrides.\n"
115
+ f"Allowed keys: {allowed}"
116
+ )
117
 
118
 
119
  class ModelOption:
 
222
  if GlobalHydra.instance().is_initialized():
223
  GlobalHydra.instance().clear()
224
  cfg = compose_model_config(model.name, job_name=model.job_name)
225
+ overrides = _get_generation_overrides()
226
+ if overrides:
227
+ for key, value in overrides.items():
228
+ if key in cfg.generation:
229
+ cfg.generation[key] = value
230
  cfg.input_text = user_input
231
  return cfg
232
 
 
268
  ).send()
269
 
270
 
271
+ async def handle_generation_command(content: str) -> None:
272
+ tokens = shlex.split(content)
273
+ overrides = _get_generation_overrides()
274
+
275
+ if len(tokens) == 1:
276
+ await cl.Message(content=_render_generation_help(overrides)).send()
277
+ return
278
+
279
+ first = tokens[1].lower()
280
+ if first == "reset":
281
+ _set_generation_overrides({})
282
+ await cl.Message(
283
+ content="Generation overrides cleared. Using model defaults for all parameters."
284
+ ).send()
285
+ return
286
+
287
+ updates: dict[str, Any] = {}
288
+ errors: list[str] = []
289
+ for token in tokens[1:]:
290
+ if "=" not in token:
291
+ errors.append(f"Missing '=' in '{token}'. Use key=value format.")
292
+ continue
293
+ key, raw_value = token.split("=", 1)
294
+ normalized_key = key.strip().lower()
295
+ if normalized_key not in GENERATION_FIELD_ORDER:
296
+ errors.append(f"Unknown parameter '{key}'.")
297
+ continue
298
+ try:
299
+ value = _parse_generation_value(normalized_key, raw_value.strip())
300
+ except ValueError as exc:
301
+ errors.append(f"Invalid value for '{key}': {exc}")
302
+ continue
303
+ updates[normalized_key] = value
304
+
305
+ if updates:
306
+ overrides.update(updates)
307
+ _set_generation_overrides(overrides)
308
+
309
+ parts: list[str] = []
310
+ if updates:
311
+ parts.append("Updated generation overrides:\n" + _format_generation_overrides(overrides))
312
+ if errors:
313
+ formatted_errors = "\n".join(f"- {msg}" for msg in errors)
314
+ parts.append(f"Issues detected:\n{formatted_errors}")
315
+ if not parts:
316
+ parts.append(_render_generation_help(overrides))
317
+
318
+ await cl.Message(content="\n\n".join(parts)).send()
319
+
320
+
321
  @cl.on_chat_start
322
  async def on_chat_start() -> None:
323
  model = await ensure_model_selected()
 
326
  await cl.Message(
327
  content=(
328
  f"Using trained model `{model.name}`. Send text for generation, or type `/model` to switch models."
329
+ " Use `/config` to tweak generation settings."
330
  )
331
  ).send()
332
 
 
338
  if user_input.lower().startswith("/model"):
339
  await handle_model_command(user_input)
340
  return
341
+ if user_input.lower().startswith("/config"):
342
+ await handle_generation_command(user_input)
343
+ return
344
 
345
  if not user_input:
346
  await cl.Message(content="Please provide some text for the model.").send()
src/mini_transformer/configs.py CHANGED
@@ -50,7 +50,6 @@ class OptimCfg:
50
  betas: tuple[float, float]
51
  weight_decay: float
52
  eps: float
53
- no_decay_on_bias_norm_embed: bool
54
 
55
 
56
  @dataclass
 
50
  betas: tuple[float, float]
51
  weight_decay: float
52
  eps: float
 
53
 
54
 
55
  @dataclass
src/mini_transformer/utils.py CHANGED
@@ -165,7 +165,8 @@ def _attention_with_probs(
165
  full_mask_rows = None
166
  if mask is not None:
167
  mask = mask.to(scores.device)
168
- scores = scores.masked_fill(mask, torch.finfo(work_dtype).min)
 
169
  full_mask_rows = mask.all(dim=-1, keepdim=True)
170
  if full_mask_rows.any():
171
  scores = scores.masked_fill(full_mask_rows, 0.0)
@@ -494,9 +495,10 @@ def extract_all_attention_maps(
494
  cur = x
495
  for layer in enc_layers:
496
  mha = layer.attention_layer
497
- q = split_heads(mha.query_linear(cur), mha.num_heads)
498
- k = split_heads(mha.key_linear(cur), mha.num_heads)
499
- v = split_heads(mha.value_linear(cur), mha.num_heads)
 
500
  mask = create_qk_padding_mask(src_pad_b, src_pad_b)
501
  _, probs = calculate_attention(q, k, v, mask, dropout_p=0.0, return_probs=True)
502
  enc_self_maps.append(probs)
@@ -506,10 +508,13 @@ def extract_all_attention_maps(
506
 
507
  y_in = y
508
  for layer in dec_layers:
 
 
509
  self_mha = layer.self_attention_layer
510
- q = split_heads(self_mha.query_linear(y_in), self_mha.num_heads)
511
- k = split_heads(self_mha.key_linear(y_in), self_mha.num_heads)
512
- v = split_heads(self_mha.value_linear(y_in), self_mha.num_heads)
 
513
  pad = create_qk_padding_mask(tgt_pad_b, tgt_pad_b)
514
  combined_mask = combine_masks(tgt_causal, pad)
515
  self_ctx, self_probs = calculate_attention(
@@ -517,11 +522,17 @@ def extract_all_attention_maps(
517
  )
518
  dec_self_maps.append(self_probs)
519
 
520
- self_out = self_mha(y_in, y_in, y_in, tgt_pad_b, tgt_pad_b, tgt_causal)
521
- y_mid = y_in + layer.dropout1(layer.norm1(self_out))
 
 
 
 
 
 
522
 
523
  cross_mha = layer.cross_attention_layer
524
- cq = split_heads(cross_mha.query_linear(y_mid), cross_mha.num_heads)
525
  ck = split_heads(cross_mha.key_linear(mem_full), cross_mha.num_heads)
526
  cv = split_heads(cross_mha.value_linear(mem_full), cross_mha.num_heads)
527
  cmask = create_qk_padding_mask(tgt_pad_b, src_pad_b)
 
165
  full_mask_rows = None
166
  if mask is not None:
167
  mask = mask.to(scores.device)
168
+ fill_value = torch.finfo(scores.dtype).min
169
+ scores = scores.masked_fill(mask, fill_value)
170
  full_mask_rows = mask.all(dim=-1, keepdim=True)
171
  if full_mask_rows.any():
172
  scores = scores.masked_fill(full_mask_rows, 0.0)
 
495
  cur = x
496
  for layer in enc_layers:
497
  mha = layer.attention_layer
498
+ attn_input = layer.norm1(cur) if getattr(layer, "pre_norm", False) else cur
499
+ q = split_heads(mha.query_linear(attn_input), mha.num_heads)
500
+ k = split_heads(mha.key_linear(attn_input), mha.num_heads)
501
+ v = split_heads(mha.value_linear(attn_input), mha.num_heads)
502
  mask = create_qk_padding_mask(src_pad_b, src_pad_b)
503
  _, probs = calculate_attention(q, k, v, mask, dropout_p=0.0, return_probs=True)
504
  enc_self_maps.append(probs)
 
508
 
509
  y_in = y
510
  for layer in dec_layers:
511
+ pre_norm = getattr(layer, "pre_norm", False)
512
+
513
  self_mha = layer.self_attention_layer
514
+ self_attn_input = layer.norm1(y_in) if pre_norm else y_in
515
+ q = split_heads(self_mha.query_linear(self_attn_input), self_mha.num_heads)
516
+ k = split_heads(self_mha.key_linear(self_attn_input), self_mha.num_heads)
517
+ v = split_heads(self_mha.value_linear(self_attn_input), self_mha.num_heads)
518
  pad = create_qk_padding_mask(tgt_pad_b, tgt_pad_b)
519
  combined_mask = combine_masks(tgt_causal, pad)
520
  self_ctx, self_probs = calculate_attention(
 
522
  )
523
  dec_self_maps.append(self_probs)
524
 
525
+ self_ctx_merged = join_heads(self_ctx)
526
+ self_projected = self_mha.output_linear(self_ctx_merged)
527
+ self_residual = y_in + layer.dropout1(self_projected)
528
+
529
+ if pre_norm:
530
+ cross_query_input = layer.norm2(self_residual)
531
+ else:
532
+ cross_query_input = layer.norm1(self_residual)
533
 
534
  cross_mha = layer.cross_attention_layer
535
+ cq = split_heads(cross_mha.query_linear(cross_query_input), cross_mha.num_heads)
536
  ck = split_heads(cross_mha.key_linear(mem_full), cross_mha.num_heads)
537
  cv = split_heads(cross_mha.value_linear(mem_full), cross_mha.num_heads)
538
  cmask = create_qk_padding_mask(tgt_pad_b, src_pad_b)
tests/units/test_utils.py CHANGED
@@ -1,601 +1,686 @@
1
- import math
2
-
3
- import pytest
4
- import torch
5
- import torch.nn.functional as F
6
-
7
- from mini_transformer.utils import (
8
- calculate_attention,
9
- combine_masks,
10
- create_causal_mask,
11
- join_heads,
12
- sample_from_logits,
13
- sinusoidal_positional_encoding,
14
- split_heads,
15
- )
16
-
17
- ###___split_heads___###
18
-
19
-
20
- def test_happy_path_shape_dtype_device_cpu():
21
- x = torch.randn(2, 10, 16) # B=2, S=10, D=16
22
- out = split_heads(x, num_heads=4)
23
- assert out.shape == (2, 4, 10, 4)
24
- assert out.dtype == x.dtype
25
- assert out.device == x.device
26
-
27
-
28
- def test_smallest_valid():
29
- x = torch.randn(1, 1, 4)
30
- out = split_heads(x, num_heads=2)
31
- assert out.shape == (1, 2, 1, 2)
32
-
33
-
34
- def test_zero_length_seq_allowed():
35
- x = torch.randn(2, 0, 8)
36
- out = split_heads(x, num_heads=2)
37
- assert out.shape == (2, 2, 0, 4)
38
-
39
-
40
- def test_non_3d_input_raises_value_error():
41
- x2 = torch.randn(10, 16)
42
- with pytest.raises(ValueError) as ei2:
43
- split_heads(x2, 4)
44
- assert "(B, S, D)" in str(ei2.value)
45
-
46
- x4 = torch.randn(2, 3, 4, 5)
47
- with pytest.raises(ValueError) as ei4:
48
- split_heads(x4, 4)
49
- assert "(B, S, D)" in str(ei4.value)
50
-
51
-
52
- def test_invalid_num_heads_type_raises_type_error():
53
- x = torch.randn(2, 10, 16)
54
- with pytest.raises(TypeError):
55
- split_heads(x, 4.0) # float
56
- with pytest.raises(TypeError):
57
- split_heads(x, torch.tensor(4)) # Tensor
58
-
59
-
60
- def test_num_heads_leq_zero_raises_value_error():
61
- x = torch.randn(2, 10, 16)
62
- with pytest.raises(ValueError):
63
- split_heads(x, 0)
64
- with pytest.raises(ValueError):
65
- split_heads(x, -2)
66
-
67
-
68
- def test_non_divisible_d_model_raises_value_error_message_has_values():
69
- x = torch.randn(2, 5, 10)
70
- with pytest.raises(ValueError) as e:
71
- split_heads(x, 3)
72
- msg = str(e.value)
73
- assert "d_model (10)" in msg and "num_heads (3)" in msg
74
-
75
-
76
- @pytest.mark.parametrize(
77
- "B,S,D,H",
78
- [
79
- (1, 1, 8, 1),
80
- (2, 3, 12, 3),
81
- (4, 7, 32, 8),
82
- (3, 0, 24, 6),
83
- ],
84
- )
85
- def test_invariants_random_valid(B, S, D, H):
86
- x = torch.randn(B, S, D)
87
- out = split_heads(x, H)
88
- assert out.shape[0] == B
89
- assert out.shape[2] == S
90
- assert (H * (D // H)) == D
91
- assert x.numel() == out.numel()
92
-
93
-
94
- def test_grad_propagates():
95
- x = torch.randn(2, 10, 16, requires_grad=True)
96
- out = split_heads(x, 4)
97
- # Do a simple scalar reduction to make grad non-trivial
98
- loss = out.square().mean()
99
- loss.backward()
100
- assert x.grad is not None
101
- assert x.grad.shape == x.shape
102
-
103
-
104
- def test_non_contiguous_input():
105
- # Create a non-contiguous view by transposing and slicing
106
- base = torch.randn(10, 2, 16)
107
- x = base.transpose(0, 1)[:, :8, :] # shape (2, 8, 16), likely non-contiguous
108
- assert not x.is_contiguous()
109
- out = split_heads(x, 4)
110
- assert out.shape == (2, 4, 8, 4)
111
-
112
-
113
- @pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA not available")
114
- def test_device_preserved_cuda():
115
- x = torch.randn(2, 10, 16, device="cuda")
116
- out = split_heads(x, 4)
117
- assert out.device.type == "cuda"
118
-
119
-
120
- @pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA not available")
121
- def test_dtype_half_bfloat_on_gpu():
122
- x_half = torch.randn(2, 10, 16, device="cuda", dtype=torch.float16)
123
- out_half = split_heads(x_half, 4)
124
- assert out_half.dtype == torch.float16
125
-
126
- # bfloat16 may not be available on all GPUs; guard with try
127
- try:
128
- x_bf16 = torch.randn(2, 10, 16, device="cuda", dtype=torch.bfloat16)
129
- out_bf16 = split_heads(x_bf16, 4)
130
- assert out_bf16.dtype == torch.bfloat16
131
- except RuntimeError:
132
- pytest.skip("bfloat16 not supported on this device")
133
-
134
-
135
- ###___calculate_attention___###
136
-
137
-
138
- # ----------------------------
139
- # Helpers
140
- # ----------------------------
141
- def _rand(B=2, H=3, Sq=4, Sk=5, D=8, device="cpu", dtype=torch.float32):
142
- q = torch.randn(B, H, Sq, D, device=device, dtype=dtype)
143
- k = torch.randn(B, H, Sk, D, device=device, dtype=dtype)
144
- v = torch.randn(B, H, Sk, D, device=device, dtype=dtype)
145
- return q, k, v
146
-
147
-
148
- # ----------------------------
149
- # A. Basic correctness
150
- # ----------------------------
151
- def test_basic_shapes_and_row_sums():
152
- B, H, Sq, Sk, D = 2, 3, 4, 5, 8
153
- q, k, v = _rand(B, H, Sq, Sk, D)
154
- attn, probs = calculate_attention(q, k, v, mask=None, return_probs=True)
155
- assert attn.shape == (B, H, Sq, D)
156
- assert probs.shape == (B, H, Sq, Sk)
157
- # softmax rows sum to 1
158
- assert torch.allclose(probs.sum(-1), torch.ones(B, H, Sq), atol=1e-6)
159
-
160
-
161
- def test_identity_prefers_diagonal():
162
- # q == k == v as orthogonal-ish basis to encourage diagonal peak
163
- Sq = Sk = D = 4
164
- base = torch.eye(D).view(1, 1, Sk, D).expand(1, 1, Sk, D).contiguous()
165
- q = base.clone()
166
- k = base.clone()
167
- v = base.clone()
168
- _, probs = calculate_attention(q, k, v, mask=None, return_probs=True)
169
- assert torch.equal(probs[0, 0].argmax(-1), torch.arange(Sq))
170
-
171
-
172
- # ----------------------------
173
- # B. Mask behavior (boolean & causal)
174
- # ----------------------------
175
- def test_padding_mask_boolean_last_two_keys():
176
- B, H, Sq, Sk, D = 2, 3, 4, 5, 8
177
- q, k, v = _rand(B, H, Sq, Sk, D)
178
- mask = torch.zeros(B, H, Sq, Sk, dtype=torch.bool)
179
- mask[:, :, :, -2:] = True # mask last two keys
180
- _, probs = calculate_attention(q, k, v, mask=mask, return_probs=True)
181
- assert (probs[:, :, :, -2:] < 1e-6).all()
182
- # After zeroing masked entries, rows renormalize to ~1
183
- assert torch.allclose(probs.masked_fill(mask, 0).sum(-1), torch.ones(B, H, Sq), atol=1e-6)
184
-
185
-
186
- def test_causal_mask_upper_triangle_zero():
187
- B, H, S, D = 2, 3, 6, 8
188
- q, k, v = _rand(B, H, S, S, D)
189
- causal = torch.ones(B, H, S, S, dtype=torch.bool).triu(1) # True above diagonal
190
- _, probs = calculate_attention(q, k, v, mask=causal, return_probs=True)
191
- assert (probs.triu(1) < 1e-6).all()
192
-
193
-
194
- def test_fully_masked_row_zero_probs_and_output():
195
- B, H, Sq, Sk, D = 2, 3, 4, 5, 8
196
- q, k, v = _rand(B, H, Sq, Sk, D)
197
- mask = torch.zeros(B, H, Sq, Sk, dtype=torch.bool)
198
- mask[:, :, 1, :] = True # fully mask a query row
199
- attn, probs = calculate_attention(q, k, v, mask=mask, return_probs=True)
200
- assert torch.allclose(probs[:, :, 1, :], torch.zeros(B, H, Sk))
201
- assert torch.allclose(attn[:, :, 1, :], torch.zeros(B, H, D))
202
-
203
-
204
- # ----------------------------
205
- # C. Numerical stability
206
- # ----------------------------
207
- def test_extreme_logits_no_nans_or_infs():
208
- B, H, Sq, Sk, D = 2, 3, 4, 5, 8
209
- q, k, v = _rand(B, H, Sq, Sk, D)
210
- q = q * 1000
211
- k = k * 1000
212
- attn, probs = calculate_attention(q, k, v, mask=None, return_probs=True)
213
- assert not (torch.isnan(probs).any() or torch.isinf(probs).any())
214
- assert attn.shape == (B, H, Sq, D)
215
-
216
-
217
- def test_half_precision_close_to_fp32_or_skip():
218
- if not torch.cuda.is_available():
219
- pytest.skip("CUDA not available")
220
- B, H, Sq, Sk, D = 2, 3, 4, 5, 8
221
- q32, k32, v32 = _rand(B, H, Sq, Sk, D, device="cuda", dtype=torch.float32)
222
- q16, k16, v16 = q32.half(), k32.half(), v32.half()
223
- a16 = calculate_attention(q16, k16, v16, mask=None)
224
- a32 = calculate_attention(q32, k32, v32, mask=None)
225
- # looser tolerance for fp16
226
- assert torch.allclose(a16.float(), a32.float(), atol=5e-2, rtol=5e-2)
227
-
228
-
229
- # ----------------------------
230
- # D. Edge cases
231
- # ----------------------------
232
- def test_singleton_softmax_is_one():
233
- q = torch.randn(1, 1, 1, 1)
234
- k = torch.randn(1, 1, 1, 1)
235
- v = torch.randn(1, 1, 1, 1)
236
- _, p = calculate_attention(q, k, v, mask=None, return_probs=True)
237
- assert torch.allclose(p, torch.ones_like(p), atol=1e-6)
238
-
239
-
240
- # ----------------------------
241
- # E. Autograd & determinism
242
- # ----------------------------
243
- def test_gradients_flow_no_inplace_breakage():
244
- B, H, Sq, Sk, D = 2, 3, 4, 5, 8
245
- q = torch.randn(B, H, Sq, D, requires_grad=True)
246
- k = torch.randn(B, H, Sk, D, requires_grad=True)
247
- v = torch.randn(B, H, Sk, D, requires_grad=True)
248
- out = calculate_attention(q, k, v, mask=None)
249
- loss = out.pow(2).sum()
250
- loss.backward()
251
- for t in (q, k, v):
252
- assert t.grad is not None and torch.isfinite(t.grad).all()
253
-
254
-
255
- def test_repeated_calls_consistent_without_dropout():
256
- B, H, Sq, Sk, D = 2, 3, 4, 5, 8
257
- q, k, v = _rand(B, H, Sq, Sk, D)
258
- a1 = calculate_attention(q, k, v, mask=None)
259
- a2 = calculate_attention(q, k, v, mask=None)
260
- assert torch.allclose(a1, a2)
261
-
262
-
263
- # ----------------------------
264
- # F. Parity with PyTorch SDPA (when available)
265
- # ----------------------------
266
- def test_sdpa_parity_if_available():
267
- B, H, Sq, Sk, D = 2, 3, 4, 5, 8
268
- q, k, v = _rand(B, H, Sq, Sk, D)
269
- try:
270
- sdpa = F.scaled_dot_product_attention(
271
- q, k, v, dropout_p=0.0, attn_mask=None, is_causal=False
272
- )
273
- manual = calculate_attention(q, k, v, mask=None)
274
- assert torch.allclose(sdpa, manual, atol=1e-5, rtol=1e-4)
275
- except Exception:
276
- # Older PyTorch: skip
277
- pass
278
-
279
-
280
- # ----------------------------
281
- # G. Performance smoke (sanity only)
282
- # ----------------------------
283
- def test_perf_smoke_runs_reasonably():
284
- # Not asserting timing; just ensure no OOM or pathological slowdowns
285
- q, k, v = _rand(B=1, H=8, Sq=1024, Sk=1024, D=64)
286
- _ = calculate_attention(q, k, v, mask=None, return_probs=False)
287
- q, k, v = _rand(B=2, H=8, Sq=1536, Sk=1536, D=64)
288
- _ = calculate_attention(q, k, v, mask=None, return_probs=False)
289
-
290
-
291
- # ----------------------------
292
- # H. Device behavior
293
- # ----------------------------
294
- def test_mask_on_cpu_qkv_on_gpu_autofix_or_skip():
295
- if not torch.cuda.is_available():
296
- pytest.skip("CUDA not available")
297
-
298
- prev = torch.are_deterministic_algorithms_enabled()
299
- try:
300
- # Disable determinism *only for this test*
301
- if prev:
302
- torch.use_deterministic_algorithms(False)
303
-
304
- q, k, v = _rand(device="cuda")
305
- mask = torch.zeros(q.shape[0], 1, 1, k.shape[2], dtype=torch.bool) # CPU
306
- attn, probs = calculate_attention(q, k, v, mask, return_probs=True)
307
- assert attn.device.type == "cuda"
308
- assert probs.device.type == "cuda"
309
- finally:
310
- # restore whatever the global setting was
311
- torch.use_deterministic_algorithms(prev)
312
-
313
-
314
- def test_qkv_device_mismatch_raises_clear_error():
315
- if not torch.cuda.is_available():
316
- pytest.skip("CUDA not available")
317
-
318
- prev = torch.are_deterministic_algorithms_enabled()
319
- try:
320
- if prev:
321
- torch.use_deterministic_algorithms(False)
322
-
323
- q, k, v = _rand(device="cuda")
324
- k = k.cpu() # force mismatch
325
- with pytest.raises(RuntimeError) as ei:
326
- _ = calculate_attention(q, k, v, mask=None)
327
- msg = str(ei.value)
328
- assert (
329
- "q/k/v must be on the same device" in msg # our explicit check
330
- or "Expected all tensors to be on the same device" in msg # PyTorch matmul
331
- or "query, key, value must be on the same device" in msg # updated error wording
332
- )
333
- finally:
334
- torch.use_deterministic_algorithms(prev)
335
-
336
-
337
- # ----------------------------
338
- # I. Mask broadcastability
339
- # ----------------------------
340
- def test_boolean_mask_broadcast_variants_equivalent():
341
- B, H, Sq, Sk, D = 2, 3, 4, 5, 8
342
- q, k, v = _rand(B, H, Sq, Sk, D)
343
- m_exact = torch.zeros(B, H, Sq, Sk, dtype=torch.bool)
344
- m_B1_1Sk = torch.zeros(B, 1, 1, Sk, dtype=torch.bool)
345
- m_11SqSk = torch.zeros(1, 1, Sq, Sk, dtype=torch.bool)
346
-
347
- a_exact, p_exact = calculate_attention(q, k, v, m_exact, return_probs=True)
348
- a1, p1 = calculate_attention(q, k, v, m_B1_1Sk, return_probs=True)
349
- a2, p2 = calculate_attention(q, k, v, m_11SqSk, return_probs=True)
350
-
351
- assert torch.allclose(a1, a_exact, atol=1e-6, rtol=1e-5)
352
- assert torch.allclose(p1, p_exact, atol=1e-6, rtol=1e-5)
353
- assert torch.allclose(a2, a_exact, atol=1e-6, rtol=1e-5)
354
- assert torch.allclose(p2, p_exact, atol=1e-6, rtol=1e-5)
355
-
356
-
357
- def test_non_broadcastable_mask_raises_value_error():
358
- B, H, Sq, Sk, D = 2, 3, 4, 5, 8
359
- q, k, v = _rand(B, H, Sq, Sk, D)
360
- bad = torch.zeros(
361
- B, H, Sq, dtype=torch.bool
362
- ) # missing last dim => not broadcastable to (B,H,Sq,Sk)
363
- with pytest.raises(ValueError) as ei:
364
- _ = calculate_attention(q, k, v, bad)
365
- assert "not broadcastable" in str(ei.value)
366
-
367
-
368
- ###___join_heads___###
369
-
370
-
371
- def test_join_heads_type_error():
372
- with pytest.raises(TypeError):
373
- join_heads([1, 2, 3]) # not a tensor
374
-
375
-
376
- def test_join_heads_dim_error():
377
- with pytest.raises(ValueError):
378
- join_heads(torch.randn(2, 3, 4)) # only 3D
379
-
380
-
381
- def test_join_heads_shape_values():
382
- x = torch.randn(2, 0, 4, 5) # zero heads
383
- y = join_heads(x)
384
- assert y.shape == (2, 4, 0)
385
-
386
-
387
- def test_join_heads_roundtrip():
388
- B, H, T, Dh = 2, 3, 5, 7
389
- x = torch.randn(B, H, T, Dh)
390
- y = join_heads(x)
391
- assert y.shape == (B, T, H * Dh)
392
- # Check element mapping correctness
393
- for b in range(B):
394
- for h in range(H):
395
- for t in range(T):
396
- for d in range(Dh):
397
- assert torch.allclose(y[b, t, h * Dh + d], x[b, h, t, d])
398
-
399
-
400
- ###___sinusoidal_positional_encoding___###
401
-
402
-
403
- @pytest.mark.parametrize("seq_len,dim", [(1, 1), (1, 2), (7, 4), (17, 33)])
404
- def test_sinusoidal_shapes_and_dtype(seq_len, dim):
405
- pe = sinusoidal_positional_encoding(seq_len, dim)
406
- assert pe.shape == (seq_len, dim)
407
- assert pe.dtype == torch.float32
408
- assert pe.requires_grad is False
409
-
410
-
411
- def test_sinusoidal_matches_reference_small_case():
412
- seq_len, dim = 4, 6
413
- pe = sinusoidal_positional_encoding(seq_len, dim)
414
-
415
- ref = torch.zeros_like(pe)
416
- base = 10_000.0
417
- for pos in range(seq_len):
418
- for i in range(0, dim // 2):
419
- denom = base ** (2 * i / dim)
420
- ref[pos, 2 * i] = math.sin(pos / denom)
421
- ref[pos, 2 * i + 1] = math.cos(pos / denom)
422
-
423
- paired = (dim // 2) * 2
424
- assert torch.allclose(pe[:, :paired], ref[:, :paired], atol=1e-6, rtol=1e-6)
425
-
426
-
427
- def test_sinusoidal_deterministic():
428
- a = sinusoidal_positional_encoding(8, 16)
429
- b = sinusoidal_positional_encoding(8, 16)
430
- assert torch.allclose(a, b)
431
-
432
-
433
- def test_sinusoidal_invalid_inputs():
434
- with pytest.raises(ValueError):
435
- sinusoidal_positional_encoding(0, 8)
436
- with pytest.raises(ValueError):
437
- sinusoidal_positional_encoding(-1, 8)
438
- with pytest.raises(ValueError):
439
- sinusoidal_positional_encoding(1, 0)
440
-
441
-
442
- ###___combine_masks___###
443
-
444
-
445
- def test_both_none_returns_none():
446
- assert combine_masks(None, None) is None
447
-
448
-
449
- def test_one_none_returns_other():
450
- m = torch.tensor([[True, False]])
451
- assert torch.equal(combine_masks(m, None), m)
452
- assert torch.equal(combine_masks(None, m), m)
453
-
454
-
455
- def test_or_combination():
456
- m1 = torch.tensor([[True, False]])
457
- m2 = torch.tensor([[False, True]])
458
- expected = torch.tensor([[True, True]])
459
- out = combine_masks(m1, m2)
460
- assert torch.equal(out, expected)
461
-
462
-
463
- def test_shape_mismatch_error():
464
- m1 = torch.ones(2, 2, dtype=torch.bool)
465
- m2 = torch.ones(3, 3, dtype=torch.bool)
466
- with pytest.raises(ValueError):
467
- combine_masks(m1, m2)
468
-
469
-
470
- def test_broadcastable_masks():
471
- m1 = torch.tensor([[True, False, True]])
472
- m2 = torch.tensor([[False]]) # broadcast across
473
- out = combine_masks(m1, m2)
474
- assert torch.equal(out, m1 | m2)
475
-
476
-
477
- def test_dtype_conversion():
478
- # Non-bool masks still should work if they are 0/1 ints
479
- m1 = torch.tensor([[1, 0]], dtype=torch.int32)
480
- m2 = torch.tensor([[0, 1]], dtype=torch.int32)
481
- out = combine_masks(m1.bool(), m2.bool())
482
- expected = torch.tensor([[True, True]])
483
- assert torch.equal(out, expected)
484
-
485
-
486
- ###___sample_from_logits___###
487
-
488
-
489
- def test_greedy_equals_argmax():
490
- torch.manual_seed(0)
491
- logits = torch.randn(4, 7)
492
- ids = sample_from_logits(logits) # greedy
493
- ref = torch.argmax(F.softmax(logits, dim=-1), dim=-1)
494
- assert torch.equal(ids, ref)
495
-
496
-
497
- def test_temperature_effect_no_sampling():
498
- # Greedy with temperature should leave argmax unchanged (monotonic transform)
499
- logits = torch.tensor([[0.1, 1.2, 0.3]], dtype=torch.float32)
500
- ids_t1 = sample_from_logits(logits, do_sample=False, temperature=1.0)
501
- ids_t05 = sample_from_logits(logits, do_sample=False, temperature=0.5)
502
- assert torch.equal(ids_t1, ids_t05) # argmax unchanged
503
-
504
-
505
- def test_top_k_limits_candidates():
506
- logits = torch.tensor([[1.0, 0.9, 0.1, -1.0]], dtype=torch.float32)
507
- # with top_k=1 greedy must select the max (index 0)
508
- ids = sample_from_logits(logits, do_sample=False, top_k=1)
509
- assert torch.equal(ids, torch.tensor([0]))
510
- # with sampling, and top_k=1, the only candidate is index 0
511
- gen = torch.Generator().manual_seed(123)
512
- ids_s = sample_from_logits(logits, do_sample=True, top_k=1, rng=gen)
513
- assert torch.equal(ids_s, torch.tensor([0]))
514
-
515
-
516
- def test_top_p_nucleus_filters_tail():
517
- logits = torch.tensor([[5.0, 4.0, 3.0, -5.0]], dtype=torch.float32) # probs heavily skewed
518
- ids = sample_from_logits(logits, do_sample=False, top_p=0.6) # should keep a minimal head
519
- assert ids.item() in (0, 1) # greediest is 0 anyway; check no crash
520
-
521
-
522
- def test_min_tokens_to_keep_safety():
523
- logits = torch.tensor([[0.0, 0.0, 0.0, 0.0]], dtype=torch.float32)
524
- # Even with very small top_p, we keep at least 1 token
525
- ids = sample_from_logits(logits, do_sample=False, top_p=0.01, min_tokens_to_keep=1)
526
- assert ids.numel() == 1
527
-
528
-
529
- def test_allow_and_deny_lists():
530
- logits = torch.tensor([[0.1, 2.0, 0.3, 3.0]], dtype=torch.float32) # best is idx=3
531
- # Allow only {0,2} best among those is 2
532
- ids = sample_from_logits(logits, do_sample=False, allowed_tokens=[0, 2])
533
- assert torch.equal(ids, torch.tensor([2]))
534
- # Deny {3} → next best is 1
535
- ids = sample_from_logits(logits, do_sample=False, disallowed_tokens=[3])
536
- assert torch.equal(ids, torch.tensor([1]))
537
-
538
-
539
- def test_rng_reproducibility_sampling():
540
- logits = torch.tensor([[1.0, 1.0, 1.0, 1.0]], dtype=torch.float32) # uniform
541
- g1 = torch.Generator().manual_seed(42)
542
- g2 = torch.Generator().manual_seed(42)
543
- s1 = sample_from_logits(logits, do_sample=True, rng=g1)
544
- s2 = sample_from_logits(logits, do_sample=True, rng=g2)
545
- assert torch.equal(s1, s2)
546
-
547
-
548
- def test_device_is_preserved_cpu_cuda():
549
- target_device = torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu")
550
- logits = torch.randn(3, 5, device=target_device)
551
- out = sample_from_logits(logits) # greedy by default
552
- assert out.device == target_device
553
- assert out.dtype == torch.long
554
-
555
-
556
- def test_handles_higher_rank_logits_flattening():
557
- # [B, T, V] -> flattened internally; here we just ensure no crash and correct shape
558
- logits = torch.randn(2, 3, 7)
559
- out = sample_from_logits(logits) # returns [B*T]
560
- assert out.shape == (2 * 3,)
561
-
562
-
563
- ###___create_causal_mask___###
564
-
565
-
566
- def test_causal_mask_shape_and_dtype_cpu():
567
- x = torch.zeros(2, 5, dtype=torch.long)
568
- mask = create_causal_mask(x, num_heads=3)
569
- assert mask.shape == (2, 3, 5, 5)
570
- assert mask.dtype == torch.bool
571
- assert mask.device == x.device
572
-
573
-
574
- def test_causal_mask_is_upper_triangular():
575
- x = torch.zeros(1, 4, dtype=torch.long)
576
- mask = create_causal_mask(x, num_heads=2)
577
- tri = mask[0, 0].to(torch.int)
578
- expected = torch.tensor(
579
- [
580
- [0, 1, 1, 1],
581
- [0, 0, 1, 1],
582
- [0, 0, 0, 1],
583
- [0, 0, 0, 0],
584
- ]
585
- )
586
- assert torch.equal(tri, expected)
587
-
588
-
589
- @pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA not available")
590
- def test_causal_mask_tracks_device():
591
- x = torch.zeros(1, 3, dtype=torch.long, device="cuda")
592
- mask = create_causal_mask(x, num_heads=4)
593
- assert mask.device.type == "cuda"
594
-
595
-
596
- def test_causal_mask_rejects_invalid_inputs():
597
- with pytest.raises(ValueError):
598
- create_causal_mask(torch.zeros(2, 0, dtype=torch.long), num_heads=2)
599
-
600
- with pytest.raises(ValueError):
601
- create_causal_mask(torch.zeros(2, 3, dtype=torch.long), num_heads=0)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import math
2
+
3
+ import pytest
4
+ import torch
5
+ import torch.nn.functional as F
6
+
7
+ from mini_transformer import BasicEncoderDecoderTransformer
8
+ from mini_transformer.configs import ModelCfg
9
+ from mini_transformer.utils import (
10
+ calculate_attention,
11
+ combine_masks,
12
+ create_causal_mask,
13
+ extract_all_attention_maps,
14
+ join_heads,
15
+ sample_from_logits,
16
+ sinusoidal_positional_encoding,
17
+ split_heads,
18
+ )
19
+
20
+ ###___split_heads___###
21
+
22
+
23
+ def test_happy_path_shape_dtype_device_cpu():
24
+ x = torch.randn(2, 10, 16) # B=2, S=10, D=16
25
+ out = split_heads(x, num_heads=4)
26
+ assert out.shape == (2, 4, 10, 4)
27
+ assert out.dtype == x.dtype
28
+ assert out.device == x.device
29
+
30
+
31
+ def test_smallest_valid():
32
+ x = torch.randn(1, 1, 4)
33
+ out = split_heads(x, num_heads=2)
34
+ assert out.shape == (1, 2, 1, 2)
35
+
36
+
37
+ def test_zero_length_seq_allowed():
38
+ x = torch.randn(2, 0, 8)
39
+ out = split_heads(x, num_heads=2)
40
+ assert out.shape == (2, 2, 0, 4)
41
+
42
+
43
+ def test_non_3d_input_raises_value_error():
44
+ x2 = torch.randn(10, 16)
45
+ with pytest.raises(ValueError) as ei2:
46
+ split_heads(x2, 4)
47
+ assert "(B, S, D)" in str(ei2.value)
48
+
49
+ x4 = torch.randn(2, 3, 4, 5)
50
+ with pytest.raises(ValueError) as ei4:
51
+ split_heads(x4, 4)
52
+ assert "(B, S, D)" in str(ei4.value)
53
+
54
+
55
+ def test_invalid_num_heads_type_raises_type_error():
56
+ x = torch.randn(2, 10, 16)
57
+ with pytest.raises(TypeError):
58
+ split_heads(x, 4.0) # float
59
+ with pytest.raises(TypeError):
60
+ split_heads(x, torch.tensor(4)) # Tensor
61
+
62
+
63
+ def test_num_heads_leq_zero_raises_value_error():
64
+ x = torch.randn(2, 10, 16)
65
+ with pytest.raises(ValueError):
66
+ split_heads(x, 0)
67
+ with pytest.raises(ValueError):
68
+ split_heads(x, -2)
69
+
70
+
71
+ def test_non_divisible_d_model_raises_value_error_message_has_values():
72
+ x = torch.randn(2, 5, 10)
73
+ with pytest.raises(ValueError) as e:
74
+ split_heads(x, 3)
75
+ msg = str(e.value)
76
+ assert "d_model (10)" in msg and "num_heads (3)" in msg
77
+
78
+
79
+ @pytest.mark.parametrize(
80
+ "B,S,D,H",
81
+ [
82
+ (1, 1, 8, 1),
83
+ (2, 3, 12, 3),
84
+ (4, 7, 32, 8),
85
+ (3, 0, 24, 6),
86
+ ],
87
+ )
88
+ def test_invariants_random_valid(B, S, D, H):
89
+ x = torch.randn(B, S, D)
90
+ out = split_heads(x, H)
91
+ assert out.shape[0] == B
92
+ assert out.shape[2] == S
93
+ assert (H * (D // H)) == D
94
+ assert x.numel() == out.numel()
95
+
96
+
97
+ def test_grad_propagates():
98
+ x = torch.randn(2, 10, 16, requires_grad=True)
99
+ out = split_heads(x, 4)
100
+ # Do a simple scalar reduction to make grad non-trivial
101
+ loss = out.square().mean()
102
+ loss.backward()
103
+ assert x.grad is not None
104
+ assert x.grad.shape == x.shape
105
+
106
+
107
+ def test_non_contiguous_input():
108
+ # Create a non-contiguous view by transposing and slicing
109
+ base = torch.randn(10, 2, 16)
110
+ x = base.transpose(0, 1)[:, :8, :] # shape (2, 8, 16), likely non-contiguous
111
+ assert not x.is_contiguous()
112
+ out = split_heads(x, 4)
113
+ assert out.shape == (2, 4, 8, 4)
114
+
115
+
116
+ @pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA not available")
117
+ def test_device_preserved_cuda():
118
+ x = torch.randn(2, 10, 16, device="cuda")
119
+ out = split_heads(x, 4)
120
+ assert out.device.type == "cuda"
121
+
122
+
123
+ @pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA not available")
124
+ def test_dtype_half_bfloat_on_gpu():
125
+ x_half = torch.randn(2, 10, 16, device="cuda", dtype=torch.float16)
126
+ out_half = split_heads(x_half, 4)
127
+ assert out_half.dtype == torch.float16
128
+
129
+ # bfloat16 may not be available on all GPUs; guard with try
130
+ try:
131
+ x_bf16 = torch.randn(2, 10, 16, device="cuda", dtype=torch.bfloat16)
132
+ out_bf16 = split_heads(x_bf16, 4)
133
+ assert out_bf16.dtype == torch.bfloat16
134
+ except RuntimeError:
135
+ pytest.skip("bfloat16 not supported on this device")
136
+
137
+
138
+ ###___calculate_attention___###
139
+
140
+
141
+ # ----------------------------
142
+ # Helpers
143
+ # ----------------------------
144
+ def _rand(B=2, H=3, Sq=4, Sk=5, D=8, device="cpu", dtype=torch.float32):
145
+ q = torch.randn(B, H, Sq, D, device=device, dtype=dtype)
146
+ k = torch.randn(B, H, Sk, D, device=device, dtype=dtype)
147
+ v = torch.randn(B, H, Sk, D, device=device, dtype=dtype)
148
+ return q, k, v
149
+
150
+
151
+ # ----------------------------
152
+ # A. Basic correctness
153
+ # ----------------------------
154
+ def test_basic_shapes_and_row_sums():
155
+ B, H, Sq, Sk, D = 2, 3, 4, 5, 8
156
+ q, k, v = _rand(B, H, Sq, Sk, D)
157
+ attn, probs = calculate_attention(q, k, v, mask=None, return_probs=True)
158
+ assert attn.shape == (B, H, Sq, D)
159
+ assert probs.shape == (B, H, Sq, Sk)
160
+ # softmax rows sum to 1
161
+ assert torch.allclose(probs.sum(-1), torch.ones(B, H, Sq), atol=1e-6)
162
+
163
+
164
+ def test_identity_prefers_diagonal():
165
+ # q == k == v as orthogonal-ish basis to encourage diagonal peak
166
+ Sq = Sk = D = 4
167
+ base = torch.eye(D).view(1, 1, Sk, D).expand(1, 1, Sk, D).contiguous()
168
+ q = base.clone()
169
+ k = base.clone()
170
+ v = base.clone()
171
+ _, probs = calculate_attention(q, k, v, mask=None, return_probs=True)
172
+ assert torch.equal(probs[0, 0].argmax(-1), torch.arange(Sq))
173
+
174
+
175
+ # ----------------------------
176
+ # B. Mask behavior (boolean & causal)
177
+ # ----------------------------
178
+ def test_padding_mask_boolean_last_two_keys():
179
+ B, H, Sq, Sk, D = 2, 3, 4, 5, 8
180
+ q, k, v = _rand(B, H, Sq, Sk, D)
181
+ mask = torch.zeros(B, H, Sq, Sk, dtype=torch.bool)
182
+ mask[:, :, :, -2:] = True # mask last two keys
183
+ _, probs = calculate_attention(q, k, v, mask=mask, return_probs=True)
184
+ assert (probs[:, :, :, -2:] < 1e-6).all()
185
+ # After zeroing masked entries, rows renormalize to ~1
186
+ assert torch.allclose(probs.masked_fill(mask, 0).sum(-1), torch.ones(B, H, Sq), atol=1e-6)
187
+
188
+
189
+ def test_causal_mask_upper_triangle_zero():
190
+ B, H, S, D = 2, 3, 6, 8
191
+ q, k, v = _rand(B, H, S, S, D)
192
+ causal = torch.ones(B, H, S, S, dtype=torch.bool).triu(1) # True above diagonal
193
+ _, probs = calculate_attention(q, k, v, mask=causal, return_probs=True)
194
+ assert (probs.triu(1) < 1e-6).all()
195
+
196
+
197
+ def test_fully_masked_row_zero_probs_and_output():
198
+ B, H, Sq, Sk, D = 2, 3, 4, 5, 8
199
+ q, k, v = _rand(B, H, Sq, Sk, D)
200
+ mask = torch.zeros(B, H, Sq, Sk, dtype=torch.bool)
201
+ mask[:, :, 1, :] = True # fully mask a query row
202
+ attn, probs = calculate_attention(q, k, v, mask=mask, return_probs=True)
203
+ assert torch.allclose(probs[:, :, 1, :], torch.zeros(B, H, Sk))
204
+ assert torch.allclose(attn[:, :, 1, :], torch.zeros(B, H, D))
205
+
206
+
207
+ ###___extract_all_attention_maps___###
208
+
209
+
210
+ def _make_model_cfg(num_layers: int, layer_norm_style: str | None = None) -> ModelCfg:
211
+ return ModelCfg(
212
+ name="test",
213
+ best_checkpoint_path="/tmp/best.ckpt",
214
+ latest_checkpoint_path="/tmp/latest.ckpt",
215
+ tokenizer="demo",
216
+ d_model=16,
217
+ num_layers=num_layers,
218
+ num_heads=4,
219
+ d_ff=32,
220
+ dropout_rate=0.0,
221
+ max_seq_len=32,
222
+ vocab_size=64,
223
+ pad_id=0,
224
+ bos_id=1,
225
+ eos_id=2,
226
+ layer_norm_style=layer_norm_style,
227
+ )
228
+
229
+
230
+ def _run_attention_maps(
231
+ *,
232
+ num_layers: int,
233
+ layer_norm_style: str | None,
234
+ ) -> tuple[ModelCfg, BasicEncoderDecoderTransformer, dict, torch.Tensor, torch.Tensor]:
235
+ cfg = _make_model_cfg(num_layers=num_layers, layer_norm_style=layer_norm_style)
236
+ model = BasicEncoderDecoderTransformer(cfg)
237
+ batch, src_len, tgt_len = 2, 5, 4
238
+ src_ids = torch.randint(0, cfg.vocab_size, (batch, src_len), dtype=torch.long)
239
+ tgt_ids = torch.randint(0, cfg.vocab_size, (batch, tgt_len), dtype=torch.long)
240
+ src_pad = torch.zeros(batch, src_len, dtype=torch.bool)
241
+ tgt_pad = torch.zeros(batch, tgt_len, dtype=torch.bool)
242
+ maps = extract_all_attention_maps(model, src_ids, tgt_ids, src_pad, tgt_pad)
243
+ return cfg, model, maps, src_ids, tgt_ids
244
+
245
+
246
+ def _assert_attention_shapes(maps, *, batch: int, heads: int, src_len: int, tgt_len: int) -> None:
247
+ for layer_map in maps["enc_self"]:
248
+ assert layer_map.shape == (batch, heads, src_len, src_len)
249
+ assert torch.isfinite(layer_map).all()
250
+ assert torch.allclose(layer_map.sum(-1), torch.ones(batch, heads, src_len), atol=1e-5)
251
+ for layer_map in maps["dec_self"]:
252
+ assert layer_map.shape == (batch, heads, tgt_len, tgt_len)
253
+ assert torch.isfinite(layer_map).all()
254
+ assert torch.allclose(layer_map.sum(-1), torch.ones(batch, heads, tgt_len), atol=1e-5)
255
+ for layer_map in maps["dec_cross"]:
256
+ assert layer_map.shape == (batch, heads, tgt_len, src_len)
257
+ assert torch.isfinite(layer_map).all()
258
+ assert torch.allclose(layer_map.sum(-1), torch.ones(batch, heads, tgt_len), atol=1e-5)
259
+
260
+
261
+ @pytest.mark.parametrize(
262
+ "layer_norm_style, expected_pre_norm",
263
+ [
264
+ (None, True), # auto-selects pre-LN when num_layers > 4
265
+ ("post", False),
266
+ ("pre", True),
267
+ ],
268
+ )
269
+ def test_extract_attention_maps_handles_layer_norm_styles(layer_norm_style, expected_pre_norm):
270
+ cfg, model, maps, src_ids, tgt_ids = _run_attention_maps(
271
+ num_layers=6, layer_norm_style=layer_norm_style
272
+ )
273
+ batch, src_len = src_ids.shape
274
+ tgt_len = tgt_ids.shape[1]
275
+ assert len(maps["enc_self"]) == cfg.num_layers
276
+ assert len(maps["dec_self"]) == cfg.num_layers
277
+ assert len(maps["dec_cross"]) == cfg.num_layers
278
+ _assert_attention_shapes(
279
+ maps,
280
+ batch=batch,
281
+ heads=cfg.num_heads,
282
+ src_len=src_len,
283
+ tgt_len=tgt_len,
284
+ )
285
+ assert all(layer.pre_norm is expected_pre_norm for layer in model.encoder.layers)
286
+ assert all(layer.pre_norm is expected_pre_norm for layer in model.decoder.layers)
287
+
288
+
289
+ # ----------------------------
290
+ # C. Numerical stability
291
+ # ----------------------------
292
+ def test_extreme_logits_no_nans_or_infs():
293
+ B, H, Sq, Sk, D = 2, 3, 4, 5, 8
294
+ q, k, v = _rand(B, H, Sq, Sk, D)
295
+ q = q * 1000
296
+ k = k * 1000
297
+ attn, probs = calculate_attention(q, k, v, mask=None, return_probs=True)
298
+ assert not (torch.isnan(probs).any() or torch.isinf(probs).any())
299
+ assert attn.shape == (B, H, Sq, D)
300
+
301
+
302
+ def test_half_precision_close_to_fp32_or_skip():
303
+ if not torch.cuda.is_available():
304
+ pytest.skip("CUDA not available")
305
+ B, H, Sq, Sk, D = 2, 3, 4, 5, 8
306
+ q32, k32, v32 = _rand(B, H, Sq, Sk, D, device="cuda", dtype=torch.float32)
307
+ q16, k16, v16 = q32.half(), k32.half(), v32.half()
308
+ a16 = calculate_attention(q16, k16, v16, mask=None)
309
+ a32 = calculate_attention(q32, k32, v32, mask=None)
310
+ # looser tolerance for fp16
311
+ assert torch.allclose(a16.float(), a32.float(), atol=5e-2, rtol=5e-2)
312
+
313
+
314
+ # ----------------------------
315
+ # D. Edge cases
316
+ # ----------------------------
317
+ def test_singleton_softmax_is_one():
318
+ q = torch.randn(1, 1, 1, 1)
319
+ k = torch.randn(1, 1, 1, 1)
320
+ v = torch.randn(1, 1, 1, 1)
321
+ _, p = calculate_attention(q, k, v, mask=None, return_probs=True)
322
+ assert torch.allclose(p, torch.ones_like(p), atol=1e-6)
323
+
324
+
325
+ # ----------------------------
326
+ # E. Autograd & determinism
327
+ # ----------------------------
328
+ def test_gradients_flow_no_inplace_breakage():
329
+ B, H, Sq, Sk, D = 2, 3, 4, 5, 8
330
+ q = torch.randn(B, H, Sq, D, requires_grad=True)
331
+ k = torch.randn(B, H, Sk, D, requires_grad=True)
332
+ v = torch.randn(B, H, Sk, D, requires_grad=True)
333
+ out = calculate_attention(q, k, v, mask=None)
334
+ loss = out.pow(2).sum()
335
+ loss.backward()
336
+ for t in (q, k, v):
337
+ assert t.grad is not None and torch.isfinite(t.grad).all()
338
+
339
+
340
+ def test_repeated_calls_consistent_without_dropout():
341
+ B, H, Sq, Sk, D = 2, 3, 4, 5, 8
342
+ q, k, v = _rand(B, H, Sq, Sk, D)
343
+ a1 = calculate_attention(q, k, v, mask=None)
344
+ a2 = calculate_attention(q, k, v, mask=None)
345
+ assert torch.allclose(a1, a2)
346
+
347
+
348
+ # ----------------------------
349
+ # F. Parity with PyTorch SDPA (when available)
350
+ # ----------------------------
351
+ def test_sdpa_parity_if_available():
352
+ B, H, Sq, Sk, D = 2, 3, 4, 5, 8
353
+ q, k, v = _rand(B, H, Sq, Sk, D)
354
+ try:
355
+ sdpa = F.scaled_dot_product_attention(
356
+ q, k, v, dropout_p=0.0, attn_mask=None, is_causal=False
357
+ )
358
+ manual = calculate_attention(q, k, v, mask=None)
359
+ assert torch.allclose(sdpa, manual, atol=1e-5, rtol=1e-4)
360
+ except Exception:
361
+ # Older PyTorch: skip
362
+ pass
363
+
364
+
365
+ # ----------------------------
366
+ # G. Performance smoke (sanity only)
367
+ # ----------------------------
368
+ def test_perf_smoke_runs_reasonably():
369
+ # Not asserting timing; just ensure no OOM or pathological slowdowns
370
+ q, k, v = _rand(B=1, H=8, Sq=1024, Sk=1024, D=64)
371
+ _ = calculate_attention(q, k, v, mask=None, return_probs=False)
372
+ q, k, v = _rand(B=2, H=8, Sq=1536, Sk=1536, D=64)
373
+ _ = calculate_attention(q, k, v, mask=None, return_probs=False)
374
+
375
+
376
+ # ----------------------------
377
+ # H. Device behavior
378
+ # ----------------------------
379
+ def test_mask_on_cpu_qkv_on_gpu_autofix_or_skip():
380
+ if not torch.cuda.is_available():
381
+ pytest.skip("CUDA not available")
382
+
383
+ prev = torch.are_deterministic_algorithms_enabled()
384
+ try:
385
+ # Disable determinism *only for this test*
386
+ if prev:
387
+ torch.use_deterministic_algorithms(False)
388
+
389
+ q, k, v = _rand(device="cuda")
390
+ mask = torch.zeros(q.shape[0], 1, 1, k.shape[2], dtype=torch.bool) # CPU
391
+ attn, probs = calculate_attention(q, k, v, mask, return_probs=True)
392
+ assert attn.device.type == "cuda"
393
+ assert probs.device.type == "cuda"
394
+ finally:
395
+ # restore whatever the global setting was
396
+ torch.use_deterministic_algorithms(prev)
397
+
398
+
399
+ def test_qkv_device_mismatch_raises_clear_error():
400
+ if not torch.cuda.is_available():
401
+ pytest.skip("CUDA not available")
402
+
403
+ prev = torch.are_deterministic_algorithms_enabled()
404
+ try:
405
+ if prev:
406
+ torch.use_deterministic_algorithms(False)
407
+
408
+ q, k, v = _rand(device="cuda")
409
+ k = k.cpu() # force mismatch
410
+ with pytest.raises(RuntimeError) as ei:
411
+ _ = calculate_attention(q, k, v, mask=None)
412
+ msg = str(ei.value)
413
+ assert (
414
+ "q/k/v must be on the same device" in msg # our explicit check
415
+ or "Expected all tensors to be on the same device" in msg # PyTorch matmul
416
+ or "query, key, value must be on the same device" in msg # updated error wording
417
+ )
418
+ finally:
419
+ torch.use_deterministic_algorithms(prev)
420
+
421
+
422
+ # ----------------------------
423
+ # I. Mask broadcastability
424
+ # ----------------------------
425
+ def test_boolean_mask_broadcast_variants_equivalent():
426
+ B, H, Sq, Sk, D = 2, 3, 4, 5, 8
427
+ q, k, v = _rand(B, H, Sq, Sk, D)
428
+ m_exact = torch.zeros(B, H, Sq, Sk, dtype=torch.bool)
429
+ m_B1_1Sk = torch.zeros(B, 1, 1, Sk, dtype=torch.bool)
430
+ m_11SqSk = torch.zeros(1, 1, Sq, Sk, dtype=torch.bool)
431
+
432
+ a_exact, p_exact = calculate_attention(q, k, v, m_exact, return_probs=True)
433
+ a1, p1 = calculate_attention(q, k, v, m_B1_1Sk, return_probs=True)
434
+ a2, p2 = calculate_attention(q, k, v, m_11SqSk, return_probs=True)
435
+
436
+ assert torch.allclose(a1, a_exact, atol=1e-6, rtol=1e-5)
437
+ assert torch.allclose(p1, p_exact, atol=1e-6, rtol=1e-5)
438
+ assert torch.allclose(a2, a_exact, atol=1e-6, rtol=1e-5)
439
+ assert torch.allclose(p2, p_exact, atol=1e-6, rtol=1e-5)
440
+
441
+
442
+ def test_non_broadcastable_mask_raises_value_error():
443
+ B, H, Sq, Sk, D = 2, 3, 4, 5, 8
444
+ q, k, v = _rand(B, H, Sq, Sk, D)
445
+ bad = torch.zeros(
446
+ B, H, Sq, dtype=torch.bool
447
+ ) # missing last dim => not broadcastable to (B,H,Sq,Sk)
448
+ with pytest.raises(ValueError) as ei:
449
+ _ = calculate_attention(q, k, v, bad)
450
+ assert "not broadcastable" in str(ei.value)
451
+
452
+
453
+ ###___join_heads___###
454
+
455
+
456
+ def test_join_heads_type_error():
457
+ with pytest.raises(TypeError):
458
+ join_heads([1, 2, 3]) # not a tensor
459
+
460
+
461
+ def test_join_heads_dim_error():
462
+ with pytest.raises(ValueError):
463
+ join_heads(torch.randn(2, 3, 4)) # only 3D
464
+
465
+
466
+ def test_join_heads_shape_values():
467
+ x = torch.randn(2, 0, 4, 5) # zero heads
468
+ y = join_heads(x)
469
+ assert y.shape == (2, 4, 0)
470
+
471
+
472
+ def test_join_heads_roundtrip():
473
+ B, H, T, Dh = 2, 3, 5, 7
474
+ x = torch.randn(B, H, T, Dh)
475
+ y = join_heads(x)
476
+ assert y.shape == (B, T, H * Dh)
477
+ # Check element mapping correctness
478
+ for b in range(B):
479
+ for h in range(H):
480
+ for t in range(T):
481
+ for d in range(Dh):
482
+ assert torch.allclose(y[b, t, h * Dh + d], x[b, h, t, d])
483
+
484
+
485
+ ###___sinusoidal_positional_encoding___###
486
+
487
+
488
+ @pytest.mark.parametrize("seq_len,dim", [(1, 1), (1, 2), (7, 4), (17, 33)])
489
+ def test_sinusoidal_shapes_and_dtype(seq_len, dim):
490
+ pe = sinusoidal_positional_encoding(seq_len, dim)
491
+ assert pe.shape == (seq_len, dim)
492
+ assert pe.dtype == torch.float32
493
+ assert pe.requires_grad is False
494
+
495
+
496
+ def test_sinusoidal_matches_reference_small_case():
497
+ seq_len, dim = 4, 6
498
+ pe = sinusoidal_positional_encoding(seq_len, dim)
499
+
500
+ ref = torch.zeros_like(pe)
501
+ base = 10_000.0
502
+ for pos in range(seq_len):
503
+ for i in range(0, dim // 2):
504
+ denom = base ** (2 * i / dim)
505
+ ref[pos, 2 * i] = math.sin(pos / denom)
506
+ ref[pos, 2 * i + 1] = math.cos(pos / denom)
507
+
508
+ paired = (dim // 2) * 2
509
+ assert torch.allclose(pe[:, :paired], ref[:, :paired], atol=1e-6, rtol=1e-6)
510
+
511
+
512
+ def test_sinusoidal_deterministic():
513
+ a = sinusoidal_positional_encoding(8, 16)
514
+ b = sinusoidal_positional_encoding(8, 16)
515
+ assert torch.allclose(a, b)
516
+
517
+
518
+ def test_sinusoidal_invalid_inputs():
519
+ with pytest.raises(ValueError):
520
+ sinusoidal_positional_encoding(0, 8)
521
+ with pytest.raises(ValueError):
522
+ sinusoidal_positional_encoding(-1, 8)
523
+ with pytest.raises(ValueError):
524
+ sinusoidal_positional_encoding(1, 0)
525
+
526
+
527
+ ###___combine_masks___###
528
+
529
+
530
+ def test_both_none_returns_none():
531
+ assert combine_masks(None, None) is None
532
+
533
+
534
+ def test_one_none_returns_other():
535
+ m = torch.tensor([[True, False]])
536
+ assert torch.equal(combine_masks(m, None), m)
537
+ assert torch.equal(combine_masks(None, m), m)
538
+
539
+
540
+ def test_or_combination():
541
+ m1 = torch.tensor([[True, False]])
542
+ m2 = torch.tensor([[False, True]])
543
+ expected = torch.tensor([[True, True]])
544
+ out = combine_masks(m1, m2)
545
+ assert torch.equal(out, expected)
546
+
547
+
548
+ def test_shape_mismatch_error():
549
+ m1 = torch.ones(2, 2, dtype=torch.bool)
550
+ m2 = torch.ones(3, 3, dtype=torch.bool)
551
+ with pytest.raises(ValueError):
552
+ combine_masks(m1, m2)
553
+
554
+
555
+ def test_broadcastable_masks():
556
+ m1 = torch.tensor([[True, False, True]])
557
+ m2 = torch.tensor([[False]]) # broadcast across
558
+ out = combine_masks(m1, m2)
559
+ assert torch.equal(out, m1 | m2)
560
+
561
+
562
+ def test_dtype_conversion():
563
+ # Non-bool masks still should work if they are 0/1 ints
564
+ m1 = torch.tensor([[1, 0]], dtype=torch.int32)
565
+ m2 = torch.tensor([[0, 1]], dtype=torch.int32)
566
+ out = combine_masks(m1.bool(), m2.bool())
567
+ expected = torch.tensor([[True, True]])
568
+ assert torch.equal(out, expected)
569
+
570
+
571
+ ###___sample_from_logits___###
572
+
573
+
574
+ def test_greedy_equals_argmax():
575
+ torch.manual_seed(0)
576
+ logits = torch.randn(4, 7)
577
+ ids = sample_from_logits(logits) # greedy
578
+ ref = torch.argmax(F.softmax(logits, dim=-1), dim=-1)
579
+ assert torch.equal(ids, ref)
580
+
581
+
582
+ def test_temperature_effect_no_sampling():
583
+ # Greedy with temperature should leave argmax unchanged (monotonic transform)
584
+ logits = torch.tensor([[0.1, 1.2, 0.3]], dtype=torch.float32)
585
+ ids_t1 = sample_from_logits(logits, do_sample=False, temperature=1.0)
586
+ ids_t05 = sample_from_logits(logits, do_sample=False, temperature=0.5)
587
+ assert torch.equal(ids_t1, ids_t05) # argmax unchanged
588
+
589
+
590
+ def test_top_k_limits_candidates():
591
+ logits = torch.tensor([[1.0, 0.9, 0.1, -1.0]], dtype=torch.float32)
592
+ # with top_k=1 greedy must select the max (index 0)
593
+ ids = sample_from_logits(logits, do_sample=False, top_k=1)
594
+ assert torch.equal(ids, torch.tensor([0]))
595
+ # with sampling, and top_k=1, the only candidate is index 0
596
+ gen = torch.Generator().manual_seed(123)
597
+ ids_s = sample_from_logits(logits, do_sample=True, top_k=1, rng=gen)
598
+ assert torch.equal(ids_s, torch.tensor([0]))
599
+
600
+
601
+ def test_top_p_nucleus_filters_tail():
602
+ logits = torch.tensor([[5.0, 4.0, 3.0, -5.0]], dtype=torch.float32) # probs heavily skewed
603
+ ids = sample_from_logits(logits, do_sample=False, top_p=0.6) # should keep a minimal head
604
+ assert ids.item() in (0, 1) # greediest is 0 anyway; check no crash
605
+
606
+
607
+ def test_min_tokens_to_keep_safety():
608
+ logits = torch.tensor([[0.0, 0.0, 0.0, 0.0]], dtype=torch.float32)
609
+ # Even with very small top_p, we keep at least 1 token
610
+ ids = sample_from_logits(logits, do_sample=False, top_p=0.01, min_tokens_to_keep=1)
611
+ assert ids.numel() == 1
612
+
613
+
614
+ def test_allow_and_deny_lists():
615
+ logits = torch.tensor([[0.1, 2.0, 0.3, 3.0]], dtype=torch.float32) # best is idx=3
616
+ # Allow only {0,2} → best among those is 2
617
+ ids = sample_from_logits(logits, do_sample=False, allowed_tokens=[0, 2])
618
+ assert torch.equal(ids, torch.tensor([2]))
619
+ # Deny {3} → next best is 1
620
+ ids = sample_from_logits(logits, do_sample=False, disallowed_tokens=[3])
621
+ assert torch.equal(ids, torch.tensor([1]))
622
+
623
+
624
+ def test_rng_reproducibility_sampling():
625
+ logits = torch.tensor([[1.0, 1.0, 1.0, 1.0]], dtype=torch.float32) # uniform
626
+ g1 = torch.Generator().manual_seed(42)
627
+ g2 = torch.Generator().manual_seed(42)
628
+ s1 = sample_from_logits(logits, do_sample=True, rng=g1)
629
+ s2 = sample_from_logits(logits, do_sample=True, rng=g2)
630
+ assert torch.equal(s1, s2)
631
+
632
+
633
+ def test_device_is_preserved_cpu_cuda():
634
+ target_device = torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu")
635
+ logits = torch.randn(3, 5, device=target_device)
636
+ out = sample_from_logits(logits) # greedy by default
637
+ assert out.device == target_device
638
+ assert out.dtype == torch.long
639
+
640
+
641
+ def test_handles_higher_rank_logits_flattening():
642
+ # [B, T, V] -> flattened internally; here we just ensure no crash and correct shape
643
+ logits = torch.randn(2, 3, 7)
644
+ out = sample_from_logits(logits) # returns [B*T]
645
+ assert out.shape == (2 * 3,)
646
+
647
+
648
+ ###___create_causal_mask___###
649
+
650
+
651
+ def test_causal_mask_shape_and_dtype_cpu():
652
+ x = torch.zeros(2, 5, dtype=torch.long)
653
+ mask = create_causal_mask(x, num_heads=3)
654
+ assert mask.shape == (2, 3, 5, 5)
655
+ assert mask.dtype == torch.bool
656
+ assert mask.device == x.device
657
+
658
+
659
+ def test_causal_mask_is_upper_triangular():
660
+ x = torch.zeros(1, 4, dtype=torch.long)
661
+ mask = create_causal_mask(x, num_heads=2)
662
+ tri = mask[0, 0].to(torch.int)
663
+ expected = torch.tensor(
664
+ [
665
+ [0, 1, 1, 1],
666
+ [0, 0, 1, 1],
667
+ [0, 0, 0, 1],
668
+ [0, 0, 0, 0],
669
+ ]
670
+ )
671
+ assert torch.equal(tri, expected)
672
+
673
+
674
+ @pytest.mark.skipif(not torch.cuda.is_available(), reason="CUDA not available")
675
+ def test_causal_mask_tracks_device():
676
+ x = torch.zeros(1, 3, dtype=torch.long, device="cuda")
677
+ mask = create_causal_mask(x, num_heads=4)
678
+ assert mask.device.type == "cuda"
679
+
680
+
681
+ def test_causal_mask_rejects_invalid_inputs():
682
+ with pytest.raises(ValueError):
683
+ create_causal_mask(torch.zeros(2, 0, dtype=torch.long), num_heads=2)
684
+
685
+ with pytest.raises(ValueError):
686
+ create_causal_mask(torch.zeros(2, 3, dtype=torch.long), num_heads=0)
tokenizer/bpe_16k.json CHANGED
The diff for this file is too large to render. See raw diff
 
tokenizer/bpe_32k.json CHANGED
The diff for this file is too large to render. See raw diff
 
tokenizer/bpe_4k.json CHANGED
The diff for this file is too large to render. See raw diff
 
tokenizer/bpe_8k.json CHANGED
The diff for this file is too large to render. See raw diff
 
trained_models/README.md ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Trained Models
2
+
3
+ Place model folders here, one directory per model. You can populate this directory via the CLI:
4
+ ```
5
+ mini-transformer-fetch AlaBoussoffara/transformer_test # tiny demo
6
+ mini-transformer-fetch AlaBoussoffara/transformer_small # larger example
7
+ ```
8
+ or copy your own exported checkpoints using the layout below:
9
+
10
+ ```
11
+ trained_models/
12
+ my-model/
13
+ configs/
14
+ config_inference.yaml
15
+ checkpoints/
16
+ best.pt
17
+ tokenizer/
18
+ tokenizer.json
19
+ ```
20
+
21
+ The CLI (`mini-transformer-infer`) and apps will look for `configs/config_inference.yaml` inside each folder. Relative paths in that config should point to files inside the same model directory.