├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md └── workflows │ ├── auto-label.yml │ ├── auto-translate.yml │ ├── backend.yml │ ├── cdk.yml │ ├── deploy-redoc.yml │ ├── frontend.yml │ ├── issue-closure.yml │ └── update-contributor-highlights.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── backend ├── .gitignore ├── Dockerfile ├── README.md ├── app │ ├── __init__.py │ ├── agents │ │ ├── tools │ │ │ ├── agent_tool.py │ │ │ ├── bedrock_agent.py │ │ │ ├── internet_search.py │ │ │ └── knowledge.py │ │ └── utils.py │ ├── auth.py │ ├── bedrock.py │ ├── bot_remove.py │ ├── config.py │ ├── dependencies.py │ ├── main.py │ ├── prompt.py │ ├── repositories │ │ ├── api_publication.py │ │ ├── bot_store.py │ │ ├── common.py │ │ ├── conversation.py │ │ ├── conversation_search.py │ │ ├── custom_bot.py │ │ ├── models │ │ │ ├── api_publication.py │ │ │ ├── common.py │ │ │ ├── conversation.py │ │ │ ├── conversation_search.py │ │ │ ├── custom_bot.py │ │ │ ├── custom_bot_guardrails.py │ │ │ ├── custom_bot_kb.py │ │ │ └── usage_analysis.py │ │ ├── usage_analysis.py │ │ └── user.py │ ├── routes │ │ ├── admin.py │ │ ├── api_publication.py │ │ ├── bot.py │ │ ├── bot_store.py │ │ ├── conversation.py │ │ ├── published_api.py │ │ ├── schemas │ │ │ ├── admin.py │ │ │ ├── api_publication.py │ │ │ ├── base.py │ │ │ ├── bot.py │ │ │ ├── bot_guardrails.py │ │ │ ├── bot_kb.py │ │ │ ├── conversation.py │ │ │ └── published_api.py │ │ └── user.py │ ├── sqs_consumer.py │ ├── stream.py │ ├── usecases │ │ ├── bot.py │ │ ├── bot_store.py │ │ ├── chat.py │ │ ├── publication.py │ │ └── user.py │ ├── user.py │ ├── utils.py │ ├── vector_search.py │ └── websocket.py ├── auth │ ├── add_user_to_groups │ │ ├── add_user_to_groups.py │ │ └── requirements.txt │ └── check_email_domain │ │ └── check_email_domain.py ├── embedding_statemachine │ ├── bedrock_knowledge_base │ │ ├── fetch_stack_output.py │ │ ├── store_knowledge_base_id.py │ │ └── update_bot_status.py │ └── guardrails │ │ └── store_guardrail_arn.py ├── lambda.Dockerfile ├── mypy.ini ├── poetry.lock ├── poetry.toml ├── pyproject.toml ├── run.sh ├── s3_exporter │ ├── index.py │ └── requirements.txt └── tests │ ├── __init__.py │ ├── test_agent │ └── test_tools │ │ ├── test_agent_tool.py │ │ ├── test_internet_search.py │ │ └── test_knowledge.py │ ├── test_bedrock.py │ ├── test_repositories │ ├── test_api_publication.py │ ├── test_bot_store.py │ ├── test_conversation.py │ ├── test_custom_bot.py │ ├── test_models │ │ ├── test_bot.py │ │ └── test_firecrawl_config.py │ ├── test_usage_analysis.py │ ├── test_user.py │ └── utils │ │ └── bot_factory.py │ ├── test_routes │ └── test_schemas │ │ ├── api_publication.py │ │ └── test_conversation.py │ ├── test_stream │ ├── get_aws_logo.py │ ├── get_pdf.py │ └── test_stream.py │ ├── test_usecases │ ├── test_bot.py │ ├── test_chat.py │ └── utils │ │ └── user_factory.py │ └── test_utils │ └── test_utils.py ├── bin.sh ├── cdk ├── .gitignore ├── .npmignore ├── .prettierrc ├── README.md ├── bin │ ├── api-publish.ts │ ├── bedrock-chat.ts │ └── bedrock-custom-bot.ts ├── cdk.json ├── custom-resources │ └── cognito-trigger │ │ └── index.py ├── jest.config.js ├── lib │ ├── api-publishment-stack.ts │ ├── bedrock-chat-stack.ts │ ├── bedrock-custom-bot-stack.ts │ ├── bedrock-region-resources.ts │ ├── constants │ │ └── docker.ts │ ├── constructs │ │ ├── api-publish-codebuild.ts │ │ ├── api.ts │ │ ├── auth.ts │ │ ├── bedrock-custom-bot-codebuild.ts │ │ ├── bot-store.ts │ │ ├── database.ts │ │ ├── embedding.ts │ │ ├── frontend.ts │ │ ├── usage-analysis.ts │ │ ├── webacl-for-published-api.ts │ │ └── websocket.ts │ ├── frontend-waf-stack.ts │ └── utils │ │ ├── bedrock-guardrails.ts │ │ ├── bedrock-knowledge-base-args.ts │ │ ├── generate-physical-name.ts │ │ ├── identity-provider.ts │ │ └── parameter-models.ts ├── package-lock.json ├── package.json ├── parameter.ts ├── rules │ └── log-retention-checker.ts ├── test │ ├── cdk.test.ts │ └── utils │ │ ├── generate-physical-name.test.ts │ │ └── parameter-models.test.ts └── tsconfig.json ├── deploy.yml ├── docs ├── ADMINISTRATOR.md ├── ADMINISTRATOR_de-DE.md ├── ADMINISTRATOR_de-DE_ja-JP.md ├── ADMINISTRATOR_es-ES.md ├── ADMINISTRATOR_es-ES_ja-JP.md ├── ADMINISTRATOR_fr-FR.md ├── ADMINISTRATOR_fr-FR_ja-JP.md ├── ADMINISTRATOR_it-IT.md ├── ADMINISTRATOR_it-IT_ja-JP.md ├── ADMINISTRATOR_ja-JP.md ├── ADMINISTRATOR_ko-KR.md ├── ADMINISTRATOR_ko-KR_ja-JP.md ├── ADMINISTRATOR_ms-MY.md ├── ADMINISTRATOR_ms-MY_ja-JP.md ├── ADMINISTRATOR_nb-NO.md ├── ADMINISTRATOR_nb-NO_ja-JP.md ├── ADMINISTRATOR_pl-PL.md ├── ADMINISTRATOR_pl-PL_ja-JP.md ├── ADMINISTRATOR_pt-BR.md ├── ADMINISTRATOR_th-TH.md ├── ADMINISTRATOR_th-TH_ja-JP.md ├── ADMINISTRATOR_vi-VN.md ├── ADMINISTRATOR_vi-VN_ja-JP.md ├── ADMINISTRATOR_zh-CN.md ├── ADMINISTRATOR_zh-CN_ja-JP.md ├── ADMINISTRATOR_zh-TW.md ├── ADMINISTRATOR_zh-TW_ja-JP.md ├── AGENT.md ├── AGENT_de-DE.md ├── AGENT_de-DE_ja-JP.md ├── AGENT_es-ES.md ├── AGENT_es-ES_ja-JP.md ├── AGENT_fr-FR.md ├── AGENT_fr-FR_ja-JP.md ├── AGENT_it-IT.md ├── AGENT_it-IT_ja-JP.md ├── AGENT_ja-JP.md ├── AGENT_ko-KR.md ├── AGENT_ko-KR_ja-JP.md ├── AGENT_ms-MY.md ├── AGENT_ms-MY_ja-JP.md ├── AGENT_nb-NO.md ├── AGENT_nb-NO_ja-JP.md ├── AGENT_pl-PL.md ├── AGENT_pl-PL_ja-JP.md ├── AGENT_pt-BR.md ├── AGENT_th-TH.md ├── AGENT_th-TH_ja-JP.md ├── AGENT_vi-VN.md ├── AGENT_vi-VN_ja-JP.md ├── AGENT_zh-CN.md ├── AGENT_zh-CN_ja-JP.md ├── AGENT_zh-TW.md ├── AGENT_zh-TW_ja-JP.md ├── LOCAL_DEVELOPMENT.md ├── LOCAL_DEVELOPMENT_de-DE.md ├── LOCAL_DEVELOPMENT_de-DE_ja-JP.md ├── LOCAL_DEVELOPMENT_es-ES.md ├── LOCAL_DEVELOPMENT_es-ES_ja-JP.md ├── LOCAL_DEVELOPMENT_fr-FR.md ├── LOCAL_DEVELOPMENT_fr-FR_ja-JP.md ├── LOCAL_DEVELOPMENT_it-IT.md ├── LOCAL_DEVELOPMENT_it-IT_ja-JP.md ├── LOCAL_DEVELOPMENT_ja-JP.md ├── LOCAL_DEVELOPMENT_ko-KR.md ├── LOCAL_DEVELOPMENT_ko-KR_ja-JP.md ├── LOCAL_DEVELOPMENT_ms-MY.md ├── LOCAL_DEVELOPMENT_ms-MY_ja-JP.md ├── LOCAL_DEVELOPMENT_nb-NO.md ├── LOCAL_DEVELOPMENT_nb-NO_ja-JP.md ├── LOCAL_DEVELOPMENT_pl-PL.md ├── LOCAL_DEVELOPMENT_pl-PL_ja-JP.md ├── LOCAL_DEVELOPMENT_pt-BR.md ├── LOCAL_DEVELOPMENT_th-TH.md ├── LOCAL_DEVELOPMENT_th-TH_ja-JP.md ├── LOCAL_DEVELOPMENT_vi-VN.md ├── LOCAL_DEVELOPMENT_vi-VN_ja-JP.md ├── LOCAL_DEVELOPMENT_zh-CN.md ├── LOCAL_DEVELOPMENT_zh-CN_ja-JP.md ├── LOCAL_DEVELOPMENT_zh-TW.md ├── LOCAL_DEVELOPMENT_zh-TW_ja-JP.md ├── PUBLISH_API.md ├── PUBLISH_API_de-DE.md ├── PUBLISH_API_es-ES.md ├── PUBLISH_API_fr-FR.md ├── PUBLISH_API_it-IT.md ├── PUBLISH_API_ja-JP.md ├── PUBLISH_API_ko-KR.md ├── PUBLISH_API_ms-MY.md ├── PUBLISH_API_nb-NO.md ├── PUBLISH_API_pl-PL.md ├── PUBLISH_API_pt-BR.md ├── PUBLISH_API_th-TH.md ├── PUBLISH_API_vi-VN.md ├── PUBLISH_API_zh-CN.md ├── PUBLISH_API_zh-TW.md ├── README_de-DE.md ├── README_es-ES.md ├── README_fr-FR.md ├── README_it-IT.md ├── README_ja-JP.md ├── README_ko-KR.md ├── README_ms-MY.md ├── README_nb-NO.md ├── README_pl-PL.md ├── README_pt-BR.md ├── README_th-TH.md ├── README_vi-VN.md ├── README_zh-CN.md ├── README_zh-TW.md ├── idp │ ├── SET_UP_CUSTOM_OIDC.md │ ├── SET_UP_CUSTOM_OIDC_de-DE.md │ ├── SET_UP_CUSTOM_OIDC_de-DE_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_es-ES.md │ ├── SET_UP_CUSTOM_OIDC_es-ES_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_fr-FR.md │ ├── SET_UP_CUSTOM_OIDC_fr-FR_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_it-IT.md │ ├── SET_UP_CUSTOM_OIDC_it-IT_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_ko-KR.md │ ├── SET_UP_CUSTOM_OIDC_ko-KR_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_ms-MY.md │ ├── SET_UP_CUSTOM_OIDC_ms-MY_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_nb-NO.md │ ├── SET_UP_CUSTOM_OIDC_nb-NO_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_pl-PL.md │ ├── SET_UP_CUSTOM_OIDC_pl-PL_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_pt-BR.md │ ├── SET_UP_CUSTOM_OIDC_th-TH.md │ ├── SET_UP_CUSTOM_OIDC_th-TH_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_vi-VN.md │ ├── SET_UP_CUSTOM_OIDC_vi-VN_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_zh-CN.md │ ├── SET_UP_CUSTOM_OIDC_zh-CN_ja-JP.md │ ├── SET_UP_CUSTOM_OIDC_zh-TW.md │ ├── SET_UP_CUSTOM_OIDC_zh-TW_ja-JP.md │ ├── SET_UP_GOOGLE.md │ ├── SET_UP_GOOGLE_de-DE.md │ ├── SET_UP_GOOGLE_de-DE_ja-JP.md │ ├── SET_UP_GOOGLE_es-ES.md │ ├── SET_UP_GOOGLE_es-ES_ja-JP.md │ ├── SET_UP_GOOGLE_fr-FR.md │ ├── SET_UP_GOOGLE_fr-FR_ja-JP.md │ ├── SET_UP_GOOGLE_it-IT.md │ ├── SET_UP_GOOGLE_it-IT_ja-JP.md │ ├── SET_UP_GOOGLE_ja-JP.md │ ├── SET_UP_GOOGLE_ko-KR.md │ ├── SET_UP_GOOGLE_ko-KR_ja-JP.md │ ├── SET_UP_GOOGLE_ms-MY.md │ ├── SET_UP_GOOGLE_ms-MY_ja-JP.md │ ├── SET_UP_GOOGLE_nb-NO.md │ ├── SET_UP_GOOGLE_nb-NO_ja-JP.md │ ├── SET_UP_GOOGLE_pl-PL.md │ ├── SET_UP_GOOGLE_pl-PL_ja-JP.md │ ├── SET_UP_GOOGLE_pt-BR.md │ ├── SET_UP_GOOGLE_th-TH.md │ ├── SET_UP_GOOGLE_th-TH_ja-JP.md │ ├── SET_UP_GOOGLE_vi-VN.md │ ├── SET_UP_GOOGLE_vi-VN_ja-JP.md │ ├── SET_UP_GOOGLE_zh-CN.md │ ├── SET_UP_GOOGLE_zh-CN_ja-JP.md │ ├── SET_UP_GOOGLE_zh-TW.md │ └── SET_UP_GOOGLE_zh-TW_ja-JP.md ├── imgs │ ├── admin_bot_analytics.png │ ├── admin_bot_menue.png │ ├── admn_api_management.png │ ├── agent1.png │ ├── agent2.png │ ├── agent_tools.png │ ├── arch.png │ ├── bedrock_agent_tool.png │ ├── bot_api_publish_screenshot.png │ ├── bot_api_publish_screenshot2.png │ ├── bot_api_publish_screenshot3.png │ ├── bot_store.png │ ├── customized_bot_creation.png │ ├── demo.gif │ ├── demo_ja.gif │ ├── feedback-using-claude-chat.png │ ├── feedback.png │ ├── feedback_loop.png │ ├── fine_grained_permission.png │ ├── group_membership_admin.png │ ├── group_membership_publish_allowed.png │ ├── import_existing_kb.png │ ├── model_screenshot.png │ ├── published_arch.png │ ├── rag.png │ ├── signin.png │ ├── v1_to_v2_KB_s3_source.png │ ├── v1_to_v2_arch.png │ └── v1_to_v2_readonly_bot.png └── migration │ ├── DATABASE_MIGRATION.md │ ├── DATABASE_MIGRATION_de-DE.md │ ├── DATABASE_MIGRATION_de-DE_ja-JP.md │ ├── DATABASE_MIGRATION_es-ES.md │ ├── DATABASE_MIGRATION_es-ES_ja-JP.md │ ├── DATABASE_MIGRATION_fr-FR.md │ ├── DATABASE_MIGRATION_fr-FR_ja-JP.md │ ├── DATABASE_MIGRATION_it-IT.md │ ├── DATABASE_MIGRATION_it-IT_ja-JP.md │ ├── DATABASE_MIGRATION_ja-JP.md │ ├── DATABASE_MIGRATION_ko-KR.md │ ├── DATABASE_MIGRATION_ko-KR_ja-JP.md │ ├── DATABASE_MIGRATION_ms-MY.md │ ├── DATABASE_MIGRATION_ms-MY_ja-JP.md │ ├── DATABASE_MIGRATION_nb-NO.md │ ├── DATABASE_MIGRATION_nb-NO_ja-JP.md │ ├── DATABASE_MIGRATION_pl-PL.md │ ├── DATABASE_MIGRATION_pl-PL_ja-JP.md │ ├── DATABASE_MIGRATION_pt-BR.md │ ├── DATABASE_MIGRATION_th-TH.md │ ├── DATABASE_MIGRATION_th-TH_ja-JP.md │ ├── DATABASE_MIGRATION_vi-VN.md │ ├── DATABASE_MIGRATION_vi-VN_ja-JP.md │ ├── DATABASE_MIGRATION_zh-CN.md │ ├── DATABASE_MIGRATION_zh-CN_ja-JP.md │ ├── DATABASE_MIGRATION_zh-TW.md │ ├── DATABASE_MIGRATION_zh-TW_ja-JP.md │ ├── V0_TO_V1.md │ ├── V0_TO_V1_de-DE.md │ ├── V0_TO_V1_de-DE_ja-JP.md │ ├── V0_TO_V1_es-ES.md │ ├── V0_TO_V1_es-ES_ja-JP.md │ ├── V0_TO_V1_fr-FR.md │ ├── V0_TO_V1_fr-FR_ja-JP.md │ ├── V0_TO_V1_it-IT.md │ ├── V0_TO_V1_it-IT_ja-JP.md │ ├── V0_TO_V1_ja-JP.md │ ├── V0_TO_V1_ko-KR.md │ ├── V0_TO_V1_ko-KR_ja-JP.md │ ├── V0_TO_V1_ms-MY.md │ ├── V0_TO_V1_ms-MY_ja-JP.md │ ├── V0_TO_V1_nb-NO.md │ ├── V0_TO_V1_nb-NO_ja-JP.md │ ├── V0_TO_V1_pl-PL.md │ ├── V0_TO_V1_pl-PL_ja-JP.md │ ├── V0_TO_V1_pt-BR.md │ ├── V0_TO_V1_th-TH.md │ ├── V0_TO_V1_th-TH_ja-JP.md │ ├── V0_TO_V1_vi-VN.md │ ├── V0_TO_V1_vi-VN_ja-JP.md │ ├── V0_TO_V1_zh-CN.md │ ├── V0_TO_V1_zh-CN_ja-JP.md │ ├── V0_TO_V1_zh-TW.md │ ├── V0_TO_V1_zh-TW_ja-JP.md │ ├── V1_TO_V2.md │ ├── V1_TO_V2_de-DE.md │ ├── V1_TO_V2_es-ES.md │ ├── V1_TO_V2_fr-FR.md │ ├── V1_TO_V2_it-IT.md │ ├── V1_TO_V2_ja-JP.md │ ├── V1_TO_V2_ko-KR.md │ ├── V1_TO_V2_ms-MY.md │ ├── V1_TO_V2_nb-NO.md │ ├── V1_TO_V2_pl-PL.md │ ├── V1_TO_V2_pt-BR.md │ ├── V1_TO_V2_th-TH.md │ ├── V1_TO_V2_vi-VN.md │ ├── V1_TO_V2_zh-CN.md │ ├── V1_TO_V2_zh-TW.md │ ├── V2_TO_V3.md │ ├── V2_TO_V3_de-DE.md │ ├── V2_TO_V3_es-ES.md │ ├── V2_TO_V3_fr-FR.md │ ├── V2_TO_V3_it-IT.md │ ├── V2_TO_V3_ja-JP.md │ ├── V2_TO_V3_ko-KR.md │ ├── V2_TO_V3_ms-MY.md │ ├── V2_TO_V3_nb-NO.md │ ├── V2_TO_V3_pl-PL.md │ ├── V2_TO_V3_pt-BR.md │ ├── V2_TO_V3_th-TH.md │ ├── V2_TO_V3_vi-VN.md │ ├── V2_TO_V3_zh-CN.md │ ├── V2_TO_V3_zh-TW.md │ ├── migrate_v0_v1.py │ └── migrate_v2_v3.py ├── examples ├── agents │ └── tools │ │ └── bmi │ │ ├── README.md │ │ ├── bmi.py │ │ └── test_bmi.py └── notebooks │ └── feedback_analysis_example.ipynb ├── frontend ├── .env.template ├── .eslintrc.cjs ├── .gitignore ├── .ladle │ ├── components.tsx │ └── config.mjs ├── .prettierrc.json ├── Dockerfile ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public │ ├── .gitkeep │ ├── favicon.png │ ├── favicon.svg │ ├── images │ │ ├── bedrock_icon_128.png │ │ ├── bedrock_icon_144.png │ │ ├── bedrock_icon_152.png │ │ ├── bedrock_icon_16.png │ │ ├── bedrock_icon_192.png │ │ ├── bedrock_icon_32.png │ │ ├── bedrock_icon_384.png │ │ ├── bedrock_icon_48.png │ │ ├── bedrock_icon_512.png │ │ ├── bedrock_icon_64.png │ │ ├── bedrock_icon_72.png │ │ └── bedrock_icon_96.png │ └── mockServiceWorker.js ├── src │ ├── @types │ │ ├── api-publication.d.ts │ │ ├── auth.d.ts │ │ ├── bot.d.ts │ │ ├── common.d.ts │ │ ├── conversation.d.ts │ │ ├── react-i18next.d.ts │ │ └── user.d.ts │ ├── App.tsx │ ├── assets │ │ └── .gitkeep │ ├── components │ │ ├── Alert.stories.tsx │ │ ├── Alert.tsx │ │ ├── ApiKeyItem.tsx │ │ ├── AuthAmplify.tsx │ │ ├── AuthCustom.tsx │ │ ├── Button.stories.tsx │ │ ├── Button.tsx │ │ ├── ButtonCopy.stories.tsx │ │ ├── ButtonCopy.tsx │ │ ├── ButtonDownload.stories.tsx │ │ ├── ButtonDownload.tsx │ │ ├── ButtonFileChoose.stories.tsx │ │ ├── ButtonFileChoose.tsx │ │ ├── ButtonIcon.stories.tsx │ │ ├── ButtonIcon.tsx │ │ ├── ButtonReasoning.stories.tsx │ │ ├── ButtonReasoning.tsx │ │ ├── ButtonSend.stories.tsx │ │ ├── ButtonSend.tsx │ │ ├── ButtonStar.tsx │ │ ├── ChatMessage.stories.tsx │ │ ├── ChatMessage.tsx │ │ ├── ChatMessageMarkdown.tsx │ │ ├── ConversationSearchResults.tsx │ │ ├── DialogConfirmAddApiKey.tsx │ │ ├── DialogConfirmClearConversations.tsx │ │ ├── DialogConfirmDeleteApi.tsx │ │ ├── DialogConfirmDeleteApiKey.tsx │ │ ├── DialogConfirmDeleteBot.tsx │ │ ├── DialogConfirmDeleteChat.tsx │ │ ├── DialogDrawerOptions.tsx │ │ ├── DialogFeedback.tsx │ │ ├── DialogInstructionsSamples.tsx │ │ ├── DialogSelectLanguage.tsx │ │ ├── DialogShareBot.tsx │ │ ├── DialogShareBotPermission.tsx │ │ ├── Drawer.stories.tsx │ │ ├── Drawer.tsx │ │ ├── DrawerItem.tsx │ │ ├── ExpandableDrawerGroup.tsx │ │ ├── GenerationConfig.tsx │ │ ├── Help.stories.tsx │ │ ├── Help.tsx │ │ ├── IconPinnedBot.tsx │ │ ├── IconShareBot.tsx │ │ ├── InputChatContent.stories.tsx │ │ ├── InputChatContent.tsx │ │ ├── InputText.stories.tsx │ │ ├── InputText.tsx │ │ ├── KnowledgeFileUploader.tsx │ │ ├── LazyOutputText.tsx │ │ ├── ListItemBot.stories.tsx │ │ ├── ListItemBot.tsx │ │ ├── Menu.tsx │ │ ├── MenuBot.tsx │ │ ├── ModalDialog.stories.tsx │ │ ├── ModalDialog.tsx │ │ ├── PopoverItem.tsx │ │ ├── PopoverMenu.stories.tsx │ │ ├── PopoverMenu.tsx │ │ ├── Progress.stories.tsx │ │ ├── Progress.tsx │ │ ├── RadioButton.stories.tsx │ │ ├── RadioButton.tsx │ │ ├── RelatedDocumentViewer.tsx │ │ ├── SearchTextBox.tsx │ │ ├── SearchTextbox.stories.tsx │ │ ├── Select.stories.tsx │ │ ├── Select.tsx │ │ ├── Skeleton.stories.tsx │ │ ├── Skeleton.tsx │ │ ├── Slider.stories.tsx │ │ ├── Slider.tsx │ │ ├── StatusSyncBot.stories.tsx │ │ ├── StatusSyncBot.tsx │ │ ├── SwitchBedrockModel.stories.tsx │ │ ├── SwitchBedrockModel.tsx │ │ ├── Textarea.stories.tsx │ │ ├── Textarea.tsx │ │ ├── Toggle.stories.tsx │ │ ├── Toggle.tsx │ │ ├── Tooltip.stories.tsx │ │ ├── Tooltip.tsx │ │ └── UploadedAttachedFile.tsx │ ├── constants │ │ ├── index.ts │ │ └── supportedAttachedFiles.ts │ ├── features │ │ ├── agent │ │ │ ├── components │ │ │ │ ├── Agent.stories.tsx │ │ │ │ ├── AgentToolList.tsx │ │ │ │ ├── AvailableTools.tsx │ │ │ │ ├── BedrockAgentConfig.tsx │ │ │ │ ├── FirecrawlConfig.tsx │ │ │ │ └── ToolCard.tsx │ │ │ ├── constants │ │ │ │ └── index.ts │ │ │ ├── functions │ │ │ │ ├── formatDescription.ts │ │ │ │ └── logisticCurve.ts │ │ │ ├── hooks │ │ │ │ ├── useAgent.ts │ │ │ │ ├── useAgentToolApi.ts │ │ │ │ └── useToolCardExpand.ts │ │ │ ├── types │ │ │ │ └── index.d.ts │ │ │ ├── utils │ │ │ │ ├── AgentUtils.ts │ │ │ │ └── typeGuards.ts │ │ │ └── xstates │ │ │ │ └── agentThink.ts │ │ ├── discover │ │ │ ├── components │ │ │ │ ├── BotSearchResults.tsx │ │ │ │ └── CardBotForDiscover.tsx │ │ │ ├── hooks │ │ │ │ ├── useBotSearch.ts │ │ │ │ ├── useBotStore.ts │ │ │ │ └── useBotStoreApi.ts │ │ │ ├── pages │ │ │ │ └── BotDiscoverPage.tsx │ │ │ └── types │ │ │ │ └── bot-store.d.ts │ │ ├── helper │ │ │ └── components │ │ │ │ ├── BottomHelper.tsx │ │ │ │ └── Helper.stories.tsx │ │ ├── knowledgeBase │ │ │ ├── constants │ │ │ │ └── index.ts │ │ │ ├── pages │ │ │ │ └── BotKbEditPage.tsx │ │ │ └── types │ │ │ │ └── index.d.ts │ │ └── reasoning │ │ │ ├── components │ │ │ ├── ReasoningCard.stories.tsx │ │ │ └── ReasoningCard.tsx │ │ │ └── xstates │ │ │ └── reasoningState.ts │ ├── hooks │ │ ├── useAdminApi.ts │ │ ├── useBot.ts │ │ ├── useBotApi.ts │ │ ├── useBotApiKey.ts │ │ ├── useBotApiSettings.ts │ │ ├── useBotApiSettingsForAdmin.ts │ │ ├── useBotPinning.ts │ │ ├── useBotPublication.ts │ │ ├── useBotPublicationApi.ts │ │ ├── useBotPublicationForAdmin.ts │ │ ├── useBotSummary.ts │ │ ├── useChat.ts │ │ ├── useConversation.ts │ │ ├── useConversationApi.ts │ │ ├── useConversationSearch.ts │ │ ├── useConversationSearchApi.ts │ │ ├── useDrawer.ts │ │ ├── useErrorMessage.ts │ │ ├── useFeedbackApi.ts │ │ ├── useHttp.ts │ │ ├── useIsWindows.ts │ │ ├── useLocalStorage.ts │ │ ├── useLoginUser.ts │ │ ├── useModel.ts │ │ ├── usePostMessageStreaming.ts │ │ ├── usePublicBotsForAdmin.ts │ │ ├── usePublishApiForAdmin.ts │ │ ├── useScroll.ts │ │ ├── useSearchUsers.ts │ │ ├── useShareBot.ts │ │ ├── useSnackbar.ts │ │ ├── useUser.ts │ │ └── useUserApi.ts │ ├── i18n │ │ ├── de │ │ │ └── index.ts │ │ ├── en │ │ │ └── index.ts │ │ ├── es │ │ │ └── index.ts │ │ ├── fr │ │ │ └── index.ts │ │ ├── id │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── it │ │ │ └── index.ts │ │ ├── ja │ │ │ └── index.ts │ │ ├── ko │ │ │ └── index.ts │ │ ├── ms │ │ │ └── index.ts │ │ ├── nb │ │ │ └── index.ts │ │ ├── pl │ │ │ └── index.ts │ │ ├── pt-br │ │ │ └── index.ts │ │ ├── th │ │ │ └── index.ts │ │ ├── vi │ │ │ └── index.ts │ │ ├── zh-hans │ │ │ └── index.ts │ │ └── zh-hant │ │ │ └── index.ts │ ├── index.css │ ├── layouts │ │ ├── AppContent.tsx │ │ └── ListPageLayout.tsx │ ├── main.tsx │ ├── pages │ │ ├── AdminApiManagementPage.tsx │ │ ├── AdminBotManagementPage.tsx │ │ ├── AdminSharedBotAnalyticsPage.tsx │ │ ├── BotApiSettingsPage.tsx │ │ ├── BotExplorePage.tsx │ │ ├── BotRecentlyUsedPage.tsx │ │ ├── BotStarredPage.tsx │ │ ├── ChatPage.tsx │ │ ├── ConversationHistoryPage.tsx │ │ ├── ErrorFallback.tsx │ │ └── NotFound.tsx │ ├── providers │ │ └── SnackbarProvider.tsx │ ├── routes.tsx │ ├── utils │ │ ├── BotUtils.ts │ │ ├── DateUtils.ts │ │ ├── MessageUtils.ts │ │ ├── SocialProviderUtils.ts │ │ ├── StringUtils.ts │ │ ├── __tests__ │ │ │ └── MessageUtils.test.ts │ │ └── shareUtils.ts │ └── vite-env.d.ts ├── tailwind.config.js ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts ├── lefthook.yml ├── pyrightconfig.json └── scripts ├── cross_region_inference └── get_supported_cross_region_inferences.py └── translate_docs └── translate.py /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @statefb @wadabee @Yukinobu-Mine -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: "" 6 | assignees: "" 7 | --- 8 | 9 | ## 🚨 **Please Note** 🚨 10 | 11 | To ensure efficient investigation of the issue, please fill out the fields below with as much detail as possible. **Reports that do not follow this template may be closed without notification.** We appreciate your cooperation. 12 | 13 | ## 🐞Describe the bug 14 | 15 | A clear and concise description of what the bug is. 16 | 17 | ## 🔄 To Reproduce 18 | 19 | Steps to reproduce the behavior: 20 | 21 | 1. Go to '...' 22 | 2. Click on '....' 23 | 3. Scroll down to '....' 24 | 4. See error 25 | 26 | ## 📷 Screenshots 27 | 28 | If applicable, add screenshots to help explain your problem. 29 | 30 | ## 🔎 Logs for Chat Issues 31 | 32 | If the issue occurs during a chat interaction, please check the following logs on Amazon Cloudwatch Logs and include the relevant entries in your issue: 33 | 34 | - `/aws/lambda/BedrockChatStack-BackendApiHandlerXXXX` 35 | - `/aws/lambda/BedrockChatStack-WebSocketHandlerXXXX` 36 | 37 | ## 🔎 Logs for Bot Creation/Update Issues 38 | 39 | If the issue occurs during bot creation or updating, please check the execution records of the AWS Step Functions state machine named `EmbeddingStateMachineXXX` and include the details in your issue. 40 | 41 | ## 📝 Additional context 42 | 43 | Add any other context about the problem here. 44 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[Feature Request]" 5 | labels: "" 6 | assignees: "" 7 | --- 8 | 9 | ## Describe the solution you'd like 10 | 11 | A clear and concise description of what you want to happen. 12 | 13 | ## Why the solution needed 14 | 15 | A clear and concise description of the reason why you want the solution. 16 | 17 | ## Additional context 18 | 19 | Add any other context or screenshots about the feature request here. 20 | 21 | ## Implementation feasibility 22 | 23 | Are you willing to collaborate with us to discuss the solution, decide on the approach, and assist with the implementation? 24 | 25 | - [ ] Yes, I am able to implement the feature and create a pull request. 26 | - [ ] No, I am unable to implement the feature, but I am open to discussing the solution. 27 | -------------------------------------------------------------------------------- /.github/workflows/auto-label.yml: -------------------------------------------------------------------------------- 1 | name: Add 'needs triage' label 2 | 3 | on: 4 | issues: 5 | types: 6 | - opened 7 | 8 | jobs: 9 | add-label: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Add 'needs triage' label 14 | uses: actions-ecosystem/action-add-labels@v1 15 | with: 16 | github_token: ${{ secrets.GITHUB_TOKEN }} 17 | labels: "needs-triage" 18 | -------------------------------------------------------------------------------- /.github/workflows/backend.yml: -------------------------------------------------------------------------------- 1 | name: Backend tests 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | - v1 8 | - v3 9 | workflow_dispatch: {} 10 | 11 | jobs: 12 | black-mypy-check: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - name: Set up Python 3.13 17 | uses: actions/setup-python@v4 18 | with: 19 | python-version: "3.13" 20 | - name: Install dependencies 21 | run: | 22 | pip install poetry 23 | cd backend 24 | poetry install 25 | - name: Run mypy 26 | run: | 27 | cd backend 28 | poetry run mypy --config-file mypy.ini . 29 | - name: Run black 30 | run: | 31 | cd backend 32 | poetry run black --check . 33 | 34 | uvicorn-launch: 35 | runs-on: ubuntu-latest 36 | steps: 37 | - uses: actions/checkout@v3 38 | - name: Set up Python 3.13 39 | uses: actions/setup-python@v4 40 | with: 41 | python-version: "3.13" 42 | - name: Install dependencies 43 | run: | 44 | pip install poetry 45 | cd backend 46 | poetry install 47 | - name: Run Uvicorn 48 | env: 49 | AWS_DEFAULT_REGION: us-east-1 50 | run: | 51 | cd backend 52 | timeout 10s poetry run uvicorn app.main:app --host 0.0.0.0 --port 8000 & 53 | sleep 5 54 | curl http://localhost:8000/health 55 | 56 | container-build: 57 | runs-on: ubuntu-latest 58 | steps: 59 | - uses: actions/checkout@v3 60 | - name: Build backend/Dockerfile 61 | run: | 62 | cd backend 63 | docker build -t backend . 64 | -------------------------------------------------------------------------------- /.github/workflows/cdk.yml: -------------------------------------------------------------------------------- 1 | name: CDK tests 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | - v1 8 | - v3 9 | workflow_dispatch: {} 10 | 11 | jobs: 12 | cdk-synth: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - name: Use Node.js 17 | uses: actions/setup-node@v3 18 | with: 19 | node-version: "18.x" 20 | - run: | 21 | cd cdk 22 | npm ci 23 | npx cdk synth 24 | cdk-test: 25 | runs-on: ubuntu-latest 26 | steps: 27 | - uses: actions/checkout@v3 28 | - name: Use Node.js 29 | uses: actions/setup-node@v3 30 | with: 31 | node-version: "18.x" 32 | - run: | 33 | cd cdk 34 | npm ci 35 | npm run test 36 | -------------------------------------------------------------------------------- /.github/workflows/frontend.yml: -------------------------------------------------------------------------------- 1 | name: Frontend tests 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | - v1 8 | - v3 9 | workflow_dispatch: {} 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v3 16 | - name: Use Node.js 17 | uses: actions/setup-node@v3 18 | with: 19 | node-version: "20.x" 20 | - name: Install dependencies 21 | run: | 22 | cd frontend 23 | npm ci 24 | - name: Lint frontend 25 | run: | 26 | cd frontend 27 | npm run lint 28 | - name: Build frontend 29 | run: | 30 | cd frontend 31 | npm run build 32 | - name: Check build status 33 | run: | 34 | cd frontend 35 | if [ -d "dist" ]; then 36 | echo "Build successful" 37 | else 38 | echo "Build failed" 39 | exit 1 40 | fi 41 | -------------------------------------------------------------------------------- /.github/workflows/issue-closure.yml: -------------------------------------------------------------------------------- 1 | name: Expired Issues Closure 2 | 3 | on: 4 | schedule: 5 | - cron: 0 1 * * * 6 | 7 | jobs: 8 | close-issues: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v4 12 | 13 | - name: Close "stale" issues 14 | uses: piroor/close-expired-issues-based-on-label@master 15 | env: 16 | LABEL: "stale" 17 | EXCEPTION_LABELS: "" 18 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 19 | EXPIRE_DAYS: 14 20 | 21 | - name: Mark "needs-info" issues as "stale" if not responded 22 | uses: piroor/auto-mark-as-stale-issues@main 23 | env: 24 | LABEL: "stale" 25 | EXCEPTION_LABELS: "" 26 | CANDIDATE_LABELS: "needs-info" 27 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 28 | EXPIRE_DAYS: 30 29 | EXTEND_DAYS_BY_COMMENTED: 14 30 | COMMENT: This issue has been labeled as "stale" due to no response by the reporter within 1 month (and 14 days after last commented by someone). And it will be closed automatically 14 days later if not responded. 31 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | bedrock-python-sdk 2 | bedrock-python-sdk.zip 3 | verification 4 | 5 | __pycache__/ 6 | .venv 7 | .DS_Store 8 | AmazonQ.md 9 | memory-bank 10 | .clinerules 11 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /backend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM public.ecr.aws/docker/library/python:3.13.2-slim-bookworm 2 | 3 | # Install lambda web adapter 4 | COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.7.0 /lambda-adapter /opt/extensions/lambda-adapter 5 | 6 | WORKDIR /backend 7 | 8 | COPY ./pyproject.toml ./poetry.lock ./ 9 | 10 | ENV POETRY_REQUESTS_TIMEOUT=10800 11 | RUN python -m pip install --upgrade pip && \ 12 | pip install poetry --no-cache-dir && \ 13 | poetry config virtualenvs.create false && \ 14 | poetry install --no-interaction --no-ansi --only main && \ 15 | poetry cache clear --all pypi 16 | 17 | COPY ./app ./app 18 | 19 | ENV PORT=8000 20 | EXPOSE ${PORT} 21 | CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] -------------------------------------------------------------------------------- /backend/app/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/backend/app/__init__.py -------------------------------------------------------------------------------- /backend/app/auth.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | import requests 4 | from jose import jwt 5 | 6 | REGION = os.environ.get("REGION", "ap-northeast-1") 7 | USER_POOL_ID = os.environ.get("USER_POOL_ID", "") 8 | CLIENT_ID = os.environ.get("CLIENT_ID", "") 9 | 10 | 11 | def verify_token(token: str) -> dict: 12 | # Verify JWT token 13 | url = f"https://cognito-idp.{REGION}.amazonaws.com/{USER_POOL_ID}/.well-known/jwks.json" 14 | response = requests.get(url) 15 | keys = response.json()["keys"] 16 | header = jwt.get_unverified_header(token) 17 | key = [k for k in keys if k["kid"] == header["kid"]][0] 18 | # The JWT returned from the Identity Provider may contain an at_hash 19 | # jose jwt.decode verifies id_token with access_token by default if it contains at_hash 20 | # See : https://github.com/mpdavis/python-jose/blob/4b0701b46a8d00988afcc5168c2b3a1fd60d15d8/jose/jwt.py#L59 21 | # Since we are not using an access token in the app, skipping the verification of the at_hash. 22 | # so we will disable the verify_at_hash check. 23 | decoded = jwt.decode( 24 | token, 25 | key, 26 | algorithms=["RS256"], 27 | options={"verify_at_hash": False}, 28 | audience=CLIENT_ID, 29 | ) 30 | return decoded 31 | -------------------------------------------------------------------------------- /backend/app/repositories/models/api_publication.py: -------------------------------------------------------------------------------- 1 | from typing import Literal 2 | 3 | from pydantic import BaseModel 4 | 5 | 6 | class ApiUsagePlanQuotaModel(BaseModel): 7 | limit: int | None 8 | offset: int | None 9 | period: Literal["DAY", "WEEK", "MONTH"] | None 10 | 11 | 12 | class ApiUsagePlanThrottleModel(BaseModel): 13 | rate_limit: float | None 14 | burst_limit: int | None 15 | 16 | 17 | class ApiUsagePlanModel(BaseModel): 18 | id: str 19 | name: str 20 | quota: ApiUsagePlanQuotaModel 21 | throttle: ApiUsagePlanThrottleModel 22 | key_ids: list[str] 23 | 24 | 25 | class ApiKeyModel(BaseModel): 26 | id: str 27 | description: str 28 | value: str 29 | enabled: bool 30 | created_date: int 31 | 32 | 33 | class PublishedApiStackModel(BaseModel): 34 | stack_id: str 35 | stack_name: str 36 | stack_status: str 37 | api_id: str | None 38 | api_name: str | None 39 | api_usage_plan_id: str | None 40 | api_allowed_origins: list[str] | None 41 | api_stage: str | None 42 | create_time: int 43 | -------------------------------------------------------------------------------- /backend/app/repositories/models/common.py: -------------------------------------------------------------------------------- 1 | import base64 2 | from decimal import Decimal 3 | from typing import Annotated, Any, Dict, List, Type, get_args 4 | 5 | from pydantic import BaseModel, ConfigDict 6 | from pydantic.functional_serializers import PlainSerializer 7 | from pydantic.functional_validators import PlainValidator 8 | 9 | # Declare customized float type 10 | Float = Annotated[ 11 | # Note: Before decimalization, apply str() to keep the precision 12 | float, 13 | PlainSerializer(lambda v: Decimal(str(v)), return_type=Decimal), 14 | ] 15 | 16 | 17 | def decode_base64_string(value: Any) -> bytes: 18 | if type(value) == bytes: 19 | return value 20 | 21 | elif type(value) == str: 22 | return base64.b64decode(value) 23 | 24 | else: 25 | raise ValueError(f"Invalid value type: {type(value)}") 26 | 27 | 28 | Base64EncodedBytes = Annotated[ 29 | bytes, 30 | PlainValidator( 31 | func=decode_base64_string, 32 | json_schema_input_type=str, 33 | ), 34 | PlainSerializer( 35 | func=lambda v: base64.b64encode(v).decode().strip(), 36 | return_type=str, 37 | ), 38 | ] 39 | 40 | # Ensure that the value is set to empty when serializing. 41 | # When deserializing, need to care to fetch the value from the secret store 42 | # such as Secrets Manager. 43 | SecureString = Annotated[ 44 | str, 45 | PlainSerializer(lambda v: "", return_type=str), 46 | ] 47 | 48 | 49 | class DynamicBaseModel(BaseModel): 50 | model_config = ConfigDict(extra="allow") 51 | -------------------------------------------------------------------------------- /backend/app/repositories/models/custom_bot_guardrails.py: -------------------------------------------------------------------------------- 1 | from decimal import Decimal 2 | from pydantic import BaseModel 3 | from app.repositories.models.common import Float 4 | 5 | 6 | class BedrockGuardrailsModel(BaseModel): 7 | is_guardrail_enabled: bool 8 | hate_threshold: int 9 | insults_threshold: int 10 | sexual_threshold: int 11 | violence_threshold: int 12 | misconduct_threshold: int 13 | grounding_threshold: Float 14 | relevance_threshold: Float 15 | guardrail_arn: str 16 | guardrail_version: str 17 | -------------------------------------------------------------------------------- /backend/app/repositories/models/usage_analysis.py: -------------------------------------------------------------------------------- 1 | from typing import Literal 2 | 3 | from app.repositories.custom_bot import type_shared_scope 4 | from pydantic import BaseModel 5 | 6 | 7 | class UsagePerBot(BaseModel): 8 | id: str # bot_id 9 | title: str 10 | description: str 11 | published_api_stack_name: str | None 12 | published_api_datetime: int | None 13 | owner_user_id: str 14 | total_price: float 15 | shared_scope: type_shared_scope 16 | shared_status: str 17 | 18 | 19 | class UsagePerUser(BaseModel): 20 | id: str # user_id 21 | email: str 22 | total_price: float 23 | -------------------------------------------------------------------------------- /backend/app/routes/schemas/base.py: -------------------------------------------------------------------------------- 1 | from humps import camelize 2 | from pydantic import BaseModel 3 | 4 | 5 | class BaseSchema(BaseModel): 6 | class Config: 7 | alias_generator = camelize 8 | populate_by_name = True 9 | -------------------------------------------------------------------------------- /backend/app/routes/schemas/bot_guardrails.py: -------------------------------------------------------------------------------- 1 | from decimal import Decimal 2 | from app.routes.schemas.base import BaseSchema 3 | from app.repositories.models.common import Float 4 | 5 | 6 | class BedrockGuardrailsInput(BaseSchema): 7 | is_guardrail_enabled: bool 8 | hate_threshold: int 9 | insults_threshold: int 10 | sexual_threshold: int 11 | violence_threshold: int 12 | misconduct_threshold: int 13 | grounding_threshold: Float 14 | relevance_threshold: Float 15 | guardrail_arn: str 16 | guardrail_version: str 17 | 18 | 19 | class BedrockGuardrailsOutput(BaseSchema): 20 | is_guardrail_enabled: bool 21 | hate_threshold: int 22 | insults_threshold: int 23 | sexual_threshold: int 24 | violence_threshold: int 25 | misconduct_threshold: int 26 | grounding_threshold: Float 27 | relevance_threshold: Float 28 | guardrail_arn: str 29 | guardrail_version: str 30 | -------------------------------------------------------------------------------- /backend/app/routes/schemas/published_api.py: -------------------------------------------------------------------------------- 1 | from app.routes.schemas.base import BaseSchema 2 | from app.routes.schemas.conversation import Content, MessageOutput, type_model_name 3 | from pydantic import Field 4 | 5 | 6 | class MessageInputWithoutMessageId(BaseSchema): 7 | content: list[Content] 8 | model: type_model_name 9 | 10 | 11 | class ChatInputWithoutBotId(BaseSchema): 12 | conversation_id: str | None = Field( 13 | None, 14 | description="""Unique conversation id. 15 | If not provided, new conversation will be generated.""", 16 | ) 17 | message: MessageInputWithoutMessageId 18 | continue_generate: bool = Field(False) 19 | enable_reasoning: bool = Field(False) 20 | 21 | 22 | class ChatOutputWithoutBotId(BaseSchema): 23 | conversation_id: str 24 | message: MessageOutput 25 | create_time: float 26 | 27 | 28 | class MessageRequestedResponse(BaseSchema): 29 | conversation_id: str 30 | message_id: str 31 | -------------------------------------------------------------------------------- /backend/app/routes/user.py: -------------------------------------------------------------------------------- 1 | from venv import logger 2 | 3 | from app.usecases.user import ( 4 | get_user_by_id, 5 | search_group_by_name_prefix, 6 | search_user_by_email_prefix, 7 | ) 8 | from app.user import User, UserGroup, UserWithoutGroups 9 | from fastapi import APIRouter, HTTPException, Request 10 | 11 | router = APIRouter(tags=["user"]) 12 | 13 | 14 | @router.get("/user/search", response_model=list[UserWithoutGroups]) 15 | def search_user(request: Request, prefix: str): 16 | """Search users""" 17 | current_user: User = request.state.current_user 18 | logger.info("!!!") 19 | 20 | if not current_user.is_creating_bot_allowed(): 21 | raise PermissionError("Search user is not allowed for the current user") 22 | 23 | users = search_user_by_email_prefix(prefix=prefix) 24 | return users 25 | 26 | 27 | @router.get("/user/group/search", response_model=list[UserGroup]) 28 | def search_user_group(request: Request, prefix: str): 29 | """Search user groups""" 30 | current_user: User = request.state.current_user 31 | 32 | if not current_user.is_creating_bot_allowed(): 33 | raise PermissionError("Search user group is not allowed for the current user") 34 | 35 | groups = search_group_by_name_prefix(prefix=prefix) 36 | return groups 37 | 38 | 39 | @router.get("/user/{user_id}", response_model=UserWithoutGroups) 40 | def get_user(request: Request, user_id: str): 41 | """Get user""" 42 | user = get_user_by_id(id=user_id) 43 | 44 | if user is None: 45 | raise HTTPException(status_code=404, detail="User Not Found.") 46 | 47 | return user 48 | -------------------------------------------------------------------------------- /backend/app/sqs_consumer.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | from app.routes.schemas.conversation import ChatInput 4 | from app.usecases.chat import chat, chat_output_from_message 5 | from app.user import User 6 | 7 | 8 | def handler(event, context): 9 | """SQS consumer. 10 | This is used for async invocation for published api. 11 | """ 12 | for record in event["Records"]: 13 | message_body = json.loads(record["body"]) 14 | chat_input = ChatInput(**message_body) 15 | 16 | assert chat_input.bot_id is not None, "bot_id is required for published api" 17 | 18 | user = User.from_published_api_id(chat_input.bot_id) 19 | 20 | conversation, message = chat(user=user, chat_input=chat_input) 21 | chat_result = chat_output_from_message( 22 | conversation=conversation, 23 | message=message, 24 | ) 25 | print(chat_result) 26 | 27 | return {"statusCode": 200, "body": json.dumps("Processing completed")} 28 | -------------------------------------------------------------------------------- /backend/app/usecases/user.py: -------------------------------------------------------------------------------- 1 | from app.repositories.user import ( 2 | find_group_by_name_prefix, 3 | find_user_by_id, 4 | find_users_by_email_prefix, 5 | ) 6 | from app.user import UserGroup, UserWithoutGroups 7 | 8 | 9 | def search_user_by_email_prefix( 10 | prefix: str, limit: int = 10 11 | ) -> list[UserWithoutGroups]: 12 | return find_users_by_email_prefix(prefix=prefix, limit=limit) 13 | 14 | 15 | def search_group_by_name_prefix(prefix: str) -> list[UserGroup]: 16 | return find_group_by_name_prefix(prefix=prefix) 17 | 18 | 19 | def get_user_by_id(id: str) -> UserWithoutGroups | None: 20 | return find_user_by_id(id=id) 21 | -------------------------------------------------------------------------------- /backend/auth/add_user_to_groups/add_user_to_groups.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | import boto3 5 | from aws_lambda_powertools import Logger, Tracer 6 | from aws_lambda_powertools.utilities.typing import LambdaContext 7 | 8 | USER_POOL_ID: str = os.environ["USER_POOL_ID"] 9 | AUTO_JOIN_USER_GROUPS: list[str] = json.loads( 10 | os.environ.get("AUTO_JOIN_USER_GROUPS", "[]") 11 | ) 12 | 13 | logger = Logger() 14 | tracer = Tracer() 15 | 16 | cognito = boto3.client("cognito-idp") 17 | 18 | 19 | @tracer.capture_lambda_handler 20 | @logger.inject_lambda_context(log_event=True) 21 | def handler(event: dict, context: LambdaContext) -> dict: 22 | user_name: str = event["userName"] 23 | user_attributes: dict = event["request"]["userAttributes"] 24 | 25 | trigger_source: str = event["triggerSource"] 26 | if trigger_source == "PostConfirmation_ConfirmSignUp": 27 | add_user_to_groups(USER_POOL_ID, user_name, AUTO_JOIN_USER_GROUPS) 28 | 29 | elif trigger_source == "PostAuthentication_Authentication": 30 | user_status: str = user_attributes["cognito:user_status"] 31 | if user_status == "FORCE_CHANGE_PASSWORD": 32 | add_user_to_groups(USER_POOL_ID, user_name, AUTO_JOIN_USER_GROUPS) 33 | 34 | return event 35 | 36 | 37 | def add_user_to_groups(user_pool_id: str, username: str, groups: list[str]): 38 | for group in groups: 39 | logger.info(f"Adding user '{username}' to group '{group}'") 40 | cognito.admin_add_user_to_group( 41 | UserPoolId=user_pool_id, 42 | Username=username, 43 | GroupName=group, 44 | ) 45 | -------------------------------------------------------------------------------- /backend/auth/add_user_to_groups/requirements.txt: -------------------------------------------------------------------------------- 1 | boto3 2 | aws-lambda-powertools[all] 3 | 4 | -------------------------------------------------------------------------------- /backend/auth/check_email_domain/check_email_domain.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | from typing import Dict 4 | 5 | ALLOWED_SIGN_UP_EMAIL_DOMAINS_STR = os.environ.get("ALLOWED_SIGN_UP_EMAIL_DOMAINS_STR") 6 | ALLOWED_SIGN_UP_EMAIL_DOMAINS = ( 7 | json.loads(ALLOWED_SIGN_UP_EMAIL_DOMAINS_STR) 8 | if ALLOWED_SIGN_UP_EMAIL_DOMAINS_STR 9 | else [] 10 | ) 11 | 12 | 13 | def check_email_domain(email: str) -> bool: 14 | # Determine whether to allow the email domain 15 | # Always disallow if the number of '@' in the email is not exactly one 16 | if email.count("@") != 1: 17 | return False 18 | 19 | # Allow if the domain part of the email matches any of the allowed domains 20 | # Otherwise, disallow 21 | # (Always disallow if ALLOWED_SIGN_UP_EMAIL_DOMAINS is empty) 22 | domain = email.split("@")[1] 23 | return domain in ALLOWED_SIGN_UP_EMAIL_DOMAINS 24 | 25 | 26 | def handler(event: Dict, context: Dict) -> Dict: 27 | """ 28 | Cognito Pre Sign-up Lambda Trigger. 29 | 30 | :param event: The event from Cognito. 31 | :param context: The Lambda execution context. 32 | :return: The response to Cognito. 33 | """ 34 | try: 35 | print("Received event:", json.dumps(event, indent=2)) 36 | email = event["request"]["userAttributes"]["email"] 37 | is_allowed = check_email_domain(email) 38 | if is_allowed: 39 | # Return the event object as is on success 40 | return event 41 | else: 42 | # Raise an exception with an error message on failure 43 | raise Exception("Invalid email domain") 44 | except Exception as e: 45 | print("Error occurred:", e) 46 | # Raise the exception with an appropriate error message 47 | raise e 48 | -------------------------------------------------------------------------------- /backend/embedding_statemachine/bedrock_knowledge_base/store_knowledge_base_id.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import os 3 | from typing import List 4 | 5 | from app.repositories.common import decompose_sk 6 | from app.repositories.custom_bot import update_knowledge_base_id 7 | from app.routes.schemas.bot import type_sync_status 8 | from reretry import retry 9 | from typing_extensions import TypedDict 10 | 11 | logger = logging.getLogger() 12 | logger.setLevel(logging.INFO) 13 | 14 | 15 | class Items(TypedDict): 16 | KnowledgeBaseId: str 17 | DataSourceId: str 18 | GuardrailArn: str 19 | GuardrailVersion: str 20 | PK: str 21 | SK: str 22 | 23 | 24 | class StackOutput(TypedDict): 25 | KnowledgeBaseId: str 26 | items: List[Items] 27 | 28 | 29 | def handler(event, context): 30 | logger.info(f"Event: {event}") 31 | pk = event["pk"] 32 | sk = event["sk"] 33 | stack_output: StackOutput = event["stack_output"] 34 | 35 | kb_id = ( 36 | stack_output["KnowledgeBaseId"] if "KnowledgeBaseId" in stack_output else None 37 | ) 38 | if not kb_id: 39 | raise ValueError("KnowledgeBaseId not found in stack outputs") 40 | 41 | # Filter out None values and ensure all elements are strings 42 | data_source_ids: List[str] = [ 43 | item["DataSourceId"] 44 | for item in stack_output.get("items", []) 45 | if item.get("DataSourceId") 46 | ] 47 | 48 | user_id = pk 49 | bot_id = decompose_sk(sk) 50 | 51 | update_knowledge_base_id(user_id, bot_id, kb_id, data_source_ids) 52 | -------------------------------------------------------------------------------- /backend/lambda.Dockerfile: -------------------------------------------------------------------------------- 1 | FROM public.ecr.aws/lambda/python:3.13 2 | 3 | COPY ./pyproject.toml ./poetry.lock ./ 4 | 5 | ENV POETRY_REQUESTS_TIMEOUT=10800 6 | RUN python -m pip install --upgrade pip && \ 7 | pip install poetry --no-cache-dir && \ 8 | poetry config virtualenvs.create false && \ 9 | poetry install --no-interaction --no-ansi --only main && \ 10 | poetry cache clear --all pypi 11 | 12 | COPY ./app ./app 13 | COPY ./embedding_statemachine ./embedding_statemachine 14 | 15 | CMD ["app.websocket.handler"] -------------------------------------------------------------------------------- /backend/mypy.ini: -------------------------------------------------------------------------------- 1 | [mypy] 2 | ignore_missing_imports = True 3 | 4 | [mypy-tests.*] 5 | ignore_errors = True -------------------------------------------------------------------------------- /backend/poetry.toml: -------------------------------------------------------------------------------- 1 | [virtualenvs] 2 | in-project = true 3 | -------------------------------------------------------------------------------- /backend/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | package-mode = false 3 | 4 | [tool.poetry.dependencies] 5 | python = "^3.13.0" 6 | fastapi = ">=0.109.1,<1" 7 | requests = "^2.32.0" 8 | types-requests = "^2.31.0" 9 | pydantic = "^2.10.2" 10 | pyhumps = "^3.8.0" 11 | uvicorn = ">=0.23.1,<1" 12 | python-ulid = "^1.1.0" 13 | boto3 = "^1.37.0" 14 | python-jose = "^3.4.0" 15 | pg8000 = "^1.30.3" 16 | argparse = "^1.4.0" 17 | tenacity = "<=8.3.0" 18 | langdetect = "^1.0.9" 19 | types-retry = ">=0.9.9.4,<1" 20 | opensearch-py = ">=2.0.0" 21 | requests-aws4auth = ">=1.0.0" 22 | duckduckgo-search = "^7.3.0" 23 | boto3-stubs = {extras = ["bedrock", "bedrock-agent-runtime", "bedrock-runtime", "boto3"], version = "^1.37.0"} 24 | firecrawl-py = "^1.11.1" 25 | reretry = "^0.11.8" 26 | 27 | [tool.poetry.group.dev.dependencies] 28 | mypy = "^1.15.0" 29 | black = "^24.8.0" 30 | 31 | [build-system] 32 | requires = ["poetry-core"] 33 | build-backend = "poetry.core.masonry.api" 34 | -------------------------------------------------------------------------------- /backend/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | PATH=$PATH:$LAMBDA_TASK_ROOT/bin \ 4 | PYTHONPATH=$PYTHONPATH:/opt/python:$LAMBDA_RUNTIME_DIR \ 5 | exec python -m uvicorn --port=$PORT app.main:app 6 | -------------------------------------------------------------------------------- /backend/s3_exporter/index.py: -------------------------------------------------------------------------------- 1 | import os 2 | from datetime import datetime, timedelta 3 | 4 | import boto3 5 | 6 | TABLE_ARN = os.environ["TABLE_ARN"] 7 | BUCKET_NAME = os.environ["BUCKET_NAME"] 8 | 9 | client = boto3.client("dynamodb") 10 | 11 | 12 | def handler(event, context): 13 | """Export the dynamodb table to S3 for the last hour to analyze the usage for admin.""" 14 | print(event) 15 | 16 | execution_time = datetime.strptime(event["time"], "%Y-%m-%dT%H:%M:%SZ") 17 | 18 | last_hour = (execution_time - timedelta(hours=1)).replace( 19 | minute=0, second=0, microsecond=0 20 | ) 21 | current_hour = execution_time.replace(minute=0, second=0, microsecond=0) 22 | 23 | s3_prefix = current_hour.strftime("%Y/%m/%d/%H") 24 | 25 | print(f"TABLE_ARN: {TABLE_ARN}") 26 | print(f"BUCKET_NAME: {BUCKET_NAME}") 27 | print(f"last_hour: {last_hour}") 28 | print(f"current_hour: {current_hour}") 29 | print(f"s3_prefix: {s3_prefix}") 30 | 31 | response = client.export_table_to_point_in_time( 32 | TableArn=TABLE_ARN, 33 | # ClientToken="string", 34 | S3Bucket=BUCKET_NAME, 35 | S3Prefix=s3_prefix, 36 | ExportType="INCREMENTAL_EXPORT", 37 | IncrementalExportSpecification={ 38 | # NOTE: The export period's start time is inclusive and the end time is exclusive. 39 | # Ref: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/S3DataExport_Requesting.html#S3DataExport_Requesting_Console 40 | "ExportFromTime": last_hour, 41 | "ExportToTime": current_hour, 42 | "ExportViewType": "NEW_AND_OLD_IMAGES", 43 | }, 44 | ) 45 | -------------------------------------------------------------------------------- /backend/s3_exporter/requirements.txt: -------------------------------------------------------------------------------- 1 | boto3==1.34.19 -------------------------------------------------------------------------------- /backend/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/backend/tests/__init__.py -------------------------------------------------------------------------------- /backend/tests/test_agent/test_tools/test_agent_tool.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | sys.path.append(".") 4 | import unittest 5 | from pprint import pprint 6 | 7 | from app.agents.tools.agent_tool import AgentTool 8 | from app.repositories.models.conversation import ( 9 | RelatedDocumentModel, 10 | TextToolResultModel, 11 | ) 12 | from app.repositories.models.custom_bot import BotModel 13 | from app.routes.schemas.conversation import type_model_name 14 | from pydantic import BaseModel, Field 15 | 16 | 17 | class TestArg(BaseModel): 18 | arg1: str = Field(..., description="test string") 19 | arg2: float = Field(..., description="test float") 20 | arg3: int = Field(..., description="test int") 21 | arg4: list[str] = Field(..., description="test list") 22 | 23 | 24 | def test_function( 25 | arg: TestArg, 26 | bot: BotModel | None, 27 | model: type_model_name | None, 28 | ) -> str: 29 | print(arg) 30 | return "test" 31 | 32 | 33 | class TestAgentTool(unittest.TestCase): 34 | def setUp(self) -> None: 35 | self.tool = AgentTool( 36 | name="test", 37 | description="test", 38 | args_schema=TestArg, 39 | function=test_function, 40 | ) 41 | 42 | def test_run(self): 43 | arg = TestArg( 44 | arg1="test", 45 | arg2=1.0, 46 | arg3=1, 47 | arg4=["test"], 48 | ) 49 | result = self.tool.run( 50 | tool_use_id="dummy", 51 | input=arg.model_dump(), 52 | model="claude-v3.5-sonnet-v2", 53 | ) 54 | self.assertEqual(result["status"], "success") 55 | 56 | 57 | if __name__ == "__main__": 58 | unittest.main() 59 | -------------------------------------------------------------------------------- /backend/tests/test_agent/test_tools/test_internet_search.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | sys.path.append(".") 4 | import unittest 5 | 6 | from app.agents.tools.internet_search import InternetSearchInput, internet_search_tool 7 | 8 | 9 | class TestInternetSearchTool(unittest.TestCase): 10 | def test_internet_search(self): 11 | # query = "Amazon Stock Price Today" 12 | query = "東京 焼肉" 13 | time_limit = "d" 14 | country = "jp-jp" 15 | arg = InternetSearchInput(query=query, time_limit=time_limit, country=country) 16 | response = internet_search_tool.run( 17 | tool_use_id="dummy", 18 | input=arg.model_dump(), 19 | model="claude-v3.5-sonnet-v2", 20 | ) 21 | self.assertIsInstance(response["related_documents"], list) 22 | self.assertEqual(response["status"], "success") 23 | print(response) 24 | 25 | 26 | if __name__ == "__main__": 27 | unittest.main() 28 | -------------------------------------------------------------------------------- /backend/tests/test_repositories/test_api_publication.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import unittest 3 | from pprint import pprint 4 | 5 | sys.path.append(".") 6 | 7 | from app.repositories.api_publication import ( 8 | create_api_key, 9 | delete_api_key, 10 | find_api_key_by_id, 11 | find_stack_by_bot_id, 12 | find_usage_plan_by_id, 13 | ) 14 | 15 | # Edit before running (Need to create a api stack. To do so, run codebuild project). 16 | usage_plan_id = "jukuef" 17 | bot_id = "01HRA01CB4H6GQPAG78YG49CQ4" 18 | 19 | 20 | class TestApiGateway(unittest.TestCase): 21 | def test_find_usage_plan_by_id(self): 22 | plan = find_usage_plan_by_id(usage_plan_id) 23 | pprint(plan) 24 | self.assertTrue(plan is not None) 25 | 26 | def test_find_api_key_by_id(self): 27 | plan = find_usage_plan_by_id(usage_plan_id) 28 | key_id = plan.key_ids[0] 29 | key = find_api_key_by_id(key_id, include_value=True) 30 | pprint(key) 31 | self.assertTrue(key is not None) 32 | self.assertEqual(key.id, key_id) 33 | self.assertEqual(key.enabled, True) 34 | 35 | def test_create_delete_api_key(self): 36 | res = create_api_key(usage_plan_id, "description") 37 | key = find_api_key_by_id(res.id, include_value=True) 38 | self.assertEqual(key.id, res.id) 39 | self.assertEqual(key.enabled, True) 40 | self.assertEqual(key.description, "description") 41 | delete_api_key(key.id) 42 | 43 | 44 | class TestCloudformation(unittest.TestCase): 45 | def test_find_stack_by_bot_id(self): 46 | stack = find_stack_by_bot_id(bot_id) 47 | pprint(stack) 48 | self.assertTrue(stack is not None) 49 | 50 | 51 | if __name__ == "__main__": 52 | unittest.main() 53 | -------------------------------------------------------------------------------- /backend/tests/test_repositories/test_models/test_firecrawl_config.py: -------------------------------------------------------------------------------- 1 | import json 2 | import sys 3 | import unittest 4 | 5 | sys.path.insert(0, ".") 6 | from uuid import uuid4 7 | 8 | import boto3 9 | from app.repositories.models.custom_bot import FirecrawlConfigModel 10 | from app.routes.schemas.bot import FirecrawlConfig 11 | 12 | API_KEY = "test-api-key" 13 | 14 | 15 | class TestFirecrawlConfigModel(unittest.TestCase): 16 | def tearDown(self) -> None: 17 | # Delete the secret after each test 18 | client = boto3.client("secretsmanager") 19 | client.delete_secret(SecretId=self.secret_arn) 20 | 21 | def test_lifecycle(self): 22 | # Create the model from input 23 | bot_id = str(uuid4()) 24 | input_config = FirecrawlConfig(api_key=API_KEY, max_results=15) 25 | model = FirecrawlConfigModel.from_firecrawl_config( 26 | input_config, "user123", bot_id 27 | ) 28 | 29 | # Secret ARN should not be empty 30 | self.assertNotEqual(model.secret_arn, "") 31 | self.secret_arn = model.secret_arn 32 | self.assertEqual(model.api_key, API_KEY) 33 | self.assertEqual(model.max_results, 15) 34 | 35 | serialized = model.model_dump() 36 | # API key should be empty 37 | self.assertEqual(serialized["api_key"], "") 38 | deserialized = FirecrawlConfigModel.model_validate(serialized) 39 | 40 | # API key should be loaded from Secrets Manager 41 | self.assertEqual(deserialized.api_key, API_KEY) 42 | self.assertEqual(deserialized.secret_arn, model.secret_arn) 43 | self.assertEqual(deserialized.max_results, 15) 44 | 45 | 46 | if __name__ == "__main__": 47 | unittest.main() 48 | -------------------------------------------------------------------------------- /backend/tests/test_repositories/test_usage_analysis.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import unittest 3 | 4 | sys.path.append(".") 5 | 6 | from pprint import pprint 7 | 8 | from app.repositories.usage_analysis import ( 9 | _find_cognito_user_by_id, 10 | _find_cognito_users_by_ids, 11 | find_bots_sorted_by_price, 12 | find_users_sorted_by_price, 13 | ) 14 | 15 | 16 | class TestUsageAnalysis(unittest.IsolatedAsyncioTestCase): 17 | async def test_find_bots_sorted_by_price(self): 18 | bots = await find_bots_sorted_by_price( 19 | limit=10, from_="2024010100", to_="2024120100" 20 | ) 21 | pprint([bot.model_dump() for bot in bots]) 22 | 23 | async def test_find_users_sorted_by_price(self): 24 | users = await find_users_sorted_by_price( 25 | limit=10, from_="2024010100", to_="2024120100" 26 | ) 27 | pprint([user.model_dump() for user in users]) 28 | 29 | 30 | class TestCognitoUser(unittest.IsolatedAsyncioTestCase): 31 | async def test_find_cognito_user_by_id(self): 32 | user = _find_cognito_user_by_id("07645ad8-b041-702e-9852-98b169c9f1b1") 33 | pprint(user) 34 | 35 | async def test_find_cognito_users_by_ids(self): 36 | users = await _find_cognito_users_by_ids( 37 | [ 38 | "07645ad8-b041-702e-9852-98b169c9f1b1", 39 | "c7345a28-00b1-70f1-632f-dcef9f455949", 40 | ] 41 | ) 42 | pprint(users) 43 | 44 | 45 | if __name__ == "__main__": 46 | unittest.main() 47 | -------------------------------------------------------------------------------- /backend/tests/test_routes/test_schemas/test_conversation.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | sys.path.append(".") 4 | import unittest 5 | 6 | from app.routes.schemas.conversation import FeedbackInput 7 | from pydantic import ValidationError 8 | 9 | 10 | class TestFeedbackInput(unittest.TestCase): 11 | def test_create_input_valid_no_category(self): 12 | obj = FeedbackInput(thumbs_up=True, category=None, comment="Excellent!") 13 | self.assertTrue(obj.thumbs_up) 14 | self.assertIsNone(obj.category) 15 | self.assertEqual(obj.comment, "Excellent!") 16 | 17 | def test_create_input_invalid_no_category(self): 18 | with self.assertRaises(ValidationError): 19 | FeedbackInput(thumbs_up=False, category=None, comment="Needs improvement.") 20 | 21 | def test_create_input_valid_no_comment(self): 22 | obj = FeedbackInput(thumbs_up=False, category="DISLIKE", comment=None) 23 | self.assertFalse(obj.thumbs_up) 24 | self.assertEqual(obj.category, "DISLIKE") 25 | self.assertIsNone(obj.comment) 26 | 27 | 28 | if __name__ == "__main__": 29 | unittest.main() 30 | -------------------------------------------------------------------------------- /backend/tests/test_stream/get_aws_logo.py: -------------------------------------------------------------------------------- 1 | import base64 2 | from io import BytesIO 3 | 4 | import requests 5 | 6 | 7 | def get_png_bytes_from_url(url: str) -> bytes: 8 | try: 9 | response = requests.get(url) 10 | response.raise_for_status() 11 | 12 | if "image/png" not in response.headers.get("Content-Type", ""): 13 | raise ValueError("Content-Type is not image/png") 14 | 15 | return BytesIO(response.content).getvalue() 16 | 17 | except requests.RequestException as e: 18 | raise Exception(f"Failed to fetch image from {url}: {str(e)}") 19 | except ValueError as e: 20 | raise Exception(str(e)) 21 | 22 | 23 | def get_aws_logo() -> bytes: 24 | URL = "https://a0.awsstatic.com/libra-css/images/logos/aws_logo_smile_179x109.png" 25 | return get_png_bytes_from_url(URL) 26 | 27 | 28 | def get_cdk_logo() -> bytes: 29 | URL = "https://docs.aws.amazon.com/cdk/api/v2/img/cdk-logo-small.png" 30 | return get_png_bytes_from_url(URL) 31 | -------------------------------------------------------------------------------- /backend/tests/test_stream/get_pdf.py: -------------------------------------------------------------------------------- 1 | import base64 2 | import os 3 | 4 | import requests 5 | 6 | 7 | def get_pdf_info(url) -> tuple[str, bytes]: 8 | response = requests.get(url) 9 | 10 | if response.status_code == 200: 11 | content_disposition = response.headers.get("Content-Disposition") 12 | if content_disposition: 13 | filename = content_disposition.split("filename=")[1].strip('"') 14 | else: 15 | filename = os.path.basename(url) 16 | 17 | return filename, response.content 18 | else: 19 | raise Exception(f"Failed to fetch PDF from {url}") 20 | 21 | 22 | def get_aws_overview() -> tuple[str, bytes]: 23 | # Get the AWS Activate General 4 PDF as base64 encoded string 24 | URL = "https://awsj-tc.s3-ap-northeast-1.amazonaws.com/Operations/Manuals/Public_Private/PC/AWS%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E5%8F%97%E8%AC%9B%E8%A6%81%E4%BB%B6+-+%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3+%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%AB%E3%83%BC%E3%83%A0_Webex.pdf" 25 | return get_pdf_info(URL) 26 | 27 | 28 | def get_test_markdown() -> str: 29 | return "##\nThis is a test text." 30 | -------------------------------------------------------------------------------- /backend/tests/test_utils/test_utils.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import sys 3 | import unittest 4 | 5 | logger = logging.getLogger(__name__) 6 | logger.setLevel(logging.DEBUG) 7 | 8 | sys.path.append(".") 9 | 10 | 11 | class TestUtils(unittest.TestCase): 12 | def test_get_bedrock_client_default(self): 13 | from app.utils import get_bedrock_client 14 | 15 | client = get_bedrock_client() 16 | assert client is not None 17 | 18 | cli_dict = client.__dict__ 19 | 20 | reg = cli_dict["_client_config"].region_name 21 | 22 | logger.debug("Region: ") 23 | logger.debug(reg) 24 | 25 | assert reg == "us-east-1" 26 | 27 | def test_get_bedrock_client_alt(self): 28 | from app.utils import get_bedrock_client 29 | 30 | client = get_bedrock_client("us-west-2") 31 | assert client is not None 32 | 33 | cli_dict = client.__dict__ 34 | 35 | reg = cli_dict["_client_config"].region_name 36 | 37 | logger.debug("Region: ") 38 | logger.debug(reg) 39 | 40 | assert reg == "us-west-2" 41 | 42 | 43 | if __name__ == "__main__": 44 | unittest.main() 45 | -------------------------------------------------------------------------------- /cdk/.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 | 10 | cdk.context.json -------------------------------------------------------------------------------- /cdk/.npmignore: -------------------------------------------------------------------------------- 1 | *.ts 2 | !*.d.ts 3 | 4 | # CDK asset staging directory 5 | .cdk.staging 6 | cdk.out 7 | -------------------------------------------------------------------------------- /cdk/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 2, 4 | "semi": true, 5 | "singleQuote": false, 6 | "printWidth": 80 7 | } 8 | -------------------------------------------------------------------------------- /cdk/README.md: -------------------------------------------------------------------------------- 1 | # Welcome to your CDK TypeScript project 2 | 3 | This is a blank project for CDK development with TypeScript. 4 | 5 | The `cdk.json` file tells the CDK Toolkit how to execute your app. 6 | 7 | ## Useful commands 8 | 9 | - `npm run build` compile typescript to js 10 | - `npm run watch` watch for changes and compile 11 | - `npm run test` perform the jest unit tests 12 | - `npx cdk deploy` deploy this stack to your default AWS account/region 13 | - `npx cdk diff` compare deployed stack with current state 14 | - `npx cdk synth` emits the synthesized CloudFormation template 15 | -------------------------------------------------------------------------------- /cdk/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 | -------------------------------------------------------------------------------- /cdk/lib/bedrock-region-resources.ts: -------------------------------------------------------------------------------- 1 | import { CfnOutput, RemovalPolicy, Stack, StackProps } from "aws-cdk-lib"; 2 | import { Construct } from "constructs"; 3 | import { 4 | BlockPublicAccess, 5 | Bucket, 6 | BucketEncryption, 7 | ObjectOwnership, 8 | } from "aws-cdk-lib/aws-s3"; 9 | 10 | 11 | interface BedrockRegionResourcesStackProps extends StackProps { 12 | } 13 | 14 | export class BedrockRegionResourcesStack extends Stack { 15 | readonly documentBucket: Bucket 16 | 17 | constructor( 18 | scope: Construct, 19 | id: string, 20 | props: BedrockRegionResourcesStackProps 21 | ) { 22 | super(scope, id, props); 23 | 24 | const prefix = Stack.of(this).region 25 | 26 | const accessLogBucket = new Bucket(this, `${prefix}AccessLogBucket`, { 27 | encryption: BucketEncryption.S3_MANAGED, 28 | blockPublicAccess: BlockPublicAccess.BLOCK_ALL, 29 | enforceSSL: true, 30 | removalPolicy: RemovalPolicy.DESTROY, 31 | objectOwnership: ObjectOwnership.OBJECT_WRITER, 32 | autoDeleteObjects: true, 33 | }); 34 | 35 | this.documentBucket = new Bucket(this, `${prefix}DocumentBucket`, { 36 | encryption: BucketEncryption.S3_MANAGED, 37 | blockPublicAccess: BlockPublicAccess.BLOCK_ALL, 38 | enforceSSL: true, 39 | removalPolicy: RemovalPolicy.DESTROY, 40 | objectOwnership: ObjectOwnership.OBJECT_WRITER, 41 | autoDeleteObjects: true, 42 | serverAccessLogsBucket: accessLogBucket, 43 | serverAccessLogsPrefix: "DocumentBucket", 44 | }); 45 | 46 | new CfnOutput(this, "DocumentBucketName", { 47 | value: this.documentBucket.bucketName, 48 | }); 49 | 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /cdk/lib/constants/docker.ts: -------------------------------------------------------------------------------- 1 | export const excludeDockerImage = [ 2 | ".mypy_cache", 3 | ".venv", 4 | "test", 5 | "tests", 6 | "node_modules", 7 | "dist", 8 | "dev-dist", 9 | ".env", 10 | ".env.local", 11 | ] -------------------------------------------------------------------------------- /cdk/lib/utils/bedrock-guardrails.ts: -------------------------------------------------------------------------------- 1 | export enum Threshold { 2 | NONE = 'NONE', 3 | LOW = 'LOW', 4 | MEDIUM = 'MEDIUM', 5 | HIGH = 'HIGH' 6 | } 7 | 8 | export function getThreshold(inputParam: number | undefined): Threshold { 9 | if ( inputParam === undefined) { 10 | return Threshold.NONE; 11 | } 12 | const threshold: { [key: number]: Threshold } = { 13 | 0: Threshold.NONE, 14 | 1: Threshold.LOW, 15 | 2: Threshold.MEDIUM, 16 | 3: Threshold.HIGH 17 | };Threshold 18 | 19 | return threshold[inputParam] || Threshold.NONE; 20 | } 21 | -------------------------------------------------------------------------------- /cdk/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cdk", 3 | "version": "0.1.0", 4 | "bin": { 5 | "cdk": "bin/cdk.js" 6 | }, 7 | "scripts": { 8 | "build": "tsc", 9 | "watch": "tsc -w", 10 | "test": "jest", 11 | "cdk": "cdk" 12 | }, 13 | "devDependencies": { 14 | "@aws-prototyping-sdk/pdk-nag": "^0.19.68", 15 | "@types/jest": "^29.5.3", 16 | "@types/node": "20.4.2", 17 | "aws-cdk": "^2.178.2", 18 | "jest": "^29.6.1", 19 | "ts-jest": "^29.1.1", 20 | "ts-node": "^10.9.1", 21 | "typescript": "~5.1.6", 22 | "zod": "^3.24.2" 23 | }, 24 | "dependencies": { 25 | "@aws-cdk/aws-glue-alpha": "^2.155.0-alpha.0", 26 | "@aws-cdk/aws-lambda-python-alpha": "^2.155.0-alpha.0", 27 | "@aws-sdk/util-dynamodb": "^3.693.0", 28 | "@cdklabs/generative-ai-cdk-constructs": "^0.1.274", 29 | "aws-cdk-lib": "^2.177.0", 30 | "cdk-aws-lambda-powertools-layer": "^3.7.0", 31 | "constructs": "^10.0.0", 32 | "deploy-time-build": "^0.3.2", 33 | "effect": "^2.4.3", 34 | "source-map-support": "^0.5.21" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /cdk/parameter.ts: -------------------------------------------------------------------------------- 1 | import { BedrockChatParametersInput } from "./lib/utils/parameter-models"; 2 | 3 | export const bedrockChatParams = new Map(); 4 | // You can define multiple environments and their parameters here 5 | // bedrockChatParams.set("dev", {}); 6 | 7 | // If you define "default" environment here, parameters in cdk.json are ignored 8 | // bedrockChatParams.set("default", {}); 9 | -------------------------------------------------------------------------------- /cdk/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 | -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_de-DE_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカル開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_de-DE_ja-JP.md) をお読みください。 6 | 7 | ## フロントエンド開発 8 | 9 | この例では、`npx cdk deploy`でデプロイされた`API Gateway`、`Cognito`などのAWSリソースを使用しながら、フロントエンドをローカルで変更および起動できます。 10 | 11 | 1. AWS環境へのデプロイについては、[CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照してください。 12 | 2. `frontend/.env.template`をコピーし、`frontend/.env.local`として保存します。 13 | 3. `npx cdk deploy`の出力結果(`BedrockChatStack.AuthUserPoolClientIdXXXXX`など)に基づいて、`.env.local`の内容を入力します。 14 | 4. 次のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (オプション、推奨) Pre-Commitフックの設定 21 | 22 | GitHub Workflowsを型チェックとリンティングのために導入しました。これらはPull Requestが作成されたときに実行されますが、リンティングが完了するのを待つのは良い開発体験ではありません。そのため、これらのリンティングタスクをコミット段階で自動的に実行する必要があります。これを実現するために、[Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install)を導入しました。必須ではありませんが、効率的な開発体験のために採用することをお勧めします。また、[Prettier](https://prettier.io/)でTypeScriptのフォーマットを強制していませんが、コードレビュー時の不要な差分を避けるのに役立つため、貢献の際に採用していただけると幸いです。 23 | 24 | ### Lefthookのインストール 25 | 26 | 詳細は[こちら](https://github.com/evilmartians/lefthook#install)をご覧ください。MacとHomebrewユーザーの場合は、`brew install lefthook`を実行するだけです。 27 | 28 | ### Poetryのインストール 29 | 30 | これは、Pythonコードのリンティングがmypyとblackに依存しているため必要です。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(Poetryを環境にインストールしたくない場合) 35 | source .venv/bin/activate # オプション(Poetryを環境にインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細は[バックエンドのREADME](../backend/README_de-DE_ja-JP.md)をご覧ください。 41 | 42 | ### Pre-Commitフックの作成 43 | 44 | プロジェクトのルートディレクトリで`lefthook install`を実行するだけです。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_es-ES_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカル開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_es-ES_ja-JP.md) を参照してください。 6 | 7 | ## フロントエンド開発 8 | 9 | この例では、`npx cdk deploy`でデプロイされたAWSリソース(`API Gateway`、`Cognito`など)を使用して、ローカルでフロントエンドを変更および起動できます。 10 | 11 | 1. AWS環境にデプロイするには、[CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照してください。 12 | 2. `frontend/.env.template`をコピーし、`frontend/.env.local`として保存します。 13 | 3. `.env.local`の内容を`npx cdk deploy`の出力結果(`BedrockChatStack.AuthUserPoolClientIdXXXXX`など)に基づいて入力します。 14 | 4. 次のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (オプション、推奨) pre-commitフックの設定 21 | 22 | GitHub ワークフローで型チェックとリンティングを導入しました。これらは pull request 作成時に実行されますが、リンティングが完了するまで待つのは開発体験としては良くありません。そのため、これらのリンティングタスクはコミット段階で自動的に実行されるべきです。これを実現するために、[Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install) を導入しました。必須ではありませんが、効率的な開発体験のために採用することをお勧めします。また、TypeScriptの書式を [Prettier](https://prettier.io/) で強制はしていませんが、コードレビュー時の不要な差分を防ぐため、コントリビュート時に採用していただけると幸いです。 23 | 24 | ### Lefthookのインストール 25 | 26 | [こちら](https://github.com/evilmartians/lefthook#install)を参照してください。MacとHomebrewのユーザーの場合、`brew install lefthook` を実行するだけです。 27 | 28 | ### Poetryのインストール 29 | 30 | これは、Pythonのコードレビューが `mypy` と `black` に依存しているためです。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(poetryを独自の環境にインストールしたくない場合) 35 | source .venv/bin/activate # オプション(poetryを独自の環境にインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細については、[バックエンドのREADME](../backend/README_es-ES_ja-JP.md)を参照してください。 41 | 42 | ### pre-commitフックの作成 43 | 44 | プロジェクトのルートディレクトリで `lefthook install` を実行するだけです。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_fr-FR_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカル開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_fr-FR_ja-JP.md) を参照してください。 6 | 7 | ## フロントエンド開発 8 | 9 | この例では、`npx cdk deploy`でデプロイされたAWSリソース(`API Gateway`、`Cognito`など)を使用して、フロントエンドをローカルで変更および起動できます。 10 | 11 | 1. AWS環境へのデプロイについては、[CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照してください。 12 | 2. `frontend/.env.template`をコピーし、`frontend/.env.local`として保存します。 13 | 3. `.env.local`の内容を`npx cdk deploy`の出力結果(`BedrockChatStack.AuthUserPoolClientIdXXXXX`など)に基づいて入力します。 14 | 4. 次のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (オプション、推奨) pre-commitフックの設定 21 | 22 | GitHub workflowsを型チェックとリンティングのために導入しました。これらはPull Requestの作成時に実行されますが、リンティングが完了するまで待つことは開発体験として良くありません。そのため、これらのリンティングタスクはコミット段階で自動的に実行される必要があります。これを実現するために、[Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install)をメカニズムとして導入しました。必須ではありませんが、効率的な開発体験のために採用することをお勧めします。また、[Prettier](https://prettier.io/)でTypeScriptのフォーマッティングを適用していませんが、コード レビュー時の不要な差分を防ぐため、貢献する際にPrettierを採用していただければ幸いです。 23 | 24 | ### Lefthookのインストール 25 | 26 | [こちら](https://github.com/evilmartians/lefthook#install)を参照してください。Homebrewを使用しているMacの場合は、単に`brew install lefthook`を実行してください。 27 | 28 | ### Poetryのインストール 29 | 30 | これは、Python コードのリンティングが `mypy` と `black` に依存しているため必要です。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(poetryを環境にインストールしたくない場合) 35 | source .venv/bin/activate # オプション(poetryを環境にインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細については、[バックエンドのREADME](../backend/README_fr-FR_ja-JP.md)を参照してください。 41 | 42 | ### pre-commitフックの作成 43 | 44 | プロジェクトのルートディレクトリで単に `lefthook install` を実行してください。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_it-IT_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカル開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_it-IT_ja-JP.md) を参照してください。 6 | 7 | ## フロントエンド開発 8 | 9 | この例では、`npx cdk deploy`で配置されたAWSリソース(`API Gateway`、`Cognito`など)を使用して、フロントエンドをローカルで変更および起動できます。 10 | 11 | 1. AWS環境への配置については、[CDKを使用した配置](../README.md#deploy-using-cdk)を参照してください。 12 | 2. `frontend/.env.template`をコピーし、`frontend/.env.local`として保存します。 13 | 3. `npx cdk deploy`の出力結果(`BedrockChatStack.AuthUserPoolClientIdXXXXX`など)に基づいて、`.env.local`の内容を入力します。 14 | 4. 次のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (オプション、推奨) pre-commitフックの設定 21 | 22 | GitHub workflowでtype-checkingとlintingを導入しました。これらはPull Requestが作成されたときに実行されますが、lintingが完了するまで待つのは開発体験として良くありません。そのため、これらのlintingタスクはコミット時に自動的に実行されるべきです。この目的を達成するために、[Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install)を導入しました。必須ではありませんが、効率的な開発体験のために採用することをお勧めします。また、TypeScriptの整形を[Prettier](https://prettier.io/)で設定していない場合でも、コード・レビュー時の不要な差分を防ぐため、コントリビュート時に採用することを歓迎します。 23 | 24 | ### Lefthookのインストール 25 | 26 | [こちら](https://github.com/evilmartians/lefthook#install)を参照してください。Homebrewを使用するMacの場合、`brew install lefthook`を実行するだけです。 27 | 28 | ### Poetryのインストール 29 | 30 | これは、PythonコードのlintingがPython `mypy`と`black`に依存しているために必要です。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(poetryを環境にインストールしない場合) 35 | source .venv/bin/activate # オプション(poetryを環境にインストールしない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細については、[バックエンドのREADME](../backend/README_it-IT_ja-JP.md)を参照してください。 41 | 42 | ### pre-commitフックの作成 43 | 44 | プロジェクトのルートディレクトリで`lefthook install`を実行するだけです。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカル開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_ja-JP.md) を参照してください。 6 | 7 | ## フロントエンド開発 8 | 9 | このサンプルでは、`npx cdk deploy`でデプロイされたAWSリソース(`API Gateway`、`Cognito`など)を使用して、フロントエンドをローカルで変更および起動できます。 10 | 11 | 1. AWS環境へのデプロイについては、[CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照してください。 12 | 2. `frontend/.env.template`をコピーし、`frontend/.env.local`として保存します。 13 | 3. `.env.local`の内容を`npx cdk deploy`の出力結果(`BedrockChatStack.AuthUserPoolClientIdXXXXX`など)に基づいて入力します。 14 | 4. 次のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (オプション、推奨)プレコミットフックのセットアップ 21 | 22 | 型チェックとリンティングのためのGitHubワークフローを導入しました。これらはプルリクエストが作成されたときに実行されますが、リンティングの完了を待つことは良い開発体験ではありません。そのため、これらのリンティングタスクはコミット段階で自動的に実行されるべきです。効率的な開発体験を実現するために、[Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install)をメカニズムとして導入しました。必須ではありませんが、採用することをお勧めします。また、[Prettier](https://prettier.io/)でTypeScriptのフォーマットを強制してはいませんが、コードレビュー時の不要な差分を防ぐため、貢献する際に採用していただけると幸いです。 23 | 24 | ### Lefthookのインストール 25 | 26 | [こちら](https://github.com/evilmartians/lefthook#install)を参照してください。MacとHomebrewユーザーの場合は、`brew install lefthook`を実行するだけです。 27 | 28 | ### Poetryのインストール 29 | 30 | これは、Pythonコードのリンティングが`mypy`と`black`に依存しているため必要です。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(poetryを環境にインストールしたくない場合) 35 | source .venv/bin/activate # オプション(poetryを環境にインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細については、[バックエンドのREADME](../backend/README_ja-JP.md)を確認してください。 41 | 42 | ### プレコミットフックの作成 43 | 44 | プロジェクトのルートディレクトリで`lefthook install`を実行するだけです。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_ko-KR.md: -------------------------------------------------------------------------------- 1 | # 로컬 개발 2 | 3 | ## 백엔드 개발 4 | 5 | [backend/README](../backend/README_ko-KR.md)를 참조하세요. 6 | 7 | ## 프론트엔드 개발 8 | 9 | 이 샘플에서는 `npx cdk deploy`로 배포된 AWS 리소스(`API Gateway`, `Cognito` 등)를 사용하여 프론트엔드를 로컬에서 수정하고 실행할 수 있습니다. 10 | 11 | 1. AWS 환경에 배포하려면 [CDK로 배포](../README.md#deploy-using-cdk)를 참조하세요. 12 | 2. `frontend/.env.template`을 복사하여 `frontend/.env.local`로 저장합니다. 13 | 3. `npx cdk deploy`의 출력 결과(예: `BedrockChatStack.AuthUserPoolClientIdXXXXX`)를 기반으로 `.env.local`의 내용을 채웁니다. 14 | 4. 다음 명령을 실행합니다: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (선택사항, 권장) 사전 커밋 훅 설정 21 | 22 | GitHub 워크플로우를 통해 타입 검사 및 린팅을 도입했습니다. 이러한 작업은 풀 리퀘스트가 생성될 때 실행되지만, 린팅이 완료될 때까지 기다리는 것은 좋은 개발 경험이 아닙니다. 따라서 이러한 린팅 작업은 커밋 단계에서 자동으로 수행되어야 합니다. [Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install)을 이를 달성하기 위한 메커니즘으로 도입했습니다. 필수는 아니지만 효율적인 개발 경험을 위해 채택하는 것을 권장합니다. 또한 [Prettier](https://prettier.io/)로 TypeScript 포맷팅을 강제하지는 않지만, 코드 리뷰 중 불필요한 차이를 방지하기 위해 기여할 때 채택해 주시면 감사하겠습니다. 23 | 24 | ### Lefthook 설치 25 | 26 | [여기](https://github.com/evilmartians/lefthook#install)를 참조하세요. Mac과 Homebrew 사용자라면 `brew install lefthook`을 실행하기만 하면 됩니다. 27 | 28 | ### Poetry 설치 29 | 30 | Python 코드 린팅이 `mypy`와 `black`에 의존하기 때문에 필요합니다. 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # 선택사항 (poetry를 환경에 설치하고 싶지 않은 경우) 35 | source .venv/bin/activate # 선택사항 (poetry를 환경에 설치하고 싶지 않은 경우) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 자세한 내용은 [백엔드 README](../backend/README_ko-KR.md)를 확인하세요. 41 | 42 | ### 사전 커밋 훅 생성 43 | 44 | 프로젝트의 루트 디렉토리에서 `lefthook install`을 실행하기만 하면 됩니다. -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_ko-KR_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカル開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_ko-KR_ja-JP.md)を参照してください。 6 | 7 | ## フロントエンド開発 8 | 9 | このサンプルでは、`npx cdk deploy`でデプロイされたAWSリソース(`API Gateway`、`Cognito`など)を使用して、フロントエンドをローカルで修正および実行できます。 10 | 11 | 1. AWS環境にデプロイするには、[CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照してください。 12 | 2. `frontend/.env.template`をコピーして`frontend/.env.local`として保存します。 13 | 3. `npx cdk deploy`の出力結果(例:`BedrockChatStack.AuthUserPoolClientIdXXXXX`)に基づいて、`.env.local`の内容を入力します。 14 | 4. 次のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (オプション、推奨) プレコミットフックの設定 21 | 22 | GitHub ワークフローで型チェックとリンティングを導入しました。これはプルリクエストが作成されたときに実行されますが、リンティングが完了するまで待つのは良い開発体験ではありません。そのため、これらのリンティングタスクはコミット段階で自動的に実行される必要があります。これには [Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install) をメカニズムとして導入しました。必須ではありませんが、効率的な開発体験のために採用することをお勧めします。また、[Prettier](https://prettier.io/) で TypeScript のフォーマットを強制はしませんが、コードレビュー中の不要な差分を防ぐため、貢献する際に採用していただくことをお願いします。 23 | 24 | ### Lefthookのインストール 25 | 26 | [こちら](https://github.com/evilmartians/lefthook#install)を参照してください。MacとHomebrewユーザーの場合は、`brew install lefthook` を実行してください。 27 | 28 | ### Poetryのインストール 29 | 30 | Python コードのリンティングが `mypy` と `black` に依存しているため、必要です。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(poetryを環境にインストールしたくない場合) 35 | source .venv/bin/activate # オプション(poetryを環境にインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細は [バックエンドREADME](../backend/README_ko-KR_ja-JP.md) を確認してください。 41 | 42 | ### プレコミットフックの作成 43 | 44 | プロジェクトのルートディレクトリで `lefthook install` を実行してください。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_ms-MY_ja-JP.md: -------------------------------------------------------------------------------- 1 | # 地域開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_ms-MY_ja-JP.md) を参照してください。 6 | 7 | ## フロントエンド開発 8 | 9 | この例では、`npx cdk deploy`で使用されたAWSリソース(`API Gateway`、`Cognito`など)を使用して、フロントエンドをローカルで変更および起動できます。 10 | 11 | 1. AWS環境で使用するには、[CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照してください。 12 | 2. `frontend/.env.template`をコピーし、`frontend/.env.local`として保存します。 13 | 3. `.env.local`の内容を`npx cdk deploy`の出力結果(`BedrockChatStack.AuthUserPoolClientIdXXXXX`など)に基づいて入力します。 14 | 4. 次のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (推奨オプション) プレコミットフックを準備する 21 | 22 | 私たちはコードの種類を確認し、レビューするGitHubワークフローを導入しました。これはプルリクエストが作成されたときに行われますが、レビューの完了を待つ開発体験は良くありません。そのため、このレビュータスクは自動的にコミット時に行われるべきです。私たちは[Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install)をこれを達成するためのメカニズムとして導入しました。これは必須ではありませんが、効率的な開発体験のために使用することをお勧めします。さらに、TypeScriptの自動フォーマットを[Prettier](https://prettier.io/)で強制していませんが、不要な差分を防ぐために貢献する際に使用していただければ幸いです。 23 | 24 | ### Lefthookをインストールする 25 | 26 | [こちら](https://github.com/evilmartians/lefthook#install)を参照してください。macとHomebrewのユーザーの場合は、`brew install lefthook`を実行するだけです。 27 | 28 | ### Poetryをインストールする 29 | 30 | これはPythonコードのレビューが`mypy`と`black`に依存しているために必要です。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(poetryを環境にインストールしたくない場合) 35 | source .venv/bin/activate # オプション(poetryを環境にインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細については、[バックエンドのREADME](../backend/README_ms-MY_ja-JP.md)を確認してください。 41 | 42 | ### プレコミットフックを作成する 43 | 44 | プロジェクトのルートディレクトリで`lefthook install`を実行するだけです。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_nb-NO_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカル開発 2 | 3 | ## バックエンド開発 4 | 5 | [バックエンド/README](../backend/README_nb-NO_ja-JP.md) を参照してください。 6 | 7 | ## フロントエンド開発 8 | 9 | この例では、`npx cdk deploy`でデプロイされたAWSリソース(`API Gateway`、`Cognito`など)を使用して、ローカルでフロントエンドを変更および起動できます。 10 | 11 | 1. AWS環境へのデプロイは[CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照してください。 12 | 2. `frontend/.env.template`をコピーし、`frontend/.env.local`として保存します。 13 | 3. `.env.local`の内容を`npx cdk deploy`の結果(`BedrockChatStack.AuthUserPoolClientIdXXXXX`など)に基づいて入力します。 14 | 4. 次のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (オプション、推奨) pre-commitフックの設定 21 | 22 | GitHub ワークフローを型チェックとリンティングのために導入しました。これらは Pull Request 作成時に実行されますが、リンティングの完了を待つ開発体験は良くありません。そのため、これらのリンティングタスクをコミット段階で自動的に実行する必要があります。これを実現するために [Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install) を導入しました。必須ではありませんが、効率的な開発体験のために使用することをお勧めします。また、[Prettier](https://prettier.io/) で TypeScript のフォーマットを強制していませんが、コードレビュー時の不要な差分を防ぐため、貢献する際に使用していただけると幸いです。 23 | 24 | ### Lefthookのインストール 25 | 26 | [こちら](https://github.com/evilmartians/lefthook#install)を参照してください。MacユーザーでHomebrewを使用している場合は、単に `brew install lefthook` を実行してください。 27 | 28 | ### Poetryのインストール 29 | 30 | これは、Pythonコードのリンティングが `mypy` と `black` に依存しているためです。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(poetryを環境にインストールしたくない場合) 35 | source .venv/bin/activate # オプション(poetryを環境にインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細については、[バックエンドREADME](../backend/README_nb-NO_ja-JP.md)を参照してください。 41 | 42 | ### pre-commitフックの作成 43 | 44 | プロジェクトのルートディレクトリで単に `lefthook install` を実行してください。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_pl-PL_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカル開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_pl-PL_ja-JP.md) を確認してください。 6 | 7 | ## フロントエンド開発 8 | 9 | この例では、`npx cdk deploy`でデプロイされたAWSリソース(`API Gateway`、`Cognito`など)を使用して、フロントエンドをローカルで変更および実行できます。 10 | 11 | 1. AWS環境にデプロイするには、[CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照してください。 12 | 2. `frontend/.env.template`ファイルをコピーし、`frontend/.env.local`として保存します。 13 | 3. `npx cdk deploy`の出力結果(`BedrockChatStack.AuthUserPoolClientIdXXXXX`など)に基づいて、`.env.local`の内容を入力します。 14 | 4. 次のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (オプション、推奨) pre-commitフックの設定 21 | 22 | GitHub workflowsを使用して型チェックとリンティングを行っています。これらはPull Request作成時に実行されますが、リンティングの完了を待つことは開発者体験として良くありません。そのため、これらのリンティングタスクはコミット時に自動的に実行されるべきです。この目的のために[Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install)を導入しました。必須ではありませんが、効率的な開発体験のために採用することをお勧めします。また、TypeScriptの[Prettier](https://prettier.io/)によるフォーマットを強制はしていませんが、コードレビュー時の不要な差分を防ぐため、使用していただけると幸いです。 23 | 24 | ### Lefthookをインストールする 25 | 26 | [こちら](https://github.com/evilmartians/lefthook#install)を参照してください。MacとHomebrewを使用している場合は、単に`brew install lefthook`を実行してください。 27 | 28 | ### poetryをインストールする 29 | 30 | Python コードのリンティングが `mypy` と `black` に依存しているため、これが必要です。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(poetryを独自の環境にインストールしたくない場合) 35 | source .venv/bin/activate # オプション(poetryを独自の環境にインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細については、[バックエンドのREADME](../backend/README_pl-PL_ja-JP.md)を確認してください。 41 | 42 | ### pre-commitフックを作成する 43 | 44 | プロジェクトのルートディレクトリで`lefthook install`を実行するだけです。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_th-TH_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカルネットワーク上での開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_th-TH_ja-JP.md) を参照してください。 6 | 7 | ## フロントエンドの開発 8 | 9 | この例では、`npx cdk deploy` でデプロイされた AWS リソース(`API Gateway`、`Cognito` など)を使用して、ローカル環境でフロントエンドを編集および実行できます。 10 | 11 | 1. AWS 環境へのデプロイについては、[CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照してください 12 | 2. `frontend/.env.template` をコピーし、`frontend/.env.local` として保存します 13 | 3. `npx cdk deploy` の結果(例:`BedrockChatStack.AuthUserPoolClientIdXXXXX`)に基づいて、`.env.local` の内容を入力します 14 | 4. 次のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (推奨) コミット前フックの設定 21 | 22 | GitHub ワークフローを追加して、Pull Request 作成時に型チェックとコードレビューを行いますが、コードレビューの完了を待つことは最適な開発体験ではありません。そのため、これらのコードチェックは自動的にコミット時に実行されるべきです。この目的を達成するために、[Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install) をお勧めします。必須ではありませんが、効率的な開発体験のために導入することをお勧めします。また、[Prettier](https://prettier.io/) による TypeScript のフォーマット強制はしませんが、貢献する際に使用していただければ幸いです。不要な差分を防ぐのに役立ちます。 23 | 24 | ### Lefthookのインストール 25 | 26 | Mac と Homebrew を使用している場合は、`brew install lefthook` を実行するだけです。詳細は[こちら](https://github.com/evilmartians/lefthook#install)を参照してください。 27 | 28 | ### Poetryのインストール 29 | 30 | Python コードチェックが `mypy` と `black` に依存しているため、必要です。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション (Poetryを環境にインストールしたくない場合) 35 | source .venv/bin/activate # オプション (Poetryを環境にインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細については、[バックエンドの README](../backend/README_th-TH_ja-JP.md) を確認してください。 41 | 42 | ### コミット前フックの作成 43 | 44 | プロジェクトのルートディレクトリで `lefthook install` を実行するだけです。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_vi-VN_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカル開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_vi-VN_ja-JP.md) を参照してください。 6 | 7 | ## フロントエンドの開発 8 | 9 | このテンプレートでは、`npx cdk deploy`でデプロイされたAWSリソース(`API Gateway`、`Cognito`など)を使用して、フロントエンドをローカルで変更および起動できます。 10 | 11 | 1. AWS環境にデプロイするには、[CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照してください。 12 | 2. `frontend/.env.template`をコピーして`frontend/.env.local`として保存します。 13 | 3. `.env.local`の内容を`npx cdk deploy`の出力結果(`BedrockChatStack.AuthUserPoolClientIdXXXXX`など)に基づいて入力します。 14 | 4. 以下のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (オプション、推奨) pre-commitフックの設定 21 | 22 | GitHub workflowsを使用してスタイルチェックとエラーチェックを導入しました。これらのチェックはPull Requestが作成されたときに実行されますが、エラーチェックの完了を待つ必要があるのは良い開発体験ではありません。そのため、これらのエラーチェックタスクはコミット時に自動的に実行されるべきです。この目的のために、[Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install)を導入しました。これは必須ではありませんが、効率的な開発体験のために採用することをお勧めします。また、[Prettier](https://prettier.io/)でTypeScriptの書式を強制はしていませんが、コントリビュートする際に適用していただけると、不要な差分を防ぐことができるため、大変感謝します。 23 | 24 | ### Lefthookのインストール 25 | 26 | [こちら](https://github.com/evilmartians/lefthook#install)を参照してください。Macとhomebrewユーザーの場合は、`brew install lefthook`を実行するだけです。 27 | 28 | ### Poetryのインストール 29 | 30 | これは、Python コードのエラーチェックが `mypy` と `black` に依存しているため必要です。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(poetryを自分の環境にインストールしたくない場合) 35 | source .venv/bin/activate # オプション(poetryを自分の環境にインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細については、[backendのREADME](../backend/README_vi-VN_ja-JP.md)を確認してください。 41 | 42 | ### pre-commitフックの作成 43 | 44 | プロジェクトのルートディレクトリで `lefthook install` を実行するだけです。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_zh-CN.md: -------------------------------------------------------------------------------- 1 | # 本地开发 2 | 3 | ## 后端开发 4 | 5 | 查看 [backend/README](../backend/README_zh-CN.md)。 6 | 7 | ## 前端开发 8 | 9 | 在此示例中,您可以使用已通过 `npx cdk deploy` 部署的 AWS 资源(`API Gateway`、`Cognito` 等)在本地修改和启动前端。 10 | 11 | 1. 参考 [使用 CDK 部署](../README.md#deploy-using-cdk) 以在 AWS 环境中部署。 12 | 2. 复制 `frontend/.env.template` 并将其保存为 `frontend/.env.local`。 13 | 3. 根据 `npx cdk deploy` 的输出结果(如 `BedrockChatStack.AuthUserPoolClientIdXXXXX`)填写 `.env.local` 的内容。 14 | 4. 执行以下命令: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (可选,推荐)设置预提交钩子 21 | 22 | 我们引入了用于类型检查和代码风格检查的 GitHub 工作流。这些工作流在创建 Pull Request 时执行,但等待代码风格检查完成后再继续并不是一个好的开发体验。因此,这些代码风格检查任务应在提交阶段自动执行。我们引入了 [Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install) 作为实现这一目标的机制。这不是强制性的,但我们建议采用它以获得高效的开发体验。此外,虽然我们不强制使用 [Prettier](https://prettier.io/) 进行 TypeScript 格式化,但我们希望你在贡献代码时能够采用它,因为这有助于防止代码审查时出现不必要的差异。 23 | 24 | ### 安装 Lefthook 25 | 26 | 请参考[此处](https://github.com/evilmartians/lefthook#install)。如果你是 Mac 并使用 Homebrew,只需运行 `brew install lefthook`。 27 | 28 | ### 安装 Poetry 29 | 30 | 这是必需的,因为 Python 代码风格检查依赖于 `mypy` 和 `black`。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # 可选(如果你不想在环境中安装 poetry) 35 | source .venv/bin/activate # 可选(如果你不想在环境中安装 poetry) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 更多详细信息,请查看 [backend README](../backend/README_zh-CN.md)。 41 | 42 | ### 创建预提交钩子 43 | 44 | 只需在项目根目录运行 `lefthook install`。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_zh-CN_ja-JP.md: -------------------------------------------------------------------------------- 1 | # ローカル開発 2 | 3 | ## バックエンド開発 4 | 5 | [backend/README](../backend/README_zh-CN_ja-JP.md) を参照してください。 6 | 7 | ## フロントエンド開発 8 | 9 | この例では、`npx cdk deploy` でデプロイされた AWS リソース(`API Gateway`、`Cognito` など)をローカルで変更および起動できます。 10 | 11 | 1. [CDKを使用したデプロイ](../README.md#deploy-using-cdk)を参照して、AWS環境にデプロイします。 12 | 2. `frontend/.env.template` をコピーし、`frontend/.env.local` として保存します。 13 | 3. `npx cdk deploy` の出力結果(`BedrockChatStack.AuthUserPoolClientIdXXXXX` など)に基づいて、`.env.local` の内容を入力します。 14 | 4. 以下のコマンドを実行します: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (可选,推荐)プレコミットフックの設定 21 | 22 | 私たちは型チェックとコードスタイルチェックのための GitHub ワークフローを導入しました。これらのワークフローはプルリクエスト作成時に実行されますが、コードスタイルチェックの完了を待つことは良い開発体験ではありません。そのため、これらのコードスタイルチェックタスクはコミット段階で自動的に実行されるべきです。この目的を達成するために、[Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install) を導入しました。これは必須ではありませんが、効率的な開発体験を得るためにお勧めします。また、[Prettier](https://prettier.io/) を使用して TypeScript をフォーマットすることは強制していませんが、コード審査時の不要な差分を防ぐため、コントリビュート時に採用することをお勧めします。 23 | 24 | ### Lefthookのインストール 25 | 26 | [こちら](https://github.com/evilmartians/lefthook#install)を参照してください。Macで Homebrew を使用している場合は、`brew install lefthook` を実行するだけです。 27 | 28 | ### Poetryのインストール 29 | 30 | Python コードのコードスタイルチェックが `mypy` と `black` に依存しているため、これは必要です。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # オプション(環境に poetry をインストールしたくない場合) 35 | source .venv/bin/activate # オプション(環境に poetry をインストールしたくない場合) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 詳細については、[バックエンドのREADME](../backend/README_zh-CN_ja-JP.md)を参照してください。 41 | 42 | ### プレコミットフックの作成 43 | 44 | プロジェクトのルートディレクトリで `lefthook install` を実行するだけです。 -------------------------------------------------------------------------------- /docs/LOCAL_DEVELOPMENT_zh-TW.md: -------------------------------------------------------------------------------- 1 | # 本地開發 2 | 3 | ## 後端開發 4 | 5 | 請參閱 [backend/README](../backend/README_zh-TW.md)。 6 | 7 | ## 前端開發 8 | 9 | 在此範例中,您可以使用已使用 `npx cdk deploy` 部署的 AWS 資源(`API Gateway`、`Cognito` 等)在本機修改和啟動前端。 10 | 11 | 1. 參考 [使用 CDK 部署](../README.md#deploy-using-cdk) 以在 AWS 環境上部署。 12 | 2. 複製 `frontend/.env.template` 並將其儲存為 `frontend/.env.local`。 13 | 3. 根據 `npx cdk deploy` 的輸出結果(例如 `BedrockChatStack.AuthUserPoolClientIdXXXXX`)填寫 `.env.local` 的內容。 14 | 4. 執行以下命令: 15 | 16 | ```zsh 17 | cd frontend && npm ci && npm run dev 18 | ``` 19 | 20 | ## (可選,建議) 設置預提交鉤子 21 | 22 | 我們已引入 GitHub 工作流程進行類型檢查和程式碼風格檢查。這些工作流程在建立 Pull Request 時執行,但等待程式碼風格檢查完成才繼續並不是一個良好的開發體驗。因此,這些程式碼風格檢查任務應在提交階段自動執行。我們引入了 [Lefthook](https://github.com/evilmartians/lefthook?tab=readme-ov-file#install) 作為實現這一目標的機制。這不是強制性的,但我們建議採用它以獲得更高效的開發體驗。另外,雖然我們不強制使用 [Prettier](https://prettier.io/) 進行 TypeScript 格式化,但我們希望您在貢獻時能採用它,因為這有助於防止程式碼審查時出現不必要的差異。 23 | 24 | ### 安裝 lefthook 25 | 26 | 請參考[此處](https://github.com/evilmartians/lefthook#install)。如果您是 Mac 並使用 Homebrew,只需執行 `brew install lefthook`。 27 | 28 | ### 安裝 poetry 29 | 30 | 這是必需的,因為 Python 程式碼風格檢查依賴於 `mypy` 和 `black`。 31 | 32 | ```sh 33 | cd backend 34 | python3 -m venv .venv # 可選(如果您不想在環境中安裝 poetry) 35 | source .venv/bin/activate # 可選(如果您不想在環境中安裝 poetry) 36 | pip install poetry 37 | poetry install 38 | ``` 39 | 40 | 更多詳細信息,請查看 [backend README](../backend/README_zh-TW.md)。 41 | 42 | ### 創建預提交鉤子 43 | 44 | 只需在專案的根目錄執行 `lefthook install`。 -------------------------------------------------------------------------------- /docs/idp/SET_UP_CUSTOM_OIDC_es-ES_ja-JP.md: -------------------------------------------------------------------------------- 1 | # 外部アイデンティティプロバイダの設定 2 | 3 | ## ステップ1: OIDCクライアントの作成 4 | 5 | 対象のOIDCプロバイダーの手順に従い、OIDCクライアントIDとシークレットの値を記録してください。以降のステップでは、発行者のURLも必要になります。設定プロセス中にリダイレクトURIが必要な場合は、実装完了後に置き換えられる仮のURIを入力してください。 6 | 7 | ## ステップ2: AWS Secrets Managerに認証情報を保存する 8 | 9 | 1. AWS管理コンソールに移動します。 10 | 2. Secrets Managerに移動し、「新しいシークレットを保存」を選択します。 11 | 3. 「その他の種類のシークレット」を選択します。 12 | 4. クライアントIDとクライアントシークレットをキーと値のペアとして入力します。 13 | 14 | - キー: `clientId`、値: 15 | - キー: `clientSecret`、値: 16 | - キー: `issuerUrl`、値: 17 | 18 | 5. プロンプトに従ってシークレットに名前と説明を付けます。シークレット名をメモしておいてください。CDKコードで後で使用します(ステップ3の 変数名で使用)。 19 | 6. シークレットを確認して保存します。 20 | 21 | ### 注意 22 | 23 | キー名は、`clientId`、`clientSecret`、`issuerUrl`の文字列と完全に一致する必要があります。 24 | 25 | ## ステップ3: cdk.jsonの更新 26 | 27 | cdk.jsonファイルに、IDプロバイダとシークレット名を次のように追加します: 28 | 29 | ```json 30 | { 31 | "context": { 32 | // ... 33 | "identityProviders": [ 34 | { 35 | "service": "oidc", // 変更しないでください 36 | "serviceName": "<サービス名>", // 任意の値を設定してください 37 | "secretName": "<シークレット名>" 38 | } 39 | ], 40 | "userPoolDomainPrefix": "<ユーザープールの一意のドメインプレフィックス>" 41 | } 42 | } 43 | ``` 44 | 45 | ### 注意 46 | 47 | #### 一意性 48 | 49 | `userPoolDomainPrefix`は、Amazon Cognitoのすべてのユーザーで一意である必要があります。既に別のAWSアカウントで使用されているプレフィックスを選択すると、ユーザープールドメインの作成に失敗します。一意性を保証するために、識別子、プロジェクト名、または環境名をプレフィックスに含めることをお勧めします。 50 | 51 | ## ステップ4: CDKスタックのデプロイ 52 | 53 | AWS上でCDKスタックをデプロイします: 54 | 55 | ```sh 56 | npx cdk deploy --require-approval never --all 57 | ``` 58 | 59 | ## ステップ 5: Cognito のリダイレクト URI で OIDC クライアントを更新 60 | 61 | スタックをデプロイした後、`AuthApprovedRedirectURI` が CloudFormation の出力に表示されます。OIDC の設定に戻り、正しいリダイレクト URI で更新してください。 -------------------------------------------------------------------------------- /docs/idp/SET_UP_CUSTOM_OIDC_fr-FR_ja-JP.md: -------------------------------------------------------------------------------- 1 | # 外部アイデンティティプロバイダーの設定 2 | 3 | ## ステップ 1: OIDC クライアントの作成 4 | 5 | 対象の OIDC プロバイダーの手順に従い、OIDC クライアント ID とシークレットの値を記録してください。発行者の URL も次のステップで必要になります。設定プロセス中にリダイレクト URI が必要な場合は、デプロイ完了後に置き換えられる仮の値を入力してください。 6 | 7 | ## ステップ2:AWS Secrets Managerに認証情報を保存する 8 | 9 | 1. AWS管理コンソールにアクセスします。 10 | 2. Secrets Managerに移動し、「新しいシークレットを保存」を選択します。 11 | 3. 「その他のタイプのシークレット」を選択します。 12 | 4. クライアントIDとクライアントシークレットをキーと値のペアで入力します。 13 | 14 | - キー:`clientId`、値: 15 | - キー:`clientSecret`、値: 16 | - キー:`issuerUrl`、値: 17 | 18 | 5. プロンプトに従ってシークレットに名前と説明を付けます。CDKコードで必要になるので、シークレット名を必ず控えておいてください(ステップ3で 変数名として使用)。 19 | 6. シークレットを確認して保存します。 20 | 21 | ### 注意 22 | 23 | キー名は、`clientId`、`clientSecret`、`issuerUrl`の文字列と完全に一致する必要があります。 24 | 25 | ## ステップ3:cdk.jsonの更新 26 | 27 | cdk.jsonファイルに、IDプロバイダーとシークレット名を以下のように追加します: 28 | 29 | ```json 30 | { 31 | "context": { 32 | // ... 33 | "identityProviders": [ 34 | { 35 | "service": "oidc", // 変更しないでください 36 | "serviceName": "<あなたのサービス名>", // 任意の値を設定 37 | "secretName": "<あなたのシークレット名>" 38 | } 39 | ], 40 | "userPoolDomainPrefix": "<ユーザープールの一意のドメインプレフィックス>" 41 | } 42 | } 43 | ``` 44 | 45 | ### 注意 46 | 47 | #### ユニーク性 48 | 49 | `userPoolDomainPrefix`は、すべてのAmazon Cognitoユーザー間でグローバルに一意である必要があります。すでに他のAWSアカウントで使用されているプレフィックスを選択すると、ユーザープールドメインの作成に失敗します。プレフィックスの一意性を保証するために、識別子、プロジェクト名、または環境名を含めることをお勧めします。 50 | 51 | ## ステップ 4: CDKスタックのデプロイ 52 | 53 | AWS上にCDKスタックをデプロイします: 54 | 55 | ```sh 56 | npx cdk deploy --require-approval never --all 57 | ``` 58 | 59 | ## ステップ5:CognitoのリダイレクトURIを使用してOIDCクライアントを更新 60 | 61 | スタックをデプロイした後、`AuthApprovedRedirectURI`がCloudFormationの出力に表示されます。OIDCの設定に戻り、正しいリダイレクトURIに更新してください。 -------------------------------------------------------------------------------- /docs/idp/SET_UP_CUSTOM_OIDC_it-IT_ja-JP.md: -------------------------------------------------------------------------------- 1 | # 外部アイデンティティプロバイダーの設定 2 | 3 | ## ステップ1:OIDCクライアントの作成 4 | 5 | 対象のOIDCプロバイダーの手順に従い、OIDCクライアントIDとシークレットの値を記録してください。また、発行者のURLは後続のステップで必要になります。設定プロセス中にリダイレクトURIが要求された場合は、デプロイメント完了後に置き換えられる仮のURIを入力してください。 6 | 7 | ## ステップ 2: AWS Secrets Manager に認証情報を保存 8 | 9 | 1. AWS Management Console にログインします。 10 | 2. Secrets Manager に移動し、「新しいシークレットを保存」を選択します。 11 | 3. 「その他のタイプのシークレット」を選択します。 12 | 4. クライアント ID とクライアントシークレットをキーと値のペアとして入力します。 13 | 14 | - キー: `clientId`、値: 15 | - キー: `clientSecret`、値: 16 | - キー: `issuerUrl`、値: 17 | 18 | 5. シークレットに名前と説明を付けるための手順に従います。CDKコードで使用するシークレット名をメモしておいてください(ステップ 3 で として使用)。 19 | 6. シークレットを確認して保存します。 20 | 21 | ### 注意 22 | 23 | キー名は、`clientId`、`clientSecret`、`issuerUrl` の文字列と完全に一致する必要があります。 24 | 25 | ## ステップ3: cdk.jsonの更新 26 | 27 | cdk.jsonファイルに、プロバイダーIDとSecretNameを次のように追加します: 28 | 29 | ```json 30 | { 31 | "context": { 32 | // ... 33 | "identityProviders": [ 34 | { 35 | "service": "oidc", // 変更しないでください 36 | "serviceName": "<あなたのサービス名>", // 任意の値を設定 37 | "secretName": "<あなたのシークレット名>" 38 | } 39 | ], 40 | "userPoolDomainPrefix": "<ユーザープールに一意のドメイン接頭辞>" 41 | } 42 | } 43 | ``` 44 | 45 | ### 注意 46 | 47 | #### 一意性 48 | 49 | `userPoolDomainPrefix`は、すべてのAmazon Cognitoユーザー間でグローバルに一意である必要があります。既に別のAWSアカウントで使用されている接頭辞を選択すると、ユーザープールドメインの作成に失敗します。一意性を確保するために、識別子、プロジェクト名、または環境名を接頭辞に含めることをお勧めします。 50 | 51 | ## ステップ4: CDKスタックのデプロイ 52 | 53 | AWS上にCDKスタックをデプロイします: 54 | 55 | ```sh 56 | npx cdk deploy --require-approval never --all 57 | ``` 58 | 59 | ## ステップ5: CognitoのリダイレクトURIでOIDCクライアントを更新 60 | 61 | スタックをデプロイした後、`AuthApprovedRedirectURI`がCloudFormationの出力に表示されます。OIDCの設定に戻り、正しいリダイレクトURIで更新してください。 -------------------------------------------------------------------------------- /docs/idp/SET_UP_CUSTOM_OIDC_pl-PL_ja-JP.md: -------------------------------------------------------------------------------- 1 | # 外部IDプロバイダの設定 2 | 3 | ## ステップ1: OIDCクライアントの作成 4 | 5 | 対象のOIDCプロバイダーの手順に従い、OIDCクライアントIDとそのシークレットを記録します。発行者のURLも後続のステップで必要となります。設定プロセス中にリダイレクトURIが要求される場合は、デプロイメント完了後に置き換えられる代替値を入力してください。 6 | 7 | ## ステップ2: AWS Secrets Managerで資格情報を保存する 8 | 9 | 1. AWS管理コンソールに移動します。 10 | 2. Secrets Managerに移動し、「新しいシークレットを保存」を選択します。 11 | 3. 「その他のシークレットタイプ」を選択します。 12 | 4. クライアントIDとクライアントシークレットをキーと値のペアとして入力します。 13 | 14 | - キー: `clientId`、値: 15 | - キー: `clientSecret`、値: 16 | - キー: `issuerUrl`、値: 17 | 18 | 5. シークレットに名前と説明を付けるための手順に従います。CDKコード(ステップ3の 変数で使用)で必要になるため、シークレット名をメモしておきます。 19 | 6. シークレットを確認して保存します。 20 | 21 | ### 注意 22 | 23 | キー名は、`clientId`、`clientSecret`、`issuerUrl` の文字列と完全に一致する必要があります。 24 | 25 | ## ステップ3: cdk.jsonファイルの更新 26 | 27 | cdk.jsonファイルに、以下のように身元プロバイダとシークレット名を追加します: 28 | 29 | ```json 30 | { 31 | "context": { 32 | // ... 33 | "identityProviders": [ 34 | { 35 | "service": "oidc", // 変更しないでください 36 | "serviceName": "<あなたのサービス名>", // 任意の値を設定 37 | "secretName": "<あなたのシークレット名>" 38 | } 39 | ], 40 | "userPoolDomainPrefix": "<ユーザープールのグローバルにユニークなドメインプレフィックス>" 41 | } 42 | } 43 | ``` 44 | 45 | ### 注意 46 | 47 | #### ユニーク性 48 | 49 | `userPoolDomainPrefix`は、Amazon Cognitoのすべてのユーザーでグローバルにユニークである必要があります。すでに他のAWSアカウントで使用されているプレフィックスを選択すると、ユーザープールドメインの作成に失敗します。プレフィックスのユニーク性を確保するには、識別子、プロジェクト名、環境名などを追加することをお勧めします。 50 | 51 | ## ステップ4: CDKスタックのデプロイ 52 | 53 | AWS上にCDKスタックをデプロイします: 54 | 55 | ```sh 56 | npx cdk deploy --require-approval never --all 57 | ``` 58 | 59 | ## ステップ 5:CognitoのリダイレクトURIを使用したOIDCクライアントの更新 60 | 61 | スタックをデプロイすると、`AuthApprovedRedirectURI`がCloudFormationの出力に表示されます。OIDCの設定に戻り、正しいリダイレクトURIで更新してください。 -------------------------------------------------------------------------------- /docs/idp/SET_UP_CUSTOM_OIDC_th-TH_ja-JP.md: -------------------------------------------------------------------------------- 1 | # 外部認証プロバイダの設定 2 | 3 | ## ステップ 1: OIDC クライアントの作成 4 | 5 | 対象の OIDC プロバイダーの手順に従い、OIDC クライアント ID とシークレットの値を記録します。また、次のステップで必要となる発行者 URL も記録してください。リダイレクト URI が必要な場合は、デプロイ後に置き換えられるダミー値を入力します。 6 | 7 | ## ステップ 2: AWS Secrets Managerに認証情報を保存する 8 | 9 | 1. AWS Management Consoleにアクセスします 10 | 2. Secrets Managerに移動し、「新しいシークレットを保存」を選択します 11 | 3. 「その他のタイプのシークレット」を選択します 12 | 4. クライアントIDとクライアントシークレットをキーと値のペアで入力します 13 | 14 | - Key: `clientId`、Value: 15 | - Key: `clientSecret`、Value: 16 | - Key: `issuerUrl`、Value: 17 | 18 | 5. 指示に従ってシークレットに名前と説明を付けます。CDKコードで使用するため(ステップ3の 変数)、シークレット名に注意してください 19 | 6. シークレットを確認して保存します 20 | 21 | ### 注意 22 | 23 | キー名は、`clientId`、`clientSecret`、`issuerUrl` の文字列と完全に一致する必要があります 24 | 25 | ## ステップ3: cdk.jsonの更新 26 | 27 | cdk.jsonファイルに、ID プロバイダとSecretNameを追加します: 28 | 29 | ```json 30 | { 31 | "context": { 32 | // ... 33 | "identityProviders": [ 34 | { 35 | "service": "oidc", // 変更しないでください 36 | "serviceName": "<あなたのサービス名>", // 好きな名前を設定できます 37 | "secretName": "<あなたのシークレット名>" 38 | } 39 | ], 40 | "userPoolDomainPrefix": "" 41 | } 42 | } 43 | ``` 44 | 45 | ### 注意事項 46 | 47 | #### 一意性 48 | 49 | `userPoolDomainPrefix`は、すべてのAmazon Cognitoユーザーにおいて、グローバルに一意である必要があります。他のAWSアカウントですでに使用されているプレフィックスを選択すると、User Poolドメインの作成に失敗します。ベストプラクティスは、識別子、プロジェクト名、または環境名をプレフィックスに含めて、一意性を確保することです。 50 | 51 | ## ステップ 4: CDKスタックのデプロイ 52 | 53 | CDKスタックをAWSにデプロイします: 54 | 55 | ```sh 56 | npx cdk deploy --require-approval never --all 57 | ``` 58 | 59 | ## ステップ 5: CognitoのリダイレクトURIを使用してOIDCクライアントを更新 60 | 61 | CloudFormationスタックの`AuthApprovedRedirectURI`の出力結果が表示されたら、OIDCの設定に戻り、正しいリダイレクトURIで更新します。 -------------------------------------------------------------------------------- /docs/idp/SET_UP_CUSTOM_OIDC_zh-CN.md: -------------------------------------------------------------------------------- 1 | # 设置外部身份提供者 2 | 3 | ## 步骤1:创建OIDC客户端 4 | 5 | 按照目标OIDC提供程序的步骤进行操作,并记录OIDC客户端ID和密钥的值。在后续步骤中还需要颁发者URL。如果设置过程需要重定向URI,请输入虚拟值,该值将在部署完成后被替换。 6 | 7 | ## 步骤2:在AWS Secrets Manager中存储凭证 8 | 9 | 1. 进入AWS管理控制台。 10 | 2. 导航到Secrets Manager并选择"存储新密钥"。 11 | 3. 选择"其他类型的密钥"。 12 | 4. 以键值对的形式输入客户端ID和客户端密钥。 13 | 14 | - 键:`clientId`,值: 15 | - 键:`clientSecret`,值: 16 | - 键:`issuerUrl`,值: 17 | 18 | 5. 按照提示为密钥命名和描述。记下密钥名称,因为您将在CDK代码中需要它(在步骤3中使用的变量名为)。 19 | 6. 检查并存储密钥。 20 | 21 | ### 注意 22 | 23 | 键名必须完全匹配字符串 `clientId`、`clientSecret` 和 `issuerUrl`。 24 | 25 | ## 步骤 3:更新 cdk.json 26 | 27 | 在 cdk.json 文件中,添加身份提供者和密钥名称。 28 | 29 | 如下所示: 30 | 31 | ```json 32 | { 33 | "context": { 34 | // ... 35 | "identityProviders": [ 36 | { 37 | "service": "oidc", // 不要更改 38 | "serviceName": "<您的服务名称>", // 可以设置任何您喜欢的值 39 | "secretName": "<您的密钥名称>" 40 | } 41 | ], 42 | "userPoolDomainPrefix": "<用户池域前缀的唯一值>" 43 | } 44 | } 45 | ``` 46 | 47 | ### 注意 48 | 49 | #### 唯一性 50 | 51 | `userPoolDomainPrefix` 必须在所有 Amazon Cognito 用户中全局唯一。如果您选择的前缀已被其他 AWS 账户使用,用户池域的创建将失败。最佳做法是在前缀中包含标识符、项目名称或环境名称,以确保唯一性。 52 | 53 | ## 步骤 4:部署您的 CDK 堆栈 54 | 55 | 使用以下命令将 CDK 堆栈部署到 AWS: 56 | 57 | ```sh 58 | npx cdk deploy --require-approval never --all 59 | ``` 60 | 61 | ## 步骤5:使用Cognito重定向URI更新OIDC客户端 62 | 63 | 部署堆栈后,`AuthApprovedRedirectURI` 将显示在CloudFormation输出中。返回到您的OIDC配置,并使用正确的重定向URI进行更新。 -------------------------------------------------------------------------------- /docs/idp/SET_UP_CUSTOM_OIDC_zh-TW.md: -------------------------------------------------------------------------------- 1 | # 設定外部身份提供者 2 | 3 | ## 步驟 1:建立 OIDC 用戶端 4 | 5 | 依照目標 OIDC 提供者的流程,記下 OIDC 用戶端 ID 和密鑰的值。後續步驟還需要頒發者 URL。如果設定過程需要重新導向 URI,請先輸入虛擬值,這將在部署完成後被替換。 6 | 7 | ## 步驟 2:在 AWS Secrets Manager 中儲存憑證 8 | 9 | 1. 進入 AWS 管理主控台。 10 | 2. 導覽至 Secrets Manager 並選擇「儲存新的密鑰」。 11 | 3. 選擇「其他類型的密鑰」。 12 | 4. 輸入用戶端 ID 和用戶端密鑰作為鍵值對。 13 | 14 | - 鍵:`clientId`,值: 15 | - 鍵:`clientSecret`,值: 16 | - 鍵:`issuerUrl`,值: 17 | 18 | 5. 按照提示為密鑰命名和描述。記下密鑰名稱,因為您將在 CDK 程式碼中需要它(在步驟 3 中使用的變數名稱 )。 19 | 6. 檢閱並儲存密鑰。 20 | 21 | ### 注意 22 | 23 | 鍵名必須完全符合 `clientId`、`clientSecret` 和 `issuerUrl` 這些字串。 24 | 25 | ## 步驟 3:更新 cdk.json 26 | 27 | 在您的 cdk.json 檔案中,新增身份提供者和密鑰名稱。 28 | 29 | 如下所示: 30 | 31 | ```json 32 | { 33 | "context": { 34 | // ... 35 | "identityProviders": [ 36 | { 37 | "service": "oidc", // 請勿更改 38 | "serviceName": "<您的服務名稱>", // 可以設定任何您喜歡的值 39 | "secretName": "<您的密鑰名稱>" 40 | } 41 | ], 42 | "userPoolDomainPrefix": "<您使用者池的唯一網域前綴>" 43 | } 44 | } 45 | ``` 46 | 47 | ### 注意 48 | 49 | #### 唯一性 50 | 51 | `userPoolDomainPrefix` 必須在所有 Amazon Cognito 使用者中全域唯一。如果您選擇的前綴已被另一個 AWS 帳戶使用,使用者池網域的建立將會失敗。建議在前綴中包含識別碼、專案名稱或環境名稱,以確保唯一性。 52 | 53 | ## 步驟 4:部署 的CDk� 54 | 55 | 您ᴀ� 疆署到 AWS: 56 | 57 | ```sh 58 | npx cdk deploy --require-approval never --all 59 | ``` 60 | 61 | ## 步驟 5:使用 Cognito 重新導向 URI 更新 OIDC 用戶端 62 | 63 | 在部署堆疊後,`AuthApprovedRedirectURI` 會顯示在 CloudFormation 輸出中。返回您的 OIDC 設定,並使用正確的重新導向 URI 進行更新。 -------------------------------------------------------------------------------- /docs/idp/SET_UP_CUSTOM_OIDC_zh-TW_ja-JP.md: -------------------------------------------------------------------------------- 1 | # 外部アイデンティティプロバイダーの設定 2 | 3 | ## ステップ 1:OIDCクライアントの作成 4 | 5 | 目的のOIDCプロバイダーの手順に従い、OIDCクライアントIDとシークレットの値をメモしてください。後続のステップでは、発行者URLも必要になります。設定プロセス中にリダイレクトURIが必要な場合は、一時的な値を入力し、デプロイ完了後に置き換えます。 6 | 7 | ## 手順 2:AWS Secrets Manager に認証情報を保存する 8 | 9 | 1. AWS 管理コンソールにアクセスします。 10 | 2. Secrets Manager に移動し、「新しいシークレットを保存」を選択します。 11 | 3. 「その他の種類のシークレット」を選択します。 12 | 4. クライアントIDとクライアントシークレットをキーと値のペアとして入力します。 13 | 14 | - キー:`clientId`、値: 15 | - キー:`clientSecret`、値: 16 | - キー:`issuerUrl`、値: 17 | 18 | 5. プロンプトに従ってシークレットに名前と説明を付けます。シークレット名をメモしてください。これは CDK コードで使用します(手順 3 で使用する変数名 )。 19 | 6. シークレットを確認して保存します。 20 | 21 | ### 注意 22 | 23 | キー名は、`clientId`、`clientSecret`、`issuerUrl` の文字列と完全に一致する必要があります。 24 | 25 | ## 手順 3:cdk.json の更新 26 | 27 | cdk.json ファイルに、IDプロバイダーとシークレット名を追加します。 28 | 29 | 以下のようになります: 30 | 31 | ```json 32 | { 33 | "context": { 34 | // ... 35 | "identityProviders": [ 36 | { 37 | "service": "oidc", // 変更しないでください 38 | "serviceName": "<サービス名>", // 任意の値を設定できます 39 | "secretName": "<シークレット名>" 40 | } 41 | ], 42 | "userPoolDomainPrefix": "<ユーザープールドメイン接頭辞の一意の値>" 43 | } 44 | } 45 | ``` 46 | 47 | ### 注意 48 | 49 | #### 一意性 50 | 51 | `userPoolDomainPrefix` は、すべてのAmazon Cognitoユーザー間でグローバルに一意である必要があります。選択した接頭辞が他のAWSアカウントで既に使用されている場合、ユーザープールドメインの作成は失敗します。ベストプラクティスは、識別子、プロジェクト名、または環境名を接頭辞に含めて、一意性を確保することです。 52 | 53 | ## 手順 4:CDKスタックのデプロイ 54 | 55 | CDKスタックをAWSにデプロイします: 56 | 57 | ```sh 58 | npx cdk deploy --require-approval never --all 59 | ``` 60 | 61 | ## ステップ 5:Cognito のリダイレクト URI で OIDC クライアントを更新 62 | 63 | スタックをデプロイした後、`AuthApprovedRedirectURI` が CloudFormation の出力に表示されます。OIDC の設定に戻り、正しいリダイレクト URI で更新してください。 -------------------------------------------------------------------------------- /docs/idp/SET_UP_GOOGLE_zh-CN.md: -------------------------------------------------------------------------------- 1 | # 为 Google 设置外部身份提供者 2 | 3 | ## 步骤 1:创建 Google OAuth 2.0 客户端 4 | 5 | 1. 转到 Google 开发者控制台。 6 | 2. 创建新项目或选择现有项目。 7 | 3. 导航到"凭据",然后点击"创建凭据"并选择"OAuth 客户端 ID"。 8 | 4. 如果提示,配置同意屏幕。 9 | 5. 对于应用程序类型,选择"Web 应用程序"。 10 | 6. 暂时将重定向 URI 留空,以便稍后设置,并临时保存。[请参见步骤5](#step-5-update-google-oauth-client-with-cognito-redirect-uris) 11 | 7. 创建后,记下客户端 ID 和客户端密钥。 12 | 13 | 详细信息,请访问 [Google 官方文档](https://support.google.com/cloud/answer/6158849?hl=en) 14 | 15 | ## 步骤2:在AWS Secrets Manager中存储Google OAuth凭证 16 | 17 | 1. 进入AWS管理控制台。 18 | 2. 导航到Secrets Manager并选择"存储新密钥"。 19 | 3. 选择"其他类型的密钥"。 20 | 4. 以键值对的形式输入Google OAuth的clientId和clientSecret。 21 | 22 | 1. 键:clientId,值: 23 | 2. 键:clientSecret,值: 24 | 25 | 5. 按照提示为密钥命名和描述。记下密钥名称,因为你将在CDK代码中使用它。例如,googleOAuthCredentials。(在步骤3中使用变量名) 26 | 6. 查看并存储密钥。 27 | 28 | ### 注意 29 | 30 | 键名必须完全匹配字符串'clientId'和'clientSecret'。 31 | 32 | ## 步骤3:更新 cdk.json 33 | 34 | 在您的 cdk.json 文件中,添加身份提供商和秘密名称: 35 | 36 | ```json 37 | { 38 | "context": { 39 | // ... 40 | "identityProviders": [ 41 | { 42 | "service": "google", 43 | "secretName": "" 44 | } 45 | ], 46 | "userPoolDomainPrefix": "" 47 | } 48 | } 49 | ``` 50 | 51 | ### 注意 52 | 53 | #### 唯一性 54 | 55 | userPoolDomainPrefix 在所有 Amazon Cognito 用户中必须全局唯一。如果选择的前缀已被其他 AWS 账户使用,用户池域的创建将失败。最佳实践是在前缀中包含标识符、项目名称或环境名称,以确保唯一性。 56 | 57 | ## 步骤4:部署您的CDK堆栈 58 | 59 | 使用以下命令将CDK堆栈部署到AWS: 60 | 61 | ```sh 62 | npx cdk deploy --require-approval never --all 63 | ``` 64 | 65 | ## 步骤 5:使用 Cognito 重定向 URI 更新 Google OAuth 客户端 66 | 67 | 部署堆栈后,AuthApprovedRedirectURI 将显示在 CloudFormation 输出中。返回 Google 开发者控制台,并使用正确的重定向 URI 更新 OAuth 客户端。 -------------------------------------------------------------------------------- /docs/imgs/admin_bot_analytics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/admin_bot_analytics.png -------------------------------------------------------------------------------- /docs/imgs/admin_bot_menue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/admin_bot_menue.png -------------------------------------------------------------------------------- /docs/imgs/admn_api_management.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/admn_api_management.png -------------------------------------------------------------------------------- /docs/imgs/agent1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/agent1.png -------------------------------------------------------------------------------- /docs/imgs/agent2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/agent2.png -------------------------------------------------------------------------------- /docs/imgs/agent_tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/agent_tools.png -------------------------------------------------------------------------------- /docs/imgs/arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/arch.png -------------------------------------------------------------------------------- /docs/imgs/bedrock_agent_tool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/bedrock_agent_tool.png -------------------------------------------------------------------------------- /docs/imgs/bot_api_publish_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/bot_api_publish_screenshot.png -------------------------------------------------------------------------------- /docs/imgs/bot_api_publish_screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/bot_api_publish_screenshot2.png -------------------------------------------------------------------------------- /docs/imgs/bot_api_publish_screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/bot_api_publish_screenshot3.png -------------------------------------------------------------------------------- /docs/imgs/bot_store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/bot_store.png -------------------------------------------------------------------------------- /docs/imgs/customized_bot_creation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/customized_bot_creation.png -------------------------------------------------------------------------------- /docs/imgs/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/demo.gif -------------------------------------------------------------------------------- /docs/imgs/demo_ja.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/demo_ja.gif -------------------------------------------------------------------------------- /docs/imgs/feedback-using-claude-chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/feedback-using-claude-chat.png -------------------------------------------------------------------------------- /docs/imgs/feedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/feedback.png -------------------------------------------------------------------------------- /docs/imgs/feedback_loop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/feedback_loop.png -------------------------------------------------------------------------------- /docs/imgs/fine_grained_permission.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/fine_grained_permission.png -------------------------------------------------------------------------------- /docs/imgs/group_membership_admin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/group_membership_admin.png -------------------------------------------------------------------------------- /docs/imgs/group_membership_publish_allowed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/group_membership_publish_allowed.png -------------------------------------------------------------------------------- /docs/imgs/import_existing_kb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/import_existing_kb.png -------------------------------------------------------------------------------- /docs/imgs/model_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/model_screenshot.png -------------------------------------------------------------------------------- /docs/imgs/published_arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/published_arch.png -------------------------------------------------------------------------------- /docs/imgs/rag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/rag.png -------------------------------------------------------------------------------- /docs/imgs/signin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/signin.png -------------------------------------------------------------------------------- /docs/imgs/v1_to_v2_KB_s3_source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/v1_to_v2_KB_s3_source.png -------------------------------------------------------------------------------- /docs/imgs/v1_to_v2_arch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/v1_to_v2_arch.png -------------------------------------------------------------------------------- /docs/imgs/v1_to_v2_readonly_bot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/docs/imgs/v1_to_v2_readonly_bot.png -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_de-DE_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド (v0 から v1) 2 | 3 | 既に Bedrock Claude Chat の以前のバージョン(〜`0.4.x`)を使用している場合は、以下の移行手順に従う必要があります。 4 | 5 | ## なぜこれを行う必要があるのか? 6 | 7 | この包括的な更新には重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベースストレージ(つまり、Aurora PostgreSQLの pgvector)が暗号化され、デプロイメント時に交換が発生します。これは、既存のベクター要素が削除されることを意味します。 10 | - Botを作成できるユーザーを制限するために、`CreatingBotAllowed` という Cognito ユーザーグループを導入しました。既存のユーザーはこのグループに含まれていないため、Botの作成権限を付与する場合は手動で権限を割り当てる必要があります。詳細については、[Botのパーソナライズ](../../README.md#bot-personalization)を参照してください。 11 | 12 | ## 前提条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_de-DE_ja-JP.md)を読み、要素を復元する方法を決定してください。 15 | 16 | ## 手順 17 | 18 | ### ベクトルストレージの移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - デプロイするブランチをプルします。目的のブランチ(この場合は `v1`)に切り替え、最新の変更を取得します: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSで要素を復元する場合、パスワードローテーションを無効にし、データベースアクセス用のパスワードをメモすることを忘れないでください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))を使用する場合、パスワードをメモする必要はありません。 30 | - CloudFormationが既存のAuroraクラスターを削除できるように、[公開されたAPI](../PUBLISH_API_de-DE_ja-JP.md)をすべて削除します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行して、Auroraクラスターを置き換え、すべてのベクトル要素を削除します。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_de-DE_ja-JP.md)に従って、ベクトル要素を復元します。 33 | - ユーザーが知識を持つ既存のボットを利用できることを確認します。つまり、RAGボット。 34 | 35 | ### ボット作成権限の追加 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できません。 38 | - 特定のユーザーにボットの作成を許可する場合は、管理コンソールまたはコマンドラインインターフェースを使用して、そのユーザーを `CreatingBotAllowed` グループに追加します。 39 | - ユーザーがボットを作成できることを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_es-ES_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド (v0 から v1) 2 | 3 | 既に Bedrock Claude Chat の以前のバージョン(〜`0.4.x`)を使用している場合は、以下の手順に従ってマイグレーションする必要があります。 4 | 5 | ## なぜこれを行う必要があるのか? 6 | 7 | この重要な更新には、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベースストレージ(つまり、Aurora PostgreSQLのpgvector)が暗号化され、デプロイ時に置き換えがトリガーされます。これは、既存のベクター要素が削除されることを意味します。 10 | - Cognitoユーザーグループ `CreatingBotAllowed` を導入し、ボットを作成できるユーザーを制限しました。現在の既存のユーザーはこのグループに属していないため、ボット作成機能を持たせたい場合は、手動でアクセス許可を追加する必要があります。詳細は:[ボットのカスタマイズ](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_es-ES_ja-JP.md)を読み、要素を復元する方法を決定してください。 15 | 16 | ## 手順 17 | 18 | ### ベクトルストレージの移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - デプロイしたいブランチに切り替えます。次に、目的のブランチ(この場合は `v1`)に切り替え、最新の変更を取得します: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSで要素を復元する場合、パスワードのローテーションを必ず無効にし、データベースにアクセスするためのパスワードをメモしてください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))で復元する場合、パスワードをメモする必要はありません。 30 | - CloudFormationが既存のAuroraクラスターを削除できるように、[公開されているAPI](../PUBLISH_API_es-ES_ja-JP.md)をすべて削除します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行し、Auroraクラスターの置き換えをトリガーし、すべてのベクトル要素を削除します。 32 | - ベクトル要素を復元するには、[データベース移行ガイド](./DATABASE_MIGRATION_es-ES_ja-JP.md)に従います。 33 | - ユーザーが既存のナレッジを持つボット、つまりRAGボットを使用できることを確認します。 34 | 35 | ### CreatingBotAllowedの権限を追加 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できなくなります。 38 | - 特定のユーザーにボットの作成を許可する場合は、管理コンソールまたはCLIを使用して、それらのユーザーを `CreatingBotAllowed` グループに追加します。 39 | - ユーザーがボットを作成できるかを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_fr-FR_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド(v0からv1へ) 2 | 3 | 既に Bedrock Claude Chat の以前のバージョン(~`0.4.x`)を使用している場合、以下の手順に従ってマイグレーションする必要があります。 4 | 5 | ## なぜこれを行う必要があるのか? 6 | 7 | このメジャーアップデートには、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクトルデータベースストレージ(つまり、Aurora PostgreSQLのpgvector)が現在暗号化されており、デプロイ時に置き換えられます。これは、既存のベクトル要素が削除されることを意味します。 10 | - Cognitoユーザーグループ `CreatingBotAllowed` を導入し、ボットを作成できるユーザーを制限しました。現在の既存のユーザーはこのグループに属していないため、ボット作成の権限を与える場合は手動で添付する必要があります。詳細は:[ボットのカスタマイズ](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_fr-FR_ja-JP.md)を読み、復元方法を決定してください。 15 | 16 | ## 手順 17 | 18 | ### ベクターストアの移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - デプロイしたいブランチをチェックアウトします。目的のブランチ(この場合は `v1`)に切り替え、最新の変更をプルします: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSで要素を復元する場合、パスワードのローテーションを無効にし、データベースにアクセスするためのパスワードを必ず記録してください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))で復元する場合、パスワードを記録する必要はありません。 30 | - 既存のAuroraクラスターをCloudFormationで削除できるように、[公開されたAPI](../PUBLISH_API_fr-FR_ja-JP.md)をすべて削除します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行し、Auroraクラスターの置き換えをトリガーし、すべてのベクター要素を削除します。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_fr-FR_ja-JP.md)に従って、ベクター要素を復元します。 33 | - ユーザーが既存の知識を持つボット(RAGボット)を使用できることを確認します。 34 | 35 | ### CreatingBotAllowedの権限を付与 36 | 37 | - デプロイ後、すべてのユーザーが新しいボットを作成できるわけではありません。 38 | - 特定のユーザーにボットの作成を許可する場合は、管理コンソールまたはCLIを使用して、これらのユーザーを `CreatingBotAllowed` グループに追加します。 39 | - ユーザーがボットを作成できるかどうかを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_it-IT_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド(v0からv1へ) 2 | 3 | 既に Bedrock Claude Chat の以前のバージョン(〜`0.4.x`)を使用している場合は、以下の手順に従ってマイグレーションを実行する必要があります。 4 | 5 | ## なぜこれを行う必要があるのか? 6 | 7 | このメジャーアップデートには、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベースストレージ(つまり、Aurora PostgreSQLの pgvector)が現在暗号化されており、デプロイ時に置き換えが発生します。これは、既存のベクター要素が削除されることを意味します。 10 | - Cognitoユーザーグループ `CreatingBotAllowed` を導入し、ボットを作成できるユーザーを制限しました。現在の既存のユーザーはこのグループに含まれていないため、ボット作成の権限を持たせたい場合は、手動で権限を付与する必要があります。参照: [ボットのカスタマイズ](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_it-IT_ja-JP.md)を読み、アイテムを復元する方法を決定してください。 15 | 16 | ## 手順 17 | 18 | ### ベクターストレージの移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - デプロイしたいブランチをチェックアウトします。目的のブランチ(この場合は `v1`)に切り替え、最新の変更を取得します: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSで要素を復元する場合、パスワードのローテーションを無効にし、データベースにアクセスするためのパスワードをメモすることを忘れないでください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))で復元する場合、パスワードをメモする必要はありません。 30 | - CloudFormationが既存のAuroraクラスターを削除できるように、[公開されているAPI](../PUBLISH_API_it-IT_ja-JP.md)をすべて削除します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行し、Auroraクラスターの置き換えをトリガーし、すべてのベクター要素を削除します。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_it-IT_ja-JP.md)に従って、ベクター要素を復元します。 33 | - 既存のナレッジを持つボット(RAGボット)をユーザーが使用できることを確認します。 34 | 35 | ### CreatingBotAllowedの認可を追加する 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できなくなります。 38 | - 特定のユーザーにボット作成を許可する場合は、管理コンソールまたはCLIを使用して、それらのユーザーを `CreatingBotAllowed` グループに追加します。 39 | - ユーザーがボットを作成できることを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド (v0 から v1) 2 | 3 | すでに以前のバージョン(〜`0.4.x`)の Bedrock Chat を使用している場合は、以下の手順に従ってマイグレーションする必要があります。 4 | 5 | ## なぜ行う必要があるのか? 6 | 7 | このメジャーアップデートには、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベース(Aurora PostgreSQLの pgvector)のストレージが現在暗号化されており、デプロイ時に置き換えが発生します。これは、既存のベクターアイテムが削除されることを意味します。 10 | - ボット作成が可能なユーザーを制限するために、`CreatingBotAllowed` Cognitoユーザーグループを導入しました。既存のユーザーはデフォルトでこのグループに属していないため、ボット作成の権限を持たせたい場合は、手動で権限をアタッチする必要があります。詳細は: [ボットのパーソナライズ](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_ja-JP.md)を読み、アイテムの復元方法を決定してください。 15 | 16 | ## 手順 17 | 18 | ### ベクターストア移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - デプロイしたいブランチをプルします。以下は目的のブランチ(この場合は `v1`)にチェックアウトし、最新の変更をプルします: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSでアイテムを復元する場合、パスワードのローテーションを無効にし、データベースにアクセスするためのパスワードを必ず控えてください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))で復元する場合は、パスワードを控える必要はありません。 30 | - CloudFormationが既存のAuroraクラスターを削除できるように、すべての[公開されたAPI](../PUBLISH_API_ja-JP.md)を削除します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行し、Auroraクラスターの置き換えをトリガーし、すべてのベクターアイテムを削除します。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_ja-JP.md)に従って、ベクターアイテムを復元します。 33 | - ユーザーが既存のボット(つまり、RAGボット)を利用できることを確認します。 34 | 35 | ### CreatingBotAllowed権限の付与 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できなくなります。 38 | - 特定のユーザーにボットの作成を許可する場合は、管理コンソールまたはCLIを使用して、それらのユーザーを `CreatingBotAllowed` グループに追加します。 39 | - ユーザーがボットを作成できるかどうかを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_ko-KR.md: -------------------------------------------------------------------------------- 1 | # 마이그레이션 가이드 (v0에서 v1로) 2 | 3 | 이미 이전 버전(~`0.4.x`)의 Bedrock Chat을 사용하고 있다면, 아래 단계를 따라 마이그레이션해야 합니다. 4 | 5 | ## 왜 해야 하나요? 6 | 7 | 이 주요 업데이트에는 중요한 보안 업데이트가 포함되어 있습니다. 8 | 9 | - 벡터 데이터베이스(즉, Aurora PostgreSQL의 pgvector) 스토리지가 이제 암호화되어 있으며, 배포 시 교체가 트리거됩니다. 이는 기존 벡터 항목이 삭제됨을 의미합니다. 10 | - 봇 생성 권한을 제한하기 위해 `CreatingBotAllowed` Cognito 사용자 그룹을 도입했습니다. 현재 기존 사용자는 이 그룹에 속해 있지 않으므로, 봇 생성 기능을 원하는 경우 권한을 수동으로 부여해야 합니다. 참조: [봇 개인화](../../README.md#bot-personalization) 11 | 12 | ## 전제 조건 13 | 14 | [데이터베이스 마이그레이션 가이드](./DATABASE_MIGRATION_ko-KR.md)를 읽고 항목 복원 방법을 결정하세요. 15 | 16 | ## 단계 17 | 18 | ### 벡터 저장소 마이그레이션 19 | 20 | - 터미널을 열고 프로젝트 디렉터리로 이동 21 | - 배포하려는 브랜치를 가져옵니다. 원하는 브랜치(이 경우 `v1`)로 전환하고 최신 변경 사항을 가져옵니다: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMS로 항목을 복원하려면 비밀번호 순환을 비활성화하고 데이터베이스에 액세스할 비밀번호를 메모하세요. 마이그레이션 스크립트([migrate_v0_v1.py](./migrate_v0_v1.py))로 복원하는 경우 비밀번호를 메모할 필요가 없습니다. 30 | - CloudFormation이 기존 Aurora 클러스터를 제거할 수 있도록 모든 [게시된 API](../PUBLISH_API_ko-KR.md)를 제거합니다. 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)를 실행하여 Aurora 클러스터 교체를 트리거하고 모든 벡터 항목을 삭제합니다. 32 | - [데이터베이스 마이그레이션 가이드](./DATABASE_MIGRATION_ko-KR.md)를 따라 벡터 항목을 복원합니다. 33 | - 사용자가 기존 봇(RAG 봇)을 활용할 수 있는지 확인합니다. 34 | 35 | ### CreatingBotAllowed 권한 부여 36 | 37 | - 배포 후 모든 사용자는 새 봇을 생성할 수 없게 됩니다. 38 | - 특정 사용자가 봇을 생성할 수 있게 하려면 관리 콘솔 또는 CLI를 사용하여 해당 사용자를 `CreatingBotAllowed` 그룹에 추가합니다. 39 | - 사용자가 봇을 생성할 수 있는지 확인합니다. 사용자는 다시 로그인해야 합니다. -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_ko-KR_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド (v0 から v1) 2 | 3 | 既に以前のバージョン(~`0.4.x`)の Bedrock Claude Chat を使用している場合、マイグレーションのために以下の手順に従う必要があります。 4 | 5 | ## なぜこの作業を行う必要があるのでしょうか? 6 | 7 | この主要な更新には、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベース(つまり、Aurora PostgreSQLの pgvector)のストレージが現在暗号化されており、デプロイ時に置き換えがトリガーされます。これは、既存のベクターエントリが削除されることを意味します。 10 | - ボット作成権限を制限するために、`CreatingBotAllowed` Cognitoユーザーグループを導入しました。現在、既存のユーザーはこのグループに属していないため、ボット作成権限を付与するには、手動で権限を添付する必要があります。参照: [ボットのパーソナライズ](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_ko-KR_ja-JP.md)を読み、アイテムの復元方法を決定してください。 15 | 16 | ## 手順 17 | 18 | ### ベクターストレージの移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動 21 | - デプロイするブランチをフェッチします。目的のブランチ(この場合は `v1`)に切り替え、最新の変更を取得します: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSで項目を復元するには、パスワードのローテーションを無効にし、データベースアクセス用のパスワードを記録する必要があります。マイグレーションスクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))で復元する場合、パスワードを記録する必要はありません。 30 | - CloudFormationが既存のAuroraクラスターを削除できるように、すべての[公開されたAPI](../PUBLISH_API_ko-KR_ja-JP.md)を削除します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行すると、Auroraクラスターの置き換えがトリガーされ、すべてのベクター項目が削除されます。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_ko-KR_ja-JP.md)に従って、ベクター項目を復元します。 33 | - ユーザーが既存のボット(RAGボット)を利用できることを確認します。 34 | 35 | ### CreatingBotAllowed 権限の付与 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できなくなります。 38 | - 特定のユーザーがボットを作成できるようにするには、管理コンソールまたはCLIを使用して、そのユーザーを `CreatingBotAllowed` グループに追加します。 39 | - ユーザーがボットを作成できることを確認します。ユーザーは再ログインする必要があります。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_ms-MY_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド (v0 から v1) 2 | 3 | 既に以前のバージョン(〜`0.4.x`)のBedrock Claude Chatを使用している場合、以下の手順に従ってマイグレーションする必要があります。 4 | 5 | ## なぜこれを行う必要があるのか? 6 | 7 | この重要な更新には、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベースストレージ(Aurora PostgreSQLの`pgvector`など)が現在暗号化されており、現在使用中の置き換えがトリガーされます。これは、既存のベクターアイテムが削除されることを意味します。 10 | - Cognitoユーザーグループ`CreatingBotAllowed`を導入し、ボットを作成できるユーザーを制限します。既存のユーザーはこのグループに属していないため、ボットを作成する機能を持たせたい場合は、手動で権限を付与する必要があります。詳細は: [ボットのパーソナライズ](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_ms-MY_ja-JP.md)を読み、アイテムを復元する方法を決定してください。 15 | 16 | ## 手順 17 | 18 | ### ベクターストアの移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - デプロイしたいブランチをチェックアウトします。目的のブランチ(この場合は `v1`)をチェックアウトし、最新の変更を取得します: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSでアイテムを復元する場合、パスワードローテーションを無効にし、データベースにアクセスするためのパスワードをメモしてください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))で復元する場合は、パスワードをメモする必要はありません。 30 | - 既存のAuroraクラスターを解放できるように、[公開されたAPI](../PUBLISH_API_ms-MY_ja-JP.md)をすべて解放します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行して、Auroraクラスターの置き換えを起動し、すべてのベクターアイテムを削除します。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_ms-MY_ja-JP.md)に従って、ベクターアイテムを復元します。 33 | - 既存のナレッジを持つボット(RAGボット)をユーザーが使用できることを確認します。 34 | 35 | ### CreatingBotAllowedの権限を追加 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できなくなります。 38 | - 特定のユーザーにボット作成を許可する場合は、管理コンソールまたはCLIを使用して、そのユーザーを `CreatingBotAllowed` グループに追加します。 39 | - ユーザーがボットを作成できるかどうかを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_nb-NO_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド (v0 から v1) 2 | 3 | 既に Bedrock Claude Chat の以前のバージョン (~`0.4.x`)を使用している場合は、以下の手順に従ってマイグレーションする必要があります。 4 | 5 | ## なぜこれを行う必要があるのですか? 6 | 7 | この大規模な更新には重要なセキュリティ更新が含まれています。 8 | 9 | - ベクトルデータベースストレージ(つまり、Aurora PostgreSQLの pgvector)が現在暗号化されており、デプロイ時に置き換えが発生します。これは、既存のベクトルオブジェクトが削除されることを意味します。 10 | - ボットを作成できるユーザーを制限するために、Cognitoユーザーグループ `CreatingBotAllowed` を導入しました。既存のユーザーはこのグループに属していないため、ボット作成を許可する場合は、手動で権限を追加する必要があります。詳細は:[ボットのパーソナライズ](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_nb-NO_ja-JP.md)を読み、要素の復元方法を決定してください。 15 | 16 | ## 手順 17 | 18 | ### ベクターストレージ移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - 配布したいブランチをチェックアウトします。目的のブランチ(この場合は `v1`)に切り替え、最新の変更を取得します: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSでアイテムを復元する場合、パスワードローテーションを無効にし、データベースにアクセスするためのパスワードを必ず控えてください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))で復元する場合は、パスワードを控える必要はありません。 30 | - CloudFormationが既存のAuroraクラスターを削除できるように、[公開されたAPI](../PUBLISH_API_nb-NO_ja-JP.md)をすべて削除します。 31 | - Auroraクラスターを置き換え、すべてのベクターアイテムを**削除**する[npx cdk deploy](../README.md#deploy-using-cdk)を実行します。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_nb-NO_ja-JP.md)に従って、ベクターアイテムを復元します。 33 | - ユーザーが既存の知識を持つボット(RAGボット)を使用できることを確認します。 34 | 35 | ### CreatingBotAllowed権限の追加 36 | 37 | - 配布後、すべてのユーザーは新しいボットを作成できなくなります。 38 | - 特定のユーザーにボットの作成を許可する場合は、管理コンソールまたはCLIを使用して、これらのユーザーを`CreatingBotAllowed`グループに追加します。 39 | - ユーザーがボットを作成できることを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_pl-PL_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド (バージョン0からバージョン1へ) 2 | 3 | 既に以前のバージョン (~`0.4.x`)のBedrock Claude Chatを使用している場合は、以下の手順に従ってマイグレーションを行う必要があります。 4 | 5 | ## なぜこれを行う必要があるのか? 6 | 7 | このメインアップデートには、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベースストレージ(Aurora PostgreSQLの`pgvector`など)が現在暗号化されており、デプロイ時に交換されます。これは、既存のベクター要素が削除されることを意味します。 10 | - ボットの作成を制限するために、Cognitoユーザーグループ`CreatingBotAllowed`を導入しました。既存のユーザーはこのグループに属していないため、ボットを作成できるようにする場合は、手動で権限を割り当てる必要があります。詳細は: [ボットのカスタマイズ](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_pl-PL_ja-JP.md)を参照し、アイテムの復元方法を決定してください。 15 | 16 | ## Kroki 17 | 18 | ### ベクターストレージの移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - デプロイしたいブランチをダウンロードします。目的のブランチ(この場合は`v1`)に切り替え、最新の変更をプルします: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSを使用して要素を復元する場合、パスワードのローテーションを無効にし、データベースアクセスパスワードをメモしてください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))を使用して復元する場合、パスワードをメモする必要はありません。 30 | - CloudFormationが既存のAuroraクラスターを削除できるように、[公開されたAPIインターフェース](../PUBLISH_API_pl-PL_ja-JP.md)をすべて削除します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行し、Auroraクラスターを交換し、すべてのベクター要素を削除します。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_pl-PL_ja-JP.md)に従って、ベクター要素を復元します。 33 | - ユーザーが既存のボット(RAGボットなど)を使用できることを確認します。 34 | 35 | ### CreatingBotAllowedパーミッションの追加 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できなくなります。 38 | - 特定のユーザーがボットを作成できるようにする場合は、管理コンソールまたはCLIを使用して、これらのユーザーを`CreatingBotAllowed`グループに追加します。 39 | - ユーザーがボットを作成できることを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_th-TH_ja-JP.md: -------------------------------------------------------------------------------- 1 | # バージョン移行ガイド(v0 から v1) 2 | 3 | 以前のBedrock Claude Chatバージョン(おおよそ `0.4.x`)を使用している場合、以下の手順に従ってバージョンを移行する必要があります。 4 | 5 | ## なぜこれを行う必要があるのですか? 6 | 7 | この大規模な更新には、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベース(Aurora PostgreSQLの pgvector など)が現在暗号化されており、デプロイ時に置き換えられます。これは、既存のベクターリストが削除されることを意味します。 10 | - ボットを作成できるユーザーを制限するために、Cognito ユーザーグループ `CreatingBotAllowed` を導入しました。現在の既存のユーザーはこのグループに属していないため、ボットを作成できるようにするには、手動で権限を付与する必要があります。詳細は:[ボットのパーソナライズ](../../README.md#bot-personalization) 11 | 12 | ## 初期要件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_th-TH_ja-JP.md)を読み、アイテムのリストア方法を決定してください。 15 | 16 | ## 手順 17 | 18 | ### ベクターストレージの移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - 展開したいブランチをフェッチし、目的のブランチ(この場合は `v1`)に切り替え、最新の変更をプルします: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSでアイテムをリストアする場合は、パスワードのローテーションを無効にし、データベースにアクセスするためのパスワードをメモすることを忘れないでください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))で復元する場合、パスワードをメモする必要はありません 30 | - CloudFormationが既存のAuroraクラスターを削除できるように、[公開されているAPI](../PUBLISH_API_th-TH_ja-JP.md)をすべて削除します 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行して、Auroraクラスターを置き換え、すべてのベクターアイテムを削除します 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_th-TH_ja-JP.md)に従って、ベクターアイテムを復元します 33 | - 既存のボットが知識を持っていることを確認します(例:RAGボット) 34 | 35 | ### CreatingBotAllowedの権限の追加 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できなくなります 38 | - 特定のユーザーにボットの作成を許可する場合は、管理コンソールまたはCLIを使用して、それらのユーザーを `CreatingBotAllowed` グループに追加します 39 | - ユーザーがボットを作成できることを確認します。ユーザーは再ログインする必要があることに注意してください -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_vi-VN_ja-JP.md: -------------------------------------------------------------------------------- 1 | # 移行ガイド(v0からv1へ) 2 | 3 | 以前のバージョン(〜`0.4.x`)のBedrock Claude Chatを使用していた場合は、以下の手順に従って移行する必要があります。 4 | 5 | ## なぜこれを行う必要があるのか? 6 | 7 | この重要な更新には、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベースストレージ(Aurora PostgreSQLの pgvector など)が現在暗号化されており、これにより展開時に置き換えがトリガーされます。これは、既存のベクターアイテムが削除されることを意味します。 10 | - Cognitoユーザーグループ `CreatingBotAllowed` を導入し、botを作成できるユーザーを制限しました。既存のユーザーはこのグループに属していないため、botを作成できるようにする場合は、手動で権限を割り当てる必要があります。参照: [Botのパーソナライズ](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_vi-VN_ja-JP.md)を読み、アイテムのリストア方法を特定してください。 15 | 16 | ## 手順 17 | 18 | ### ベクターリポジトリの移動 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動 21 | - デプロイしたいブランチをチェックアウトします。以下は目的のブランチ(この場合は `v1`)で、最新の変更をプルします: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSでアイテムを復元する場合、パスワードのローテーションを無効にし、データベースアクセス用のパスワードメモを忘れないでください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))で復元する場合、パスワードメモは不要です。 30 | - CloudFormationが現在のAuroraクラスターを削除できるように、[公開済みのAPI](../PUBLISH_API_vi-VN_ja-JP.md)をすべて削除します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行すると、Auroraクラスターが置き換えられ、すべてのベクターアイテムが削除されます。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_vi-VN_ja-JP.md)に従って、ベクターアイテムを復元します。 33 | - 既存のRAGボットを含む、ユーザーが既存のボットを使用できることを確認します。 34 | 35 | ### CreatingBotAllowedの権限を付与 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できなくなります。 38 | - 特定のユーザーにボット作成を許可する場合は、管理コンソールまたはCLIを使用して、それらのユーザーを `CreatingBotAllowed` グループに追加します。 39 | - ユーザーがボットを作成できるかどうかを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_zh-CN.md: -------------------------------------------------------------------------------- 1 | # 迁移指南(v0 到 v1) 2 | 3 | 如果你已经使用了之前版本的 Bedrock Chat(约 `0.4.x`),则需要按照以下步骤进行迁移。 4 | 5 | ## 为什么需要这样做? 6 | 7 | 这个重大更新包含重要的安全更新。 8 | 9 | - 向量数据库(即 Aurora PostgreSQL 上的 pgvector)存储现在已加密,部署时会触发替换。这意味着现有的向量项目将被删除。 10 | - 我们引入了 `CreatingBotAllowed` Cognito 用户组,以限制可以创建机器人的用户。当前现有用户不在此组中,因此如果您希望他们具有创建机器人的权限,需要手动附加权限。参见:[机器人个性化](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | 阅读 [数据库迁移指南](./DATABASE_MIGRATION_zh-CN.md) 并确定恢复项目的方法。 15 | 16 | ## 步骤 17 | 18 | ### 向量存储迁移 19 | 20 | - 打开终端并导航到项目目录 21 | - 拉取你想要部署的分支。切换到目标分支(在本例中是 `v1`)并拉取最新更改: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - 如果你希望使用 DMS 恢复项目,请务必禁用密码轮换并记录访问数据库的密码。如果使用迁移脚本([migrate_v0_v1.py](./migrate_v0_v1.py)),则无需记录密码。 30 | - 删除所有[已发布的 API](../PUBLISH_API_zh-CN.md),以便 CloudFormation 可以移除现有的 Aurora 集群。 31 | - 运行 [npx cdk deploy](../README.md#deploy-using-cdk) 触发 Aurora 集群替换并删除所有向量项目。 32 | - 按照[数据库迁移指南](./DATABASE_MIGRATION_zh-CN.md)恢复向量项目。 33 | - 验证用户是否可以使用现有的具有知识的机器人,即 RAG 机器人。 34 | 35 | ### 附加 CreatingBotAllowed 权限 36 | 37 | - 部署后,所有用户将无法创建新的机器人。 38 | - 如果你希望特定用户能够创建机器人,请使用管理控制台或 CLI 将这些用户添加到 `CreatingBotAllowed` 组。 39 | - 验证用户是否可以创建机器人。请注意,用户需要重新登录。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_zh-CN_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド(v0 から v1) 2 | 3 | 以前のバージョンの Bedrock Claude Chat(約 `0.4.x`)を使用していた場合、以下の手順に従ってマイグレーションする必要があります。 4 | 5 | ## なぜこれを行う必要があるのか? 6 | 7 | この重要な更新には、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベース(Aurora PostgreSQL の pgvector)のストレージが暗号化されました。これは、デプロイ時に置き換えがトリガーされることを意味します。つまり、既存のベクタープロジェクトは削除されます。 10 | - ボットを作成できるユーザーを制限するために、`CreatingBotAllowed` Cognito ユーザーグループを導入しました。現在の既存ユーザーはこのグループに属していないため、ボット作成の権限を持たせたい場合は、手動で権限を付与する必要があります。詳細は以下を参照してください:[Bot のパーソナライズ](../../README.md#bot-personalization) 11 | 12 | ## 前提条件 13 | 14 | 阅读 [数据库迁移指南](./DATABASE_MIGRATION_zh-CN_ja-JP.md) 并确定復元プロジェクトの方法。 15 | 16 | ## 手順 17 | 18 | ### ベクターストレージの移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - デプロイしたいブランチをプルします。対象のブランチ(この例では `v1`)に切り替え、最新の変更をプルします: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMS を使用してプロジェクトを復元する場合は、パスワードローテーションを無効にし、データベースにアクセスするためのパスワードをメモしてください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))を使用する場合は、パスワードをメモする必要はありません。 30 | - CloudFormation が既存の Aurora クラスターを削除できるように、[公開済みの API](../PUBLISH_API_zh-CN_ja-JP.md) をすべて削除します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk) を実行して、Aurora クラスターの置換とすべてのベクタープロジェクトの削除をトリガーします。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_zh-CN_ja-JP.md)に従ってベクタープロジェクトを復元します。 33 | - 既存の知識を持つボット(RAG ボット)をユーザーが使用できることを確認します。 34 | 35 | ### CreatingBotAllowed 権限の追加 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できなくなります。 38 | - 特定のユーザーにボットの作成を許可する場合は、管理コンソールまたは CLI を使用して、これらのユーザーを `CreatingBotAllowed` グループに追加します。 39 | - ユーザーがボットを作成できることを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_zh-TW.md: -------------------------------------------------------------------------------- 1 | # 遷移指南(v0 到 v1) 2 | 3 | 如果您已經使用先前版本的 Bedrock Chat(約 `0.4.x`),則需要按照以下步驟進行遷移。 4 | 5 | ## 為什麼需要進行這個更新? 6 | 7 | 這個重大更新包含重要的安全性更新。 8 | 9 | - 向量資料庫(即 Aurora PostgreSQL 上的 pgvector)儲存現在已加密,部署時會觸發替換。這意味著現有的向量項目將被刪除。 10 | - 我們引入了 `CreatingBotAllowed` Cognito 使用者群組,以限制可以建立機器人的使用者。目前現有的使用者不在此群組中,因此如果您希望他們具有建立機器人的權限,需要手動附加權限。請參閱:[機器人個人化](../../README.md#bot-personalization) 11 | 12 | ## 先決條件 13 | 14 | 閱讀 [資料庫遷移指南](./DATABASE_MIGRATION_zh-TW.md) 並確定還原項目的方法。 15 | 16 | ## 步驟 17 | 18 | ### 向量存儲遷移 19 | 20 | - 開啟您的終端機並導航至專案目錄 21 | - 拉取您要部署的分支。以下是切換至所需分支(在此情況下為 `v1`)並拉取最新變更: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - 如果您希望使用 DMS 還原項目,請務必禁用密碼輪換並記下訪問資料庫的密碼。如果使用遷移腳本([migrate_v0_v1.py](./migrate_v0_v1.py)),則無需記下密碼。 30 | - 刪除所有[已發布的 API](../PUBLISH_API_zh-TW.md),以便 CloudFormation 可以移除現有的 Aurora 叢集。 31 | - 運行 [npx cdk deploy](../README.md#deploy-using-cdk) 觸發 Aurora 叢集替換並刪除所有向量項目。 32 | - 按照[資料庫遷移指南](./DATABASE_MIGRATION_zh-TW.md)還原向量項目。 33 | - 驗證用戶是否可以使用現有的知識機器人,即 RAG 機器人。 34 | 35 | ### 附加 CreatingBotAllowed 權限 36 | 37 | - 部署後,所有用戶將無法創建新的機器人。 38 | - 如果您希望特定用戶能夠創建機器人,請使用管理控制台或 CLI 將這些用戶添加到 `CreatingBotAllowed` 群組。 39 | - 驗證用戶是否可以創建機器人。請注意,用戶需要重新登錄。 -------------------------------------------------------------------------------- /docs/migration/V0_TO_V1_zh-TW_ja-JP.md: -------------------------------------------------------------------------------- 1 | # マイグレーションガイド(v0 から v1) 2 | 3 | Bedrock Claude Chat の以前のバージョン(約 `0.4.x`)を使用している場合、以下の手順に従ってマイグレーションする必要があります。 4 | 5 | ## なぜこれを行う必要があるのですか? 6 | 7 | 今回の重大な更新には、重要なセキュリティ更新が含まれています。 8 | 9 | - ベクターデータベース(Aurora PostgreSQL上の pgvector)の保存が暗号化され、デプロイ時に置き換えがトリガーされます。これは、既存のベクター項目が削除されることを意味します。 10 | - `CreatingBotAllowed` Cognitoユーザーグループを導入し、ボットを作成できるユーザーを制限しました。現在の既存のユーザーはこのグループに属していないため、ボット作成の権限を持たせたい場合は、手動で権限を付与する必要があります。詳細は以下を参照してください:[ボットのパーソナライズ](../../README.md#bot-personalization) 11 | 12 | ## 先決条件 13 | 14 | [データベース移行ガイド](./DATABASE_MIGRATION_zh-TW_ja-JP.md)を読み、プロジェクトのロールバック方法を確認してください。 15 | 16 | ## 手順 17 | 18 | ### ベクターストレージの移行 19 | 20 | - ターミナルを開き、プロジェクトディレクトリに移動します 21 | - デプロイするブランチをプルします。必要なブランチ(この場合は `v1`)に切り替え、最新の変更をプルします: 22 | 23 | ```sh 24 | git fetch 25 | git checkout v1 26 | git pull origin v1 27 | ``` 28 | 29 | - DMSを使用してプロジェクトを復元する場合は、パスワードローテーションを無効にし、データベースにアクセスするパスワードをメモしてください。移行スクリプト([migrate_v0_v1.py](./migrate_v0_v1.py))を使用する場合は、パスワードをメモする必要はありません。 30 | - 既存のAuroraクラスターを削除できるように、[公開済みのAPI](../PUBLISH_API_zh-TW_ja-JP.md)をすべて削除します。 31 | - [npx cdk deploy](../README.md#deploy-using-cdk)を実行して、Auroraクラスターの置換とすべてのベクターアイテムの削除をトリガーします。 32 | - [データベース移行ガイド](./DATABASE_MIGRATION_zh-TW_ja-JP.md)に従って、ベクターアイテムを復元します。 33 | - ユーザーが既存のナレッジボット(RAGボット)を使用できることを確認します。 34 | 35 | ### CreatingBotAllowed 権限の追加 36 | 37 | - デプロイ後、すべてのユーザーは新しいボットを作成できなくなります。 38 | - 特定のユーザーにボットの作成を許可する場合は、管理コンソールまたはCLIを使用して、これらのユーザーを `CreatingBotAllowed` グループに追加します。 39 | - ユーザーがボットを作成できることを確認します。ユーザーは再ログインする必要があることに注意してください。 -------------------------------------------------------------------------------- /examples/agents/tools/bmi/README.md: -------------------------------------------------------------------------------- 1 | # BMI calculation tool 2 | 3 | ## Overview 4 | 5 | The BMI (Body Mass Index) calculation tool is a custom tool designed to compute the BMI of an individual based on their height and weight. This tool helps users quickly determine their BMI and understand which weight category they fall into, such as underweight, normal weight, overweight, or obese. 6 | 7 | ## How to enable this tool 8 | 9 | - Move `bmi.py` under `backend/app/agents/tools` directory. 10 | - Open `backend/app/agents/utils.py` and modify like: 11 | 12 | ```py 13 | from app.agents.langchain import BedrockLLM 14 | from app.agents.tools.base import BaseTool 15 | from app.agents.tools.internet_search import internet_search_tool 16 | + from app.agents.tools.bmi import bmi_tool 17 | 18 | 19 | def get_available_tools() -> list[BaseTool]: 20 | tools: list[BaseTool] = [] 21 | tools.append(internet_search_tool) 22 | + tools.append(bmi_tool) 23 | 24 | return tools 25 | ``` 26 | 27 | - Run `npx cdk deploy`. 28 | -------------------------------------------------------------------------------- /examples/agents/tools/bmi/test_bmi.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | sys.path.append(".") 4 | import unittest 5 | 6 | from app.agents.tools.bmi import bmi_tool 7 | 8 | 9 | class TestBmiTool(unittest.TestCase): 10 | def test_bmi(self): 11 | result = bmi_tool.run( 12 | tool_use_id="dummy", 13 | input={ 14 | "height": 170, 15 | "weight": 70, 16 | }, 17 | model="claude-v3.5-sonnet-v2", 18 | ) 19 | print(result) 20 | self.assertEqual(type(result), str) 21 | 22 | 23 | if __name__ == "__main__": 24 | unittest.main() 25 | -------------------------------------------------------------------------------- /frontend/.env.template: -------------------------------------------------------------------------------- 1 | # Please duplicate this file to ".env.local" for local development 2 | # in production development, these values will be automatically set. 3 | VITE_APP_API_ENDPOINT="" 4 | VITE_APP_WS_ENDPOINT="" 5 | VITE_APP_USER_POOL_ID="" 6 | VITE_APP_USER_POOL_CLIENT_ID="" 7 | VITE_APP_REGION="us-east-1" 8 | VITE_APP_REDIRECT_SIGNIN_URL="http://localhost:5173/" 9 | VITE_APP_REDIRECT_SIGNOUT_URL="http://localhost:5173/" 10 | VITE_APP_COGNITO_DOMAIN="" 11 | VITE_APP_USE_STREAMING="true" 12 | VITE_APP_SOCIAL_PROVIDERS="" -------------------------------------------------------------------------------- /frontend/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:@typescript-eslint/recommended', 7 | 'plugin:react-hooks/recommended', 8 | 'plugin:tailwindcss/recommended', 9 | ], 10 | ignorePatterns: ['dist', '.eslintrc.cjs'], 11 | parser: '@typescript-eslint/parser', 12 | plugins: ['react-refresh'], 13 | rules: { 14 | 'react-refresh/only-export-components': [ 15 | 'warn', 16 | { allowConstantExport: true }, 17 | ], 18 | // Prettire で実施するので ESLint の Rule は無効化 19 | 'tailwindcss/classnames-order': ['off'], 20 | curly: ['error', 'all'], 21 | }, 22 | }; 23 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | dev-dist 14 | *.local 15 | 16 | # Editor directories and files 17 | .vscode/* 18 | !.vscode/extensions.json 19 | .idea 20 | .DS_Store 21 | *.suo 22 | *.ntvs* 23 | *.njsproj 24 | *.sln 25 | *.sw? 26 | -------------------------------------------------------------------------------- /frontend/.ladle/components.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect } from 'react'; 2 | import '../src/i18n'; 3 | import { GlobalProvider } from '@ladle/react'; 4 | import { useLadleContext } from '@ladle/react'; 5 | import '../src/index.css'; 6 | 7 | export const Provider: GlobalProvider = ({ children }) => { 8 | const { globalState } = useLadleContext(); 9 | 10 | useEffect(() => { 11 | const bodyClass = document.body.classList; 12 | 13 | if (globalState.theme === 'dark') { 14 | bodyClass.add('dark'); 15 | } else { 16 | bodyClass.remove('dark'); 17 | } 18 | }, [globalState.theme]); 19 | 20 | return <>{children}; 21 | }; 22 | -------------------------------------------------------------------------------- /frontend/.ladle/config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('@ladle/react').UserConfig} */ 2 | export default { 3 | addons: { 4 | msw: { 5 | enabled: true, 6 | }, 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /frontend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 2, 4 | "semi": true, 5 | "singleQuote": true, 6 | "bracketSpacing": true, 7 | "bracketSameLine": true, 8 | "arrowParens": "always", 9 | "plugins": [ 10 | "prettier-plugin-tailwindcss" 11 | ] 12 | } -------------------------------------------------------------------------------- /frontend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM public.ecr.aws/docker/library/node:18-bullseye-slim 2 | 3 | WORKDIR /app 4 | 5 | COPY package.json package-lock.json ./ 6 | RUN npm ci 7 | 8 | 9 | COPY . . 10 | RUN npm run build 11 | 12 | EXPOSE 5173 13 | 14 | CMD ["npm", "run", "dev"] 15 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /frontend/public/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/.gitkeep -------------------------------------------------------------------------------- /frontend/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/favicon.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_128.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_144.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_152.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_16.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_192.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_32.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_384.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_48.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_512.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_64.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_72.png -------------------------------------------------------------------------------- /frontend/public/images/bedrock_icon_96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/public/images/bedrock_icon_96.png -------------------------------------------------------------------------------- /frontend/src/@types/auth.d.ts: -------------------------------------------------------------------------------- 1 | // Due to peer dependency issues arising from the introduction of xstate V5, I implemented it by directly defining types instead of through the library. 2 | export type SocialProvider = 'amazon' | 'apple' | 'facebook' | 'google'; 3 | -------------------------------------------------------------------------------- /frontend/src/@types/common.d.ts: -------------------------------------------------------------------------------- 1 | export type BaseProps = { 2 | className?: string | undefined; 3 | }; 4 | 5 | export type DrawerOptions = { 6 | displayCount: { 7 | starredBots: number; 8 | recentlyUsedBots: number; 9 | conversationHistory: number; 10 | }; 11 | }; 12 | -------------------------------------------------------------------------------- /frontend/src/@types/react-i18next.d.ts: -------------------------------------------------------------------------------- 1 | import "react-i18next"; 2 | import en from "../i18n/en"; 3 | declare module "i18next" { 4 | interface CustomTypeOptions { 5 | resources: typeof en; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /frontend/src/@types/user.d.ts: -------------------------------------------------------------------------------- 1 | export type User = { 2 | id: string; 3 | name: string; 4 | email: string; 5 | }; 6 | export type UserGroup = { 7 | name: string; 8 | description: string; 9 | }; 10 | 11 | export type SearchedUser = 12 | | ({ 13 | type: 'user'; 14 | } & User) 15 | | ({ 16 | type: 'group'; 17 | } & UserGroup); 18 | 19 | export type SearchUsersRequest = { 20 | prefix: string; 21 | }; 22 | export type SearchUsersResponse = User[]; 23 | 24 | export type SearchUserGroupsRequest = { 25 | prefix: string; 26 | }; 27 | export type SearchUserGroupsResponse = UseGroup[]; 28 | 29 | export type GetUserResponse = User; 30 | -------------------------------------------------------------------------------- /frontend/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws-samples/bedrock-chat/5105f8709e8481e1b54b34f3cc13997b510bc1fa/frontend/src/assets/.gitkeep -------------------------------------------------------------------------------- /frontend/src/components/Alert.stories.tsx: -------------------------------------------------------------------------------- 1 | import { useTranslation } from 'react-i18next'; 2 | import Alert from './Alert'; 3 | 4 | export const Warning = () => { 5 | const { t } = useTranslation(); 6 | return ( 7 | <> 8 | 12 | {t('admin.botManagement.alert.noApiKeys.body')} 13 | 14 | 15 | ); 16 | }; 17 | 18 | export const Error = () => { 19 | const { t } = useTranslation(); 20 | 21 | return ( 22 | 23 | <> 24 |
25 |
{t('bot.alert.sync.error.body')}
26 |
27 | 28 |
29 | ); 30 | }; 31 | 32 | export const Info = () => { 33 | const { t } = useTranslation(); 34 | 35 | return ( 36 | 37 |
{t('bot.apiSettings.alert.deploying.body')}
38 |
39 | ); 40 | }; 41 | -------------------------------------------------------------------------------- /frontend/src/components/Alert.tsx: -------------------------------------------------------------------------------- 1 | import React, { useMemo } from 'react'; 2 | import { BaseProps } from '../@types/common'; 3 | import { PiInfo, PiWarningCircleFill, PiWarningFill } from 'react-icons/pi'; 4 | import { twMerge } from 'tailwind-merge'; 5 | 6 | type Props = BaseProps & { 7 | severity: 'info' | 'warning' | 'error'; 8 | title?: string; 9 | children: React.ReactNode; 10 | }; 11 | 12 | const Alert: React.FC = (props) => { 13 | const icon = useMemo(() => { 14 | switch (props.severity) { 15 | case 'info': 16 | return ; 17 | case 'warning': 18 | return ; 19 | case 'error': 20 | return ; 21 | } 22 | }, [props.severity]); 23 | 24 | return ( 25 |
33 | {props.title && ( 34 |
38 | {icon} 39 |
{props.title}
40 |
41 | )} 42 | 43 |
44 | {props.children} 45 |
46 |
47 | ); 48 | }; 49 | 50 | export default Alert; 51 | -------------------------------------------------------------------------------- /frontend/src/components/AuthAmplify.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode, cloneElement, ReactElement } from 'react'; 2 | import { BaseProps } from '../@types/common'; 3 | import { Authenticator } from '@aws-amplify/ui-react'; 4 | import { useTranslation } from 'react-i18next'; 5 | import { useAuthenticator } from '@aws-amplify/ui-react'; 6 | import { SocialProvider } from '../@types/auth'; 7 | 8 | type Props = BaseProps & { 9 | socialProviders: SocialProvider[]; 10 | children: ReactNode; 11 | }; 12 | 13 | const AuthAmplify: React.FC = ({ socialProviders, children }) => { 14 | const { t } = useTranslation(); 15 | const { signOut } = useAuthenticator(); 16 | 17 | return ( 18 | ( 22 |
23 | {t('app.name')} 24 |
25 | ), 26 | }}> 27 | <>{cloneElement(children as ReactElement, { signOut })} 28 |
29 | ); 30 | }; 31 | 32 | export default AuthAmplify; 33 | -------------------------------------------------------------------------------- /frontend/src/components/Button.stories.tsx: -------------------------------------------------------------------------------- 1 | import { PiList } from 'react-icons/pi'; 2 | import Button from './Button'; 3 | 4 | export const Ideal = () => ( 5 | 8 | ); 9 | 10 | export const Loading = () => ( 11 | 14 | ); 15 | 16 | export const Text = () => ( 17 | 20 | ); 21 | 22 | export const Outlined = () => ( 23 | 26 | ); 27 | 28 | export const Disabled = () => ( 29 | 32 | ); 33 | 34 | export const Icon = () => ( 35 | 38 | ); 39 | 40 | export const RightIcon = () => ( 41 | 44 | ); 45 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonCopy.stories.tsx: -------------------------------------------------------------------------------- 1 | import ButtonCopy from './ButtonCopy'; 2 | 3 | export const Ideal = () => ; 4 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonCopy.tsx: -------------------------------------------------------------------------------- 1 | import React, { useCallback, useState } from 'react'; 2 | import ButtonIcon from './ButtonIcon'; 3 | import { BaseProps } from '../@types/common'; 4 | import { PiCheck, PiClipboard } from 'react-icons/pi'; 5 | import copy from 'copy-to-clipboard'; 6 | 7 | type Props = BaseProps & { 8 | text: string; 9 | }; 10 | 11 | const ButtonCopy: React.FC = (props) => { 12 | const [showsCheck, setshowsCheck] = useState(false); 13 | 14 | const copyMessage = useCallback((message: string) => { 15 | copy(message); 16 | setshowsCheck(true); 17 | 18 | setTimeout(() => { 19 | setshowsCheck(false); 20 | }, 3000); 21 | }, []); 22 | 23 | return ( 24 | { 27 | copyMessage(props.text); 28 | }}> 29 | {showsCheck ? : } 30 | 31 | ); 32 | }; 33 | 34 | export default ButtonCopy; 35 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonDownload.stories.tsx: -------------------------------------------------------------------------------- 1 | import ButtonDownload from './ButtonDownload'; 2 | 3 | export const Ideal = () => ; 4 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonFileChoose.stories.tsx: -------------------------------------------------------------------------------- 1 | import { TbPhotoPlus } from 'react-icons/tb'; 2 | import ButtonFileChoose from './ButtonFileChoose'; 3 | 4 | export const Ideal = () => ( 5 | {}}> 6 | 7 | 8 | ); 9 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonFileChoose.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode, useCallback } from 'react'; 2 | import { BaseProps } from '../@types/common'; 3 | import { twMerge } from 'tailwind-merge'; 4 | 5 | type Props = BaseProps & { 6 | children: ReactNode; 7 | disabled?: boolean; 8 | accept?: string; 9 | icon?: boolean; 10 | onChange: (fileList: FileList) => void; 11 | }; 12 | 13 | const ButtonFileChoose: React.FC = (props) => { 14 | const onChange: React.ChangeEventHandler = useCallback( 15 | (e) => { 16 | if (e.target.files) { 17 | props.onChange(e.target.files); 18 | } 19 | }, 20 | [props] 21 | ); 22 | 23 | return ( 24 | 44 | ); 45 | }; 46 | 47 | export default ButtonFileChoose; 48 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonIcon.stories.tsx: -------------------------------------------------------------------------------- 1 | import { PiPlus } from 'react-icons/pi'; 2 | import ButtonIcon from './ButtonIcon'; 3 | 4 | export const Ideal = () => ( 5 | {}}> 6 | 7 | 8 | ); 9 | 10 | export const Disabled = () => ( 11 | {}}> 12 | 13 | 14 | ); 15 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonIcon.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { BaseProps } from '../@types/common'; 3 | import { twMerge } from 'tailwind-merge'; 4 | 5 | type Props = BaseProps & { 6 | disabled?: boolean; 7 | onClick: (e: React.MouseEvent) => void; 8 | children: React.ReactNode; 9 | }; 10 | 11 | const ButtonIcon: React.FC = (props) => { 12 | return ( 13 | 28 | ); 29 | }; 30 | 31 | export default ButtonIcon; 32 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonReasoning.stories.tsx: -------------------------------------------------------------------------------- 1 | import ButtonReasoning from './ButtonReasoning'; 2 | import { useState } from 'react'; 3 | 4 | export const Default = () => { 5 | const [showReasoning, setShowReasoning] = useState(false); 6 | return ( 7 | setShowReasoning(!showReasoning)} 10 | /> 11 | ); 12 | }; 13 | 14 | export const IconOnly = () => { 15 | const [showReasoning, setShowReasoning] = useState(false); 16 | return ( 17 | setShowReasoning(!showReasoning)} 21 | /> 22 | ); 23 | }; 24 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonSend.stories.tsx: -------------------------------------------------------------------------------- 1 | import ButtonSend from './ButtonSend'; 2 | 3 | export const Ideal = () => {}} />; 4 | 5 | export const Loading = () => {}} />; 6 | 7 | export const Diabled = () => {}} />; 8 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonSend.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { PiPaperPlaneRightFill, PiSpinnerGap } from 'react-icons/pi'; 3 | import { BaseProps } from '../@types/common'; 4 | import { twMerge } from 'tailwind-merge'; 5 | 6 | type Props = BaseProps & { 7 | disabled?: boolean; 8 | loading?: boolean; 9 | onClick: () => void; 10 | }; 11 | 12 | const ButtonSend: React.FC = (props) => { 13 | return ( 14 | 30 | ); 31 | }; 32 | 33 | export default ButtonSend; 34 | -------------------------------------------------------------------------------- /frontend/src/components/ButtonStar.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ButtonIcon from './ButtonIcon'; 3 | import { PiStar, PiStarFill } from 'react-icons/pi'; 4 | import { BaseProps } from '../@types/common'; 5 | import { twMerge } from 'tailwind-merge'; 6 | 7 | type Props = BaseProps & { 8 | isStarred: boolean; 9 | disabled?: boolean; 10 | onClick: () => void; 11 | }; 12 | 13 | const ButtonStar: React.FC = (props) => { 14 | return ( 15 | 19 | {props.isStarred ? : } 20 | 21 | ); 22 | }; 23 | 24 | export default ButtonStar; 25 | -------------------------------------------------------------------------------- /frontend/src/components/DialogConfirmAddApiKey.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import { BaseProps } from '../@types/common'; 3 | import Button from './Button'; 4 | import ModalDialog from './ModalDialog'; 5 | import { useTranslation } from 'react-i18next'; 6 | import InputText from './InputText'; 7 | 8 | type Props = BaseProps & { 9 | isOpen: boolean; 10 | loading?: boolean; 11 | onAdd: (description: string) => void; 12 | onClose: () => void; 13 | }; 14 | 15 | const DialogConfirmAddApiKey: React.FC = (props) => { 16 | const { t } = useTranslation(); 17 | const [description, setDescription] = useState(''); 18 | 19 | useEffect(() => { 20 | if (props.isOpen) { 21 | setDescription(''); 22 | } 23 | }, [props.isOpen]); 24 | 25 | return ( 26 | 27 |
{t('bot.apiSettings.addApiKeyDialog.content')}
28 | { 32 | setDescription(val); 33 | }} 34 | /> 35 | 36 |
37 | 44 | 53 |
54 |
55 | ); 56 | }; 57 | 58 | export default DialogConfirmAddApiKey; 59 | -------------------------------------------------------------------------------- /frontend/src/components/DialogConfirmClearConversations.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { BaseProps } from '../@types/common'; 3 | import Button from './Button'; 4 | import ModalDialog from './ModalDialog'; 5 | import { Trans, useTranslation } from 'react-i18next'; 6 | 7 | type Props = BaseProps & { 8 | isOpen: boolean; 9 | onDelete: () => void; 10 | onClose: () => void; 11 | }; 12 | 13 | const DialogConfirmClearConversations: React.FC = (props) => { 14 | const { t } = useTranslation(); 15 | return ( 16 | 17 |
18 | , 22 | }} 23 | /> 24 |
25 | 26 |
27 | 30 | 37 |
38 |
39 | ); 40 | }; 41 | 42 | export default DialogConfirmClearConversations; 43 | -------------------------------------------------------------------------------- /frontend/src/components/DialogConfirmDeleteApi.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { BaseProps } from '../@types/common'; 3 | import Button from './Button'; 4 | import ModalDialog from './ModalDialog'; 5 | import { useTranslation } from 'react-i18next'; 6 | 7 | type Props = BaseProps & { 8 | isOpen: boolean; 9 | loading?: boolean; 10 | onDelete: () => void; 11 | onClose: () => void; 12 | }; 13 | 14 | const DialogConfirmDeleteApi: React.FC = (props) => { 15 | const { t } = useTranslation(); 16 | return ( 17 | 18 |
{t('bot.apiSettings.deleteApiDaialog.content')}
19 | 20 |
21 | 28 | 34 |
35 |
36 | ); 37 | }; 38 | 39 | export default DialogConfirmDeleteApi; 40 | -------------------------------------------------------------------------------- /frontend/src/components/DialogConfirmDeleteApiKey.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { BaseProps } from '../@types/common'; 3 | import Button from './Button'; 4 | import ModalDialog from './ModalDialog'; 5 | import { Trans, useTranslation } from 'react-i18next'; 6 | 7 | type Props = BaseProps & { 8 | isOpen: boolean; 9 | apiKeyTitle: string; 10 | onDelete: () => void; 11 | onClose: () => void; 12 | }; 13 | 14 | const DialogConfirmDeleteApiKey: React.FC = (props) => { 15 | const { t } = useTranslation(); 16 | return ( 17 | 20 |
21 | , 28 | }} 29 | /> 30 |
31 | 32 |
33 | 36 | 41 |
42 |
43 | ); 44 | }; 45 | 46 | export default DialogConfirmDeleteApiKey; 47 | -------------------------------------------------------------------------------- /frontend/src/components/DialogConfirmDeleteChat.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { BaseProps } from '../@types/common'; 3 | import { ConversationMeta } from '../@types/conversation'; 4 | import Button from './Button'; 5 | import ModalDialog from './ModalDialog'; 6 | import { Trans, useTranslation } from 'react-i18next'; 7 | 8 | type Props = BaseProps & { 9 | isOpen: boolean; 10 | target?: ConversationMeta; 11 | onDelete: (botId: string) => void; 12 | onClose: () => void; 13 | }; 14 | 15 | const DialogConfirmDeleteChat: React.FC = (props) => { 16 | const { t } = useTranslation(); 17 | return ( 18 | 19 |
20 | , 27 | }} 28 | /> 29 |
30 | 31 |
32 | 35 | 42 |
43 |
44 | ); 45 | }; 46 | 47 | export default DialogConfirmDeleteChat; 48 | -------------------------------------------------------------------------------- /frontend/src/components/DialogSelectLanguage.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { BaseProps } from '../@types/common'; 3 | import Button from './Button'; 4 | import ModalDialog from './ModalDialog'; 5 | import { useTranslation } from 'react-i18next'; 6 | import Select from './Select'; 7 | import { LANGUAGES } from '../i18n'; 8 | 9 | type Props = BaseProps & { 10 | isOpen: boolean; 11 | initialLanguage?: string; 12 | onSelectLanguage: (language: string) => void; 13 | onClose: () => void; 14 | }; 15 | 16 | const DialogSelectLanguage: React.FC = (props) => { 17 | const { t } = useTranslation(); 18 | const [language, setLanguage] = useState(props.initialLanguage ?? 'en'); 19 | 20 | return ( 21 | 22 |
23 |