├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── NOTICE ├── README.md ├── assets ├── Foundational-LLM-Chat.svg └── app.gif ├── bin ├── config.json ├── config.ts └── foundational-llm-chat.ts ├── cdk.json ├── chainlit_image ├── Dockerfile └── foundational-llm-chat_app │ ├── .chainlit │ ├── config.toml │ └── translations │ │ ├── bn.json │ │ ├── en-US.json │ │ ├── gu.json │ │ ├── he-IL.json │ │ ├── hi.json │ │ ├── ja.json │ │ ├── kn.json │ │ ├── ml.json │ │ ├── mr.json │ │ ├── nl-NL.json │ │ ├── ta.json │ │ ├── te.json │ │ └── zh-CN.json │ ├── app.py │ ├── chainlit.md │ ├── config │ ├── __init__.py │ ├── app_config.py │ └── settings.py │ ├── public │ ├── foundational-llm-chat.png │ ├── logo_dark.png │ ├── logo_light.png │ ├── meta.llama3-1-405b-instruct-v1:0.png │ ├── mistral.mistral-large-2407-v1:0.png │ ├── us.amazon.nova-lite-v1:0.png │ ├── us.amazon.nova-micro-v1:0.png │ ├── us.amazon.nova-premier-v1:0.png │ ├── us.amazon.nova-pro-v1:0.png │ ├── us.anthropic.claude-3-5-haiku-20241022-v1:0.png │ ├── us.anthropic.claude-3-5-sonnet-20240620-v1:0.png │ ├── us.anthropic.claude-3-5-sonnet-20241022-v2:0.png │ ├── us.anthropic.claude-3-7-sonnet-20250219-v1:0.png │ ├── us.anthropic.claude-3-haiku-20240307-v1:0.png │ ├── us.anthropic.claude-3-opus-20240229-v1:0.png │ ├── us.anthropic.claude-3-sonnet-20240229-v1:0.png │ ├── us.anthropic.claude-opus-4-20250514-v1:0.png │ ├── us.anthropic.claude-sonnet-4-20250514-v1:0.png │ ├── us.meta.llama3-1-8b-instruct-v1:0.png │ ├── us.meta.llama3-2-11b-instruct-v1:0.png │ ├── us.meta.llama3-2-1b-instruct-v1:0.png │ ├── us.meta.llama3-2-3b-instruct-v1:0.png │ ├── us.meta.llama3-2-90b-instruct-v1:0.png │ ├── us.meta.llama3-3-70b-instruct-v1:0.png │ ├── us.meta.llama4-maverick-17b-instruct-v1:0.png │ ├── us.meta.llama4-scout-17b-instruct-v1:0.png │ ├── us.mistral.pixtral-large-2502-v1:0.png │ ├── us.writer.palmyra-x4-v1:0.png │ └── us.writer.palmyra-x5-v1:0.png │ ├── requirements.txt │ ├── services │ ├── __init__.py │ ├── content_service.py │ └── thinking_service.py │ ├── system_strings.py │ └── utils │ ├── __init__.py │ └── message_utils.py ├── custom_resources └── lambda │ └── cloudFront_get_prefix_list │ └── cloudFront_get_prefix_list.py ├── jest.config.js ├── lib ├── authentication │ └── index.ts ├── custom │ └── index.ts ├── data_layer │ └── index.ts ├── ecs │ └── index.ts ├── foundational-llm-chat-stack.ts ├── network │ └── index.ts ├── parameters │ └── index.ts └── prompts │ └── index.ts ├── package-lock.json ├── package.json └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | *.js 2 | !jest.config.js 3 | *.d.ts 4 | node_modules 5 | 6 | # CDK asset staging directory 7 | .cdk.staging 8 | cdk.out 9 | cdk.context.json 10 | 11 | # OS generated files # 12 | ###################### 13 | .DS_Store? 14 | ehthumbs.db 15 | Icon? 16 | Thumbs.db 17 | *.DS_Store -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.ts 2 | !*.d.ts 3 | 4 | # CDK asset staging directory 5 | .cdk.staging 6 | cdk.out 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [Unreleased] 4 | 5 | Data Persistance using DynamoDB. Waiting for this issue: https://github.com/Chainlit/chainlit/issues/1172 6 | 7 | ## [1.3.1] - 2025-03-13 8 | 9 | ### Changed 10 | - Code refactoring for better organization and maintainability 11 | - Improved code structure and documentation 12 | - Enhanced error handling and logging 13 | 14 | ## [1.3.0] - 2025-03-13 15 | 16 | ### Added 17 | - Added Claude 3.7 18 | - Added a way to operate with thinking models 19 | 20 | ### Changed 21 | - Upgraded the codebase to chainlit 2.0 22 | - Upgraded dependencies to latest version 23 | 24 | ## [1.2.1] - 2024-12-17 25 | 26 | ### Added 27 | - Added Amazon Nova 28 | - Added resources for data persistence waiting for new 2.0 chainlit version to enable them 29 | 30 | ### Changed 31 | - bumped chainlit version to last stable 32 | 33 | ## [1.2.0] - 2024-10-28 34 | 35 | ### Added 36 | - Support for Amazon Bedrock inference profiles in `config.json` 37 | - Cross-region endpoint configuration for Amazon Bedrock models 38 | - Implementation of Amazon Bedrock Prompt Manager for enhanced prompt handling 39 | 40 | ### Changed 41 | - Updated Chainlit to version 1.3.1 42 | - Upgraded Docker image to python:3.12-alpine 3.20 43 | - Expanded region support for Amazon Bedrock models in `config.json` 44 | 45 | ### Improved 46 | - Enhanced configuration flexibility for Amazon Bedrock models 47 | - Better support for cross-region model deployment 48 | 49 | ## [1.1.0] - 2024-04-17 50 | - Moved to Amazon Bedrock Converse API to support many more models: https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html. We aim to support every model which supports system prompt and docuement chat; 51 | - you can now set system prompt and region in the model configuration; 52 | 53 | ## [1.0.0] - 2024-04-17 54 | - Initial release 55 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ## Code of Conduct 2 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 3 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 4 | opensource-codeofconduct@amazon.com with any additional questions or comments. 5 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional 4 | documentation, we greatly value feedback and contributions from our community. 5 | 6 | Please read through this document before submitting any issues or pull requests to ensure we have all the necessary 7 | information to effectively respond to your bug report or contribution. 8 | 9 | 10 | ## Reporting Bugs/Feature Requests 11 | 12 | We welcome you to use the GitHub issue tracker to report bugs or suggest features. 13 | 14 | When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already 15 | reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: 16 | 17 | * A reproducible test case or series of steps 18 | * The version of our code being used 19 | * Any modifications you've made relevant to the bug 20 | * Anything unusual about your environment or deployment 21 | 22 | 23 | ## Contributing via Pull Requests 24 | Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: 25 | 26 | 1. You are working against the latest source on the *main* branch. 27 | 2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. 28 | 3. You open an issue to discuss any significant work - we would hate for your time to be wasted. 29 | 30 | To send us a pull request, please: 31 | 32 | 1. Fork the repository. 33 | 2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. 34 | 3. Ensure local tests pass. 35 | 4. Commit to your fork using clear commit messages. 36 | 5. Send us a pull request, answering any default questions in the pull request interface. 37 | 6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. 38 | 39 | GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and 40 | [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). 41 | 42 | 43 | ## Finding contributions to work on 44 | Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start. 45 | 46 | 47 | ## Code of Conduct 48 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 49 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 50 | opensource-codeofconduct@amazon.com with any additional questions or comments. 51 | 52 | 53 | ## Security issue notifications 54 | If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. 55 | 56 | 57 | ## Licensing 58 | 59 | See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. 60 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT No Attribution 2 | 3 | Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 12 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 13 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 14 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 15 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 16 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 17 | 18 | -------------------------------------------------------------------------------- /assets/app.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/assets/app.gif -------------------------------------------------------------------------------- /bin/config.ts: -------------------------------------------------------------------------------- 1 | import { existsSync, readFileSync } from "fs"; 2 | 3 | export interface InferenceProfile { 4 | prefix: string; 5 | region: string; 6 | } 7 | 8 | export interface BedrockModel { 9 | system_prompt?: string; 10 | id: string; 11 | inference_profile?: InferenceProfile; 12 | region?: string[]; 13 | cost: { 14 | input_1k_price: number; 15 | output_1k_price: number; 16 | }; 17 | default?: boolean; 18 | maxTokens: number; 19 | vision?: boolean; 20 | document?: boolean; 21 | tool?: boolean; 22 | reasoning?: boolean; 23 | } 24 | 25 | export interface BedrockModels { 26 | [key: string]: BedrockModel; 27 | } 28 | 29 | export interface SystemConfig { 30 | default_system_prompt: string; 31 | cognito_domain?: string; 32 | max_characters_parameter: string; 33 | max_content_size_mb_parameter: string; 34 | default_aws_region: string; 35 | prefix: string; 36 | bedrock_models: BedrockModels; 37 | } 38 | 39 | 40 | export function getConfig(): SystemConfig { 41 | if (existsSync("./bin/config.json")) { 42 | return JSON.parse(readFileSync("./bin/config.json").toString("utf8")); 43 | } 44 | 45 | // Default config 46 | return { 47 | default_system_prompt: "You are an assistant", 48 | max_characters_parameter: "None", 49 | max_content_size_mb_parameter: "None", 50 | default_aws_region: "us-west-2", 51 | prefix: "newv", 52 | bedrock_models: { 53 | "Claude Sonnet 3.5 New": { 54 | "id": "us.anthropic.claude-3-5-sonnet-20241022-v2:0", 55 | "inference_profile": { 56 | "prefix": "us", 57 | "region": "us-west-2" 58 | }, 59 | "region": ["us-east-1", "us-west-2", "us-east-2"], 60 | "cost": { 61 | "input_1k_price": 0.003, 62 | "output_1k_price": 0.015 63 | }, 64 | "default": true, 65 | "maxTokens": 4096, 66 | "vision": true, 67 | "document": true, 68 | "tool": true, 69 | "reasoning": false 70 | } 71 | } 72 | }; 73 | } 74 | 75 | export const config: SystemConfig = getConfig(); 76 | -------------------------------------------------------------------------------- /bin/foundational-llm-chat.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | // This line ensures that the source map support is registered, which provides 4 | // a better experience when debugging code in production. 5 | import 'source-map-support/register'; 6 | 7 | // Importing the required AWS CDK libraries and the FoundationalLlmChatStack class. 8 | import * as cdk from 'aws-cdk-lib'; 9 | import { FoundationalLlmChatStack } from '../lib/foundational-llm-chat-stack'; 10 | import { getConfig } from "./config"; 11 | 12 | // Creating a new instance of the AWS CDK App, which represents the root of the CDK application. 13 | const app = new cdk.App(); 14 | 15 | // get configuration 16 | const config = getConfig(); 17 | 18 | // Creating a new instance of the FoundationalLlmChatStack with the app, stack name, and AWS region. 19 | // The FoundationalLlmChatStack is the main stack that orchestrates the deployment of the Chatbot application. 20 | new FoundationalLlmChatStack(app, `${config.prefix}FoundationalLlmChatStack`, { 21 | config, 22 | env: { 23 | region: process.env.CDK_DEFAULT_REGION, 24 | account: process.env.CDK_DEFAULT_ACCOUNT, 25 | }, 26 | }); 27 | -------------------------------------------------------------------------------- /cdk.json: -------------------------------------------------------------------------------- 1 | { 2 | "app": "npx ts-node --prefer-ts-exts bin/foundational-llm-chat.ts", 3 | "watch": { 4 | "include": [ 5 | "**" 6 | ], 7 | "exclude": [ 8 | "README.md", 9 | "cdk*.json", 10 | "**/*.d.ts", 11 | "**/*.js", 12 | "tsconfig.json", 13 | "package*.json", 14 | "yarn.lock", 15 | "node_modules", 16 | "test" 17 | ] 18 | }, 19 | "context": { 20 | "@aws-cdk/aws-lambda:recognizeLayerVersion": true, 21 | "@aws-cdk/core:checkSecretUsage": true, 22 | "@aws-cdk/core:target-partitions": [ 23 | "aws", 24 | "aws-cn" 25 | ], 26 | "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, 27 | "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, 28 | "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, 29 | "@aws-cdk/aws-iam:minimizePolicies": true, 30 | "@aws-cdk/core:validateSnapshotRemovalPolicy": true, 31 | "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, 32 | "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, 33 | "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, 34 | "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, 35 | "@aws-cdk/core:enablePartitionLiterals": true, 36 | "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, 37 | "@aws-cdk/aws-iam:standardizedServicePrincipals": true, 38 | "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, 39 | "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, 40 | "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, 41 | "@aws-cdk/aws-route53-patters:useCertificate": true, 42 | "@aws-cdk/customresources:installLatestAwsSdkDefault": false, 43 | "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, 44 | "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, 45 | "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, 46 | "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, 47 | "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, 48 | "@aws-cdk/aws-redshift:columnId": true, 49 | "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, 50 | "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, 51 | "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, 52 | "@aws-cdk/aws-kms:aliasNameRef": true, 53 | "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, 54 | "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, 55 | "@aws-cdk/aws-efs:denyAnonymousAccess": true, 56 | "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, 57 | "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, 58 | "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, 59 | "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, 60 | "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, 61 | "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, 62 | "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, 63 | "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /chainlit_image/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM --platform=linux/amd64 public.ecr.aws/docker/library/python:3.13-alpine3.21 2 | 3 | # update the apk 4 | RUN apk upgrade --no-cache 5 | 6 | # add build-base for gcc compiler 7 | RUN apk add --no-cache build-base 8 | 9 | # add a new user and change to the new user 10 | # this is done to do not run the container as Root 11 | # Create a group and user 12 | RUN addgroup -S chainlitworkergroup && adduser -S chainlitworker -G chainlitworkergroup 13 | USER chainlitworker 14 | 15 | # Set environment variables (e.g., set Python to run in unbuffered mode) 16 | ENV PYTHONUNBUFFERED 1 17 | 18 | # Set the working directory where user has access 19 | WORKDIR /home/chainlitworker/app 20 | 21 | # Update path to access user-installed libraries (in advance, to suppress warnings later) 22 | ENV PATH="/home/chainlitworker/.local/bin:${PATH}" 23 | 24 | # Copy just the requirements file at this stage, so that changes to the Python source don't need to 25 | # trigger a whole pip install re-run 26 | COPY --chown=chainlitworker:chainlitworker ./foundational-llm-chat_app/requirements.txt ./requirements.txt 27 | 28 | # Install requirements --user for current owner 29 | RUN pip install -U --user -r /home/chainlitworker/app/requirements.txt 30 | 31 | # Copy the rest of the application code over 32 | COPY --chown=chainlitworker:chainlitworker ./foundational-llm-chat_app . 33 | 34 | EXPOSE 8080 35 | 36 | CMD ["python", "-m", "chainlit", "run", "app.py", "--host", "0.0.0.0", "--port", "8080"] -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/.chainlit/config.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | # Whether to enable telemetry (default: true). No personal data is collected. 3 | enable_telemetry = false 4 | 5 | 6 | # List of environment variables to be provided by each user to use the app. 7 | user_env = [] 8 | 9 | # Duration (in seconds) during which the session is saved when the connection is lost 10 | session_timeout = 3600 11 | 12 | # Duration (in seconds) of the user session expiry 13 | user_session_timeout = 1296000 # 15 days 14 | 15 | # Enable third parties caching (e.g LangChain cache) 16 | cache = false 17 | 18 | # Authorized origins 19 | allow_origins = ["*"] 20 | 21 | [features] 22 | # Process and display HTML in messages. This can be a security risk (see https://stackoverflow.com/questions/19603097/why-is-it-dangerous-to-render-user-generated-html-or-javascript) 23 | unsafe_allow_html = false 24 | 25 | # Process and display mathematical expressions. This can clash with "$" characters in messages. 26 | latex = false 27 | 28 | # Automatically tag threads with the current chat profile (if a chat profile is used) 29 | auto_tag_thread = true 30 | 31 | # Allow users to edit their own messages 32 | edit_message = true 33 | 34 | # Authorize users to spontaneously upload files with messages 35 | [features.spontaneous_file_upload] 36 | enabled = true 37 | accept = ["image/jpeg", "image/gif","image/png", "image/webp", "application/pdf", "image/jpg", 38 | "text/csv", 39 | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 40 | "application/vnd.ms-excel", 41 | "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 42 | "application/msword", 43 | "text/plain", 44 | "text/html", 45 | "text/markdown"] 46 | max_files = 20 47 | max_size_mb = 500 48 | 49 | [features.audio] 50 | # Sample rate of the audio 51 | sample_rate = 24000 52 | 53 | [UI] 54 | # Name of the assistant. 55 | name = "Foundational LLM Chat" 56 | 57 | default_theme = "light" 58 | 59 | # layout = "wide" 60 | 61 | # Description of the assistant. This is used for HTML tags. 62 | # description = "Foundational LLM Chat is a powerful AI assistant that combines advanced natural language processing capabilities from LLMs offered by Amazon Bedrock with computer vision models to provide an enhanced multimodal experience." 63 | 64 | # Chain of Thought (CoT) display mode. Can be "hidden", "tool_call" or "full". 65 | cot = "full" 66 | 67 | # Specify a CSS file that can be used to customize the user interface. 68 | # The CSS file can be served from the public directory or via an external link. 69 | # custom_css = "/public/test.css" 70 | 71 | # Specify a Javascript file that can be used to customize the user interface. 72 | # The Javascript file can be served from the public directory. 73 | # custom_js = "/public/test.js" 74 | 75 | # Specify a custom meta image url. 76 | # custom_meta_image_url = "https://chainlit-cloud.s3.eu-west-3.amazonaws.com/logo/chainlit_banner.png" 77 | 78 | # Specify a custom build directory for the frontend. 79 | # This can be used to customize the frontend code. 80 | # Be careful: If this is a relative path, it should not start with a slash. 81 | # custom_build = "./public/build" 82 | 83 | # Specify optional one or more custom links in the header. 84 | # [[UI.header_links]] 85 | # name = "Issues" 86 | # icon_url = "https://avatars.githubusercontent.com/u/128686189?s=200&v=4" 87 | # url = "https://github.com/Chainlit/chainlit/issues" 88 | 89 | [meta] 90 | generated_by = "2.4.0" 91 | -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/.chainlit/translations/bn.json: -------------------------------------------------------------------------------- 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 | }, 27 | "password": { 28 | "label": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1", 29 | "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" 30 | }, 31 | "actions": { 32 | "signin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8" 33 | }, 34 | "alternativeText": { 35 | "or": "\u0985\u09a5\u09ac\u09be" 36 | } 37 | }, 38 | "errors": { 39 | "default": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be \u09b8\u09ae\u09cd\u09ad\u09ac \u09b9\u099a\u09cd\u099b\u09c7 \u09a8\u09be", 40 | "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", 41 | "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", 42 | "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", 43 | "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", 44 | "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", 45 | "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", 46 | "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", 47 | "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", 48 | "emailSignin": "\u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09be\u09a0\u09be\u09a8\u09cb \u09af\u09be\u09af\u09bc\u09a8\u09bf", 49 | "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", 50 | "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", 51 | "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" 52 | } 53 | }, 54 | "provider": { 55 | "continue": "{{provider}} \u09a6\u09bf\u09af\u09bc\u09c7 \u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8" 56 | } 57 | }, 58 | "chat": { 59 | "input": { 60 | "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...", 61 | "actions": { 62 | "send": "\u09ac\u09be\u09b0\u09cd\u09a4\u09be \u09aa\u09be\u09a0\u09be\u09a8", 63 | "stop": "\u0995\u09be\u099c \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8", 64 | "attachFiles": "\u09ab\u09be\u0987\u09b2 \u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4 \u0995\u09b0\u09c1\u09a8" 65 | } 66 | }, 67 | "speech": { 68 | "start": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09c1\u09a8", 69 | "stop": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8", 70 | "connecting": "\u09b8\u0982\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7" 71 | }, 72 | "fileUpload": { 73 | "dragDrop": "\u098f\u0996\u09be\u09a8\u09c7 \u09ab\u09be\u0987\u09b2 \u099f\u09c7\u09a8\u09c7 \u0986\u09a8\u09c1\u09a8", 74 | "browse": "\u09ab\u09be\u0987\u09b2 \u09ac\u09cd\u09b0\u09be\u0989\u099c \u0995\u09b0\u09c1\u09a8", 75 | "sizeLimit": "\u09b8\u09c0\u09ae\u09be:", 76 | "errors": { 77 | "failed": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7", 78 | "cancelled": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7" 79 | } 80 | }, 81 | "messages": { 82 | "status": { 83 | "using": "\u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u099b\u09c7", 84 | "used": "\u09ac\u09cd\u09af\u09ac\u09b9\u09c3\u09a4" 85 | }, 86 | "actions": { 87 | "copy": { 88 | "button": "\u0995\u09cd\u09b2\u09bf\u09aa\u09ac\u09cb\u09b0\u09cd\u09a1\u09c7 \u0995\u09aa\u09bf \u0995\u09b0\u09c1\u09a8", 89 | "success": "\u0995\u09aa\u09bf \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7!" 90 | } 91 | }, 92 | "feedback": { 93 | "positive": "\u09b8\u09b9\u09be\u09af\u09bc\u0995", 94 | "negative": "\u09b8\u09b9\u09be\u09af\u09bc\u0995 \u09a8\u09af\u09bc", 95 | "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", 96 | "dialog": { 97 | "title": "\u09ae\u09a8\u09cd\u09a4\u09ac\u09cd\u09af \u09af\u09cb\u0997 \u0995\u09b0\u09c1\u09a8", 98 | "submit": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u099c\u09ae\u09be \u09a6\u09bf\u09a8" 99 | }, 100 | "status": { 101 | "updating": "\u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7", 102 | "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" 103 | } 104 | } 105 | }, 106 | "history": { 107 | "title": "\u09b8\u09b0\u09cd\u09ac\u09b6\u09c7\u09b7 \u0987\u09a8\u09aa\u09c1\u099f", 108 | "empty": "\u0995\u09cb\u09a8\u09cb \u09a4\u09a5\u09cd\u09af \u09a8\u09c7\u0987...", 109 | "show": "\u0987\u09a4\u09bf\u09b9\u09be\u09b8 \u09a6\u09c7\u0996\u09c1\u09a8" 110 | }, 111 | "settings": { 112 | "title": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8 \u09aa\u09cd\u09af\u09be\u09a8\u09c7\u09b2" 113 | }, 114 | "watermark": "\u09a6\u09cd\u09ac\u09be\u09b0\u09be \u09a8\u09bf\u09b0\u09cd\u09ae\u09bf\u09a4" 115 | }, 116 | "threadHistory": { 117 | "sidebar": { 118 | "title": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0 \u099a\u09cd\u09af\u09be\u099f", 119 | "filters": { 120 | "search": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8", 121 | "placeholder": "Search conversations..." 122 | }, 123 | "timeframes": { 124 | "today": "\u0986\u099c", 125 | "yesterday": "\u0997\u09a4\u0995\u09be\u09b2", 126 | "previous7days": "\u0997\u09a4 \u09ed \u09a6\u09bf\u09a8", 127 | "previous30days": "\u0997\u09a4 \u09e9\u09e6 \u09a6\u09bf\u09a8" 128 | }, 129 | "empty": "\u0995\u09cb\u09a8\u09cb \u09a5\u09cd\u09b0\u09c7\u09a1 \u09aa\u09be\u0993\u09af\u09bc\u09be \u09af\u09be\u09af\u09bc\u09a8\u09bf", 130 | "actions": { 131 | "close": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8", 132 | "open": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u0996\u09c1\u09b2\u09c1\u09a8" 133 | } 134 | }, 135 | "thread": { 136 | "untitled": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae\u09b9\u09c0\u09a8 \u0986\u09b2\u09cb\u099a\u09a8\u09be", 137 | "menu": { 138 | "rename": "Rename", 139 | "delete": "Delete" 140 | }, 141 | "actions": { 142 | "delete": { 143 | "title": "\u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8", 144 | "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", 145 | "success": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7", 146 | "inProgress": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09b9\u099a\u09cd\u099b\u09c7" 147 | }, 148 | "rename": { 149 | "title": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09c1\u09a8", 150 | "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", 151 | "form": { 152 | "name": { 153 | "label": "\u09a8\u09be\u09ae", 154 | "placeholder": "\u09a8\u09a4\u09c1\u09a8 \u09a8\u09be\u09ae \u09b2\u09bf\u0996\u09c1\u09a8" 155 | } 156 | }, 157 | "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!", 158 | "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" 159 | } 160 | } 161 | } 162 | }, 163 | "navigation": { 164 | "header": { 165 | "chat": "\u099a\u09cd\u09af\u09be\u099f", 166 | "readme": "\u09b0\u09bf\u09a1\u09ae\u09bf", 167 | "theme": { 168 | "light": "Light Theme", 169 | "dark": "Dark Theme", 170 | "system": "Follow System" 171 | } 172 | }, 173 | "newChat": { 174 | "button": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f", 175 | "dialog": { 176 | "title": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09c1\u09a8", 177 | "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?", 178 | "tooltip": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f" 179 | } 180 | }, 181 | "user": { 182 | "menu": { 183 | "settings": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8", 184 | "settingsKey": "S", 185 | "apiKeys": "\u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0", 186 | "logout": "\u09b2\u0997\u0986\u0989\u099f" 187 | } 188 | } 189 | }, 190 | "apiKeys": { 191 | "title": "\u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc \u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0", 192 | "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", 193 | "success": { 194 | "saved": "\u09b8\u09ab\u09b2\u09ad\u09be\u09ac\u09c7 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09b9\u09af\u09bc\u09c7\u099b\u09c7" 195 | } 196 | }, 197 | "alerts": { 198 | "info": "Info", 199 | "note": "Note", 200 | "tip": "Tip", 201 | "important": "Important", 202 | "warning": "Warning", 203 | "caution": "Caution", 204 | "debug": "Debug", 205 | "example": "Example", 206 | "success": "Success", 207 | "help": "Help", 208 | "idea": "Idea", 209 | "pending": "Pending", 210 | "security": "Security", 211 | "beta": "Beta", 212 | "best-practice": "Best Practice" 213 | } 214 | } -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/.chainlit/translations/en-US.json: -------------------------------------------------------------------------------- 1 | { 2 | "common": { 3 | "actions": { 4 | "cancel": "Cancel", 5 | "confirm": "Confirm", 6 | "continue": "Continue", 7 | "goBack": "Go Back", 8 | "reset": "Reset", 9 | "submit": "Submit" 10 | }, 11 | "status": { 12 | "loading": "Loading...", 13 | "error": { 14 | "default": "An error occurred", 15 | "serverConnection": "Could not reach the server" 16 | } 17 | } 18 | }, 19 | "auth": { 20 | "login": { 21 | "title": "Login to access the app", 22 | "form": { 23 | "email": { 24 | "label": "Email address", 25 | "required": "email is a required field" 26 | }, 27 | "password": { 28 | "label": "Password", 29 | "required": "password is a required field" 30 | }, 31 | "actions": { 32 | "signin": "Sign In" 33 | }, 34 | "alternativeText": { 35 | "or": "OR" 36 | } 37 | }, 38 | "errors": { 39 | "default": "Unable to sign in", 40 | "signin": "Try signing in with a different account", 41 | "oauthSignin": "Try signing in with a different account", 42 | "redirectUriMismatch": "The redirect URI is not matching the oauth app configuration", 43 | "oauthCallback": "Try signing in with a different account", 44 | "oauthCreateAccount": "Try signing in with a different account", 45 | "emailCreateAccount": "Try signing in with a different account", 46 | "callback": "Try signing in with a different account", 47 | "oauthAccountNotLinked": "To confirm your identity, sign in with the same account you used originally", 48 | "emailSignin": "The e-mail could not be sent", 49 | "emailVerify": "Please verify your email, a new email has been sent", 50 | "credentialsSignin": "Sign in failed. Check the details you provided are correct", 51 | "sessionRequired": "Please sign in to access this page" 52 | } 53 | }, 54 | "provider": { 55 | "continue": "Continue with {{provider}}" 56 | } 57 | }, 58 | "chat": { 59 | "input": { 60 | "placeholder": "Type your message here...", 61 | "actions": { 62 | "send": "Send message", 63 | "stop": "Stop Task", 64 | "attachFiles": "Attach files" 65 | } 66 | }, 67 | "speech": { 68 | "start": "Start recording", 69 | "stop": "Stop recording", 70 | "connecting": "Connecting" 71 | }, 72 | "fileUpload": { 73 | "dragDrop": "Drag and drop files here", 74 | "browse": "Browse Files", 75 | "sizeLimit": "Limit:", 76 | "errors": { 77 | "failed": "Failed to upload", 78 | "cancelled": "Cancelled upload of" 79 | } 80 | }, 81 | "messages": { 82 | "status": { 83 | "using": "Using", 84 | "used": "Used" 85 | }, 86 | "actions": { 87 | "copy": { 88 | "button": "Copy to clipboard", 89 | "success": "Copied!" 90 | } 91 | }, 92 | "feedback": { 93 | "positive": "Helpful", 94 | "negative": "Not helpful", 95 | "edit": "Edit feedback", 96 | "dialog": { 97 | "title": "Add a comment", 98 | "submit": "Submit feedback" 99 | }, 100 | "status": { 101 | "updating": "Updating", 102 | "updated": "Feedback updated" 103 | } 104 | } 105 | }, 106 | "history": { 107 | "title": "Last Inputs", 108 | "empty": "Such empty...", 109 | "show": "Show history" 110 | }, 111 | "settings": { 112 | "title": "Settings panel" 113 | }, 114 | "watermark": "Built with" 115 | }, 116 | "threadHistory": { 117 | "sidebar": { 118 | "title": "Past Chats", 119 | "filters": { 120 | "search": "Search", 121 | "placeholder": "Search conversations..." 122 | }, 123 | "timeframes": { 124 | "today": "Today", 125 | "yesterday": "Yesterday", 126 | "previous7days": "Previous 7 days", 127 | "previous30days": "Previous 30 days" 128 | }, 129 | "empty": "No threads found", 130 | "actions": { 131 | "close": "Close sidebar", 132 | "open": "Open sidebar" 133 | } 134 | }, 135 | "thread": { 136 | "untitled": "Untitled Conversation", 137 | "menu": { 138 | "rename": "Rename", 139 | "delete": "Delete" 140 | }, 141 | "actions": { 142 | "delete": { 143 | "title": "Confirm deletion", 144 | "description": "This will delete the thread as well as its messages and elements. This action cannot be undone", 145 | "success": "Chat deleted", 146 | "inProgress": "Deleting chat" 147 | }, 148 | "rename": { 149 | "title": "Rename Thread", 150 | "description": "Enter a new name for this thread", 151 | "form": { 152 | "name": { 153 | "label": "Name", 154 | "placeholder": "Enter new name" 155 | } 156 | }, 157 | "success": "Thread renamed!", 158 | "inProgress": "Renaming thread" 159 | } 160 | } 161 | } 162 | }, 163 | "navigation": { 164 | "header": { 165 | "chat": "Chat", 166 | "readme": "Readme", 167 | "theme": { 168 | "light": "Light Theme", 169 | "dark": "Dark Theme", 170 | "system": "Follow System" 171 | } 172 | }, 173 | "newChat": { 174 | "button": "New Chat", 175 | "dialog": { 176 | "title": "Create New Chat", 177 | "description": "This will clear your current chat history. Are you sure you want to continue?", 178 | "tooltip": "New Chat" 179 | } 180 | }, 181 | "user": { 182 | "menu": { 183 | "settings": "Settings", 184 | "settingsKey": "S", 185 | "apiKeys": "API Keys", 186 | "logout": "Logout" 187 | } 188 | } 189 | }, 190 | "apiKeys": { 191 | "title": "Required API Keys", 192 | "description": "To use this app, the following API keys are required. The keys are stored on your device's local storage.", 193 | "success": { 194 | "saved": "Saved successfully" 195 | } 196 | }, 197 | "alerts": { 198 | "info": "Info", 199 | "note": "Note", 200 | "tip": "Tip", 201 | "important": "Important", 202 | "warning": "Warning", 203 | "caution": "Caution", 204 | "debug": "Debug", 205 | "example": "Example", 206 | "success": "Success", 207 | "help": "Help", 208 | "idea": "Idea", 209 | "pending": "Pending", 210 | "security": "Security", 211 | "beta": "Beta", 212 | "best-practice": "Best Practice" 213 | } 214 | } -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/.chainlit/translations/gu.json: -------------------------------------------------------------------------------- 1 | { 2 | "common": { 3 | "actions": { 4 | "cancel": "\u0ab0\u0aa6 \u0a95\u0ab0\u0acb", 5 | "confirm": "\u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb", 6 | "continue": "\u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb", 7 | "goBack": "\u0aaa\u0abe\u0a9b\u0abe \u0a9c\u0abe\u0a93", 8 | "reset": "\u0ab0\u0ac0\u0ab8\u0ac7\u0a9f \u0a95\u0ab0\u0acb", 9 | "submit": "\u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb" 10 | }, 11 | "status": { 12 | "loading": "\u0ab2\u0acb\u0aa1 \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7...", 13 | "error": { 14 | "default": "\u0a8f\u0a95 \u0aad\u0ac2\u0ab2 \u0aa5\u0a88", 15 | "serverConnection": "\u0ab8\u0ab0\u0acd\u0ab5\u0ab0 \u0ab8\u0ac1\u0aa7\u0ac0 \u0aaa\u0ab9\u0acb\u0a82\u0a9a\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0" 16 | } 17 | } 18 | }, 19 | "auth": { 20 | "login": { 21 | "title": "\u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0ab2\u0ac9\u0a97\u0abf\u0aa8 \u0a95\u0ab0\u0acb", 22 | "form": { 23 | "email": { 24 | "label": "\u0a88\u0aae\u0ac7\u0ab2 \u0a8f\u0aa1\u0acd\u0ab0\u0ac7\u0ab8", 25 | "required": "\u0a88\u0aae\u0ac7\u0ab2 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7" 26 | }, 27 | "password": { 28 | "label": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1", 29 | "required": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7" 30 | }, 31 | "actions": { 32 | "signin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb" 33 | }, 34 | "alternativeText": { 35 | "or": "\u0a85\u0aa5\u0ab5\u0abe" 36 | } 37 | }, 38 | "errors": { 39 | "default": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0", 40 | "signin": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", 41 | "oauthSignin": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", 42 | "redirectUriMismatch": "\u0ab0\u0ac0\u0aa1\u0abe\u0aaf\u0ab0\u0ac7\u0a95\u0acd\u0a9f URI oauth \u0a8d\u0aaa \u0a95\u0aa8\u0acd\u0aab\u0abf\u0a97\u0ab0\u0ac7\u0ab6\u0aa8 \u0ab8\u0abe\u0aa5\u0ac7 \u0aae\u0ac7\u0ab3 \u0a96\u0abe\u0aa4\u0acb \u0aa8\u0aa5\u0ac0", 43 | "oauthCallback": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", 44 | "oauthCreateAccount": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", 45 | "emailCreateAccount": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", 46 | "callback": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb", 47 | "oauthAccountNotLinked": "\u0aa4\u0aae\u0abe\u0ab0\u0ac0 \u0a93\u0ab3\u0a96\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aae\u0ac2\u0ab3 \u0ab0\u0ac2\u0aaa\u0ac7 \u0ab5\u0abe\u0aaa\u0ab0\u0ac7\u0ab2\u0abe \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb", 48 | "emailSignin": "\u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0acb \u0aa8\u0aa5\u0ac0", 49 | "emailVerify": "\u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0a88\u0aae\u0ac7\u0ab2 \u0a9a\u0a95\u0abe\u0ab8\u0acb, \u0aa8\u0ab5\u0acb \u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0a86\u0ab5\u0acd\u0aaf\u0acb \u0a9b\u0ac7", 50 | "credentialsSignin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3. \u0a86\u0aaa\u0ac7\u0ab2\u0ac0 \u0ab5\u0abf\u0a97\u0aa4\u0acb \u0ab8\u0abe\u0a9a\u0ac0 \u0a9b\u0ac7 \u0a95\u0ac7 \u0aa8\u0ab9\u0ac0\u0a82 \u0aa4\u0ac7 \u0a9a\u0a95\u0abe\u0ab8\u0acb", 51 | "sessionRequired": "\u0a86 \u0aaa\u0ac7\u0a9c\u0aa8\u0ac7 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb" 52 | } 53 | }, 54 | "provider": { 55 | "continue": "{{provider}} \u0ab8\u0abe\u0aa5\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb" 56 | } 57 | }, 58 | "chat": { 59 | "input": { 60 | "placeholder": "\u0a85\u0ab9\u0ac0\u0a82 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0ab2\u0a96\u0acb...", 61 | "actions": { 62 | "send": "\u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0aae\u0acb\u0a95\u0ab2\u0acb", 63 | "stop": "\u0a95\u0abe\u0ab0\u0acd\u0aaf \u0ab0\u0acb\u0a95\u0acb", 64 | "attachFiles": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a9c\u0acb\u0aa1\u0acb" 65 | } 66 | }, 67 | "speech": { 68 | "start": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0ab6\u0ab0\u0ac2 \u0a95\u0ab0\u0acb", 69 | "stop": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb", 70 | "connecting": "\u0a95\u0aa8\u0ac7\u0a95\u0acd\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7" 71 | }, 72 | "fileUpload": { 73 | "dragDrop": "\u0a85\u0ab9\u0ac0\u0a82 \u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a96\u0ac7\u0a82\u0a9a\u0acb \u0a85\u0aa8\u0ac7 \u0a9b\u0acb\u0aa1\u0acb", 74 | "browse": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0aac\u0acd\u0ab0\u0abe\u0a89\u0a9d \u0a95\u0ab0\u0acb", 75 | "sizeLimit": "\u0aae\u0ab0\u0acd\u0aaf\u0abe\u0aa6\u0abe:", 76 | "errors": { 77 | "failed": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0a95\u0ab0\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3", 78 | "cancelled": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0ab0\u0aa6 \u0a95\u0ab0\u0acd\u0aaf\u0ac1\u0a82" 79 | } 80 | }, 81 | "messages": { 82 | "status": { 83 | "using": "\u0ab5\u0abe\u0aaa\u0ab0\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac7", 84 | "used": "\u0ab5\u0aaa\u0ab0\u0abe\u0aaf\u0ac7\u0ab2" 85 | }, 86 | "actions": { 87 | "copy": { 88 | "button": "\u0a95\u0acd\u0ab2\u0abf\u0aaa\u0aac\u0acb\u0ab0\u0acd\u0aa1 \u0aaa\u0ab0 \u0a95\u0ac9\u0aaa\u0abf \u0a95\u0ab0\u0acb", 89 | "success": "\u0a95\u0ac9\u0aaa\u0abf \u0aa5\u0aaf\u0ac1\u0a82!" 90 | } 91 | }, 92 | "feedback": { 93 | "positive": "\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0", 94 | "negative": "\u0aac\u0abf\u0aa8\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0", 95 | "edit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0a82\u0aaa\u0abe\u0aa6\u0abf\u0aa4 \u0a95\u0ab0\u0acb", 96 | "dialog": { 97 | "title": "\u0a9f\u0abf\u0aaa\u0acd\u0aaa\u0aa3\u0ac0 \u0a89\u0aae\u0ac7\u0ab0\u0acb", 98 | "submit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb" 99 | }, 100 | "status": { 101 | "updating": "\u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7", 102 | "updated": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0aaf\u0acb" 103 | } 104 | } 105 | }, 106 | "history": { 107 | "title": "\u0a9b\u0ac7\u0ab2\u0acd\u0ab2\u0abe \u0a87\u0aa8\u0aaa\u0ac1\u0a9f\u0acd\u0ab8", 108 | "empty": "\u0a96\u0abe\u0ab2\u0ac0 \u0a9b\u0ac7...", 109 | "show": "\u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0aac\u0aa4\u0abe\u0ab5\u0acb" 110 | }, 111 | "settings": { 112 | "title": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8 \u0aaa\u0ac7\u0aa8\u0ab2" 113 | }, 114 | "watermark": "\u0ab8\u0abe\u0aa5\u0ac7 \u0aac\u0aa8\u0abe\u0ab5\u0ac7\u0ab2" 115 | }, 116 | "threadHistory": { 117 | "sidebar": { 118 | "title": "\u0aaa\u0abe\u0a9b\u0ab2\u0ac0 \u0a9a\u0ac7\u0a9f\u0acd\u0ab8", 119 | "filters": { 120 | "search": "\u0ab6\u0acb\u0aa7\u0acb", 121 | "placeholder": "Search conversations..." 122 | }, 123 | "timeframes": { 124 | "today": "\u0a86\u0a9c\u0ac7", 125 | "yesterday": "\u0a97\u0a88\u0a95\u0abe\u0ab2\u0ac7", 126 | "previous7days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 7 \u0aa6\u0abf\u0ab5\u0ab8", 127 | "previous30days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 30 \u0aa6\u0abf\u0ab5\u0ab8" 128 | }, 129 | "empty": "\u0a95\u0acb\u0a88 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0acd\u0ab8 \u0aae\u0ab3\u0acd\u0aaf\u0abe \u0aa8\u0aa5\u0ac0", 130 | "actions": { 131 | "close": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb", 132 | "open": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0a96\u0acb\u0ab2\u0acb" 133 | } 134 | }, 135 | "thread": { 136 | "untitled": "\u0ab6\u0ac0\u0ab0\u0acd\u0ab7\u0a95 \u0ab5\u0a97\u0ab0\u0aa8\u0ac0 \u0ab5\u0abe\u0aa4\u0a9a\u0ac0\u0aa4", 137 | "menu": { 138 | "rename": "Rename", 139 | "delete": "Delete" 140 | }, 141 | "actions": { 142 | "delete": { 143 | "title": "\u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab5\u0abe\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb", 144 | "description": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0a85\u0aa8\u0ac7 \u0aa4\u0ac7\u0aa8\u0abe \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0abe\u0a93 \u0a85\u0aa8\u0ac7 \u0aa4\u0aa4\u0acd\u0ab5\u0acb\u0aa8\u0ac7 \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab6\u0ac7. \u0a86 \u0a95\u0acd\u0ab0\u0abf\u0aaf\u0abe \u0aaa\u0abe\u0a9b\u0ac0 \u0aab\u0ac7\u0ab0\u0ab5\u0ac0 \u0ab6\u0a95\u0abe\u0ab6\u0ac7 \u0aa8\u0ab9\u0ac0\u0a82", 145 | "success": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0", 146 | "inProgress": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f" 147 | }, 148 | "rename": { 149 | "title": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0acb", 150 | "description": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0aae\u0abe\u0a9f\u0ac7 \u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb", 151 | "form": { 152 | "name": { 153 | "label": "\u0aa8\u0abe\u0aae", 154 | "placeholder": "\u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb" 155 | } 156 | }, 157 | "success": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0abe\u0aaf\u0ac1\u0a82!", 158 | "inProgress": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f" 159 | } 160 | } 161 | } 162 | }, 163 | "navigation": { 164 | "header": { 165 | "chat": "\u0a9a\u0ac7\u0a9f", 166 | "readme": "\u0ab5\u0abe\u0a82\u0a9a\u0acb", 167 | "theme": { 168 | "light": "Light Theme", 169 | "dark": "Dark Theme", 170 | "system": "Follow System" 171 | } 172 | }, 173 | "newChat": { 174 | "button": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f", 175 | "dialog": { 176 | "title": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f \u0aac\u0aa8\u0abe\u0ab5\u0acb", 177 | "description": "\u0a86 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab5\u0ab0\u0acd\u0aa4\u0aae\u0abe\u0aa8 \u0a9a\u0ac7\u0a9f \u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0ab8\u0abe\u0aab \u0a95\u0ab0\u0ab6\u0ac7. \u0ab6\u0ac1\u0a82 \u0aa4\u0aae\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0ab5\u0abe \u0aae\u0abe\u0a82\u0a97\u0acb \u0a9b\u0acb?", 178 | "tooltip": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f" 179 | } 180 | }, 181 | "user": { 182 | "menu": { 183 | "settings": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8", 184 | "settingsKey": "S", 185 | "apiKeys": "API \u0a95\u0ac0", 186 | "logout": "\u0ab2\u0ac9\u0a97\u0a86\u0a89\u0a9f" 187 | } 188 | } 189 | }, 190 | "apiKeys": { 191 | "title": "\u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 API \u0a95\u0ac0", 192 | "description": "\u0a86 \u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0ab5\u0abe\u0aaa\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aa8\u0ac0\u0a9a\u0ac7\u0aa8\u0ac0 API \u0a95\u0ac0 \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a9b\u0ac7. \u0a95\u0ac0 \u0aa4\u0aae\u0abe\u0ab0\u0abe \u0aa1\u0abf\u0ab5\u0abe\u0a87\u0ab8\u0aa8\u0abe \u0ab2\u0acb\u0a95\u0ab2 \u0ab8\u0acd\u0a9f\u0acb\u0ab0\u0ac7\u0a9c\u0aae\u0abe\u0a82 \u0ab8\u0a82\u0a97\u0acd\u0ab0\u0ab9\u0abf\u0aa4 \u0aa5\u0ab6\u0ac7.", 193 | "success": { 194 | "saved": "\u0ab8\u0aab\u0ab3\u0aa4\u0abe\u0aaa\u0ac2\u0ab0\u0acd\u0ab5\u0a95 \u0ab8\u0abe\u0a9a\u0ab5\u0acd\u0aaf\u0ac1\u0a82" 195 | } 196 | }, 197 | "alerts": { 198 | "info": "Info", 199 | "note": "Note", 200 | "tip": "Tip", 201 | "important": "Important", 202 | "warning": "Warning", 203 | "caution": "Caution", 204 | "debug": "Debug", 205 | "example": "Example", 206 | "success": "Success", 207 | "help": "Help", 208 | "idea": "Idea", 209 | "pending": "Pending", 210 | "security": "Security", 211 | "beta": "Beta", 212 | "best-practice": "Best Practice" 213 | } 214 | } -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/.chainlit/translations/he-IL.json: -------------------------------------------------------------------------------- 1 | { 2 | "common": { 3 | "actions": { 4 | "cancel": "\u05d1\u05d9\u05d8\u05d5\u05dc", 5 | "confirm": "\u05d0\u05d9\u05e9\u05d5\u05e8", 6 | "continue": "\u05d4\u05de\u05e9\u05da", 7 | "goBack": "\u05d7\u05d6\u05d5\u05e8", 8 | "reset": "\u05d0\u05d9\u05e4\u05d5\u05e1", 9 | "submit": "\u05e9\u05dc\u05d7" 10 | }, 11 | "status": { 12 | "loading": "\u05d8\u05d5\u05e2\u05df...", 13 | "error": { 14 | "default": "\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4", 15 | "serverConnection": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05dc\u05e9\u05e8\u05ea" 16 | } 17 | } 18 | }, 19 | "auth": { 20 | "login": { 21 | "title": "\u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4", 22 | "form": { 23 | "email": { 24 | "label": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05d9\u05de\u05d9\u05d9\u05dc", 25 | "required": "\u05e9\u05d3\u05d4 \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4" 26 | }, 27 | "password": { 28 | "label": "\u05e1\u05d9\u05e1\u05de\u05d4", 29 | "required": "\u05e9\u05d3\u05d4 \u05d4\u05e1\u05d9\u05e1\u05de\u05d4 \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4" 30 | }, 31 | "actions": { 32 | "signin": "\u05d4\u05ea\u05d7\u05d1\u05e8" 33 | }, 34 | "alternativeText": { 35 | "or": "\u05d0\u05d5" 36 | } 37 | }, 38 | "errors": { 39 | "default": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8", 40 | "signin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", 41 | "oauthSignin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", 42 | "redirectUriMismatch": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05d4\u05e4\u05e0\u05d9\u05d4 \u05d0\u05d9\u05e0\u05d4 \u05ea\u05d5\u05d0\u05de\u05ea \u05d0\u05ea \u05ea\u05e6\u05d5\u05e8\u05ea \u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d9\u05ea OAuth", 43 | "oauthCallback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", 44 | "oauthCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", 45 | "emailCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", 46 | "callback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8", 47 | "oauthAccountNotLinked": "\u05db\u05d3\u05d9 \u05dc\u05d0\u05de\u05ea \u05d0\u05ea \u05d6\u05d4\u05d5\u05ea\u05da, \u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d0\u05d5\u05ea\u05d5 \u05d7\u05e9\u05d1\u05d5\u05df \u05d1\u05d5 \u05d4\u05e9\u05ea\u05de\u05e9\u05ea \u05d1\u05de\u05e7\u05d5\u05e8", 48 | "emailSignin": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05d4\u05d9\u05d4 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc", 49 | "emailVerify": "\u05d0\u05e0\u05d0 \u05d0\u05de\u05ea \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05e9\u05dc\u05da, \u05e0\u05e9\u05dc\u05d7 \u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d7\u05d3\u05e9", 50 | "credentialsSignin": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4. \u05d1\u05d3\u05d5\u05e7 \u05e9\u05d4\u05e4\u05e8\u05d8\u05d9\u05dd \u05e9\u05d4\u05d6\u05e0\u05ea \u05e0\u05db\u05d5\u05e0\u05d9\u05dd", 51 | "sessionRequired": "\u05d0\u05e0\u05d0 \u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d3\u05e3 \u05d6\u05d4" 52 | } 53 | }, 54 | "provider": { 55 | "continue": "\u05d4\u05de\u05e9\u05da \u05e2\u05dd {{provider}}" 56 | } 57 | }, 58 | "chat": { 59 | "input": { 60 | "placeholder": "\u05d4\u05e7\u05dc\u05d3 \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d4 \u05e9\u05dc\u05da \u05db\u05d0\u05df...", 61 | "actions": { 62 | "send": "\u05e9\u05dc\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4", 63 | "stop": "\u05e2\u05e6\u05d5\u05e8 \u05de\u05e9\u05d9\u05de\u05d4", 64 | "attachFiles": "\u05e6\u05e8\u05e3 \u05e7\u05d1\u05e6\u05d9\u05dd" 65 | } 66 | }, 67 | "speech": { 68 | "start": "\u05d4\u05ea\u05d7\u05dc \u05d4\u05e7\u05dc\u05d8\u05d4", 69 | "stop": "\u05e2\u05e6\u05d5\u05e8 \u05d4\u05e7\u05dc\u05d8\u05d4", 70 | "connecting": "\u05de\u05ea\u05d7\u05d1\u05e8" 71 | }, 72 | "fileUpload": { 73 | "dragDrop": "\u05d2\u05e8\u05d5\u05e8 \u05d5\u05e9\u05d7\u05e8\u05e8 \u05e7\u05d1\u05e6\u05d9\u05dd \u05db\u05d0\u05df", 74 | "browse": "\u05e2\u05d9\u05d9\u05df \u05d1\u05e7\u05d1\u05e6\u05d9\u05dd", 75 | "sizeLimit": "\u05de\u05d2\u05d1\u05dc\u05d4:", 76 | "errors": { 77 | "failed": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4", 78 | "cancelled": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05d1\u05d5\u05d8\u05dc\u05d4 \u05e9\u05dc" 79 | } 80 | }, 81 | "messages": { 82 | "status": { 83 | "using": "\u05de\u05e9\u05ea\u05de\u05e9 \u05d1", 84 | "used": "\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1" 85 | }, 86 | "actions": { 87 | "copy": { 88 | "button": "\u05d4\u05e2\u05ea\u05e7 \u05dc\u05dc\u05d5\u05d7", 89 | "success": "\u05d4\u05d5\u05e2\u05ea\u05e7!" 90 | } 91 | }, 92 | "feedback": { 93 | "positive": "\u05de\u05d5\u05e2\u05d9\u05dc", 94 | "negative": "\u05dc\u05d0 \u05de\u05d5\u05e2\u05d9\u05dc", 95 | "edit": "\u05e2\u05e8\u05d5\u05da \u05de\u05e9\u05d5\u05d1", 96 | "dialog": { 97 | "title": "\u05d4\u05d5\u05e1\u05e3 \u05ea\u05d2\u05d5\u05d1\u05d4", 98 | "submit": "\u05e9\u05dc\u05d7 \u05de\u05e9\u05d5\u05d1" 99 | }, 100 | "status": { 101 | "updating": "\u05de\u05e2\u05d3\u05db\u05df", 102 | "updated": "\u05d4\u05de\u05e9\u05d5\u05d1 \u05e2\u05d5\u05d3\u05db\u05df" 103 | } 104 | } 105 | }, 106 | "history": { 107 | "title": "\u05e7\u05dc\u05d8\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd", 108 | "empty": "\u05db\u05dc \u05db\u05da \u05e8\u05d9\u05e7...", 109 | "show": "\u05d4\u05e6\u05d2 \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4" 110 | }, 111 | "settings": { 112 | "title": "\u05e4\u05d0\u05e0\u05dc \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea" 113 | }, 114 | "watermark": "\u05e0\u05d1\u05e0\u05d4 \u05d1\u05d0\u05de\u05e6\u05e2\u05d5\u05ea" 115 | }, 116 | "threadHistory": { 117 | "sidebar": { 118 | "title": "\u05e6'\u05d0\u05d8\u05d9\u05dd \u05e7\u05d5\u05d3\u05de\u05d9\u05dd", 119 | "filters": { 120 | "search": "\u05d7\u05d9\u05e4\u05d5\u05e9", 121 | "placeholder": "Search conversations..." 122 | }, 123 | "timeframes": { 124 | "today": "\u05d4\u05d9\u05d5\u05dd", 125 | "yesterday": "\u05d0\u05ea\u05de\u05d5\u05dc", 126 | "previous7days": "7 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd", 127 | "previous30days": "30 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd" 128 | }, 129 | "empty": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05e9\u05d9\u05d7\u05d5\u05ea", 130 | "actions": { 131 | "close": "\u05e1\u05d2\u05d5\u05e8 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3", 132 | "open": "\u05e4\u05ea\u05d7 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3" 133 | } 134 | }, 135 | "thread": { 136 | "untitled": "\u05e9\u05d9\u05d7\u05d4 \u05dc\u05dc\u05d0 \u05db\u05d5\u05ea\u05e8\u05ea", 137 | "menu": { 138 | "rename": "Rename", 139 | "delete": "Delete" 140 | }, 141 | "actions": { 142 | "delete": { 143 | "title": "\u05d0\u05e9\u05e8 \u05de\u05d7\u05d9\u05e7\u05d4", 144 | "description": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05de\u05d7\u05e7 \u05d0\u05ea \u05d4\u05e9\u05d9\u05d7\u05d4 \u05d5\u05db\u05df \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05d5\u05d4\u05d0\u05dc\u05de\u05e0\u05d8\u05d9\u05dd \u05e9\u05dc\u05d4. \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d1\u05d8\u05dc \u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5", 145 | "success": "\u05d4\u05e6'\u05d0\u05d8 \u05e0\u05de\u05d7\u05e7", 146 | "inProgress": "\u05de\u05d5\u05d7\u05e7 \u05e6'\u05d0\u05d8" 147 | }, 148 | "rename": { 149 | "title": "\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4", 150 | "description": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9 \u05dc\u05e9\u05d9\u05d7\u05d4 \u05d6\u05d5", 151 | "form": { 152 | "name": { 153 | "label": "\u05e9\u05dd", 154 | "placeholder": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9" 155 | } 156 | }, 157 | "success": "\u05e9\u05dd \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e9\u05d5\u05e0\u05d4!", 158 | "inProgress": "\u05de\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4" 159 | } 160 | } 161 | } 162 | }, 163 | "navigation": { 164 | "header": { 165 | "chat": "\u05e6'\u05d0\u05d8", 166 | "readme": "\u05e7\u05e8\u05d0 \u05d0\u05d5\u05ea\u05d9", 167 | "theme": { 168 | "light": "Light Theme", 169 | "dark": "Dark Theme", 170 | "system": "Follow System" 171 | } 172 | }, 173 | "newChat": { 174 | "button": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9", 175 | "dialog": { 176 | "title": "\u05e6\u05d5\u05e8 \u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9", 177 | "description": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05e0\u05e7\u05d4 \u05d0\u05ea \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d9\u05ea \u05d4\u05e6'\u05d0\u05d8 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea \u05e9\u05dc\u05da. \u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05de\u05e9\u05d9\u05da?", 178 | "tooltip": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9" 179 | } 180 | }, 181 | "user": { 182 | "menu": { 183 | "settings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea", 184 | "settingsKey": "\u05d4", 185 | "apiKeys": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API", 186 | "logout": "\u05d4\u05ea\u05e0\u05ea\u05e7" 187 | } 188 | } 189 | }, 190 | "apiKeys": { 191 | "title": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd", 192 | "description": "\u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4 \u05d6\u05d5, \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd \u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05d4\u05d1\u05d0\u05d9\u05dd. \u05d4\u05de\u05e4\u05ea\u05d7\u05d5\u05ea \u05de\u05d0\u05d5\u05d7\u05e1\u05e0\u05d9\u05dd \u05d1\u05d0\u05d7\u05e1\u05d5\u05df \u05d4\u05de\u05e7\u05d5\u05de\u05d9 \u05e9\u05dc \u05d4\u05de\u05db\u05e9\u05d9\u05e8 \u05e9\u05dc\u05da.", 193 | "success": { 194 | "saved": "\u05e0\u05e9\u05de\u05e8 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4" 195 | } 196 | }, 197 | "alerts": { 198 | "info": "Info", 199 | "note": "Note", 200 | "tip": "Tip", 201 | "important": "Important", 202 | "warning": "Warning", 203 | "caution": "Caution", 204 | "debug": "Debug", 205 | "example": "Example", 206 | "success": "Success", 207 | "help": "Help", 208 | "idea": "Idea", 209 | "pending": "Pending", 210 | "security": "Security", 211 | "beta": "Beta", 212 | "best-practice": "Best Practice" 213 | } 214 | } -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/.chainlit/translations/hi.json: -------------------------------------------------------------------------------- 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 | }, 27 | "password": { 28 | "label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921", 29 | "required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948" 30 | }, 31 | "actions": { 32 | "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902" 33 | }, 34 | "alternativeText": { 35 | "or": "\u092f\u093e" 36 | } 37 | }, 38 | "errors": { 39 | "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0905\u0938\u092e\u0930\u094d\u0925", 40 | "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", 41 | "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", 42 | "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", 43 | "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", 44 | "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", 45 | "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", 46 | "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", 47 | "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", 48 | "emailSignin": "\u0908\u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u092d\u0947\u091c\u093e \u091c\u093e \u0938\u0915\u093e", 49 | "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", 50 | "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", 51 | "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" 52 | } 53 | }, 54 | "provider": { 55 | "continue": "{{provider}} \u0915\u0947 \u0938\u093e\u0925 \u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902" 56 | } 57 | }, 58 | "chat": { 59 | "input": { 60 | "placeholder": "\u0905\u092a\u0928\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0939\u093e\u0902 \u091f\u093e\u0907\u092a \u0915\u0930\u0947\u0902...", 61 | "actions": { 62 | "send": "\u0938\u0902\u0926\u0947\u0936 \u092d\u0947\u091c\u0947\u0902", 63 | "stop": "\u0915\u093e\u0930\u094d\u092f \u0930\u094b\u0915\u0947\u0902", 64 | "attachFiles": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u0938\u0902\u0932\u0917\u094d\u0928 \u0915\u0930\u0947\u0902" 65 | } 66 | }, 67 | "speech": { 68 | "start": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902", 69 | "stop": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0930\u094b\u0915\u0947\u0902", 70 | "connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948" 71 | }, 72 | "fileUpload": { 73 | "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", 74 | "browse": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u092c\u094d\u0930\u093e\u0909\u091c\u093c \u0915\u0930\u0947\u0902", 75 | "sizeLimit": "\u0938\u0940\u092e\u093e:", 76 | "errors": { 77 | "failed": "\u0905\u092a\u0932\u094b\u0921 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932", 78 | "cancelled": "\u0915\u093e \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u093f\u092f\u093e \u0917\u092f\u093e" 79 | } 80 | }, 81 | "messages": { 82 | "status": { 83 | "using": "\u0909\u092a\u092f\u094b\u0917 \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902", 84 | "used": "\u0909\u092a\u092f\u094b\u0917 \u0915\u093f\u092f\u093e" 85 | }, 86 | "actions": { 87 | "copy": { 88 | "button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921 \u092a\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u0947\u0902", 89 | "success": "\u0915\u0949\u092a\u0940 \u0915\u093f\u092f\u093e \u0917\u092f\u093e!" 90 | } 91 | }, 92 | "feedback": { 93 | "positive": "\u0938\u0939\u093e\u092f\u0915", 94 | "negative": "\u0938\u0939\u093e\u092f\u0915 \u0928\u0939\u0940\u0902", 95 | "edit": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u0947\u0902", 96 | "dialog": { 97 | "title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093c\u0947\u0902", 98 | "submit": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u091c\u092e\u093e \u0915\u0930\u0947\u0902" 99 | }, 100 | "status": { 101 | "updating": "\u0905\u092a\u0921\u0947\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948", 102 | "updated": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0905\u092a\u0921\u0947\u091f \u0915\u0940 \u0917\u0908" 103 | } 104 | } 105 | }, 106 | "history": { 107 | "title": "\u092a\u093f\u091b\u0932\u0947 \u0907\u0928\u092a\u0941\u091f", 108 | "empty": "\u0915\u0941\u091b \u092d\u0940 \u0928\u0939\u0940\u0902 \u0939\u0948...", 109 | "show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093f\u0916\u093e\u090f\u0902" 110 | }, 111 | "settings": { 112 | "title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 \u092a\u0948\u0928\u0932" 113 | }, 114 | "watermark": "\u0915\u0947 \u0938\u093e\u0925 \u092c\u0928\u093e\u092f\u093e \u0917\u092f\u093e" 115 | }, 116 | "threadHistory": { 117 | "sidebar": { 118 | "title": "\u092a\u093f\u091b\u0932\u0940 \u091a\u0948\u091f", 119 | "filters": { 120 | "search": "\u0916\u094b\u091c\u0947\u0902", 121 | "placeholder": "Search conversations..." 122 | }, 123 | "timeframes": { 124 | "today": "\u0906\u091c", 125 | "yesterday": "\u0915\u0932", 126 | "previous7days": "\u092a\u093f\u091b\u0932\u0947 7 \u0926\u093f\u0928", 127 | "previous30days": "\u092a\u093f\u091b\u0932\u0947 30 \u0926\u093f\u0928" 128 | }, 129 | "empty": "\u0915\u094b\u0908 \u0925\u094d\u0930\u0947\u0921 \u0928\u0939\u0940\u0902 \u092e\u093f\u0932\u093e", 130 | "actions": { 131 | "close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u0947\u0902", 132 | "open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0916\u094b\u0932\u0947\u0902" 133 | } 134 | }, 135 | "thread": { 136 | "untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0939\u0940\u0928 \u0935\u093e\u0930\u094d\u0924\u093e\u0932\u093e\u092a", 137 | "menu": { 138 | "rename": "Rename", 139 | "delete": "Delete" 140 | }, 141 | "actions": { 142 | "delete": { 143 | "title": "\u0939\u091f\u093e\u0928\u0947 \u0915\u0940 \u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902", 144 | "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", 145 | "success": "\u091a\u0948\u091f \u0939\u091f\u093e \u0926\u0940 \u0917\u0908", 146 | "inProgress": "\u091a\u0948\u091f \u0939\u091f\u093e\u0908 \u091c\u093e \u0930\u0939\u0940 \u0939\u0948" 147 | }, 148 | "rename": { 149 | "title": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932\u0947\u0902", 150 | "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", 151 | "form": { 152 | "name": { 153 | "label": "\u0928\u093e\u092e", 154 | "placeholder": "\u0928\u092f\u093e \u0928\u093e\u092e \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902" 155 | } 156 | }, 157 | "success": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932 \u0926\u093f\u092f\u093e \u0917\u092f\u093e!", 158 | "inProgress": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932\u093e \u091c\u093e \u0930\u0939\u093e \u0939\u0948" 159 | } 160 | } 161 | } 162 | }, 163 | "navigation": { 164 | "header": { 165 | "chat": "\u091a\u0948\u091f", 166 | "readme": "\u0930\u0940\u0921\u092e\u0940", 167 | "theme": { 168 | "light": "Light Theme", 169 | "dark": "Dark Theme", 170 | "system": "Follow System" 171 | } 172 | }, 173 | "newChat": { 174 | "button": "\u0928\u0908 \u091a\u0948\u091f", 175 | "dialog": { 176 | "title": "\u0928\u0908 \u091a\u0948\u091f \u092c\u0928\u093e\u090f\u0902", 177 | "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?", 178 | "tooltip": "\u0928\u0908 \u091a\u0948\u091f" 179 | } 180 | }, 181 | "user": { 182 | "menu": { 183 | "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938", 184 | "settingsKey": "S", 185 | "apiKeys": "API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902", 186 | "logout": "\u0932\u0949\u0917\u0906\u0909\u091f" 187 | } 188 | } 189 | }, 190 | "apiKeys": { 191 | "title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902", 192 | "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", 193 | "success": { 194 | "saved": "\u0938\u092b\u0932\u0924\u093e\u092a\u0942\u0930\u094d\u0935\u0915 \u0938\u0939\u0947\u091c\u093e \u0917\u092f\u093e" 195 | } 196 | }, 197 | "alerts": { 198 | "info": "Info", 199 | "note": "Note", 200 | "tip": "Tip", 201 | "important": "Important", 202 | "warning": "Warning", 203 | "caution": "Caution", 204 | "debug": "Debug", 205 | "example": "Example", 206 | "success": "Success", 207 | "help": "Help", 208 | "idea": "Idea", 209 | "pending": "Pending", 210 | "security": "Security", 211 | "beta": "Beta", 212 | "best-practice": "Best Practice" 213 | } 214 | } -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/.chainlit/translations/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "common": { 3 | "actions": { 4 | "cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb", 5 | "confirm": "\u78ba\u8a8d", 6 | "continue": "\u7d9a\u3051\u308b", 7 | "goBack": "\u623b\u308b", 8 | "reset": "\u30ea\u30bb\u30c3\u30c8", 9 | "submit": "\u9001\u4fe1" 10 | }, 11 | "status": { 12 | "loading": "\u8aad\u307f\u8fbc\u307f\u4e2d...", 13 | "error": { 14 | "default": "\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f", 15 | "serverConnection": "\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f" 16 | } 17 | } 18 | }, 19 | "auth": { 20 | "login": { 21 | "title": "\u30a2\u30d7\u30ea\u306b\u30ed\u30b0\u30a4\u30f3", 22 | "form": { 23 | "email": { 24 | "label": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9", 25 | "required": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059" 26 | }, 27 | "password": { 28 | "label": "\u30d1\u30b9\u30ef\u30fc\u30c9", 29 | "required": "\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059" 30 | }, 31 | "actions": { 32 | "signin": "\u30b5\u30a4\u30f3\u30a4\u30f3" 33 | }, 34 | "alternativeText": { 35 | "or": "\u307e\u305f\u306f" 36 | } 37 | }, 38 | "errors": { 39 | "default": "\u30b5\u30a4\u30f3\u30a4\u30f3\u3067\u304d\u307e\u305b\u3093", 40 | "signin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", 41 | "oauthSignin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", 42 | "redirectUriMismatch": "\u30ea\u30c0\u30a4\u30ec\u30af\u30c8URI\u304cOAuth\u30a2\u30d7\u30ea\u306e\u8a2d\u5b9a\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093", 43 | "oauthCallback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", 44 | "oauthCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", 45 | "emailCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", 46 | "callback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", 47 | "oauthAccountNotLinked": "\u672c\u4eba\u78ba\u8a8d\u306e\u305f\u3081\u3001\u6700\u521d\u306b\u4f7f\u7528\u3057\u305f\u306e\u3068\u540c\u3058\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044", 48 | "emailSignin": "\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f", 49 | "emailVerify": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u65b0\u3057\u3044\u30e1\u30fc\u30eb\u304c\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f", 50 | "credentialsSignin": "\u30b5\u30a4\u30f3\u30a4\u30f3\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u5165\u529b\u3057\u305f\u60c5\u5831\u304c\u6b63\u3057\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044", 51 | "sessionRequired": "\u3053\u306e\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306b\u306f\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044" 52 | } 53 | }, 54 | "provider": { 55 | "continue": "{{provider}}\u3067\u7d9a\u3051\u308b" 56 | } 57 | }, 58 | "chat": { 59 | "input": { 60 | "placeholder": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044...", 61 | "actions": { 62 | "send": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1", 63 | "stop": "\u30bf\u30b9\u30af\u3092\u505c\u6b62", 64 | "attachFiles": "\u30d5\u30a1\u30a4\u30eb\u3092\u6dfb\u4ed8" 65 | } 66 | }, 67 | "speech": { 68 | "start": "\u9332\u97f3\u958b\u59cb", 69 | "stop": "\u9332\u97f3\u505c\u6b62", 70 | "connecting": "\u63a5\u7d9a\u4e2d" 71 | }, 72 | "fileUpload": { 73 | "dragDrop": "\u3053\u3053\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30c9\u30e9\u30c3\u30b0\uff06\u30c9\u30ed\u30c3\u30d7", 74 | "browse": "\u30d5\u30a1\u30a4\u30eb\u3092\u53c2\u7167", 75 | "sizeLimit": "\u5236\u9650\uff1a", 76 | "errors": { 77 | "failed": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f", 78 | "cancelled": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3057\u305f\uff1a" 79 | } 80 | }, 81 | "messages": { 82 | "status": { 83 | "using": "\u4f7f\u7528\u4e2d", 84 | "used": "\u4f7f\u7528\u6e08\u307f" 85 | }, 86 | "actions": { 87 | "copy": { 88 | "button": "\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc", 89 | "success": "\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\uff01" 90 | } 91 | }, 92 | "feedback": { 93 | "positive": "\u5f79\u306b\u7acb\u3063\u305f", 94 | "negative": "\u5f79\u306b\u7acb\u305f\u306a\u304b\u3063\u305f", 95 | "edit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u7de8\u96c6", 96 | "dialog": { 97 | "title": "\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0", 98 | "submit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u9001\u4fe1" 99 | }, 100 | "status": { 101 | "updating": "\u66f4\u65b0\u4e2d", 102 | "updated": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f" 103 | } 104 | } 105 | }, 106 | "history": { 107 | "title": "\u6700\u8fd1\u306e\u5165\u529b", 108 | "empty": "\u4f55\u3082\u3042\u308a\u307e\u305b\u3093...", 109 | "show": "\u5c65\u6b74\u3092\u8868\u793a" 110 | }, 111 | "settings": { 112 | "title": "\u8a2d\u5b9a\u30d1\u30cd\u30eb" 113 | }, 114 | "watermark": "\u958b\u767a\u5143\uff1a" 115 | }, 116 | "threadHistory": { 117 | "sidebar": { 118 | "title": "\u904e\u53bb\u306e\u30c1\u30e3\u30c3\u30c8", 119 | "filters": { 120 | "search": "\u691c\u7d22", 121 | "placeholder": "Search conversations..." 122 | }, 123 | "timeframes": { 124 | "today": "\u4eca\u65e5", 125 | "yesterday": "\u6628\u65e5", 126 | "previous7days": "\u904e\u53bb7\u65e5\u9593", 127 | "previous30days": "\u904e\u53bb30\u65e5\u9593" 128 | }, 129 | "empty": "\u30b9\u30ec\u30c3\u30c9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093", 130 | "actions": { 131 | "close": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u9589\u3058\u308b", 132 | "open": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u958b\u304f" 133 | } 134 | }, 135 | "thread": { 136 | "untitled": "\u7121\u984c\u306e\u4f1a\u8a71", 137 | "menu": { 138 | "rename": "Rename", 139 | "delete": "Delete" 140 | }, 141 | "actions": { 142 | "delete": { 143 | "title": "\u524a\u9664\u306e\u78ba\u8a8d", 144 | "description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u3068\u305d\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3001\u8981\u7d20\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u64cd\u4f5c\u306f\u53d6\u308a\u6d88\u305b\u307e\u305b\u3093", 145 | "success": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u3057\u307e\u3057\u305f", 146 | "inProgress": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u4e2d" 147 | }, 148 | "rename": { 149 | "title": "\u30b9\u30ec\u30c3\u30c9\u306e\u540d\u524d\u3092\u5909\u66f4", 150 | "description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306e\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044", 151 | "form": { 152 | "name": { 153 | "label": "\u540d\u524d", 154 | "placeholder": "\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b" 155 | } 156 | }, 157 | "success": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u3057\u307e\u3057\u305f\uff01", 158 | "inProgress": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u4e2d" 159 | } 160 | } 161 | } 162 | }, 163 | "navigation": { 164 | "header": { 165 | "chat": "\u30c1\u30e3\u30c3\u30c8", 166 | "readme": "\u8aac\u660e\u66f8", 167 | "theme": { 168 | "light": "Light Theme", 169 | "dark": "Dark Theme", 170 | "system": "Follow System" 171 | } 172 | }, 173 | "newChat": { 174 | "button": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8", 175 | "dialog": { 176 | "title": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8\u306e\u4f5c\u6210", 177 | "description": "\u73fe\u5728\u306e\u30c1\u30e3\u30c3\u30c8\u5c65\u6b74\u304c\u30af\u30ea\u30a2\u3055\u308c\u307e\u3059\u3002\u7d9a\u884c\u3057\u307e\u3059\u304b\uff1f", 178 | "tooltip": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8" 179 | } 180 | }, 181 | "user": { 182 | "menu": { 183 | "settings": "\u8a2d\u5b9a", 184 | "settingsKey": "S", 185 | "apiKeys": "API\u30ad\u30fc", 186 | "logout": "\u30ed\u30b0\u30a2\u30a6\u30c8" 187 | } 188 | } 189 | }, 190 | "apiKeys": { 191 | "title": "\u5fc5\u8981\u306aAPI\u30ad\u30fc", 192 | "description": "\u3053\u306e\u30a2\u30d7\u30ea\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001\u4ee5\u4e0b\u306eAPI\u30ad\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u30ad\u30fc\u306f\u304a\u4f7f\u3044\u306e\u30c7\u30d0\u30a4\u30b9\u306e\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002", 193 | "success": { 194 | "saved": "\u4fdd\u5b58\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f" 195 | } 196 | }, 197 | "alerts": { 198 | "info": "Info", 199 | "note": "Note", 200 | "tip": "Tip", 201 | "important": "Important", 202 | "warning": "Warning", 203 | "caution": "Caution", 204 | "debug": "Debug", 205 | "example": "Example", 206 | "success": "Success", 207 | "help": "Help", 208 | "idea": "Idea", 209 | "pending": "Pending", 210 | "security": "Security", 211 | "beta": "Beta", 212 | "best-practice": "Best Practice" 213 | } 214 | } -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/.chainlit/translations/mr.json: -------------------------------------------------------------------------------- 1 | { 2 | "common": { 3 | "actions": { 4 | "cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u093e", 5 | "confirm": "\u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e", 6 | "continue": "\u092a\u0941\u0922\u0947 \u091c\u093e", 7 | "goBack": "\u092e\u093e\u0917\u0947 \u091c\u093e", 8 | "reset": "\u0930\u0940\u0938\u0947\u091f \u0915\u0930\u093e", 9 | "submit": "\u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e" 10 | }, 11 | "status": { 12 | "loading": "\u0932\u094b\u0921 \u0915\u0930\u0924 \u0906\u0939\u0947...", 13 | "error": { 14 | "default": "\u090f\u0915 \u0924\u094d\u0930\u0941\u091f\u0940 \u0906\u0932\u0940", 15 | "serverConnection": "\u0938\u0930\u094d\u0935\u094d\u0939\u0930\u0936\u0940 \u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b\u090a \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940" 16 | } 17 | } 18 | }, 19 | "auth": { 20 | "login": { 21 | "title": "\u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u093e", 22 | "form": { 23 | "email": { 24 | "label": "\u0908\u092e\u0947\u0932 \u092a\u0924\u094d\u0924\u093e", 25 | "required": "\u0908\u092e\u0947\u0932 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947" 26 | }, 27 | "password": { 28 | "label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921", 29 | "required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947" 30 | }, 31 | "actions": { 32 | "signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e" 33 | }, 34 | "alternativeText": { 35 | "or": "\u0915\u093f\u0902\u0935\u093e" 36 | } 37 | }, 38 | "errors": { 39 | "default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0942 \u0936\u0915\u0924 \u0928\u093e\u0939\u0940", 40 | "signin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", 41 | "oauthSignin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", 42 | "redirectUriMismatch": "\u0930\u0940\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f URI \u0913\u0925 \u0905\u0945\u092a \u0915\u0949\u0928\u094d\u092b\u093f\u0917\u0930\u0947\u0936\u0928\u0936\u0940 \u091c\u0941\u0933\u0924 \u0928\u093e\u0939\u0940", 43 | "oauthCallback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", 44 | "oauthCreateAccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", 45 | "emailCreateAccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", 46 | "callback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e", 47 | "oauthAccountNotLinked": "\u0924\u0941\u092e\u091a\u0940 \u0913\u0933\u0916 \u092a\u091f\u0935\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940, \u092e\u0942\u0933 \u0935\u093e\u092a\u0930\u0932\u0947\u0932\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947\u091a \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e", 48 | "emailSignin": "\u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0942 \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940", 49 | "emailVerify": "\u0915\u0943\u092a\u092f\u093e \u0924\u0941\u092e\u091a\u093e \u0908\u092e\u0947\u0932 \u0924\u092a\u093e\u0938\u093e, \u0928\u0935\u0940\u0928 \u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0932\u093e \u0917\u0947\u0932\u093e \u0906\u0939\u0947", 50 | "credentialsSignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0905\u092f\u0936\u0938\u094d\u0935\u0940. \u0924\u0941\u092e\u094d\u0939\u0940 \u0926\u093f\u0932\u0947\u0932\u0940 \u092e\u093e\u0939\u093f\u0924\u0940 \u092f\u094b\u0917\u094d\u092f \u0906\u0939\u0947 \u0915\u093e \u0924\u0947 \u0924\u092a\u093e\u0938\u093e", 51 | "sessionRequired": "\u092f\u093e \u092a\u0943\u0937\u094d\u0920\u093e\u0935\u0930 \u092a\u094d\u0930\u0935\u0947\u0936 \u0915\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0915\u0943\u092a\u092f\u093e \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e" 52 | } 53 | }, 54 | "provider": { 55 | "continue": "{{provider}} \u0938\u0939 \u092a\u0941\u0922\u0947 \u091c\u093e" 56 | } 57 | }, 58 | "chat": { 59 | "input": { 60 | "placeholder": "\u0924\u0941\u092e\u091a\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0947\u0925\u0947 \u091f\u093e\u0907\u092a \u0915\u0930\u093e...", 61 | "actions": { 62 | "send": "\u0938\u0902\u0926\u0947\u0936 \u092a\u093e\u0920\u0935\u093e", 63 | "stop": "\u0915\u093e\u0930\u094d\u092f \u0925\u093e\u0902\u092c\u0935\u093e", 64 | "attachFiles": "\u092b\u093e\u0907\u0932\u094d\u0938 \u091c\u094b\u0921\u093e" 65 | } 66 | }, 67 | "speech": { 68 | "start": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0938\u0941\u0930\u0942 \u0915\u0930\u093e", 69 | "stop": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0925\u093e\u0902\u092c\u0935\u093e", 70 | "connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0924 \u0906\u0939\u0947" 71 | }, 72 | "fileUpload": { 73 | "dragDrop": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092f\u0947\u0925\u0947 \u0921\u094d\u0930\u0945\u0917 \u0906\u0923\u093f \u0921\u094d\u0930\u0949\u092a \u0915\u0930\u093e", 74 | "browse": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092c\u094d\u0930\u093e\u0909\u091d \u0915\u0930\u093e", 75 | "sizeLimit": "\u092e\u0930\u094d\u092f\u093e\u0926\u093e:", 76 | "errors": { 77 | "failed": "\u0905\u092a\u0932\u094b\u0921 \u0905\u092f\u0936\u0938\u094d\u0935\u0940", 78 | "cancelled": "\u092f\u093e\u0902\u091a\u0947 \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0947\u0932\u0947" 79 | } 80 | }, 81 | "messages": { 82 | "status": { 83 | "using": "\u0935\u093e\u092a\u0930\u0924 \u0906\u0939\u0947", 84 | "used": "\u0935\u093e\u092a\u0930\u0932\u0947" 85 | }, 86 | "actions": { 87 | "copy": { 88 | "button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921\u0935\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u093e", 89 | "success": "\u0915\u0949\u092a\u0940 \u0915\u0947\u0932\u0947!" 90 | } 91 | }, 92 | "feedback": { 93 | "positive": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924", 94 | "negative": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924 \u0928\u093e\u0939\u0940", 95 | "edit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u093e", 96 | "dialog": { 97 | "title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093e", 98 | "submit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e" 99 | }, 100 | "status": { 101 | "updating": "\u0905\u092a\u0921\u0947\u091f \u0915\u0930\u0924 \u0906\u0939\u0947", 102 | "updated": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0905\u092a\u0921\u0947\u091f \u0915\u0947\u0932\u0947" 103 | } 104 | } 105 | }, 106 | "history": { 107 | "title": "\u0936\u0947\u0935\u091f\u091a\u0947 \u0907\u0928\u092a\u0941\u091f", 108 | "empty": "\u0930\u093f\u0915\u093e\u092e\u0947 \u0906\u0939\u0947...", 109 | "show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093e\u0916\u0935\u093e" 110 | }, 111 | "settings": { 112 | "title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c \u092a\u0945\u0928\u0932" 113 | }, 114 | "watermark": "\u0938\u0939 \u092c\u0928\u0935\u0932\u0947" 115 | }, 116 | "threadHistory": { 117 | "sidebar": { 118 | "title": "\u092e\u093e\u0917\u0940\u0932 \u091a\u0945\u091f\u094d\u0938", 119 | "filters": { 120 | "search": "\u0936\u094b\u0927\u093e", 121 | "placeholder": "Search conversations..." 122 | }, 123 | "timeframes": { 124 | "today": "\u0906\u091c", 125 | "yesterday": "\u0915\u093e\u0932", 126 | "previous7days": "\u092e\u093e\u0917\u0940\u0932 7 \u0926\u093f\u0935\u0938", 127 | "previous30days": "\u092e\u093e\u0917\u0940\u0932 30 \u0926\u093f\u0935\u0938" 128 | }, 129 | "empty": "\u0915\u094b\u0923\u0924\u0947\u0939\u0940 \u0925\u094d\u0930\u0947\u0921 \u0938\u093e\u092a\u0921\u0932\u0947 \u0928\u093e\u0939\u0940\u0924", 130 | "actions": { 131 | "close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u093e", 132 | "open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0909\u0918\u0921\u093e" 133 | } 134 | }, 135 | "thread": { 136 | "untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0935\u093f\u0930\u0939\u093f\u0924 \u0938\u0902\u092d\u093e\u0937\u0923", 137 | "menu": { 138 | "rename": "Rename", 139 | "delete": "Delete" 140 | }, 141 | "actions": { 142 | "delete": { 143 | "title": "\u0939\u091f\u0935\u093f\u0923\u094d\u092f\u093e\u091a\u0940 \u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e", 144 | "description": "\u0939\u0947 \u0925\u094d\u0930\u0947\u0921 \u0906\u0923\u093f \u0924\u094d\u092f\u093e\u091a\u0947 \u0938\u0902\u0926\u0947\u0936 \u0935 \u0918\u091f\u0915 \u0939\u091f\u0935\u0947\u0932. \u0939\u0940 \u0915\u094d\u0930\u093f\u092f\u093e \u092a\u0942\u0930\u094d\u0935\u0935\u0924 \u0915\u0947\u0932\u0940 \u091c\u093e\u090a \u0936\u0915\u0924 \u0928\u093e\u0939\u0940", 145 | "success": "\u091a\u0945\u091f \u0939\u091f\u0935\u0932\u093e", 146 | "inProgress": "\u091a\u0945\u091f \u0939\u091f\u0935\u0924 \u0906\u0939\u0947" 147 | }, 148 | "rename": { 149 | "title": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u093e", 150 | "description": "\u092f\u093e \u0925\u094d\u0930\u0947\u0921\u0938\u093e\u0920\u0940 \u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e", 151 | "form": { 152 | "name": { 153 | "label": "\u0928\u093e\u0935", 154 | "placeholder": "\u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e" 155 | } 156 | }, 157 | "success": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0932\u0947!", 158 | "inProgress": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0924 \u0906\u0939\u0947" 159 | } 160 | } 161 | } 162 | }, 163 | "navigation": { 164 | "header": { 165 | "chat": "\u091a\u0945\u091f", 166 | "readme": "\u0935\u093e\u091a\u093e", 167 | "theme": { 168 | "light": "Light Theme", 169 | "dark": "Dark Theme", 170 | "system": "Follow System" 171 | } 172 | }, 173 | "newChat": { 174 | "button": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f", 175 | "dialog": { 176 | "title": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f \u0924\u092f\u093e\u0930 \u0915\u0930\u093e", 177 | "description": "\u0939\u0947 \u0924\u0941\u092e\u091a\u093e \u0938\u0927\u094d\u092f\u093e\u091a\u093e \u091a\u0945\u091f \u0907\u0924\u093f\u0939\u093e\u0938 \u0938\u093e\u092b \u0915\u0930\u0947\u0932. \u0924\u0941\u092e\u094d\u0939\u093e\u0932\u093e \u0916\u093e\u0924\u094d\u0930\u0940 \u0906\u0939\u0947 \u0915\u0940 \u0924\u0941\u092e\u094d\u0939\u0940 \u092a\u0941\u0922\u0947 \u091c\u093e\u090a \u0907\u091a\u094d\u091b\u093f\u0924\u093e?", 178 | "tooltip": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f" 179 | } 180 | }, 181 | "user": { 182 | "menu": { 183 | "settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c", 184 | "settingsKey": "S", 185 | "apiKeys": "API \u0915\u0940\u091c", 186 | "logout": "\u0932\u0949\u0917\u0906\u0909\u091f" 187 | } 188 | } 189 | }, 190 | "apiKeys": { 191 | "title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0940\u091c", 192 | "description": "\u0939\u0947 \u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0916\u093e\u0932\u0940\u0932 API \u0915\u0940\u091c \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947\u0924. \u0915\u0940\u091c \u0924\u0941\u092e\u091a\u094d\u092f\u093e \u0921\u093f\u0935\u094d\u0939\u093e\u0907\u0938\u091a\u094d\u092f\u093e \u0932\u094b\u0915\u0932 \u0938\u094d\u091f\u094b\u0930\u0947\u091c\u092e\u0927\u094d\u092f\u0947 \u0938\u093e\u0920\u0935\u0932\u094d\u092f\u093e \u091c\u093e\u0924\u093e\u0924.", 193 | "success": { 194 | "saved": "\u092f\u0936\u0938\u094d\u0935\u0940\u0930\u093f\u0924\u094d\u092f\u093e \u091c\u0924\u0928 \u0915\u0947\u0932\u0947" 195 | } 196 | }, 197 | "alerts": { 198 | "info": "Info", 199 | "note": "Note", 200 | "tip": "Tip", 201 | "important": "Important", 202 | "warning": "Warning", 203 | "caution": "Caution", 204 | "debug": "Debug", 205 | "example": "Example", 206 | "success": "Success", 207 | "help": "Help", 208 | "idea": "Idea", 209 | "pending": "Pending", 210 | "security": "Security", 211 | "beta": "Beta", 212 | "best-practice": "Best Practice" 213 | } 214 | } -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/.chainlit/translations/nl-NL.json: -------------------------------------------------------------------------------- 1 | { 2 | "common": { 3 | "actions": { 4 | "cancel": "Annuleren", 5 | "confirm": "Bevestigen", 6 | "continue": "Doorgaan", 7 | "goBack": "Terug", 8 | "reset": "Herstellen", 9 | "submit": "Versturen" 10 | }, 11 | "status": { 12 | "loading": "Laden...", 13 | "error": { 14 | "default": "Er is een fout opgetreden", 15 | "serverConnection": "Kon geen verbinding maken met de server" 16 | } 17 | } 18 | }, 19 | "auth": { 20 | "login": { 21 | "title": "Inloggen om toegang te krijgen tot de app", 22 | "form": { 23 | "email": { 24 | "label": "E-mailadres", 25 | "required": "e-mail is een verplicht veld" 26 | }, 27 | "password": { 28 | "label": "Wachtwoord", 29 | "required": "wachtwoord is een verplicht veld" 30 | }, 31 | "actions": { 32 | "signin": "Inloggen" 33 | }, 34 | "alternativeText": { 35 | "or": "OF" 36 | } 37 | }, 38 | "errors": { 39 | "default": "Kan niet inloggen", 40 | "signin": "Probeer in te loggen met een ander account", 41 | "oauthSignin": "Probeer in te loggen met een ander account", 42 | "redirectUriMismatch": "De redirect URI komt niet overeen met de oauth app configuratie", 43 | "oauthCallback": "Probeer in te loggen met een ander account", 44 | "oauthCreateAccount": "Probeer in te loggen met een ander account", 45 | "emailCreateAccount": "Probeer in te loggen met een ander account", 46 | "callback": "Probeer in te loggen met een ander account", 47 | "oauthAccountNotLinked": "Om je identiteit te bevestigen, log in met hetzelfde account dat je oorspronkelijk hebt gebruikt", 48 | "emailSignin": "De e-mail kon niet worden verzonden", 49 | "emailVerify": "Verifieer je e-mail, er is een nieuwe e-mail verzonden", 50 | "credentialsSignin": "Inloggen mislukt. Controleer of de ingevoerde gegevens correct zijn", 51 | "sessionRequired": "Log in om toegang te krijgen tot deze pagina" 52 | } 53 | }, 54 | "provider": { 55 | "continue": "Doorgaan met {{provider}}" 56 | } 57 | }, 58 | "chat": { 59 | "input": { 60 | "placeholder": "Typ hier je bericht...", 61 | "actions": { 62 | "send": "Bericht versturen", 63 | "stop": "Taak stoppen", 64 | "attachFiles": "Bestanden bijvoegen" 65 | } 66 | }, 67 | "speech": { 68 | "start": "Start opname", 69 | "stop": "Stop opname", 70 | "connecting": "Verbinden" 71 | }, 72 | "fileUpload": { 73 | "dragDrop": "Sleep bestanden hierheen", 74 | "browse": "Bestanden zoeken", 75 | "sizeLimit": "Limiet:", 76 | "errors": { 77 | "failed": "Uploaden mislukt", 78 | "cancelled": "Upload geannuleerd van" 79 | } 80 | }, 81 | "messages": { 82 | "status": { 83 | "using": "In gebruik", 84 | "used": "Gebruikt" 85 | }, 86 | "actions": { 87 | "copy": { 88 | "button": "Kopi\u00ebren naar klembord", 89 | "success": "Gekopieerd!" 90 | } 91 | }, 92 | "feedback": { 93 | "positive": "Nuttig", 94 | "negative": "Niet nuttig", 95 | "edit": "Feedback bewerken", 96 | "dialog": { 97 | "title": "Voeg een opmerking toe", 98 | "submit": "Feedback versturen" 99 | }, 100 | "status": { 101 | "updating": "Bijwerken", 102 | "updated": "Feedback bijgewerkt" 103 | } 104 | } 105 | }, 106 | "history": { 107 | "title": "Laatste invoer", 108 | "empty": "Zo leeg...", 109 | "show": "Toon geschiedenis" 110 | }, 111 | "settings": { 112 | "title": "Instellingenpaneel" 113 | }, 114 | "watermark": "Gebouwd met" 115 | }, 116 | "threadHistory": { 117 | "sidebar": { 118 | "title": "Eerdere chats", 119 | "filters": { 120 | "search": "Zoeken", 121 | "placeholder": "Search conversations..." 122 | }, 123 | "timeframes": { 124 | "today": "Vandaag", 125 | "yesterday": "Gisteren", 126 | "previous7days": "Afgelopen 7 dagen", 127 | "previous30days": "Afgelopen 30 dagen" 128 | }, 129 | "empty": "Geen gesprekken gevonden", 130 | "actions": { 131 | "close": "Zijbalk sluiten", 132 | "open": "Zijbalk openen" 133 | } 134 | }, 135 | "thread": { 136 | "untitled": "Naamloos gesprek", 137 | "menu": { 138 | "rename": "Rename", 139 | "delete": "Delete" 140 | }, 141 | "actions": { 142 | "delete": { 143 | "title": "Verwijdering bevestigen", 144 | "description": "Dit zal het gesprek en bijbehorende berichten en elementen verwijderen. Deze actie kan niet ongedaan worden gemaakt", 145 | "success": "Chat verwijderd", 146 | "inProgress": "Chat verwijderen" 147 | }, 148 | "rename": { 149 | "title": "Gesprek hernoemen", 150 | "description": "Voer een nieuwe naam in voor dit gesprek", 151 | "form": { 152 | "name": { 153 | "label": "Naam", 154 | "placeholder": "Voer nieuwe naam in" 155 | } 156 | }, 157 | "success": "Gesprek hernoemd!", 158 | "inProgress": "Gesprek hernoemen" 159 | } 160 | } 161 | } 162 | }, 163 | "navigation": { 164 | "header": { 165 | "chat": "Chat", 166 | "readme": "Leesmij", 167 | "theme": { 168 | "light": "Light Theme", 169 | "dark": "Dark Theme", 170 | "system": "Follow System" 171 | } 172 | }, 173 | "newChat": { 174 | "button": "Nieuwe chat", 175 | "dialog": { 176 | "title": "Nieuwe chat aanmaken", 177 | "description": "Dit zal je huidige chatgeschiedenis wissen. Weet je zeker dat je door wilt gaan?", 178 | "tooltip": "Nieuwe chat" 179 | } 180 | }, 181 | "user": { 182 | "menu": { 183 | "settings": "Instellingen", 184 | "settingsKey": "I", 185 | "apiKeys": "API-sleutels", 186 | "logout": "Uitloggen" 187 | } 188 | } 189 | }, 190 | "apiKeys": { 191 | "title": "Vereiste API-sleutels", 192 | "description": "Om deze app te gebruiken zijn de volgende API-sleutels vereist. De sleutels worden opgeslagen in de lokale opslag van je apparaat.", 193 | "success": { 194 | "saved": "Succesvol opgeslagen" 195 | } 196 | }, 197 | "alerts": { 198 | "info": "Info", 199 | "note": "Note", 200 | "tip": "Tip", 201 | "important": "Important", 202 | "warning": "Warning", 203 | "caution": "Caution", 204 | "debug": "Debug", 205 | "example": "Example", 206 | "success": "Success", 207 | "help": "Help", 208 | "idea": "Idea", 209 | "pending": "Pending", 210 | "security": "Security", 211 | "beta": "Beta", 212 | "best-practice": "Best Practice" 213 | } 214 | } -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/.chainlit/translations/zh-CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "common": { 3 | "actions": { 4 | "cancel": "\u53d6\u6d88", 5 | "confirm": "\u786e\u8ba4", 6 | "continue": "\u7ee7\u7eed", 7 | "goBack": "\u8fd4\u56de", 8 | "reset": "\u91cd\u7f6e", 9 | "submit": "\u63d0\u4ea4" 10 | }, 11 | "status": { 12 | "loading": "\u52a0\u8f7d\u4e2d...", 13 | "error": { 14 | "default": "\u53d1\u751f\u9519\u8bef", 15 | "serverConnection": "\u65e0\u6cd5\u8fde\u63a5\u5230\u670d\u52a1\u5668" 16 | } 17 | } 18 | }, 19 | "auth": { 20 | "login": { 21 | "title": "\u767b\u5f55\u4ee5\u8bbf\u95ee\u5e94\u7528", 22 | "form": { 23 | "email": { 24 | "label": "\u7535\u5b50\u90ae\u7bb1", 25 | "required": "\u90ae\u7bb1\u662f\u5fc5\u586b\u9879" 26 | }, 27 | "password": { 28 | "label": "\u5bc6\u7801", 29 | "required": "\u5bc6\u7801\u662f\u5fc5\u586b\u9879" 30 | }, 31 | "actions": { 32 | "signin": "\u767b\u5f55" 33 | }, 34 | "alternativeText": { 35 | "or": "\u6216" 36 | } 37 | }, 38 | "errors": { 39 | "default": "\u65e0\u6cd5\u767b\u5f55", 40 | "signin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", 41 | "oauthSignin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", 42 | "redirectUriMismatch": "\u91cd\u5b9a\u5411URI\u4e0eOAuth\u5e94\u7528\u914d\u7f6e\u4e0d\u5339\u914d", 43 | "oauthCallback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", 44 | "oauthCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", 45 | "emailCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", 46 | "callback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55", 47 | "oauthAccountNotLinked": "\u4e3a\u786e\u8ba4\u60a8\u7684\u8eab\u4efd\uff0c\u8bf7\u4f7f\u7528\u539f\u59cb\u8d26\u53f7\u767b\u5f55", 48 | "emailSignin": "\u90ae\u4ef6\u53d1\u9001\u5931\u8d25", 49 | "emailVerify": "\u8bf7\u9a8c\u8bc1\u60a8\u7684\u90ae\u7bb1\uff0c\u65b0\u7684\u9a8c\u8bc1\u90ae\u4ef6\u5df2\u53d1\u9001", 50 | "credentialsSignin": "\u767b\u5f55\u5931\u8d25\u3002\u8bf7\u68c0\u67e5\u60a8\u63d0\u4f9b\u7684\u4fe1\u606f\u662f\u5426\u6b63\u786e", 51 | "sessionRequired": "\u8bf7\u767b\u5f55\u4ee5\u8bbf\u95ee\u6b64\u9875\u9762" 52 | } 53 | }, 54 | "provider": { 55 | "continue": "\u7ee7\u7eed\u4f7f\u7528{{provider}}" 56 | } 57 | }, 58 | "chat": { 59 | "input": { 60 | "placeholder": "\u5728\u6b64\u8f93\u5165\u60a8\u7684\u6d88\u606f...", 61 | "actions": { 62 | "send": "\u53d1\u9001\u6d88\u606f", 63 | "stop": "\u505c\u6b62\u4efb\u52a1", 64 | "attachFiles": "\u9644\u52a0\u6587\u4ef6" 65 | } 66 | }, 67 | "speech": { 68 | "start": "\u5f00\u59cb\u5f55\u97f3", 69 | "stop": "\u505c\u6b62\u5f55\u97f3", 70 | "connecting": "\u8fde\u63a5\u4e2d" 71 | }, 72 | "fileUpload": { 73 | "dragDrop": "\u5c06\u6587\u4ef6\u62d6\u653e\u5230\u8fd9\u91cc", 74 | "browse": "\u6d4f\u89c8\u6587\u4ef6", 75 | "sizeLimit": "\u9650\u5236\uff1a", 76 | "errors": { 77 | "failed": "\u4e0a\u4f20\u5931\u8d25", 78 | "cancelled": "\u5df2\u53d6\u6d88\u4e0a\u4f20" 79 | } 80 | }, 81 | "messages": { 82 | "status": { 83 | "using": "\u4f7f\u7528\u4e2d", 84 | "used": "\u5df2\u4f7f\u7528" 85 | }, 86 | "actions": { 87 | "copy": { 88 | "button": "\u590d\u5236\u5230\u526a\u8d34\u677f", 89 | "success": "\u5df2\u590d\u5236\uff01" 90 | } 91 | }, 92 | "feedback": { 93 | "positive": "\u6709\u5e2e\u52a9", 94 | "negative": "\u6ca1\u6709\u5e2e\u52a9", 95 | "edit": "\u7f16\u8f91\u53cd\u9988", 96 | "dialog": { 97 | "title": "\u6dfb\u52a0\u8bc4\u8bba", 98 | "submit": "\u63d0\u4ea4\u53cd\u9988" 99 | }, 100 | "status": { 101 | "updating": "\u66f4\u65b0\u4e2d", 102 | "updated": "\u53cd\u9988\u5df2\u66f4\u65b0" 103 | } 104 | } 105 | }, 106 | "history": { 107 | "title": "\u6700\u8fd1\u8f93\u5165", 108 | "empty": "\u7a7a\u7a7a\u5982\u4e5f...", 109 | "show": "\u663e\u793a\u5386\u53f2" 110 | }, 111 | "settings": { 112 | "title": "\u8bbe\u7f6e\u9762\u677f" 113 | }, 114 | "watermark": "\u6280\u672f\u652f\u6301" 115 | }, 116 | "threadHistory": { 117 | "sidebar": { 118 | "title": "\u5386\u53f2\u5bf9\u8bdd", 119 | "filters": { 120 | "search": "\u641c\u7d22", 121 | "placeholder": "\u641c\u7d22\u4f1a\u8bdd..." 122 | }, 123 | "timeframes": { 124 | "today": "\u4eca\u5929", 125 | "yesterday": "\u6628\u5929", 126 | "previous7days": "\u8fc7\u53bb7\u5929", 127 | "previous30days": "\u8fc7\u53bb30\u5929" 128 | }, 129 | "empty": "\u672a\u627e\u5230\u5bf9\u8bdd", 130 | "actions": { 131 | "close": "\u5173\u95ed\u4fa7\u8fb9\u680f", 132 | "open": "\u6253\u5f00\u4fa7\u8fb9\u680f" 133 | } 134 | }, 135 | "thread": { 136 | "untitled": "\u672a\u547d\u540d\u5bf9\u8bdd", 137 | "menu": { 138 | "rename": "\u91cd\u547d\u540d", 139 | "delete": "\u5220\u9664" 140 | }, 141 | "actions": { 142 | "delete": { 143 | "title": "\u786e\u8ba4\u5220\u9664", 144 | "description": "\u8fd9\u5c06\u5220\u9664\u8be5\u5bf9\u8bdd\u53ca\u5176\u6240\u6709\u6d88\u606f\u548c\u5143\u7d20\u3002\u6b64\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500", 145 | "success": "\u5bf9\u8bdd\u5df2\u5220\u9664", 146 | "inProgress": "\u6b63\u5728\u5220\u9664\u5bf9\u8bdd" 147 | }, 148 | "rename": { 149 | "title": "\u91cd\u547d\u540d\u5bf9\u8bdd", 150 | "description": "\u4e3a\u6b64\u5bf9\u8bdd\u8f93\u5165\u65b0\u540d\u79f0", 151 | "form": { 152 | "name": { 153 | "label": "\u540d\u79f0", 154 | "placeholder": "\u8f93\u5165\u65b0\u540d\u79f0" 155 | } 156 | }, 157 | "success": "\u5bf9\u8bdd\u5df2\u91cd\u547d\u540d\uff01", 158 | "inProgress": "\u6b63\u5728\u91cd\u547d\u540d\u5bf9\u8bdd" 159 | } 160 | } 161 | } 162 | }, 163 | "navigation": { 164 | "header": { 165 | "chat": "\u804a\u5929", 166 | "readme": "\u8bf4\u660e", 167 | "theme": { 168 | "light": "\u6d45\u8272\u4e3b\u9898", 169 | "dark": "\u6df1\u8272\u4e3b\u9898", 170 | "system": "\u8ddf\u968f\u7cfb\u7edf" 171 | } 172 | }, 173 | "newChat": { 174 | "button": "\u65b0\u5efa\u5bf9\u8bdd", 175 | "dialog": { 176 | "title": "\u521b\u5efa\u65b0\u5bf9\u8bdd", 177 | "description": "\u8fd9\u5c06\u6e05\u9664\u60a8\u5f53\u524d\u7684\u804a\u5929\u8bb0\u5f55\u3002\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f", 178 | "tooltip": "\u65b0\u5efa\u5bf9\u8bdd" 179 | } 180 | }, 181 | "user": { 182 | "menu": { 183 | "settings": "\u8bbe\u7f6e", 184 | "settingsKey": "S", 185 | "apiKeys": "API\u5bc6\u94a5", 186 | "logout": "\u9000\u51fa\u767b\u5f55" 187 | } 188 | } 189 | }, 190 | "apiKeys": { 191 | "title": "\u6240\u9700API\u5bc6\u94a5", 192 | "description": "\u4f7f\u7528\u6b64\u5e94\u7528\u9700\u8981\u4ee5\u4e0bAPI\u5bc6\u94a5\u3002\u8fd9\u4e9b\u5bc6\u94a5\u5b58\u50a8\u5728\u60a8\u8bbe\u5907\u7684\u672c\u5730\u5b58\u50a8\u4e2d\u3002", 193 | "success": { 194 | "saved": "\u4fdd\u5b58\u6210\u529f" 195 | } 196 | }, 197 | "alerts": { 198 | "info": "\u4fe1\u606f", 199 | "note": "\u6ce8\u91ca", 200 | "tip": "\u63d0\u793a", 201 | "important": "\u91cd\u8981", 202 | "warning": "\u8b66\u544a", 203 | "caution": "\u6ce8\u610f", 204 | "debug": "\u8c03\u8bd5", 205 | "example": "\u793a\u4f8b", 206 | "success": "\u6210\u529f", 207 | "help": "\u5e2e\u52a9", 208 | "idea": "\u60f3\u6cd5", 209 | "pending": "\u5f85\u5904\u7406", 210 | "security": "\u5b89\u5168", 211 | "beta": "\u6d4b\u8bd5", 212 | "best-practice": "\u6700\u4f73\u5b9e\u8df5" 213 | } 214 | } -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/chainlit.md: -------------------------------------------------------------------------------- 1 | # Welcome to Foundational LLM Chat 2 | 3 | This application allows you to interact with various large language models through Amazon Bedrock. 4 | 5 | ## Features 6 | 7 | - Support for multiple models (Claude, Llama, Mistral, etc.) 8 | - Image and document upload capabilities 9 | - Streaming responses 10 | - Cost tracking 11 | - System prompt customization 12 | - Thinking/reasoning process visualization (for supported models) 13 | 14 | ## Getting Started 15 | 16 | 1. Select a model from the dropdown menu 17 | 2. Configure settings as needed 18 | 3. Start chatting! 19 | 20 | ## Supported File Types 21 | 22 | - Images: JPEG, PNG, GIF, WEBP 23 | - Documents: PDF, CSV, XLSX, XLS, DOCX, DOC, TXT, HTML, MD -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/config/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Configuration package for Foundational LLM Chat application. 3 | Contains configuration management and settings. 4 | """ -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/config/app_config.py: -------------------------------------------------------------------------------- 1 | """ 2 | Application configuration. 3 | """ 4 | import os 5 | import json 6 | from typing import Dict, Any, Optional 7 | import logging 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | class AppConfig: 12 | """Application configuration.""" 13 | 14 | @staticmethod 15 | def load_aws_config() -> Dict[str, str]: 16 | """Load AWS configuration.""" 17 | aws_region = os.environ.get('AWS_REGION') 18 | if not aws_region: 19 | raise ValueError('AWS_REGION environment variable not set') 20 | 21 | return { 22 | "region_name": aws_region 23 | } 24 | 25 | @staticmethod 26 | def load_system_prompts() -> Dict[str, Any]: 27 | """Load system prompts configuration.""" 28 | system_prompt_list = {} 29 | if os.environ.get('SYSTEM_PROMPT_LIST'): 30 | try: 31 | system_prompt_list = json.loads(os.environ.get('SYSTEM_PROMPT_LIST')) 32 | logger.debug(f"Loaded {len(system_prompt_list)} system prompts") 33 | except json.JSONDecodeError: 34 | logger.error("Error decoding SYSTEM_PROMPT_LIST JSON") 35 | 36 | return system_prompt_list 37 | 38 | @staticmethod 39 | def load_content_limits() -> Dict[str, Any]: 40 | """Load content size limits.""" 41 | return { 42 | "max_chars": None if (not os.getenv("MAX_CHARACHERS") or os.getenv("MAX_CHARACHERS") == "None") 43 | else int(os.getenv("MAX_CHARACHERS")), 44 | "max_content_size_mb": None if (not os.getenv("MAX_CONTENT_SIZE_MB") or os.getenv("MAX_CONTENT_SIZE_MB") == "None") 45 | else float(os.getenv("MAX_CONTENT_SIZE_MB")) 46 | } 47 | 48 | @staticmethod 49 | def load_data_layer_config() -> Dict[str, Optional[str]]: 50 | """Load data layer configuration.""" 51 | return { 52 | "dynamodb_table": None if (not os.getenv("DYNAMODB_DATA_LAYER_NAME") or os.getenv("DYNAMODB_DATA_LAYER_NAME") == "None") 53 | else str(os.getenv("DYNAMODB_DATA_LAYER_NAME")), 54 | "s3_bucket": None if (not os.getenv("S3_DATA_LAYER_NAME") or os.getenv("S3_DATA_LAYER_NAME") == "None") 55 | else str(os.getenv("S3_DATA_LAYER_NAME")) 56 | } 57 | 58 | @staticmethod 59 | def load_bedrock_models() -> Dict[str, Any]: 60 | """Load Bedrock models configuration.""" 61 | if not os.getenv("BEDROCK_MODELS"): 62 | logger.error("BEDROCK_MODELS environment variable not set") 63 | return {} 64 | 65 | try: 66 | models = json.loads(os.getenv("BEDROCK_MODELS")) 67 | logger.debug(f"Loaded {len(models)} Bedrock models") 68 | return models 69 | except json.JSONDecodeError: 70 | logger.error("Error decoding BEDROCK_MODELS JSON") 71 | return {} -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/config/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Application settings and configuration management. 3 | """ 4 | import os 5 | import json 6 | from typing import Dict, Any, Optional 7 | import logging 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | class Settings: 12 | """Application settings manager""" 13 | 14 | @staticmethod 15 | def load_aws_config() -> Dict[str, str]: 16 | """Load AWS configuration""" 17 | aws_region = os.environ.get('AWS_REGION') 18 | if not aws_region: 19 | raise ValueError('AWS_REGION environment variable not set') 20 | 21 | return { 22 | "region_name": aws_region 23 | } 24 | 25 | @staticmethod 26 | def load_system_prompts() -> Dict[str, Any]: 27 | """Load system prompts configuration""" 28 | system_prompt_list = {} 29 | if os.environ.get('SYSTEM_PROMPT_LIST'): 30 | try: 31 | system_prompt_list = json.loads(os.environ.get('SYSTEM_PROMPT_LIST')) 32 | logger.debug(f"Loaded {len(system_prompt_list)} system prompts") 33 | except json.JSONDecodeError: 34 | logger.error("Error decoding SYSTEM_PROMPT_LIST JSON") 35 | 36 | return system_prompt_list 37 | 38 | @staticmethod 39 | def load_content_limits() -> Dict[str, Any]: 40 | """Load content size limits""" 41 | return { 42 | "max_chars": None if (not os.getenv("MAX_CHARACHERS") or os.getenv("MAX_CHARACHERS") == "None") 43 | else int(os.getenv("MAX_CHARACHERS")), 44 | "max_content_size_mb": None if (not os.getenv("MAX_CONTENT_SIZE_MB") or os.getenv("MAX_CONTENT_SIZE_MB") == "None") 45 | else float(os.getenv("MAX_CONTENT_SIZE_MB")) 46 | } 47 | 48 | @staticmethod 49 | def load_data_layer_config() -> Dict[str, Optional[str]]: 50 | """Load data layer configuration""" 51 | return { 52 | "dynamodb_table": None if (not os.getenv("DYNAMODB_DATA_LAYER_NAME") or os.getenv("DYNAMODB_DATA_LAYER_NAME") == "None") 53 | else str(os.getenv("DYNAMODB_DATA_LAYER_NAME")), 54 | "s3_bucket": None if (not os.getenv("S3_DATA_LAYER_NAME") or os.getenv("S3_DATA_LAYER_NAME") == "None") 55 | else str(os.getenv("S3_DATA_LAYER_NAME")) 56 | } 57 | 58 | @staticmethod 59 | def load_bedrock_models() -> Dict[str, Any]: 60 | """Load Bedrock models configuration""" 61 | if not os.getenv("BEDROCK_MODELS"): 62 | logger.error("BEDROCK_MODELS environment variable not set") 63 | return {} 64 | 65 | try: 66 | models = json.loads(os.getenv("BEDROCK_MODELS")) 67 | logger.debug(f"Loaded {len(models)} Bedrock models") 68 | return models 69 | except json.JSONDecodeError: 70 | logger.error("Error decoding BEDROCK_MODELS JSON") 71 | return {} -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/foundational-llm-chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/foundational-llm-chat.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/logo_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/logo_dark.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/logo_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/logo_light.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/meta.llama3-1-405b-instruct-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/meta.llama3-1-405b-instruct-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/mistral.mistral-large-2407-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/mistral.mistral-large-2407-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.amazon.nova-lite-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.amazon.nova-lite-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.amazon.nova-micro-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.amazon.nova-micro-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.amazon.nova-premier-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.amazon.nova-premier-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.amazon.nova-pro-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.amazon.nova-pro-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-5-haiku-20241022-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-5-haiku-20241022-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-5-sonnet-20240620-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-5-sonnet-20240620-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-5-sonnet-20241022-v2:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-5-sonnet-20241022-v2:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-7-sonnet-20250219-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-7-sonnet-20250219-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-haiku-20240307-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-haiku-20240307-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-opus-20240229-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-opus-20240229-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-sonnet-20240229-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-3-sonnet-20240229-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-opus-4-20250514-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-opus-4-20250514-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-sonnet-4-20250514-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.anthropic.claude-sonnet-4-20250514-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-1-8b-instruct-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-1-8b-instruct-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-2-11b-instruct-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-2-11b-instruct-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-2-1b-instruct-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-2-1b-instruct-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-2-3b-instruct-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-2-3b-instruct-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-2-90b-instruct-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-2-90b-instruct-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-3-70b-instruct-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.meta.llama3-3-70b-instruct-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.meta.llama4-maverick-17b-instruct-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.meta.llama4-maverick-17b-instruct-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.meta.llama4-scout-17b-instruct-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.meta.llama4-scout-17b-instruct-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.mistral.pixtral-large-2502-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.mistral.pixtral-large-2502-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.writer.palmyra-x4-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.writer.palmyra-x4-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/public/us.writer.palmyra-x5-v1:0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/foundational-llm-chat/038f2cd04d4539c04d7113add145ec19a96f299a/chainlit_image/foundational-llm-chat_app/public/us.writer.palmyra-x5-v1:0.png -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/requirements.txt: -------------------------------------------------------------------------------- 1 | # we pin requirements to avoid breaking changes with packages updates 2 | chainlit==2.5.5 3 | # for Datapersistance but it is not working 4 | # aiohttp==3.11.13 5 | boto3==1.38.22 6 | pillow==11.2.1 -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/services/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Services package for Foundational LLM Chat application. 3 | Contains service implementations for various functionalities. 4 | """ -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/services/content_service.py: -------------------------------------------------------------------------------- 1 | """ 2 | Service for handling content (images, documents, etc.). 3 | """ 4 | from typing import Dict, Any, List, Tuple, Optional 5 | import os 6 | import logging 7 | 8 | logger = logging.getLogger(__name__) 9 | 10 | class ContentService: 11 | """Service for handling content (images, documents, etc.).""" 12 | 13 | def __init__(self, max_chars: Optional[int] = None, max_size_mb: Optional[float] = None): 14 | """ 15 | Initialize the content service. 16 | 17 | Args: 18 | max_chars: Maximum number of characters allowed. 19 | max_size_mb: Maximum content size in MB. 20 | """ 21 | self.max_chars = max_chars 22 | self.max_size_mb = max_size_mb 23 | 24 | def verify_content(self, text: Optional[str], images: List[Dict[str, Any]], 25 | docs: List[Dict[str, Any]]) -> bool: 26 | """ 27 | Verify that the content is valid. 28 | 29 | Args: 30 | text: The text content. 31 | images: List of images. 32 | docs: List of documents. 33 | 34 | Returns: 35 | True if the content is valid, False otherwise. 36 | """ 37 | # Check if there is any content 38 | if not text and not images and not docs: 39 | return False 40 | 41 | # Check text length if max_chars is set 42 | if text and self.max_chars and len(text) > self.max_chars: 43 | logger.warning(f"Text exceeds maximum length: {len(text)} > {self.max_chars}") 44 | return False 45 | 46 | # Verify images 47 | if not self.verify_image_content(images): 48 | logger.warning("Image content verification failed") 49 | return False 50 | 51 | # Verify documents 52 | if not self.verify_doc_content(docs): 53 | logger.warning("Document content verification failed") 54 | return False 55 | 56 | return True 57 | 58 | def verify_image_content(self, images: List[Dict[str, Any]]) -> bool: 59 | """ 60 | Verify that the image content is valid. 61 | 62 | Args: 63 | images: List of images. 64 | 65 | Returns: 66 | True if the image content is valid, False otherwise. 67 | """ 68 | if len(images) == 0: 69 | return True 70 | 71 | try: 72 | from PIL import Image 73 | except ImportError: 74 | logger.warning("PIL not installed, skipping image verification") 75 | return True 76 | 77 | for image in images: 78 | if not os.path.isfile(image["path"]): 79 | logger.warning(f"Image file not found: {image['path']}") 80 | return False 81 | else: 82 | try: 83 | with Image.open(image["path"]) as img: 84 | img.verify() 85 | if img.format not in ["PNG", "JPEG", "GIF", "WEBP"]: 86 | logger.warning(f"Unsupported image format: {img.format}") 87 | return False 88 | size = os.stat(image["path"]).st_size / (1024 * 1024) 89 | if self.max_size_mb and size > self.max_size_mb: 90 | logger.warning(f"Image exceeds maximum size: {size} MB > {self.max_size_mb} MB") 91 | return False 92 | except Exception as e: 93 | logger.warning(f"Error verifying image: {e}") 94 | return False 95 | return True 96 | 97 | 98 | def verify_doc_content(self, docs: List[Dict[str, Any]]) -> bool: 99 | """ 100 | Verify that the document content is valid. 101 | 102 | Args: 103 | docs: List of documents. 104 | 105 | Returns: 106 | True if the document content is valid, False otherwise. 107 | """ 108 | if len(docs) == 0: 109 | return True 110 | 111 | for doc in docs: 112 | if not os.path.isfile(doc["path"]): 113 | logger.warning(f"Document file not found: {doc['path']}") 114 | return False 115 | else: 116 | try: 117 | size = os.stat(doc["path"]).st_size / (1024 * 1024) 118 | if self.max_size_mb and size > self.max_size_mb: 119 | logger.warning(f"Document exceeds maximum size: {size} MB > {self.max_size_mb} MB") 120 | return False 121 | except Exception as e: 122 | logger.warning(f"Error verifying document: {e}") 123 | return False 124 | return True 125 | 126 | def split_message_contents(self, message: Any, model_id: str) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]], List[Dict[str, Any]]]: 127 | """ 128 | Split message contents into images, documents, and other files. 129 | 130 | Args: 131 | message: The message containing files. 132 | model_id: The model ID to use. 133 | 134 | Returns: 135 | A tuple of (images, documents, other_files). 136 | """ 137 | images = [] 138 | docs = [] 139 | other_files = [] 140 | 141 | # Process files if available 142 | if hasattr(message, "elements") and message.elements: 143 | logger.debug(f"Message has {len(message.elements)} elements") 144 | for element in message.elements: 145 | # Debug element attributes 146 | logger.debug(f"Element attributes: {dir(element)}") 147 | logger.debug(f"Element type: {element.type}") 148 | 149 | # Handle both file and image element types 150 | if element.type == "file" or element.type == "image": 151 | file_path = element.path 152 | file_name = element.name 153 | file_size = os.path.getsize(file_path) 154 | 155 | # Get MIME type, default to inferring from file extension if not available 156 | file_type = getattr(element, "mime", "") 157 | if not file_type: 158 | # Try to infer MIME type from file extension 159 | if file_name.lower().endswith(('.txt')): 160 | file_type = "text/plain" 161 | elif file_name.lower().endswith(('.pdf')): 162 | file_type = "application/pdf" 163 | elif file_name.lower().endswith(('.doc')): 164 | file_type = "application/msword" 165 | elif file_name.lower().endswith(('.docx')): 166 | file_type = "application/vnd.openxmlformats-officedocument.wordprocessingml.document" 167 | elif file_name.lower().endswith(('.xls')): 168 | file_type = "application/vnd.ms-excel" 169 | elif file_name.lower().endswith(('.xlsx')): 170 | file_type = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 171 | elif file_name.lower().endswith(('.csv')): 172 | file_type = "text/csv" 173 | elif file_name.lower().endswith(('.html', '.htm')): 174 | file_type = "text/html" 175 | elif file_name.lower().endswith(('.md')): 176 | file_type = "text/markdown" 177 | elif file_name.lower().endswith(('.jpg', '.jpeg')): 178 | file_type = "image/jpeg" 179 | elif file_name.lower().endswith(('.png')): 180 | file_type = "image/png" 181 | elif file_name.lower().endswith(('.gif')): 182 | file_type = "image/gif" 183 | elif file_name.lower().endswith(('.webp')): 184 | file_type = "image/webp" 185 | 186 | logger.debug(f"Processing file/image: {file_name} ({file_type})") 187 | 188 | # Check if the file is an image 189 | if file_type.startswith("image/") or element.type == "image": 190 | images.append({ 191 | "path": file_path, 192 | "name": file_name, 193 | "type": file_type or "image/png", # Default to PNG if no MIME type 194 | "size": file_size 195 | }) 196 | logger.debug(f"Added image: {file_name}") 197 | # Check if the file is a document 198 | elif file_type in ["application/pdf", "text/plain", "text/html", "text/markdown", 199 | "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 200 | "application/msword", "application/vnd.ms-excel", 201 | "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 202 | "text/csv"] or file_name.lower().endswith(('.txt', '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.csv', '.html', '.htm', '.md')): 203 | docs.append({ 204 | "path": file_path, 205 | "name": file_name, 206 | "type": file_type or "text/plain", # Default to text/plain if no MIME type 207 | "size": file_size 208 | }) 209 | logger.debug(f"Added document: {file_name}") 210 | # Other file types 211 | else: 212 | other_files.append({ 213 | "path": file_path, 214 | "name": file_name, 215 | "type": file_type, 216 | "size": file_size 217 | }) 218 | logger.debug(f"Added other file: {file_name}") 219 | 220 | logger.debug(f"Split message contents: {len(images)} images, {len(docs)} documents, {len(other_files)} other files") 221 | return images, docs, other_files 222 | 223 | def delete_contents(self, contents: List[Dict[str, Any]], force: bool = False) -> None: 224 | """ 225 | Delete content files. 226 | 227 | Args: 228 | contents: List of content items to delete. 229 | force: Force deletion even if the file is not temporary. 230 | """ 231 | for content in contents: 232 | if "path" in content: 233 | path = content["path"] 234 | 235 | # Only delete temporary files unless force is True 236 | if force or path.startswith("/tmp/"): 237 | try: 238 | os.remove(path) 239 | logger.debug(f"Deleted file: {path}") 240 | except Exception as e: 241 | logger.error(f"Error deleting file {path}: {e}") -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/services/thinking_service.py: -------------------------------------------------------------------------------- 1 | """ 2 | Service for handling thinking content. 3 | """ 4 | from typing import Dict, Any, List, Optional 5 | import logging 6 | 7 | logger = logging.getLogger(__name__) 8 | 9 | class ThinkingService: 10 | """Service for handling thinking content.""" 11 | 12 | def __init__(self): 13 | """ 14 | Initialize the thinking service. 15 | """ 16 | self.thinking_text = "" 17 | self.signature = None 18 | self.redacted_data = [] 19 | 20 | def add_thinking(self, text: str) -> None: 21 | """ 22 | Add thinking text. 23 | 24 | Args: 25 | text: The thinking text to add. 26 | """ 27 | self.thinking_text += text 28 | 29 | def set_signature(self, signature: str) -> None: 30 | """ 31 | Set the signature. 32 | 33 | Args: 34 | signature: The signature to set. 35 | """ 36 | self.signature = signature 37 | 38 | def add_redacted(self, data: str) -> None: 39 | """ 40 | Add redacted data. 41 | 42 | Args: 43 | data: The redacted data to add. 44 | """ 45 | self.redacted_data.append(data) 46 | 47 | def has_thinking(self) -> bool: 48 | """ 49 | Check if there is thinking content. 50 | 51 | Returns: 52 | True if there is thinking content, False otherwise. 53 | """ 54 | return bool(self.thinking_text) 55 | 56 | def get_api_blocks(self) -> List[Dict[str, Any]]: 57 | """ 58 | Get thinking blocks formatted for API. 59 | 60 | Returns: 61 | A list of thinking blocks. 62 | """ 63 | blocks = [] 64 | 65 | # Add thinking block if there is thinking content 66 | if self.thinking_text: 67 | thinking_block = { 68 | "reasoningContent": { 69 | "reasoningText": { 70 | "text": self.thinking_text 71 | } 72 | } 73 | } 74 | 75 | # Add signature if available 76 | if self.signature: 77 | thinking_block["reasoningContent"]["reasoningText"]["signature"] = self.signature 78 | 79 | blocks.append(thinking_block) 80 | 81 | # Add redacted blocks if there are any 82 | for data in self.redacted_data: 83 | blocks.append({ 84 | "redactedReasoningContent": { 85 | "data": data 86 | } 87 | }) 88 | 89 | return blocks -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/system_strings.py: -------------------------------------------------------------------------------- 1 | """ 2 | System strings used in the application. 3 | """ 4 | 5 | suported_file_string = "Supported file types: JPEG, PNG, GIF, WEBP, PDF, CSV, XLSX, XLS, DOCX, DOC, TXT, HTML, MD" -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/utils/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Utilities package for Foundational LLM Chat application. 3 | Contains utility functions and helpers. 4 | """ -------------------------------------------------------------------------------- /chainlit_image/foundational-llm-chat_app/utils/message_utils.py: -------------------------------------------------------------------------------- 1 | """ 2 | Utilities for handling messages. 3 | """ 4 | from typing import Dict, Any, List, Optional 5 | import base64 6 | import logging 7 | import re 8 | 9 | logger = logging.getLogger(__name__) 10 | 11 | def create_content(text: Optional[str], images: Optional[List[Dict[str, Any]]], 12 | docs: Optional[List[Dict[str, Any]]]) -> List[Dict[str, Any]]: 13 | """ 14 | Create content for a message. 15 | 16 | Args: 17 | text: The text content. 18 | images: List of images. 19 | docs: List of documents. 20 | 21 | Returns: 22 | A list of content items. 23 | """ 24 | content = [] 25 | 26 | # Add image content if provided 27 | if images: 28 | for image in images: 29 | content.append(image) 30 | 31 | # Add document content if provided 32 | if docs: 33 | for doc in docs: 34 | content.append(doc) 35 | 36 | # Add text content if provided (add last as in original app) 37 | if text: 38 | content.append({"text": text}) 39 | 40 | return content 41 | 42 | def create_image_content(images: List[Dict[str, Any]]) -> List[Dict[str, Any]]: 43 | """ 44 | Create image content for a message. 45 | 46 | Args: 47 | images: List of images. 48 | 49 | Returns: 50 | A list of image content items. 51 | """ 52 | image_content = [] 53 | 54 | for image in images: 55 | try: 56 | logger.debug(f"Processing image: {image['name']} ({image['path']})") 57 | with open(image["path"], "rb") as f: 58 | image_data = f.read() 59 | 60 | # Format the image content according to Bedrock API requirements 61 | # Using the format from the original app 62 | image_content.append({ 63 | "image": { 64 | "format": get_file_extension(image["type"]), 65 | "source": { 66 | "bytes": image_data 67 | } 68 | } 69 | }) 70 | logger.debug(f"Successfully encoded image: {image['name']} ({image['type']})") 71 | except Exception as e: 72 | logger.error(f"Error creating image content for {image['path']}: {e}") 73 | 74 | return image_content 75 | 76 | def get_file_extension(file_type): 77 | """ 78 | Get the file extension from the MIME type. 79 | 80 | Args: 81 | file_type: The MIME type. 82 | 83 | Returns: 84 | The file extension. 85 | """ 86 | if not file_type: 87 | return "" 88 | 89 | file_extension = file_type.split("/")[1] if "/" in file_type else file_type 90 | 91 | # Map MIME types to file extensions 92 | extension_map = { 93 | "jpg": "jpeg", 94 | "jpeg": "jpeg", 95 | "png": "png", 96 | "gif": "gif", 97 | "webp": "webp", 98 | "vnd.ms-excel": "xls", 99 | "vnd.openxmlformats-officedocument.spreadsheetml.sheet": "xlsx", 100 | "vnd.openxmlformats-officedocument.wordprocessingml.document": "docx", 101 | "msword": "doc", 102 | "plain": "txt", 103 | "markdown": "md", 104 | "html": "html", 105 | "pdf": "pdf", 106 | "csv": "csv" 107 | } 108 | 109 | return extension_map.get(file_extension, file_extension) 110 | 111 | def create_doc_content(docs: List[Dict[str, Any]]) -> List[Dict[str, Any]]: 112 | """ 113 | Create document content for a message. 114 | 115 | Args: 116 | docs: List of documents. 117 | 118 | Returns: 119 | A list of document content items. 120 | """ 121 | doc_content = [] 122 | 123 | for doc in docs: 124 | try: 125 | logger.debug(f"Processing document: {doc['name']} ({doc['path']})") 126 | 127 | # Determine document format from file type or extension 128 | doc_format = get_file_extension(doc["type"]) if doc["type"] else "" 129 | if not doc_format: 130 | # Try to infer format from file extension 131 | if doc["name"].lower().endswith('.txt'): 132 | doc_format = "txt" 133 | elif doc["name"].lower().endswith('.pdf'): 134 | doc_format = "pdf" 135 | elif doc["name"].lower().endswith('.doc'): 136 | doc_format = "doc" 137 | elif doc["name"].lower().endswith('.docx'): 138 | doc_format = "docx" 139 | elif doc["name"].lower().endswith('.csv'): 140 | doc_format = "csv" 141 | elif doc["name"].lower().endswith('.xls'): 142 | doc_format = "xls" 143 | elif doc["name"].lower().endswith('.xlsx'): 144 | doc_format = "xlsx" 145 | elif doc["name"].lower().endswith(('.html', '.htm')): 146 | doc_format = "html" 147 | elif doc["name"].lower().endswith('.md'): 148 | doc_format = "md" 149 | else: 150 | doc_format = "txt" # Default to txt if unknown 151 | 152 | logger.debug(f"Document format determined as: {doc_format}") 153 | 154 | # Using the format from the original app 155 | with open(doc["path"], "rb") as f: 156 | doc_data = f.read() 157 | 158 | doc_content.append({ 159 | "document": { 160 | "name": sanitize_filename(doc["name"]), 161 | "format": doc_format, 162 | "source": { 163 | "bytes": doc_data 164 | } 165 | } 166 | }) 167 | logger.debug(f"Successfully encoded document: {doc['name']} ({doc_format})") 168 | 169 | except Exception as e: 170 | logger.error(f"Error creating document content for {doc['path']}: {e}") 171 | 172 | return doc_content 173 | 174 | def sanitize_filename(filename): 175 | """ 176 | Sanitize a filename. 177 | 178 | Args: 179 | filename: The filename to sanitize. 180 | 181 | Returns: 182 | The sanitized filename. 183 | """ 184 | # Remove consecutive whitespace characters 185 | filename = re.sub(r'\s+', ' ', filename) 186 | 187 | # Replace consecutive hyphens with a single hyphen 188 | filename = re.sub(r'-+', '-', filename) 189 | 190 | # Replace any remaining invalid characters with an underscore 191 | filename = re.sub(r'[^a-zA-Z0-9\s\-\(\)\[\]]', '_', filename) 192 | 193 | return filename 194 | 195 | def extract_and_process_prompt(prompt_object: Dict[str, Any]) -> str: 196 | """ 197 | Extract and process a prompt from a prompt object. 198 | 199 | Args: 200 | prompt_object: The prompt object. 201 | 202 | Returns: 203 | The processed prompt text. 204 | """ 205 | from datetime import datetime, timezone 206 | 207 | try: 208 | # Check if the prompt object has variants 209 | if 'variants' in prompt_object and prompt_object['variants']: 210 | variant = prompt_object['variants'][0] 211 | 212 | # Check if the variant has templateConfiguration 213 | if 'templateConfiguration' in variant and 'text' in variant['templateConfiguration']: 214 | # Extract the prompt text 215 | prompt_text = variant['templateConfiguration']['text']['text'] 216 | 217 | # Extract input variables if they exist 218 | if 'inputVariables' in variant['templateConfiguration']['text']: 219 | input_variables = variant['templateConfiguration']['text']['inputVariables'] 220 | 221 | # Get current date and time 222 | now = datetime.now(timezone.utc) 223 | today = now.strftime("%Y-%m-%d") # Current date in YYYY-MM-DD format 224 | utc_time = now.strftime("%Y-%m-%d %H:%M:%S UTC") # Current time in YYYY-MM-DD HH:MM:SS UTC format 225 | 226 | # Process variables 227 | for var in input_variables: 228 | var_name = var['name'] 229 | if var_name == 'TODAY': 230 | prompt_text = prompt_text.replace('{{TODAY}}', today) 231 | elif var_name == 'UTC_TIME': 232 | prompt_text = prompt_text.replace('{{UTC_TIME}}', utc_time) 233 | elif var_name == 'AI': 234 | # For now, we'll leave {{AI}} as is, but you can replace it if needed 235 | pass 236 | else: 237 | # For other variables, use a default message 238 | logger.warning(f"Unsupported variable in prompt: {var_name}") 239 | prompt_text = "Your system prompt is not working correctly due to the presence of variables that are not used. We support: TODAY, UTC_TIME, AI" 240 | 241 | return prompt_text 242 | elif 'content' in variant: 243 | # If there's direct content, use that 244 | return variant['content'] 245 | else: 246 | logger.warning(f"No templateConfiguration or content found in variant") 247 | return "" 248 | else: 249 | logger.warning(f"No variants found in prompt object: {prompt_object.keys()}") 250 | return "" 251 | except Exception as e: 252 | logger.error(f"Error extracting prompt: {e}") 253 | return "" -------------------------------------------------------------------------------- /custom_resources/lambda/cloudFront_get_prefix_list/cloudFront_get_prefix_list.py: -------------------------------------------------------------------------------- 1 | import boto3 2 | import os 3 | from botocore.config import Config 4 | 5 | aws_region = os.environ.get('AWS_REGION') 6 | 7 | my_config = Config( 8 | region_name = aws_region 9 | ) 10 | 11 | client = boto3.client('ec2', config=my_config) 12 | 13 | def on_event(event, context): 14 | print(event) 15 | request_type = event['RequestType'] 16 | if request_type == 'Create': return on_create() 17 | if request_type == 'Update': return on_update() 18 | if request_type == 'Delete': return on_delete() 19 | raise Exception("Invalid request type: %s" % request_type) 20 | 21 | 22 | def on_create(): 23 | prefix_lists = client.describe_managed_prefix_lists( 24 | Filters=[ 25 | { 26 | 'Name': 'prefix-list-name', 27 | 'Values': [ 28 | 'com.amazonaws.global.cloudfront.origin-facing', 29 | ] 30 | }, 31 | ] 32 | ) 33 | data = { 34 | "prefix_lists": prefix_lists["PrefixLists"][0]["PrefixListId"] 35 | } 36 | return { 'Data': data } 37 | 38 | def on_update(): 39 | return on_create() 40 | 41 | def on_delete(): 42 | print("Just delete the ENV variable") 43 | return 44 | 45 | def handler(event, context): 46 | return on_event(event, context) -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | testEnvironment: 'node', 3 | roots: ['/test'], 4 | testMatch: ['**/*.test.ts'], 5 | transform: { 6 | '^.+\\.tsx?$': 'ts-jest' 7 | } 8 | }; 9 | -------------------------------------------------------------------------------- /lib/authentication/index.ts: -------------------------------------------------------------------------------- 1 | import { CfnOutput, Duration, RemovalPolicy } from "aws-cdk-lib"; 2 | import { Construct } from "constructs"; 3 | import * as cognito from "aws-cdk-lib/aws-cognito"; 4 | import * as cloudfront from "aws-cdk-lib/aws-cloudfront"; 5 | import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager"; 6 | import * as ssm from "aws-cdk-lib/aws-ssm"; 7 | 8 | export interface CognitoProps { 9 | readonly cloudFrontDistribution: cloudfront.Distribution; 10 | readonly prefix: string; // Prefix from the configuration 11 | readonly cognito_domain: string | undefined; 12 | } 13 | 14 | export class Cognito extends Construct { 15 | public readonly userPool: cognito.UserPool; 16 | public readonly client: cognito.UserPoolClient; 17 | public readonly cognitoDomainParameter: ssm.StringParameter; 18 | public readonly clientIdParameter: ssm.StringParameter; 19 | public readonly oauth_cognito_client_secret: secretsmanager.Secret; 20 | 21 | constructor(scope: Construct, id: string, props: CognitoProps) { 22 | super(scope, id); 23 | 24 | // Create a new Cognito User Pool 25 | this.userPool = new cognito.UserPool(this, "foundational-llm-chat_user_pool", { 26 | userPoolName: `${props.prefix}foundational-llm-chat-user-pool`, 27 | signInCaseSensitive: false, // Sign-in is not case-sensitive 28 | signInAliases: { 29 | email: true, // Allow sign-in with email 30 | }, 31 | accountRecovery: cognito.AccountRecovery.NONE, // No account recovery mechanism 32 | mfa: cognito.Mfa.REQUIRED, // Multi-Factor Authentication (MFA) is required 33 | mfaSecondFactor: { 34 | sms: false, // SMS-based MFA is not allowed 35 | otp: true, // One-Time Password (OTP) MFA is allowed 36 | }, 37 | featurePlan: cognito.FeaturePlan.PLUS, 38 | standardThreatProtectionMode: cognito.StandardThreatProtectionMode.FULL_FUNCTION, // https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-pool-settings-advanced-security.html 39 | // adds security feature but costs more than plain cognito. 40 | passwordPolicy: { 41 | minLength: 8, // Minimum length of password is 8 characters 42 | requireDigits: true, // Require at least one digit in password 43 | requireLowercase: true, // Require at least one lowercase letter in password 44 | requireSymbols: true, // Require at least one symbol in password 45 | requireUppercase: true, // Require at least one uppercase letter in password 46 | tempPasswordValidity: Duration.days(3), 47 | }, 48 | removalPolicy: RemovalPolicy.DESTROY, // Destroy when the stack is deleted 49 | }); 50 | 51 | // Create a new Cognito User Pool Client for the application 52 | this.client = this.userPool.addClient("FoundationalLlmChatApp", { 53 | oAuth: { 54 | flows: { 55 | authorizationCodeGrant: true, // Enable Authorization Code Grant flow 56 | }, 57 | scopes: [ 58 | cognito.OAuthScope.OPENID, // Include OpenID scope 59 | cognito.OAuthScope.EMAIL, // Include email scope 60 | cognito.OAuthScope.PHONE, // Include phone number scope 61 | cognito.OAuthScope.PROFILE, // Include profile scope 62 | ], 63 | callbackUrls: [`https://${props.cloudFrontDistribution.distributionDomainName}/auth/oauth/aws-cognito/callback`], // Callback URL for OAuth flow 64 | }, 65 | generateSecret: true, // Generate a client secret 66 | userPoolClientName: `${props.prefix}FoundationalLlmChatApp`, // Client name 67 | preventUserExistenceErrors: true, // Prevent user existence errors 68 | }); 69 | 70 | // Store the client secret 71 | this.oauth_cognito_client_secret = new secretsmanager.Secret(this, "CognitoSecret", { 72 | secretName: `${props.prefix}oauth_cognito_client_secret`, 73 | description: "to store env variable of ECS as secrets", 74 | secretStringValue: this.client.userPoolClientSecret 75 | }); 76 | 77 | let cognitoDomainUrl: string; 78 | if (props.cognito_domain === undefined || props.cognito_domain === "") { 79 | // Create a Cognito User Pool Domain 80 | const cognitoDomain = this.userPool.addDomain("CognitoDomain", { 81 | cognitoDomain: { 82 | domainPrefix: `${props.prefix.toLowerCase()}foundational-llm-chat${Math.floor(Math.random() * (10000 - 100) + 100)}`, // Domain prefix for the Cognito domain 83 | }, 84 | }); 85 | cognitoDomainUrl = cognitoDomain.baseUrl().replace("https://", "") 86 | } 87 | else { 88 | cognitoDomainUrl = props.cognito_domain 89 | } 90 | 91 | this.cognitoDomainParameter = new ssm.StringParameter(this, 'CognitoDomainName', { 92 | description: 'Cognito domain name', 93 | parameterName: `${props.prefix.toLowerCase()}CognitoDomainName`, 94 | stringValue: cognitoDomainUrl, // Use the Cognito domain from Cognito (without https://), 95 | tier: ssm.ParameterTier.STANDARD, 96 | }); 97 | 98 | this.clientIdParameter = new ssm.StringParameter(this, 'cognitoClientid', { 99 | description: 'Cognito client id', 100 | parameterName: `${props.prefix.toLowerCase()}cognitoClientid`, 101 | stringValue: this.client.userPoolClientId, 102 | tier: ssm.ParameterTier.STANDARD, 103 | }); 104 | 105 | // Output the User Pool ID as a CloudFormation output 106 | new CfnOutput(this, "UserPoolId", { 107 | value: this.userPool.userPoolId, 108 | description: "User Pool ID", 109 | }); 110 | } 111 | } 112 | 113 | -------------------------------------------------------------------------------- /lib/custom/index.ts: -------------------------------------------------------------------------------- 1 | import { CustomResource } from "aws-cdk-lib"; 2 | import { Construct } from "constructs"; 3 | import * as lambda from "aws-cdk-lib/aws-lambda"; 4 | import * as logs from "aws-cdk-lib/aws-logs"; 5 | import * as customResources from "aws-cdk-lib/custom-resources"; 6 | import { Duration } from "aws-cdk-lib"; 7 | import * as iam from "aws-cdk-lib/aws-iam"; 8 | 9 | // Interface to define the properties required for the CustomResources construct 10 | export interface CustomResourcesProps { 11 | readonly prefix: string, 12 | } 13 | 14 | export class CustomResources extends Construct { 15 | public readonly cloudFrontPrefixList: string; 16 | 17 | constructor(scope: Construct, id: string, props: CustomResourcesProps) { 18 | super(scope, id); 19 | 20 | // Create a Lambda function to get the CloudFront prefix list 21 | const getCloudFrontPrefixList = new lambda.Function(this, 'getCloudFrontPrefixList', { 22 | code: lambda.Code.fromAsset("./custom_resources/lambda/cloudFront_get_prefix_list"), 23 | handler: 'cloudFront_get_prefix_list.handler', 24 | runtime: lambda.Runtime.PYTHON_3_13, 25 | timeout: Duration.seconds(300), 26 | memorySize: 128, 27 | logGroup: new logs.LogGroup(this, `${props.prefix}getCloudFrontPrefixListLogs`, { 28 | retention: logs.RetentionDays.ONE_DAY, 29 | }) 30 | }); 31 | 32 | // Add an IAM policy statement to allow the Lambda function to describe managed prefix lists 33 | getCloudFrontPrefixList.addToRolePolicy(new iam.PolicyStatement({ 34 | actions: [ 35 | "ec2:DescribeManagedPrefixLists" 36 | ], 37 | resources: ["*"] 38 | })); 39 | 40 | // Create a custom resource provider to invoke the Lambda function 41 | const lambdagetCloudFrontPrefixListProvider = new customResources.Provider(this, 'lambdagetCloudFrontPrefixListProvider', { 42 | onEventHandler: getCloudFrontPrefixList, 43 | }); 44 | 45 | // Create a custom resource to get the CloudFront prefix list from the Lambda function 46 | const lambdagetCloudFrontPrefixListResult = new CustomResource(this, 'lambdagetCloudFrontPrefixListResult', { 47 | serviceToken: lambdagetCloudFrontPrefixListProvider.serviceToken, 48 | }); 49 | 50 | // Get the authentication code and CloudFront prefix list from the custom resources 51 | this.cloudFrontPrefixList = lambdagetCloudFrontPrefixListResult.getAttString("prefix_lists") 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /lib/data_layer/index.ts: -------------------------------------------------------------------------------- 1 | import { Construct } from "constructs"; 2 | import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; 3 | import * as s3 from 'aws-cdk-lib/aws-s3'; 4 | import { RemovalPolicy } from 'aws-cdk-lib'; 5 | 6 | export interface DataLayerProps { 7 | readonly prefix: string, // Prefix from the configuration 8 | } 9 | 10 | export class DataLayer extends Construct { 11 | public readonly table: dynamodb.Table; 12 | public readonly bucket: s3.Bucket; 13 | 14 | constructor(scope: Construct, id: string, props: DataLayerProps) { 15 | super(scope, id); 16 | 17 | this.table = new dynamodb.Table(this, 'DynamoDBTableDataLayer', { 18 | tableName: `${props.prefix.toLowerCase()}-ffchat-table`, 19 | partitionKey: { 20 | name: 'PK', 21 | type: dynamodb.AttributeType.STRING 22 | }, 23 | sortKey: { 24 | name: 'SK', 25 | type: dynamodb.AttributeType.STRING 26 | }, 27 | billingMode: dynamodb.BillingMode.PAY_PER_REQUEST, 28 | removalPolicy: RemovalPolicy.DESTROY, 29 | }); 30 | 31 | this.table.addGlobalSecondaryIndex({ 32 | indexName: 'UserThread', 33 | partitionKey: { 34 | name: 'UserThreadPK', 35 | type: dynamodb.AttributeType.STRING, 36 | }, 37 | sortKey: { 38 | name: 'UserThreadSK', 39 | type: dynamodb.AttributeType.STRING, 40 | }, 41 | projectionType: dynamodb.ProjectionType.INCLUDE, 42 | nonKeyAttributes: ['id', 'name'], 43 | }); 44 | 45 | this.bucket = new s3.Bucket(this, 'BucketS3DataLayer', { 46 | bucketName: `${props.prefix.toLowerCase()}-ffchat-bucket-${Math.floor(Math.random() * (10000 - 100) + 100)}`, 47 | removalPolicy: RemovalPolicy.DESTROY, 48 | autoDeleteObjects: true, 49 | enforceSSL: true, // Enforce SSL/TLS for all requests 50 | encryption: s3.BucketEncryption.S3_MANAGED, // Enable server-side encryption 51 | }); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /lib/ecs/index.ts: -------------------------------------------------------------------------------- 1 | import { Duration } from "aws-cdk-lib"; 2 | import { Construct } from "constructs"; 3 | import * as ec2 from "aws-cdk-lib/aws-ec2"; 4 | import * as ecs from "aws-cdk-lib/aws-ecs"; 5 | import * as ecsPatterns from "aws-cdk-lib/aws-ecs-patterns"; 6 | import * as iam from "aws-cdk-lib/aws-iam"; 7 | import { DockerImageAsset } from "aws-cdk-lib/aws-ecr-assets"; 8 | import * as elbv2 from "aws-cdk-lib/aws-elasticloadbalancingv2"; 9 | import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager"; 10 | import * as ssm from "aws-cdk-lib/aws-ssm"; 11 | import * as logs from "aws-cdk-lib/aws-logs"; 12 | import { BedrockModels, BedrockModel } from "../../bin/config"; 13 | import { ModelPrompts } from "../prompts"; 14 | 15 | 16 | // Interface to define the properties required for the ECS Application construct 17 | export interface ecsApplicationProps { 18 | readonly region: string; 19 | readonly vpc: ec2.Vpc; 20 | readonly clientIdParameter: ssm.StringParameter; 21 | readonly cognitoDomainParameter: ssm.StringParameter; 22 | readonly publicLoadBalancer: elbv2.ApplicationLoadBalancer; 23 | readonly oauth_cognito_client_secret: secretsmanager.Secret; 24 | readonly cloudFrontDistributionURLParameter: ssm.StringParameter; 25 | readonly system_prompts_parameter: ssm.StringParameter; 26 | readonly max_characters_parameter: ssm.StringParameter; 27 | readonly max_content_size_mb_parameter: ssm.StringParameter; 28 | readonly bedrock_models_parameter: ssm.StringParameter; 29 | readonly prefix: string; 30 | readonly bedrockModels: BedrockModels; 31 | readonly accountId?: string; 32 | readonly prompts_manager_list: ModelPrompts; 33 | readonly dynamodb_dataLayer_name_parameter: ssm.StringParameter, 34 | readonly s3_dataLayer_name_parameter: ssm.StringParameter, 35 | } 36 | 37 | export class ecsApplication extends Construct { 38 | public readonly service: ecsPatterns.ApplicationLoadBalancedFargateService; 39 | 40 | constructor(scope: Construct, id: string, props: ecsApplicationProps) { 41 | super(scope, id); 42 | 43 | const containerEnvRegion = props.region || "us-west-2"; 44 | 45 | // Store the client secret 46 | const authCodeSecret = new secretsmanager.Secret(this, "authCodeChainlitSecret", { 47 | secretName: `${props.prefix}chainlit_auth_secret`, 48 | description: "Secret nedeed by chainlit", 49 | generateSecretString: { 50 | passwordLength: 64, 51 | }, 52 | }); 53 | 54 | // Create a Docker image asset from the local directory 55 | const image = new DockerImageAsset(this, "chainlit_image", { 56 | directory: "./chainlit_image", 57 | }); 58 | 59 | // Create an ECS cluster 60 | const ecsCluster = new ecs.Cluster(this, "FoundationalLlmChatCluster", { 61 | containerInsightsV2: ecs.ContainerInsights.ENHANCED, 62 | vpc: props.vpc 63 | }); 64 | 65 | // Create a Fargate service and configure it with the Docker image, environment variables, and other settings 66 | this.service = new ecsPatterns.ApplicationLoadBalancedFargateService(this, "FoundationalLlmChatService", { 67 | cluster: ecsCluster, 68 | taskImageOptions: { 69 | image: ecs.ContainerImage.fromDockerImageAsset(image), 70 | containerPort: 8080, 71 | logDriver: ecs.LogDrivers.awsLogs({ 72 | streamPrefix: `${props.prefix}FoundationalLlmChatServiceECSLogs`, 73 | logRetention: logs.RetentionDays.FIVE_DAYS 74 | }), 75 | environment: { 76 | AWS_REGION: containerEnvRegion, 77 | }, 78 | secrets: { 79 | OAUTH_COGNITO_CLIENT_SECRET: ecs.Secret.fromSecretsManager(props.oauth_cognito_client_secret), 80 | CHAINLIT_AUTH_SECRET: ecs.Secret.fromSecretsManager(authCodeSecret), 81 | OAUTH_COGNITO_DOMAIN: ecs.Secret.fromSsmParameter(props.cognitoDomainParameter), 82 | OAUTH_COGNITO_CLIENT_ID: ecs.Secret.fromSsmParameter(props.clientIdParameter), 83 | CHAINLIT_URL: ecs.Secret.fromSsmParameter(props.cloudFrontDistributionURLParameter), 84 | SYSTEM_PROMPT_LIST: ecs.Secret.fromSsmParameter(props.system_prompts_parameter), 85 | MAX_CHARACTERS: ecs.Secret.fromSsmParameter(props.max_characters_parameter), 86 | MAX_CONTENT_SIZE_MB: ecs.Secret.fromSsmParameter(props.max_content_size_mb_parameter), 87 | BEDROCK_MODELS: ecs.Secret.fromSsmParameter(props.bedrock_models_parameter), 88 | DYNAMODB_DATA_LAYER_NAME: ecs.Secret.fromSsmParameter(props.dynamodb_dataLayer_name_parameter), 89 | S3_DATA_LAYER_NAME: ecs.Secret.fromSsmParameter(props.s3_dataLayer_name_parameter), 90 | }, 91 | }, 92 | taskSubnets: { subnets: props.vpc.privateSubnets }, 93 | loadBalancer: props.publicLoadBalancer, 94 | openListener: false, 95 | memoryLimitMiB: 1024, 96 | cpu: 512, 97 | desiredCount: 2, 98 | minHealthyPercent: 50, 99 | runtimePlatform: { 100 | operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, 101 | cpuArchitecture: ecs.CpuArchitecture.X86_64, 102 | }, 103 | capacityProviderStrategies: [ 104 | { 105 | capacityProvider: "FARGATE", // all container with fargate spot is not advided for production, use FARGATE instead or a mix with FARGATE_SPOT 106 | base: 1, 107 | weight: 1, 108 | }, 109 | ], 110 | }); 111 | 112 | const generateArns = (model: BedrockModel, defaultRegion: string, accountId: string) => { 113 | const arns: string[] = []; 114 | 115 | // Handle region list 116 | if (Array.isArray(model.region)) { 117 | model.region.forEach(region => { 118 | const modelId = model.inference_profile ? model.id.replace(`${model.inference_profile.prefix}.`, '') : model.id; 119 | arns.push(`arn:aws:bedrock:${region}::foundation-model/${modelId}`); 120 | }); 121 | } else { 122 | // If no region list, use the default region 123 | arns.push(`arn:aws:bedrock:${defaultRegion}::foundation-model/${model.id}`); 124 | } 125 | 126 | // Handle inference_profile 127 | if (model.inference_profile) { 128 | arns.push(`arn:aws:bedrock:${model.inference_profile.region}:${accountId}:inference-profile/${model.id}`); 129 | } 130 | 131 | return arns; 132 | }; 133 | 134 | // Generate the resource ARNs 135 | const resourceArns = Object.values(props.bedrockModels).flatMap(model => 136 | generateArns(model, containerEnvRegion, props.accountId || "*") 137 | ); 138 | 139 | // Allow the ECS task to call the Bedrock API 140 | this.service.taskDefinition.taskRole.addToPrincipalPolicy( 141 | new iam.PolicyStatement({ 142 | effect: iam.Effect.ALLOW, 143 | resources: resourceArns, 144 | actions: ["bedrock:InvokeModel", "bedrock:InvokeModelWithResponseStream"], 145 | }) 146 | ); 147 | 148 | // Generate ARNs for the prompts 149 | const promptArns = Object.values(props.prompts_manager_list).map(prompt => 150 | `${prompt.arn}` 151 | ); 152 | 153 | // Allow the ECS task to get the prompts 154 | this.service.taskDefinition.taskRole.addToPrincipalPolicy( 155 | new iam.PolicyStatement({ 156 | effect: iam.Effect.ALLOW, 157 | resources: promptArns, 158 | actions: ["bedrock:GetPrompt"], 159 | }) 160 | ); 161 | 162 | // Allow the ECS task to write and get from S3 table and Dynamo 163 | this.service.taskDefinition.taskRole.addToPrincipalPolicy( 164 | new iam.PolicyStatement({ 165 | effect: iam.Effect.ALLOW, 166 | resources: [ 167 | `arn:aws:s3:::${props.s3_dataLayer_name_parameter.stringValue}`, 168 | `arn:aws:s3:::${props.s3_dataLayer_name_parameter.stringValue}/*`, 169 | `arn:aws:dynamodb:${props.region}:${props.accountId}:table/${props.dynamodb_dataLayer_name_parameter.stringValue}`, 170 | `arn:aws:dynamodb:${props.region}:${props.accountId}:table/${props.dynamodb_dataLayer_name_parameter.stringValue}/*` 171 | ], 172 | actions: [ 173 | "s3:PutObject", 174 | "s3:GetObject", 175 | "s3:ListBucket", 176 | "dynamodb:PutItem", 177 | "dynamodb:GetItem", 178 | "dynamodb:Query", 179 | "dynamodb:Scan", 180 | "dynamodb:UpdateItem", 181 | "dynamodb:DeleteItem" 182 | ] 183 | }) 184 | ); 185 | 186 | // Enable sticky sessions for the Fargate service 187 | this.service.targetGroup.enableCookieStickiness(Duration.days(1)); 188 | } 189 | } 190 | -------------------------------------------------------------------------------- /lib/foundational-llm-chat-stack.ts: -------------------------------------------------------------------------------- 1 | import { SystemConfig } from "../bin/config"; 2 | import { Stack, StackProps } from "aws-cdk-lib"; 3 | import { Construct } from "constructs"; 4 | import { Networking } from "./network"; 5 | import { ecsApplication } from "./ecs"; 6 | import { Cognito } from "./authentication"; 7 | import { CustomResources } from "./custom"; 8 | import { Parameters } from "./parameters"; 9 | import { Prompts } from "./prompts"; 10 | import { DataLayer } from "./data_layer"; 11 | 12 | // Interface to define the properties for the FoundationalLlmChatStack 13 | export interface FoundationalLlmChatStackProps extends StackProps { 14 | readonly config: SystemConfig; 15 | } 16 | 17 | export class FoundationalLlmChatStack extends Stack { 18 | constructor(scope: Construct, id: string, props: FoundationalLlmChatStackProps) { 19 | super(scope, id, props); 20 | 21 | const prompts = new Prompts(this, "Prompts", { 22 | bedrock_models: props.config.bedrock_models, 23 | default_system_prompt: props.config.default_system_prompt, 24 | prefix: props.config.prefix 25 | }); 26 | 27 | const dataLayer = new DataLayer(this, "DataLayer", { 28 | prefix: props.config.prefix 29 | }); 30 | 31 | // load Parameters from config file 32 | const parameters = new Parameters(this, "Parameters", { 33 | prefix: props.config.prefix, // Prefix from the configuration 34 | prompts_manager_list: prompts.promptsIdList, 35 | max_characters_parameter: props.config.max_characters_parameter, 36 | max_content_size_mb_parameter: props.config.max_content_size_mb_parameter, 37 | bedrock_models_parameter: props.config.bedrock_models, 38 | dynamodb_dataLayer_name_parameter: dataLayer.table.tableName, 39 | s3_dataLayer_name_parameter: dataLayer.bucket.bucketName 40 | }); 41 | 42 | // Create an instance of the CustomResources construct 43 | const customResources = new CustomResources(this, "CustomResources", { 44 | prefix: props.config.prefix, // Prefix from the configuration 45 | }); 46 | 47 | // Create an instance of the Networking construct 48 | const networking = new Networking(this, "Networking", { 49 | cloudFrontPrefixList: customResources.cloudFrontPrefixList, // Use the CloudFront prefix list from CustomResources 50 | prefix: props.config.prefix, // Prefix from the configuration 51 | }); 52 | 53 | // Create an instance of the Cognito construct 54 | const cognito = new Cognito(this, "Cognito", { 55 | cognito_domain: props.config.cognito_domain, 56 | cloudFrontDistribution: networking.cloudFrontDistribution, // Use the CloudFront distribution from Networking 57 | prefix: props.config.prefix, // Prefix from the configuration 58 | }); 59 | 60 | // Create an instance of the ecsApplication construct 61 | new ecsApplication(this, "ecsApplication", { 62 | region: props.config.default_aws_region, 63 | prompts_manager_list: prompts.promptsIdList, // list of prompt for getting the version arns 64 | vpc: networking.vpc, // Use the VPC from Networking 65 | clientIdParameter: cognito.clientIdParameter, // Use the client ID from Cognito 66 | cognitoDomainParameter: cognito.cognitoDomainParameter, 67 | publicLoadBalancer: networking.publicLoadBalancer, // Use the public load balancer from Networking 68 | cloudFrontDistributionURLParameter: networking.cloudFrontDistributionURLParameter, // Use the CloudFront distribution from Networking 69 | oauth_cognito_client_secret: cognito.oauth_cognito_client_secret, // Use the secrets from SecretsManager 70 | system_prompts_parameter: parameters.system_prompts_parameter, // System prompt from the configuration 71 | max_characters_parameter: parameters.max_characters_parameter, // Max number of char from the configuration 72 | max_content_size_mb_parameter: parameters.max_content_size_mb_parameter, // Max content size from the configuration 73 | bedrock_models_parameter: parameters.bedrock_models_parameter, // Models configuration from the configuration 74 | prefix: props.config.prefix, // Prefix from the configuration 75 | bedrockModels: props.config.bedrock_models, //models configured 76 | dynamodb_dataLayer_name_parameter: parameters.dynamodb_dataLayer_name_parameter, 77 | s3_dataLayer_name_parameter: parameters.s3_dataLayer_name_parameter, 78 | accountId: props.env?.account 79 | }); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /lib/network/index.ts: -------------------------------------------------------------------------------- 1 | import { Duration, CfnOutput } from "aws-cdk-lib"; 2 | import { Construct } from "constructs"; 3 | import * as ec2 from "aws-cdk-lib/aws-ec2"; 4 | import * as elbv2 from "aws-cdk-lib/aws-elasticloadbalancingv2"; 5 | import * as cloudfront from "aws-cdk-lib/aws-cloudfront"; 6 | import * as origins from "aws-cdk-lib/aws-cloudfront-origins"; 7 | import * as s3 from "aws-cdk-lib/aws-s3"; 8 | import { RemovalPolicy } from 'aws-cdk-lib'; 9 | import * as ssm from "aws-cdk-lib/aws-ssm"; 10 | 11 | // Interface to define the properties required for the Networking construct 12 | export interface NetworkingProps { 13 | readonly cloudFrontPrefixList: string; 14 | readonly prefix: string, // Prefix from the configuration 15 | } 16 | 17 | export class Networking extends Construct { 18 | public readonly vpc: ec2.Vpc; 19 | public readonly publicLoadBalancer: elbv2.ApplicationLoadBalancer; 20 | public readonly cloudFrontDistribution: cloudfront.Distribution; 21 | public readonly cloudFrontDistributionURLParameter: ssm.StringParameter; 22 | 23 | constructor(scope: Construct, id: string, props: NetworkingProps) { 24 | super(scope, id); 25 | 26 | // Create a new VPC with public, private with egress, and private isolated subnets 27 | this.vpc = new ec2.Vpc(this, "foundationalLlmChat-vpc", { 28 | vpcName: `${props.prefix}foundationalLlmChat-vpc`, 29 | maxAzs: 2, 30 | subnetConfiguration: [ 31 | { 32 | name: "public-subnet", 33 | subnetType: ec2.SubnetType.PUBLIC, 34 | cidrMask: 24, 35 | }, 36 | { 37 | name: "private-subnet-ecs", 38 | subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS, 39 | cidrMask: 24, 40 | }, 41 | { 42 | name: "isolated-subnet-rds", 43 | subnetType: ec2.SubnetType.PRIVATE_ISOLATED, 44 | cidrMask: 24, 45 | }, 46 | ], 47 | natGateways: 1, 48 | }); 49 | 50 | // create a flow log to be associated with VPC and that sends logs in Cloudwatch 51 | // this is a best practice but not strictly required 52 | this.vpc.addFlowLog('FlowLogCloudWatchfoundationalLlmChatVpc', { 53 | destination: ec2.FlowLogDestination.toCloudWatchLogs(), 54 | }); 55 | 56 | // Create a security group for the application 57 | const foundationalLlmChatAppSecurityGroup = new ec2.SecurityGroup(this, "foundationalLlmChatAppSecurityGroup", { 58 | vpc: this.vpc, 59 | description: "foundationalLlmChat is internet exposed", 60 | allowAllOutbound: true, 61 | }); 62 | 63 | // Add an ingress rule to allow access to the container from CloudFront 64 | foundationalLlmChatAppSecurityGroup.addIngressRule( 65 | ec2.Peer.prefixList(props.cloudFrontPrefixList), 66 | ec2.Port.tcp(80), 67 | "allow 80 access from cloudfront" 68 | ); 69 | 70 | // create a bucket for enabling load balancer and distribution logs logs 71 | const logBucket = new s3.Bucket(this, 'foundationalLlmChatLogsBucket', { 72 | blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL, 73 | encryption: s3.BucketEncryption.S3_MANAGED, 74 | enforceSSL: true, 75 | versioned: false, 76 | removalPolicy: RemovalPolicy.DESTROY, 77 | autoDeleteObjects: true, 78 | serverAccessLogsPrefix: "bucket-access-logs", 79 | objectOwnership: s3.ObjectOwnership.OBJECT_WRITER 80 | }); 81 | 82 | // Create a public Application Load Balancer 83 | this.publicLoadBalancer = new elbv2.ApplicationLoadBalancer(this, "foundationalLlmChatPublicLoadBalancer", { 84 | vpc: this.vpc, 85 | internetFacing: true, 86 | vpcSubnets: { subnets: this.vpc.publicSubnets }, 87 | securityGroup: foundationalLlmChatAppSecurityGroup 88 | }); 89 | // enabling logs 90 | this.publicLoadBalancer.logAccessLogs(logBucket, "ApplicationLoadBalancerLogs"); 91 | 92 | // Create a sticky cache policy for CloudFront for the public load balancer (AWSALB*) with a minimum TTL of 1 second. 93 | // This will ensure that the same user always gets the same response. This is useful for implementing sticky sessions. 94 | const stickyCachePolicy = new cloudfront.CachePolicy(this, "stickyCachePolicy", { 95 | cookieBehavior: cloudfront.CacheCookieBehavior.allowList("AWSALB*"), 96 | enableAcceptEncodingGzip: true, 97 | enableAcceptEncodingBrotli: true, 98 | minTtl: Duration.seconds(1), 99 | }); 100 | 101 | // Create a CloudFront distribution 102 | // This will serve the public load balancer as the origin for the CloudFront distribution. 103 | // The cache policy is set to the sticky cache policy created above. 104 | // The origin request policy is set to "ALL_VIEWER_EXCEPT_HOST_HEADER" to ensure that the host header is not sent to the origin. 105 | // The allowed methods are set to "ALLOW_ALL" to allow all HTTP methods. 106 | // The viewer protocol policy is set to "REDIRECT_TO_HTTPS" to redirect all HTTP requests to HTTPS. 107 | this.cloudFrontDistribution = new cloudfront.Distribution(this, 'foundationalLlmChat_distribution', { 108 | defaultBehavior: { 109 | origin: new origins.LoadBalancerV2Origin(this.publicLoadBalancer, { protocolPolicy: cloudfront.OriginProtocolPolicy.HTTP_ONLY }), 110 | cachePolicy: stickyCachePolicy, 111 | originRequestPolicy: cloudfront.OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER, 112 | allowedMethods: cloudfront.AllowedMethods.ALLOW_ALL, 113 | viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, 114 | }, 115 | enableLogging: true, 116 | logBucket: logBucket, 117 | logFilePrefix: "CloudFrontLogs", 118 | }); 119 | // Explicit dependency prevents DELETE_FAILED from CloudFront still writing logs while S3 120 | // bucket is trying to empty and delete: 121 | this.cloudFrontDistribution.node.addDependency(logBucket); 122 | 123 | const ddname = `https://${this.cloudFrontDistribution.distributionDomainName}` 124 | this.cloudFrontDistributionURLParameter = new ssm.StringParameter(this, 'cf_distribution_url', { 125 | description: 'Cloudfront Distribution URL', 126 | parameterName: `${props.prefix}CloudfrontDistributionURL`, 127 | stringValue: ddname, 128 | tier: ssm.ParameterTier.STANDARD, 129 | }); 130 | 131 | 132 | // Create a CloudFormation output with the CloudFront distribution domain name 133 | new CfnOutput(this, 'FoundationalLlmChatDNS', { 134 | value: `https://${this.cloudFrontDistribution.distributionDomainName}`, 135 | description: 'DNS name of the your distribution, use it to access to your application', 136 | }); 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /lib/parameters/index.ts: -------------------------------------------------------------------------------- 1 | import { Construct } from "constructs"; 2 | import * as ssm from "aws-cdk-lib/aws-ssm"; 3 | import { BedrockModels } from "../../bin/config"; 4 | import { ModelPrompts } from "../prompts"; 5 | 6 | export interface ParametersProps { 7 | readonly max_characters_parameter: string; 8 | readonly max_content_size_mb_parameter: string; 9 | readonly bedrock_models_parameter: BedrockModels; 10 | readonly prefix: string; 11 | readonly prompts_manager_list: ModelPrompts; 12 | readonly dynamodb_dataLayer_name_parameter: string; 13 | readonly s3_dataLayer_name_parameter: string; 14 | } 15 | 16 | export class Parameters extends Construct { 17 | public readonly system_prompts_parameter: ssm.StringParameter; 18 | public readonly max_characters_parameter: ssm.StringParameter; 19 | public readonly max_content_size_mb_parameter: ssm.StringParameter; 20 | public readonly bedrock_models_parameter: ssm.StringParameter; 21 | public readonly dynamodb_dataLayer_name_parameter: ssm.StringParameter; 22 | public readonly s3_dataLayer_name_parameter: ssm.StringParameter; 23 | 24 | constructor(scope: Construct, id: string, props: ParametersProps) { 25 | super(scope, id); 26 | 27 | this.system_prompts_parameter = new ssm.StringParameter(this, "SystemPromptsParameter", { 28 | parameterName: `${props.prefix}system_prompts`, 29 | description: "JSON list of system prompts for each model", 30 | stringValue: JSON.stringify(props.prompts_manager_list), 31 | tier: ssm.ParameterTier.STANDARD, 32 | }); 33 | 34 | this.max_characters_parameter = new ssm.StringParameter(this, "MaxCharactersParameter", { 35 | parameterName: `${props.prefix}max_characters_parameter`, 36 | description: "maximum number of characters per user prompt", 37 | stringValue: props.max_characters_parameter, 38 | tier: ssm.ParameterTier.STANDARD, 39 | }); 40 | 41 | this.max_content_size_mb_parameter = new ssm.StringParameter(this, "MaxContentSizeMbParameter", { 42 | parameterName: `${props.prefix}max_content_size_mb_parameter`, 43 | description: "maximum dimension for content attached in chat in MB", 44 | stringValue: props.max_content_size_mb_parameter, 45 | tier: ssm.ParameterTier.STANDARD, 46 | }); 47 | 48 | this.dynamodb_dataLayer_name_parameter = new ssm.StringParameter(this, "DynamoDBDataLayerNameParameter", { 49 | parameterName: `${props.prefix}dynamodb_dataLayer_name_parameter`, 50 | description: "DynamoDB table name for data layer", 51 | stringValue: props.dynamodb_dataLayer_name_parameter, 52 | tier: ssm.ParameterTier.STANDARD, 53 | }); 54 | 55 | this.s3_dataLayer_name_parameter = new ssm.StringParameter(this, "S3DataLayerNameParameter", { 56 | parameterName: `${props.prefix}s3_dataLayer_name_parameter`, 57 | description: "S3 bucket name for data layer", 58 | stringValue: props.s3_dataLayer_name_parameter, 59 | tier: ssm.ParameterTier.STANDARD, 60 | }); 61 | 62 | // Remove system_prompt field from bedrock_models_parameter 63 | const bedrock_models_without_system_prompts = Object.entries(props.bedrock_models_parameter).reduce((acc, [key, value]) => { 64 | const { system_prompt, inference_profile, region, ...rest } = value; 65 | acc[key] = rest; 66 | return acc; 67 | }, {} as BedrockModels); 68 | 69 | this.bedrock_models_parameter = new ssm.StringParameter(this, "BedrockModelsParameter", { 70 | parameterName: `${props.prefix}bedrock_models_parameter`, 71 | description: "available models with prices (excluding system prompts)", 72 | stringValue: JSON.stringify(bedrock_models_without_system_prompts), 73 | tier: ssm.ParameterTier.INTELLIGENT_TIERING, 74 | }); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /lib/prompts/index.ts: -------------------------------------------------------------------------------- 1 | import { CfnOutput, CfnResource } from "aws-cdk-lib"; 2 | import { Construct } from "constructs"; 3 | import { BedrockModels } from "../../bin/config"; 4 | 5 | export interface PromptsProps { 6 | readonly bedrock_models: BedrockModels; 7 | readonly default_system_prompt: string; 8 | readonly prefix: string; 9 | } 10 | 11 | export interface Prompt { 12 | id: string; 13 | version: string; 14 | arn: string; 15 | } 16 | 17 | export interface ModelPrompts { 18 | [key: string]: Prompt; 19 | } 20 | 21 | export class Prompts extends Construct { 22 | public readonly promptsIdList: ModelPrompts = {}; 23 | 24 | constructor(scope: Construct, id: string, props: PromptsProps) { 25 | super(scope, id); 26 | 27 | Object.entries(props.bedrock_models).forEach(([modelName, modelConfig], index) => { 28 | const sanitizedModelName = this.sanitizeModelName(modelName); 29 | const promptText = modelConfig.system_prompt || props.default_system_prompt; 30 | const inputVariables = this.extractInputVariables(promptText); 31 | 32 | const prompt = new CfnResource(this, `${props.prefix}Prompt-${sanitizedModelName}-${index}`, { 33 | type: 'AWS::Bedrock::Prompt', 34 | properties: { 35 | Name: `${props.prefix}${sanitizedModelName}Prompt${index}`, 36 | Variants: [ 37 | { 38 | InferenceConfiguration: { "Text": {} }, 39 | Name: `${sanitizedModelName}Variant${index}`, 40 | TemplateType: "TEXT", 41 | TemplateConfiguration: { 42 | Text: { 43 | Text: promptText, 44 | InputVariables: inputVariables 45 | } 46 | } 47 | } 48 | ] 49 | } 50 | }); 51 | 52 | const promptVersion = new CfnResource(this, `${props.prefix}PVersion-${sanitizedModelName}-${index}`, { 53 | type: 'AWS::Bedrock::PromptVersion', 54 | properties: { 55 | Description: `Prompt version for ${modelName}`, 56 | PromptArn: prompt.getAtt('Arn').toString(), 57 | } 58 | }); 59 | 60 | const arn = promptVersion.getAtt('Arn').toString(); 61 | const promptId = promptVersion.getAtt('PromptId').toString(); 62 | const version = promptVersion.getAtt('Version').toString(); 63 | 64 | this.promptsIdList[modelName] = { 65 | id: promptId, 66 | version: version, 67 | arn: arn 68 | }; 69 | }); 70 | } 71 | 72 | private extractInputVariables(promptText: string): { Name: string }[] { 73 | const regex = /{{(\w+)}}/g; 74 | const matches = promptText.match(regex) || []; 75 | return matches.map(match => ({ 76 | Name: match.replace(/{{|}}/g, '') 77 | })); 78 | } 79 | 80 | private sanitizeModelName(modelName: string): string { 81 | // Remove any characters that are not alphanumeric, underscore, or hyphen 82 | let sanitized = modelName.replace(/[^a-zA-Z0-9_-]/g, ''); 83 | 84 | // Ensure it starts with an alphanumeric character 85 | sanitized = sanitized.replace(/^[^a-zA-Z0-9]+/, ''); 86 | 87 | // Truncate to 100 characters if longer 88 | sanitized = sanitized.slice(0, 100); 89 | 90 | // If empty after sanitization, use a default name 91 | if (sanitized.length === 0) { 92 | sanitized = 'DefaultModelName'; 93 | } 94 | 95 | return sanitized; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "foundational-llm-chat.ts", 3 | "version": "0.1.0", 4 | "bin": { 5 | "foundational-llm-chat.ts": "bin/foundational-llm-chat.ts.js" 6 | }, 7 | "scripts": { 8 | "build": "tsc", 9 | "watch": "tsc -w", 10 | "test": "jest", 11 | "cdk": "cdk" 12 | }, 13 | "devDependencies": { 14 | "@types/jest": "^29.5.11", 15 | "@types/node": "^20.11.13", 16 | "aws-cdk": "^2.183.0", 17 | "generate-license-file": "^3.0.1", 18 | "jest": "^29.7.0", 19 | "ts-jest": "^29.1.2", 20 | "ts-node": "^10.9.2", 21 | "typescript": "~5.3.3" 22 | }, 23 | "dependencies": { 24 | "aws-cdk-lib": "^2.189.1", 25 | "constructs": "^10.0.0", 26 | "source-map-support": "^0.5.21" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "commonjs", 5 | "lib": [ 6 | "es2020", 7 | "dom" 8 | ], 9 | "declaration": true, 10 | "strict": true, 11 | "noImplicitAny": true, 12 | "strictNullChecks": true, 13 | "noImplicitThis": true, 14 | "alwaysStrict": true, 15 | "noUnusedLocals": false, 16 | "noUnusedParameters": false, 17 | "noImplicitReturns": true, 18 | "noFallthroughCasesInSwitch": false, 19 | "inlineSourceMap": true, 20 | "inlineSources": true, 21 | "experimentalDecorators": true, 22 | "strictPropertyInitialization": false, 23 | "typeRoots": [ 24 | "./node_modules/@types" 25 | ] 26 | }, 27 | "exclude": [ 28 | "node_modules", 29 | "cdk.out" 30 | ] 31 | } 32 | --------------------------------------------------------------------------------