diff --git a/.github/workflows/build-and-release.yml b/.github/workflows/build-and-release.yml index 6191915f..d1cc72fe 100644 --- a/.github/workflows/build-and-release.yml +++ b/.github/workflows/build-and-release.yml @@ -102,6 +102,12 @@ jobs: dotnet_runtime: 'linux-x64' dotnet_name_postfix: '-x86_64-unknown-linux-gnu' tauri_bundle: 'appimage deb updater' + + - platform: 'ubuntu-22.04-arm' # for ARM-based Linux + rust_target: 'aarch64-unknown-linux-gnu' + dotnet_runtime: 'linux-arm64' + dotnet_name_postfix: '-aarch64-unknown-linux-gnu' + tauri_bundle: 'appimage deb updater' - platform: 'windows-latest' # for x86-based Windows rust_target: 'x86_64-pc-windows-msvc' @@ -154,6 +160,19 @@ jobs: # Format the app version: formatted_app_version="v${app_version}" + # Set the architecture: + if sed --version 2>/dev/null | grep -q GNU; then + sed -i "10s/.*/${{ matrix.dotnet_runtime }}/" metadata.txt + else + sed -i '' "10s/.*/${{ matrix.dotnet_runtime }}/" metadata.txt + fi + + # Next line is the necessary PDFium version. + # The format is '137.0.7123.0'. What we need + # is the '7123' part: + pdfium_version=$(sed -n '11p' metadata.txt) + pdfium_version=$(echo $pdfium_version | cut -d'.' -f3) + # Write the metadata to the environment: echo "APP_VERSION=${app_version}" >> $GITHUB_ENV echo "FORMATTED_APP_VERSION=${formatted_app_version}" >> $GITHUB_ENV @@ -164,6 +183,8 @@ jobs: echo "RUST_VERSION=${rust_version}" >> $GITHUB_ENV echo "MUD_BLAZOR_VERSION=${mud_blazor_version}" >> $GITHUB_ENV echo "TAURI_VERSION=${tauri_version}" >> $GITHUB_ENV + echo "ARCHITECTURE=${{ matrix.dotnet_runtime }}" >> $GITHUB_ENV + echo "PDFIUM_VERSION=${pdfium_version}" >> $GITHUB_ENV # Log the metadata: echo "App version: '${formatted_app_version}'" @@ -174,6 +195,8 @@ jobs: echo "Rust version: '${rust_version}'" echo "MudBlazor version: '${mud_blazor_version}'" echo "Tauri version: '${tauri_version}'" + echo "Architecture: '${{ matrix.dotnet_runtime }}'" + echo "PDFium version: '${pdfium_version}'" - name: Read and format metadata (Windows) if: matrix.platform == 'windows-latest' @@ -206,6 +229,18 @@ jobs: # Format the app version: $formatted_app_version = "v${app_version}" + # Set the architecture: + $metadata[9] = "${{ matrix.dotnet_runtime }}" + + # Write the changed metadata back to the file: + Set-Content -Path metadata.txt -Value $metadata + + # Next line is the necessary PDFium version. + # The format is '137.0.7123.0'. What we need + # is the '7123' part: + $pdfium_version = $metadata[10] + $pdfium_version = $pdfium_version.Split('.')[2] + # Write the metadata to the environment: Write-Output "APP_VERSION=${app_version}" >> $env:GITHUB_ENV Write-Output "FORMATTED_APP_VERSION=${formatted_app_version}" >> $env:GITHUB_ENV @@ -215,6 +250,8 @@ jobs: Write-Output "DOTNET_RUNTIME_VERSION=${dotnet_runtime_version}" >> $env:GITHUB_ENV Write-Output "RUST_VERSION=${rust_version}" >> $env:GITHUB_ENV Write-Output "MUD_BLAZOR_VERSION=${mud_blazor_version}" >> $env:GITHUB_ENV + Write-Output "ARCHITECTURE=${{ matrix.dotnet_runtime }}" >> $env:GITHUB_ENV + Write-Output "PDFIUM_VERSION=${pdfium_version}" >> $env:GITHUB_ENV # Log the metadata: Write-Output "App version: '${formatted_app_version}'" @@ -225,6 +262,8 @@ jobs: Write-Output "Rust version: '${rust_version}'" Write-Output "MudBlazor version: '${mud_blazor_version}'" Write-Output "Tauri version: '${tauri_version}'" + Write-Output "Architecture: '${{ matrix.dotnet_runtime }}'" + Write-Output "PDFium version: '${pdfium_version}'" - name: Setup .NET uses: actions/setup-dotnet@v4 @@ -232,6 +271,117 @@ jobs: dotnet-version: ${{ env.DOTNET_SDK_VERSION }} cache: true cache-dependency-path: 'app/MindWork AI Studio/packages.lock.json' + + - name: Deploy PDFium (Unix) + if: matrix.platform != 'windows-latest' + env: + PDFIUM_VERSION: ${{ env.PDFIUM_VERSION }} + DOTNET_RUNTIME: ${{ matrix.dotnet_runtime }} + run: | + set -e + + # Target directory: + TLIB_DIR="runtime/resources/libraries" + mkdir -p "$TLIB_DIR" + + case "${DOTNET_RUNTIME}" in + linux-x64) + PDFIUM_FILE="linux-x64.tgz" + LIB_SOURCE="lib/libpdfium.so" + LIB_TARGET="libpdfium.so" + ;; + linux-arm64) + PDFIUM_FILE="linux-arm64.tgz" + LIB_SOURCE="lib/libpdfium.so" + LIB_TARGET="libpdfium.so" + ;; + osx-x64) + PDFIUM_FILE="mac-x64.tgz" + LIB_SOURCE="lib/libpdfium.dylib" + LIB_TARGET="libpdfium.dylib" + ;; + osx-arm64) + PDFIUM_FILE="mac-arm64.tgz" + LIB_SOURCE="lib/libpdfium.dylib" + LIB_TARGET="libpdfium.dylib" + ;; + *) + echo "Unknown platform: ${DOTNET_RUNTIME}" + exit 1 + ;; + esac + + PDFIUM_URL="https://github.com/bblanchon/pdfium-binaries/releases/download/chromium%2F${PDFIUM_VERSION}/pdfium-${PDFIUM_FILE}" + + echo "Download PDFium $PDFIUM_URL ..." + TMP=$(mktemp -d) + ARCHIVE="${TMP}/pdfium.tgz" + + curl -fsSL -o "$ARCHIVE" "$PDFIUM_URL" + + echo "Extracting PDFium ..." + tar xzf "$ARCHIVE" -C "$TMP" + SRC="${TMP}/${LIB_SOURCE}" + + if [ ! -f "$SRC" ]; then + echo "Was not able to find PDFium source: $SRC" + exit 1 + fi + + echo "Copy PDFium from ${LIB_TARGET} to ${TLIB_DIR}/" + cp -f "$SRC" "$TLIB_DIR/$LIB_TARGET" + + echo "Cleaning up ..." + rm -fr "$TMP" + + - name: Install PDFium (Windows) + if: matrix.platform == 'windows-latest' + env: + PDFIUM_VERSION: ${{ env.PDFIUM_VERSION }} + DOTNET_RUNTIME: ${{ matrix.dotnet_runtime }} + run: | + $TLIB_DIR = "runtime\resources\libraries" + New-Item -ItemType Directory -Force -Path $TLIB_DIR | Out-Null + + switch ($env:DOTNET_RUNTIME) { + "win-x64" { + $PDFIUM_FILE = "win-x64.tgz" + $LIB_SOURCE = "bin\pdfium.dll" + $LIB_TARGET = "pdfium.dll" + } + "win-arm64" { + $PDFIUM_FILE = "win-arm64.tgz" + $LIB_SOURCE = "bin\pdfium.dll" + $LIB_TARGET = "pdfium.dll" + } + default { + Write-Error "Unknown platform: $($env:DOTNET_RUNTIME)" + exit 1 + } + } + + $PDFIUM_URL = "https://github.com/bblanchon/pdfium-binaries/releases/download/chromium%2F$($env:PDFIUM_VERSION)/pdfium-$PDFIUM_FILE" + Write-Host "Download $PDFIUM_URL ..." + $TMP = New-TemporaryFile | Split-Path + $ARCHIVE = Join-Path $TMP "pdfium.tgz" + + Invoke-WebRequest -Uri $PDFIUM_URL -OutFile $ARCHIVE + + Write-Host "Extracting PDFium ..." + tar -xzf $ARCHIVE -C $TMP + + $SRC = Join-Path $TMP $LIB_SOURCE + if (!(Test-Path $SRC)) { + Write-Error "Cannot find PDFium source: $SRC" + exit 1 + } + + $DEST = Join-Path $TLIB_DIR $LIB_TARGET + Copy-Item -Path $SRC -Destination $DEST -Force + + Write-Host "Cleaning up ..." + Remove-Item $ARCHIVE -Force + Remove-Item $TMP -Recurse -Force - name: Build .NET project run: | @@ -275,7 +425,13 @@ jobs: if: matrix.platform == 'ubuntu-22.04' && contains(matrix.rust_target, 'x86_64') run: | sudo apt-get update - sudo apt-get install -y libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf + sudo apt-get install -y libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf libfuse2 + + - name: Setup dependencies (Ubuntu-specific, ARM) + if: matrix.platform == 'ubuntu-22.04-arm' && contains(matrix.rust_target, 'aarch64') + run: | + sudo apt-get update + sudo apt-get install -y libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf libfuse2 - name: Setup Tauri (Unix) if: matrix.platform != 'windows-latest' @@ -399,216 +555,11 @@ jobs: runtime/target/${{ matrix.rust_target }}/release/bundle/appimage/mind-work-ai-studio*AppImage.tar.gz* if-no-files-found: error retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }} - - build_linux_arm64: - name: Build app (linux-arm64) - runs-on: ubuntu-22.04 - needs: read_metadata - env: - SKIP: false # allows disabling this long-running job temporarily - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - lfs: false - - - name: Read and format metadata - if: ${{ env.SKIP != 'true' }} - id: metadata - run: | - # Read the lines of the metadata file: - app_version=$(sed -n '1p' metadata.txt) - build_time=$(sed -n '2p' metadata.txt) - build_number=$(sed -n '3p' metadata.txt) - - # Next line is the .NET SDK version. - # The format is '8.0.205 (commit 3e1383b780)'. - # We extract only the version number, though: - dotnet_sdk_version=$(sed -n '4p' metadata.txt | sed 's/[^0-9.]*\([0-9.]*\).*/\1/') - - # Next line is the .NET runtime version. - # The format is '8.0.5 (commit 087e15321b)'. - # We extract only the version number, though: - dotnet_runtime_version=$(sed -n '5p' metadata.txt | sed 's/[^0-9.]*\([0-9.]*\).*/\1/') - - # Next line is the Rust version. - # The format is '1.78.0 (commit 9b00956e5)'. - # We extract only the version number, though: - rust_version=$(sed -n '6p' metadata.txt | sed 's/[^0-9.]*\([0-9.]*\).*/\1/') - - # Next line is the MudBlazor version: - mud_blazor_version=$(sed -n '7p' metadata.txt) - - # Next line is the Tauri version: - tauri_version=$(sed -n '8p' metadata.txt) - - # Format the app version: - formatted_app_version="v${app_version}" - - # Write the metadata to the environment: - echo "APP_VERSION=${app_version}" >> $GITHUB_ENV - echo "FORMATTED_APP_VERSION=${formatted_app_version}" >> $GITHUB_ENV - echo "BUILD_TIME=${build_time}" >> $GITHUB_ENV - echo "BUILD_NUMBER=${build_number}" >> $GITHUB_ENV - echo "DOTNET_SDK_VERSION=${dotnet_sdk_version}" >> $GITHUB_ENV - echo "DOTNET_RUNTIME_VERSION=${dotnet_runtime_version}" >> $GITHUB_ENV - echo "RUST_VERSION=${rust_version}" >> $GITHUB_ENV - echo "MUD_BLAZOR_VERSION=${mud_blazor_version}" >> $GITHUB_ENV - echo "TAURI_VERSION=${tauri_version}" >> $GITHUB_ENV - - # Log the metadata: - echo "App version: '${formatted_app_version}'" - echo "Build time: '${build_time}'" - echo "Build number: '${build_number}'" - echo ".NET SDK version: '${dotnet_sdk_version}'" - echo ".NET runtime version: '${dotnet_runtime_version}'" - echo "Rust version: '${rust_version}'" - echo "MudBlazor version: '${mud_blazor_version}'" - echo "Tauri version: '${tauri_version}'" - - - name: Setup .NET - if: ${{ env.SKIP != 'true' }} - uses: actions/setup-dotnet@v4 - with: - dotnet-version: ${{ env.DOTNET_SDK_VERSI }} - cache: true - cache-dependency-path: 'app/MindWork AI Studio/packages.lock.json' - - - name: Build .NET project - if: ${{ env.SKIP != 'true' }} - run: | - cd "app/MindWork AI Studio" - dotnet publish --configuration release --runtime linux-arm64 --disable-build-servers --force --output ../../publish/dotnet - - - name: Move & rename the .NET artifact - if: ${{ env.SKIP != 'true' }} - run: | - mkdir -p "app/MindWork AI Studio/bin/dist" - cd publish/dotnet - mv mindworkAIStudio "../../app/MindWork AI Studio/bin/dist/mindworkAIStudioServer-aarch64-unknown-linux-gnu" - - - name: Cache linux arm64 runner image - if: ${{ env.SKIP != 'true' }} - uses: actions/cache@v4 - id: linux_arm_cache - with: - path: ${{ runner.temp }}/linux_arm_qemu_cache.img - key: target-linux-arm64-rust-${{ env.RUST_VERSION }} - - - name: Build linux arm runner image - uses: pguyot/arm-runner-action@v2 - id: build-linux-arm-runner - if: ${{ steps.linux_arm_cache.outputs.cache-hit != 'true' && env.SKIP != 'true' }} - env: - RUST_VERSION: ${{ env.RUST_VERSION }} - TAURI_VERSION: ${{ env.TAURI_VERSION }} - - with: - base_image: dietpi:rpi_armv8_bullseye - cpu: cortex-a53 - image_additional_mb: 8000 # ~ 8GB - optimize_image: false - shell: /bin/bash - commands: | - # Rust complains (rightly) that $HOME doesn't match eid home: - export HOME=/root - - # Workaround to CI worker being stuck on Updating crates.io index: - export CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse - - # Update and upgrade the system: - apt-get update --yes --allow-releaseinfo-change - apt-get upgrade --yes - apt-get autoremove --yes - apt-get install curl wget --yes - - # Install Rust: - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- --default-toolchain none -y - source "$HOME/.cargo/env" - rustup toolchain install $RUST_VERSION - - # Install build tools and tauri-cli requirements: - apt-get install --yes libwebkit2gtk-4.0-dev build-essential libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev - - # Setup Tauri: - cargo install --version 1.6.2 tauri-cli - - - name: Add the built runner image to the cache - if: ${{ steps.linux_arm_cache.outputs.cache-hit != 'true' && env.SKIP != 'true' }} - run: | - mv ${{ steps.build-linux-arm-runner.outputs.image }} ${{ runner.temp }}/linux_arm_qemu_cache.img - - # - # This step does not work, because we start a VM with qemu to run the build. - # - #- name: Delete previous artifact, which may exist due to caching (Linux - Debian Package) - # if: ${{ env.SKIP != 'true' }} - # run: | - # rm -f result/target/aarch64-unknown-linux-gnu/release/bundle/deb/mind-work-ai-studio_*.deb - - - name: Build Tauri project - if: ${{ env.SKIP != 'true' }} - uses: pguyot/arm-runner-action@v2 - id: build-linux-arm - - with: - base_image: file://${{ runner.temp }}/linux_arm_qemu_cache.img - cpu: cortex-a53 - optimize_image: false - copy_artifact_path: runtime - copy_artifact_dest: result - bind_mount_repository: true - - # - # We do not need to set the PRIVATE_PUBLISH_KEY and PRIVATE_PUBLISH_KEY_PASSWORD here, - # because we cannot produce the AppImage on arm64. Only the AppImage supports the automatic - # update feature. The Debian package does not support this feature. - # - #PRIVATE_PUBLISH_KEY: ${{ secrets.PRIVATE_PUBLISH_KEY }} - #PRIVATE_PUBLISH_KEY_PASSWORD: ${{ secrets.PRIVATE_PUBLISH_KEY_PASSWORD }} - # - - shell: /bin/bash - commands: | - # Delete all previous artifacts, which may exist due to caching: - rm -f runtime/target/aarch64-unknown-linux-gnu/release/bundle/deb/mind-work-ai-studio_*.deb - - export HOME=/root - export CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse - source "$HOME/.cargo/env" - cd runtime - - # Try to restore the Rust cache from previous build: - mkdir -p /rust-cache/target - rm -fr target - cp -Rp /rust-cache/target target - - cargo tauri build --target aarch64-unknown-linux-gnu --bundles deb - - # Save the built libraries for the next job: - rm -fr /rust-cache/target - cp -Rp target /rust-cache - - - name: Update the runner image to cache the Rust runtime build - if: ${{ env.SKIP != 'true' }} - run: | - mv ${{ steps.build-linux-arm.outputs.image }} $RUNNER_TEMP/linux_arm_qemu_cache.img - - - name: Upload artifact (Linux - Debian Package) - if: ${{ env.SKIP != 'true' && startsWith(github.ref, 'refs/tags/v') }} - uses: actions/upload-artifact@v4 - with: - name: MindWork AI Studio (Linux - deb linux-arm64) - path: | - result/target/aarch64-unknown-linux-gnu/release/bundle/deb/mind-work-ai-studio_*.deb - if-no-files-found: warn - retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }} create_release: name: Prepare & create release runs-on: ubuntu-latest - needs: [build_main, read_metadata, build_linux_arm64] + needs: [build_main, read_metadata] if: startsWith(github.ref, 'refs/tags/v') steps: - name: Create artifact directory @@ -682,6 +633,7 @@ jobs: # - platform=darwin-aarch64 when path contains 'aarch64-apple-darwin' # - platform=darwin-x86_64 when path contains 'x86_64-apple-darwin' # - platform=linux-x86_64 when path contains 'x86_64-unknown-linux-' + # - platform=linux-aarch64 when path contains 'aarch64-unknown-linux-' # - platform=windows-x86_64 when path contains 'x86_64-pc-windows-' # - platform=windows-aarch64 when path contains 'aarch64-pc-windows-' # @@ -691,6 +643,8 @@ jobs: platform="darwin-x86_64" elif [[ "$sig_file" == *"amd64.AppImage"* ]]; then platform="linux-x86_64" + elif [[ "$sig_file" == *"aarch64.AppImage"* ]]; then + platform="linux-aarch64" elif [[ "$sig_file" == *"x64-setup.nsis"* ]]; then platform="windows-x86_64" elif [[ "$sig_file" == *"arm64-setup.nsis"* ]]; then diff --git a/.gitignore b/.gitignore index a2cea037..8ac42484 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,11 @@ +# Ignore any startup.env file: +startup.env + +# Ignore pdfium library: +libpdfium.dylib +libpdfium.so +libpdfium.dll + # User-specific files *.rsuser *.suo diff --git a/README.md b/README.md index 9c1b3a37..6c6f289b 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ Things we are currently working on: - [x] ~~App: Management of data sources (local & external data via [ERI](https://github.com/MindWorkAI/ERI)) (PR [#259](https://github.com/MindWorkAI/AI-Studio/pull/259), [#273](https://github.com/MindWorkAI/AI-Studio/pull/273))~~ - [x] ~~Runtime: Extract data from txt / md / pdf / docx / xlsx files (PR [#374](https://github.com/MindWorkAI/AI-Studio/pull/374))~~ - [ ] (*Optional*) Runtime: Implement internal embedding provider through [fastembed-rs](https://github.com/Anush008/fastembed-rs) + - [ ] App: Implement dialog for checking & handling [pandoc](https://pandoc.org/) installation ([PR #393](https://github.com/MindWorkAI/AI-Studio/pull/393)) - [ ] App: Implement external embedding providers - [ ] App: Implement the process to vectorize one local file using embeddings - [ ] Runtime: Integration of the vector database [LanceDB](https://github.com/lancedb/lancedb) @@ -24,26 +25,37 @@ Things we are currently working on: - [x] ~~App: Integrate data sources in chats (PR [#282](https://github.com/MindWorkAI/AI-Studio/pull/282))~~ -- Since September 2024: Experiments have been started on how we can work on long texts with AI Studio. Let's say you want to write a fantasy novel or create a complex project proposal and use LLM for support. The initial experiments were promising, but not yet satisfactory. We are testing further approaches until a satisfactory solution is found. The current state of our experiment is available as an experimental preview feature through your app configuration. Related PR: ~~[#167](https://github.com/MindWorkAI/AI-Studio/pull/167), [#226](https://github.com/MindWorkAI/AI-Studio/pull/226)~~. +- Since September 2024: Experiments have been started on how we can work on long texts with AI Studio. Let's say you want to write a fantasy novel or create a complex project proposal and use LLM for support. The initial experiments were promising, but not yet satisfactory. We are testing further approaches until a satisfactory solution is found. The current state of our experiment is available as an experimental preview feature through your app configuration. Related PR: ~~[PR #167](https://github.com/MindWorkAI/AI-Studio/pull/167), [PR #226](https://github.com/MindWorkAI/AI-Studio/pull/226)~~, [PR #376](https://github.com/MindWorkAI/AI-Studio/pull/376). +- Since March 2025: We have started developing the plugin system. There will be language plugins to offer AI Studio in other languages, configuration plugins to centrally manage certain providers and rules within an organization, and assistant plugins that allow anyone to develop their own assistants. We are using Lua as the plugin language: + - [x] ~~Plan & implement the base plugin system ([PR #322](https://github.com/MindWorkAI/AI-Studio/pull/322))~~ + - [x] ~~Start the plugin system ([PR #372](https://github.com/MindWorkAI/AI-Studio/pull/372))~~ + - [x] ~~Added hot-reload support for plugins ([PR #377](https://github.com/MindWorkAI/AI-Studio/pull/377), [PR #391](https://github.com/MindWorkAI/AI-Studio/pull/391))~~ + - [x] Add support for other languages (I18N) to AI Studio (~~[PR #381](https://github.com/MindWorkAI/AI-Studio/pull/381), [PR #400](https://github.com/MindWorkAI/AI-Studio/pull/400), [PR #404](https://github.com/MindWorkAI/AI-Studio/pull/404), [PR #429](https://github.com/MindWorkAI/AI-Studio/pull/429), [PR #446](https://github.com/MindWorkAI/AI-Studio/pull/446), [PR #451](https://github.com/MindWorkAI/AI-Studio/pull/451), [PR #455](https://github.com/MindWorkAI/AI-Studio/pull/455), [PR #458](https://github.com/MindWorkAI/AI-Studio/pull/458), [PR #462](https://github.com/MindWorkAI/AI-Studio/pull/462), [PR #469](https://github.com/MindWorkAI/AI-Studio/pull/469), [PR #486](https://github.com/MindWorkAI/AI-Studio/pull/486))~~ + - [x] ~~Add an I18N assistant to translate all AI Studio texts to a certain language & culture ([PR #422](https://github.com/MindWorkAI/AI-Studio/pull/422))~~ + - [x] Provide MindWork AI Studio in German (~~[PR #430](https://github.com/MindWorkAI/AI-Studio/pull/430), [PR #446](https://github.com/MindWorkAI/AI-Studio/pull/446), [PR #451](https://github.com/MindWorkAI/AI-Studio/pull/451), [PR #455](https://github.com/MindWorkAI/AI-Studio/pull/455), [PR #458](https://github.com/MindWorkAI/AI-Studio/pull/458), [PR #462](https://github.com/MindWorkAI/AI-Studio/pull/462), [PR #469](https://github.com/MindWorkAI/AI-Studio/pull/469), [PR #486](https://github.com/MindWorkAI/AI-Studio/pull/486)~~) + - [ ] Add configuration plugins, which allow pre-defining some LLM providers in organizations + - [ ] Add an app store for plugins, showcasing community-contributed plugins from public GitHub and GitLab repositories. This will enable AI Studio users to discover, install, and update plugins directly within the platform. + - [ ] Add assistant plugins Other News: -- October 2024: We've found the first two financial supporters. Huge thanks to `richard-stanton` and `peerschuett` for backing the project. Thanks for having the courage to be the first to support us. +- April 2025: We have two active financial supporters: Peer `peerschuett` and Dominic `donework`. Thank you very much for your support. MindWork AI reinvests these donations by passing them on to our AI Studio dependencies ([see here](https://github.com/orgs/MindWorkAI/sponsoring)). In the event that we receive large donations, we will first sign the app ([#56](https://github.com/MindWorkAI/Planning/issues/56)). In case we receive more donations, we will look for and pay staff to develop features for AI Studio. -- October 2024: The [German Aerospace Center (DLR)](https://en.wikipedia.org/wiki/German_Aerospace_Center) ([Website](https://www.dlr.de/en)) will use AI Studio at least within the scope of one project and will also contribute to its further development. This is great news. +- April 2025: The [German Aerospace Center (DLR)](https://en.wikipedia.org/wiki/German_Aerospace_Center) ([Website](https://www.dlr.de/en)) will use AI Studio at least within the scope of three projects and will also contribute to its further development. This is great news. Features we have recently released: +- v0.9.44: Added PDF import to the text summarizer, translation, and legal check assistants, allowing you to import PDF files and use them as input for the assistants. +- v0.9.40: Added support for the `o4` models from OpenAI. Also, we added Alibaba Cloud & Hugging Face as LLM providers. +- v0.9.39: Added the plugin system as a preview feature. +- v0.9.31: Added Helmholtz & GWDG as LLM providers. This is a huge improvement for many researchers out there who can use these providers for free. We added DeepSeek as a provider as well. +- v0.9.29: Added agents to support the RAG process (selecting the best data sources & validating retrieved data as part of the augmentation process) +- v0.9.26+: Added RAG for external data sources using our [ERI interface](https://mindworkai.org/#eri---external-retrieval-interface) as a preview feature. - v0.9.25: Added [xAI](https://x.ai/) as a new provider. xAI provides their Grok models for generating content. - v0.9.23: Added support for OpenAI `o` models (`o1`, `o1-mini`, `o3`, etc.); added also an [ERI](https://github.com/MindWorkAI/ERI) server coding assistant as a preview feature behind the RAG feature flag. Your own ERI server can be used to gain access to, e.g., your enterprise data from within AI Studio. - v0.9.22: Added options for preview features; added embedding provider configuration for RAG (preview) and writer mode (experimental preview). -- v0.9.18: Added the new Anthropic Heiku model; added Groq and Google Gemini as provider options. -- v0.9.17: Added the new Anthropic model `claude-3-5-sonnet-20241022`. -- v0.9.16: Added workspace display options & improved the layout of the app window. -- v0.9.15: Added the bias-of-the-day assistant. Tells you about a cognitive bias every day. -- v0.9.13: You can use `ollama` providers secured with API keys. ## What is AI Studio? @@ -56,7 +68,19 @@ MindWork AI Studio is a free desktop app for macOS, Windows, and Linux. It provi **Key advantages:** - **Free of charge**: The app is free to use, both for personal and commercial purposes. -- **Independence**: You are not tied to any single provider. Instead, you can choose the provider that best suits their needs. Right now, we support OpenAI (GPT4o, o1, etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, and self-hosted models using [llama.cpp](https://github.com/ggerganov/llama.cpp), [ollama](https://github.com/ollama/ollama), [LM Studio](https://lmstudio.ai/), [Groq](https://groq.com/), or [Fireworks](https://fireworks.ai/). For scientists and employees of research institutions, we also support [Helmholtz](https://helmholtz.cloud/services/?serviceID=d7d5c597-a2f6-4bd1-b71e-4d6499d98570) and [GWDG](https://gwdg.de/services/application-services/ai-services/) AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities. +- **Independence**: You are not tied to any single provider. Instead, you can choose the providers that best suit your needs. Right now, we support: + - [OpenAI](https://openai.com/) (GPT4o, GPT4.1, o1, o3, o4, etc.) + - [Mistral](https://mistral.ai/) + - [Anthropic](https://www.anthropic.com/) (Claude) + - [Google Gemini](https://gemini.google.com) + - [xAI](https://x.ai/) (Grok) + - [DeepSeek](https://www.deepseek.com/en) + - [Alibaba Cloud](https://www.alibabacloud.com) (Qwen) + - [Hugging Face](https://huggingface.co/) using their [inference providers](https://huggingface.co/docs/inference-providers/index) such as Cerebras, Nebius, Sambanova, Novita, Hyperbolic, Together AI, Fireworks, Hugging Face + - Self-hosted models using [llama.cpp](https://github.com/ggerganov/llama.cpp), [ollama](https://github.com/ollama/ollama), [LM Studio](https://lmstudio.ai/) + - [Groq](https://groq.com/) + - [Fireworks](https://fireworks.ai/) + - For scientists and employees of research institutions, we also support [Helmholtz](https://helmholtz.cloud/services/?serviceID=d7d5c597-a2f6-4bd1-b71e-4d6499d98570) and [GWDG](https://gwdg.de/services/application-services/ai-services/) AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities. - **Assistants**: You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants. - **Unrestricted usage**: Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API. - **Cost-effective**: You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit. diff --git a/app/.run/Collect I18N content.run.xml b/app/.run/Collect I18N content.run.xml new file mode 100644 index 00000000..837832a3 --- /dev/null +++ b/app/.run/Collect I18N content.run.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/app/.run/Tauri Dev.run.xml b/app/.run/[1] Start Tauri.run.xml similarity index 72% rename from app/.run/Tauri Dev.run.xml rename to app/.run/[1] Start Tauri.run.xml index 7c319e82..3eb775a5 100644 --- a/app/.run/Tauri Dev.run.xml +++ b/app/.run/[1] Start Tauri.run.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/.run/[2] Start .NET Server.run.xml b/app/.run/[2] Start .NET Server.run.xml new file mode 100644 index 00000000..edf616ea --- /dev/null +++ b/app/.run/[2] Start .NET Server.run.xml @@ -0,0 +1,27 @@ + + + + \ No newline at end of file diff --git a/app/Build/Build Script.csproj b/app/Build/Build Script.csproj new file mode 100644 index 00000000..5694b509 --- /dev/null +++ b/app/Build/Build Script.csproj @@ -0,0 +1,21 @@ + + + + Exe + net9.0 + Build + latest + enable + enable + build + + + + + + + + + + + diff --git a/app/Build/Commands/AppVersion.cs b/app/Build/Commands/AppVersion.cs new file mode 100644 index 00000000..897e0ce0 --- /dev/null +++ b/app/Build/Commands/AppVersion.cs @@ -0,0 +1,3 @@ +namespace Build.Commands; + +public record AppVersion(string VersionText, int Major, int Minor, int Patch); \ No newline at end of file diff --git a/app/Build/Commands/CheckRidsCommand.cs b/app/Build/Commands/CheckRidsCommand.cs new file mode 100644 index 00000000..74912a33 --- /dev/null +++ b/app/Build/Commands/CheckRidsCommand.cs @@ -0,0 +1,26 @@ +// ReSharper disable ClassNeverInstantiated.Global +// ReSharper disable UnusedType.Global +// ReSharper disable UnusedMember.Global +namespace Build.Commands; + +public sealed class CheckRidsCommand +{ + [Command("check-rids", Description = "Check the RIDs for the current OS")] + public void GetRids() + { + if(!Environment.IsWorkingDirectoryValid()) + return; + + var rids = Environment.GetRidsForCurrentOS(); + Console.WriteLine("The following RIDs are available for the current OS:"); + foreach (var rid in rids) + { + Console.WriteLine($"- {rid}"); + } + + Console.WriteLine(); + Console.WriteLine("The RID for the current OS and CPU is:"); + var currentRid = Environment.GetCurrentRid(); + Console.WriteLine($"- {currentRid}"); + } +} \ No newline at end of file diff --git a/app/Build/Commands/CollectI18NKeysCommand.cs b/app/Build/Commands/CollectI18NKeysCommand.cs new file mode 100644 index 00000000..ec7c291f --- /dev/null +++ b/app/Build/Commands/CollectI18NKeysCommand.cs @@ -0,0 +1,281 @@ +using System.Text.RegularExpressions; + +using SharedTools; + +// ReSharper disable ClassNeverInstantiated.Global +// ReSharper disable UnusedType.Global +// ReSharper disable UnusedMember.Global + +namespace Build.Commands; + +public sealed partial class CollectI18NKeysCommand +{ + private const string START_TAG1 = """ + T(" + """; + + private const string START_TAG2 = """ + TB(" + """; + + private const string START_TAG3 = """ + T(@" + """; + + private const string END_TAG = """ + ") + """; + + private static readonly (string Tag, int Length)[] START_TAGS = + [ + (START_TAG1, START_TAG1.Length), + (START_TAG2, START_TAG2.Length), + (START_TAG3, START_TAG3.Length) + ]; + + [Command("collect-i18n", Description = "Collect I18N keys")] + public async Task CollectI18NKeys() + { + if(!Environment.IsWorkingDirectoryValid()) + return; + + Console.WriteLine("========================="); + Console.Write("- Collecting I18N keys ..."); + + var cwd = Environment.GetAIStudioDirectory(); + var binPath = Path.Join(cwd, "bin"); + var objPath = Path.Join(cwd, "obj"); + var wwwrootPath = Path.Join(cwd, "wwwroot"); + var allFiles = Directory.EnumerateFiles(cwd, "*", SearchOption.AllDirectories); + var counter = 0; + + var allI18NContent = new Dictionary(); + foreach (var filePath in allFiles) + { + counter++; + if(filePath.StartsWith(binPath, StringComparison.OrdinalIgnoreCase)) + continue; + + if(filePath.StartsWith(objPath, StringComparison.OrdinalIgnoreCase)) + continue; + + if(filePath.StartsWith(wwwrootPath, StringComparison.OrdinalIgnoreCase)) + continue; + + var content = await File.ReadAllTextAsync(filePath, Encoding.UTF8); + var matches = this.FindAllTextTags(content); + if (matches.Count == 0) + continue; + + var ns = this.DetermineNamespace(filePath); + var fileInfo = new FileInfo(filePath); + var name = fileInfo.Name.Replace(fileInfo.Extension, string.Empty).Replace(".razor", string.Empty); + var langNamespace = $"{ns}.{name}".ToUpperInvariant(); + foreach (var match in matches) + { + // The key in the format A.B.C.D.T{hash}: + var key = $"UI_TEXT_CONTENT.{langNamespace}.T{match.ToFNV32()}"; + allI18NContent.TryAdd(key, match); + } + } + + Console.WriteLine($" {counter:###,###} files processed, {allI18NContent.Count:###,###} keys found."); + + Console.Write("- Creating Lua code ..."); + var luaCode = this.ExportToLuaAssignments(allI18NContent); + + // Build the path, where we want to store the Lua code: + var luaPath = Path.Join(cwd, "Assistants", "I18N", "allTexts.lua"); + + // Store the Lua code: + await File.WriteAllTextAsync(luaPath, luaCode, Encoding.UTF8); + + Console.WriteLine(" done."); + } + + private string ExportToLuaAssignments(Dictionary keyValuePairs) + { + var sb = new StringBuilder(); + + // Add the mandatory plugin metadata: + sb.AppendLine( + """ + -- The ID for this plugin: + ID = "77c2688a-a68f-45cc-820e-fa8f3038a146" + + -- The icon for the plugin: + ICON_SVG = "" + + -- The name of the plugin: + NAME = "Collected I18N keys" + + -- The description of the plugin: + DESCRIPTION = "This plugin is not meant to be used directly. Its a collection of all I18N keys found in the project." + + -- The version of the plugin: + VERSION = "1.0.0" + + -- The type of the plugin: + TYPE = "LANGUAGE" + + -- The authors of the plugin: + AUTHORS = {"MindWork AI Community"} + + -- The support contact for the plugin: + SUPPORT_CONTACT = "MindWork AI Community" + + -- The source URL for the plugin: + SOURCE_URL = "https://github.com/MindWorkAI/AI-Studio" + + -- The categories for the plugin: + CATEGORIES = { "CORE" } + + -- The target groups for the plugin: + TARGET_GROUPS = { "EVERYONE" } + + -- The flag for whether the plugin is maintained: + IS_MAINTAINED = true + + -- When the plugin is deprecated, this message will be shown to users: + DEPRECATION_MESSAGE = "" + + -- The IETF BCP 47 tag for the language. It's the ISO 639 language + -- code followed by the ISO 3166-1 country code: + IETF_TAG = "en-US" + + -- The language name in the user's language: + LANG_NAME = "English (United States)" + + """ + ); + + // Add the UI_TEXT_CONTENT table: + LuaTable.Create(ref sb, "UI_TEXT_CONTENT", keyValuePairs); + return sb.ToString(); + } + + private List FindAllTextTags(ReadOnlySpan fileContent) + { + (int Index, int Len) FindNextStart(ReadOnlySpan content) + { + var bestIndex = -1; + var bestLength = 0; + + foreach (var (tag, length) in START_TAGS) + { + var index = content.IndexOf(tag); + if (index != -1 && (bestIndex == -1 || index < bestIndex)) + { + bestIndex = index; + bestLength = length; + } + } + + return (bestIndex, bestLength); + } + + var matches = new List(); + var startIdx = FindNextStart(fileContent); + var content = fileContent; + while (startIdx.Index > -1) + { + // + // In some cases, after the initial " there follow more " characters. + // We need to skip them: + // + content = content[(startIdx.Index + startIdx.Len)..]; + while(content[0] == '"') + content = content[1..]; + + var endIdx = content.IndexOf(END_TAG); + if (endIdx == -1) + break; + + var match = content[..endIdx]; + while (match[^1] == '"') + match = match[..^1]; + + matches.Add(match.ToString()); + startIdx = FindNextStart(content); + } + + return matches; + } + + private string? DetermineNamespace(string filePath) + { + // Is it a C# file? Then we can read the namespace from it: + if (filePath.EndsWith(".cs", StringComparison.OrdinalIgnoreCase)) + return this.ReadNamespaceFromCSharp(filePath); + + // Is it a Razor file? Then, it depends: + if (filePath.EndsWith(".razor", StringComparison.OrdinalIgnoreCase)) + { + // Check if the file contains a namespace declaration: + var blazorNamespace = this.ReadNamespaceFromRazor(filePath); + if (blazorNamespace != null) + return blazorNamespace; + + // Alright, no namespace declaration. Let's check the corresponding C# file: + var csFilePath = $"{filePath}.cs"; + if (File.Exists(csFilePath)) + { + var csNamespace = this.ReadNamespaceFromCSharp(csFilePath); + if (csNamespace != null) + return csNamespace; + + Console.WriteLine($"- Error: Neither the blazor file '{filePath}' nor the corresponding C# file '{csFilePath}' contain a namespace declaration."); + return null; + } + + Console.WriteLine($"- Error: The blazor file '{filePath}' does not contain a namespace declaration and the corresponding C# file '{csFilePath}' does not exist."); + return null; + } + + // Not a C# or Razor file. We can't determine the namespace: + Console.WriteLine($"- Error: The file '{filePath}' is neither a C# nor a Razor file. We can't determine the namespace."); + return null; + } + + private string? ReadNamespaceFromCSharp(string filePath) + { + var content = File.ReadAllText(filePath, Encoding.UTF8); + var matches = CSharpNamespaceRegex().Matches(content); + + if (matches.Count == 0) + return null; + + if (matches.Count > 1) + { + Console.WriteLine($"The file '{filePath}' contains multiple namespaces. This scenario is not supported."); + return null; + } + + var match = matches[0]; + return match.Groups[1].Value; + } + + private string? ReadNamespaceFromRazor(string filePath) + { + var content = File.ReadAllText(filePath, Encoding.UTF8); + var matches = BlazorNamespaceRegex().Matches(content); + + if (matches.Count == 0) + return null; + + if (matches.Count > 1) + { + Console.WriteLine($"The file '{filePath}' contains multiple namespaces. This scenario is not supported."); + return null; + } + + var match = matches[0]; + return match.Groups[1].Value; + } + + [GeneratedRegex("""@namespace\s+([a-zA-Z0-9_.]+)""")] + private static partial Regex BlazorNamespaceRegex(); + + [GeneratedRegex("""namespace\s+([a-zA-Z0-9_.]+)""")] + private static partial Regex CSharpNamespaceRegex(); +} \ No newline at end of file diff --git a/app/Build/Commands/Library.cs b/app/Build/Commands/Library.cs new file mode 100644 index 00000000..354dc504 --- /dev/null +++ b/app/Build/Commands/Library.cs @@ -0,0 +1,3 @@ +namespace Build.Commands; + +public record Library(string Path, string Filename); \ No newline at end of file diff --git a/app/Build/Commands/Pdfium.cs b/app/Build/Commands/Pdfium.cs new file mode 100644 index 00000000..23902296 --- /dev/null +++ b/app/Build/Commands/Pdfium.cs @@ -0,0 +1,107 @@ +using System.Formats.Tar; +using System.IO.Compression; + +using SharedTools; + +namespace Build.Commands; + +public static class Pdfium +{ + public static async Task InstallAsync(RID rid, string version) + { + Console.Write($"- Installing Pdfium {version} for {rid.ToUserFriendlyName()} ..."); + + var cwd = Environment.GetRustRuntimeDirectory(); + var pdfiumTmpDownloadPath = Path.GetTempFileName(); + var pdfiumTmpExtractPath = Directory.CreateTempSubdirectory(); + var pdfiumUrl = GetPdfiumDownloadUrl(rid, version); + + // + // Download the file: + // + Console.Write(" downloading ..."); + using (var client = new HttpClient()) + { + var response = await client.GetAsync(pdfiumUrl); + if (!response.IsSuccessStatusCode) + { + Console.WriteLine($" failed to download Pdfium {version} for {rid.ToUserFriendlyName()} from {pdfiumUrl}"); + return; + } + + await using var fileStream = File.Create(pdfiumTmpDownloadPath); + await response.Content.CopyToAsync(fileStream); + } + + // + // Extract the downloaded file: + // + Console.Write(" extracting ..."); + await using(var tgzStream = File.Open(pdfiumTmpDownloadPath, FileMode.Open, FileAccess.Read, FileShare.Read)) + { + await using var uncompressedStream = new GZipStream(tgzStream, CompressionMode.Decompress); + await TarFile.ExtractToDirectoryAsync(uncompressedStream, pdfiumTmpExtractPath.FullName, true); + } + + // + // Copy the library to the target directory: + // + Console.Write(" deploying ..."); + var library = GetLibraryPath(rid); + if (string.IsNullOrEmpty(library.Path)) + { + Console.WriteLine($" failed to find the library path for {rid.ToUserFriendlyName()}"); + return; + } + + var pdfiumLibSourcePath = Path.Join(pdfiumTmpExtractPath.FullName, library.Path); + var pdfiumLibTargetPath = Path.Join(cwd, "resources", "libraries", library.Filename); + if (!File.Exists(pdfiumLibSourcePath)) + { + Console.WriteLine($" failed to find the library file '{pdfiumLibSourcePath}'"); + return; + } + + Directory.CreateDirectory(Path.Join(cwd, "resources", "libraries")); + if (File.Exists(pdfiumLibTargetPath)) + File.Delete(pdfiumLibTargetPath); + + File.Copy(pdfiumLibSourcePath, pdfiumLibTargetPath); + + // + // Cleanup: + // + Console.Write(" cleaning up ..."); + File.Delete(pdfiumTmpDownloadPath); + Directory.Delete(pdfiumTmpExtractPath.FullName, true); + + Console.WriteLine(" done."); + } + + private static Library GetLibraryPath(RID rid) => rid switch + { + RID.LINUX_ARM64 or RID.LINUX_X64 => new(Path.Join("lib", "libpdfium.so"), "libpdfium.so"), + RID.OSX_ARM64 or RID.OSX_X64 => new(Path.Join("lib", "libpdfium.dylib"), "libpdfium.dylib"), + RID.WIN_ARM64 or RID.WIN_X64 => new(Path.Join("bin", "pdfium.dll"), "pdfium.dll"), + + _ => new(string.Empty, string.Empty), + }; + + private static string GetPdfiumDownloadUrl(RID rid, string version) + { + var baseUrl = $"https://github.com/bblanchon/pdfium-binaries/releases/download/chromium%2F{version}/pdfium-"; + return rid switch + { + RID.LINUX_ARM64 => $"{baseUrl}linux-arm64.tgz", + RID.LINUX_X64 => $"{baseUrl}linux-x64.tgz", + + RID.OSX_ARM64 => $"{baseUrl}mac-arm64.tgz", + RID.OSX_X64 => $"{baseUrl}mac-x64.tgz", + + RID.WIN_ARM64 => $"{baseUrl}win-arm64.tgz", + RID.WIN_X64 => $"{baseUrl}win-x64.tgz", + + _ => string.Empty, + }; + } +} \ No newline at end of file diff --git a/app/Build/Commands/PrepareAction.cs b/app/Build/Commands/PrepareAction.cs new file mode 100644 index 00000000..2f2ffcb2 --- /dev/null +++ b/app/Build/Commands/PrepareAction.cs @@ -0,0 +1,10 @@ +namespace Build.Commands; + +public enum PrepareAction +{ + NONE, + + PATCH, + MINOR, + MAJOR, +} \ No newline at end of file diff --git a/app/Build/Commands/UpdateMetadataCommands.cs b/app/Build/Commands/UpdateMetadataCommands.cs new file mode 100644 index 00000000..b9b01357 --- /dev/null +++ b/app/Build/Commands/UpdateMetadataCommands.cs @@ -0,0 +1,660 @@ +using System.Diagnostics; +using System.Text.RegularExpressions; + +using SharedTools; + +namespace Build.Commands; + +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable ClassNeverInstantiated.Global +// ReSharper disable UnusedType.Global +// ReSharper disable UnusedMember.Global + +public sealed partial class UpdateMetadataCommands +{ + [Command("release", Description = "Prepare & build the next release")] + public async Task Release(PrepareAction action) + { + if(!Environment.IsWorkingDirectoryValid()) + return; + + // Prepare the metadata for the next release: + await this.PerformPrepare(action, true); + + // Build once to allow the Rust compiler to read the changed metadata + // and to update all .NET artifacts: + await this.Build(); + + // Now, we update the web assets (which may were updated by the first build): + new UpdateWebAssetsCommand().UpdateWebAssets(); + + // Collect the I18N keys from the source code. This step yields a I18N file + // that must be part of the final release: + await new CollectI18NKeysCommand().CollectI18NKeys(); + + // Build the final release, where Rust knows the updated metadata, the .NET + // artifacts are already in place, and .NET knows the updated web assets, etc.: + await this.Build(); + } + + [Command("update-versions", Description = "The command will update the package versions in the metadata file")] + public async Task UpdateVersions() + { + if(!Environment.IsWorkingDirectoryValid()) + return; + + Console.WriteLine("=============================="); + Console.WriteLine("- Update the main package versions ..."); + + await this.UpdateDotnetVersion(); + await this.UpdateRustVersion(); + await this.UpdateMudBlazorVersion(); + await this.UpdateTauriVersion(); + } + + [Command("prepare", Description = "Prepare the metadata for the next release")] + public async Task Prepare(PrepareAction action) + { + if(!Environment.IsWorkingDirectoryValid()) + return; + + Console.WriteLine("=============================="); + Console.Write("- Are you trying to prepare a new release? (y/n) "); + var userAnswer = Console.ReadLine(); + if (userAnswer?.ToLowerInvariant() == "y") + { + Console.WriteLine("- Please use the 'release' command instead"); + return; + } + + await this.PerformPrepare(action, false); + } + + private async Task PerformPrepare(PrepareAction action, bool internalCall) + { + if(internalCall) + Console.WriteLine("=============================="); + + Console.WriteLine("- Prepare the metadata for the next release ..."); + + var appVersion = await this.UpdateAppVersion(action); + if (!string.IsNullOrWhiteSpace(appVersion.VersionText)) + { + var buildNumber = await this.IncreaseBuildNumber(); + var buildTime = await this.UpdateBuildTime(); + await this.UpdateChangelog(buildNumber, appVersion.VersionText, buildTime); + await this.CreateNextChangelog(buildNumber, appVersion); + await this.UpdateDotnetVersion(); + await this.UpdateRustVersion(); + await this.UpdateMudBlazorVersion(); + await this.UpdateTauriVersion(); + await this.UpdateProjectCommitHash(); + await this.UpdateLicenceYear(Path.GetFullPath(Path.Combine(Environment.GetAIStudioDirectory(), "..", "..", "LICENSE.md"))); + await this.UpdateLicenceYear(Path.GetFullPath(Path.Combine(Environment.GetAIStudioDirectory(), "Pages", "About.razor.cs"))); + Console.WriteLine(); + } + } + + [Command("build", Description = "Build MindWork AI Studio")] + public async Task Build() + { + if(!Environment.IsWorkingDirectoryValid()) + return; + + // + // Build the .NET project: + // + var pathApp = Environment.GetAIStudioDirectory(); + var rid = Environment.GetCurrentRid(); + + Console.WriteLine("=============================="); + await this.UpdateArchitecture(rid); + + var pdfiumVersion = await this.ReadPdfiumVersion(); + await Pdfium.InstallAsync(rid, pdfiumVersion); + + Console.Write($"- Start .NET build for {rid.ToUserFriendlyName()} ..."); + await this.ReadCommandOutput(pathApp, "dotnet", $"clean --configuration release --runtime {rid.AsMicrosoftRid()}"); + var dotnetBuildOutput = await this.ReadCommandOutput(pathApp, "dotnet", $"publish --configuration release --runtime {rid.AsMicrosoftRid()} --disable-build-servers --force"); + var dotnetBuildOutputLines = dotnetBuildOutput.Split([global::System.Environment.NewLine], StringSplitOptions.RemoveEmptyEntries); + var foundIssue = false; + foreach (var buildOutputLine in dotnetBuildOutputLines) + { + if(buildOutputLine.Contains(" error ") || buildOutputLine.Contains("#warning")) + { + if(!foundIssue) + { + foundIssue = true; + Console.WriteLine(); + Console.WriteLine("- Build has issues:"); + } + + Console.Write(" - "); + Console.WriteLine(buildOutputLine); + } + } + + if(foundIssue) + Console.WriteLine(); + else + { + Console.WriteLine(" completed successfully."); + } + + // + // Prepare the .NET artifact to be used by Tauri as sidecar: + // + var os = Environment.GetOS(); + var tauriSidecarArtifactName = rid switch + { + RID.WIN_X64 => "mindworkAIStudioServer-x86_64-pc-windows-msvc.exe", + RID.WIN_ARM64 => "mindworkAIStudioServer-aarch64-pc-windows-msvc.exe", + + RID.LINUX_X64 => "mindworkAIStudioServer-x86_64-unknown-linux-gnu", + RID.LINUX_ARM64 => "mindworkAIStudioServer-aarch64-unknown-linux-gnu", + + RID.OSX_ARM64 => "mindworkAIStudioServer-aarch64-apple-darwin", + RID.OSX_X64 => "mindworkAIStudioServer-x86_64-apple-darwin", + + _ => string.Empty, + }; + + if (string.IsNullOrWhiteSpace(tauriSidecarArtifactName)) + { + Console.WriteLine($"- Error: Unsupported rid '{rid.AsMicrosoftRid()}'."); + return; + } + + var dotnetArtifactPath = Path.Combine(pathApp, "bin", "dist"); + if(!Directory.Exists(dotnetArtifactPath)) + Directory.CreateDirectory(dotnetArtifactPath); + + var dotnetArtifactFilename = os switch + { + "windows" => "mindworkAIStudio.exe", + _ => "mindworkAIStudio", + }; + + var dotnetPublishedPath = Path.Combine(pathApp, "bin", "release", Environment.DOTNET_VERSION, rid.AsMicrosoftRid(), "publish", dotnetArtifactFilename); + var finalDestination = Path.Combine(dotnetArtifactPath, tauriSidecarArtifactName); + + if(File.Exists(dotnetPublishedPath)) + Console.WriteLine("- Published .NET artifact found."); + else + { + Console.WriteLine($"- Error: Published .NET artifact not found: '{dotnetPublishedPath}'."); + return; + } + + Console.Write($"- Move the .NET artifact to the Tauri sidecar destination ..."); + try + { + File.Move(dotnetPublishedPath, finalDestination, true); + Console.WriteLine(" done."); + } + catch (Exception e) + { + Console.WriteLine(" failed."); + Console.WriteLine($" - Error: {e.Message}"); + } + + // + // Build the Rust project / runtime: + // + Console.WriteLine("- Start building the Rust runtime ..."); + + var pathRuntime = Environment.GetRustRuntimeDirectory(); + var rustBuildOutput = await this.ReadCommandOutput(pathRuntime, "cargo", "tauri build --bundles none", true); + var rustBuildOutputLines = rustBuildOutput.Split([global::System.Environment.NewLine], StringSplitOptions.RemoveEmptyEntries); + var foundRustIssue = false; + foreach (var buildOutputLine in rustBuildOutputLines) + { + if(buildOutputLine.Contains("error", StringComparison.OrdinalIgnoreCase) || buildOutputLine.Contains("warning")) + { + if(!foundRustIssue) + { + foundRustIssue = true; + Console.WriteLine(); + Console.WriteLine("- Build has issues:"); + } + + Console.Write(" - "); + Console.WriteLine(buildOutputLine); + } + } + + if(foundRustIssue) + Console.WriteLine(); + else + { + Console.WriteLine(); + Console.WriteLine("- Compilation completed successfully."); + Console.WriteLine(); + } + } + + private async Task CreateNextChangelog(int currentBuildNumber, AppVersion currentAppVersion) + { + Console.Write("- Create the next changelog ..."); + var pathChangelogs = Path.Combine(Environment.GetAIStudioDirectory(), "wwwroot", "changelog"); + var nextBuildNumber = currentBuildNumber + 1; + + // + // We assume that most of the time, there will be patch releases: + // + var nextMajor = currentAppVersion.Major; + var nextMinor = currentAppVersion.Minor; + var nextPatch = currentAppVersion.Patch + 1; + + var nextAppVersion = $"{nextMajor}.{nextMinor}.{nextPatch}"; + var nextChangelogFilename = $"v{nextAppVersion}.md"; + var nextChangelogFilePath = Path.Combine(pathChangelogs, nextChangelogFilename); + + // + // Regarding the next build time: We assume that the next release will take place in one week from now. + // Thus, we check how many days this month has left. In the end, we want to predict the year and month + // for the next build. Day, hour, minute and second are all set to x. + // + var nextBuildMonth = (DateTime.Today + TimeSpan.FromDays(7)).Month; + var nextBuildYear = (DateTime.Today + TimeSpan.FromDays(7)).Year; + var nextBuildTimeString = $"{nextBuildYear}-{nextBuildMonth:00}-xx xx:xx UTC"; + + var changelogHeader = $""" + # v{nextAppVersion}, build {nextBuildNumber} ({nextBuildTimeString}) + + """; + + if(!File.Exists(nextChangelogFilePath)) + { + await File.WriteAllTextAsync(nextChangelogFilePath, changelogHeader, Environment.UTF8_NO_BOM); + Console.WriteLine($" done. Changelog '{nextChangelogFilename}' created."); + } + else + { + Console.WriteLine(" failed."); + Console.WriteLine("- Error: The changelog file already exists."); + } + } + + private async Task UpdateChangelog(int buildNumber, string appVersion, string buildTime) + { + Console.Write("- Updating the in-app changelog list ..."); + var pathChangelogs = Path.Combine(Environment.GetAIStudioDirectory(), "wwwroot", "changelog"); + var expectedLogFilename = $"v{appVersion}.md"; + var expectedLogFilePath = Path.Combine(pathChangelogs, expectedLogFilename); + + if(!File.Exists(expectedLogFilePath)) + { + Console.WriteLine(" failed."); + Console.WriteLine($"- Error: The changelog file '{expectedLogFilename}' does not exist."); + return; + } + + // Right now, the build time is formatted as "yyyy-MM-dd HH:mm:ss UTC", but must remove the seconds: + buildTime = buildTime[..^7] + " UTC"; + + const string CODE_START = + """ + LOGS = + [ + """; + + var changelogCodePath = Path.Join(Environment.GetAIStudioDirectory(), "Components", "Changelog.Logs.cs"); + var changelogCode = await File.ReadAllTextAsync(changelogCodePath, Encoding.UTF8); + var updatedCode = + $""" + {CODE_START} + new ({buildNumber}, "v{appVersion}, build {buildNumber} ({buildTime})", "{expectedLogFilename}"), + """; + + changelogCode = changelogCode.Replace(CODE_START, updatedCode); + await File.WriteAllTextAsync(changelogCodePath, changelogCode, Environment.UTF8_NO_BOM); + Console.WriteLine(" done."); + } + + private async Task ReadPdfiumVersion() + { + const int PDFIUM_VERSION_INDEX = 10; + + var pathMetadata = Environment.GetMetadataPath(); + var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); + var currentPdfiumVersion = lines[PDFIUM_VERSION_INDEX].Trim(); + var shortVersion = currentPdfiumVersion.Split('.')[2]; + + return shortVersion; + } + + private async Task UpdateArchitecture(RID rid) + { + const int ARCHITECTURE_INDEX = 9; + + var pathMetadata = Environment.GetMetadataPath(); + var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); + Console.Write($"- Updating architecture to {rid.ToUserFriendlyName()} ..."); + lines[ARCHITECTURE_INDEX] = rid.AsMicrosoftRid(); + + await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); + Console.WriteLine(" done."); + } + + private async Task UpdateProjectCommitHash() + { + const int COMMIT_HASH_INDEX = 8; + + var pathMetadata = Environment.GetMetadataPath(); + var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); + var currentCommitHash = lines[COMMIT_HASH_INDEX].Trim(); + var headCommitHash = await this.ReadCommandOutput(Environment.GetAIStudioDirectory(), "git", "rev-parse HEAD"); + var first10Chars = headCommitHash[..11]; + var updatedCommitHash = $"{first10Chars}, release"; + + Console.WriteLine($"- Updating commit hash from '{currentCommitHash}' to '{updatedCommitHash}'."); + lines[COMMIT_HASH_INDEX] = updatedCommitHash; + + await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); + } + + private async Task UpdateAppVersion(PrepareAction action) + { + const int APP_VERSION_INDEX = 0; + + if (action == PrepareAction.NONE) + { + Console.WriteLine("- No action specified. Skipping app version update."); + return new(string.Empty, 0, 0, 0); + } + + var pathMetadata = Environment.GetMetadataPath(); + var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); + var currentAppVersionLine = lines[APP_VERSION_INDEX].Trim(); + var currentAppVersion = AppVersionRegex().Match(currentAppVersionLine); + var currentPatch = int.Parse(currentAppVersion.Groups["patch"].Value); + var currentMinor = int.Parse(currentAppVersion.Groups["minor"].Value); + var currentMajor = int.Parse(currentAppVersion.Groups["major"].Value); + + switch (action) + { + case PrepareAction.PATCH: + currentPatch++; + break; + + case PrepareAction.MINOR: + currentPatch = 0; + currentMinor++; + break; + + case PrepareAction.MAJOR: + currentPatch = 0; + currentMinor = 0; + currentMajor++; + break; + } + + var updatedAppVersion = $"{currentMajor}.{currentMinor}.{currentPatch}"; + Console.WriteLine($"- Updating app version from '{currentAppVersionLine}' to '{updatedAppVersion}'."); + + lines[APP_VERSION_INDEX] = updatedAppVersion; + await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); + + return new(updatedAppVersion, currentMajor, currentMinor, currentPatch); + } + + private async Task UpdateLicenceYear(string licenceFilePath) + { + var currentYear = DateTime.UtcNow.Year.ToString(); + var lines = await File.ReadAllLinesAsync(licenceFilePath, Encoding.UTF8); + + var found = false; + var copyrightYear = string.Empty; + var updatedLines = new List(lines.Length); + foreach (var line in lines) + { + var match = FindCopyrightRegex().Match(line); + if (match.Success) + { + copyrightYear = match.Groups["year"].Value; + + if(!found && copyrightYear != currentYear) + Console.WriteLine($"- Updating the licence's year in '{Path.GetFileName(licenceFilePath)}' from '{copyrightYear}' to '{currentYear}'."); + + updatedLines.Add(ReplaceCopyrightYearRegex().Replace(line, currentYear)); + found = true; + } + else + updatedLines.Add(line); + } + + await File.WriteAllLinesAsync(licenceFilePath, updatedLines, Environment.UTF8_NO_BOM); + if (!found) + Console.WriteLine($"- Error: No copyright year found in '{Path.GetFileName(licenceFilePath)}'."); + else if (copyrightYear == currentYear) + Console.WriteLine($"- The copyright year in '{Path.GetFileName(licenceFilePath)}' is already up to date."); + } + + private async Task UpdateTauriVersion() + { + const int TAURI_VERSION_INDEX = 7; + + var pathMetadata = Environment.GetMetadataPath(); + var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); + var currentTauriVersion = lines[TAURI_VERSION_INDEX].Trim(); + + var matches = await this.DetermineVersion("Tauri", Environment.GetRustRuntimeDirectory(), TauriVersionRegex(), "cargo", "tree --depth 1"); + if (matches.Count == 0) + return; + + var updatedTauriVersion = matches[0].Groups["version"].Value; + if(currentTauriVersion == updatedTauriVersion) + { + Console.WriteLine("- The Tauri version is already up to date."); + return; + } + + Console.WriteLine($"- Updated Tauri version from {currentTauriVersion} to {updatedTauriVersion}."); + lines[TAURI_VERSION_INDEX] = updatedTauriVersion; + + await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); + } + + private async Task UpdateMudBlazorVersion() + { + const int MUD_BLAZOR_VERSION_INDEX = 6; + + var pathMetadata = Environment.GetMetadataPath(); + var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); + var currentMudBlazorVersion = lines[MUD_BLAZOR_VERSION_INDEX].Trim(); + + var matches = await this.DetermineVersion("MudBlazor", Environment.GetAIStudioDirectory(), MudBlazorVersionRegex(), "dotnet", "list package"); + if (matches.Count == 0) + return; + + var updatedMudBlazorVersion = matches[0].Groups["version"].Value; + if(currentMudBlazorVersion == updatedMudBlazorVersion) + { + Console.WriteLine("- The MudBlazor version is already up to date."); + return; + } + + Console.WriteLine($"- Updated MudBlazor version from {currentMudBlazorVersion} to {updatedMudBlazorVersion}."); + lines[MUD_BLAZOR_VERSION_INDEX] = updatedMudBlazorVersion; + + await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); + } + + private async Task UpdateRustVersion() + { + const int RUST_VERSION_INDEX = 5; + + var pathMetadata = Environment.GetMetadataPath(); + var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); + var currentRustVersion = lines[RUST_VERSION_INDEX].Trim(); + var matches = await this.DetermineVersion("Rust", Environment.GetRustRuntimeDirectory(), RustVersionRegex(), "rustc", "-Vv"); + if (matches.Count == 0) + return; + + var updatedRustVersion = matches[0].Groups["version"].Value + " (commit " + matches[0].Groups["commit"].Value + ")"; + if(currentRustVersion == updatedRustVersion) + { + Console.WriteLine("- Rust version is already up to date."); + return; + } + + Console.WriteLine($"- Updated Rust version from {currentRustVersion} to {updatedRustVersion}."); + lines[RUST_VERSION_INDEX] = updatedRustVersion; + + await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); + } + + private async Task UpdateDotnetVersion() + { + const int DOTNET_VERSION_INDEX = 4; + const int DOTNET_SDK_VERSION_INDEX = 3; + + var pathMetadata = Environment.GetMetadataPath(); + var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); + var currentDotnetVersion = lines[DOTNET_VERSION_INDEX].Trim(); + var currentDotnetSdkVersion = lines[DOTNET_SDK_VERSION_INDEX].Trim(); + + var matches = await this.DetermineVersion(".NET", Environment.GetAIStudioDirectory(), DotnetVersionRegex(), "dotnet", "--info"); + if (matches.Count == 0) + return; + + var updatedDotnetVersion = matches[0].Groups["hostVersion"].Value + " (commit " + matches[0].Groups["hostCommit"].Value + ")"; + var updatedDotnetSdkVersion = matches[0].Groups["sdkVersion"].Value + " (commit " + matches[0].Groups["sdkCommit"].Value + ")"; + if(currentDotnetVersion == updatedDotnetVersion && currentDotnetSdkVersion == updatedDotnetSdkVersion) + { + Console.WriteLine("- .NET version is already up to date."); + return; + } + + Console.WriteLine($"- Updated .NET SDK version from {currentDotnetSdkVersion} to {updatedDotnetSdkVersion}."); + Console.WriteLine($"- Updated .NET version from {currentDotnetVersion} to {updatedDotnetVersion}."); + + lines[DOTNET_VERSION_INDEX] = updatedDotnetVersion; + lines[DOTNET_SDK_VERSION_INDEX] = updatedDotnetSdkVersion; + + await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); + } + + private async Task> DetermineVersion(string name, string workingDirectory, Regex regex, string program, string command) + { + var processInfo = new ProcessStartInfo + { + WorkingDirectory = workingDirectory, + FileName = program, + Arguments = command, + RedirectStandardOutput = true, + UseShellExecute = false, + CreateNoWindow = true + }; + + using var process = new Process(); + process.StartInfo = processInfo; + process.Start(); + + var output = await process.StandardOutput.ReadToEndAsync(); + await process.WaitForExitAsync(); + + var matches = regex.Matches(output); + if (matches.Count == 0) + { + Console.WriteLine($"- Error: Was not able to determine the {name} version."); + return []; + } + + return matches; + } + + private async Task ReadCommandOutput(string workingDirectory, string program, string command, bool showLiveOutput = false) + { + var processInfo = new ProcessStartInfo + { + WorkingDirectory = workingDirectory, + FileName = program, + Arguments = command, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true, + }; + + var sb = new StringBuilder(); + using var process = new Process(); + process.StartInfo = processInfo; + process.Start(); + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + process.OutputDataReceived += (_, args) => + { + if(!string.IsNullOrWhiteSpace(args.Data)) + { + if(showLiveOutput) + Console.WriteLine(args.Data); + sb.AppendLine(args.Data); + } + }; + + process.ErrorDataReceived += (_, args) => + { + if(!string.IsNullOrWhiteSpace(args.Data)) + { + if(showLiveOutput) + Console.WriteLine(args.Data); + sb.AppendLine(args.Data); + } + }; + + await process.WaitForExitAsync(); + return sb.ToString(); + } + + private async Task IncreaseBuildNumber() + { + const int BUILD_NUMBER_INDEX = 2; + var pathMetadata = Environment.GetMetadataPath(); + var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); + var buildNumber = int.Parse(lines[BUILD_NUMBER_INDEX]) + 1; + + Console.WriteLine($"- Updating build number from '{lines[BUILD_NUMBER_INDEX]}' to '{buildNumber}'."); + + lines[BUILD_NUMBER_INDEX] = buildNumber.ToString(); + await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); + return buildNumber; + } + + private async Task UpdateBuildTime() + { + const int BUILD_TIME_INDEX = 1; + var pathMetadata = Environment.GetMetadataPath(); + var lines = await File.ReadAllLinesAsync(pathMetadata, Encoding.UTF8); + var buildTime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + " UTC"; + + Console.WriteLine($"- Updating build time from '{lines[BUILD_TIME_INDEX]}' to '{buildTime}'."); + + lines[BUILD_TIME_INDEX] = buildTime; + await File.WriteAllLinesAsync(pathMetadata, lines, Environment.UTF8_NO_BOM); + return buildTime; + } + + [GeneratedRegex("""(?ms).?(NET\s+SDK|SDK\s+\.NET)\s*:\s+Version:\s+(?[0-9.]+).+Commit:\s+(?[a-zA-Z0-9]+).+Host:\s+Version:\s+(?[0-9.]+).+Commit:\s+(?[a-zA-Z0-9]+)""")] + private static partial Regex DotnetVersionRegex(); + + [GeneratedRegex("""rustc (?[0-9.]+)(?:-nightly)? \((?[a-zA-Z0-9]+)""")] + private static partial Regex RustVersionRegex(); + + [GeneratedRegex("""MudBlazor\s+(?[0-9.]+)""")] + private static partial Regex MudBlazorVersionRegex(); + + [GeneratedRegex("""tauri\s+v(?[0-9.]+)""")] + private static partial Regex TauriVersionRegex(); + + [GeneratedRegex("""^\s*Copyright\s+(?[0-9]{4})""")] + private static partial Regex FindCopyrightRegex(); + + [GeneratedRegex("""([0-9]{4})""")] + private static partial Regex ReplaceCopyrightYearRegex(); + + [GeneratedRegex("""(?[0-9]+)\.(?[0-9]+)\.(?[0-9]+)""")] + private static partial Regex AppVersionRegex(); +} \ No newline at end of file diff --git a/app/Build/Commands/UpdateWebAssetsCommand.cs b/app/Build/Commands/UpdateWebAssetsCommand.cs new file mode 100644 index 00000000..d044a256 --- /dev/null +++ b/app/Build/Commands/UpdateWebAssetsCommand.cs @@ -0,0 +1,49 @@ +// ReSharper disable ClassNeverInstantiated.Global +// ReSharper disable UnusedType.Global +// ReSharper disable UnusedMember.Global + +using SharedTools; + +namespace Build.Commands; + +public sealed class UpdateWebAssetsCommand +{ + [Command("update-web", Description = "Update web assets")] + public void UpdateWebAssets() + { + if(!Environment.IsWorkingDirectoryValid()) + return; + + Console.WriteLine("========================="); + Console.Write("- Updating web assets ..."); + + var rid = Environment.GetCurrentRid(); + var cwd = Environment.GetAIStudioDirectory(); + var contentPath = Path.Join(cwd, "bin", "release", Environment.DOTNET_VERSION, rid.AsMicrosoftRid(), "publish", "wwwroot", "_content"); + var isMudBlazorDirectoryPresent = Directory.Exists(Path.Join(contentPath, "MudBlazor")); + if (!isMudBlazorDirectoryPresent) + { + Console.WriteLine(); + Console.WriteLine($"- Error: No web assets found for RID '{rid}'. Please publish the project first."); + return; + } + + Directory.CreateDirectory(Path.Join(cwd, "wwwroot", "system")); + var sourcePaths = Directory.EnumerateFiles(contentPath, "*", SearchOption.AllDirectories); + var counter = 0; + foreach(var sourcePath in sourcePaths) + { + counter++; + var relativePath = Path.GetRelativePath(cwd, sourcePath); + var targetPath = Path.Join(cwd, "wwwroot", relativePath); + var targetDirectory = Path.GetDirectoryName(targetPath); + if (targetDirectory != null) + Directory.CreateDirectory(targetDirectory); + + File.Copy(sourcePath, targetPath, true); + } + + Console.WriteLine($" {counter:###,###} web assets updated successfully."); + Console.WriteLine(); + } +} \ No newline at end of file diff --git a/app/Build/GlobalUsings.cs b/app/Build/GlobalUsings.cs new file mode 100644 index 00000000..e15bc8b9 --- /dev/null +++ b/app/Build/GlobalUsings.cs @@ -0,0 +1,7 @@ +// Global using directives + +global using System.Text; + +global using Cocona; + +global using Environment = Build.Tools.Environment; \ No newline at end of file diff --git a/app/Build/Program.cs b/app/Build/Program.cs new file mode 100644 index 00000000..e7744b36 --- /dev/null +++ b/app/Build/Program.cs @@ -0,0 +1,9 @@ +using Build.Commands; + +var builder = CoconaApp.CreateBuilder(); +var app = builder.Build(); +app.AddCommands(); +app.AddCommands(); +app.AddCommands(); +app.AddCommands(); +app.Run(); \ No newline at end of file diff --git a/app/Build/Tools/Environment.cs b/app/Build/Tools/Environment.cs new file mode 100644 index 00000000..f03ff354 --- /dev/null +++ b/app/Build/Tools/Environment.cs @@ -0,0 +1,113 @@ +using System.Runtime.InteropServices; + +using SharedTools; + +namespace Build.Tools; + +public static class Environment +{ + public const string DOTNET_VERSION = "net9.0"; + public static readonly Encoding UTF8_NO_BOM = new UTF8Encoding(false); + + private static readonly Dictionary ALL_RIDS = Enum.GetValues().Select(rid => new KeyValuePair(rid, rid.AsMicrosoftRid())).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + + public static bool IsWorkingDirectoryValid() + { + var currentDirectory = Directory.GetCurrentDirectory(); + var mainFile = Path.Combine(currentDirectory, "Program.cs"); + var projectFile = Path.Combine(currentDirectory, "Build Script.csproj"); + + if (!currentDirectory.EndsWith("Build", StringComparison.Ordinal) || !File.Exists(mainFile) || !File.Exists(projectFile)) + { + Console.WriteLine("The current directory is not a valid working directory for the build script. Go to the /app/Build directory within the git repository."); + return false; + } + + return true; + } + + public static string GetAIStudioDirectory() + { + var currentDirectory = Directory.GetCurrentDirectory(); + var directory = Path.Combine(currentDirectory, "..", "MindWork AI Studio"); + return Path.GetFullPath(directory); + } + + public static string GetRustRuntimeDirectory() + { + var currentDirectory = Directory.GetCurrentDirectory(); + var directory = Path.Combine(currentDirectory, "..", "..", "runtime"); + return Path.GetFullPath(directory); + } + + public static string GetMetadataPath() + { + var currentDirectory = Directory.GetCurrentDirectory(); + var directory = Path.Combine(currentDirectory, "..", "..", "metadata.txt"); + return Path.GetFullPath(directory); + } + + public static string? GetOS() + { + if(RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + return "windows"; + + if(RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + return "linux"; + + if(RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + return "darwin"; + + Console.WriteLine($"Error: Unsupported OS '{RuntimeInformation.OSDescription}'"); + return null; + } + + public static IEnumerable GetRidsForCurrentOS() + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + return ALL_RIDS.Where(rid => rid.Value.StartsWith("win-", StringComparison.Ordinal)).Select(n => n.Key); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + return ALL_RIDS.Where(rid => rid.Value.StartsWith("osx-", StringComparison.Ordinal)).Select(n => n.Key); + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + return ALL_RIDS.Where(rid => rid.Value.StartsWith("linux-", StringComparison.Ordinal)).Select(n => n.Key); + + Console.WriteLine($"Error: Unsupported OS '{RuntimeInformation.OSDescription}'"); + return []; + } + + public static RID GetCurrentRid() + { + var arch = RuntimeInformation.ProcessArchitecture; + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + return arch switch + { + Architecture.X64 => RID.WIN_X64, + Architecture.Arm64 => RID.WIN_ARM64, + + _ => RID.NONE, + }; + + if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + return arch switch + { + Architecture.X64 => RID.OSX_X64, + Architecture.Arm64 => RID.OSX_ARM64, + + _ => RID.NONE, + }; + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + return arch switch + { + Architecture.X64 => RID.LINUX_X64, + Architecture.Arm64 => RID.LINUX_ARM64, + + _ => RID.NONE, + }; + + Console.WriteLine($"Error: Unsupported OS '{RuntimeInformation.OSDescription}'"); + return RID.NONE; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio.sln b/app/MindWork AI Studio.sln index 37871ac7..0bb1ab52 100644 --- a/app/MindWork AI Studio.sln +++ b/app/MindWork AI Studio.sln @@ -4,6 +4,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MindWork AI Studio", "MindW EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SourceCodeRules", "SourceCodeRules\SourceCodeRules\SourceCodeRules.csproj", "{0976C1CB-D499-4C86-8ADA-B7A7A4DE0BF8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Build Script", "Build\Build Script.csproj", "{447A5590-68E1-4EF8-9451-A41AF5FBE571}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SharedTools", "SharedTools\SharedTools.csproj", "{969C74DF-7678-4CD5-B269-D03E1ECA3D2A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -18,6 +22,14 @@ Global {0976C1CB-D499-4C86-8ADA-B7A7A4DE0BF8}.Debug|Any CPU.Build.0 = Debug|Any CPU {0976C1CB-D499-4C86-8ADA-B7A7A4DE0BF8}.Release|Any CPU.ActiveCfg = Release|Any CPU {0976C1CB-D499-4C86-8ADA-B7A7A4DE0BF8}.Release|Any CPU.Build.0 = Release|Any CPU + {447A5590-68E1-4EF8-9451-A41AF5FBE571}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {447A5590-68E1-4EF8-9451-A41AF5FBE571}.Debug|Any CPU.Build.0 = Debug|Any CPU + {447A5590-68E1-4EF8-9451-A41AF5FBE571}.Release|Any CPU.ActiveCfg = Release|Any CPU + {447A5590-68E1-4EF8-9451-A41AF5FBE571}.Release|Any CPU.Build.0 = Release|Any CPU + {969C74DF-7678-4CD5-B269-D03E1ECA3D2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {969C74DF-7678-4CD5-B269-D03E1ECA3D2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {969C74DF-7678-4CD5-B269-D03E1ECA3D2A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {969C74DF-7678-4CD5-B269-D03E1ECA3D2A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution EndGlobalSection diff --git a/app/MindWork AI Studio.sln.DotSettings b/app/MindWork AI Studio.sln.DotSettings index 44079898..d85707aa 100644 --- a/app/MindWork AI Studio.sln.DotSettings +++ b/app/MindWork AI Studio.sln.DotSettings @@ -2,15 +2,24 @@ AI EDI ERI + FNV GWDG + HF LLM LM MSG + OS + PDF RAG + RID + TB UI + URL + I18N True True True + True True True True \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor index f18c9ab7..8056467c 100644 --- a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor +++ b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor @@ -1,51 +1,55 @@ @attribute [Route(Routes.ASSISTANT_AGENDA)] @inherits AssistantBaseCore - - - - + + + + @foreach (var contentLine in this.contentLines) { @if(!this.justBriefly.Contains(contentLine)) { - @contentLine + + @contentLine + } } - + @foreach (var contentLine in this.contentLines) { @if(!this.selectedFoci.Contains(contentLine)) { - @contentLine + + @contentLine + } } - - - - - - - - - + + + + + + + + + @if (!this.isMeetingVirtual) { - - - - + + + + - - + + } - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs index 6e1c4d52..c0571c7c 100644 --- a/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs +++ b/app/MindWork AI Studio/Assistants/Agenda/AssistantAgenda.razor.cs @@ -9,14 +9,9 @@ public partial class AssistantAgenda : AssistantBaseCore { public override Tools.Components Component => Tools.Components.AGENDA_ASSISTANT; - protected override string Title => "Agenda Planner"; + protected override string Title => T("Agenda Planner"); - protected override string Description => - """ - This agenda planner helps you create a structured agenda for your meeting or seminar. Just provide some basic - information about the event, and the assistant will generate an agenda for you. You can also specify the - duration, the start time, the location, the target language, and other details. - """; + protected override string Description => T("This agenda planner helps you create a structured agenda for your meeting or seminar. Just provide some basic information about the event, and the assistant will generate an agenda for you. You can also specify the duration, the start time, the location, the target language, and other details."); protected override string SystemPrompt => $""" @@ -98,7 +93,7 @@ public partial class AssistantAgenda : AssistantBaseCore protected override IReadOnlyList FooterButtons => []; - protected override string SubmitText => "Create Agenda"; + protected override string SubmitText => T("Create Agenda"); protected override Func SubmitAction => this.CreateAgenda; @@ -235,7 +230,7 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateLocation(string location) { if(!this.isMeetingVirtual && string.IsNullOrWhiteSpace(location)) - return "Please provide a location for the meeting or the seminar."; + return T("Please provide a location for the meeting or the seminar."); return null; } @@ -243,7 +238,7 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateNumberParticipants(NumberParticipants selectedSize) { if(selectedSize is NumberParticipants.NOT_SPECIFIED) - return "Please select the number of participants."; + return T("Please select the number of participants."); return null; } @@ -251,7 +246,7 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateTargetLanguage(CommonLanguages language) { if(language is CommonLanguages.AS_IS) - return "Please select a target language for the agenda."; + return T("Please select a target language for the agenda."); return null; } @@ -259,7 +254,7 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateDuration(string duration) { if(string.IsNullOrWhiteSpace(duration)) - return "Please provide a duration for the meeting or the seminar, e.g. '2 hours', or '2 days (8 hours and 4 hours)', etc."; + return T("Please provide a duration for the meeting or the seminar, e.g. '2 hours', or '2 days (8 hours and 4 hours)', etc."); return null; } @@ -267,7 +262,7 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateStartTime(string startTime) { if(string.IsNullOrWhiteSpace(startTime)) - return "Please provide a start time for the meeting or the seminar. When the meeting is a multi-day event, specify the start time for each day, e.g. '9:00 AM, 10:00 AM', etc."; + return T("Please provide a start time for the meeting or the seminar. When the meeting is a multi-day event, specify the start time for each day, e.g. '9:00 AM, 10:00 AM', etc."); return null; } @@ -275,7 +270,7 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateCustomLanguage(string language) { if(this.selectedTargetLanguage == CommonLanguages.OTHER && string.IsNullOrWhiteSpace(language)) - return "Please provide a custom language."; + return T("Please provide a custom language."); return null; } @@ -283,7 +278,7 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateTopic(string topic) { if(string.IsNullOrWhiteSpace(topic)) - return "Please provide a topic for the agenda. What is the meeting or the seminar about?"; + return T("Please provide a topic for the agenda. What is the meeting or the seminar about?"); return null; } @@ -291,7 +286,7 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateName(string name) { if(string.IsNullOrWhiteSpace(name)) - return "Please provide a name for the meeting or the seminar."; + return T("Please provide a name for the meeting or the seminar."); return null; } @@ -299,12 +294,12 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateContent(string content) { if(string.IsNullOrWhiteSpace(content)) - return "Please provide some content for the agenda. What are the main points of the meeting or the seminar?"; + return T("Please provide some content for the agenda. What are the main points of the meeting or the seminar?"); var lines = content.Split('\n', StringSplitOptions.RemoveEmptyEntries); foreach (var line in lines) if(!line.TrimStart().StartsWith('-')) - return "Please start each line of your content list with a dash (-) to create a bullet point list."; + return T("Please start each line of your content list with a dash (-) to create a bullet point list."); return null; } @@ -312,7 +307,7 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateObjective(string objective) { if(string.IsNullOrWhiteSpace(objective)) - return "Please provide an objective for the meeting or the seminar. What do you want to achieve?"; + return T("Please provide an objective for the meeting or the seminar. What do you want to achieve?"); return null; } @@ -320,7 +315,7 @@ public partial class AssistantAgenda : AssistantBaseCore private string? ValidateModerator(string moderator) { if(string.IsNullOrWhiteSpace(moderator)) - return "Please provide a moderator for the meeting or the seminar. Who will lead the discussion?"; + return T("Please provide a moderator for the meeting or the seminar. Who will lead the discussion?"); return null; } diff --git a/app/MindWork AI Studio/Assistants/Agenda/NumberParticipantsExtensions.cs b/app/MindWork AI Studio/Assistants/Agenda/NumberParticipantsExtensions.cs index 0f3aaa92..028ad223 100644 --- a/app/MindWork AI Studio/Assistants/Agenda/NumberParticipantsExtensions.cs +++ b/app/MindWork AI Studio/Assistants/Agenda/NumberParticipantsExtensions.cs @@ -2,22 +2,24 @@ namespace AIStudio.Assistants.Agenda; public static class NumberParticipantsExtensions { + private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(NumberParticipantsExtensions).Namespace, nameof(NumberParticipantsExtensions)); + public static string Name(this NumberParticipants numberParticipants) => numberParticipants switch { - NumberParticipants.NOT_SPECIFIED => "Please select how many participants are expected", + NumberParticipants.NOT_SPECIFIED => TB("Please select how many participants are expected"), - NumberParticipants.PEER_TO_PEER => "2 (peer to peer)", + NumberParticipants.PEER_TO_PEER => TB("2 (peer to peer)"), - NumberParticipants.SMALL_GROUP => "3 - 5 (small group)", - NumberParticipants.LARGE_GROUP => "6 - 12 (large group)", - NumberParticipants.MULTIPLE_SMALL_GROUPS => "13 - 20 (multiple small groups)", - NumberParticipants.MULTIPLE_LARGE_GROUPS => "21 - 30 (multiple large groups)", + NumberParticipants.SMALL_GROUP => TB("3 - 5 (small group)"), + NumberParticipants.LARGE_GROUP => TB("6 - 12 (large group)"), + NumberParticipants.MULTIPLE_SMALL_GROUPS => TB("13 - 20 (multiple small groups)"), + NumberParticipants.MULTIPLE_LARGE_GROUPS => TB("21 - 30 (multiple large groups)"), - NumberParticipants.SYMPOSIUM => "31 - 100 (symposium)", - NumberParticipants.CONFERENCE => "101 - 200 (conference)", - NumberParticipants.CONGRESS => "201 - 1,000 (congress)", + NumberParticipants.SYMPOSIUM => TB("31 - 100 (symposium)"), + NumberParticipants.CONFERENCE => TB("101 - 200 (conference)"), + NumberParticipants.CONGRESS => TB("201 - 1,000 (congress)"), - NumberParticipants.LARGE_EVENT => "1,000+ (large event)", + NumberParticipants.LARGE_EVENT => TB("1,000+ (large event)"), _ => "Unknown" }; diff --git a/app/MindWork AI Studio/Assistants/AssistantBase.razor b/app/MindWork AI Studio/Assistants/AssistantBase.razor index 38d4b8b8..bc4d01df 100644 --- a/app/MindWork AI Studio/Assistants/AssistantBase.razor +++ b/app/MindWork AI Studio/Assistants/AssistantBase.razor @@ -4,23 +4,20 @@
- - @(this.Title) - + + + @(this.Title) + + + + - - - - @this.Description - - - - - - + + @this.Description + @if (this.Body is not null) { @@ -29,12 +26,12 @@ - + @this.SubmitText @if (this.isProcessing && this.cancellationTokenSource is not null) { - + } @@ -80,7 +77,7 @@ { @if (this.ShowSendTo) { - + @foreach (var assistant in Enum.GetValues().Where(n => n.AllowSendTo()).OrderBy(n => n.Name().Length)) { @@ -97,20 +94,20 @@ { case ButtonData buttonData when !string.IsNullOrWhiteSpace(buttonData.Tooltip): - + @buttonData.Text break; case ButtonData buttonData: - + @buttonData.Text break; case SendToButton sendToButton: - + @foreach (var assistant in Enum.GetValues().Where(n => n.AllowSendTo()).OrderBy(n => n.Name().Length)) { @@ -125,14 +122,14 @@ @if (this.ShowCopyResult) { - Copy result + @TB("Copy result") } @if (this.ShowReset) { - Reset + @TB("Reset") } diff --git a/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs b/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs index 1f0c7364..c355fba1 100644 --- a/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs +++ b/app/MindWork AI Studio/Assistants/AssistantBase.razor.cs @@ -13,11 +13,8 @@ using DialogOptions = AIStudio.Dialogs.DialogOptions; namespace AIStudio.Assistants; -public abstract partial class AssistantBase : AssistantLowerBase, IMessageBusReceiver, IDisposable where TSettings : IComponent +public abstract partial class AssistantBase : AssistantLowerBase where TSettings : IComponent { - [Inject] - protected SettingsManager SettingsManager { get; init; } = null!; - [Inject] private IDialogService DialogService { get; init; } = null!; @@ -42,9 +39,6 @@ public abstract partial class AssistantBase : AssistantLowerBase, IMe [Inject] private MudTheme ColorTheme { get; init; } = null!; - [Inject] - private MessageBus MessageBus { get; init; } = null!; - protected abstract string Title { get; } protected abstract string Description { get; } @@ -95,12 +89,13 @@ public abstract partial class AssistantBase : AssistantLowerBase, IMe protected MudForm? form; protected bool inputIsValid; protected Profile currentProfile = Profile.NO_PROFILE; + protected ChatTemplate currentChatTemplate = ChatTemplate.NO_CHAT_TEMPLATE; protected ChatThread? chatThread; protected IContent? lastUserPrompt; + protected CancellationTokenSource? cancellationTokenSource; private readonly Timer formChangeTimer = new(TimeSpan.FromSeconds(1.6)); - - private CancellationTokenSource? cancellationTokenSource; + private ContentBlock? resultingContentBlock; private string[] inputIssues = []; private bool isProcessing; @@ -109,6 +104,8 @@ public abstract partial class AssistantBase : AssistantLowerBase, IMe protected override async Task OnInitializedAsync() { + await base.OnInitializedAsync(); + this.formChangeTimer.AutoReset = false; this.formChangeTimer.Elapsed += async (_, _) => { @@ -119,11 +116,7 @@ public abstract partial class AssistantBase : AssistantLowerBase, IMe this.MightPreselectValues(); this.providerSettings = this.SettingsManager.GetPreselectedProvider(this.Component); this.currentProfile = this.SettingsManager.GetPreselectedProfile(this.Component); - - this.MessageBus.RegisterComponent(this); - this.MessageBus.ApplyFilters(this, [], [ Event.COLOR_THEME_CHANGED ]); - - await base.OnInitializedAsync(); + this.currentChatTemplate = this.SettingsManager.GetPreselectedChatTemplate(this.Component); } protected override async Task OnParametersSetAsync() @@ -145,40 +138,29 @@ public abstract partial class AssistantBase : AssistantLowerBase, IMe } #endregion - - #region Implementation of IMessageBusReceiver - public string ComponentName => nameof(AssistantBase); - - public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) - { - switch (triggeredEvent) - { - case Event.COLOR_THEME_CHANGED: - this.StateHasChanged(); - break; - } - - return Task.CompletedTask; - } - - public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) - { - return Task.FromResult(default); - } - - #endregion + private string TB(string fallbackEN) => this.T(fallbackEN, typeof(AssistantBase).Namespace, nameof(AssistantBase)); private string SubmitButtonStyle => this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence ? this.providerSettings.UsedLLMProvider.GetConfidence(this.SettingsManager).StyleBorder(this.SettingsManager) : string.Empty; protected string? ValidatingProvider(AIStudio.Settings.Provider provider) { if(provider.UsedLLMProvider == LLMProviders.NONE) - return "Please select a provider."; + return this.TB("Please select a provider."); return null; } + private async Task Start() + { + using (this.cancellationTokenSource = new()) + { + await this.SubmitAction(); + } + + this.cancellationTokenSource = null; + } + private void TriggerFormChange(FormFieldChangedEventArgs _) { this.formChangeTimer.Stop(); @@ -216,7 +198,7 @@ public abstract partial class AssistantBase : AssistantLowerBase, IMe SystemPrompt = this.SystemPrompt, WorkspaceId = Guid.Empty, ChatId = Guid.NewGuid(), - Name = $"Assistant - {this.Title}", + Name = string.Format(this.TB("Assistant - {0}"), this.Title), Seed = this.RNG.Next(), Blocks = [], }; @@ -262,6 +244,9 @@ public abstract partial class AssistantBase : AssistantLowerBase, IMe protected async Task AddAIResponseAsync(DateTimeOffset time, bool hideContentFromUser = false) { + var manageCancellationLocally = this.cancellationTokenSource is null; + this.cancellationTokenSource ??= new CancellationTokenSource(); + var aiText = new ContentText { // We have to wait for the remote @@ -286,19 +271,21 @@ public abstract partial class AssistantBase : AssistantLowerBase, IMe this.isProcessing = true; this.StateHasChanged(); - - using (this.cancellationTokenSource = new()) - { - // Use the selected provider to get the AI response. - // By awaiting this line, we wait for the entire - // content to be streamed. - this.chatThread = await aiText.CreateFromProviderAsync(this.providerSettings.CreateProvider(this.Logger), this.providerSettings.Model, this.lastUserPrompt, this.chatThread, this.cancellationTokenSource.Token); - } - - this.cancellationTokenSource = null; + + // Use the selected provider to get the AI response. + // By awaiting this line, we wait for the entire + // content to be streamed. + this.chatThread = await aiText.CreateFromProviderAsync(this.providerSettings.CreateProvider(this.Logger), this.providerSettings.Model, this.lastUserPrompt, this.chatThread, this.cancellationTokenSource!.Token); + this.isProcessing = false; this.StateHasChanged(); + if(manageCancellationLocally) + { + this.cancellationTokenSource.Dispose(); + this.cancellationTokenSource = null; + } + // Return the AI response: return aiText.Text; } @@ -393,11 +380,10 @@ public abstract partial class AssistantBase : AssistantLowerBase, IMe false => $"background-color: {this.ColorTheme.GetCurrentPalette(this.SettingsManager).InfoLighten}", }; - #region Implementation of IDisposable + #region Overrides of MSGComponentBase - public void Dispose() + protected override void DisposeResources() { - this.MessageBus.Unregister(this); this.formChangeTimer.Dispose(); } diff --git a/app/MindWork AI Studio/Assistants/AssistantLowerBase.cs b/app/MindWork AI Studio/Assistants/AssistantLowerBase.cs index 8e053015..2f9e804f 100644 --- a/app/MindWork AI Studio/Assistants/AssistantLowerBase.cs +++ b/app/MindWork AI Studio/Assistants/AssistantLowerBase.cs @@ -1,8 +1,8 @@ -using Microsoft.AspNetCore.Components; +using AIStudio.Components; namespace AIStudio.Assistants; -public abstract class AssistantLowerBase : ComponentBase +public abstract class AssistantLowerBase : MSGComponentBase { protected static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); diff --git a/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor b/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor index 2a5a9b19..c95f6f3a 100644 --- a/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor +++ b/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor @@ -5,10 +5,10 @@ Links: - Wikipedia list of cognitive biases - Extended bias poster - Blog post of Buster Benson: "Cognitive bias cheat sheet" + @T("Wikipedia list of cognitive biases") + @T("Extended bias poster") + @T("Blog post of Buster Benson:") "Cognitive bias cheat sheet" - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor.cs b/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor.cs index 94356393..d87701a3 100644 --- a/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor.cs +++ b/app/MindWork AI Studio/Assistants/BiasDay/BiasOfTheDayAssistant.razor.cs @@ -10,18 +10,9 @@ public partial class BiasOfTheDayAssistant : AssistantBaseCore Tools.Components.BIAS_DAY_ASSISTANT; - protected override string Title => "Bias of the Day"; + protected override string Title => T("Bias of the Day"); - protected override string Description => - """ - Learn about a different cognitive bias every day. You can also ask the LLM your questions. The idea behind - "Bias of the Day" is based on work by Buster Benson, John Manoogian III, and Brian Rene Morrissette. Buster - Benson grouped the biases, and the original texts come from Wikipedia. Brian Rene Morrissette condensed them - into a shorter version. Finally, John Manoogian III created the original poster based on Benson's work and - Morrissette's texts. Thorsten Sommer compared all texts for integration into AI Studio with the current Wikipedia - versions, updated them, and added source references. The idea of learning about one bias each day based on John's - poster comes from Drew Nelson. - """; + protected override string Description => T("""Learn about a different cognitive bias every day. You can also ask the LLM your questions. The idea behind "Bias of the Day" is based on work by Buster Benson, John Manoogian III, and Brian Rene Morrissette. Buster Benson grouped the biases, and the original texts come from Wikipedia. Brian Rene Morrissette condensed them into a shorter version. Finally, John Manoogian III created the original poster based on Benson's work and Morrissette's texts. Thorsten Sommer compared all texts for integration into AI Studio with the current Wikipedia versions, updated them, and added source references. The idea of learning about one bias each day based on John's poster comes from Drew Nelson."""); protected override string SystemPrompt => $""" You are a friendly, helpful expert on cognitive bias. You studied psychology and @@ -41,7 +32,7 @@ public partial class BiasOfTheDayAssistant : AssistantBaseCore FooterButtons => []; - protected override string SubmitText => "Show me the bias of the day"; + protected override string SubmitText => T("Show me the bias of the day"); protected override Func SubmitAction => this.TellBias; @@ -79,7 +70,7 @@ public partial class BiasOfTheDayAssistant : AssistantBaseCore + } - Add context + @T("Add context") - + @if (this.provideCompilerMessages) { - + } - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs index 61e94865..7bf8e932 100644 --- a/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs +++ b/app/MindWork AI Studio/Assistants/Coding/AssistantCoding.razor.cs @@ -8,14 +8,9 @@ public partial class AssistantCoding : AssistantBaseCore { public override Tools.Components Component => Tools.Components.CODING_ASSISTANT; - protected override string Title => "Coding Assistant"; + protected override string Title => T("Coding Assistant"); - protected override string Description => - """ - This coding assistant supports you in writing code. Provide some coding context by copying and pasting - your code into the input fields. You might assign an ID to your code snippet to easily reference it later. - When you have compiler messages, you can paste them into the input fields to get help with debugging as well. - """; + protected override string Description => T("This coding assistant supports you in writing code. Provide some coding context by copying and pasting your code into the input fields. You might assign an ID to your code snippet to easily reference it later. When you have compiler messages, you can paste them into the input fields to get help with debugging as well."); protected override string SystemPrompt => """ @@ -30,7 +25,7 @@ public partial class AssistantCoding : AssistantBaseCore protected override IReadOnlyList FooterButtons => []; - protected override string SubmitText => "Get Support"; + protected override string SubmitText => T("Get Support"); protected override Func SubmitAction => this.GetSupport; @@ -80,7 +75,7 @@ public partial class AssistantCoding : AssistantBaseCore return null; if(string.IsNullOrWhiteSpace(checkCompilerMessages)) - return "Please provide the compiler messages."; + return T("Please provide the compiler messages."); return null; } @@ -88,7 +83,7 @@ public partial class AssistantCoding : AssistantBaseCore private string? ValidateQuestions(string checkQuestions) { if(string.IsNullOrWhiteSpace(checkQuestions)) - return "Please provide your questions."; + return T("Please provide your questions."); return null; } @@ -97,7 +92,7 @@ public partial class AssistantCoding : AssistantBaseCore { this.codingContexts.Add(new() { - Id = $"Context {this.codingContexts.Count + 1}", + Id = string.Format(T("Context {0}"), this.codingContexts.Count + 1), Language = this.SettingsManager.ConfigurationData.Coding.PreselectOptions ? this.SettingsManager.ConfigurationData.Coding.PreselectedProgrammingLanguage : default, OtherLanguage = this.SettingsManager.ConfigurationData.Coding.PreselectOptions ? this.SettingsManager.ConfigurationData.Coding.PreselectedOtherProgrammingLanguage : string.Empty, }); diff --git a/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor b/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor index e49d4f1e..6bf1b20f 100644 --- a/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor +++ b/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor @@ -1,14 +1,18 @@ - +@inherits MSGComponentBase + + - + @foreach (var language in Enum.GetValues()) { - @language.Name() + + @language.Name() + } @if (this.CodingContext.Language is CommonCodingLanguages.OTHER) { - + } - \ No newline at end of file + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor.cs b/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor.cs index 0b599930..592b4f3a 100644 --- a/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor.cs +++ b/app/MindWork AI Studio/Assistants/Coding/CodingContextItem.razor.cs @@ -1,19 +1,16 @@ -using AIStudio.Settings; +using AIStudio.Components; using Microsoft.AspNetCore.Components; namespace AIStudio.Assistants.Coding; -public partial class CodingContextItem : ComponentBase +public partial class CodingContextItem : MSGComponentBase { [Parameter] public CodingContext CodingContext { get; set; } = new(); [Parameter] public EventCallback CodingContextChanged { get; set; } - - [Inject] - protected SettingsManager SettingsManager { get; set; } = null!; private static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); @@ -32,7 +29,7 @@ public partial class CodingContextItem : ComponentBase private string? ValidatingCode(string code) { if(string.IsNullOrWhiteSpace(code)) - return $"{this.CodingContext.Id}: Please provide your input."; + return string.Format(T("{0}: Please provide your input."), this.CodingContext.Id); return null; } @@ -43,7 +40,7 @@ public partial class CodingContextItem : ComponentBase return null; if(string.IsNullOrWhiteSpace(language)) - return "Please specify the language."; + return T("Please specify the language."); return null; } diff --git a/app/MindWork AI Studio/Assistants/Coding/CommonCodingLanguageExtensions.cs b/app/MindWork AI Studio/Assistants/Coding/CommonCodingLanguageExtensions.cs index 1010105c..fab5cc06 100644 --- a/app/MindWork AI Studio/Assistants/Coding/CommonCodingLanguageExtensions.cs +++ b/app/MindWork AI Studio/Assistants/Coding/CommonCodingLanguageExtensions.cs @@ -2,9 +2,11 @@ public static class CommonCodingLanguageExtensions { + private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(CommonCodingLanguageExtensions).Namespace, nameof(CommonCodingLanguageExtensions)); + public static string Name(this CommonCodingLanguages language) => language switch { - CommonCodingLanguages.NONE => "None", + CommonCodingLanguages.NONE => TB("None"), CommonCodingLanguages.BASH => "Bash", CommonCodingLanguages.BLAZOR => ".NET Blazor", @@ -37,7 +39,7 @@ public static class CommonCodingLanguageExtensions CommonCodingLanguages.TYPESCRIPT => "TypeScript", CommonCodingLanguages.XML => "XML", - CommonCodingLanguages.OTHER => "Other", - _ => "Unknown" + CommonCodingLanguages.OTHER => TB("Other"), + _ => TB("Unknown") }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor index 7a441dc0..2f8783b3 100644 --- a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor +++ b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor @@ -1,23 +1,25 @@ @attribute [Route(Routes.ASSISTANT_EMAIL)] @inherits AssistantBaseCore - + @if (this.provideHistory) { - + } - - - + + + @foreach (var contentLine in this.bulletPointsLines) { - @contentLine + + @contentLine + } - - - + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs index 7a91f1c8..cc0629d0 100644 --- a/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs +++ b/app/MindWork AI Studio/Assistants/EMail/AssistantEMail.razor.cs @@ -9,12 +9,9 @@ public partial class AssistantEMail : AssistantBaseCore Tools.Components.EMAIL_ASSISTANT; - protected override string Title => "E-Mail"; + protected override string Title => T("E-Mail"); - protected override string Description => - """ - Provide a list of bullet points and some basic information for an e-mail. The assistant will generate an e-mail based on that input. - """; + protected override string Description => T("Provide a list of bullet points and some basic information for an e-mail. The assistant will generate an e-mail based on that input."); protected override string SystemPrompt => $""" @@ -25,7 +22,7 @@ public partial class AssistantEMail : AssistantBaseCore FooterButtons => []; - protected override string SubmitText => "Create email"; + protected override string SubmitText => T("Create email"); protected override Func SubmitAction => this.CreateMail; @@ -100,12 +97,12 @@ public partial class AssistantEMail : AssistantBaseCore Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(WritingStylesExtensions).Namespace, nameof(WritingStylesExtensions)); + public static string Name(this WritingStyles style) => style switch { - WritingStyles.ACADEMIC => "Academic", - WritingStyles.PERSONAL => "Personal", - WritingStyles.BUSINESS_FORMAL => "Business formal", - WritingStyles.BUSINESS_INFORMAL => "Business informal", + WritingStyles.ACADEMIC => TB("Academic"), + WritingStyles.PERSONAL => TB("Personal"), + WritingStyles.BUSINESS_FORMAL => TB("Business formal"), + WritingStyles.BUSINESS_INFORMAL => TB("Business informal"), - _ => "Not specified", + _ => TB("Not specified"), }; public static string Prompt(this WritingStyles style) => style switch diff --git a/app/MindWork AI Studio/Assistants/ERI/AllowedLLMProvidersExtensions.cs b/app/MindWork AI Studio/Assistants/ERI/AllowedLLMProvidersExtensions.cs index c9c6462c..c9cfb3f2 100644 --- a/app/MindWork AI Studio/Assistants/ERI/AllowedLLMProvidersExtensions.cs +++ b/app/MindWork AI Studio/Assistants/ERI/AllowedLLMProvidersExtensions.cs @@ -2,12 +2,14 @@ namespace AIStudio.Assistants.ERI; public static class AllowedLLMProvidersExtensions { + private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(AllowedLLMProvidersExtensions).Namespace, nameof(AllowedLLMProvidersExtensions)); + public static string Description(this AllowedLLMProviders provider) => provider switch { - AllowedLLMProviders.NONE => "Please select what kind of LLM provider are allowed for this data source", - AllowedLLMProviders.ANY => "Any LLM provider is allowed: users might choose a cloud-based or a self-hosted provider", - AllowedLLMProviders.SELF_HOSTED => "Self-hosted LLM providers are allowed: users cannot choose any cloud-based provider", + AllowedLLMProviders.NONE => TB("Please select what kind of LLM provider are allowed for this data source"), + AllowedLLMProviders.ANY => TB("Any LLM provider is allowed: users might choose a cloud-based or a self-hosted provider"), + AllowedLLMProviders.SELF_HOSTED => TB("Self-hosted LLM providers are allowed: users cannot choose any cloud-based provider"), - _ => "Unknown option was selected" + _ => TB("Unknown option was selected") }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor index 86dfd241..cd52da4d 100644 --- a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor +++ b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor @@ -4,36 +4,38 @@ @inherits AssistantBaseCore - You can imagine it like this: Hypothetically, when Wikipedia implemented the ERI, it would vectorize - all pages using an embedding method. All of Wikipedia’s data would remain with Wikipedia, including the - vector database (decentralized approach). Then, any AI Studio user could add Wikipedia as a data source to - significantly reduce the hallucination of the LLM in knowledge questions. + @T("You can imagine it like this: Hypothetically, when Wikipedia implemented the ERI, it would vectorize all pages using an embedding method. All of Wikipedia’s data would remain with Wikipedia, including the vector database (decentralized approach). Then, any AI Studio user could add Wikipedia as a data source to significantly reduce the hallucination of the LLM in knowledge questions.") - Related links: + + @T("Related links:") + - ERI repository with example implementation in .NET and C# - Interactive documentation aka Swagger UI + + @T("ERI repository with example implementation in .NET and C#") + + + @T("Interactive documentation aka Swagger UI") +
- ERI server presets + @T("ERI server presets") - Here you have the option to save different configurations for various ERI servers and switch between them. This is useful if - you are responsible for multiple ERI servers. + @T("Here you have the option to save different configurations for various ERI servers and switch between them. This is useful if you are responsible for multiple ERI servers.") @if(this.SettingsManager.ConfigurationData.ERI.ERIServers.Count is 0) { - You have not yet added any ERI server presets. + @T("You have not yet added any ERI server presets.") } else @@ -50,112 +52,116 @@ else - Add ERI server preset + @T("Add ERI server preset") - Delete this server preset + @T("Delete this server preset") @if(this.AreServerPresetsBlocked) { - Hint: to allow this assistant to manage multiple presets, you must enable the preselection of values in the settings. + @T("Hint: to allow this assistant to manage multiple presets, you must enable the preselection of values in the settings.") } - Auto save + @T("Auto save") - The ERI specification will change over time. You probably want to keep your ERI server up to date. This means you might want to - regenerate the code for your ERI server. To avoid having to make all inputs each time, all your inputs and decisions can be - automatically saved. Would you like this? + @T("The ERI specification will change over time. You probably want to keep your ERI server up to date. This means you might want to regenerate the code for your ERI server. To avoid having to make all inputs each time, all your inputs and decisions can be automatically saved. Would you like this?") @if(this.AreServerPresetsBlocked) { - Hint: to allow this assistant to automatically save your changes, you must enable the preselection of values in the settings. + @T("Hint: to allow this assistant to automatically save your changes, you must enable the preselection of values in the settings.") } - +
- Common ERI server settings + @T("Common ERI server settings") - - + + - + @foreach (var language in Enum.GetValues()) { - @language.Name() + + @language.Name() + } @if (this.selectedProgrammingLanguage is ProgrammingLanguages.OTHER) { - + } - + @foreach (var version in Enum.GetValues()) { - @version + + @version + } - Download specification + @T("Download specification") - Data source settings + @T("Data source settings") - + @foreach (var dataSource in Enum.GetValues()) { - @dataSource.Name() + + @dataSource.Name() + } @if (this.selectedDataSource is DataSources.CUSTOM) { - + } @if(this.selectedDataSource > DataSources.FILE_SYSTEM) { - + } @if (this.NeedHostnamePort()) {
- - + + @if (this.dataSourcePort < 1024) { - Warning: Ports below 1024 are reserved for system services. Your ERI server need to run with elevated permissions (root user). + @((MarkupString)T("Warning: Ports below 1024 are reserved for system services. Your ERI server need to run with elevated permissions (root user).")) }
} - Authentication settings + @T("Authentication settings") @@ -168,12 +174,14 @@ else SelectedValues="@this.selectedAuthenticationMethods" Validation="@this.ValidateAuthenticationMethods" SelectedValuesChanged="@this.AuthenticationMethodWasChanged" - Label="Authentication method(s)" + Label="@T("Authentication method(s)")" Variant="Variant.Outlined" Margin="Margin.Dense"> @foreach (var authMethod in Enum.GetValues()) { - @authMethod.Name() + + @authMethod.Name() + } @@ -181,40 +189,39 @@ else @if (this.selectedAuthenticationMethods.Contains(Auth.KERBEROS)) { - + @foreach (var os in Enum.GetValues()) { - @os.Name() + + @os.Name() + } } - Data protection settings + @T("Data protection settings") - + @foreach (var option in Enum.GetValues()) { - @option.Description() + + @option.Description() + } - Embedding settings + @T("Embedding settings") - You will likely use one or more embedding methods to encode the meaning of your data into a typically high-dimensional vector - space. In this case, you will use a vector database to store and search these vectors (called embeddings). However, you don't - have to use embedding methods. When your retrieval method works without any embedding, you can ignore this section. An example: You - store files on a file server, and your retrieval method works exclusively with file names in the file system, so you don't - need embeddings. + @T("You will likely use one or more embedding methods to encode the meaning of your data into a typically high-dimensional vector space. In this case, you will use a vector database to store and search these vectors (called embeddings). However, you don't have to use embedding methods. When your retrieval method works without any embedding, you can ignore this section. An example: You store files on a file server, and your retrieval method works exclusively with file names in the file system, so you don't need embeddings.") - You can specify more than one embedding method. This can be useful when you want to use different embeddings for different queries - or data types. For example, one embedding for texts, another for images, and a third for videos, etc. + @T("You can specify more than one embedding method. This can be useful when you want to use different embeddings for different queries or data types. For example, one embedding for texts, another for images, and a third for videos, etc.") @if (!this.IsNoneERIServerSelected) @@ -226,9 +233,9 @@ else - Name - Type - Actions + @T("Name") + @T("Type") + @T("Actions") @context.EmbeddingName @@ -236,10 +243,10 @@ else - Edit + @T("Edit") - Delete + @T("Delete") @@ -248,23 +255,22 @@ else @if (this.embeddings.Count == 0) { - No embedding methods configured yet. + + @T("No embedding methods configured yet.") + } } - Add Embedding Method + @T("Add Embedding Method") - Data retrieval settings + @T("Data retrieval settings") - For your ERI server, you need to retrieve data that matches a chat or prompt in some way. We call this the retrieval process. - You must describe at least one such process. You may offer several retrieval processes from which users can choose. This allows - you to test with beta users which process works better. Or you might generally want to give users the choice so they can select - the process that best suits their circumstances. + @T("For your ERI server, you need to retrieve data that matches a chat or prompt in some way. We call this the retrieval process. You must describe at least one such process. You may offer several retrieval processes from which users can choose. This allows you to test with beta users which process works better. Or you might generally want to give users the choice so they can select the process that best suits their circumstances.") @if (!this.IsNoneERIServerSelected) @@ -275,18 +281,18 @@ else - Name - Actions + @T("Name") + @T("Actions") @context.Name - Edit + @T("Edit") - Delete + @T("Delete") @@ -295,59 +301,47 @@ else @if (this.retrievalProcesses.Count == 0) { - No retrieval process configured yet. + + @T("No retrieval process configured yet.") + } } - Add Retrieval Process + @T("Add Retrieval Process") - You can integrate additional libraries. Perhaps you want to evaluate the prompts in advance using a machine learning method or analyze them with a text - mining approach? Or maybe you want to preprocess images in the prompts? For such advanced scenarios, you can specify which libraries you want to use here. - It's best to describe which library you want to integrate for which purpose. This way, the LLM that writes the ERI server for you can try to use these - libraries effectively. This should result in less rework being necessary. If you don't know the necessary libraries, you can instead attempt to describe - the intended use. The LLM can then attempt to choose suitable libraries. However, hallucinations can occur, and fictional libraries might be selected. + @T("You can integrate additional libraries. Perhaps you want to evaluate the prompts in advance using a machine learning method or analyze them with a text mining approach? Or maybe you want to preprocess images in the prompts? For such advanced scenarios, you can specify which libraries you want to use here. It's best to describe which library you want to integrate for which purpose. This way, the LLM that writes the ERI server for you can try to use these libraries effectively. This should result in less rework being necessary. If you don't know the necessary libraries, you can instead attempt to describe the intended use. The LLM can then attempt to choose suitable libraries. However, hallucinations can occur, and fictional libraries might be selected.") - + - Provider selection for generation + @T("Provider selection for generation") - The task of writing the ERI server for you is very complex. Therefore, a very powerful LLM is needed to successfully accomplish this task. - Small local models will probably not be sufficient. Instead, try using a large cloud-based or a large self-hosted model. + @T("The task of writing the ERI server for you is very complex. Therefore, a very powerful LLM is needed to successfully accomplish this task. Small local models will probably not be sufficient. Instead, try using a large cloud-based or a large self-hosted model.") - Important: The LLM may need to generate many files. This reaches the request limit of most providers. Typically, only a certain number - of requests can be made per minute, and only a maximum number of tokens can be generated per minute. AI Studio automatically considers this. - However, generating all the files takes a certain amount of time. Local or self-hosted models may work without these limitations - and can generate responses faster. AI Studio dynamically adapts its behavior and always tries to achieve the fastest possible data processing. + @((MarkupString)T("Important: The LLM may need to generate many files. This reaches the request limit of most providers. Typically, only a certain number of requests can be made per minute, and only a maximum number of tokens can be generated per minute. AI Studio automatically considers this. However, generating all the files takes a certain amount of time. Local or self-hosted models may work without these limitations and can generate responses faster. AI Studio dynamically adapts its behavior and always tries to achieve the fastest possible data processing.")) - Write code to file system + @T("Write code to file system") - AI Studio can save the generated code to the file system. You can select a base folder for this. AI Studio ensures that no files are created - outside of this base folder. Furthermore, we recommend that you create a Git repository in this folder. This way, you can see what changes the - AI has made in which files. + @T("AI Studio can save the generated code to the file system. You can select a base folder for this. AI Studio ensures that no files are created outside of this base folder. Furthermore, we recommend that you create a Git repository in this folder. This way, you can see what changes the AI has made in which files.") - When you rebuild / re-generate the ERI server code, AI Studio proceeds as follows: All files generated last time will be deleted. All - other files you have created remain. Then, the AI generates the new files. But beware: It may happen that the AI generates a - file this time that you manually created last time. In this case, your manually created file will then be overwritten. Therefore, - you should always create a Git repository and commit or revert all changes before using this assistant. With a diff visualization, - you can immediately see where the AI has made changes. It is best to use an IDE suitable for your selected language for this purpose. + @((MarkupString)T("When you rebuild / re-generate the ERI server code, AI Studio proceeds as follows: All files generated last time will be deleted. All other files you have created remain. Then, the AI generates the new files. But beware: It may happen that the AI generates a file this time that you manually created last time. In this case, your manually created file will then be overwritten. Therefore, you should always create a Git repository and commit or revert all changes before using this assistant. With a diff visualization, you can immediately see where the AI has made changes. It is best to use an IDE suitable for your selected language for this purpose.")) - - + + diff --git a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs index c752f4cb..32e45306 100644 --- a/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs +++ b/app/MindWork AI Studio/Assistants/ERI/AssistantERI.razor.cs @@ -22,16 +22,9 @@ public partial class AssistantERI : AssistantBaseCore public override Tools.Components Component => Tools.Components.ERI_ASSISTANT; - protected override string Title => "ERI Server"; + protected override string Title => T("ERI Server"); - protected override string Description => - """ - The ERI is the External Retrieval Interface for AI Studio and other tools. The ERI acts as a contract - between decentralized data sources and, e.g., AI Studio. The ERI is implemented by the data sources, - allowing them to be integrated into AI Studio later. This means that the data sources assume the server - role and AI Studio (or any other LLM tool) assumes the client role of the API. This approach serves to - realize a Retrieval-Augmented Generation (RAG) process with external data. - """; + protected override string Description => T("The ERI is the External Retrieval Interface for AI Studio and other tools. The ERI acts as a contract between decentralized data sources and, e.g., AI Studio. The ERI is implemented by the data sources, allowing them to be integrated into AI Studio later. This means that the data sources assume the server role and AI Studio (or any other LLM tool) assumes the client role of the API. This approach serves to realize a Retrieval-Augmented Generation (RAG) process with external data."); protected override string SystemPrompt { @@ -44,7 +37,7 @@ public partial class AssistantERI : AssistantBaseCore // Introduction // --------------------------------- // - var programmingLanguage = this.selectedProgrammingLanguage is ProgrammingLanguages.OTHER ? this.otherProgrammingLanguage : this.selectedProgrammingLanguage.Name(); + var programmingLanguage = this.selectedProgrammingLanguage is ProgrammingLanguages.OTHER ? this.otherProgrammingLanguage : this.selectedProgrammingLanguage.ToPrompt(); sb.Append($""" # Introduction You are an experienced {programmingLanguage} developer. Your task is to implement an API server in @@ -159,7 +152,7 @@ public partial class AssistantERI : AssistantBaseCore { sb.Append($""" - The server will run on {this.selectedOperatingSystem.Name()} operating systems. Keep + The server will run on {this.selectedOperatingSystem.ToPrompt()} operating systems. Keep this in mind when implementing the SSO with Kerberos. """); } @@ -304,7 +297,7 @@ public partial class AssistantERI : AssistantBaseCore protected override bool ShowSendTo => false; - protected override string SubmitText => "Create the ERI server"; + protected override string SubmitText => T("Create the ERI server"); protected override Func SubmitAction => this.GenerateServer; @@ -469,7 +462,7 @@ public partial class AssistantERI : AssistantBaseCore { this.SettingsManager.ConfigurationData.ERI.ERIServers.Add(new () { - ServerName = $"ERI Server {DateTimeOffset.UtcNow}", + ServerName = string.Format(T("ERI Server {0}"), DateTimeOffset.UtcNow), }); await this.SettingsManager.StoreSettings(); @@ -482,10 +475,10 @@ public partial class AssistantERI : AssistantBaseCore var dialogParameters = new DialogParameters { - { "Message", $"Are you sure you want to delete the ERI server preset '{this.selectedERIServer.ServerName}'?" }, + { "Message", string.Format(T("Are you sure you want to delete the ERI server preset '{0}'?"), this.selectedERIServer.ServerName) }, }; - var dialogReference = await this.DialogService.ShowAsync("Delete ERI server preset", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Delete ERI server preset"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -518,13 +511,13 @@ public partial class AssistantERI : AssistantBaseCore private string? ValidateServerName(string name) { if(string.IsNullOrWhiteSpace(name)) - return "Please provide a name for your ERI server. This name will be used to identify the server in AI Studio."; + return T("Please provide a name for your ERI server. This name will be used to identify the server in AI Studio."); if(name.Length is > 60 or < 6) - return "The name of your ERI server must be between 6 and 60 characters long."; + return T("The name of your ERI server must be between 6 and 60 characters long."); if(this.SettingsManager.ConfigurationData.ERI.ERIServers.Where(n => n != this.selectedERIServer).Any(n => n.ServerName == name)) - return "An ERI server preset with this name already exists. Please choose a different name."; + return T("An ERI server preset with this name already exists. Please choose a different name."); return null; } @@ -532,10 +525,10 @@ public partial class AssistantERI : AssistantBaseCore private string? ValidateServerDescription(string description) { if(string.IsNullOrWhiteSpace(description)) - return "Please provide a description for your ERI server. What data will the server retrieve? This description will be used to inform users about the purpose of your ERI server."; + return T("Please provide a description for your ERI server. What data will the server retrieve? This description will be used to inform users about the purpose of your ERI server."); if(description.Length is < 32 or > 512) - return "The description of your ERI server must be between 32 and 512 characters long."; + return T("The description of your ERI server must be between 32 and 512 characters long."); return null; } @@ -543,7 +536,7 @@ public partial class AssistantERI : AssistantBaseCore private string? ValidateERIVersion(ERIVersion version) { if (version == ERIVersion.NONE) - return "Please select an ERI specification version for the ERI server."; + return T("Please select an ERI specification version for the ERI server."); return null; } @@ -554,7 +547,7 @@ public partial class AssistantERI : AssistantBaseCore return null; if (language == ProgrammingLanguages.NONE) - return "Please select a programming language for the ERI server."; + return T("Please select a programming language for the ERI server."); return null; } @@ -565,7 +558,7 @@ public partial class AssistantERI : AssistantBaseCore return null; if(string.IsNullOrWhiteSpace(language)) - return "Please specify the custom programming language for the ERI server."; + return T("Please specify the custom programming language for the ERI server."); return null; } @@ -576,7 +569,7 @@ public partial class AssistantERI : AssistantBaseCore return null; if (dataSource == DataSources.NONE) - return "Please select a data source for the ERI server."; + return T("Please select a data source for the ERI server."); return null; } @@ -587,7 +580,7 @@ public partial class AssistantERI : AssistantBaseCore return null; if(string.IsNullOrWhiteSpace(productName)) - return "Please specify the product name of the data source, e.g., 'MongoDB', 'Redis', 'PostgreSQL', 'Neo4j', or 'MinIO', etc."; + return T("Please specify the product name of the data source, e.g., 'MongoDB', 'Redis', 'PostgreSQL', 'Neo4j', or 'MinIO', etc."); return null; } @@ -598,7 +591,7 @@ public partial class AssistantERI : AssistantBaseCore return null; if(string.IsNullOrWhiteSpace(dataSource)) - return "Please describe the data source of your ERI server."; + return T("Please describe the data source of your ERI server."); return null; } @@ -613,10 +606,10 @@ public partial class AssistantERI : AssistantBaseCore return null; if(string.IsNullOrWhiteSpace(hostname)) - return "Please provide the hostname of the data source. Use 'localhost' if the data source is on the same machine as the ERI server."; + return T("Please provide the hostname of the data source. Use 'localhost' if the data source is on the same machine as the ERI server."); if(hostname.Length > 255) - return "The hostname of the data source must not exceed 255 characters."; + return T("The hostname of the data source must not exceed 255 characters."); return null; } @@ -631,10 +624,10 @@ public partial class AssistantERI : AssistantBaseCore return null; if(port is null) - return "Please provide the port of the data source."; + return T("Please provide the port of the data source."); if(port is < 1 or > 65535) - return "The port of the data source must be between 1 and 65535."; + return T("The port of the data source must be between 1 and 65535."); return null; } @@ -679,7 +672,7 @@ public partial class AssistantERI : AssistantBaseCore { var authenticationMethods = (this.selectedAuthenticationMethods as HashSet)!; if(authenticationMethods.Count == 0) - return "Please select at least one authentication method for the ERI server."; + return T("Please select at least one authentication method for the ERI server."); return null; } @@ -709,7 +702,7 @@ public partial class AssistantERI : AssistantBaseCore return null; if(os is OperatingSystem.NONE) - return "Please select the operating system on which the ERI server will run. This is necessary when using SSO with Kerberos."; + return T("Please select the operating system on which the ERI server will run. This is necessary when using SSO with Kerberos."); return null; } @@ -717,16 +710,12 @@ public partial class AssistantERI : AssistantBaseCore private string? ValidateAllowedLLMProviders(AllowedLLMProviders provider) { if(provider == AllowedLLMProviders.NONE) - return "Please select which types of LLMs users are allowed to use with the data from this ERI server."; + return T("Please select which types of LLMs users are allowed to use with the data from this ERI server."); return null; } - private string AuthDescriptionTitle() - { - const string TITLE = "Describe how you planned the authentication process"; - return this.IsAuthDescriptionOptional() ? $"(Optional) {TITLE}" : TITLE; - } + private string AuthDescriptionTitle() => this.IsAuthDescriptionOptional() ? T("(Optional) Describe how you planned the authentication process") : T("Describe how you planned the authentication process"); private bool IsAuthDescriptionOptional() { @@ -746,10 +735,10 @@ public partial class AssistantERI : AssistantBaseCore { var authenticationMethods = (this.selectedAuthenticationMethods as HashSet)!; if(authenticationMethods.Any(n => n == Auth.NONE) && authenticationMethods.Count > 1 && string.IsNullOrWhiteSpace(this.authDescription)) - return "Please describe how the selected authentication methods should be used. Especially, explain for what data the NONE method (public access) is used."; + return T("Please describe how the selected authentication methods should be used. Especially, explain for what data the NONE method (public access) is used."); if(authenticationMethods.Count > 1 && string.IsNullOrWhiteSpace(this.authDescription)) - return "Please describe how the selected authentication methods should be used."; + return T("Please describe how the selected authentication methods should be used."); return null; } @@ -760,7 +749,7 @@ public partial class AssistantERI : AssistantBaseCore return null; if(string.IsNullOrWhiteSpace(path)) - return "Please provide a base directory for the ERI server to write files to."; + return T("Please provide a base directory for the ERI server to write files to."); return null; } @@ -768,12 +757,12 @@ public partial class AssistantERI : AssistantBaseCore private string GetMultiSelectionAuthText(List selectedValues) { if(selectedValues.Count == 0) - return "Please select at least one authentication method"; + return T("Please select at least one authentication method"); if(selectedValues.Count == 1) - return $"You have selected 1 authentication method"; + return T("You have selected 1 authentication method"); - return $"You have selected {selectedValues.Count} authentication methods"; + return string.Format(T("You have selected {0} authentication methods"), selectedValues.Count); } private bool NeedHostnamePort() @@ -797,7 +786,7 @@ public partial class AssistantERI : AssistantBaseCore { x => x.UsedEmbeddingMethodNames, this.embeddings.Select(n => n.EmbeddingName).ToList() }, }; - var dialogReference = await this.DialogService.ShowAsync("Add Embedding Method", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Add Embedding Method"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -821,7 +810,7 @@ public partial class AssistantERI : AssistantBaseCore { x => x.IsEditing, true }, }; - var dialogReference = await this.DialogService.ShowAsync("Edit Embedding Method", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Edit Embedding Method"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -835,15 +824,15 @@ public partial class AssistantERI : AssistantBaseCore private async Task DeleteEmbedding(EmbeddingInfo embeddingInfo) { var message = this.retrievalProcesses.Any(n => n.Embeddings?.Contains(embeddingInfo) is true) - ? $"The embedding '{embeddingInfo.EmbeddingName}' is used in one or more retrieval processes. Are you sure you want to delete it?" - : $"Are you sure you want to delete the embedding '{embeddingInfo.EmbeddingName}'?"; + ? string.Format(T("The embedding '{0}' is used in one or more retrieval processes. Are you sure you want to delete it?"), embeddingInfo.EmbeddingName) + : string.Format(T("Are you sure you want to delete the embedding '{0}'?"), embeddingInfo.EmbeddingName); var dialogParameters = new DialogParameters { { "Message", message }, }; - var dialogReference = await this.DialogService.ShowAsync("Delete Embedding", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Delete Embedding"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -863,7 +852,7 @@ public partial class AssistantERI : AssistantBaseCore { x => x.UsedRetrievalProcessNames, this.retrievalProcesses.Select(n => n.Name).ToList() }, }; - var dialogReference = await this.DialogService.ShowAsync("Add Retrieval Process", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Add Retrieval Process"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -888,7 +877,7 @@ public partial class AssistantERI : AssistantBaseCore { x => x.UsedRetrievalProcessNames, this.retrievalProcesses.Where(n => n != retrievalInfo).Select(n => n.Name).ToList() }, }; - var dialogReference = await this.DialogService.ShowAsync("Edit Retrieval Process", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Edit Retrieval Process"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -903,10 +892,10 @@ public partial class AssistantERI : AssistantBaseCore { var dialogParameters = new DialogParameters { - { "Message", $"Are you sure you want to delete the retrieval process '{retrievalInfo.Name}'?" }, + { "Message", string.Format(T("Are you sure you want to delete the retrieval process '{0}'?"), retrievalInfo.Name) }, }; - var dialogReference = await this.DialogService.ShowAsync("Delete Retrieval Process", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Delete Retrieval Process"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -957,14 +946,14 @@ public partial class AssistantERI : AssistantBaseCore if(this.retrievalProcesses.Count == 0) { - this.AddInputIssue("Please describe at least one retrieval process."); + this.AddInputIssue(T("Please describe at least one retrieval process.")); return; } this.eriSpecification = await this.selectedERIVersion.ReadSpecification(this.HttpClient); if (string.IsNullOrWhiteSpace(this.eriSpecification)) { - this.AddInputIssue("The ERI specification could not be loaded. Please try again later."); + this.AddInputIssue(T("The ERI specification could not be loaded. Please try again later.")); return; } diff --git a/app/MindWork AI Studio/Assistants/ERI/AuthExtensions.cs b/app/MindWork AI Studio/Assistants/ERI/AuthExtensions.cs index b8a8bdf9..32be6d70 100644 --- a/app/MindWork AI Studio/Assistants/ERI/AuthExtensions.cs +++ b/app/MindWork AI Studio/Assistants/ERI/AuthExtensions.cs @@ -2,15 +2,17 @@ namespace AIStudio.Assistants.ERI; public static class AuthExtensions { + private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(AuthExtensions).Namespace, nameof(AuthExtensions)); + public static string Name(this Auth auth) => auth switch { - Auth.NONE => "No login necessary: useful for public data sources", + Auth.NONE => TB("No login necessary: useful for public data sources"), - Auth.KERBEROS => "Login by single-sign-on (SSO) using Kerberos: very complex to implement and to operate, useful for many users", - Auth.USERNAME_PASSWORD => "Login by username and password: simple to implement and to operate, useful for few users; easy to use for users", - Auth.TOKEN => "Login by token: simple to implement and to operate, useful for few users; unusual for many users", + Auth.KERBEROS => TB("Login by single-sign-on (SSO) using Kerberos: very complex to implement and to operate, useful for many users"), + Auth.USERNAME_PASSWORD => TB("Login by username and password: simple to implement and to operate, useful for few users; easy to use for users"), + Auth.TOKEN => TB("Login by token: simple to implement and to operate, useful for few users; unusual for many users"), - _ => "Unknown login method" + _ => TB("Unknown login method") }; public static string ToPrompt(this Auth auth) => auth switch diff --git a/app/MindWork AI Studio/Assistants/ERI/DataSourcesExtensions.cs b/app/MindWork AI Studio/Assistants/ERI/DataSourcesExtensions.cs index 83c5c1d7..deeecc1e 100644 --- a/app/MindWork AI Studio/Assistants/ERI/DataSourcesExtensions.cs +++ b/app/MindWork AI Studio/Assistants/ERI/DataSourcesExtensions.cs @@ -2,18 +2,20 @@ namespace AIStudio.Assistants.ERI; public static class DataSourcesExtensions { + private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(DataSourcesExtensions).Namespace, nameof(DataSourcesExtensions)); + public static string Name(this DataSources dataSource) => dataSource switch { - DataSources.NONE => "No data source selected", - DataSources.CUSTOM => "Custom description", + DataSources.NONE => TB("No data source selected"), + DataSources.CUSTOM => TB("Custom description"), - DataSources.FILE_SYSTEM => "File system (local or network share)", - DataSources.OBJECT_STORAGE => "Object storage, like Amazon S3, MinIO, etc.", - DataSources.KEY_VALUE_STORE => "Key-Value store, like Redis, etc.", - DataSources.DOCUMENT_STORE => "Document store, like MongoDB, etc.", - DataSources.RELATIONAL_DATABASE => "Relational database, like MySQL, PostgreSQL, etc.", - DataSources.GRAPH_DATABASE => "Graph database, like Neo4j, ArangoDB, etc.", + DataSources.FILE_SYSTEM => TB("File system (local or network share)"), + DataSources.OBJECT_STORAGE => TB("Object storage, like Amazon S3, MinIO, etc."), + DataSources.KEY_VALUE_STORE => TB("Key-Value store, like Redis, etc."), + DataSources.DOCUMENT_STORE => TB("Document store, like MongoDB, etc."), + DataSources.RELATIONAL_DATABASE => TB("Relational database, like MySQL, PostgreSQL, etc."), + DataSources.GRAPH_DATABASE => TB("Graph database, like Neo4j, ArangoDB, etc."), - _ => "Unknown data source" + _ => TB("Unknown data source") }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/ERI/OperatingSystemExtensions.cs b/app/MindWork AI Studio/Assistants/ERI/OperatingSystemExtensions.cs index eac46147..cfb02a5c 100644 --- a/app/MindWork AI Studio/Assistants/ERI/OperatingSystemExtensions.cs +++ b/app/MindWork AI Studio/Assistants/ERI/OperatingSystemExtensions.cs @@ -2,7 +2,19 @@ namespace AIStudio.Assistants.ERI; public static class OperatingSystemExtensions { + private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(OperatingSystemExtensions).Namespace, nameof(OperatingSystemExtensions)); + public static string Name(this OperatingSystem os) => os switch + { + OperatingSystem.NONE => TB("No operating system specified"), + + OperatingSystem.WINDOWS => TB("Windows"), + OperatingSystem.LINUX => TB("Linux"), + + _ => TB("Unknown operating system") + }; + + public static string ToPrompt(this OperatingSystem os) => os switch { OperatingSystem.NONE => "No operating system specified", diff --git a/app/MindWork AI Studio/Assistants/ERI/ProgrammingLanguagesExtensions.cs b/app/MindWork AI Studio/Assistants/ERI/ProgrammingLanguagesExtensions.cs index f4b8be61..6bd59d71 100644 --- a/app/MindWork AI Studio/Assistants/ERI/ProgrammingLanguagesExtensions.cs +++ b/app/MindWork AI Studio/Assistants/ERI/ProgrammingLanguagesExtensions.cs @@ -2,7 +2,29 @@ namespace AIStudio.Assistants.ERI; public static class ProgrammingLanguagesExtensions { + private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(ProgrammingLanguagesExtensions).Namespace, nameof(ProgrammingLanguagesExtensions)); + public static string Name(this ProgrammingLanguages language) => language switch + { + ProgrammingLanguages.NONE => TB("No programming language selected"), + + ProgrammingLanguages.C => "C", + ProgrammingLanguages.CPP => "C++", + ProgrammingLanguages.CSHARP => "C#", + ProgrammingLanguages.GO => "Go", + ProgrammingLanguages.JAVA => "Java", + ProgrammingLanguages.JAVASCRIPT => "JavaScript", + ProgrammingLanguages.JULIA => "Julia", + ProgrammingLanguages.MATLAB => "MATLAB", + ProgrammingLanguages.PHP => "PHP", + ProgrammingLanguages.PYTHON => "Python", + ProgrammingLanguages.RUST => "Rust", + + ProgrammingLanguages.OTHER => TB("Other"), + _ => TB("Unknown") + }; + + public static string ToPrompt(this ProgrammingLanguages language) => language switch { ProgrammingLanguages.NONE => "No programming language selected", diff --git a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor index b6a500a0..f783f657 100644 --- a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor +++ b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor @@ -1,6 +1,6 @@ @attribute [Route(Routes.ASSISTANT_GRAMMAR_SPELLING)] @inherits AssistantBaseCore - - + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs index 4a0e53c1..6025f133 100644 --- a/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs +++ b/app/MindWork AI Studio/Assistants/GrammarSpelling/AssistantGrammarSpelling.razor.cs @@ -7,12 +7,9 @@ public partial class AssistantGrammarSpelling : AssistantBaseCore Tools.Components.GRAMMAR_SPELLING_ASSISTANT; - protected override string Title => "Grammar & Spelling Checker"; + protected override string Title => T("Grammar & Spelling Checker"); - protected override string Description => - """ - Check the grammar and spelling of a text. - """; + protected override string Description => T("Check the grammar and spelling of a text."); protected override string SystemPrompt => $""" @@ -40,7 +37,7 @@ public partial class AssistantGrammarSpelling : AssistantBaseCore "Proofread"; + protected override string SubmitText => T("Proofread"); protected override Func SubmitAction => this.ProofreadText; @@ -93,7 +90,7 @@ public partial class AssistantGrammarSpelling : AssistantBaseCore + + + +@if (this.isLoading) +{ + + @T("The data is being loaded, please wait...") + +} else if (!this.isLoading && !string.IsNullOrWhiteSpace(this.loadingIssue)) +{ + + @T("While loading the I18N data, an issue occurred:") @this.loadingIssue + +} +else if (!this.isLoading && string.IsNullOrWhiteSpace(this.loadingIssue)) +{ + + @this.AddedContentText + + + + + + + + + + + @T("Key") + @T("Text") + + + +
+                    @context.Key
+                
+
+ + @context.Value + +
+ + + +
+ + + @this.RemovedContentText + + + + + + + + + + + @T("Key") + @T("Text") + + + +
+                    @context.Key
+                
+
+ + @context.Value + +
+ + + +
+ + @if (this.selectedTargetLanguage is CommonLanguages.EN_US) + { + + @T("Please note: neither is a translation needed nor performed for English (USA). Anyway, you might want to generate the related Lua code.") + + } + else + { + + } + + @if (this.localizedContent.Count > 0) + { +
+ + @this.LocalizedContentText + + + + + + + + + + + @T("Key") + @T("Text") + + + +
+                    @context.Key
+                
+
+ + @context.Value + +
+ + + +
+ } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs b/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs new file mode 100644 index 00000000..28c00568 --- /dev/null +++ b/app/MindWork AI Studio/Assistants/I18N/AssistantI18N.razor.cs @@ -0,0 +1,377 @@ +using System.Diagnostics; +using System.Text; + +using AIStudio.Dialogs.Settings; +using AIStudio.Tools.PluginSystem; + +using Microsoft.Extensions.FileProviders; + +using SharedTools; + +#if RELEASE +using System.Reflection; +#endif + +namespace AIStudio.Assistants.I18N; + +public partial class AssistantI18N : AssistantBaseCore +{ + public override Tools.Components Component => Tools.Components.I18N_ASSISTANT; + + protected override string Title => T("Localization"); + + protected override string Description => T("Translate MindWork AI Studio text content into another language."); + + protected override string SystemPrompt => + $""" + # Assignment + You are an expert in professional translations from English (US) to {this.SystemPromptLanguage()}. + You translate the texts without adding any new information. When necessary, you correct + spelling and grammar. + + # Context + The texts to be translated come from the open source app "MindWork AI Studio". The goal + is to localize the app so that it can be offered in other languages. You will always + receive one text at a time. A text may be, for example, for a button, a label, or an + explanation within the app. The app "AI Studio" is a desktop app for macOS, Linux, + and Windows. Users can use Large Language Models (LLMs) in practical ways in their + daily lives with it. The app offers the regular chat mode for which LLMs have become + known. However, AI Studio also offers so-called assistants, where users no longer + have to prompt. + + # Target Audience + The app is intended for everyone, not just IT specialists or scientists. When translating, + make sure the texts are easy for everyone to understand. + """; + + protected override bool AllowProfiles => false; + + protected override bool ShowResult => false; + + protected override bool ShowCopyResult => false; + + protected override bool ShowSendTo => false; + + protected override IReadOnlyList FooterButtons => + [ + new ButtonData + { + Text = T("Copy Lua code to clipboard"), + Icon = Icons.Material.Filled.Extension, + Color = Color.Default, + AsyncAction = async () => await this.RustService.CopyText2Clipboard(this.Snackbar, this.finalLuaCode.ToString()), + DisabledActionParam = () => this.finalLuaCode.Length == 0, + }, + ]; + + protected override string SubmitText => T("Localize AI Studio & generate the Lua code"); + + protected override Func SubmitAction => this.LocalizeTextContent; + + protected override bool SubmitDisabled => !this.localizationPossible; + + protected override bool ShowDedicatedProgress => true; + + protected override void ResetForm() + { + if (!this.MightPreselectValues()) + { + this.selectedLanguagePluginId = InternalPlugin.LANGUAGE_EN_US.MetaData().Id; + this.selectedTargetLanguage = CommonLanguages.AS_IS; + this.customTargetLanguage = string.Empty; + } + + _ = this.OnChangedLanguage(); + } + + protected override bool MightPreselectValues() + { + if (this.SettingsManager.ConfigurationData.I18N.PreselectOptions) + { + this.selectedLanguagePluginId = this.SettingsManager.ConfigurationData.I18N.PreselectedLanguagePluginId; + this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.I18N.PreselectedTargetLanguage; + this.customTargetLanguage = this.SettingsManager.ConfigurationData.I18N.PreselectOtherLanguage; + return true; + } + + return false; + } + + private CommonLanguages selectedTargetLanguage; + private string customTargetLanguage = string.Empty; + private bool isLoading = true; + private string loadingIssue = string.Empty; + private bool localizationPossible; + private string searchString = string.Empty; + private Guid selectedLanguagePluginId; + private ILanguagePlugin? selectedLanguagePlugin; + private Dictionary addedContent = []; + private Dictionary removedContent = []; + private Dictionary localizedContent = []; + private StringBuilder finalLuaCode = new(); + + #region Overrides of AssistantBase + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + await this.OnLanguagePluginChanged(this.selectedLanguagePluginId); + await this.LoadData(); + } + + #endregion + + private string SystemPromptLanguage() => this.selectedTargetLanguage switch + { + CommonLanguages.OTHER => this.customTargetLanguage, + _ => $"{this.selectedTargetLanguage.Name()}", + }; + + private async Task OnLanguagePluginChanged(Guid pluginId) + { + this.selectedLanguagePluginId = pluginId; + await this.OnChangedLanguage(); + } + + private async Task OnChangedLanguage() + { + this.finalLuaCode.Clear(); + this.localizedContent.Clear(); + this.localizationPossible = false; + if (PluginFactory.RunningPlugins.FirstOrDefault(n => n is PluginLanguage && n.Id == this.selectedLanguagePluginId) is not PluginLanguage comparisonPlugin) + { + this.loadingIssue = string.Format(T("Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin."), this.selectedLanguagePluginId); + this.selectedLanguagePlugin = null; + } + else if (comparisonPlugin.IETFTag != this.selectedTargetLanguage.ToIETFTag()) + { + this.loadingIssue = string.Format(T("The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language."), comparisonPlugin.IETFTag, this.selectedTargetLanguage.ToIETFTag()); + this.selectedLanguagePlugin = null; + } + else + { + this.selectedLanguagePlugin = comparisonPlugin; + this.loadingIssue = string.Empty; + await this.LoadData(); + } + + this.StateHasChanged(); + } + + private async Task LoadData() + { + if (this.selectedLanguagePlugin is null) + { + this.loadingIssue = T("Please select a language plugin for comparison."); + this.localizationPossible = false; + this.isLoading = false; + this.StateHasChanged(); + return; + } + + this.isLoading = true; + this.StateHasChanged(); + + // + // Read the file `Assistants\I18N\allTexts.lua`: + // + #if DEBUG + var filePath = Path.Join(Environment.CurrentDirectory, "Assistants", "I18N"); + var resourceFileProvider = new PhysicalFileProvider(filePath); + #else + var resourceFileProvider = new ManifestEmbeddedFileProvider(Assembly.GetAssembly(type: typeof(Program))!, "Assistants/I18N"); + #endif + + var file = resourceFileProvider.GetFileInfo("allTexts.lua"); + await using var fileStream = file.CreateReadStream(); + using var reader = new StreamReader(fileStream); + var newI18NDataLuaCode = await reader.ReadToEndAsync(); + + // + // Next, we try to load the text as a language plugin -- without + // actually starting the plugin: + // + var newI18NPlugin = await PluginFactory.Load(null, newI18NDataLuaCode); + switch (newI18NPlugin) + { + case NoPlugin noPlugin when noPlugin.Issues.Any(): + this.loadingIssue = noPlugin.Issues.First(); + break; + + case NoPlugin: + this.loadingIssue = T("Was not able to load the I18N plugin. Please check the plugin code."); + break; + + case { IsValid: false } plugin when plugin.Issues.Any(): + this.loadingIssue = plugin.Issues.First(); + break; + + case PluginLanguage pluginLanguage: + this.loadingIssue = string.Empty; + var newI18NContent = pluginLanguage.Content; + + var currentI18NContent = this.selectedLanguagePlugin.Content; + this.addedContent = newI18NContent.ExceptBy(currentI18NContent.Keys, n => n.Key).ToDictionary(); + this.removedContent = currentI18NContent.ExceptBy(newI18NContent.Keys, n => n.Key).ToDictionary(); + this.localizationPossible = true; + break; + } + + this.isLoading = false; + this.StateHasChanged(); + } + + private bool FilterFunc(KeyValuePair element) + { + if (string.IsNullOrWhiteSpace(this.searchString)) + return true; + + if (element.Key.Contains(this.searchString, StringComparison.OrdinalIgnoreCase)) + return true; + + if (element.Value.Contains(this.searchString, StringComparison.OrdinalIgnoreCase)) + return true; + + return false; + } + + private string? ValidatingTargetLanguage(CommonLanguages language) + { + if(language == CommonLanguages.AS_IS) + return T("Please select a target language."); + + return null; + } + + private string? ValidateCustomLanguage(string language) + { + if(this.selectedTargetLanguage == CommonLanguages.OTHER && string.IsNullOrWhiteSpace(language)) + return T("Please provide a custom language."); + + return null; + } + + private int NumTotalItems => (this.selectedLanguagePlugin?.Content.Count ?? 0) + this.addedContent.Count - this.removedContent.Count; + + private string AddedContentText => string.Format(T("Added Content ({0} entries)"), this.addedContent.Count); + + private string RemovedContentText => string.Format(T("Removed Content ({0} entries)"), this.removedContent.Count); + + private string LocalizedContentText => string.Format(T("Localized Content ({0} entries of {1})"), this.localizedContent.Count, this.NumTotalItems); + + private async Task LocalizeTextContent() + { + await this.form!.Validate(); + if (!this.inputIsValid) + return; + + if(this.selectedLanguagePlugin is null) + return; + + if (this.selectedLanguagePlugin.IETFTag != this.selectedTargetLanguage.ToIETFTag()) + return; + + this.localizedContent.Clear(); + if (this.selectedTargetLanguage is not CommonLanguages.EN_US) + { + // Phase 1: Translate added content + await this.Phase1TranslateAddedContent(); + } + else + { + // Case: no translation needed + this.localizedContent = this.addedContent.ToDictionary(); + } + + if(this.cancellationTokenSource!.IsCancellationRequested) + return; + + // + // Now, we have localized the added content. Next, we must merge + // the localized content with the existing content. However, we + // must skip the removed content. We use the localizedContent + // dictionary for the final result: + // + foreach (var keyValuePair in this.selectedLanguagePlugin.Content) + { + if (this.cancellationTokenSource!.IsCancellationRequested) + break; + + if (this.localizedContent.ContainsKey(keyValuePair.Key)) + continue; + + if (this.removedContent.ContainsKey(keyValuePair.Key)) + continue; + + this.localizedContent.Add(keyValuePair.Key, keyValuePair.Value); + } + + if(this.cancellationTokenSource!.IsCancellationRequested) + return; + + // + // Phase 2: Create the Lua code. We want to use the base language + // for the comments, though: + // + var commentContent = new Dictionary(this.addedContent); + foreach (var keyValuePair in PluginFactory.BaseLanguage.Content) + { + if (this.cancellationTokenSource!.IsCancellationRequested) + break; + + if (this.removedContent.ContainsKey(keyValuePair.Key)) + continue; + + commentContent.TryAdd(keyValuePair.Key, keyValuePair.Value); + } + + this.Phase2CreateLuaCode(commentContent); + } + + private async Task Phase1TranslateAddedContent() + { + var stopwatch = new Stopwatch(); + var minimumTime = TimeSpan.FromMilliseconds(500); + foreach (var keyValuePair in this.addedContent) + { + if(this.cancellationTokenSource!.IsCancellationRequested) + break; + + // + // We measure the time for each translation. + // We do not want to make more than 120 requests + // per minute, i.e., 2 requests per second. + // + stopwatch.Reset(); + stopwatch.Start(); + + // + // Translate one text at a time: + // + this.CreateChatThread(); + var time = this.AddUserRequest(keyValuePair.Value); + this.localizedContent.Add(keyValuePair.Key, await this.AddAIResponseAsync(time)); + + if (this.cancellationTokenSource!.IsCancellationRequested) + break; + + // + // Ensure that we do not exceed the rate limit of 2 requests per second: + // + stopwatch.Stop(); + if (stopwatch.Elapsed < minimumTime) + await Task.Delay(minimumTime - stopwatch.Elapsed); + } + } + + private void Phase2CreateLuaCode(IReadOnlyDictionary commentContent) + { + this.finalLuaCode.Clear(); + LuaTable.Create(ref this.finalLuaCode, "UI_TEXT_CONTENT", this.localizedContent, commentContent, this.cancellationTokenSource!.Token); + + // Next, we must remove the `root::` prefix from the keys: + this.finalLuaCode.Replace("""UI_TEXT_CONTENT["root::""", """ + UI_TEXT_CONTENT[" + """); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua new file mode 100644 index 00000000..c1f07097 --- /dev/null +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -0,0 +1,5378 @@ +-- The ID for this plugin: +ID = "77c2688a-a68f-45cc-820e-fa8f3038a146" + +-- The icon for the plugin: +ICON_SVG = "" + +-- The name of the plugin: +NAME = "Collected I18N keys" + +-- The description of the plugin: +DESCRIPTION = "This plugin is not meant to be used directly. Its a collection of all I18N keys found in the project." + +-- The version of the plugin: +VERSION = "1.0.0" + +-- The type of the plugin: +TYPE = "LANGUAGE" + +-- The authors of the plugin: +AUTHORS = {"MindWork AI Community"} + +-- The support contact for the plugin: +SUPPORT_CONTACT = "MindWork AI Community" + +-- The source URL for the plugin: +SOURCE_URL = "https://github.com/MindWorkAI/AI-Studio" + +-- The categories for the plugin: +CATEGORIES = { "CORE" } + +-- The target groups for the plugin: +TARGET_GROUPS = { "EVERYONE" } + +-- The flag for whether the plugin is maintained: +IS_MAINTAINED = true + +-- When the plugin is deprecated, this message will be shown to users: +DEPRECATION_MESSAGE = "" + +-- The IETF BCP 47 tag for the language. It's the ISO 639 language +-- code followed by the ISO 3166-1 country code: +IETF_TAG = "en-US" + +-- The language name in the user's language: +LANG_NAME = "English (United States)" + +UI_TEXT_CONTENT = {} + +-- Objective +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1121586136"] = "Objective" + +-- Describe the topic of the meeting, seminar, etc. Is it about quantum computing, software engineering, or is it a general business meeting? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T12079368"] = "Describe the topic of the meeting, seminar, etc. Is it about quantum computing, software engineering, or is it a general business meeting?" + +-- Should there be a social activity? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1222794463"] = "Should there be a social activity?" + +-- Is this a virtual event, e.g., a call or webinar? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T123591568"] = "Is this a virtual event, e.g., a call or webinar?" + +-- Active participation, like world café, discussions, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1276489759"] = "Active participation, like world café, discussions, etc." + +-- Project meeting +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1307971935"] = "Project meeting" + +-- Who will moderate the meeting, seminar, etc.? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1328622016"] = "Who will moderate the meeting, seminar, etc.?" + +-- Passive participation, like presentations, lectures, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1331274154"] = "Passive participation, like presentations, lectures, etc." + +-- Please provide a moderator for the meeting or the seminar. Who will lead the discussion? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1345848634"] = "Please provide a moderator for the meeting or the seminar. Who will lead the discussion?" + +-- Please start each line of your content list with a dash (-) to create a bullet point list. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1384718254"] = "Please start each line of your content list with a dash (-) to create a bullet point list." + +-- Describe the objective(s) of the meeting, seminar, etc. What should be achieved? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T142537978"] = "Describe the objective(s) of the meeting, seminar, etc. What should be achieved?" + +-- Location +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1539345862"] = "Location" + +-- Meeting Name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1581597965"] = "Meeting Name" + +-- Topic +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1750080356"] = "Topic" + +-- Please provide a location for the meeting or the seminar. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1812212200"] = "Please provide a location for the meeting or the seminar." + +-- Content list +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1823782898"] = "Content list" + +-- Please provide a topic for the agenda. What is the meeting or the seminar about? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1862110661"] = "Please provide a topic for the agenda. What is the meeting or the seminar about?" + +-- Create Agenda +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1974034983"] = "Create Agenda" + +-- Number of participants +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2155351093"] = "Number of participants" + +-- Please provide an objective for the meeting or the seminar. What do you want to achieve? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2162394691"] = "Please provide an objective for the meeting or the seminar. What do you want to achieve?" + +-- Discuss the current project status and plan the next steps. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2213481631"] = "Discuss the current project status and plan the next steps." + +-- Please provide a start time for the meeting or the seminar. When the meeting is a multi-day event, specify the start time for each day, e.g. '9:00 AM, 10:00 AM', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2231343846"] = "Please provide a start time for the meeting or the seminar. When the meeting is a multi-day event, specify the start time for each day, e.g. '9:00 AM, 10:00 AM', etc." + +-- Please provide some content for the agenda. What are the main points of the meeting or the seminar? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2263830489"] = "Please provide some content for the agenda. What are the main points of the meeting or the seminar?" + +-- Name the meeting, seminar, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2295548803"] = "Name the meeting, seminar, etc." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T237828418"] = "Target language" + +-- 9:00 AM +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2380198832"] = "9:00 AM" + +-- Agenda Planner +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2435638853"] = "Agenda Planner" + +-- When will the meeting, seminar, etc. start? E.g., '9:00 AM', or '9:00 AM (CET)', etc. When the meeting is a multi-day event, specify the start time for each day. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2446959989"] = "When will the meeting, seminar, etc. start? E.g., '9:00 AM', or '9:00 AM (CET)', etc. When the meeting is a multi-day event, specify the start time for each day." + +-- Do the participants need to get to know each other first? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2463643444"] = "Do the participants need to get to know each other first?" + +-- How long will the meeting, seminar, etc. last? E.g., '2 hours', or '2 days (first day 8 hours, then 4 hours)', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2545969476"] = "How long will the meeting, seminar, etc. last? E.g., '2 hours', or '2 days (first day 8 hours, then 4 hours)', etc." + +-- No, there should be no social activity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2563466975"] = "No, there should be no social activity" + +-- (Optional) What topics should only be briefly addressed? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2604490939"] = "(Optional) What topics should only be briefly addressed?" + +-- Weekly jour fixe +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2610771512"] = "Weekly jour fixe" + +-- Hamburg, Germany +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2771142216"] = "Hamburg, Germany" + +-- Please select the number of participants. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T279660796"] = "Please select the number of participants." + +-- Moderator +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T283265988"] = "Moderator" + +-- Bullet list the content of the meeting, seminar, etc. roughly. Use dashes (-) to separate the items. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2882624953"] = "Bullet list the content of the meeting, seminar, etc. roughly. Use dashes (-) to separate the items." + +-- No, this is a physical event +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2903581470"] = "No, this is a physical event" + +-- minutes +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2914829806"] = "minutes" + +-- (Optional) List the persons who will present at the meeting, seminar, etc. Use dashes (-) to separate the items. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3037376304"] = "(Optional) List the persons who will present at the meeting, seminar, etc. Use dashes (-) to separate the items." + +-- (Optional) Who is presenting? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3063488920"] = "(Optional) Who is presenting?" + +-- Yes, introduce participants +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3277432669"] = "Yes, introduce participants" + +-- (Optional) What topics should be the focus? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3292480692"] = "(Optional) What topics should be the focus?" + +-- Approx. duration of the coffee or tea breaks +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3310841480"] = "Approx. duration of the coffee or tea breaks" + +-- Please provide a duration for the meeting or the seminar, e.g. '2 hours', or '2 days (8 hours and 4 hours)', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3535835316"] = "Please provide a duration for the meeting or the seminar, e.g. '2 hours', or '2 days (8 hours and 4 hours)', etc." + +-- Duration +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3569830189"] = "Duration" + +-- 2 hours +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3689752318"] = "2 hours" + +-- No, participants do not need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3704775613"] = "No, participants do not need to arrive and depart" + +-- Please provide a name for the meeting or the seminar. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3717566228"] = "Please provide a name for the meeting or the seminar." + +-- No, participants know each other +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3771122854"] = "No, participants know each other" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3848935911"] = "Custom target language" + +-- Yes, there should be a social activity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3973813377"] = "Yes, there should be a social activity" + +-- Yes, there should be a joint dinner +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4001248011"] = "Yes, there should be a joint dinner" + +-- No, there should be no joint dinner +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4150931417"] = "No, there should be no joint dinner" + +-- Where will the meeting, seminar, etc. take place? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4155424204"] = "Where will the meeting, seminar, etc. take place?" + +-- Please select a target language for the agenda. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4163183653"] = "Please select a target language for the agenda." + +-- This agenda planner helps you create a structured agenda for your meeting or seminar. Just provide some basic information about the event, and the assistant will generate an agenda for you. You can also specify the duration, the start time, the location, the target language, and other details. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4178438053"] = "This agenda planner helps you create a structured agenda for your meeting or seminar. Just provide some basic information about the event, and the assistant will generate an agenda for you. You can also specify the duration, the start time, the location, the target language, and other details." + +-- Yes, participants need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4266648123"] = "Yes, participants need to arrive and depart" + +-- Should there be a joint dinner? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T553265703"] = "Should there be a joint dinner?" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T656744944"] = "Please provide a custom language." + +-- Should the participants be involved passively or actively? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T749354834"] = "Should the participants be involved passively or actively?" + +-- Yes, this is a virtual event +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T829874736"] = "Yes, this is a virtual event" + +-- Approx. duration of the lunch break +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T92038124"] = "Approx. duration of the lunch break" + +-- Do participants need to arrive and depart? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T945792620"] = "Do participants need to arrive and depart?" + +-- 13 - 20 (multiple small groups) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1248612832"] = "13 - 20 (multiple small groups)" + +-- 101 - 200 (conference) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1576140451"] = "101 - 200 (conference)" + +-- Please select how many participants are expected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1761209658"] = "Please select how many participants are expected" + +-- 31 - 100 (symposium) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1884554098"] = "31 - 100 (symposium)" + +-- 21 - 30 (multiple large groups) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T2544279674"] = "21 - 30 (multiple large groups)" + +-- 6 - 12 (large group) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T3462231762"] = "6 - 12 (large group)" + +-- 201 - 1,000 (congress) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T3871655179"] = "201 - 1,000 (congress)" + +-- 2 (peer to peer) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T4200229473"] = "2 (peer to peer)" + +-- 3 - 5 (small group) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T568372961"] = "3 - 5 (small group)" + +-- 1,000+ (large event) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T812476179"] = "1,000+ (large event)" + +-- Stop generation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T1317408357"] = "Stop generation" + +-- Reset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T180921696"] = "Reset" + +-- Please select a provider. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T1809312323"] = "Please select a provider." + +-- Assistant - {0} +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T3043922"] = "Assistant - {0}" + +-- Send to ... +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T4242312602"] = "Send to ..." + +-- Copy result +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T83711157"] = "Copy result" + +-- Extended bias poster +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T1241605514"] = "Extended bias poster" + +-- Please select a target language for the bias. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T1380819730"] = "Please select a target language for the bias." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T237828418"] = "Target language" + +-- Blog post of Buster Benson: +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T2524573984"] = "Blog post of Buster Benson:" + +-- Wikipedia list of cognitive biases +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3097054642"] = "Wikipedia list of cognitive biases" + +-- Show me the bias of the day +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3489946962"] = "Show me the bias of the day" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3848935911"] = "Custom target language" + +-- Learn about a different cognitive bias every day. You can also ask the LLM your questions. The idea behind "Bias of the Day" is based on work by Buster Benson, John Manoogian III, and Brian Rene Morrissette. Buster Benson grouped the biases, and the original texts come from Wikipedia. Brian Rene Morrissette condensed them into a shorter version. Finally, John Manoogian III created the original poster based on Benson's work and Morrissette's texts. Thorsten Sommer compared all texts for integration into AI Studio with the current Wikipedia versions, updated them, and added source references. The idea of learning about one bias each day based on John's poster comes from Drew Nelson. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3882885376"] = "Learn about a different cognitive bias every day. You can also ask the LLM your questions. The idea behind \"Bias of the Day\" is based on work by Buster Benson, John Manoogian III, and Brian Rene Morrissette. Buster Benson grouped the biases, and the original texts come from Wikipedia. Brian Rene Morrissette condensed them into a shorter version. Finally, John Manoogian III created the original poster based on Benson's work and Morrissette's texts. Thorsten Sommer compared all texts for integration into AI Studio with the current Wikipedia versions, updated them, and added source references. The idea of learning about one bias each day based on John's poster comes from Drew Nelson." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T656744944"] = "Please provide a custom language." + +-- Bias of the Day +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T782102948"] = "Bias of the Day" + +-- Coding Assistant +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T1082499335"] = "Coding Assistant" + +-- Yes, provide compiler messages +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T1267219550"] = "Yes, provide compiler messages" + +-- Compiler messages +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T2339992872"] = "Compiler messages" + +-- Do you want to provide compiler messages? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T2479378307"] = "Do you want to provide compiler messages?" + +-- Get Support +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T2694436440"] = "Get Support" + +-- Context {0} +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T3205224990"] = "Context {0}" + +-- Delete context +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T3491455017"] = "Delete context" + +-- Your question(s) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T3576319998"] = "Your question(s)" + +-- Please provide your questions. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T4120171174"] = "Please provide your questions." + +-- No, there are no compiler messages +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T412437274"] = "No, there are no compiler messages" + +-- Please provide the compiler messages. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T4225294332"] = "Please provide the compiler messages." + +-- This coding assistant supports you in writing code. Provide some coding context by copying and pasting your code into the input fields. You might assign an ID to your code snippet to easily reference it later. When you have compiler messages, you can paste them into the input fields to get help with debugging as well. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T566604388"] = "This coding assistant supports you in writing code. Provide some coding context by copying and pasting your code into the input fields. You might assign an ID to your code snippet to easily reference it later. When you have compiler messages, you can paste them into the input fields to get help with debugging as well." + +-- Add context +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T882607103"] = "Add context" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T2591284123"] = "Language" + +-- Your code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3144719651"] = "Your code" + +-- {0}: Please provide your input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3160504659"] = "{0}: Please provide your input." + +-- (Optional) Identifier +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3208138853"] = "(Optional) Identifier" + +-- Other language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3374524465"] = "Other language" + +-- Please specify the language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3406207295"] = "Please specify the language." + +-- Other +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::COMMONCODINGLANGUAGEEXTENSIONS::T1849229205"] = "Other" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::COMMONCODINGLANGUAGEEXTENSIONS::T3424652889"] = "Unknown" + +-- None +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::COMMONCODINGLANGUAGEEXTENSIONS::T810547195"] = "None" + +-- Provide a list of bullet points and some basic information for an e-mail. The assistant will generate an e-mail based on that input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T1143222914"] = "Provide a list of bullet points and some basic information for an e-mail. The assistant will generate an e-mail based on that input." + +-- Your name for the closing salutation of your e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T134060413"] = "Your name for the closing salutation of your e-mail." + +-- Please start each line of your content list with a dash (-) to create a bullet point list. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T1384718254"] = "Please start each line of your content list with a dash (-) to create a bullet point list." + +-- Create email +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T1686330485"] = "Create email" + +-- Previous conversation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2074063439"] = "Previous conversation" + +-- Select the writing style +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2241531659"] = "Select the writing style" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T237828418"] = "Target language" + +-- Please provide some content for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2381517938"] = "Please provide some content for the e-mail." + +-- Please provide some history for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2471325767"] = "Please provide some history for the e-mail." + +-- Your bullet points +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2582330385"] = "Your bullet points" + +-- Yes, I provide the previous conversation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2652980489"] = "Yes, I provide the previous conversation" + +-- Please select a writing style for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2969942806"] = "Please select a writing style for the e-mail." + +-- E-Mail +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3026443472"] = "E-Mail" + +-- (Optional) The greeting phrase to use +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T306513209"] = "(Optional) The greeting phrase to use" + +-- Bullet list the content of the e-mail roughly. Use dashes (-) to separate the items. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3259604530"] = "Bullet list the content of the e-mail roughly. Use dashes (-) to separate the items." + +-- Is there a history, a previous conversation? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3438127996"] = "Is there a history, a previous conversation?" + +-- Provide the previous conversation, e.g., the last e-mail, the last chat, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3706154604"] = "Provide the previous conversation, e.g., the last e-mail, the last chat, etc." + +-- No, I don't provide a previous conversation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3823693145"] = "No, I don't provide a previous conversation" + +-- (Optional) Are any of your points particularly important? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3843104162"] = "(Optional) Are any of your points particularly important?" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3848935911"] = "Custom target language" + +-- (Optional) Your name for the closing salutation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T453962275"] = "(Optional) Your name for the closing salutation" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T656744944"] = "Please provide a custom language." + +-- Dear Colleagues +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T759263763"] = "Dear Colleagues" + +-- Please select a target language for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T891073054"] = "Please select a target language for the e-mail." + +-- Personal +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T1851428013"] = "Personal" + +-- Academic +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T2055733914"] = "Academic" + +-- Business informal +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T4031465193"] = "Business informal" + +-- Business formal +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T477550214"] = "Business formal" + +-- Not specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T641241064"] = "Not specified" + +-- Self-hosted LLM providers are allowed: users cannot choose any cloud-based provider +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T1196461290"] = "Self-hosted LLM providers are allowed: users cannot choose any cloud-based provider" + +-- Please select what kind of LLM provider are allowed for this data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T1641796568"] = "Please select what kind of LLM provider are allowed for this data source" + +-- Any LLM provider is allowed: users might choose a cloud-based or a self-hosted provider +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T3264558650"] = "Any LLM provider is allowed: users might choose a cloud-based or a self-hosted provider" + +-- Unknown option was selected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T4096790096"] = "Unknown option was selected" + +-- Please describe at least one retrieval process. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1035068989"] = "Please describe at least one retrieval process." + +-- Please select which types of LLMs users are allowed to use with the data from this ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1047631678"] = "Please select which types of LLMs users are allowed to use with the data from this ERI server." + +-- No, I will enter everything again or configure it manually in the settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1051078592"] = "No, I will enter everything again or configure it manually in the settings" + +-- ERI server name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1104420863"] = "ERI server name" + +-- The embedding '{0}' is used in one or more retrieval processes. Are you sure you want to delete it? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1125425983"] = "The embedding '{0}' is used in one or more retrieval processes. Are you sure you want to delete it?" + +-- The port of the data source must be between 1 and 65535. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1201129536"] = "The port of the data source must be between 1 and 65535." + +-- AI Studio can save the generated code to the file system. You can select a base folder for this. AI Studio ensures that no files are created outside of this base folder. Furthermore, we recommend that you create a Git repository in this folder. This way, you can see what changes the AI has made in which files. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T121294173"] = "AI Studio can save the generated code to the file system. You can select a base folder for this. AI Studio ensures that no files are created outside of this base folder. Furthermore, we recommend that you create a Git repository in this folder. This way, you can see what changes the AI has made in which files." + +-- Here you have the option to save different configurations for various ERI servers and switch between them. This is useful if you are responsible for multiple ERI servers. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1244355152"] = "Here you have the option to save different configurations for various ERI servers and switch between them. This is useful if you are responsible for multiple ERI servers." + +-- Please provide a name for your ERI server. This name will be used to identify the server in AI Studio. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1261836894"] = "Please provide a name for your ERI server. This name will be used to identify the server in AI Studio." + +-- You have not yet added any ERI server presets. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1267931972"] = "You have not yet added any ERI server presets." + +-- Warning: Ports below 1024 are reserved for system services. Your ERI server need to run with elevated permissions (root user). +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1287629674"] = "Warning: Ports below 1024 are reserved for system services. Your ERI server need to run with elevated permissions (root user)." + +-- The task of writing the ERI server for you is very complex. Therefore, a very powerful LLM is needed to successfully accomplish this task. Small local models will probably not be sufficient. Instead, try using a large cloud-based or a large self-hosted model. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1302705248"] = "The task of writing the ERI server for you is very complex. Therefore, a very powerful LLM is needed to successfully accomplish this task. Small local models will probably not be sufficient. Instead, try using a large cloud-based or a large self-hosted model." + +-- Please give your ERI server a name that provides information about the data source and/or its intended purpose. The name will be displayed to users in AI Studio. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1312468048"] = "Please give your ERI server a name that provides information about the data source and/or its intended purpose. The name will be displayed to users in AI Studio." + +-- Please describe how the selected authentication methods should be used. Especially, explain for what data the NONE method (public access) is used. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1365243213"] = "Please describe how the selected authentication methods should be used. Especially, explain for what data the NONE method (public access) is used." + +-- No embedding methods configured yet. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1391635161"] = "No embedding methods configured yet." + +-- Edit Retrieval Process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1423501360"] = "Edit Retrieval Process" + +-- Please select the operating system on which the ERI server will run. This is necessary when using SSO with Kerberos. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1456749976"] = "Please select the operating system on which the ERI server will run. This is necessary when using SSO with Kerberos." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1469573738"] = "Delete" + +-- Related links: +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1565111217"] = "Related links:" + +-- Please select an ERI specification version for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1612890554"] = "Please select an ERI specification version for the ERI server." + +-- Write code to file system +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1717303021"] = "Write code to file system" + +-- Hint: to allow this assistant to automatically save your changes, you must enable the preselection of values in the settings. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1729922656"] = "Hint: to allow this assistant to automatically save your changes, you must enable the preselection of values in the settings." + +-- You have selected {0} authentication methods +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1755088321"] = "You have selected {0} authentication methods" + +-- Select the target directory for the ERI server +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T175742733"] = "Select the target directory for the ERI server" + +-- Data source: port +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T179799739"] = "Data source: port" + +-- Delete Retrieval Process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T180938091"] = "Delete Retrieval Process" + +-- Provider selection for generation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1840198821"] = "Provider selection for generation" + +-- Should we automatically save any input made? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1980659256"] = "Should we automatically save any input made?" + +-- Auto save +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1997164591"] = "Auto save" + +-- An ERI server preset with this name already exists. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2031461801"] = "An ERI server preset with this name already exists. Please choose a different name." + +-- Data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2034620186"] = "Data source" + +-- Interactive documentation aka Swagger UI +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2064957876"] = "Interactive documentation aka Swagger UI" + +-- When you rebuild / re-generate the ERI server code, AI Studio proceeds as follows: All files generated last time will be deleted. All other files you have created remain. Then, the AI generates the new files. But beware: It may happen that the AI generates a file this time that you manually created last time. In this case, your manually created file will then be overwritten. Therefore, you should always create a Git repository and commit or revert all changes before using this assistant. With a diff visualization, you can immediately see where the AI has made changes. It is best to use an IDE suitable for your selected language for this purpose. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2155983785"] = "When you rebuild / re-generate the ERI server code, AI Studio proceeds as follows: All files generated last time will be deleted. All other files you have created remain. Then, the AI generates the new files. But beware: It may happen that the AI generates a file this time that you manually created last time. In this case, your manually created file will then be overwritten. Therefore, you should always create a Git repository and commit or revert all changes before using this assistant. With a diff visualization, you can immediately see where the AI has made changes. It is best to use an IDE suitable for your selected language for this purpose." + +-- Add Embedding Method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2176833082"] = "Add Embedding Method" + +-- For your ERI server, you need to retrieve data that matches a chat or prompt in some way. We call this the retrieval process. You must describe at least one such process. You may offer several retrieval processes from which users can choose. This allows you to test with beta users which process works better. Or you might generally want to give users the choice so they can select the process that best suits their circumstances. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T218617347"] = "For your ERI server, you need to retrieve data that matches a chat or prompt in some way. We call this the retrieval process. You must describe at least one such process. You may offer several retrieval processes from which users can choose. This allows you to test with beta users which process works better. Or you might generally want to give users the choice so they can select the process that best suits their circumstances." + +-- You can specify more than one embedding method. This can be useful when you want to use different embeddings for different queries or data types. For example, one embedding for texts, another for images, and a third for videos, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2202387805"] = "You can specify more than one embedding method. This can be useful when you want to use different embeddings for different queries or data types. For example, one embedding for texts, another for images, and a third for videos, etc." + +-- Operating system on which your ERI will run +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2205711729"] = "Operating system on which your ERI will run" + +-- You can integrate additional libraries. Perhaps you want to evaluate the prompts in advance using a machine learning method or analyze them with a text mining approach? Or maybe you want to preprocess images in the prompts? For such advanced scenarios, you can specify which libraries you want to use here. It's best to describe which library you want to integrate for which purpose. This way, the LLM that writes the ERI server for you can try to use these libraries effectively. This should result in less rework being necessary. If you don't know the necessary libraries, you can instead attempt to describe the intended use. The LLM can then attempt to choose suitable libraries. However, hallucinations can occur, and fictional libraries might be selected. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2241311898"] = "You can integrate additional libraries. Perhaps you want to evaluate the prompts in advance using a machine learning method or analyze them with a text mining approach? Or maybe you want to preprocess images in the prompts? For such advanced scenarios, you can specify which libraries you want to use here. It's best to describe which library you want to integrate for which purpose. This way, the LLM that writes the ERI server for you can try to use these libraries effectively. This should result in less rework being necessary. If you don't know the necessary libraries, you can instead attempt to describe the intended use. The LLM can then attempt to choose suitable libraries. However, hallucinations can occur, and fictional libraries might be selected." + +-- The ERI specification could not be loaded. Please try again later. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2265640084"] = "The ERI specification could not be loaded. Please try again later." + +-- You can imagine it like this: Hypothetically, when Wikipedia implemented the ERI, it would vectorize all pages using an embedding method. All of Wikipedia’s data would remain with Wikipedia, including the vector database (decentralized approach). Then, any AI Studio user could add Wikipedia as a data source to significantly reduce the hallucination of the LLM in knowledge questions. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2299793803"] = "You can imagine it like this: Hypothetically, when Wikipedia implemented the ERI, it would vectorize all pages using an embedding method. All of Wikipedia’s data would remain with Wikipedia, including the vector database (decentralized approach). Then, any AI Studio user could add Wikipedia as a data source to significantly reduce the hallucination of the LLM in knowledge questions." + +-- Are you sure you want to delete the ERI server preset '{0}'? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2417944396"] = "Are you sure you want to delete the ERI server preset '{0}'?" + +-- Data source settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2440619931"] = "Data source settings" + +-- Yes, please write or update all generated code to the file system +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T252707279"] = "Yes, please write or update all generated code to the file system" + +-- Describe how you planned the authentication process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2531113337"] = "Describe how you planned the authentication process" + +-- Please specify the custom programming language for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T257210674"] = "Please specify the custom programming language for the ERI server." + +-- Edit Embedding Method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T260789321"] = "Edit Embedding Method" + +-- Base directory where to write the code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2610795494"] = "Base directory where to write the code" + +-- Delete ERI server preset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2627399122"] = "Delete ERI server preset" + +-- Name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T266367750"] = "Name" + +-- Create the ERI server +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2903289059"] = "Create the ERI server" + +-- Data retrieval settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T295114338"] = "Data retrieval settings" + +-- Please provide a base directory for the ERI server to write files to. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2989655350"] = "Please provide a base directory for the ERI server to write files to." + +-- You have selected 1 authentication method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2997584553"] = "You have selected 1 authentication method" + +-- ERI server presets +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3021250792"] = "ERI server presets" + +-- Authentication method(s) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3044928058"] = "Authentication method(s)" + +-- (Optional) Describe how you planned the authentication process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3052867096"] = "(Optional) Describe how you planned the authentication process" + +-- Do you want to include additional libraries? Then name them and briefly describe what you want to achieve with them. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3088814795"] = "Do you want to include additional libraries? Then name them and briefly describe what you want to achieve with them." + +-- Add ERI server preset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3090449320"] = "Add ERI server preset" + +-- Please specify the product name of the data source, e.g., 'MongoDB', 'Redis', 'PostgreSQL', 'Neo4j', or 'MinIO', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3105554044"] = "Please specify the product name of the data source, e.g., 'MongoDB', 'Redis', 'PostgreSQL', 'Neo4j', or 'MinIO', etc." + +-- Embedding settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T315946275"] = "Embedding settings" + +-- Please select at least one authentication method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3178184134"] = "Please select at least one authentication method" + +-- The ERI specification will change over time. You probably want to keep your ERI server up to date. This means you might want to regenerate the code for your ERI server. To avoid having to make all inputs each time, all your inputs and decisions can be automatically saved. Would you like this? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3203532492"] = "The ERI specification will change over time. You probably want to keep your ERI server up to date. This means you might want to regenerate the code for your ERI server. To avoid having to make all inputs each time, all your inputs and decisions can be automatically saved. Would you like this?" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3267849393"] = "Edit" + +-- Programming language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3295594136"] = "Programming language" + +-- Data source: product name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3315518334"] = "Data source: product name" + +-- No, just show me the code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3316699247"] = "No, just show me the code" + +-- Other language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3374524465"] = "Other language" + +-- ERI Server {0} +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3443687246"] = "ERI Server {0}" + +-- You will likely use one or more embedding methods to encode the meaning of your data into a typically high-dimensional vector space. In this case, you will use a vector database to store and search these vectors (called embeddings). However, you don't have to use embedding methods. When your retrieval method works without any embedding, you can ignore this section. An example: You store files on a file server, and your retrieval method works exclusively with file names in the file system, so you don't need embeddings. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3446047228"] = "You will likely use one or more embedding methods to encode the meaning of your data into a typically high-dimensional vector space. In this case, you will use a vector database to store and search these vectors (called embeddings). However, you don't have to use embedding methods. When your retrieval method works without any embedding, you can ignore this section. An example: You store files on a file server, and your retrieval method works exclusively with file names in the file system, so you don't need embeddings." + +-- Important: The LLM may need to generate many files. This reaches the request limit of most providers. Typically, only a certain number of requests can be made per minute, and only a maximum number of tokens can be generated per minute. AI Studio automatically considers this. However, generating all the files takes a certain amount of time. Local or self-hosted models may work without these limitations and can generate responses faster. AI Studio dynamically adapts its behavior and always tries to achieve the fastest possible data processing. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3485079498"] = "Important: The LLM may need to generate many files. This reaches the request limit of most providers. Typically, only a certain number of requests can be made per minute, and only a maximum number of tokens can be generated per minute. AI Studio automatically considers this. However, generating all the files takes a certain amount of time. Local or self-hosted models may work without these limitations and can generate responses faster. AI Studio dynamically adapts its behavior and always tries to achieve the fastest possible data processing." + +-- Type +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3512062061"] = "Type" + +-- Please describe how the selected authentication methods should be used. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T356079033"] = "Please describe how the selected authentication methods should be used." + +-- Authentication settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3565127422"] = "Authentication settings" + +-- Add Retrieval Process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3617128581"] = "Add Retrieval Process" + +-- Please provide a brief description of your ERI server. Describe or explain what your ERI server does and what data it uses for this purpose. This description will be shown to users in AI Studio. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3637826231"] = "Please provide a brief description of your ERI server. Describe or explain what your ERI server does and what data it uses for this purpose. This description will be shown to users in AI Studio." + +-- Please provide the port of the data source. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3641304143"] = "Please provide the port of the data source." + +-- Please provide the hostname of the data source. Use 'localhost' if the data source is on the same machine as the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3668870799"] = "Please provide the hostname of the data source. Use 'localhost' if the data source is on the same machine as the ERI server." + +-- Delete Embedding +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3691399003"] = "Delete Embedding" + +-- Yes, please save my inputs +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3709185824"] = "Yes, please save my inputs" + +-- Common ERI server settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T371718034"] = "Common ERI server settings" + +-- Download specification +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3770339156"] = "Download specification" + +-- Are you sure you want to delete the embedding '{0}'? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3792084967"] = "Are you sure you want to delete the embedding '{0}'?" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3865031940"] = "Actions" + +-- ERI specification version +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3897494556"] = "ERI specification version" + +-- Please provide a description for your ERI server. What data will the server retrieve? This description will be used to inform users about the purpose of your ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3973182416"] = "Please provide a description for your ERI server. What data will the server retrieve? This description will be used to inform users about the purpose of your ERI server." + +-- Please select a data source for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4010020894"] = "Please select a data source for the ERI server." + +-- Please select at least one authentication method for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4027569219"] = "Please select at least one authentication method for the ERI server." + +-- Data protection settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4078115997"] = "Data protection settings" + +-- Please describe the data source of your ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4156384463"] = "Please describe the data source of your ERI server." + +-- ERI Server +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4204533420"] = "ERI Server" + +-- The name of your ERI server must be between 6 and 60 characters long. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4215418115"] = "The name of your ERI server must be between 6 and 60 characters long." + +-- Describe your data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4272497758"] = "Describe your data source" + +-- The ERI is the External Retrieval Interface for AI Studio and other tools. The ERI acts as a contract between decentralized data sources and, e.g., AI Studio. The ERI is implemented by the data sources, allowing them to be integrated into AI Studio later. This means that the data sources assume the server role and AI Studio (or any other LLM tool) assumes the client role of the API. This approach serves to realize a Retrieval-Augmented Generation (RAG) process with external data. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T458158948"] = "The ERI is the External Retrieval Interface for AI Studio and other tools. The ERI acts as a contract between decentralized data sources and, e.g., AI Studio. The ERI is implemented by the data sources, allowing them to be integrated into AI Studio later. This means that the data sources assume the server role and AI Studio (or any other LLM tool) assumes the client role of the API. This approach serves to realize a Retrieval-Augmented Generation (RAG) process with external data." + +-- Allowed LLM providers for this data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T476513814"] = "Allowed LLM providers for this data source" + +-- The description of your ERI server must be between 32 and 512 characters long. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T528250165"] = "The description of your ERI server must be between 32 and 512 characters long." + +-- (Optional) Additional libraries +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T605643256"] = "(Optional) Additional libraries" + +-- Delete this server preset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T662220520"] = "Delete this server preset" + +-- No retrieval process configured yet. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T701892387"] = "No retrieval process configured yet." + +-- Hint: to allow this assistant to manage multiple presets, you must enable the preselection of values in the settings. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T726548639"] = "Hint: to allow this assistant to manage multiple presets, you must enable the preselection of values in the settings." + +-- Should we write the generated code to the file system? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T732123150"] = "Should we write the generated code to the file system?" + +-- ERI server description +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T746826190"] = "ERI server description" + +-- Are you sure you want to delete the retrieval process '{0}'? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T748762927"] = "Are you sure you want to delete the retrieval process '{0}'?" + +-- Data source: hostname +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T761552889"] = "Data source: hostname" + +-- Please select a programming language for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T884206922"] = "Please select a programming language for the ERI server." + +-- The hostname of the data source must not exceed 255 characters. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T891356210"] = "The hostname of the data source must not exceed 255 characters." + +-- ERI repository with example implementation in .NET and C# +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T907948048"] = "ERI repository with example implementation in .NET and C#" + +-- Login by token: simple to implement and to operate, useful for few users; unusual for many users +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T1080772923"] = "Login by token: simple to implement and to operate, useful for few users; unusual for many users" + +-- Unknown login method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T1650512217"] = "Unknown login method" + +-- Login by single-sign-on (SSO) using Kerberos: very complex to implement and to operate, useful for many users +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T2755085876"] = "Login by single-sign-on (SSO) using Kerberos: very complex to implement and to operate, useful for many users" + +-- Login by username and password: simple to implement and to operate, useful for few users; easy to use for users +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T2776614042"] = "Login by username and password: simple to implement and to operate, useful for few users; easy to use for users" + +-- No login necessary: useful for public data sources +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T80942322"] = "No login necessary: useful for public data sources" + +-- Custom description +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T1927732460"] = "Custom description" + +-- Object storage, like Amazon S3, MinIO, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T1950971562"] = "Object storage, like Amazon S3, MinIO, etc." + +-- Key-Value store, like Redis, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T206122953"] = "Key-Value store, like Redis, etc." + +-- No data source selected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T2241819332"] = "No data source selected" + +-- Graph database, like Neo4j, ArangoDB, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T2327735815"] = "Graph database, like Neo4j, ArangoDB, etc." + +-- File system (local or network share) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T2883797032"] = "File system (local or network share)" + +-- Document store, like MongoDB, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T3377619148"] = "Document store, like MongoDB, etc." + +-- Relational database, like MySQL, PostgreSQL, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T3394837922"] = "Relational database, like MySQL, PostgreSQL, etc." + +-- Unknown data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T752426884"] = "Unknown data source" + +-- Windows +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T104858250"] = "Windows" + +-- No operating system specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T1453731272"] = "No operating system specified" + +-- Linux +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T2498953917"] = "Linux" + +-- Unknown operating system +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T2961688575"] = "Unknown operating system" + +-- Other +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::PROGRAMMINGLANGUAGESEXTENSIONS::T1849229205"] = "Other" + +-- No programming language selected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::PROGRAMMINGLANGUAGESEXTENSIONS::T2044057328"] = "No programming language selected" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::PROGRAMMINGLANGUAGESEXTENSIONS::T3424652889"] = "Unknown" + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T137304886"] = "Please provide a text as input. You might copy the desired text from a document or a website." + +-- Proofread +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T2325568297"] = "Proofread" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T2591284123"] = "Language" + +-- Your input to check +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T2861221443"] = "Your input to check" + +-- Custom language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T3032662264"] = "Custom language" + +-- Grammar & Spelling Checker +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T3169549433"] = "Grammar & Spelling Checker" + +-- Check the grammar and spelling of a text. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T3184716499"] = "Check the grammar and spelling of a text." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T656744944"] = "Please provide a custom language." + +-- Text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1041509726"] = "Text" + +-- While loading the I18N data, an issue occurred: +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1115416642"] = "While loading the I18N data, an issue occurred:" + +-- Please select a target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1173859091"] = "Please select a target language." + +-- Removed Content ({0} entries) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1214535771"] = "Removed Content ({0} entries)" + +-- Added Content ({0} entries) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1258080997"] = "Added Content ({0} entries)" + +-- Localized Content ({0} entries of {1}) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1492071634"] = "Localized Content ({0} entries of {1})" + +-- Select the language plugin used for comparision. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1523568309"] = "Select the language plugin used for comparision." + +-- Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1893011391"] = "Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T237828418"] = "Target language" + +-- Language plugin used for comparision +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T263317578"] = "Language plugin used for comparision" + +-- Localize AI Studio & generate the Lua code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3055634395"] = "Localize AI Studio & generate the Lua code" + +-- Translate MindWork AI Studio text content into another language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3206202961"] = "Translate MindWork AI Studio text content into another language." + +-- Search +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3326517961"] = "Search" + +-- Key +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3441084684"] = "Key" + +-- Please select a language plugin for comparison. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3505664865"] = "Please select a language plugin for comparison." + +-- Was not able to load the I18N plugin. Please check the plugin code. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3687333329"] = "Was not able to load the I18N plugin. Please check the plugin code." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3848935911"] = "Custom target language" + +-- Copy Lua code to clipboard +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3875738742"] = "Copy Lua code to clipboard" + +-- The data is being loaded, please wait... +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T453060723"] = "The data is being loaded, please wait..." + +-- The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T458999393"] = "The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T656744944"] = "Please provide a custom language." + +-- Please note: neither is a translation needed nor performed for English (USA). Anyway, you might want to generate the related Lua code. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T851515643"] = "Please note: neither is a translation needed nor performed for English (USA). Anyway, you might want to generate the related Lua code." + +-- Localization +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T897888480"] = "Localization" + +-- Your icon source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T1302165948"] = "Your icon source" + +-- Find Icon +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T1975161003"] = "Find Icon" + +-- Finding the right icon for a context, such as for a piece of text, is not easy. The first challenge: You need to extract a concept from your context, such as from a text. Let's take an example where your text contains statements about multiple departments. The sought-after concept could be "departments." The next challenge is that we need to anticipate the bias of the icon designers: under the search term "departments," there may be no relevant icons or only unsuitable ones. Depending on the icon source, it might be more effective to search for "buildings," for instance. LLMs assist you with both steps. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T347756684"] = "Finding the right icon for a context, such as for a piece of text, is not easy. The first challenge: You need to extract a concept from your context, such as from a text. Let's take an example where your text contains statements about multiple departments. The sought-after concept could be \"departments.\" The next challenge is that we need to anticipate the bias of the icon designers: under the search term \"departments,\" there may be no relevant icons or only unsuitable ones. Depending on the icon source, it might be more effective to search for \"buildings,\" for instance. LLMs assist you with both steps." + +-- Icon Finder +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T3693102312"] = "Icon Finder" + +-- Open website +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T4239378936"] = "Open website" + +-- Your context +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T596802185"] = "Your context" + +-- Please provide a context. This will help the AI to find the right icon. You might type just a keyword or copy a sentence from your text, e.g., from a slide where you want to use the icon. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T653229070"] = "Please provide a context. This will help the AI to find the right icon. You might type just a keyword or copy a sentence from your text, e.g., from a slide where you want to use the icon." + +-- (Optional) The company name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1134022609"] = "(Optional) The company name" + +-- (Optional) Provide mandatory information +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1206803170"] = "(Optional) Provide mandatory information" + +-- Please provide the country where the job is posted (legal framework). +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1257297967"] = "Please provide the country where the job is posted (legal framework)." + +-- (Optional) Provide necessary job qualifications +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1288034407"] = "(Optional) Provide necessary job qualifications" + +-- Describe the responsibilities the person should take on in the company. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1289043339"] = "Describe the responsibilities the person should take on in the company." + +-- Please provide a custom target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1330607941"] = "Please provide a custom target language." + +-- Create the job posting +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1348170275"] = "Create the job posting" + +-- This is important to consider the legal framework of the country. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1652348489"] = "This is important to consider the legal framework of the country." + +-- Mandatory information that your company requires for all job postings. This can include the company description, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1860534017"] = "Mandatory information that your company requires for all job postings. This can include the company description, etc." + +-- (Optional) Provide the entry date +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1911333264"] = "(Optional) Provide the entry date" + +-- Describe what the person is supposed to do in the company. This might be just short bullet points. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1965813611"] = "Describe what the person is supposed to do in the company. This might be just short bullet points." + +-- Describe what the person should bring to the table. This might be just short bullet points. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T2223185050"] = "Describe what the person should bring to the table. This might be just short bullet points." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T237828418"] = "Target language" + +-- Please provide a job description. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3056799310"] = "Please provide a job description." + +-- Job description +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3063567486"] = "Job description" + +-- Provide the country, where the company is located +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3414839564"] = "Provide the country, where the company is located" + +-- (Optional) Provide the date until the job posting is valid +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3471426808"] = "(Optional) Provide the date until the job posting is valid" + +-- Provide some key points about the job you want to post. The AI will then formulate a suggestion that you can finalize. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3644893573"] = "Provide some key points about the job you want to post. The AI will then formulate a suggestion that you can finalize." + +-- (Optional) Provide job responsibilities +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3657997222"] = "(Optional) Provide job responsibilities" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3848935911"] = "Custom target language" + +-- Job Posting +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3930052338"] = "Job Posting" + +-- (Optional) Provide the work location +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3972042680"] = "(Optional) Provide the work location" + +-- Please provide a legal document as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1160217683"] = "Please provide a legal document as input. You might copy the desired text from a document or a website." + +-- Legal Check +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1348190638"] = "Legal Check" + +-- Legal document +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1887742531"] = "Legal document" + +-- Your questions +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1947954583"] = "Your questions" + +-- Provide a legal document and ask a question about it. This assistant does not replace legal advice. Consult a lawyer to get professional advice. Remember that LLMs can invent answers and facts. Please do not rely on this answers. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T4016275181"] = "Provide a legal document and ask a question about it. This assistant does not replace legal advice. Consult a lawyer to get professional advice. Remember that LLMs can invent answers and facts. Please do not rely on this answers." + +-- Please provide your questions as input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T4154383818"] = "Please provide your questions as input." + +-- Ask your questions +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T467099852"] = "Ask your questions" + +-- Please provide some text as input. For example, an email. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T1962809521"] = "Please provide some text as input. For example, an email." + +-- Analyze text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T2268303626"] = "Analyze text" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T237828418"] = "Target language" + +-- My Tasks +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3011450657"] = "My Tasks" + +-- You received a cryptic email that was sent to many recipients and you are now wondering if you need to do something? Copy the email into the input field. You also need to select a personal profile. In this profile, you should describe your role in the organization. The AI will then try to give you hints on what your tasks might be. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3646084045"] = "You received a cryptic email that was sent to many recipients and you are now wondering if you need to do something? Copy the email into the input field. You also need to select a personal profile. In this profile, you should describe your role in the organization. The AI will then try to give you hints on what your tasks might be." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3848935911"] = "Custom target language" + +-- Please select one of your profiles. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T465395981"] = "Please select one of your profiles." + +-- Text or email +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T534887559"] = "Text or email" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T656744944"] = "Please provide a custom language." + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T137304886"] = "Please provide a text as input. You might copy the desired text from a document or a website." + +-- Sentence structure +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T1714063121"] = "Sentence structure" + +-- Rewrite & Improve Text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T1994150308"] = "Rewrite & Improve Text" + +-- Improve your text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T2163831433"] = "Improve your text" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T2591284123"] = "Language" + +-- Custom language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T3032662264"] = "Custom language" + +-- Your input to improve +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T3037449423"] = "Your input to improve" + +-- Writing style +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T3754048862"] = "Writing style" + +-- Rewrite and improve your text. Please note, that the capabilities of the different LLM providers will vary. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T480915300"] = "Rewrite and improve your text. Please note, that the capabilities of the different LLM providers will vary." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T656744944"] = "Please provide a custom language." + +-- Passive voice +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::SENTENCESTRUCTUREEXTENSIONS::T132535068"] = "Passive voice" + +-- Active voice +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::SENTENCESTRUCTUREEXTENSIONS::T3548001825"] = "Active voice" + +-- Not Specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::SENTENCESTRUCTUREEXTENSIONS::T4281286216"] = "Not Specified" + +-- Scientific (scientific papers, research reports) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1488581017"] = "Scientific (scientific papers, research reports)" + +-- Technical (manuals, documentation) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1577933546"] = "Technical (manuals, documentation)" + +-- Changelog (release notes, version history) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1755311660"] = "Changelog (release notes, version history)" + +-- Literary (fiction, poetry) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1823468337"] = "Literary (fiction, poetry)" + +-- Journalistic (magazines, newspapers, news) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T302304243"] = "Journalistic (magazines, newspapers, news)" + +-- Everyday (personal texts, social media) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T3607558508"] = "Everyday (personal texts, social media)" + +-- Business (business emails, reports, presentations) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T3674741297"] = "Business (business emails, reports, presentations)" + +-- Legal (legal texts, contracts) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T3749505397"] = "Legal (legal texts, contracts)" + +-- Academic (essays, seminar papers) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T4090727535"] = "Academic (essays, seminar papers)" + +-- Not specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T641241064"] = "Not specified" + +-- Marketing (advertisements, sales texts) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T945714286"] = "Marketing (advertisements, sales texts)" + +-- Your word or phrase +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T1847246020"] = "Your word or phrase" + +-- (Optional) The context for the given word or phrase +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2250963999"] = "(Optional) The context for the given word or phrase" + +-- Synonyms +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2547582747"] = "Synonyms" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2591284123"] = "Language" + +-- Find synonyms for words or phrases. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2733641217"] = "Find synonyms for words or phrases." + +-- Find synonyms +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T3106607224"] = "Find synonyms" + +-- Please provide a word or phrase as input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T3501110371"] = "Please provide a word or phrase as input." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T3848935911"] = "Custom target language" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T656744944"] = "Please provide a custom language." + +-- Your input +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T1249704194"] = "Your input" + +-- Target complexity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T1318882688"] = "Target complexity" + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T137304886"] = "Please provide a text as input. You might copy the desired text from a document or a website." + +-- Text Summarizer +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T1907192403"] = "Text Summarizer" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T237828418"] = "Target language" + +-- Summarize long text into a shorter version while retaining the main points. You might want to change the language of the summary to make it more readable. It is also possible to change the complexity of the summary to make it easy to understand. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T359929871"] = "Summarize long text into a shorter version while retaining the main points. You might want to change the language of the summary to make it more readable. It is also possible to change the complexity of the summary to make it easy to understand." + +-- Please provide your field of expertise. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T3610378685"] = "Please provide your field of expertise." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T3848935911"] = "Custom target language" + +-- Summarize +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T502888730"] = "Summarize" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T656744944"] = "Please provide a custom language." + +-- Your expertise +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T970222193"] = "Your expertise" + +-- No change in complexity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T1001090711"] = "No change in complexity" + +-- Teen language, e.g., for teenagers +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T1177455058"] = "Teen language, e.g., for teenagers" + +-- Scientific language for experts in this field +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T2687197281"] = "Scientific language for experts in this field" + +-- Scientific language for experts from other fields (interdisciplinary) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T2931193867"] = "Scientific language for experts from other fields (interdisciplinary)" + +-- Popular science language, e.g., for people interested in science +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T3161914110"] = "Popular science language, e.g., for people interested in science" + +-- Everyday language, e.g., for adults +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T3382050522"] = "Everyday language, e.g., for adults" + +-- Simple language, e.g., for children +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T530584375"] = "Simple language, e.g., for children" + +-- Please select a target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T1173859091"] = "Please select a target language." + +-- Your input +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T1249704194"] = "Your input" + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T137304886"] = "Please provide a text as input. You might copy the desired text from a document or a website." + +-- Translate +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T2028202101"] = "Translate" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T237828418"] = "Target language" + +-- Translate text from one language to another. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T3230457846"] = "Translate text from one language to another." + +-- No live translation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T3556243327"] = "No live translation" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T3848935911"] = "Custom target language" + +-- Live translation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T4279308324"] = "Live translation" + +-- Translation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T613888204"] = "Translation" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T656744944"] = "Please provide a custom language." + +-- System +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T2402387132"] = "System" + +-- You +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3049115964"] = "You" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3424652889"] = "Unknown" + +-- Assistant +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3662687431"] = "Assistant" + +-- User +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3768991250"] = "User" + +-- AI +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T601166687"] = "AI" + +-- Edit Message +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1183581066"] = "Edit Message" + +-- Copies the content to the clipboard +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T12948066"] = "Copies the content to the clipboard" + +-- Do you really want to remove this message? +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1347427447"] = "Do you really want to remove this message?" + +-- Yes, remove the AI response and edit it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1350385882"] = "Yes, remove the AI response and edit it" + +-- Yes, regenerate it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1603883875"] = "Yes, regenerate it" + +-- Yes, remove it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1820166585"] = "Yes, remove it" + +-- Do you really want to edit this message? In order to edit this message, the AI response will be deleted. +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T2018431076"] = "Do you really want to edit this message? In order to edit this message, the AI response will be deleted." + +-- Removes this block +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T2093355991"] = "Removes this block" + +-- Regenerate Message +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T2308444540"] = "Regenerate Message" + +-- Cannot render content of type {0} yet. +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3175548294"] = "Cannot render content of type {0} yet." + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3267849393"] = "Edit" + +-- Regenerate +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3587744975"] = "Regenerate" + +-- Do you really want to regenerate this message? +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3878878761"] = "Do you really want to regenerate this message?" + +-- Cannot copy this content type to clipboard! +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T4021525742"] = "Cannot copy this content type to clipboard!" + +-- Remove Message +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T4070211974"] = "Remove Message" + +-- No, keep it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T4188329028"] = "No, keep it" + +-- Open Settings +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ASSISTANTBLOCK::T1172211894"] = "Open Settings" + +-- Changelog +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHANGELOG::T3017574265"] = "Changelog" + +-- Move chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1133040906"] = "Move chat" + +-- Are you sure you want to move this chat? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1142475422"] = "Are you sure you want to move this chat? All unsaved changes will be lost." + +-- Stop generation +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1317408357"] = "Stop generation" + +-- Save chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1516264254"] = "Save chat" + +-- Type your input here... +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1849313532"] = "Type your input here..." + +-- Your Prompt (use selected instance '{0}', provider '{1}') +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1967611328"] = "Your Prompt (use selected instance '{0}', provider '{1}')" + +-- Profile usage is disabled according to your chat template settings. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2670286472"] = "Profile usage is disabled according to your chat template settings." + +-- Delete this chat & start a new one. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2991985411"] = "Delete this chat & start a new one." + +-- Move Chat to Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3045856778"] = "Move Chat to Workspace" + +-- The selected provider is not allowed in this chat due to data security reasons. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3403290862"] = "The selected provider is not allowed in this chat due to data security reasons." + +-- Select a provider first +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3654197869"] = "Select a provider first" + +-- Start new chat in workspace '{0}' +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3928697643"] = "Start new chat in workspace '{0}'" + +-- Start temporary chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4113970938"] = "Start temporary chat" + +-- Please select the workspace where you want to move the chat to. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T474393241"] = "Please select the workspace where you want to move the chat to." + +-- Move the chat to a workspace, or to another if it is already in one. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T636393754"] = "Move the chat to a workspace, or to another if it is already in one." + +-- Show your workspaces +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T733672375"] = "Show your workspaces" + +-- Start a new chat with a chat template +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATTEMPLATESELECTION::T1333844707"] = "Start a new chat with a chat template" + +-- Open Chat Template Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATTEMPLATESELECTION::T1335399555"] = "Open Chat Template Options" + +-- Manage your templates +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATTEMPLATESELECTION::T3058934130"] = "Manage your templates" + +-- Region +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T1227782301"] = "Region" + +-- Source {0} +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T1700986546"] = "Source {0}" + +-- Description +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T1725856265"] = "Description" + +-- Confidence Level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T2492230131"] = "Confidence Level" + +-- Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T2730980305"] = "Sources" + +-- Confidence Card +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T2960002005"] = "Confidence Card" + +-- Confidence +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T3243388657"] = "Confidence" + +-- Shows and hides the confidence card with information about the selected LLM provider. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T847071819"] = "Shows and hides the confidence card with information about the selected LLM provider." + +-- Choose the minimum confidence level that all LLM providers must meet. This way, you can ensure that only trustworthy providers are used. You cannot use any provider that falls below this level. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMINCONFIDENCESELECTION::T2526727283"] = "Choose the minimum confidence level that all LLM providers must meet. This way, you can ensure that only trustworthy providers are used. You cannot use any provider that falls below this level." + +-- Select a minimum confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMINCONFIDENCESELECTION::T2579793544"] = "Select a minimum confidence level" + +-- You have selected 1 preview feature. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMULTISELECT::T1384241824"] = "You have selected 1 preview feature." + +-- No preview features selected. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMULTISELECT::T2809641588"] = "No preview features selected." + +-- You have selected {0} preview features. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMULTISELECT::T3513450626"] = "You have selected {0} preview features." + +-- Preselected provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONPROVIDERSELECTION::T1469984996"] = "Preselected provider" + +-- Select a provider that is preselected. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONPROVIDERSELECTION::T20906218"] = "Select a provider that is preselected." + +-- Use app default +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONPROVIDERSELECTION::T3672477670"] = "Use app default" + +-- Yes, let the AI decide which data sources are needed. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1031370894"] = "Yes, let the AI decide which data sources are needed." + +-- Yes, let the AI validate & filter the retrieved data. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1309929755"] = "Yes, let the AI validate & filter the retrieved data." + +-- Data Source Selection +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T15302104"] = "Data Source Selection" + +-- AI-Selected Data Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T168406579"] = "AI-Selected Data Sources" + +-- AI-based data validation +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1744745490"] = "AI-based data validation" + +-- Yes, I want to use data sources. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1975014927"] = "Yes, I want to use data sources." + +-- You haven't configured any data sources. To grant the AI access to your data, you need to add such a source. However, if you wish to use data from your device, you first have to set up a so-called embedding. This embedding is necessary so the AI can effectively search your data, find and retrieve the correct information required for each task. In addition to local data, you can also incorporate your company's data. To do so, your company must provide the data through an ERI (External Retrieval Interface). +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T2113594442"] = "You haven't configured any data sources. To grant the AI access to your data, you need to add such a source. However, if you wish to use data from your device, you first have to set up a so-called embedding. This embedding is necessary so the AI can effectively search your data, find and retrieve the correct information required for each task. In addition to local data, you can also incorporate your company's data. To do so, your company must provide the data through an ERI (External Retrieval Interface)." + +-- Select the data you want to use here. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T21181525"] = "Select the data you want to use here." + +-- Manage your data sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T2149927097"] = "Manage your data sources" + +-- Select data +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T274155039"] = "Select data" + +-- Read more about ERI +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3095532189"] = "Read more about ERI" + +-- AI-based data source selection +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3100256862"] = "AI-based data source selection" + +-- No, I don't want to use data sources. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3135725655"] = "No, I don't want to use data sources." + +-- Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3215374102"] = "Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable." + +-- No, I manually decide which data source to use. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3440789294"] = "No, I manually decide which data source to use." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3448155331"] = "Close" + +-- The AI evaluates each of your inputs to determine whether and which data sources are necessary. Currently, the AI has not selected any source. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3574254516"] = "The AI evaluates each of your inputs to determine whether and which data sources are necessary. Currently, the AI has not selected any source." + +-- No, use all data retrieved from the data sources. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3751463241"] = "No, use all data retrieved from the data sources." + +-- Are data sources enabled? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T396683085"] = "Are data sources enabled?" + +-- Manage Data Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T700666808"] = "Manage Data Sources" + +-- Available Data Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T86053874"] = "Available Data Sources" + +-- Issues +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ISSUES::T3229841001"] = "Issues" + +-- Given that my employer's workplace uses both Windows and Linux, I wanted a cross-platform solution that would work seamlessly across all major operating systems, including macOS. Additionally, I wanted to demonstrate that it is possible to create modern, efficient, cross-platform applications without resorting to Electron bloatware. The combination of .NET and Rust with Tauri proved to be an excellent technology stack for building such robust applications. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1057189794"] = "Given that my employer's workplace uses both Windows and Linux, I wanted a cross-platform solution that would work seamlessly across all major operating systems, including macOS. Additionally, I wanted to demonstrate that it is possible to create modern, efficient, cross-platform applications without resorting to Electron bloatware. The combination of .NET and Rust with Tauri proved to be an excellent technology stack for building such robust applications." + +-- Limitations of Existing Solutions +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1086130692"] = "Limitations of Existing Solutions" + +-- Personal Needs and Limitations of Web Services +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1839655973"] = "Personal Needs and Limitations of Web Services" + +-- While exploring available solutions, I found a desktop application called Anything LLM. Unfortunately, it fell short of meeting my specific requirements and lacked the user interface design I envisioned. For macOS, there were several apps similar to what I had in mind, but they were all commercial solutions shrouded in uncertainty. The developers' identities and the origins of these apps were unclear, raising significant security concerns. Reports from users about stolen API keys and unwanted charges only amplified my reservations. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3552777197"] = "While exploring available solutions, I found a desktop application called Anything LLM. Unfortunately, it fell short of meeting my specific requirements and lacked the user interface design I envisioned. For macOS, there were several apps similar to what I had in mind, but they were all commercial solutions shrouded in uncertainty. The developers' identities and the origins of these apps were unclear, raising significant security concerns. Reports from users about stolen API keys and unwanted charges only amplified my reservations." + +-- Hello, my name is Thorsten Sommer, and I am the initial creator of MindWork AI Studio. The motivation behind developing this app stems from several crucial needs and observations I made over time. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3569462457"] = "Hello, my name is Thorsten Sommer, and I am the initial creator of MindWork AI Studio. The motivation behind developing this app stems from several crucial needs and observations I made over time." + +-- Through MindWork AI Studio, I aim to provide a secure, flexible, and user-friendly tool that caters to a wider audience without compromising on functionality or design. This app is the culmination of my desire to meet personal requirements, address existing gaps in the market, and showcase innovative development practices. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3622193740"] = "Through MindWork AI Studio, I aim to provide a secure, flexible, and user-friendly tool that caters to a wider audience without compromising on functionality or design. This app is the culmination of my desire to meet personal requirements, address existing gaps in the market, and showcase innovative development practices." + +-- Relying on web services like ChatGPT was not a sustainable solution for me. I needed an AI that could also access files directly on my device, a functionality web services inherently lack due to security and privacy constraints. Although I could have scripted something in Python to meet my needs, this approach was too cumbersome for daily use. More importantly, I wanted to develop a solution that anyone could use without needing any programming knowledge. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T372007989"] = "Relying on web services like ChatGPT was not a sustainable solution for me. I needed an AI that could also access files directly on my device, a functionality web services inherently lack due to security and privacy constraints. Although I could have scripted something in Python to meet my needs, this approach was too cumbersome for daily use. More importantly, I wanted to develop a solution that anyone could use without needing any programming knowledge." + +-- Cross-Platform and Modern Development +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T843057510"] = "Cross-Platform and Modern Development" + +-- Alpha phase means that we are working on the last details before the beta phase. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWALPHA::T166807685"] = "Alpha phase means that we are working on the last details before the beta phase." + +-- This feature is currently in the alpha phase. Expect bugs and unfinished work. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWALPHA::T2635524607"] = "This feature is currently in the alpha phase. Expect bugs and unfinished work." + +-- Alpha +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWALPHA::T55079499"] = "Alpha" + +-- This feature is currently in the beta phase. It is still be possible that there are some bugs. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWBETA::T1045026949"] = "This feature is currently in the beta phase. It is still be possible that there are some bugs." + +-- Beta phase means that we are testing the feature. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWBETA::T3605158616"] = "Beta phase means that we are testing the feature." + +-- Beta +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWBETA::T375487463"] = "Beta" + +-- This feature is currently in the experimental phase. Expect bugs, unfinished work, changes in future versions, and more. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWEXPERIMENTAL::T1735169242"] = "This feature is currently in the experimental phase. Expect bugs, unfinished work, changes in future versions, and more." + +-- Experimental phase means that we have a vision for a feature but not a clear plan yet. We are still exploring the possibilities. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWEXPERIMENTAL::T3709099979"] = "Experimental phase means that we have a vision for a feature but not a clear plan yet. We are still exploring the possibilities." + +-- Experimental +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWEXPERIMENTAL::T3729365343"] = "Experimental" + +-- Prototype +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWPROTOTYPE::T1043365177"] = "Prototype" + +-- Prototype phase means that we have a plan but we are still working on it. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWPROTOTYPE::T2995187557"] = "Prototype phase means that we have a plan but we are still working on it." + +-- This feature is currently in the prototype phase. Expect bugs, unfinished work, changes in future versions, and more. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWPROTOTYPE::T4145334644"] = "This feature is currently in the prototype phase. Expect bugs, unfinished work, changes in future versions, and more." + +-- This feature is about to be released. We think it's ready for production. There should be no more bugs. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T2003588956"] = "This feature is about to be released. We think it's ready for production. There should be no more bugs." + +-- Release Candidate +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T3451939995"] = "Release Candidate" + +-- Release candidates are the final step before a feature is proven to be stable. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T696585888"] = "Release candidates are the final step before a feature is proven to be stable." + +-- Select one of your profiles +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILEFORMSELECTION::T2003449133"] = "Select one of your profiles" + +-- Open Profile Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILEFORMSELECTION::T3654011106"] = "Open Profile Options" + +-- Manage your profiles +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILESELECTION::T3609533889"] = "Manage your profiles" + +-- Open Profile Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILESELECTION::T3654011106"] = "Open Profile Options" + +-- You can switch between your profiles here +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILESELECTION::T918741365"] = "You can switch between your profiles here" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROVIDERSELECTION::T900237532"] = "Provider" + +-- Use PDF content as input +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READPDFCONTENT::T2849276709"] = "Use PDF content as input" + +-- Select PDF file +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READPDFCONTENT::T63272795"] = "Select PDF file" + +-- The content is cleaned using an LLM agent: the main content is extracted, advertisements and other irrelevant things are attempted to be removed; relative links are attempted to be converted into absolute links so that they can be used. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T1164201762"] = "The content is cleaned using an LLM agent: the main content is extracted, advertisements and other irrelevant things are attempted to be removed; relative links are attempted to be converted into absolute links so that they can be used." + +-- Fetch +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T1396322691"] = "Fetch" + +-- Please select a provider to use the cleanup agent. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2035652317"] = "Please select a provider to use the cleanup agent." + +-- Please provide a URL to load the content from. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2235427807"] = "Please provide a URL to load the content from." + +-- Loads the content from your URL. Does not work when the content is hidden behind a paywall. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2672192696"] = "Loads the content from your URL. Does not work when the content is hidden behind a paywall." + +-- URL from which to load the content +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2883163022"] = "URL from which to load the content" + +-- Read content from web? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2927391091"] = "Read content from web?" + +-- Cleanup content by using an LLM agent? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2939928117"] = "Cleanup content by using an LLM agent?" + +-- Hide web content options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T3031774728"] = "Hide web content options" + +-- Please provide a valid HTTP or HTTPS URL. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T307442288"] = "Please provide a valid HTTP or HTTPS URL." + +-- No content cleaning +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T3588401674"] = "No content cleaning" + +-- Please provide a valid URL. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T3825586228"] = "Please provide a valid URL." + +-- Show web content options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T4249712357"] = "Show web content options" + +-- Hide content +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SECRETINPUTFIELD::T1273315904"] = "Hide content" + +-- Show content +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SECRETINPUTFIELD::T2891011873"] = "Show content" + +-- Choose Directory +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SELECTDIRECTORY::T4256489763"] = "Choose Directory" + +-- Choose File +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SELECTFILE::T4285779702"] = "Choose File" + +-- When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T1297967572"] = "When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM." + +-- Use Case: this agent is used to clean up text content. It extracts the main content, removes advertisements and other irrelevant things, and attempts to convert relative links into absolute links so that they can be used. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T1299550589"] = "Use Case: this agent is used to clean up text content. It extracts the main content, removes advertisements and other irrelevant things, and attempts to convert relative links into absolute links so that they can be used." + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T354528094"] = "No options are preselected" + +-- Preselect text content cleaner options? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T3659087305"] = "Preselect text content cleaner options?" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T3875604319"] = "Options are preselected" + +-- When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T1297967572"] = "When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM." + +-- Use Case: this agent is used to select the appropriate data sources for the current prompt. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T2208143316"] = "Use Case: this agent is used to select the appropriate data sources for the current prompt." + +-- Agent: Data Source Selection Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T2258031949"] = "Agent: Data Source Selection Options" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T354528094"] = "No options are preselected" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T3875604319"] = "Options are preselected" + +-- Preselect data source selection options? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T991598424"] = "Preselect data source selection options?" + +-- When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T1297967572"] = "When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM." + +-- Use Case: this agent is used to validate any retrieval context of any retrieval process. Perhaps there are many of these retrieval contexts and you want to validate them all. Therefore, you might want to use a cheap and fast LLM for this job. When using a local or self-hosted LLM, look for a small (e.g. 3B) and fast model. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T1326813386"] = "Use Case: this agent is used to validate any retrieval context of any retrieval process. Perhaps there are many of these retrieval contexts and you want to validate them all. Therefore, you might want to use a cheap and fast LLM for this job. When using a local or self-hosted LLM, look for a small (e.g. 3B) and fast model." + +-- The validation agent is enabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2274149855"] = "The validation agent is enabled" + +-- Enable the retrieval context validation agent? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2663872937"] = "Enable the retrieval context validation agent?" + +-- Preselect retrieval context validation options? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2663938643"] = "Preselect retrieval context validation options?" + +-- agents +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2669785679"] = "agents" + +-- When enabled, the retrieval context validation agent will check each retrieval context of any retrieval process, whether a context makes sense for the given prompt. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T298440039"] = "When enabled, the retrieval context validation agent will check each retrieval context of any retrieval process, whether a context makes sense for the given prompt." + +-- How many validation agents should work simultaneously? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T3431541788"] = "How many validation agents should work simultaneously?" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T354528094"] = "No options are preselected" + +-- More active agents also mean that a corresponding number of requests are made simultaneously. Some providers limit the number of requests per minute. When you are unsure, choose a low setting between 1 to 6 agents. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T3819544890"] = "More active agents also mean that a corresponding number of requests are made simultaneously. Some providers limit the number of requests per minute. When you are unsure, choose a low setting between 1 to 6 agents." + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T3875604319"] = "Options are preselected" + +-- Agent: Retrieval Context Validation Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T928989804"] = "Agent: Retrieval Context Validation Options" + +-- No validation is performed +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T95175095"] = "No validation is performed" + +-- Spellchecking is disabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1059411425"] = "Spellchecking is disabled" + +-- Do you want to show preview features in the app? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1118505044"] = "Do you want to show preview features in the app?" + +-- How often should we check for app updates? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1364944735"] = "How often should we check for app updates?" + +-- Select preview features +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1439783084"] = "Select preview features" + +-- Select the desired behavior for the navigation bar. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1555038969"] = "Select the desired behavior for the navigation bar." + +-- Color theme +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1599198973"] = "Color theme" + +-- Would you like to set one of your profiles as the default for the entire app? When you configure a different profile for an assistant, it will always take precedence. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1666052109"] = "Would you like to set one of your profiles as the default for the entire app? When you configure a different profile for an assistant, it will always take precedence." + +-- Select the language behavior for the app. The default is to use the system language. You might want to choose a language manually? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T186780842"] = "Select the language behavior for the app. The default is to use the system language. You might want to choose a language manually?" + +-- Check for updates +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1890416390"] = "Check for updates" + +-- Which preview features would you like to enable? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1898060643"] = "Which preview features would you like to enable?" + +-- Select the language for the app. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1907446663"] = "Select the language for the app." + +-- Language behavior +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2341504363"] = "Language behavior" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591284123"] = "Language" + +-- Save energy? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3100928009"] = "Save energy?" + +-- Spellchecking is enabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3165555978"] = "Spellchecking is enabled" + +-- App Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3577148634"] = "App Options" + +-- When enabled, streamed content from the AI is updated once every third second. When disabled, streamed content will be updated as soon as it is available. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3652888444"] = "When enabled, streamed content from the AI is updated once every third second. When disabled, streamed content will be updated as soon as it is available." + +-- Enable spellchecking? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3914529369"] = "Enable spellchecking?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T4004501229"] = "Preselect one of your profiles?" + +-- When enabled, spellchecking will be active in all input fields. Depending on your operating system, errors may not be visually highlighted, but right-clicking may still offer possible corrections. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T4067492921"] = "When enabled, spellchecking will be active in all input fields. Depending on your operating system, errors may not be visually highlighted, but right-clicking may still offer possible corrections." + +-- Navigation bar behavior +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T602293588"] = "Navigation bar behavior" + +-- Choose the color theme that best suits for you. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T654667432"] = "Choose the color theme that best suits for you." + +-- Energy saving is enabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T71162186"] = "Energy saving is enabled" + +-- Energy saving is disabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T716338721"] = "Energy saving is disabled" + +-- Preview feature visibility +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T817101267"] = "Preview feature visibility" + +-- Would you like to set one provider as the default for the entire app? When you configure a different provider for an assistant, it will always take precedence. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T844514734"] = "Would you like to set one provider as the default for the entire app? When you configure a different provider for an assistant, it will always take precedence." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T1469573738"] = "Delete" + +-- Add Embedding +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T1738753945"] = "Add Embedding" + +-- Are you sure you want to delete the embedding provider '{0}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T1825371968"] = "Are you sure you want to delete the embedding provider '{0}'?" + +-- Add Embedding Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T190634634"] = "Add Embedding Provider" + +-- Model +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T2189814010"] = "Model" + +-- Embeddings are a way to represent words, sentences, entire documents, or even images and videos as digital fingerprints. Just like each person has a unique fingerprint, embedding models create unique digital patterns that capture the meaning and characteristics of the content they analyze. When two things are similar in meaning or content, their digital fingerprints will look very similar. For example, the fingerprints for 'happy' and 'joyful' would be more alike than those for 'happy' and 'sad'. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T2419962612"] = "Embeddings are a way to represent words, sentences, entire documents, or even images and videos as digital fingerprints. Just like each person has a unique fingerprint, embedding models create unique digital patterns that capture the meaning and characteristics of the content they analyze. When two things are similar in meaning or content, their digital fingerprints will look very similar. For example, the fingerprints for 'happy' and 'joyful' would be more alike than those for 'happy' and 'sad'." + +-- Name +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T266367750"] = "Name" + +-- This helps AI Studio understand and compare things in a way that's similar to how humans do. When you're working on something, AI Studio can automatically identify related documents and data by comparing their digital fingerprints. For instance, if you're writing about customer service, AI Studio can instantly find other documents in your data that discuss similar topics or experiences, even if they use different words. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3251217940"] = "This helps AI Studio understand and compare things in a way that's similar to how humans do. When you're working on something, AI Studio can automatically identify related documents and data by comparing their digital fingerprints. For instance, if you're writing about customer service, AI Studio can instantly find other documents in your data that discuss similar topics or experiences, even if they use different words." + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3267849393"] = "Edit" + +-- Configured Embeddings +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3526613453"] = "Configured Embeddings" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3865031940"] = "Actions" + +-- No embeddings configured yet. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T4068015588"] = "No embeddings configured yet." + +-- Edit Embedding Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T4264602229"] = "Edit Embedding Provider" + +-- Delete Embedding Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T511304264"] = "Delete Embedding Provider" + +-- Open Dashboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T78223861"] = "Open Dashboard" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T900237532"] = "Provider" + +-- Configure Embeddings +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T970042679"] = "Configure Embeddings" + +-- Show provider's confidence level? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1052533048"] = "Show provider's confidence level?" + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1469573738"] = "Delete" + +-- When enabled, we show you the confidence level for the selected provider in the app. This helps you assess where you are sending your data at any time. Example: are you currently working with sensitive data? Then choose a particularly trustworthy provider, etc. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1505516304"] = "When enabled, we show you the confidence level for the selected provider in the app. This helps you assess where you are sending your data at any time. Example: are you currently working with sensitive data? Then choose a particularly trustworthy provider, etc." + +-- No, please hide the confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1628475119"] = "No, please hide the confidence level" + +-- Description +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1725856265"] = "Description" + +-- Add Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1806589097"] = "Add Provider" + +-- Edit LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1868766523"] = "Edit LLM Provider" + +-- Are you sure you want to delete the provider '{0}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2031310917"] = "Are you sure you want to delete the provider '{0}'?" + +-- Do you want to always be able to recognize how trustworthy your LLM providers are? This way, you keep control over which provider you send your data to. You have two options for this: Either you choose a common schema, or you configure the trust levels for each LLM provider yourself. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2082904277"] = "Do you want to always be able to recognize how trustworthy your LLM providers are? This way, you keep control over which provider you send your data to. You have two options for this: Either you choose a common schema, or you configure the trust levels for each LLM provider yourself." + +-- Model +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2189814010"] = "Model" + +-- Choose the scheme that best suits you and your life. Do you trust any western provider? Or only providers from the USA or exclusively European providers? Then choose the appropriate scheme. Alternatively, you can assign the confidence levels to each provider yourself. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2283885378"] = "Choose the scheme that best suits you and your life. Do you trust any western provider? Or only providers from the USA or exclusively European providers? Then choose the appropriate scheme. Alternatively, you can assign the confidence levels to each provider yourself." + +-- LLM Provider Confidence +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2349972795"] = "LLM Provider Confidence" + +-- What we call a provider is the combination of an LLM provider such as OpenAI and a model like GPT-4o. You can configure as many providers as you want. This way, you can use the appropriate model for each task. As an LLM provider, you can also choose local providers. However, to use this app, you must configure at least one provider. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2460361126"] = "What we call a provider is the combination of an LLM provider such as OpenAI and a model like GPT-4o. You can configure as many providers as you want. This way, you can use the appropriate model for each task. As an LLM provider, you can also choose local providers. However, to use this app, you must configure at least one provider." + +-- Confidence Level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2492230131"] = "Confidence Level" + +-- When enabled, you can enforce a minimum confidence level for all LLM providers. This way, you can ensure that only trustworthy providers are used. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T281063702"] = "When enabled, you can enforce a minimum confidence level for all LLM providers. This way, you can ensure that only trustworthy providers are used." + +-- Instance Name +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2842060373"] = "Instance Name" + +-- No providers configured yet. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2911731076"] = "No providers configured yet." + +-- Configure Providers +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3027859089"] = "Configure Providers" + +-- as selected by provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3082210376"] = "as selected by provider" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3267849393"] = "Edit" + +-- Couldn't delete the provider '{0}'. The issue: {1}. We can ignore this issue and delete the provider anyway. Do you want to ignore it and delete this provider? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3313715309"] = "Couldn't delete the provider '{0}'. The issue: {1}. We can ignore this issue and delete the provider anyway. Do you want to ignore it and delete this provider?" + +-- Add LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3346433704"] = "Add LLM Provider" + +-- LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3612415205"] = "LLM Provider" + +-- No, do not enforce a minimum confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3642102079"] = "No, do not enforce a minimum confidence level" + +-- Configured Providers +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3850871263"] = "Configured Providers" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3865031940"] = "Actions" + +-- Select a confidence scheme +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T4144206465"] = "Select a confidence scheme" + +-- Do you want to enforce an app-wide minimum confidence level? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T4258968041"] = "Do you want to enforce an app-wide minimum confidence level?" + +-- Delete LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T4269256234"] = "Delete LLM Provider" + +-- Yes, enforce a minimum confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T458854917"] = "Yes, enforce a minimum confidence level" + +-- Not yet configured +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T48051324"] = "Not yet configured" + +-- Open Dashboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T78223861"] = "Open Dashboard" + +-- Yes, show me the confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T853225204"] = "Yes, show me the confidence level" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T900237532"] = "Provider" + +-- Copy {0} to the clipboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::TEXTINFOLINE::T2206391442"] = "Copy {0} to the clipboard" + +-- Copy {0} to the clipboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::TEXTINFOLINES::T2206391442"] = "Copy {0} to the clipboard" + +-- Open the repository or website +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::THIRDPARTYCOMPONENT::T1392042694"] = "Open the repository or website" + +-- License: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::THIRDPARTYCOMPONENT::T1908172666"] = "License:" + +-- You'll interact with the AI systems using your voice. To achieve this, we want to integrate voice input (speech-to-text) and output (text-to-speech). However, later on, it should also have a natural conversation flow, i.e., seamless conversation. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1015366320"] = "You'll interact with the AI systems using your voice. To achieve this, we want to integrate voice input (speech-to-text) and output (text-to-speech). However, later on, it should also have a natural conversation flow, i.e., seamless conversation." + +-- We hope this vision excites you as much as it excites us. Together, let's build a powerful and flexible AI toolkit to support all your creative, professional, and everyday needs with MindWork AI Studio. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1061000046"] = "We hope this vision excites you as much as it excites us. Together, let's build a powerful and flexible AI toolkit to support all your creative, professional, and everyday needs with MindWork AI Studio." + +-- Integration of enterprise data +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1127694951"] = "Integration of enterprise data" + +-- Meet your needs +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T127032776"] = "Meet your needs" + +-- We're integrating a writing mode to help you create extensive works, like comprehensive project proposals, tenders, or your next fantasy novel. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1457213518"] = "We're integrating a writing mode to help you create extensive works, like comprehensive project proposals, tenders, or your next fantasy novel." + +-- Email monitoring +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1520989255"] = "Email monitoring" + +-- You'll be able to integrate your data into AI Studio, like your PDF or Office files, or your Markdown notes. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1648606751"] = "You'll be able to integrate your data into AI Studio, like your PDF or Office files, or your Markdown notes." + +-- It will soon be possible to integrate data from the corporate network using a specified interface (External Retrieval Interface, ERI for short). This will likely require development work by the organization in question. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1926587044"] = "It will soon be possible to integrate data from the corporate network using a specified interface (External Retrieval Interface, ERI for short). This will likely require development work by the organization in question." + +-- Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2144737937"] = "Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer." + +-- You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2289234741"] = "You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats." + +-- Browser usage +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2345974992"] = "Browser usage" + +-- Integrating your data +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2416595938"] = "Integrating your data" + +-- Curious about the vision for MindWork AI Studio and what the future holds? We're here to address just that. Remember, this is a free, open-source project, meaning we can't guarantee when or if this vision will be fully realized. Our aim is to share our vision with you to help you decide whether this app is right for you. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2491403346"] = "Curious about the vision for MindWork AI Studio and what the future holds? We're here to address just that. Remember, this is a free, open-source project, meaning we can't guarantee when or if this vision will be fully realized. Our aim is to share our vision with you to help you decide whether this app is right for you." + +-- Voice control +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2827242540"] = "Voice control" + +-- Specific requirements +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2868740431"] = "Specific requirements" + +-- We'll develop more assistants for everyday tasks. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2899555955"] = "We'll develop more assistants for everyday tasks." + +-- We're working on offering AI Studio features in your browser via a plugin, allowing, e.g., for spell-checking or text rewriting directly in the browser. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T308543246"] = "We're working on offering AI Studio features in your browser via a plugin, allowing, e.g., for spell-checking or text rewriting directly in the browser." + +-- There will be an interface for AI Studio to create content in other apps. You could, for example, create blog posts directly on the target platform or add entries to an internal knowledge management tool. This requires development work by the tool developers. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T3290746961"] = "There will be an interface for AI Studio to create content in other apps. You could, for example, create blog posts directly on the target platform or add entries to an internal knowledge management tool. This requires development work by the tool developers." + +-- Want an assistant that suits your specific needs? We aim to offer a plugin architecture so organizations and enthusiasts can implement such ideas. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T3440464089"] = "Want an assistant that suits your specific needs? We aim to offer a plugin architecture so organizations and enthusiasts can implement such ideas." + +-- Writing mode +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T3640675146"] = "Writing mode" + +-- So, where are we headed, and how could the app evolve in the coming months and years? The following list outlines our ideas, though not in order of priority: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T4106960135"] = "So, where are we headed, and how could the app evolve in the coming months and years? The following list outlines our ideas, though not in order of priority:" + +-- Content creation +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T428040679"] = "Content creation" + +-- Useful assistants +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T586430036"] = "Useful assistants" + +-- Are you sure you want to delete the chat '{0}' in the workspace '{1}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1016188706"] = "Are you sure you want to delete the chat '{0}' in the workspace '{1}'?" + +-- Move chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1133040906"] = "Move chat" + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1469573738"] = "Delete" + +-- Rename Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1474303418"] = "Rename Workspace" + +-- Rename Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T156144855"] = "Rename Chat" + +-- Add workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1586005241"] = "Add workspace" + +-- Add chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1874060138"] = "Add chat" + +-- Create Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1939006681"] = "Create Chat" + +-- Please name your workspace: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T201482774"] = "Please name your workspace:" + +-- Are you sure you want to load another chat? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2133593288"] = "Are you sure you want to load another chat? All unsaved changes will be lost." + +-- Are you sure you want to delete the workspace '{0}'? This will also delete {1} chat(s) in this workspace. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2151341762"] = "Are you sure you want to delete the workspace '{0}'? This will also delete {1} chat(s) in this workspace." + +-- Are you sure you want to create a another chat? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2237618267"] = "Are you sure you want to create a another chat? All unsaved changes will be lost." + +-- Delete Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2244038752"] = "Delete Chat" + +-- Move to workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2509305748"] = "Move to workspace" + +-- Are you sure you want to delete the temporary chat '{0}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3043761007"] = "Are you sure you want to delete the temporary chat '{0}'?" + +-- Move Chat to Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3045856778"] = "Move Chat to Workspace" + +-- Please enter a new or edit the name for your workspace '{0}': +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T323280982"] = "Please enter a new or edit the name for your workspace '{0}':" + +-- Rename +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3355849203"] = "Rename" + +-- Please enter a new or edit the name for your chat '{0}': +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3419791373"] = "Please enter a new or edit the name for your chat '{0}':" + +-- Load Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3555709365"] = "Load Chat" + +-- Add Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3672981145"] = "Add Workspace" + +-- Empty chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T4019509364"] = "Empty chat" + +-- Workspaces +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T4048389951"] = "Workspaces" + +-- Disappearing Chats +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T4201703117"] = "Disappearing Chats" + +-- Please select the workspace where you want to move the chat to. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T474393241"] = "Please select the workspace where you want to move the chat to." + +-- Delete Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T701874671"] = "Delete Workspace" + +-- Only text content is supported in the editing mode yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1352914344"] = "Only text content is supported in the editing mode yet." + +-- Please enter a message for the example conversation. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1362948628"] = "Please enter a message for the example conversation." + +-- The chat template name must be unique; the chosen name is already in use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1396308587"] = "The chat template name must be unique; the chosen name is already in use." + +-- Please enter a name for the chat template. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1548747185"] = "Please enter a name for the chat template." + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1847791252"] = "Update" + +-- The chat template name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T204496403"] = "The chat template name must not exceed 40 characters." + +-- Add messages of an example conversation (user prompt followed by assistant prompt) to demonstrate the desired interaction pattern. These examples help the AI understand your expectations by showing it the correct format, style, and content of responses before it receives actual user inputs. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2292424657"] = "Add messages of an example conversation (user prompt followed by assistant prompt) to demonstrate the desired interaction pattern. These examples help the AI understand your expectations by showing it the correct format, style, and content of responses before it receives actual user inputs." + +-- Role +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2418769465"] = "Role" + +-- Tell the AI your system prompt. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2552381261"] = "Tell the AI your system prompt." + +-- No, prohibit profile use for this template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2579080722"] = "No, prohibit profile use for this template" + +-- Entry +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2629823795"] = "Entry" + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2646845972"] = "Add" + +-- The message +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2719480499"] = "The message" + +-- Chat Template Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T275026390"] = "Chat Template Name" + +-- Commit Changes +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2996302517"] = "Commit Changes" + +-- The name of the chat template is mandatory. Each chat template must have a unique name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3016903701"] = "The name of the chat template is mandatory. Each chat template must have a unique name." + +-- Image content +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3094908719"] = "Image content" + +-- Are you unsure which system prompt to use? You might start with the default system prompt that AI Studio uses for all chats. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3127437308"] = "Are you unsure which system prompt to use? You might start with the default system prompt that AI Studio uses for all chats." + +-- Using some chat templates in tandem with profiles might cause issues. Therefore, you might prohibit the usage of profiles here. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3227981830"] = "Using some chat templates in tandem with profiles might cause issues. Therefore, you might prohibit the usage of profiles here." + +-- Add a message +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3372872324"] = "Add a message" + +-- Unsupported content type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3570316759"] = "Unsupported content type" + +-- What system prompt do you want to use? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3652587353"] = "What system prompt do you want to use?" + +-- Yes, allow profiles when using this template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3675108201"] = "Yes, allow profiles when using this template" + +-- Add a new message below +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3757779731"] = "Add a new message below" + +-- Example Conversation +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T380891852"] = "Example Conversation" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3865031940"] = "Actions" + +-- Messages per page +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3893704289"] = "Messages per page" + +-- Use the default system prompt +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T4051106111"] = "Use the default system prompt" + +-- Create your custom chat template to tailor the LLM's behavior for specific tasks or domains. Define a custom system prompt and provide an example conversation to design an AI experience perfectly suited to your requirements. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T4199560726"] = "Create your custom chat template to tailor the LLM's behavior for specific tasks or domains. Define a custom system prompt and provide an example conversation to design an AI experience perfectly suited to your requirements." + +-- Enter a message +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T446374405"] = "Enter a message" + +-- System Prompt +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T628396066"] = "System Prompt" + +-- Allow the use of profiles together with this chat template? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T823785464"] = "Allow the use of profiles together with this chat template?" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T900713019"] = "Cancel" + +-- No +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CONFIRMDIALOG::T1642511898"] = "No" + +-- Yes +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CONFIRMDIALOG::T3013883440"] = "Yes" + +-- How many matches do you want at most per query? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T1827669611"] = "How many matches do you want at most per query?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T1847791252"] = "Update" + +-- Failed to connect to the ERI v1 server. The message was: {0} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2150703468"] = "Failed to connect to the ERI v1 server. The message was: {0}" + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2646845972"] = "Add" + +-- Failed to store the auth. secret in the operating system. The message was: {0}. Please try again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2772567701"] = "Failed to store the auth. secret in the operating system. The message was: {0}. Please try again." + +-- Connection successful. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T279774933"] = "Connection successful." + +-- Access Token +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2891154022"] = "Access Token" + +-- Secret +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2895110961"] = "Secret" + +-- Select one retrieval process +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2916077548"] = "Select one retrieval process" + +-- Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T299279954"] = "Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption." + +-- ERI v1 Server Hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T3494933602"] = "ERI v1 Server Hostname" + +-- Port +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T3804576966"] = "Port" + +-- Connection failed. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T3820825672"] = "Connection failed." + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T4081226330"] = "Your security policy" + +-- Not tested yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T417002657"] = "Not tested yet." + +-- Failed to connect to the ERI v1 server. The server is not supported. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T449168182"] = "Failed to connect to the ERI v1 server. The server is not supported." + +-- Username +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T470340825"] = "Username" + +-- Password +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T750979128"] = "Password" + +-- Data Source Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T813773421"] = "Data Source Name" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T900713019"] = "Cancel" + +-- Test connection & read available metadata +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T988671749"] = "Test connection & read available metadata" + +-- the ERI server port +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T103013936"] = "the ERI server port" + +-- Unnamed retrieval process +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1038776502"] = "Unnamed retrieval process" + +-- the retrieval parameters +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1497074068"] = "the retrieval parameters" + +-- [{0}] Unnamed retrieval process +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1501892586"] = "[{0}] Unnamed retrieval process" + +-- the embedding type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T16293243"] = "the embedding type" + +-- the embedding description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1657824119"] = "the embedding description" + +-- Data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T171124909"] = "Data source name" + +-- Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1725856265"] = "Description" + +-- the retrieval description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1752127658"] = "the retrieval description" + +-- Security requirements of the data provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1891090932"] = "Security requirements of the data provider" + +-- Parameter: +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1917353274"] = "Parameter:" + +-- the server description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1966565081"] = "the server description" + +-- Failed to connect to the ERI v1 server. The message was: {0} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2150703468"] = "Failed to connect to the ERI v1 server. The message was: {0}" + +-- ERI server hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T215899701"] = "ERI server hostname" + +-- the maximum number of matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2479753122"] = "the maximum number of matches per query" + +-- Server description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2562330120"] = "Server description" + +-- the data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2717738728"] = "the data source name" + +-- the ERI server hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2753279450"] = "the ERI server hostname" + +-- This retrieval process has no parameters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2863339893"] = "This retrieval process has no parameters." + +-- your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2879113658"] = "your security policy" + +-- Maximum matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2889706179"] = "Maximum matches per query" + +-- Open web link, show more information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2968752071"] = "Open web link, show more information" + +-- the username +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2991677780"] = "the username" + +-- Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T299279954"] = "Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption." + +-- The data source does not provide any retrieval information. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T306340560"] = "The data source does not provide any retrieval information." + +-- Common data source information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3206517471"] = "Common data source information" + +-- when is the embedding used +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3259327370"] = "when is the embedding used" + +-- The data source does not provide any embedding information. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3425007227"] = "The data source does not provide any embedding information." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3448155331"] = "Close" + +-- ERI server port +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3843835535"] = "ERI server port" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T4081226330"] = "Your security policy" + +-- Reload +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T440640172"] = "Reload" + +-- Failed to connect to the ERI v1 server. The server is not supported. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T449168182"] = "Failed to connect to the ERI v1 server. The server is not supported." + +-- Username +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T470340825"] = "Username" + +-- the security requirements of the data provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T503852885"] = "the security requirements of the data provider" + +-- When to use +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T629595477"] = "When to use" + +-- Retrieval information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T742006305"] = "Retrieval information" + +-- Embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T951463987"] = "Embeddings" + +-- Select a root directory for this data source. All data in this directory and all its subdirectories will be processed for this data source. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1265737624"] = "Select a root directory for this data source. All data in this directory and all its subdirectories will be processed for this data source." + +-- Selected base directory for this data source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1312296210"] = "Selected base directory for this data source" + +-- How many matches do you want at most per query? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1827669611"] = "How many matches do you want at most per query?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1847791252"] = "Update" + +-- Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1922618794"] = "Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this." + +-- In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1948697886"] = "In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method." + +-- Please note: the embedding you selected runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2403121734"] = "Please note: the embedding you selected runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud. Please confirm that you have read and understood this." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2646845972"] = "Add" + +-- The embedding you selected runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2814869210"] = "The embedding you selected runs locally or in your organization. Your data is not sent to the cloud." + +-- Embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2838542994"] = "Embedding" + +-- Yes, please send my data to the cloud +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T3572613009"] = "Yes, please send my data to the cloud" + +-- I confirm that I have read and understood the above +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T3683380716"] = "I confirm that I have read and understood the above" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T4081226330"] = "Your security policy" + +-- No, I will chose another embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T4253147533"] = "No, I will chose another embedding" + +-- Select the base directory +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T562479068"] = "Select the base directory" + +-- Data Source Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T813773421"] = "Data Source Name" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T900713019"] = "Cancel" + +-- the total directory size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1082241458"] = "the total directory size" + +-- Total directory size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1101400963"] = "Total directory size" + +-- Data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T171124909"] = "Data source name" + +-- the number of files in the directory +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1795263412"] = "the number of files in the directory" + +-- The embedding runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1950544032"] = "The embedding runs locally or in your organization. Your data is not sent to the cloud." + +-- the files list +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2072700997"] = "the files list" + +-- the maximum number of matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2479753122"] = "the maximum number of matches per query" + +-- the data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2717738728"] = "the data source name" + +-- The directory chosen for the data source does not exist anymore. Please edit the data source and correct the path. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2875614207"] = "The directory chosen for the data source does not exist anymore. Please edit the data source and correct the path." + +-- your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2879113658"] = "your security policy" + +-- Maximum matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2889706179"] = "Maximum matches per query" + +-- the embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2937209992"] = "the embedding name" + +-- this path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2944855252"] = "this path" + +-- Embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3153201045"] = "Embedding name" + +-- Files list +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3238813368"] = "Files list" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3448155331"] = "Close" + +-- For performance reasons, only the first 100 files are shown. The directory contains {0} files in total. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T360238400"] = "For performance reasons, only the first 100 files are shown. The directory contains {0} files in total." + +-- Path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3949388886"] = "Path" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T4081226330"] = "Your security policy" + +-- Number of files +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T417749210"] = "Number of files" + +-- The embedding runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T443873444"] = "The embedding runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud." + +-- The directory chosen for the data source exists. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T445858624"] = "The directory chosen for the data source exists." + +-- Select a file for this data source. The content of this file will be processed for the data source. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1190880267"] = "Select a file for this data source. The content of this file will be processed for the data source." + +-- How many matches do you want at most per query? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1827669611"] = "How many matches do you want at most per query?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1847791252"] = "Update" + +-- Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1922618794"] = "Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this." + +-- In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1948697886"] = "In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method." + +-- Please note: the embedding you selected runs in the cloud. All your data within the file '{0}' will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2090178026"] = "Please note: the embedding you selected runs in the cloud. All your data within the file '{0}' will be sent to the cloud. Please confirm that you have read and understood this." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2646845972"] = "Add" + +-- The embedding you selected runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2814869210"] = "The embedding you selected runs locally or in your organization. Your data is not sent to the cloud." + +-- Embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2838542994"] = "Embedding" + +-- Yes, please send my data to the cloud +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T3572613009"] = "Yes, please send my data to the cloud" + +-- I confirm that I have read and understood the above +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T3683380716"] = "I confirm that I have read and understood the above" + +-- Select the file +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T3740148848"] = "Select the file" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T4081226330"] = "Your security policy" + +-- No, I will chose another embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T4253147533"] = "No, I will chose another embedding" + +-- Data Source Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T813773421"] = "Data Source Name" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T900713019"] = "Cancel" + +-- Selected file path for this data source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T939749563"] = "Selected file path for this data source" + +-- The file chosen for the data source exists. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T1294177559"] = "The file chosen for the data source exists." + +-- Data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T171124909"] = "Data source name" + +-- The embedding runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T1950544032"] = "The embedding runs locally or in your organization. Your data is not sent to the cloud." + +-- The file chosen for the data source does not exist anymore. Please edit the data source and choose another file or correct the path. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2235729121"] = "The file chosen for the data source does not exist anymore. Please edit the data source and choose another file or correct the path." + +-- the maximum number of matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2479753122"] = "the maximum number of matches per query" + +-- the data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2717738728"] = "the data source name" + +-- the file size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2837935239"] = "the file size" + +-- your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2879113658"] = "your security policy" + +-- File path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2879895266"] = "File path" + +-- Maximum matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2889706179"] = "Maximum matches per query" + +-- the embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2937209992"] = "the embedding name" + +-- this path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2944855252"] = "this path" + +-- Embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3153201045"] = "Embedding name" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3448155331"] = "Close" + +-- File size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3650018664"] = "File size" + +-- The embedding runs in the cloud. All your data within the file '{0}' will be sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3688254408"] = "The embedding runs in the cloud. All your data within the file '{0}' will be sent to the cloud." + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T4081226330"] = "Your security policy" + +-- Embedding Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T1427271797"] = "Embedding Name" + +-- Embedding Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T1625164424"] = "Embedding Description" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T1847791252"] = "Update" + +-- Please describe when the embedding is used. Might be anytime or when certain keywords are present, etc. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T2346653528"] = "Please describe when the embedding is used. Might be anytime or when certain keywords are present, etc." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T2646845972"] = "Add" + +-- Embedding Type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T2764429350"] = "Embedding Type" + +-- Embedding Link +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T290945550"] = "Embedding Link" + +-- Used when +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3229398952"] = "Used when" + +-- The embedding type must not be longer than 56 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T32602319"] = "The embedding type must not be longer than 56 characters." + +-- The name of the embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3415350123"] = "The name of the embedding method." + +-- A short description of the embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3588690510"] = "A short description of the embedding method." + +-- The embedding name must not be longer than 26 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T359150945"] = "The embedding name must not be longer than 26 characters." + +-- The embedding method name '{0}' is already used. Please choose a unique name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3601888052"] = "The embedding method name '{0}' is already used. Please choose a unique name." + +-- When is this embedding used? When you define multiple embeddings, it is helpful to know when to use which one. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3779802582"] = "When is this embedding used? When you define multiple embeddings, it is helpful to know when to use which one." + +-- See Wikipedia for more information about word embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3806477732"] = "See Wikipedia for more information about word embeddings" + +-- The embedding type must not be empty. Please specify the embedding type. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3902812924"] = "The embedding type must not be empty. Please specify the embedding type." + +-- See Wikipedia for more information about knowledge graph embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3928412408"] = "See Wikipedia for more information about knowledge graph embeddings" + +-- The embedding name must not be empty. Please name the embedding. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T4242514061"] = "The embedding name must not be empty. Please name the embedding." + +-- What kind of embedding is used. For example, Transformer Embedding, Contextual Word Embedding, Graph Embedding, etc. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T4263395074"] = "What kind of embedding is used. For example, Transformer Embedding, Contextual Word Embedding, Graph Embedding, etc." + +-- The description must not be empty. Please describe the embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T4268946588"] = "The description must not be empty. Please describe the embedding method." + +-- A link to the embedding, e.g., to the model, the source code, the paper, it's Wikipedia page, etc. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T662524223"] = "A link to the embedding, e.g., to the model, the source code, the paper, it's Wikipedia page, etc." + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T900713019"] = "Cancel" + +-- Failed to store the API key in the operating system. The message was: {0}. Please try again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1122745046"] = "Failed to store the API key in the operating system. The message was: {0}. Please try again." + +-- API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1324664716"] = "API Key" + +-- Create account +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1356621346"] = "Create account" + +-- Please enter an embedding model name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1661085403"] = "Please enter an embedding model name." + +-- Hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1727440780"] = "Hostname" + +-- Load +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1756340745"] = "Load" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1847791252"] = "Update" + +-- Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1870831108"] = "Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again." + +-- Model +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2189814010"] = "Model" + +-- (Optional) API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2331453405"] = "(Optional) API Key" + +-- Currently, we cannot query the embedding models of self-hosted systems. Therefore, enter the model name manually. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2615586687"] = "Currently, we cannot query the embedding models of self-hosted systems. Therefore, enter the model name manually." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2646845972"] = "Add" + +-- No models loaded or available. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2810182573"] = "No models loaded or available." + +-- Instance Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2842060373"] = "Instance Name" + +-- Model selection +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T416738168"] = "Model selection" + +-- Host +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T808120719"] = "Host" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T900237532"] = "Provider" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T900713019"] = "Cancel" + +-- Tell the AI what you want it to do for you. What are your goals or are you trying to achieve? Like having the AI address you informally. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T1458195391"] = "Tell the AI what you want it to do for you. What are your goals or are you trying to achieve? Like having the AI address you informally." + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T1847791252"] = "Update" + +-- Tell the AI something about yourself. What is your profession? How experienced are you in this profession? Which technologies do you like? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2119274961"] = "Tell the AI something about yourself. What is your profession? How experienced are you in this profession? Which technologies do you like?" + +-- What should the AI do for you? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2261456575"] = "What should the AI do for you?" + +-- Please enter a profile name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2386844536"] = "Please enter a profile name." + +-- The text must not exceed 256 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2560188276"] = "The text must not exceed 256 characters." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2646845972"] = "Add" + +-- The profile name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3243902394"] = "The profile name must not exceed 40 characters." + +-- The text must not exceed 444 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3253349421"] = "The text must not exceed 444 characters." + +-- Profile Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3392578705"] = "Profile Name" + +-- Please enter what the LLM should know about you and/or what actions it should take. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3708405102"] = "Please enter what the LLM should know about you and/or what actions it should take." + +-- The name of the profile is mandatory. Each profile must have a unique name. Whether you provide information about yourself or only fill out the actions is up to you. Only one of these pieces is required. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T4061896123"] = "The name of the profile is mandatory. Each profile must have a unique name. Whether you provide information about yourself or only fill out the actions is up to you. Only one of these pieces is required." + +-- Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T4125557797"] = "Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role." + +-- What should the AI know about you? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T4227846635"] = "What should the AI know about you?" + +-- Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T56359901"] = "Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile." + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T900713019"] = "Cancel" + +-- The profile name must be unique; the chosen name is already in use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T911748898"] = "The profile name must be unique; the chosen name is already in use." + +-- Hugging Face Inference Provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1085481431"] = "Hugging Face Inference Provider" + +-- Failed to store the API key in the operating system. The message was: {0}. Please try again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1122745046"] = "Failed to store the API key in the operating system. The message was: {0}. Please try again." + +-- API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1324664716"] = "API Key" + +-- Create account +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1356621346"] = "Create account" + +-- Load models +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T15352225"] = "Load models" + +-- Hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1727440780"] = "Hostname" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1847791252"] = "Update" + +-- Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1870831108"] = "Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again." + +-- Please enter a model name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1936099896"] = "Please enter a model name." + +-- Model +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2189814010"] = "Model" + +-- (Optional) API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2331453405"] = "(Optional) API Key" + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2646845972"] = "Add" + +-- No models loaded or available. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2810182573"] = "No models loaded or available." + +-- Instance Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2842060373"] = "Instance Name" + +-- Show available models +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3763891899"] = "Show available models" + +-- Model selection +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T416738168"] = "Model selection" + +-- Host +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T808120719"] = "Host" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T900237532"] = "Provider" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T900713019"] = "Cancel" + +-- The parameter name. It must be unique within the retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T100726215"] = "The parameter name. It must be unique within the retrieval process." + +-- New Parameter {0} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1064532992"] = "New Parameter {0}" + +-- Add Parameter +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1082847843"] = "Add Parameter" + +-- Parameter Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1093935834"] = "Parameter Description" + +-- The retrieval process name must not be empty. Please name your retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1133451355"] = "The retrieval process name must not be empty. Please name your retrieval process." + +-- The parameter name must not be empty. Please name the parameter. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1359500913"] = "The parameter name must not be empty. Please name the parameter." + +-- A short description of the parameter. What data type is it? What is it used for? What are the possible values? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1519220950"] = "A short description of the parameter. What data type is it? What is it used for? What are the possible values?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1847791252"] = "Update" + +-- Optional. Select the embedding methods that are used for this retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1869391009"] = "Optional. Select the embedding methods that are used for this retrieval process." + +-- Retrieval Process Link +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1936369410"] = "Retrieval Process Link" + +-- Here you can select which embedding methods are used for this retrieval process. Embeddings are optional; if your retrieval process works without embedding, you can ignore this part. You can only choose the embedding methods you have previously defined. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2076115062"] = "Here you can select which embedding methods are used for this retrieval process. Embeddings are optional; if your retrieval process works without embedding, you can ignore this part. You can only choose the embedding methods you have previously defined." + +-- The parameter description must not be empty. Please describe the parameter '{0}'. What data type is it? What is it used for? What are the possible values? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2139013415"] = "The parameter description must not be empty. Please describe the parameter '{0}'. What data type is it? What is it used for? What are the possible values?" + +-- A link to the retrieval process, e.g., the source code, the paper, it's Wikipedia page, etc. Make sense for common retrieval processes. Leave empty if not applicable. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2352603560"] = "A link to the retrieval process, e.g., the source code, the paper, it's Wikipedia page, etc. Make sense for common retrieval processes. Leave empty if not applicable." + +-- No embedding methods selected. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2508820480"] = "No embedding methods selected." + +-- Add a parameter first, then select it to edit. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2534894635"] = "Add a parameter first, then select it to edit." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2646845972"] = "Add" + +-- You have selected {0} embedding methods. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2933579640"] = "You have selected {0} embedding methods." + +-- Please provide some general information about your retrieval process first. This data may be displayed to the users. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3015844908"] = "Please provide some general information about your retrieval process first. This data may be displayed to the users." + +-- The name of your retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3207262684"] = "The name of your retrieval process." + +-- You may want to parameterize your retrieval process. However, this is optional. You can specify any parameters that can be set by the user or the system during the call. Nevertheless, you should use sensible default values in your code so that users are not forced to set the parameters manually. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3292152705"] = "You may want to parameterize your retrieval process. However, this is optional. You can specify any parameters that can be set by the user or the system during the call. Nevertheless, you should use sensible default values in your code so that users are not forced to set the parameters manually." + +-- Select a parameter to show and edit it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3300669027"] = "Select a parameter to show and edit it." + +-- The parameter name '{0}' must be unique. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3378166475"] = "The parameter name '{0}' must be unique. Please choose a different name." + +-- The retrieval process name '{0}' must be unique. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3387731069"] = "The retrieval process name '{0}' must be unique. Please choose a different name." + +-- Delete this parameter +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3464622501"] = "Delete this parameter" + +-- Retrieval Process Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3481092305"] = "Retrieval Process Name" + +-- A short description of the retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3524519535"] = "A short description of the retrieval process." + +-- Currently, you have not defined any embedding methods. If your retrieval process does not require embedding, you can ignore this part. Otherwise, you can define one or more embedding methods in the previous view to assign them to your retrieval process here. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3821108204"] = "Currently, you have not defined any embedding methods. If your retrieval process does not require embedding, you can ignore this part. Otherwise, you can define one or more embedding methods in the previous view to assign them to your retrieval process here." + +-- Retrieval Process Parameters +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3894388618"] = "Retrieval Process Parameters" + +-- The description must not be empty. Please describe the retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T40530321"] = "The description must not be empty. Please describe the retrieval process." + +-- Embeddings methods +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T4119328701"] = "Embeddings methods" + +-- General Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T4286878385"] = "General Information" + +-- Retrieval Process Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T546772364"] = "Retrieval Process Description" + +-- You have selected 1 embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T673052164"] = "You have selected 1 embedding method." + +-- The retrieval process name must not be longer than 26 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T769031589"] = "The retrieval process name must not be longer than 26 characters." + +-- Parameter Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T873729811"] = "Parameter Name" + +-- The parameter name must not be longer than 26 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T898422027"] = "The parameter name must not be longer than 26 characters." + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T900713019"] = "Cancel" + +-- Embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T951463987"] = "Embeddings" + +-- There is no social event +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1222800281"] = "There is no social event" + +-- Agenda options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1249372829"] = "Agenda options are preselected" + +-- Preselect a duration? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1404615656"] = "Preselect a duration?" + +-- Preselect the number of participants +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1444356399"] = "Preselect the number of participants" + +-- Meeting is virtual +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1446638309"] = "Meeting is virtual" + +-- Preselect a name? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1471770981"] = "Preselect a name?" + +-- Preselect whether participants needs to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1648427207"] = "Preselect whether participants needs to arrive and depart" + +-- Preselect a start time? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1901151023"] = "Preselect a start time?" + +-- Preselect a location? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1908318849"] = "Preselect a location?" + +-- How many participants should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1998244307"] = "How many participants should be preselected?" + +-- Preselect whether the meeting is virtual +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2084951012"] = "Preselect whether the meeting is virtual" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- When enabled, you can preselect most agenda options. This is might be useful when you need to create similar agendas often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2373110543"] = "When enabled, you can preselect most agenda options. This is might be useful when you need to create similar agendas often." + +-- Preselect whether the participants should get to know each other +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2519703500"] = "Preselect whether the participants should get to know each other" + +-- Which agenda language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2801220321"] = "Which agenda language should be preselected?" + +-- Preselect another agenda language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2915422331"] = "Preselect another agenda language" + +-- Participants do not need to get to know each other +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2949002251"] = "Participants do not need to get to know each other" + +-- There is a social event +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T296183299"] = "There is a social event" + +-- Participants should be actively involved +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T298324727"] = "Participants should be actively involved" + +-- Meeting is in person +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3008159782"] = "Meeting is in person" + +-- Participants do not need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3087504452"] = "Participants do not need to arrive and depart" + +-- Preselect whether there is a joint dinner +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3175009548"] = "Preselect whether there is a joint dinner" + +-- Preselect an objective? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3439476935"] = "Preselect an objective?" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3448155331"] = "Close" + +-- Preselect a moderator? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3482798491"] = "Preselect a moderator?" + +-- Participants need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3591032034"] = "Participants need to arrive and depart" + +-- Participants do not need to be actively involved +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3679899885"] = "Participants do not need to be actively involved" + +-- Preselect the approx. lunch time +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3709527588"] = "Preselect the approx. lunch time" + +-- Preselect a topic? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3835166371"] = "Preselect a topic?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4004501229"] = "Preselect one of your profiles?" + +-- Preselect the agenda language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4055846391"] = "Preselect the agenda language" + +-- No agenda options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4094211586"] = "No agenda options are preselected" + +-- Participants should get to know each other +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T464127805"] = "Participants should get to know each other" + +-- Assistant: Agenda Planner Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T677962779"] = "Assistant: Agenda Planner Options" + +-- There is a joint dinner +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T707310400"] = "There is a joint dinner" + +-- Preselect the approx. break time +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T722113273"] = "Preselect the approx. break time" + +-- There is no joint dinner +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T768936730"] = "There is no joint dinner" + +-- Preselect agenda options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T800921421"] = "Preselect agenda options?" + +-- Preselect whether there is a social event +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T816053055"] = "Preselect whether there is a social event" + +-- Preselect whether the participants should actively involved +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T817726429"] = "Preselect whether the participants should actively involved" + +-- Restrict to one bias a day? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1608129203"] = "Restrict to one bias a day?" + +-- Yes, you can only retrieve one bias per day +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1765683725"] = "Yes, you can only retrieve one bias per day" + +-- Reset +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T180921696"] = "Reset" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- No restriction. You can retrieve as many biases as you want per day. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2305356277"] = "No restriction. You can retrieve as many biases as you want per day." + +-- Which language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2345162613"] = "Which language should be preselected?" + +-- Reset your bias-of-the-day statistics +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2350981714"] = "Reset your bias-of-the-day statistics" + +-- Preselect another language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2382415529"] = "Preselect another language" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2571465005"] = "Preselect the language" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3448155331"] = "Close" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T354528094"] = "No options are preselected" + +-- Assistant: Bias of the Day +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T384887684"] = "Assistant: Bias of the Day" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3875604319"] = "Options are preselected" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T4004501229"] = "Preselect one of your profiles?" + +-- Are you sure you want to reset your bias-of-the-day statistics? The system will no longer remember which biases you already know. As a result, biases you are already familiar with may be addressed again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T405627382"] = "Are you sure you want to reset your bias-of-the-day statistics? The system will no longer remember which biases you already know. As a result, biases you are already familiar with may be addressed again." + +-- Assistant: Bias of the Day Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T4235808594"] = "Assistant: Bias of the Day Options" + +-- Preselect options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T42672465"] = "Preselect options?" + +-- You have learned about {0} out of {1} biases. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T679061561"] = "You have learned about {0} out of {1} biases." + +-- When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T711745239"] = "When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model." + +-- Preselect one of your chat templates? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1402022556"] = "Preselect one of your chat templates?" + +-- Control how the LLM provider for loaded chats is selected and when assistant results are sent to chat. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T172255919"] = "Control how the LLM provider for loaded chats is selected and when assistant results are sent to chat." + +-- Chat Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1757092713"] = "Chat Options" + +-- Shortcut to send input +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1773585398"] = "Shortcut to send input" + +-- Provider selection when creating new chats +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T189306836"] = "Provider selection when creating new chats" + +-- Would you like to set one of your profiles as the default for chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1933521846"] = "Would you like to set one of your profiles as the default for chats?" + +-- Apply default data source option when sending assistant results to chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2510376349"] = "Apply default data source option when sending assistant results to chat" + +-- Control how the LLM provider for added chats is selected. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T263621180"] = "Control how the LLM provider for added chats is selected." + +-- Provider selection when loading a chat and sending assistant results to chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2868379953"] = "Provider selection when loading a chat and sending assistant results to chat" + +-- Show the latest message after loading? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2913693228"] = "Show the latest message after loading?" + +-- Do you want to use any shortcut to send your input? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2936560092"] = "Do you want to use any shortcut to send your input?" + +-- Would you like to set one of your chat templates as the default for chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3234927721"] = "Would you like to set one of your chat templates as the default for chats?" + +-- No chat options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3383186996"] = "No chat options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3448155331"] = "Close" + +-- First (oldest) message is shown, after loading a chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3507181366"] = "First (oldest) message is shown, after loading a chat" + +-- Preselect chat options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3728624759"] = "Preselect chat options?" + +-- Chat options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3730599555"] = "Chat options are preselected" + +-- Latest message is shown, after loading a chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3755993611"] = "Latest message is shown, after loading a chat" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T4004501229"] = "Preselect one of your profiles?" + +-- Do you want to apply the default data source options when sending assistant results to chat? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T4033153439"] = "Do you want to apply the default data source options when sending assistant results to chat?" + +-- When enabled, you can preselect chat options. This is might be useful when you prefer a specific provider. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T477675197"] = "When enabled, you can preselect chat options. This is might be useful when you prefer a specific provider." + +-- You can set default data sources and options for new chats. You can change these settings later for each individual chat. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T492357592"] = "You can set default data sources and options for new chats. You can change these settings later for each individual chat." + +-- When enabled, the latest message is shown after loading a chat. When disabled, the first (oldest) message is shown. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T582516016"] = "When enabled, the latest message is shown after loading a chat. When disabled, the first (oldest) message is shown." + +-- Customize your AI experience with chat templates. Whether you want to experiment with prompt engineering, simply use a custom system prompt in the standard chat interface, or create a specialized assistant, our templates give you full control. Similar to common AI companies' playgrounds, you can define your own system prompts and leverage assistant prompts for providers that support them. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1172171653"] = "Customize your AI experience with chat templates. Whether you want to experiment with prompt engineering, simply use a custom system prompt in the standard chat interface, or create a specialized assistant, our templates give you full control. Similar to common AI companies' playgrounds, you can define your own system prompts and leverage assistant prompts for providers that support them." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1469573738"] = "Delete" + +-- Add Chat Template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1548314416"] = "Add Chat Template" + +-- Note: This advanced feature is designed for users familiar with prompt engineering concepts. Furthermore, you have to make sure yourself that your chosen provider supports the use of assistant prompts. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1909110760"] = "Note: This advanced feature is designed for users familiar with prompt engineering concepts. Furthermore, you have to make sure yourself that your chosen provider supports the use of assistant prompts." + +-- No chat templates configured yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T2319860307"] = "No chat templates configured yet." + +-- Chat Template Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T275026390"] = "Chat Template Name" + +-- Are you sure you want to delete the chat template '{0}'? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3102555824"] = "Are you sure you want to delete the chat template '{0}'?" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3267849393"] = "Edit" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3448155331"] = "Close" + +-- Edit Chat Template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3596030597"] = "Edit Chat Template" + +-- Your Chat Templates +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3824122683"] = "Your Chat Templates" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3865031940"] = "Actions" + +-- Delete Chat Template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T4025180906"] = "Delete Chat Template" + +-- Which programming language should be preselected for added contexts? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1073540083"] = "Which programming language should be preselected for added contexts?" + +-- Compiler messages are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1110902070"] = "Compiler messages are preselected" + +-- Preselect a programming language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2181567002"] = "Preselect a programming language" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- When enabled, you can preselect the coding options. This is might be useful when you prefer a specific programming language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2619641701"] = "When enabled, you can preselect the coding options. This is might be useful when you prefer a specific programming language or LLM model." + +-- Preselect coding options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2790579667"] = "Preselect coding options?" + +-- Preselect compiler messages? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2970689954"] = "Preselect compiler messages?" + +-- No coding options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3015105896"] = "No coding options are preselected" + +-- Coding options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3567850751"] = "Coding options are preselected" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4004501229"] = "Preselect one of your profiles?" + +-- Preselect another programming language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4230412334"] = "Preselect another programming language" + +-- Compiler messages are not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T516498299"] = "Compiler messages are not preselected" + +-- Assistant: Coding Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T585868261"] = "Assistant: Coding Options" + +-- You might configure different data sources. A data source can include one file, all files in a directory, or data from your company. Later, you can incorporate these data sources as needed when the AI requires this data to complete a certain task. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1084943026"] = "You might configure different data sources. A data source can include one file, all files in a directory, or data from your company. Later, you can incorporate these data sources as needed when the AI requires this data to complete a certain task." + +-- Are you sure you want to delete the data source '{0}' of type {1}? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1096979935"] = "Are you sure you want to delete the data source '{0}' of type {1}?" + +-- Edit Local Directory Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1215599168"] = "Edit Local Directory Data Source" + +-- Add Local Directory as Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1454193397"] = "Add Local Directory as Data Source" + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1469573738"] = "Delete" + +-- External (ERI) +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1652430727"] = "External (ERI)" + +-- Local File +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1687345358"] = "Local File" + +-- Delete Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1849107431"] = "Delete Data Source" + +-- Local Directory Data Source Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2146756020"] = "Local Directory Data Source Information" + +-- Edit ERI v1 Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T221059217"] = "Edit ERI v1 Data Source" + +-- Edit Local File Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2453292893"] = "Edit Local File Data Source" + +-- ERI v1 Data Source Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T26243729"] = "ERI v1 Data Source Information" + +-- Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T266367750"] = "Name" + +-- No valid embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2698203405"] = "No valid embedding" + +-- Embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2838542994"] = "Embedding" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3267849393"] = "Edit" + +-- Add Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3387511033"] = "Add Data Source" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3424652889"] = "Unknown" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3448155331"] = "Close" + +-- Add Local File as Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3500365052"] = "Add Local File as Data Source" + +-- Type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3512062061"] = "Type" + +-- Local File Data Source Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3525663993"] = "Local File Data Source Information" + +-- No data sources configured yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3549650120"] = "No data sources configured yet." + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3865031940"] = "Actions" + +-- Configured Data Sources +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T543942217"] = "Configured Data Sources" + +-- Add ERI v1 Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T590005498"] = "Add ERI v1 Data Source" + +-- External Data (ERI-Server v1) +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T774473996"] = "External Data (ERI-Server v1)" + +-- Local Directory +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T926703547"] = "Local Directory" + +-- When enabled, you can preselect some ERI server options. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1280666275"] = "When enabled, you can preselect some ERI server options." + +-- Preselect ERI server options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1664055662"] = "Preselect ERI server options?" + +-- No ERI server options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1793785587"] = "No ERI server options are preselected" + +-- Most ERI server options can be customized and saved directly in the ERI server assistant. For this, the ERI server assistant has an auto-save function. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2093534613"] = "Most ERI server options can be customized and saved directly in the ERI server assistant. For this, the ERI server assistant has an auto-save function." + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3448155331"] = "Close" + +-- Assistant: ERI Server Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3629372826"] = "Assistant: ERI Server Options" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T4004501229"] = "Preselect one of your profiles?" + +-- ERI server options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T488190224"] = "ERI server options are preselected" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T1462295644"] = "Preselect another target language" + +-- Preselect grammar & spell checker options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T1672258211"] = "Preselect grammar & spell checker options?" + +-- No grammar & spell checker options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T2041367384"] = "No grammar & spell checker options are preselected" + +-- When enabled, you can preselect the grammar & spell checker options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T2515603280"] = "When enabled, you can preselect the grammar & spell checker options. This is might be useful when you prefer a specific language or LLM model." + +-- Grammar & spell checker options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T2843193933"] = "Grammar & spell checker options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T3547337928"] = "Which target language should be preselected?" + +-- Assistant: Grammar & Spelling Checker Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T886675455"] = "Assistant: Grammar & Spelling Checker Options" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T1462295644"] = "Preselect another target language" + +-- Select the language plugin used for comparision. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T1523568309"] = "Select the language plugin used for comparision." + +-- Localization options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T2246008228"] = "Localization options are preselected" + +-- Assistant: Localization +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T2573041664"] = "Assistant: Localization" + +-- Language plugin used for comparision +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T263317578"] = "Language plugin used for comparision" + +-- Preselect localization options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3080941742"] = "Preselect localization options?" + +-- No localization options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3287437171"] = "No localization options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3547337928"] = "Which target language should be preselected?" + +-- When enabled, you can preselect the localization options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T4022795859"] = "When enabled, you can preselect the localization options. This is might be useful when you prefer a specific language or LLM model." + +-- Preselect the icon source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1116652851"] = "Preselect the icon source" + +-- Assistant: Icon Finder Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1570765862"] = "Assistant: Icon Finder Options" + +-- No icon options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1694910115"] = "No icon options are preselected" + +-- Icon options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1792507476"] = "Icon options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T3448155331"] = "Close" + +-- Preselect icon options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T725252382"] = "Preselect icon options?" + +-- No job posting options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1257718691"] = "No job posting options are preselected" + +-- Preselect some mandatory information about the job posting? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1332068481"] = "Preselect some mandatory information about the job posting?" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1462295644"] = "Preselect another target language" + +-- Job posting options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1827578822"] = "Job posting options are preselected" + +-- Preselect the work location? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1867962106"] = "Preselect the work location?" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2571465005"] = "Preselect the language" + +-- Preselect job posting options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2624983038"] = "Preselect job posting options?" + +-- Preselect the company name? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2679442990"] = "Preselect the company name?" + +-- When enabled, you can preselect some job posting options. This is might be useful when you prefer a specific LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2907036553"] = "When enabled, you can preselect some job posting options. This is might be useful when you prefer a specific LLM model." + +-- Preselect the job qualifications? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3223375709"] = "Preselect the job qualifications?" + +-- Assistant: Job Posting Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3307661496"] = "Assistant: Job Posting Options" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3547337928"] = "Which target language should be preselected?" + +-- Preselect the job responsibilities? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3788397013"] = "Preselect the job responsibilities?" + +-- Preselect the job description? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3825475093"] = "Preselect the job description?" + +-- Content cleaner agent is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1013787967"] = "Content cleaner agent is preselected" + +-- Web content reader is shown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1030372436"] = "Web content reader is shown" + +-- When enabled, the web content reader is preselected. This is might be useful when you prefer to load legal content from the web very often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1507288278"] = "When enabled, the web content reader is preselected. This is might be useful when you prefer to load legal content from the web very often." + +-- Preselect legal check options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1563865738"] = "Preselect legal check options?" + +-- No legal check options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1591931823"] = "No legal check options are preselected" + +-- When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1633101895"] = "When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use." + +-- Web content reader is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1701127912"] = "Web content reader is not preselected" + +-- Content cleaner agent is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1969816694"] = "Content cleaner agent is not preselected" + +-- Hide the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2090693677"] = "Hide the web content reader?" + +-- When enabled, you can preselect some legal check options. This is might be useful when you prefer a specific LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2164667361"] = "When enabled, you can preselect some legal check options. This is might be useful when you prefer a specific LLM model." + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- Legal check options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T252916114"] = "Legal check options are preselected" + +-- When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the legal content before translating it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2746583995"] = "When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the legal content before translating it." + +-- Web content reader is hidden +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2799795311"] = "Web content reader is hidden" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3448155331"] = "Close" + +-- Web content reader is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3641773985"] = "Web content reader is preselected" + +-- Preselect the content cleaner agent? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3649428096"] = "Preselect the content cleaner agent?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4004501229"] = "Preselect one of your profiles?" + +-- Assistant: Legal Check Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4033382756"] = "Assistant: Legal Check Options" + +-- Preselect the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T629158142"] = "Preselect the web content reader?" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- Which language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2345162613"] = "Which language should be preselected?" + +-- Preselect another language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2382415529"] = "Preselect another language" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2571465005"] = "Preselect the language" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3448155331"] = "Close" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T354528094"] = "No options are preselected" + +-- Assistant: My Tasks Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3710380967"] = "Assistant: My Tasks Options" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3875604319"] = "Options are preselected" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T4004501229"] = "Preselect one of your profiles?" + +-- Preselect options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T42672465"] = "Preselect options?" + +-- When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T711745239"] = "When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model." + +-- Edit Profile +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T1143111468"] = "Edit Profile" + +-- No profiles configured yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T1433534732"] = "No profiles configured yet." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T1469573738"] = "Delete" + +-- Your Profiles +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T2378610256"] = "Your Profiles" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3267849393"] = "Edit" + +-- Profile Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3392578705"] = "Profile Name" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3448155331"] = "Close" + +-- Delete Profile +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3804515427"] = "Delete Profile" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3865031940"] = "Actions" + +-- Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T4125557797"] = "Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role." + +-- Add Profile +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T4248067241"] = "Add Profile" + +-- Are you sure you want to delete the profile '{0}'? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T55364659"] = "Are you sure you want to delete the profile '{0}'?" + +-- Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T56359901"] = "Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile." + +-- Which writing style should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1173034744"] = "Which writing style should be preselected?" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1462295644"] = "Preselect another target language" + +-- Preselect a sentence structure +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1621537655"] = "Preselect a sentence structure" + +-- Assistant: Rewrite & Improve Text Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1995708818"] = "Assistant: Rewrite & Improve Text Options" + +-- Which voice should be preselected for the sentence structure? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T2661599097"] = "Which voice should be preselected for the sentence structure?" + +-- Preselect a writing style +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T28456020"] = "Preselect a writing style" + +-- Rewrite & improve text options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3303192024"] = "Rewrite & improve text options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3547337928"] = "Which target language should be preselected?" + +-- When enabled, you can preselect the rewrite & improve text options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3657121735"] = "When enabled, you can preselect the rewrite & improve text options. This is might be useful when you prefer a specific language or LLM model." + +-- Preselect rewrite & improve text options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3745021518"] = "Preselect rewrite & improve text options?" + +-- No rewrite & improve text options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T553954963"] = "No rewrite & improve text options are preselected" + +-- When enabled, you can preselect synonym options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T183953912"] = "When enabled, you can preselect synonym options. This is might be useful when you prefer a specific language or LLM model." + +-- No synonym options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2183758387"] = "No synonym options are preselected" + +-- Which language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2345162613"] = "Which language should be preselected?" + +-- Preselect another language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2382415529"] = "Preselect another language" + +-- Synonym options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2390458990"] = "Synonym options are preselected" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2571465005"] = "Preselect the language" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T3448155331"] = "Close" + +-- Assistant: Synonyms Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T3889117881"] = "Assistant: Synonyms Options" + +-- Preselect synonym options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T4170921846"] = "Preselect synonym options?" + +-- Content cleaner agent is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1013787967"] = "Content cleaner agent is preselected" + +-- Web content reader is shown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1030372436"] = "Web content reader is shown" + +-- Preselect the summarizer complexity +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T104409170"] = "Preselect the summarizer complexity" + +-- Preselect summarizer options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T108151178"] = "Preselect summarizer options?" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1462295644"] = "Preselect another target language" + +-- When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1633101895"] = "When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use." + +-- Web content reader is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1701127912"] = "Web content reader is not preselected" + +-- Assistant: Text Summarizer Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1767527569"] = "Assistant: Text Summarizer Options" + +-- Content cleaner agent is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1969816694"] = "Content cleaner agent is not preselected" + +-- Hide the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T2090693677"] = "Hide the web content reader?" + +-- Summarizer options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T2355441996"] = "Summarizer options are preselected" + +-- Web content reader is hidden +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T2799795311"] = "Web content reader is hidden" + +-- No summarizer options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3215334223"] = "No summarizer options are preselected" + +-- When enabled, the web content reader is preselected. This is might be useful when you prefer to load content from the web very often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3216157681"] = "When enabled, the web content reader is preselected. This is might be useful when you prefer to load content from the web very often." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3547337928"] = "Which target language should be preselected?" + +-- Web content reader is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3641773985"] = "Web content reader is preselected" + +-- Preselect the content cleaner agent? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3649428096"] = "Preselect the content cleaner agent?" + +-- When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the content before summarize it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3660434400"] = "When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the content before summarize it." + +-- When enabled, you can preselect the text summarizer options. This is might be useful when you prefer a specific language, complexity, or LLM. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3820844575"] = "When enabled, you can preselect the text summarizer options. This is might be useful when you prefer a specific language, complexity, or LLM." + +-- Which summarizer complexity should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T408530182"] = "Which summarizer complexity should be preselected?" + +-- Preselect your expertise +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T51139714"] = "Preselect your expertise" + +-- Preselect the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T629158142"] = "Preselect the web content reader?" + +-- Content cleaner agent is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1013787967"] = "Content cleaner agent is preselected" + +-- Assistant: Translator Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1016384269"] = "Assistant: Translator Options" + +-- Web content reader is shown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1030372436"] = "Web content reader is shown" + +-- When enabled, you can preselect the translator options. This is might be useful when you prefer a specific target language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1111006275"] = "When enabled, you can preselect the translator options. This is might be useful when you prefer a specific target language or LLM model." + +-- milliseconds +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1275514075"] = "milliseconds" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1462295644"] = "Preselect another target language" + +-- When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1633101895"] = "When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use." + +-- Web content reader is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1701127912"] = "Web content reader is not preselected" + +-- Live translation is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1825690873"] = "Live translation is not preselected" + +-- Content cleaner agent is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1969816694"] = "Content cleaner agent is not preselected" + +-- Preselect translator options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1989346399"] = "Preselect translator options?" + +-- Hide the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2090693677"] = "Hide the web content reader?" + +-- Translator options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2234531191"] = "Translator options are preselected" + +-- Live translation is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2435743076"] = "Live translation is preselected" + +-- Web content reader is hidden +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2799795311"] = "Web content reader is hidden" + +-- No translator options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2866358796"] = "No translator options are preselected" + +-- When enabled, the web content reader is preselected. This is might be useful when you prefer to load content from the web very often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3216157681"] = "When enabled, the web content reader is preselected. This is might be useful when you prefer to load content from the web very often." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3547337928"] = "Which target language should be preselected?" + +-- Web content reader is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3641773985"] = "Web content reader is preselected" + +-- Preselect the content cleaner agent? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3649428096"] = "Preselect the content cleaner agent?" + +-- Preselect the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T629158142"] = "Preselect the web content reader?" + +-- How fast should the live translation react? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T884246296"] = "How fast should the live translation react?" + +-- When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the content before translating it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T894123480"] = "When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the content before translating it." + +-- Preselect live translation? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T918172772"] = "Preselect live translation?" + +-- If and when should we delete your temporary chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T1014418451"] = "If and when should we delete your temporary chats?" + +-- Workspace display behavior +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T2151409362"] = "Workspace display behavior" + +-- Workspace behavior +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T2562846516"] = "Workspace behavior" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T3448155331"] = "Close" + +-- How should we display your workspaces? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T3566924898"] = "How should we display your workspaces?" + +-- Should we store your chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T3942969162"] = "Should we store your chats?" + +-- Your Workspaces Configuration +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T404802870"] = "Your Workspaces Configuration" + +-- Workspace maintenance +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T49653413"] = "Workspace maintenance" + +-- Which writing style should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1173034744"] = "Which writing style should be preselected?" + +-- Preselect a greeting? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1254399201"] = "Preselect a greeting?" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1462295644"] = "Preselect another target language" + +-- Assistant: Writing E-Mails Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2021226503"] = "Assistant: Writing E-Mails Options" + +-- When enabled, you can preselect the e-mail options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2116404483"] = "When enabled, you can preselect the e-mail options. This is might be useful when you prefer a specific language or LLM model." + +-- Preselect your name for the closing salutation? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T221974240"] = "Preselect your name for the closing salutation?" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- Preselect a writing style +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T28456020"] = "Preselect a writing style" + +-- E-Mail options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2985974420"] = "E-Mail options are preselected" + +-- No e-mail options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3047605763"] = "No e-mail options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3547337928"] = "Which target language should be preselected?" + +-- Preselect e-mail options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3832719342"] = "Preselect e-mail options?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T4004501229"] = "Preselect one of your profiles?" + +-- Chat name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T1746586282"] = "Chat name" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T900713019"] = "Cancel" + +-- Install now +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T2366359512"] = "Install now" + +-- Update from v{0} to v{1} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T25417398"] = "Update from v{0} to v{1}" + +-- Install later +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T2936430090"] = "Install later" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T900713019"] = "Cancel" + +-- Settings +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1258653480"] = "Settings" + +-- Home +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1391791790"] = "Home" + +-- About +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1491113694"] = "About" + +-- Are you sure you want to leave the chat page? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1563130494"] = "Are you sure you want to leave the chat page? All unsaved changes will be lost." + +-- Assistants +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1614176092"] = "Assistants" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1847791252"] = "Update" + +-- Leave Chat Page +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2124749705"] = "Leave Chat Page" + +-- Plugins +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2222816203"] = "Plugins" + +-- An update to version {0} is available. +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2800137365"] = "An update to version {0} is available." + +-- Please wait for the update to complete... +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2864211629"] = "Please wait for the update to complete..." + +-- Supporters +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2929332068"] = "Supporters" + +-- Writer +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2979224202"] = "Writer" + +-- Show details +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T3692372066"] = "Show details" + +-- Chat +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T578410699"] = "Chat" + +-- Startup log file +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1019424746"] = "Startup log file" + +-- About MindWork AI Studio +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1020427799"] = "About MindWork AI Studio" + +-- Browse AI Studio's source code on GitHub — we welcome your contributions. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1107156991"] = "Browse AI Studio's source code on GitHub — we welcome your contributions." + +-- This library is used to read PDF files. This is necessary, e.g., for using PDFs as a data source for a chat. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1388816916"] = "This library is used to read PDF files. This is necessary, e.g., for using PDFs as a data source for a chat." + +-- This library is used to extend the MudBlazor library. It provides additional components that are not part of the MudBlazor library. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1421513382"] = "This library is used to extend the MudBlazor library. It provides additional components that are not part of the MudBlazor library." + +-- We use Lua as the language for plugins. Lua-CSharp lets Lua scripts communicate with AI Studio and vice versa. Thank you, Yusuke Nakada, for this great library. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T162898512"] = "We use Lua as the language for plugins. Lua-CSharp lets Lua scripts communicate with AI Studio and vice versa. Thank you, Yusuke Nakada, for this great library." + +-- Building on .NET, ASP.NET Core, and Blazor, MudBlazor is used as a library for designing and developing the user interface. It is a great project that significantly accelerates the development of advanced user interfaces with Blazor. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1629800076"] = "Building on .NET, ASP.NET Core, and Blazor, MudBlazor is used as a library for designing and developing the user interface. It is a great project that significantly accelerates the development of advanced user interfaces with Blazor." + +-- AI Studio creates a log file at startup, in which events during startup are recorded. After startup, another log file is created that records all events that occur during the use of the app. This includes any errors that may occur. Depending on when an error occurs (at startup or during use), the contents of these log files can be helpful for troubleshooting. Sensitive information such as passwords is not included in the log files. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1630237140"] = "AI Studio creates a log file at startup, in which events during startup are recorded. After startup, another log file is created that records all events that occur during the use of the app. This includes any errors that may occur. Depending on when an error occurs (at startup or during use), the contents of these log files can be helpful for troubleshooting. Sensitive information such as passwords is not included in the log files." + +-- This library is used to display the differences between two texts. This is necessary, e.g., for the grammar and spelling assistant. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1772678682"] = "This library is used to display the differences between two texts. This is necessary, e.g., for the grammar and spelling assistant." + +-- By clicking on the respective path, the path is copied to the clipboard. You might open these files with a text editor to view their contents. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1806897624"] = "By clicking on the respective path, the path is copied to the clipboard. You might open these files with a text editor to view their contents." + +-- Check for updates +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1890416390"] = "Check for updates" + +-- Vision +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1892426825"] = "Vision" + +-- This library is used to convert HTML to Markdown. This is necessary, e.g., when you provide a URL as input for an assistant. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1924365263"] = "This library is used to convert HTML to Markdown. This is necessary, e.g., when you provide a URL as input for an assistant." + +-- We use Rocket to implement the runtime API. This is necessary because the runtime must be able to communicate with the user interface (IPC). Rocket is a great framework for implementing web APIs in Rust. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1943216839"] = "We use Rocket to implement the runtime API. This is necessary because the runtime must be able to communicate with the user interface (IPC). Rocket is a great framework for implementing web APIs in Rust." + +-- This library is used to determine the file type of a file. This is necessary, e.g., when we want to stream a file. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2173617769"] = "This library is used to determine the file type of a file. This is necessary, e.g., when we want to stream a file." + +-- For the secure communication between the user interface and the runtime, we need to create certificates. This Rust library is great for this purpose. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2174764529"] = "For the secure communication between the user interface and the runtime, we need to create certificates. This Rust library is great for this purpose." + +-- We must generate random numbers, e.g., for securing the interprocess communication between the user interface and the runtime. The rand library is great for this purpose. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2273492381"] = "We must generate random numbers, e.g., for securing the interprocess communication between the user interface and the runtime. The rand library is great for this purpose." + +-- In order to use any LLM, each user must store their so-called token for each LLM provider. This token must be kept secure, similar to a password. The safest way to do this is offered by operating systems like macOS, Windows, and Linux: They have mechanisms to store such data, if available, on special security hardware. Since this is currently not possible in .NET, we use this Rust library. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T228561878"] = "In order to use any LLM, each user must store their so-called token for each LLM provider. This token must be kept secure, similar to a password. The safest way to do this is offered by operating systems like macOS, Windows, and Linux: They have mechanisms to store such data, if available, on special security hardware. Since this is currently not possible in .NET, we use this Rust library." + +-- The C# language is used for the implementation of the user interface and the backend. To implement the user interface with C#, the Blazor technology from ASP.NET Core is used. All these technologies are integrated into the .NET SDK. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2329884315"] = "The C# language is used for the implementation of the user interface and the backend. To implement the user interface with C#, the Blazor technology from ASP.NET Core is used. All these technologies are integrated into the .NET SDK." + +-- Used PDFium version +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2368247719"] = "Used PDFium version" + +-- This library is used to determine the language of the operating system. This is necessary to set the language of the user interface. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2557014401"] = "This library is used to determine the language of the operating system. This is necessary to set the language of the user interface." + +-- Used Open Source Projects +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2557066213"] = "Used Open Source Projects" + +-- Build time +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T260228112"] = "Build time" + +-- To be able to use the responses of the LLM in other apps, we often use the clipboard of the respective operating system. Unfortunately, in .NET there is no solution that works with all operating systems. Therefore, I have opted for this library in Rust. This way, data transfer to other apps works on every system. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2644379659"] = "To be able to use the responses of the LLM in other apps, we often use the clipboard of the respective operating system. Unfortunately, in .NET there is no solution that works with all operating systems. Therefore, I have opted for this library in Rust. This way, data transfer to other apps works on every system." + +-- Usage log file +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2689995864"] = "Usage log file" + +-- Logbook +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2706940196"] = "Logbook" + +-- This component is used to render Markdown text. This is important because the LLM often responds with Markdown-formatted text, allowing us to present it in a way that is easier to read. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2726131107"] = "This component is used to render Markdown text. This is important because the LLM often responds with Markdown-formatted text, allowing us to present it in a way that is easier to read." + +-- Code in the Rust language can be specified as synchronous or asynchronous. Unlike .NET and the C# language, Rust cannot execute asynchronous code by itself. Rust requires support in the form of an executor for this. Tokio is one such executor. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2777988282"] = "Code in the Rust language can be specified as synchronous or asynchronous. Unlike .NET and the C# language, Rust cannot execute asynchronous code by itself. Rust requires support in the form of an executor for this. Tokio is one such executor." + +-- View our project roadmap and help shape AI Studio's future development. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2829971158"] = "View our project roadmap and help shape AI Studio's future development." + +-- Used .NET runtime +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2840227993"] = "Used .NET runtime" + +-- Explanation +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2840582448"] = "Explanation" + +-- The .NET backend cannot be started as a desktop app. Therefore, I use a second backend in Rust, which I call runtime. With Rust as the runtime, Tauri can be used to realize a typical desktop app. Thanks to Rust, this app can be offered for Windows, macOS, and Linux desktops. Rust is a great language for developing safe and high-performance software. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2868174483"] = "The .NET backend cannot be started as a desktop app. Therefore, I use a second backend in Rust, which I call runtime. With Rust as the runtime, Tauri can be used to realize a typical desktop app. Thanks to Rust, this app can be offered for Windows, macOS, and Linux desktops. Rust is a great language for developing safe and high-performance software." + +-- Changelog +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3017574265"] = "Changelog" + +-- Connect AI Studio to your organization's data with our External Retrieval Interface (ERI). +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T313276297"] = "Connect AI Studio to your organization's data with our External Retrieval Interface (ERI)." + +-- Have feature ideas? Submit suggestions for future AI Studio enhancements. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3178730036"] = "Have feature ideas? Submit suggestions for future AI Studio enhancements." + +-- Discover MindWork AI's mission and vision on our official homepage. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3294830584"] = "Discover MindWork AI's mission and vision on our official homepage." + +-- User-language provided by the OS +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3334355246"] = "User-language provided by the OS" + +-- The following list shows the versions of the MindWork AI Studio, the used compilers, build time, etc.: +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3405978777"] = "The following list shows the versions of the MindWork AI Studio, the used compilers, build time, etc.:" + +-- Used Rust compiler +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3440211747"] = "Used Rust compiler" + +-- Tauri is used to host the Blazor user interface. It is a great project that allows the creation of desktop applications using web technologies. I love Tauri! +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3494984593"] = "Tauri is used to host the Blazor user interface. It is a great project that allows the creation of desktop applications using web technologies. I love Tauri!" + +-- Motivation +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3563271893"] = "Motivation" + +-- This library is used to read Excel and OpenDocument spreadsheet files. This is necessary, e.g., for using spreadsheets as a data source for a chat. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3722989559"] = "This library is used to read Excel and OpenDocument spreadsheet files. This is necessary, e.g., for using spreadsheets as a data source for a chat." + +-- Now we have multiple systems, some developed in .NET and others in Rust. The data format JSON is responsible for translating data between both worlds (called data serialization and deserialization). Serde takes on this task in the Rust world. The counterpart in the .NET world is an integral part of .NET and is located in System.Text.Json. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3908558992"] = "Now we have multiple systems, some developed in .NET and others in Rust. The data format JSON is responsible for translating data between both worlds (called data serialization and deserialization). Serde takes on this task in the Rust world. The counterpart in the .NET world is an integral part of .NET and is located in System.Text.Json." + +-- Versions +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4010195468"] = "Versions" + +-- This library is used to create asynchronous streams in Rust. It allows us to work with streams of data that can be produced asynchronously, making it easier to handle events or data that arrive over time. We use this, e.g., to stream arbitrary data from the file system to the embedding system. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4079152443"] = "This library is used to create asynchronous streams in Rust. It allows us to work with streams of data that can be produced asynchronously, making it easier to handle events or data that arrive over time. We use this, e.g., to stream arbitrary data from the file system to the embedding system." + +-- Community & Code +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4158546761"] = "Community & Code" + +-- We use the HtmlAgilityPack to extract content from the web. This is necessary, e.g., when you provide a URL as input for an assistant. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4184485147"] = "We use the HtmlAgilityPack to extract content from the web. This is necessary, e.g., when you provide a URL as input for an assistant." + +-- When transferring sensitive data between Rust runtime and .NET app, we encrypt the data. We use some libraries from the Rust Crypto project for this purpose: cipher, aes, cbc, pbkdf2, hmac, and sha2. We are thankful for the great work of the Rust Crypto project. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4229014037"] = "When transferring sensitive data between Rust runtime and .NET app, we encrypt the data. We use some libraries from the Rust Crypto project for this purpose: cipher, aes, cbc, pbkdf2, hmac, and sha2. We are thankful for the great work of the Rust Crypto project." + +-- This is a library providing the foundations for asynchronous programming in Rust. It includes key trait definitions like Stream, as well as utilities like join!, select!, and various futures combinator methods which enable expressive asynchronous control flow. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T566998575"] = "This is a library providing the foundations for asynchronous programming in Rust. It includes key trait definitions like Stream, as well as utilities like join!, select!, and various futures combinator methods which enable expressive asynchronous control flow." + +-- Used .NET SDK +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T585329785"] = "Used .NET SDK" + +-- Did you find a bug or are you experiencing issues? Report your concern here. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T639371534"] = "Did you find a bug or are you experiencing issues? Report your concern here." + +-- This Rust library is used to output the app's messages to the terminal. This is helpful during development and troubleshooting. This feature is initially invisible; when the app is started via the terminal, the messages become visible. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T64689067"] = "This Rust library is used to output the app's messages to the terminal. This is helpful during development and troubleshooting. This feature is initially invisible; when the app is started via the terminal, the messages become visible." + +-- For some data transfers, we need to encode the data in base64. This Rust library is great for this purpose. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T870640199"] = "For some data transfers, we need to encode the data in base64. This Rust library is great for this purpose." + +-- Get coding and debugging support from an LLM. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1243850917"] = "Get coding and debugging support from an LLM." + +-- Business +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T131837803"] = "Business" + +-- Legal Check +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1348190638"] = "Legal Check" + +-- General +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1432485131"] = "General" + +-- Grammar & Spelling +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1514925962"] = "Grammar & Spelling" + +-- Assistants +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1614176092"] = "Assistants" + +-- Coding +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1617786407"] = "Coding" + +-- Analyze a text or an email for tasks you need to complete. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1728590051"] = "Analyze a text or an email for tasks you need to complete." + +-- Text Summarizer +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1907192403"] = "Text Summarizer" + +-- Check grammar and spelling of a given text. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1934717573"] = "Check grammar and spelling of a given text." + +-- Translate text into another language. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T209791153"] = "Translate text into another language." + +-- Generate an e-mail for a given context. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2383649630"] = "Generate an e-mail for a given context." + +-- Generate an agenda for a given meeting, seminar, etc. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2406168562"] = "Generate an agenda for a given meeting, seminar, etc." + +-- Agenda Planner +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2435638853"] = "Agenda Planner" + +-- Synonyms +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2547582747"] = "Synonyms" + +-- Find synonyms for a given word or phrase. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2712131461"] = "Find synonyms for a given word or phrase." + +-- AI Studio Development +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2830810750"] = "AI Studio Development" + +-- Generate a job posting for a given job description. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2831103254"] = "Generate a job posting for a given job description." + +-- My Tasks +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3011450657"] = "My Tasks" + +-- E-Mail +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3026443472"] = "E-Mail" + +-- Translate AI Studio text content into other languages +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3181803840"] = "Translate AI Studio text content into other languages" + +-- Software Engineering +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3260960011"] = "Software Engineering" + +-- Rewrite & Improve +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3309133329"] = "Rewrite & Improve" + +-- Icon Finder +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3693102312"] = "Icon Finder" + +-- Generate an ERI server to integrate business systems. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3756213118"] = "Generate an ERI server to integrate business systems." + +-- Use an LLM to find an icon for a given context. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3881504200"] = "Use an LLM to find an icon for a given context." + +-- Job Posting +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3930052338"] = "Job Posting" + +-- Ask a question about a legal document. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3970214537"] = "Ask a question about a legal document." + +-- ERI Server +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T4204533420"] = "ERI Server" + +-- Use an LLM to summarize a given text. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T502222021"] = "Use an LLM to summarize a given text." + +-- Translation +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T613888204"] = "Translation" + +-- Rewrite and improve a given text for a chosen style. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T722167136"] = "Rewrite and improve a given text for a chosen style." + +-- Learning +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T755590027"] = "Learning" + +-- Bias of the Day +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T782102948"] = "Bias of the Day" + +-- Learn about one cognitive bias every day. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T878695986"] = "Learn about one cognitive bias every day." + +-- Localization +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T897888480"] = "Localization" + +-- Hide your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2351468526"] = "Hide your workspaces" + +-- Open Chat Options +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2813205227"] = "Open Chat Options" + +-- Disappearing Chat +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T3046519404"] = "Disappearing Chat" + +-- Configure your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T3586092784"] = "Configure your workspaces" + +-- Your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T3745240468"] = "Your workspaces" + +-- Open Workspaces Configuration +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T383344787"] = "Open Workspaces Configuration" + +-- Show the chat options +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T4132756393"] = "Show the chat options" + +-- Chat in Workspace +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T582100343"] = "Chat in Workspace" + +-- Show your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T733672375"] = "Show your workspaces" + +-- Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1009708591"] = "Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API." + +-- Welcome to MindWork AI Studio! +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1024253064"] = "Welcome to MindWork AI Studio!" + +-- Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1146553980"] = "Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider." + +-- The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T144565305"] = "The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life." + +-- You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T149711988"] = "You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit." + +-- Assistants +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1614176092"] = "Assistants" + +-- Unrestricted usage +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1686815996"] = "Unrestricted usage" + +-- Introduction +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1702902297"] = "Introduction" + +-- Vision +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1892426825"] = "Vision" + +-- You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT4o, o1, etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), Hugging Face, and self-hosted models using llama.cpp, ollama, LM Studio, Groq, or Fireworks. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2217921237"] = "You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT4o, o1, etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), Hugging Face, and self-hosted models using llama.cpp, ollama, LM Studio, Groq, or Fireworks. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities." + +-- Let's get started +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2331588413"] = "Let's get started" + +-- Last Changelog +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2348849647"] = "Last Changelog" + +-- Choose the provider and model best suited for your current task. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2588488920"] = "Choose the provider and model best suited for your current task." + +-- Quick Start Guide +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3002014720"] = "Quick Start Guide" + +-- You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3228075421"] = "You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants." + +-- We hope you enjoy using MindWork AI Studio to bring your AI projects to life! +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3275341342"] = "We hope you enjoy using MindWork AI Studio to bring your AI projects to life!" + +-- Cost-effective +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3341379752"] = "Cost-effective" + +-- Flexibility +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3723223888"] = "Flexibility" + +-- Privacy +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3959064551"] = "Privacy" + +-- You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T457410099"] = "You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems." + +-- Free of charge +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T617579208"] = "Free of charge" + +-- Independence +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T649448159"] = "Independence" + +-- No bloatware +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T858047957"] = "No bloatware" + +-- Here's what makes MindWork AI Studio stand out: +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T873851215"] = "Here's what makes MindWork AI Studio stand out:" + +-- The app is free to use, both for personal and commercial purposes. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T91074375"] = "The app is free to use, both for personal and commercial purposes." + +-- Disable plugin +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T1430375822"] = "Disable plugin" + +-- Internal Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T158493184"] = "Internal Plugins" + +-- Disabled Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T1724138133"] = "Disabled Plugins" + +-- Enable plugin +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T2057806005"] = "Enable plugin" + +-- Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T2222816203"] = "Plugins" + +-- Enabled Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T2738444034"] = "Enabled Plugins" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3865031940"] = "Actions" + +-- Settings +UI_TEXT_CONTENT["AISTUDIO::PAGES::SETTINGS::T1258653480"] = "Settings" + +-- Thank you for being the first to contribute a one-time donation. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1470916504"] = "Thank you for being the first to contribute a one-time donation." + +-- Thank you, Peer, for your courage in being the second person to support the project financially. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1714878838"] = "Thank you, Peer, for your courage in being the second person to support the project financially." + +-- Individual Contributors +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1874835680"] = "Individual Contributors" + +-- Thanks, Nils, for taking the time to learn Rust and build the foundation for local retrieval. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2355807535"] = "Thanks, Nils, for taking the time to learn Rust and build the foundation for local retrieval." + +-- The first 10 supporters who make a one-time contribution: +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2410456125"] = "The first 10 supporters who make a one-time contribution:" + +-- We would like to thank the DLR for its courage in supporting MindWork AI Studio at an early stage. The DLR not only uses AI Studio in various projects but also supports its further development with personnel resources. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2438064678"] = "We would like to thank the DLR for its courage in supporting MindWork AI Studio at an early stage. The DLR not only uses AI Studio in various projects but also supports its further development with personnel resources." + +-- Become one of our titans +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2640760894"] = "Become one of our titans" + +-- Supporters +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2929332068"] = "Supporters" + +-- Content Contributors +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3060804484"] = "Content Contributors" + +-- Financial Support +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3061261435"] = "Financial Support" + +-- German Aerospace Center (DLR) +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3264998714"] = "German Aerospace Center (DLR)" + +-- The first 10 supporters who make a monthly contribution: +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3364384944"] = "The first 10 supporters who make a monthly contribution:" + +-- Thank you, Richard, for being the first. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3660718138"] = "Thank you, Richard, for being the first." + +-- Thanks Dominic for being the third supporter. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3664780201"] = "Thanks Dominic for being the third supporter." + +-- Our Titans +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3805270964"] = "Our Titans" + +-- Moderation, Design, Wiki, and Documentation +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3821668394"] = "Moderation, Design, Wiki, and Documentation" + +-- Thank you, Peer, for familiarizing yourself with C#, providing excellent contributions like the Alibaba and Hugging Face providers, and revising the settings management. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4106820759"] = "Thank you, Peer, for familiarizing yourself with C#, providing excellent contributions like the Alibaba and Hugging Face providers, and revising the settings management." + +-- Code Contributions +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4135925647"] = "Code Contributions" + +-- Become a contributor +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T414604046"] = "Become a contributor" + +-- In this section, we highlight the titan supporters of MindWork AI Studio. Titans are prestigious companies that provide significant support to our mission. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4270177642"] = "In this section, we highlight the titan supporters of MindWork AI Studio. Titans are prestigious companies that provide significant support to our mission." + +-- Thanks Luc for your build script contribution. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T432023389"] = "Thanks Luc for your build script contribution." + +-- For companies, sponsoring MindWork AI Studio is not only a way to support innovation but also a valuable opportunity for public relations and marketing. Your company's name and logo will be featured prominently, showcasing your commitment to using cutting-edge AI tools and enhancing your reputation as an innovative enterprise. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T68519158"] = "For companies, sponsoring MindWork AI Studio is not only a way to support innovation but also a valuable opportunity for public relations and marketing. Your company's name and logo will be featured prominently, showcasing your commitment to using cutting-edge AI tools and enhancing your reputation as an innovative enterprise." + +-- Thanks for your build script contribution. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T686206269"] = "Thanks for your build script contribution." + +-- Business Contributors +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T838479287"] = "Business Contributors" + +-- Thank you very much, Kerstin, for taking care of creating the Wiki. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T991294232"] = "Thank you very much, Kerstin, for taking care of creating the Wiki." + +-- Write your text +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T2220943334"] = "Write your text" + +-- Writer +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T2979224202"] = "Writer" + +-- Suggestion +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T3948127789"] = "Suggestion" + +-- Your stage directions +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T779923726"] = "Your stage directions" + +-- Tried to communicate with the LLM provider '{0}'. The API key might be invalid. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1073493061"] = "Tried to communicate with the LLM provider '{0}'. The API key might be invalid. The provider message is: '{1}'" + +-- Tried to stream the LLM provider '{0}' answer. There were some problems with the stream. The message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1487597412"] = "Tried to stream the LLM provider '{0}' answer. There were some problems with the stream. The message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. The required message format might be changed. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1674355816"] = "Tried to communicate with the LLM provider '{0}'. The required message format might be changed. The provider message is: '{1}'" + +-- Tried to stream the LLM provider '{0}' answer. Was not able to read the stream. The message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1856278860"] = "Tried to stream the LLM provider '{0}' answer. Was not able to read the stream. The message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. Even after {1} retries, there were some problems with the request. The provider message is: '{2}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T2249520705"] = "Tried to communicate with the LLM provider '{0}'. Even after {1} retries, there were some problems with the request. The provider message is: '{2}'" + +-- Tried to communicate with the LLM provider '{0}'. Something was not found. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T2780552614"] = "Tried to communicate with the LLM provider '{0}'. Something was not found. The provider message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. There were some problems with the request. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T3573577433"] = "Tried to communicate with the LLM provider '{0}'. There were some problems with the request. The provider message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. The server might be down or having issues. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T3806716694"] = "Tried to communicate with the LLM provider '{0}'. The server might be down or having issues. The provider message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. The provider is overloaded. The message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T4179546180"] = "Tried to communicate with the LLM provider '{0}'. The provider is overloaded. The message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. You might not be able to use this provider from your location. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T862369179"] = "Tried to communicate with the LLM provider '{0}'. You might not be able to use this provider from your location. The provider message is: '{1}'" + +-- The trust level of this provider **has not yet** been thoroughly **investigated and evaluated**. We do not know if your data is safe. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T1014558951"] = "The trust level of this provider **has not yet** been thoroughly **investigated and evaluated**. We do not know if your data is safe." + +-- You or your organization operate the LLM locally or within your trusted network. In terms of data processing and security, this is the best possible way. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T2124364471"] = "You or your organization operate the LLM locally or within your trusted network. In terms of data processing and security, this is the best possible way." + +-- The provider is located in the EU and is subject to the **GDPR** (General Data Protection Regulation). Additionally, the provider states that **your data is not used for training**. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3010553924"] = "The provider is located in the EU and is subject to the **GDPR** (General Data Protection Regulation). Additionally, the provider states that **your data is not used for training**." + +-- No provider selected. Please select a provider to get see its confidence level. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3368531176"] = "No provider selected. Please select a provider to get see its confidence level." + +-- The provider operates its service from the USA and is subject to **US jurisdiction**. In case of suspicion, authorities in the USA can access your data. However, **your data is not used for training** purposes. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3528165925"] = "The provider operates its service from the USA and is subject to **US jurisdiction**. In case of suspicion, authorities in the USA can access your data. However, **your data is not used for training** purposes." + +-- The provider operates its service from the USA and is subject to **U.S. jurisdiction**. In case of suspicion, authorities in the USA can access your data. Please inform yourself about the use of your data. We do not know if your data is safe. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3788466789"] = "The provider operates its service from the USA and is subject to **U.S. jurisdiction**. In case of suspicion, authorities in the USA can access your data. Please inform yourself about the use of your data. We do not know if your data is safe." + +-- The provider operates its service from China. In case of suspicion, authorities in the respective countries of operation may access your data. However, **your data is not used for training** purposes. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T991875725"] = "The provider operates its service from China. In case of suspicion, authorities in the respective countries of operation may access your data. However, **your data is not used for training** purposes." + +-- Medium +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T163471254"] = "Medium" + +-- Moderate +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T177463328"] = "Moderate" + +-- Unknown confidence level +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T1811522309"] = "Unknown confidence level" + +-- No provider selected +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T2897045472"] = "No provider selected" + +-- Low +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T2984088865"] = "Low" + +-- Untrusted +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T3063224793"] = "Untrusted" + +-- High +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T3188327965"] = "High" + +-- Very Low +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T786675843"] = "Very Low" + +-- Self-hosted +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::LLMPROVIDERSEXTENSIONS::T146444217"] = "Self-hosted" + +-- No provider selected +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::LLMPROVIDERSEXTENSIONS::T2897045472"] = "No provider selected" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::LLMPROVIDERSEXTENSIONS::T3424652889"] = "Unknown" + +-- no model selected +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::MODEL::T2234274832"] = "no model selected" + +-- Use no chat template +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CHATTEMPLATE::T4258819635"] = "Use no chat template" + +-- Navigation never expands, but there are tooltips +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1095779033"] = "Navigation never expands, but there are tooltips" + +-- Check every day +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1112287590"] = "Check every day" + +-- Toggle the overlay: the chat uses all the space, workspaces are temporarily shown +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1114668646"] = "Toggle the overlay: the chat uses all the space, workspaces are temporarily shown" + +-- Sidebar is always visible: show the workspaces next to the chat all the time +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1149606444"] = "Sidebar is always visible: show the workspaces next to the chat all the time" + +-- Always use the default chat provider when loading chats +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1188453609"] = "Always use the default chat provider when loading chats" + +-- Show also prototype features: these are works in progress; expect bugs and missing features +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1245257804"] = "Show also prototype features: these are works in progress; expect bugs and missing features" + +-- No key is sending the input +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1311973034"] = "No key is sending the input" + +-- Navigation never expands, no tooltips +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1402851833"] = "Navigation never expands, no tooltips" + +-- Store chats automatically +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1664293672"] = "Store chats automatically" + +-- Once at startup +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T184455356"] = "Once at startup" + +-- No automatic update checks +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1874928511"] = "No automatic update checks" + +-- Always expand navigation +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1991359958"] = "Always expand navigation" + +-- Show also experimental features: these are experimental; expect bugs, missing features, many changes +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2091731959"] = "Show also experimental features: these are experimental; expect bugs, missing features, many changes" + +-- Use the latest LLM provider, which was used before; use the default chat provider initially +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2128088682"] = "Use the latest LLM provider, which was used before; use the default chat provider initially" + +-- Navigation expands on mouse hover +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2195945406"] = "Navigation expands on mouse hover" + +-- Also show features ready for release; these should be stable +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2301448762"] = "Also show features ready for release; these should be stable" + +-- Check every week +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T238099712"] = "Check every week" + +-- Delete disappearing chats older than 1 year +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2405705561"] = "Delete disappearing chats older than 1 year" + +-- Store chats manually +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2520325466"] = "Store chats manually" + +-- Enter is sending the input +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2537778562"] = "Enter is sending the input" + +-- Not yet specified +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2566503670"] = "Not yet specified" + +-- No minimum confidence level chosen +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2828607242"] = "No minimum confidence level chosen" + +-- Do not specify the language +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2960082609"] = "Do not specify the language" + +-- Delete disappearing chats older than 7 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2975140581"] = "Delete disappearing chats older than 7 days" + +-- Always use the default chat provider for new chats +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2976921892"] = "Always use the default chat provider for new chats" + +-- Also show features in beta: these are almost ready for release; expect some bugs +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3061414822"] = "Also show features in beta: these are almost ready for release; expect some bugs" + +-- Check every hour +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3137986690"] = "Check every hour" + +-- Delete disappearing chats older than 180 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3491430707"] = "Delete disappearing chats older than 180 days" + +-- Disable workspaces +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3612390107"] = "Disable workspaces" + +-- Toggle the sidebar: show the workspaces next to the chat when desired +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3711207137"] = "Toggle the sidebar: show the workspaces next to the chat when desired" + +-- Also show features in alpha: these are in development; expect bugs and missing features +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4146964761"] = "Also show features in alpha: these are in development; expect bugs and missing features" + +-- All preview features are hidden +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4289410063"] = "All preview features are hidden" + +-- When possible, use the LLM provider which was used for each chat in the first place +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T75376144"] = "When possible, use the LLM provider which was used for each chat in the first place" + +-- No automatic maintenance for disappearing chats; old chats will never be deleted +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T803751240"] = "No automatic maintenance for disappearing chats; old chats will never be deleted" + +-- Delete disappearing chats older than 90 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T869922627"] = "Delete disappearing chats older than 90 days" + +-- Modifier key + enter is sending the input +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T870850829"] = "Modifier key + enter is sending the input" + +-- Delete disappearing chats older than 30 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T937754037"] = "Delete disappearing chats older than 30 days" + +-- This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T1531417967"] = "This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider." + +-- This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T3187068849"] = "This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider." + +-- Please select a security policy +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T3511915070"] = "Please select a security policy" + +-- The security of the data source is not specified yet. You cannot use this data source until you specify a security policy. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T4056804813"] = "The security of the data source is not specified yet. You cannot use this data source until you specify a security policy." + +-- Unknown security policy +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T4277536697"] = "Unknown security policy" + +-- Local File +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T1687345358"] = "Local File" + +-- External ERI Server (v1) +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T3020093889"] = "External ERI Server (v1)" + +-- None +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T810547195"] = "None" + +-- Local Directory +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T926703547"] = "Local Directory" + +-- Unknown option +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::LANGBEHAVIOREXTENSIONS::T3964902774"] = "Unknown option" + +-- Choose the language manually. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::LANGBEHAVIOREXTENSIONS::T3988034966"] = "Choose the language manually." + +-- Choose the language automatically, based on your system language. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::LANGBEHAVIOREXTENSIONS::T485389934"] = "Choose the language automatically, based on your system language." + +-- Writer Mode: Experiments about how to write long texts using AI +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T158702544"] = "Writer Mode: Experiments about how to write long texts using AI" + +-- Read PDF: Preview of our PDF reading system where you can read and extract text from PDF files +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T1847148141"] = "Read PDF: Preview of our PDF reading system where you can read and extract text from PDF files" + +-- Plugins: Preview of our plugin system where you can extend the functionality of the app +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T2056842933"] = "Plugins: Preview of our plugin system where you can extend the functionality of the app" + +-- RAG: Preview of our RAG implementation where you can refer your files or integrate enterprise data within your company +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T2708939138"] = "RAG: Preview of our RAG implementation where you can refer your files or integrate enterprise data within your company" + +-- Unknown preview feature +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T2722827307"] = "Unknown preview feature" + +-- Use no data sources, when sending an assistant result to a chat +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::SENDTOCHATDATASOURCEBEHAVIOREXTENSIONS::T1223925477"] = "Use no data sources, when sending an assistant result to a chat" + +-- Unknown behavior +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::SENDTOCHATDATASOURCEBEHAVIOREXTENSIONS::T1394162669"] = "Unknown behavior" + +-- Apply standard chat data source options, when sending an assistant result to a chat +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::SENDTOCHATDATASOURCEBEHAVIOREXTENSIONS::T2129722199"] = "Apply standard chat data source options, when sending an assistant result to a chat" + +-- Always use dark theme +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T197192304"] = "Always use dark theme" + +-- Synchronized with the operating system settings +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T1987547483"] = "Synchronized with the operating system settings" + +-- Unknown setting +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T4107955313"] = "Unknown setting" + +-- Always use light theme +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T534715610"] = "Always use light theme" + +-- Use no profile +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::PROFILE::T2205839602"] = "Use no profile" + +-- SSO (Kerberos) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T268552140"] = "SSO (Kerberos)" + +-- Access Token +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T2891154022"] = "Access Token" + +-- Unknown authentication method +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T3296465240"] = "Unknown authentication method" + +-- None +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T810547195"] = "None" + +-- Username & Password +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T863358904"] = "Username & Password" + +-- Spanish (Spain) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1269145091"] = "Spanish (Spain)" + +-- German (Germany) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T133055431"] = "German (Germany)" + +-- Other +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1849229205"] = "Other" + +-- German (Switzerland) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1914931075"] = "German (Switzerland)" + +-- German (Austria) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1992157553"] = "German (Austria)" + +-- Japanese (Japan) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2064802889"] = "Japanese (Japan)" + +-- French (France) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2496010681"] = "French (France)" + +-- Please select the target language +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2536245199"] = "Please select the target language" + +-- Do not specify the language +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2960082609"] = "Do not specify the language" + +-- Hindi (India) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3245596873"] = "Hindi (India)" + +-- Chinese (Simplified) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3441562249"] = "Chinese (Simplified)" + +-- English (US) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3729684486"] = "English (US)" + +-- English (UK) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3730964414"] = "English (UK)" + +-- Russian (Russia) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T4187368718"] = "Russian (Russia)" + +-- Do not change the language +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T658789330"] = "Do not change the language" + +-- Coding Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1082499335"] = "Coding Assistant" + +-- E-Mail Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1185802704"] = "E-Mail Assistant" + +-- My Tasks Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1546040625"] = "My Tasks Assistant" + +-- Grammar & Spelling Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T166453786"] = "Grammar & Spelling Assistant" + +-- Legal Check Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1886447798"] = "Legal Check Assistant" + +-- Job Posting Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2212811874"] = "Job Posting Assistant" + +-- Icon Finder Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2457005512"] = "Icon Finder Assistant" + +-- Text Summarizer Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2684676843"] = "Text Summarizer Assistant" + +-- Synonym Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2921123194"] = "Synonym Assistant" + +-- Translation Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T3887962308"] = "Translation Assistant" + +-- Agenda Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T4034795997"] = "Agenda Assistant" + +-- ERI Server +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T4204533420"] = "ERI Server" + +-- Rewrite Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T4262148639"] = "Rewrite Assistant" + +-- Localization Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T446674624"] = "Localization Assistant" + +-- New Chat +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T826248509"] = "New Chat" + +-- Trust LLM providers from the USA +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T1748300640"] = "Trust LLM providers from the USA" + +-- Configure your own confidence scheme +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T2017415465"] = "Configure your own confidence scheme" + +-- Trust LLM providers from the USA and Europe +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T2498514901"] = "Trust LLM providers from the USA and Europe" + +-- Unknown confidence scheme +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T292756058"] = "Unknown confidence scheme" + +-- Trust LLM providers from Asia +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T3016210842"] = "Trust LLM providers from Asia" + +-- Trust LLM providers from Europe +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T357239630"] = "Trust LLM providers from Europe" + +-- Trust only local LLM providers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T3893997203"] = "Trust only local LLM providers" + +-- Trust all LLM providers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T4107860491"] = "Trust all LLM providers" + +-- The related data is not allowed to be sent to any LLM provider. This means that this data source cannot be used at the moment. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T1555790630"] = "The related data is not allowed to be sent to any LLM provider. This means that this data source cannot be used at the moment." + +-- The related data can be sent to any provider, regardless of where it is hosted (cloud or self-hosted). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T2031831095"] = "The related data can be sent to any provider, regardless of where it is hosted (cloud or self-hosted)." + +-- The related data can be sent to a provider that is hosted by the same organization, either on-premises or locally. Cloud-based providers are not allowed. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T2943101676"] = "The related data can be sent to a provider that is hosted by the same organization, either on-premises or locally. Cloud-based providers are not allowed." + +-- Unknown configuration. This data source cannot be used at the moment. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T647911863"] = "Unknown configuration. This data source cannot be used at the moment." + +-- Failed to execute the retrieval request: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1270753490"] = "Failed to execute the retrieval request: the request was canceled either by the user or due to a timeout." + +-- Failed to retrieve the embedding information: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1368217771"] = "Failed to retrieve the embedding information: the ERI server did not return a valid response." + +-- Failed to retrieve the password. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1460025425"] = "Failed to retrieve the password." + +-- Failed to authenticate with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1741376192"] = "Failed to authenticate with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to retrieve the security requirements: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1931074357"] = "Failed to retrieve the security requirements: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to execute the retrieval request due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1951868505"] = "Failed to execute the retrieval request due to an exception: {0}" + +-- Failed to execute the retrieval request: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1978354870"] = "Failed to execute the retrieval request: the ERI server did not return a valid response." + +-- Failed to retrieve the security requirements: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T231684456"] = "Failed to retrieve the security requirements: the ERI server did not return a valid response." + +-- Failed to authenticate with the server: the response was invalid. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2332248448"] = "Failed to authenticate with the server: the response was invalid." + +-- Failed to retrieve the embedding information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2368384424"] = "Failed to retrieve the embedding information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to retrieve the authentication methods: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2482165925"] = "Failed to retrieve the authentication methods: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- The authentication method is not supported yet. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2536034936"] = "The authentication method is not supported yet." + +-- Failed to authenticate with the ERI server: the response was invalid. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2549452166"] = "Failed to authenticate with the ERI server: the response was invalid." + +-- Failed to retrieve the retrieval information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2558778293"] = "Failed to retrieve the retrieval information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to authenticate with the ERI server: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2673501628"] = "Failed to authenticate with the ERI server: the request was canceled either by the user or due to a timeout." + +-- Failed to authenticate with the ERI server due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2858189239"] = "Failed to authenticate with the ERI server due to an exception: {0}" + +-- Failed to retrieve the security requirements: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T286437836"] = "Failed to retrieve the security requirements: the request was canceled either by the user or due to a timeout." + +-- Failed to retrieve the security requirements due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3221004295"] = "Failed to retrieve the security requirements due to an exception: {0}" + +-- Failed to retrieve the data source information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3290521480"] = "Failed to retrieve the data source information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to retrieve the data source information due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3354496288"] = "Failed to retrieve the data source information due to an exception: {0}" + +-- Failed to retrieve the authentication methods due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3366487415"] = "Failed to retrieve the authentication methods due to an exception: {0}" + +-- Failed to retrieve the authentication methods: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3654094460"] = "Failed to retrieve the authentication methods: the request was canceled either by the user or due to a timeout." + +-- Failed to retrieve the retrieval information: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3721797352"] = "Failed to retrieve the retrieval information: the ERI server did not return a valid response." + +-- Failed to retrieve the retrieval information: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3809548876"] = "Failed to retrieve the retrieval information: the request was canceled either by the user or due to a timeout." + +-- Failed to retrieve the retrieval information due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3862033799"] = "Failed to retrieve the retrieval information due to an exception: {0}" + +-- Failed to retrieve the data source information: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T4006612619"] = "Failed to retrieve the data source information: the ERI server did not return a valid response." + +-- Failed to retrieve the embedding information: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T469891013"] = "Failed to retrieve the embedding information: the request was canceled either by the user or due to a timeout." + +-- Failed to execute the retrieval request: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T615338311"] = "Failed to execute the retrieval request: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to retrieve the data source information: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T690733413"] = "Failed to retrieve the data source information: the request was canceled either by the user or due to a timeout." + +-- Failed to retrieve the embedding information due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T765050112"] = "Failed to retrieve the embedding information due to an exception: {0}" + +-- Failed to retrieve the access token. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T816853779"] = "Failed to retrieve the access token." + +-- Failed to retrieve the authentication methods: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T984407320"] = "Failed to retrieve the authentication methods: the ERI server did not return a valid response." + +-- The table AUTHORS does not exist or is using an invalid syntax. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1068328139"] = "The table AUTHORS does not exist or is using an invalid syntax." + +-- The field NAME does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1340447036"] = "The field NAME does not exist or is not a valid string." + +-- The field SOURCE_URL does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1421846488"] = "The field SOURCE_URL does not exist or is not a valid string." + +-- The field VERSION does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T148801541"] = "The field VERSION does not exist or is not a valid string." + +-- The table CATEGORIES does not exist or is using an invalid syntax. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1505723383"] = "The table CATEGORIES does not exist or is using an invalid syntax." + +-- The table TARGET_GROUPS is empty or is not a valid table of strings. Valid target groups are: {0}. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1619769690"] = "The table TARGET_GROUPS is empty or is not a valid table of strings. Valid target groups are: {0}." + +-- The field ID is empty. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1733171739"] = "The field ID is empty. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)." + +-- The field VERSION is empty. The version number must be formatted as string in the major.minor.patch format (X.X.X). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2115845776"] = "The field VERSION is empty. The version number must be formatted as string in the major.minor.patch format (X.X.X)." + +-- The field ID does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2203072274"] = "The field ID does not exist or is not a valid string." + +-- The field DESCRIPTION is empty. The description must be a non-empty string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2262604281"] = "The field DESCRIPTION is empty. The description must be a non-empty string." + +-- The field DESCRIPTION does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T229488255"] = "The field DESCRIPTION does not exist or is not a valid string." + +-- The field SOURCE_URL is not a valid URL. The URL must start with 'http://' or 'https://'. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2320984047"] = "The field SOURCE_URL is not a valid URL. The URL must start with 'http://' or 'https://'." + +-- The field VERSION is not a valid version number. The version number must be formatted as string in the major.minor.patch format (X.X.X). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2538827536"] = "The field VERSION is not a valid version number. The version number must be formatted as string in the major.minor.patch format (X.X.X)." + +-- The table AUTHORS is empty. At least one author must be specified. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2981832540"] = "The table AUTHORS is empty. At least one author must be specified." + +-- The field SUPPORT_CONTACT is empty. The support contact must be a non-empty string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3524814526"] = "The field SUPPORT_CONTACT is empty. The support contact must be a non-empty string." + +-- The UI_TEXT_CONTENT table does not exist or is not a valid table. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3667396132"] = "The UI_TEXT_CONTENT table does not exist or is not a valid table." + +-- The field NAME is empty. The name must be a non-empty string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3763759727"] = "The field NAME is empty. The name must be a non-empty string." + +-- The field DEPRECATION_MESSAGE does not exist, is not a valid string. This message is optional: use an empty string to indicate that the plugin is not deprecated. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3890922974"] = "The field DEPRECATION_MESSAGE does not exist, is not a valid string. This message is optional: use an empty string to indicate that the plugin is not deprecated." + +-- The field SUPPORT_CONTACT does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T4189964941"] = "The field SUPPORT_CONTACT does not exist or is not a valid string." + +-- The table TARGET_GROUPS does not exist or is using an invalid syntax. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T447530369"] = "The table TARGET_GROUPS does not exist or is using an invalid syntax." + +-- The field ID is not a valid GUID / UUID. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T471697173"] = "The field ID is not a valid GUID / UUID. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)." + +-- The table CATEGORIES is empty. At least one category is necessary. Valid categories are: {0}. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T529114360"] = "The table CATEGORIES is empty. At least one category is necessary. Valid categories are: {0}." + +-- The field IS_MAINTAINED does not exist or is not a valid boolean. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T773237915"] = "The field IS_MAINTAINED does not exist or is not a valid boolean." + +-- Writing +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1011777007"] = "Writing" + +-- Software Development +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1025369409"] = "Software Development" + +-- Business +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T131837803"] = "Business" + +-- Music +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1481252212"] = "Music" + +-- Unknown plugin category +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1585885320"] = "Unknown plugin category" + +-- Weather +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1726658099"] = "Weather" + +-- Industry +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T208409567"] = "Industry" + +-- Art +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2449163306"] = "Art" + +-- Sports +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2465108186"] = "Sports" + +-- Technology +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2499534031"] = "Technology" + +-- Health +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2556511663"] = "Health" + +-- Utility +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2587055103"] = "Utility" + +-- Shopping +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2704337693"] = "Shopping" + +-- Fitness +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2892517655"] = "Fitness" + +-- Food +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3179069417"] = "Food" + +-- Gaming +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3246118672"] = "Gaming" + +-- News +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3421767782"] = "News" + +-- Entertainment +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3562575449"] = "Entertainment" + +-- Education +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T379048501"] = "Education" + +-- AI Studio Core +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T4005865962"] = "AI Studio Core" + +-- Social +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T4177547506"] = "Social" + +-- Political +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T4245273692"] = "Political" + +-- Fiction +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T616807299"] = "Fiction" + +-- Travel +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T745861401"] = "Travel" + +-- None +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T810547195"] = "None" + +-- Party +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T850565431"] = "Party" + +-- Science +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T904504157"] = "Science" + +-- Content Creation +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T914642375"] = "Content Creation" + +-- The field IETF_TAG does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T1796010240"] = "The field IETF_TAG does not exist or is not a valid string." + +-- The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T3376221777"] = "The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code." + +-- The field IETF_TAG is empty. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T3877047896"] = "The field IETF_TAG is empty. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code." + +-- The field LANG_NAME is empty. Use a valid language name. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T4112586014"] = "The field LANG_NAME is empty. Use a valid language name." + +-- The field LANG_NAME does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T4204700759"] = "The field LANG_NAME does not exist or is not a valid string." + +-- Artists +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T1142248183"] = "Artists" + +-- Children +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T188567026"] = "Children" + +-- Industrial workers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T2520336817"] = "Industrial workers" + +-- Students +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T2905889225"] = "Students" + +-- Scientists +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T332785734"] = "Scientists" + +-- Adults +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3335941460"] = "Adults" + +-- No target group +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3644477204"] = "No target group" + +-- Business professionals +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3670621687"] = "Business professionals" + +-- Teenagers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3696960735"] = "Teenagers" + +-- Unknown target group +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T384321997"] = "Unknown target group" + +-- Office workers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3873911022"] = "Office workers" + +-- Teachers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T48460338"] = "Teachers" + +-- Everyone +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T622959000"] = "Everyone" + +-- Software developers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T831424531"] = "Software developers" + +-- Theme plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T1682350097"] = "Theme plugin" + +-- Unknown plugin type +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T2313808600"] = "Unknown plugin type" + +-- Assistant plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T2321563994"] = "Assistant plugin" + +-- Language plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T2370593926"] = "Language plugin" + +-- Configuration plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T3353383632"] = "Configuration plugin" + +-- Standard augmentation process +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::AUGMENTATIONPROCESSES::AUGMENTATIONONE::T1072508429"] = "Standard augmentation process" + +-- This is the standard augmentation process, which uses all retrieval contexts to augment the chat thread. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::AUGMENTATIONPROCESSES::AUGMENTATIONONE::T3240406069"] = "This is the standard augmentation process, which uses all retrieval contexts to augment the chat thread." + +-- Automatic AI data source selection with heuristik source reduction +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::DATASOURCESELECTIONPROCESSES::AGENTICSRCSELWITHDYNHEUR::T2339257645"] = "Automatic AI data source selection with heuristik source reduction" + +-- Automatically selects the appropriate data sources based on the last prompt. Applies a heuristic reduction at the end to reduce the number of data sources. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::DATASOURCESELECTIONPROCESSES::AGENTICSRCSELWITHDYNHEUR::T648937779"] = "Automatically selects the appropriate data sources based on the last prompt. Applies a heuristic reduction at the end to reduce the number of data sources." + +-- This RAG process filters data sources, automatically selects appropriate sources, optionally allows manual source selection, retrieves data, and automatically validates the retrieval context. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T3047786484"] = "This RAG process filters data sources, automatically selects appropriate sources, optionally allows manual source selection, retrieves data, and automatically validates the retrieval context." + +-- AI source selection with AI retrieval context validation +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T3775725978"] = "AI source selection with AI retrieval context validation" + +-- PDF Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T3108466742"] = "PDF Files" + +-- All Image Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T4086723714"] = "All Image Files" + +-- Text Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T639143005"] = "Text Files" + +-- All Office Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T709668067"] = "All Office Files" + +-- Failed to delete the API key due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::APIKEYS::T3658273365"] = "Failed to delete the API key due to an API issue." + +-- Failed to get the API key due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::APIKEYS::T3875720022"] = "Failed to get the API key due to an API issue." + +-- Successfully copied the text to your clipboard +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::CLIPBOARD::T3351807428"] = "Successfully copied the text to your clipboard" + +-- Failed to copy the text to your clipboard. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::CLIPBOARD::T3724548108"] = "Failed to copy the text to your clipboard." + +-- Failed to delete the secret data due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::SECRETS::T2303057928"] = "Failed to delete the secret data due to an API issue." + +-- Failed to get the secret data due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::SECRETS::T4007657575"] = "Failed to get the secret data due to an API issue." + +-- No update found. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T1015418291"] = "No update found." + +-- The hostname is not a valid HTTP(S) URL. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1013354736"] = "The hostname is not a valid HTTP(S) URL." + +-- The connection test failed. Please check the connection settings. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T132896331"] = "The connection test failed. Please check the connection settings." + +-- Please select an embedding provider. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1461238528"] = "Please select an embedding provider." + +-- The file does not exist. Please select a valid file. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T148464502"] = "The file does not exist. Please select a valid file." + +-- Please select one retrieval process. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1515898234"] = "Please select one retrieval process." + +-- This data source can only be used with a self-hosted LLM provider. Please change the security policy. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1728967730"] = "This data source can only be used with a self-hosted LLM provider. Please change the security policy." + +-- The username must not be empty. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1829419906"] = "The username must not be empty." + +-- The hostname must start with either http:// or https:// +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T193387467"] = "The hostname must start with either http:// or https://" + +-- Please enter a hostname, e.g., http://localhost +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1990396672"] = "Please enter a hostname, e.g., http://localhost" + +-- Please select one valid authentication method. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T2025964684"] = "Please select one valid authentication method." + +-- The name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T2160507967"] = "The name must not exceed 40 characters." + +-- Please select your security policy. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T2250909198"] = "Please select your security policy." + +-- Please test the connection before saving. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T285470497"] = "Please test the connection before saving." + +-- Please enter your secure access token. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3086932434"] = "Please enter your secure access token." + +-- The path does not exist. Please select a valid directory. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3146272446"] = "The path does not exist. Please select a valid directory." + +-- The path must not be empty. Please select a directory. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3202118305"] = "The path must not be empty. Please select a directory." + +-- The name must not be empty. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3243861903"] = "The name must not be empty." + +-- Please enter your password. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3888492477"] = "Please enter your password." + +-- The port must be between 1 and 65535. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3965971107"] = "The port must be between 1 and 65535." + +-- The name is already used by another data source. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T4001510395"] = "The name is already used by another data source. Please choose a different name." + +-- Please acknowledge that you are aware of the cloud embedding implications. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T490875633"] = "Please acknowledge that you are aware of the cloud embedding implications." + +-- The file path must not be empty. Please select a file. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T878007824"] = "The file path must not be empty. Please select a file." + +-- Please enter the secret necessary for authentication. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T968385876"] = "Please enter the secret necessary for authentication." + +-- The hostname is not a valid HTTP(S) URL. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1013354736"] = "The hostname is not a valid HTTP(S) URL." + +-- The instance name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1117188308"] = "The instance name must not exceed 40 characters." + +-- Please enter a hostname, e.g., http://localhost:1234 +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T125334762"] = "Please enter a hostname, e.g., http://localhost:1234" + +-- The instance name must be unique; the chosen name is already in use. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1301966140"] = "The instance name must be unique; the chosen name is already in use." + +-- Please select a provider. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1809312323"] = "Please select a provider." + +-- The hostname must start with either http:// or https:// +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T193387467"] = "The hostname must start with either http:// or https://" + +-- Please select a host. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T2257097222"] = "Please select a host." + +-- Please enter an API key. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T3550629491"] = "Please enter an API key." + +-- Please enter an instance name. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T3999823516"] = "Please enter an instance name." + +-- Please select an Hugging Face inference provider. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T497939286"] = "Please select an Hugging Face inference provider." + +-- Please select a model. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T818893091"] = "Please select a model." + +-- Delete Chat +UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Delete Chat" diff --git a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor index 576558ac..278c8bb8 100644 --- a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor +++ b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor @@ -1,18 +1,22 @@ @attribute [Route(Routes.ASSISTANT_ICON_FINDER)] @inherits AssistantBaseCore - + - + @foreach (var source in Enum.GetValues()) { - @source.Name() + + @source.Name() + } @if (this.selectedIconSource is not IconSources.GENERIC) { - Open website + + @T("Open website") + } \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs index a071a81e..08d616d8 100644 --- a/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs +++ b/app/MindWork AI Studio/Assistants/IconFinder/AssistantIconFinder.razor.cs @@ -6,17 +6,9 @@ public partial class AssistantIconFinder : AssistantBaseCore Tools.Components.ICON_FINDER_ASSISTANT; - protected override string Title => "Icon Finder"; + protected override string Title => T("Icon Finder"); - protected override string Description => - """ - Finding the right icon for a context, such as for a piece of text, is not easy. The first challenge: - You need to extract a concept from your context, such as from a text. Let's take an example where - your text contains statements about multiple departments. The sought-after concept could be "departments." - The next challenge is that we need to anticipate the bias of the icon designers: under the search term - "departments," there may be no relevant icons or only unsuitable ones. Depending on the icon source, - it might be more effective to search for "buildings," for instance. LLMs assist you with both steps. - """; + protected override string Description => T("""Finding the right icon for a context, such as for a piece of text, is not easy. The first challenge: You need to extract a concept from your context, such as from a text. Let's take an example where your text contains statements about multiple departments. The sought-after concept could be "departments." The next challenge is that we need to anticipate the bias of the icon designers: under the search term "departments," there may be no relevant icons or only unsuitable ones. Depending on the icon source, it might be more effective to search for "buildings," for instance. LLMs assist you with both steps."""); protected override string SystemPrompt => """ @@ -31,7 +23,7 @@ public partial class AssistantIconFinder : AssistantBaseCore FooterButtons => []; - protected override string SubmitText => "Find Icon"; + protected override string SubmitText => T("Find Icon"); protected override Func SubmitAction => this.FindIcon; @@ -74,7 +66,7 @@ public partial class AssistantIconFinder : AssistantBaseCore - - - - - - - - - + + + + + + + + + - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor.cs b/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor.cs index 651824dd..21b183f0 100644 --- a/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor.cs +++ b/app/MindWork AI Studio/Assistants/JobPosting/AssistantJobPostings.razor.cs @@ -7,13 +7,9 @@ public partial class AssistantJobPostings : AssistantBaseCore Tools.Components.JOB_POSTING_ASSISTANT; - protected override string Title => "Job Posting"; + protected override string Title => T("Job Posting"); - protected override string Description => - """ - Provide some key points about the job you want to post. The AI will then - formulate a suggestion that you can finalize. - """; + protected override string Description => T("Provide some key points about the job you want to post. The AI will then formulate a suggestion that you can finalize."); protected override string SystemPrompt => $""" @@ -47,7 +43,7 @@ public partial class AssistantJobPostings : AssistantBaseCore FooterButtons => []; - protected override string SubmitText => "Create the job posting"; + protected override string SubmitText => T("Create the job posting"); protected override Func SubmitAction => this.CreateJobPosting; @@ -126,7 +122,7 @@ public partial class AssistantJobPostings : AssistantBaseCore } - - + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs b/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs index 218563fe..e39abbfa 100644 --- a/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs +++ b/app/MindWork AI Studio/Assistants/LegalCheck/AssistantLegalCheck.razor.cs @@ -7,14 +7,9 @@ public partial class AssistantLegalCheck : AssistantBaseCore Tools.Components.LEGAL_CHECK_ASSISTANT; - protected override string Title => "Legal Check"; + protected override string Title => T("Legal Check"); - protected override string Description => - """ - Provide a legal document and ask a question about it. This assistant does not - replace legal advice. Consult a lawyer to get professional advice. Remember - that LLMs can invent answers and facts. Please do not rely on this answers. - """; + protected override string Description => T("Provide a legal document and ask a question about it. This assistant does not replace legal advice. Consult a lawyer to get professional advice. Remember that LLMs can invent answers and facts. Please do not rely on this answers."); protected override string SystemPrompt => """ @@ -27,7 +22,7 @@ public partial class AssistantLegalCheck : AssistantBaseCore FooterButtons => []; - protected override string SubmitText => "Ask your questions"; + protected override string SubmitText => T("Ask your questions"); protected override Func SubmitAction => this.AksQuestions; @@ -67,7 +62,7 @@ public partial class AssistantLegalCheck : AssistantBaseCore - - + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor.cs b/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor.cs index 3a512615..fe1ec919 100644 --- a/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor.cs +++ b/app/MindWork AI Studio/Assistants/MyTasks/AssistantMyTasks.razor.cs @@ -8,15 +8,9 @@ public partial class AssistantMyTasks : AssistantBaseCore { public override Tools.Components Component => Tools.Components.MY_TASKS_ASSISTANT; - protected override string Title => "My Tasks"; + protected override string Title => T("My Tasks"); - protected override string Description => - """ - You received a cryptic email that was sent to many recipients and you are now wondering - if you need to do something? Copy the email into the input field. You also need to select - a personal profile. In this profile, you should describe your role in the organization. - The AI will then try to give you hints on what your tasks might be. - """; + protected override string Description => T("You received a cryptic email that was sent to many recipients and you are now wondering if you need to do something? Copy the email into the input field. You also need to select a personal profile. In this profile, you should describe your role in the organization. The AI will then try to give you hints on what your tasks might be."); protected override string SystemPrompt => $""" @@ -31,7 +25,7 @@ public partial class AssistantMyTasks : AssistantBaseCore protected override IReadOnlyList FooterButtons => []; - protected override string SubmitText => "Analyze text"; + protected override string SubmitText => T("Analyze text"); protected override Func SubmitAction => this.AnalyzeText; @@ -84,7 +78,7 @@ public partial class AssistantMyTasks : AssistantBaseCore private string? ValidatingText(string text) { if(string.IsNullOrWhiteSpace(text)) - return "Please provide some text as input. For example, an email."; + return T("Please provide some text as input. For example, an email."); return null; } @@ -92,7 +86,7 @@ public partial class AssistantMyTasks : AssistantBaseCore private string? ValidateProfile(Profile profile) { if(profile == default || profile == Profile.NO_PROFILE) - return "Please select one of your profiles."; + return T("Please select one of your profiles."); return null; } @@ -100,7 +94,7 @@ public partial class AssistantMyTasks : AssistantBaseCore private string? ValidateCustomLanguage(string language) { if(this.selectedTargetLanguage == CommonLanguages.OTHER && string.IsNullOrWhiteSpace(language)) - return "Please provide a custom language."; + return T("Please provide a custom language."); return null; } diff --git a/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor b/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor index 05feda39..952ff997 100644 --- a/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor +++ b/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor @@ -1,8 +1,8 @@ @attribute [Route(Routes.ASSISTANT_REWRITE)] @inherits AssistantBaseCore - - - - + + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs b/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs index 0fb45089..44aa94d2 100644 --- a/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs +++ b/app/MindWork AI Studio/Assistants/RewriteImprove/AssistantRewriteImprove.razor.cs @@ -7,12 +7,9 @@ public partial class AssistantRewriteImprove : AssistantBaseCore Tools.Components.REWRITE_ASSISTANT; - protected override string Title => "Rewrite & Improve Text"; + protected override string Title => T("Rewrite & Improve Text"); - protected override string Description => - """ - Rewrite and improve your text. Please note, that the capabilities of the different LLM providers will vary. - """; + protected override string Description => T("Rewrite and improve your text. Please note, that the capabilities of the different LLM providers will vary."); protected override string SystemPrompt => $""" @@ -41,7 +38,7 @@ public partial class AssistantRewriteImprove : AssistantBaseCore "Improve"; + protected override string SubmitText => T("Improve your text"); protected override Func SubmitAction => this.RewriteText; @@ -100,7 +97,7 @@ public partial class AssistantRewriteImprove : AssistantBaseCore Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(SentenceStructureExtensions).Namespace, nameof(SentenceStructureExtensions)); + public static string Name(this SentenceStructure sentenceStructure) => sentenceStructure switch { - SentenceStructure.ACTIVE => "Active voice", - SentenceStructure.PASSIVE => "Passive voice", + SentenceStructure.ACTIVE => TB("Active voice"), + SentenceStructure.PASSIVE => TB("Passive voice"), - _ => "Not Specified", + _ => TB("Not Specified"), }; public static string Prompt(this SentenceStructure sentenceStructure) => sentenceStructure switch diff --git a/app/MindWork AI Studio/Assistants/RewriteImprove/WritingStyles.cs b/app/MindWork AI Studio/Assistants/RewriteImprove/WritingStyles.cs index f2fc7eea..9a65bc16 100644 --- a/app/MindWork AI Studio/Assistants/RewriteImprove/WritingStyles.cs +++ b/app/MindWork AI Studio/Assistants/RewriteImprove/WritingStyles.cs @@ -13,4 +13,5 @@ public enum WritingStyles MARKETING, ACADEMIC, LEGAL, + CHANGELOG, } \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/RewriteImprove/WritingStylesExtensions.cs b/app/MindWork AI Studio/Assistants/RewriteImprove/WritingStylesExtensions.cs index 90a88867..f7648e86 100644 --- a/app/MindWork AI Studio/Assistants/RewriteImprove/WritingStylesExtensions.cs +++ b/app/MindWork AI Studio/Assistants/RewriteImprove/WritingStylesExtensions.cs @@ -2,19 +2,22 @@ namespace AIStudio.Assistants.RewriteImprove; public static class WritingStylesExtensions { + private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(WritingStylesExtensions).Namespace, nameof(WritingStylesExtensions)); + public static string Name(this WritingStyles style) => style switch { - WritingStyles.EVERYDAY => "Everyday (personal texts, social media)", - WritingStyles.BUSINESS => "Business (business emails, reports, presentations)", - WritingStyles.SCIENTIFIC => "Scientific (scientific papers, research reports)", - WritingStyles.JOURNALISTIC => "Journalistic (magazines, newspapers, news)", - WritingStyles.LITERARY => "Literary (fiction, poetry)", - WritingStyles.TECHNICAL => "Technical (manuals, documentation)", - WritingStyles.MARKETING => "Marketing (advertisements, sales texts)", - WritingStyles.ACADEMIC => "Academic (essays, seminar papers)", - WritingStyles.LEGAL => "Legal (legal texts, contracts)", + WritingStyles.EVERYDAY => TB("Everyday (personal texts, social media)"), + WritingStyles.BUSINESS => TB("Business (business emails, reports, presentations)"), + WritingStyles.SCIENTIFIC => TB("Scientific (scientific papers, research reports)"), + WritingStyles.JOURNALISTIC => TB("Journalistic (magazines, newspapers, news)"), + WritingStyles.LITERARY => TB("Literary (fiction, poetry)"), + WritingStyles.TECHNICAL => TB("Technical (manuals, documentation)"), + WritingStyles.MARKETING => TB("Marketing (advertisements, sales texts)"), + WritingStyles.ACADEMIC => TB("Academic (essays, seminar papers)"), + WritingStyles.LEGAL => TB("Legal (legal texts, contracts)"), + WritingStyles.CHANGELOG => TB("Changelog (release notes, version history)"), - _ => "Not specified", + _ => TB("Not specified"), }; public static string Prompt(this WritingStyles style) => style switch @@ -28,6 +31,7 @@ public static class WritingStylesExtensions WritingStyles.MARKETING => "Use a marketing style like for advertisements, sales texts, and promotional content. Most important is persuasiveness and engagement.", WritingStyles.ACADEMIC => "Use a academic style like for essays, seminar papers, and academic writing. Most important is clarity and objectivity.", WritingStyles.LEGAL => "Use a legal style like for legal texts, contracts, and official documents. Most important is precision and legal correctness. Use formal legal language.", + WritingStyles.CHANGELOG => "Use a changelog style like for release notes, version history, and software updates. Most important is clarity and conciseness. The changelog is structured as a Markdown list. Most list items start with one of the following verbs: Added, Changed, Deprecated, Removed, Fixed, Refactored, Improved, or Upgraded -- these verbs should also translated to the target language. Also, changelogs use past tense.", _ => "Keep the style of the text as it is.", }; diff --git a/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor b/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor index 0a960303..3da56b95 100644 --- a/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor +++ b/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor @@ -1,8 +1,8 @@ @attribute [Route(Routes.ASSISTANT_SYNONYMS)] @inherits AssistantBaseCore - - + + - + diff --git a/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor.cs b/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor.cs index 2244e7af..3581a5d3 100644 --- a/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor.cs +++ b/app/MindWork AI Studio/Assistants/Synonym/AssistantSynonyms.razor.cs @@ -7,12 +7,9 @@ public partial class AssistantSynonyms : AssistantBaseCore Tools.Components.SYNONYMS_ASSISTANT; - protected override string Title => "Synonyms"; + protected override string Title => T("Synonyms"); - protected override string Description => - """ - Find synonyms for words or phrases. - """; + protected override string Description => T("Find synonyms for words or phrases."); protected override string SystemPrompt => $""" @@ -52,7 +49,7 @@ public partial class AssistantSynonyms : AssistantBaseCore FooterButtons => []; - protected override string SubmitText => "Find synonyms"; + protected override string SubmitText => T("Find synonyms"); protected override Func SubmitAction => this.FindSynonyms; @@ -105,7 +102,7 @@ public partial class AssistantSynonyms : AssistantBaseCore } - - - + + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs b/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs index c5fc437c..89f81e0d 100644 --- a/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs +++ b/app/MindWork AI Studio/Assistants/TextSummarizer/AssistantTextSummarizer.razor.cs @@ -7,15 +7,9 @@ public partial class AssistantTextSummarizer : AssistantBaseCore Tools.Components.TEXT_SUMMARIZER_ASSISTANT; - protected override string Title => "Text Summarizer"; + protected override string Title => T("Text Summarizer"); - protected override string Description => - """ - Summarize long text into a shorter version while retaining the main points. - You might want to change the language of the summary to make it more readable. - It is also possible to change the complexity of the summary to make it - easy to understand. - """; + protected override string Description => T("Summarize long text into a shorter version while retaining the main points. You might want to change the language of the summary to make it more readable. It is also possible to change the complexity of the summary to make it easy to understand."); protected override string SystemPrompt => """ @@ -30,7 +24,7 @@ public partial class AssistantTextSummarizer : AssistantBaseCore FooterButtons => []; - protected override string SubmitText => "Summarize"; + protected override string SubmitText => T("Summarize"); protected override Func SubmitAction => this.SummarizeText; @@ -90,7 +84,7 @@ public partial class AssistantTextSummarizer : AssistantBaseCore Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(ComplexityExtensions).Namespace, nameof(ComplexityExtensions)); + public static string Name(this Complexity complexity) => complexity switch { - Complexity.NO_CHANGE => "No change in complexity", + Complexity.NO_CHANGE => TB("No change in complexity"), - Complexity.SIMPLE_LANGUAGE => "Simple language, e.g., for children", - Complexity.TEEN_LANGUAGE => "Teen language, e.g., for teenagers", - Complexity.EVERYDAY_LANGUAGE => "Everyday language, e.g., for adults", - Complexity.POPULAR_SCIENCE_LANGUAGE => "Popular science language, e.g., for people interested in science", - Complexity.SCIENTIFIC_LANGUAGE_FIELD_EXPERTS => "Scientific language for experts in this field", - Complexity.SCIENTIFIC_LANGUAGE_OTHER_EXPERTS => "Scientific language for experts from other fields (interdisciplinary)", + Complexity.SIMPLE_LANGUAGE => TB("Simple language, e.g., for children"), + Complexity.TEEN_LANGUAGE => TB("Teen language, e.g., for teenagers"), + Complexity.EVERYDAY_LANGUAGE => TB("Everyday language, e.g., for adults"), + Complexity.POPULAR_SCIENCE_LANGUAGE => TB("Popular science language, e.g., for people interested in science"), + Complexity.SCIENTIFIC_LANGUAGE_FIELD_EXPERTS => TB("Scientific language for experts in this field"), + Complexity.SCIENTIFIC_LANGUAGE_OTHER_EXPERTS => TB("Scientific language for experts from other fields (interdisciplinary)"), - _ => "No change in complexity", + _ => TB("No change in complexity"), }; public static string Prompt(this Complexity complexity, string expertInField) => complexity switch diff --git a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor index f1a6467c..d7bf0e52 100644 --- a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor +++ b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor @@ -6,15 +6,16 @@ } - + + @if (this.liveTranslation) { - + } else { - + } - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs index 628190cd..5a45f3ae 100644 --- a/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs +++ b/app/MindWork AI Studio/Assistants/Translation/AssistantTranslation.razor.cs @@ -7,12 +7,9 @@ public partial class AssistantTranslation : AssistantBaseCore Tools.Components.TRANSLATION_ASSISTANT; - protected override string Title => "Translation"; + protected override string Title => T("Translation"); - protected override string Description => - """ - Translate text from one language to another. - """; + protected override string Description => T("Translate text from one language to another."); protected override string SystemPrompt => """ @@ -26,7 +23,7 @@ public partial class AssistantTranslation : AssistantBaseCore FooterButtons => []; - protected override string SubmitText => "Translate"; + protected override string SubmitText => T("Translate"); protected override Func SubmitAction => () => this.TranslateText(true); @@ -85,7 +82,7 @@ public partial class AssistantTranslation : AssistantBaseCore -/// Extensions for the ChatRole enum. -/// -public static class ExtensionsChatRole -{ - /// - /// Returns the name of the role. - /// - /// The role. - /// The name of the role. - public static string ToName(this ChatRole role) => role switch - { - ChatRole.SYSTEM => "System", - ChatRole.USER => "You", - ChatRole.AI => "AI", - - _ => "Unknown", - }; - - /// - /// Returns the color of the role. - /// - /// The role. - /// The color of the role. - public static Color ToColor(this ChatRole role) => role switch - { - ChatRole.SYSTEM => Color.Info, - ChatRole.USER => Color.Primary, - ChatRole.AI => Color.Tertiary, - - _ => Color.Error, - }; - - /// - /// Returns the icon of the role. - /// - /// The role. - /// The icon of the role. - public static string ToIcon(this ChatRole role) => role switch - { - ChatRole.SYSTEM => Icons.Material.Filled.Settings, - ChatRole.USER => Icons.Material.Filled.Person, - ChatRole.AI => Icons.Material.Filled.AutoAwesome, - - _ => Icons.Material.Filled.Help, - }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/ChatRoleExtensions.cs b/app/MindWork AI Studio/Chat/ChatRoleExtensions.cs new file mode 100644 index 00000000..40987d09 --- /dev/null +++ b/app/MindWork AI Studio/Chat/ChatRoleExtensions.cs @@ -0,0 +1,75 @@ +using AIStudio.Tools.PluginSystem; + +namespace AIStudio.Chat; + +public static class ChatRoleExtensions +{ + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ChatRoleExtensions).Namespace, nameof(ChatRoleExtensions)); + + /// + /// Returns the name of the role. + /// + /// The role. + /// The name of the role. + public static string ToName(this ChatRole role) => role switch + { + ChatRole.SYSTEM => TB("System"), + ChatRole.USER => TB("You"), + ChatRole.AI => TB("AI"), + + _ => TB("Unknown"), + }; + + /// + /// Returns the color of the role. + /// + /// The role. + /// The color of the role. + public static Color ToColor(this ChatRole role) => role switch + { + ChatRole.SYSTEM => Color.Info, + ChatRole.USER => Color.Primary, + ChatRole.AI => Color.Tertiary, + + _ => Color.Error, + }; + + /// + /// Returns the icon of the role. + /// + /// The role. + /// The icon of the role. + public static string ToIcon(this ChatRole role) => role switch + { + ChatRole.SYSTEM => Icons.Material.Filled.Settings, + ChatRole.USER => Icons.Material.Filled.Person, + ChatRole.AI => Icons.Material.Filled.AutoAwesome, + + _ => Icons.Material.Filled.Help, + }; + + /// + /// Returns the specific name of the role for the chat template. + /// + /// The role. + /// The name of the role. + public static string ToChatTemplateName(this ChatRole role) => role switch + { + ChatRole.SYSTEM => TB("System"), + ChatRole.USER => TB("User"), + ChatRole.AI => TB("Assistant"), + + _ => TB("Unknown"), + }; + + /// + /// Selects the next role for a chat template. + /// + /// The current role. + /// The next role for the chat template. + public static ChatRole SelectNextRoleForTemplate(this ChatRole currentRole) => currentRole switch + { + ChatRole.USER => ChatRole.AI, + _ => ChatRole.USER, + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/ChatRoles.cs b/app/MindWork AI Studio/Chat/ChatRoles.cs new file mode 100644 index 00000000..4c74aa14 --- /dev/null +++ b/app/MindWork AI Studio/Chat/ChatRoles.cs @@ -0,0 +1,10 @@ +namespace AIStudio.Chat; + +public static class ChatRoles +{ + public static IEnumerable ChatTemplateRoles() + { + yield return ChatRole.USER; + yield return ChatRole.AI; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/ChatThread.cs b/app/MindWork AI Studio/Chat/ChatThread.cs index ceb3041a..c57e5160 100644 --- a/app/MindWork AI Studio/Chat/ChatThread.cs +++ b/app/MindWork AI Studio/Chat/ChatThread.cs @@ -29,6 +29,11 @@ public sealed record ChatThread /// Specifies the profile selected for the chat thread. /// public string SelectedProfile { get; set; } = string.Empty; + + /// + /// Specifies the profile selected for the chat thread. + /// + public string SelectedChatTemplate { get; set; } = string.Empty; /// /// The data source options for this chat thread. @@ -69,6 +74,8 @@ public sealed record ChatThread /// The content blocks of the chat thread. /// public List Blocks { get; init; } = []; + + private bool allowProfile = true; /// /// Prepares the system prompt for the chat thread. @@ -84,16 +91,51 @@ public sealed record ChatThread /// The prepared system prompt. public string PrepareSystemPrompt(SettingsManager settingsManager, ChatThread chatThread, ILogger logger) { + // + // Use the information from the chat template, if provided. Otherwise, use the default system prompt + // + string systemPromptTextWithChatTemplate; + var logMessage = $"Using no chat template for chat thread '{chatThread.Name}'."; + if (string.IsNullOrWhiteSpace(chatThread.SelectedChatTemplate)) + systemPromptTextWithChatTemplate = chatThread.SystemPrompt; + else + { + if(!Guid.TryParse(chatThread.SelectedChatTemplate, out var chatTeamplateId)) + systemPromptTextWithChatTemplate = chatThread.SystemPrompt; + else + { + if(chatThread.SelectedChatTemplate == ChatTemplate.NO_CHAT_TEMPLATE.Id || chatTeamplateId == Guid.Empty) + systemPromptTextWithChatTemplate = chatThread.SystemPrompt; + else + { + var chatTemplate = settingsManager.ConfigurationData.ChatTemplates.FirstOrDefault(x => x.Id == chatThread.SelectedChatTemplate); + if(chatTemplate == default) + systemPromptTextWithChatTemplate = chatThread.SystemPrompt; + else + { + logMessage = $"Using chat template '{chatTemplate.Name}' for chat thread '{chatThread.Name}'."; + this.allowProfile = chatTemplate.AllowProfileUsage; + systemPromptTextWithChatTemplate = chatTemplate.ToSystemPrompt(); + } + } + } + } + + logger.LogInformation(logMessage); + + // + // Add augmented data, if available: + // var isAugmentedDataAvailable = !string.IsNullOrWhiteSpace(chatThread.AugmentedData); var systemPromptWithAugmentedData = isAugmentedDataAvailable switch { true => $""" - {chatThread.SystemPrompt} + {systemPromptTextWithChatTemplate} {chatThread.AugmentedData} """, - false => chatThread.SystemPrompt, + false => systemPromptTextWithChatTemplate, }; if(isAugmentedDataAvailable) @@ -101,12 +143,13 @@ public sealed record ChatThread else logger.LogInformation("No augmented data is available for the chat thread."); + // - // Prepare the system prompt: + // Add information from the profile if available and allowed: // string systemPromptText; - var logMessage = $"Using no profile for chat thread '{chatThread.Name}'."; - if (string.IsNullOrWhiteSpace(chatThread.SelectedProfile)) + logMessage = $"Using no profile for chat thread '{chatThread.Name}'."; + if (string.IsNullOrWhiteSpace(chatThread.SelectedProfile) || this.allowProfile is false) systemPromptText = systemPromptWithAugmentedData; else { diff --git a/app/MindWork AI Studio/Chat/ContentBlock.cs b/app/MindWork AI Studio/Chat/ContentBlock.cs index 632d98da..a069c3d8 100644 --- a/app/MindWork AI Studio/Chat/ContentBlock.cs +++ b/app/MindWork AI Studio/Chat/ContentBlock.cs @@ -18,15 +18,24 @@ public class ContentBlock /// /// The content of the block. /// - public IContent? Content { get; init; } + public IContent? Content { get; set; } /// /// The role of the content block in the chat thread, e.g., user, AI, etc. /// - public ChatRole Role { get; init; } = ChatRole.NONE; + public ChatRole Role { get; set; } = ChatRole.NONE; /// /// Should the content block be hidden from the user? /// - public bool HideFromUser { get; set; } + public bool HideFromUser { get; init; } + + public ContentBlock DeepClone() => new() + { + Time = this.Time, + ContentType = this.ContentType, + Content = this.Content?.DeepClone(), + Role = this.Role, + HideFromUser = this.HideFromUser, + }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor index f1c93b65..8b93606d 100644 --- a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor +++ b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor @@ -1,6 +1,6 @@ @using AIStudio.Tools @using MudBlazor - +@inherits AIStudio.Components.MSGComponentBase @@ -9,34 +9,36 @@ - @this.Role.ToName() (@this.Time) + + @this.Role.ToName() (@this.Time) + @if (this.IsSecondToLastBlock && this.Role is ChatRole.USER && this.EditLastUserBlockFunc is not null) { - + } @if (this.IsLastContentBlock && this.Role is ChatRole.USER && this.EditLastBlockFunc is not null) { - + } @if (this.IsLastContentBlock && this.Role is ChatRole.AI && this.RegenerateFunc is not null) { - + } @if (this.RemoveBlockFunc is not null) { - + } - + @@ -87,7 +89,7 @@ default: - Cannot render content of type @this.Type yet. + @string.Format(T("Cannot render content of type {0} yet."), this.Type) break; } diff --git a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs index 815caa6e..008ed897 100644 --- a/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs +++ b/app/MindWork AI Studio/Chat/ContentBlockComponent.razor.cs @@ -1,4 +1,4 @@ -using AIStudio.Settings; +using AIStudio.Components; using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; @@ -8,7 +8,7 @@ namespace AIStudio.Chat; /// /// The UI component for a chat content block, i.e., for any IContent. /// -public partial class ContentBlockComponent : ComponentBase +public partial class ContentBlockComponent : MSGComponentBase { /// /// The role of the chat content block. @@ -67,9 +67,6 @@ public partial class ContentBlockComponent : ComponentBase [Inject] private ISnackbar Snackbar { get; init; } = null!; - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - [Inject] private IDialogService DialogService { get; init; } = null!; @@ -132,7 +129,7 @@ public partial class ContentBlockComponent : ComponentBase break; default: - this.Snackbar.Add("Cannot copy this content type to clipboard!", Severity.Error, config => + this.Snackbar.Add(T("Cannot copy this content type to clipboard!"), Severity.Error, config => { config.Icon = Icons.Material.Filled.ContentCopy; config.IconSize = Size.Large; @@ -152,10 +149,10 @@ public partial class ContentBlockComponent : ComponentBase return; var remove = await this.DialogService.ShowMessageBox( - "Remove Message", - "Do you really want to remove this message?", - "Yes, remove it", - "No, keep it"); + T("Remove Message"), + T("Do you really want to remove this message?"), + T("Yes, remove it"), + T("No, keep it")); if (remove.HasValue && remove.Value) await this.RemoveBlockFunc(this.Content); @@ -170,10 +167,10 @@ public partial class ContentBlockComponent : ComponentBase return; var regenerate = await this.DialogService.ShowMessageBox( - "Regenerate Message", - "Do you really want to regenerate this message?", - "Yes, regenerate it", - "No, keep it"); + T("Regenerate Message"), + T("Do you really want to regenerate this message?"), + T("Yes, regenerate it"), + T("No, keep it")); if (regenerate.HasValue && regenerate.Value) await this.RegenerateFunc(this.Content); @@ -199,10 +196,10 @@ public partial class ContentBlockComponent : ComponentBase return; var edit = await this.DialogService.ShowMessageBox( - "Edit Message", - "Do you really want to edit this message? In order to edit this message, the AI response will be deleted.", - "Yes, remove the AI response and edit it", - "No, keep it"); + T("Edit Message"), + T("Do you really want to edit this message? In order to edit this message, the AI response will be deleted."), + T("Yes, remove the AI response and edit it"), + T("No, keep it")); if (edit.HasValue && edit.Value) await this.EditLastUserBlockFunc(this.Content); diff --git a/app/MindWork AI Studio/Chat/ContentImage.cs b/app/MindWork AI Studio/Chat/ContentImage.cs index c7e785eb..6fcf7f1e 100644 --- a/app/MindWork AI Studio/Chat/ContentImage.cs +++ b/app/MindWork AI Studio/Chat/ContentImage.cs @@ -13,11 +13,11 @@ public sealed class ContentImage : IContent, IImageSource /// [JsonIgnore] - public bool InitialRemoteWait { get; set; } = false; + public bool InitialRemoteWait { get; set; } /// [JsonIgnore] - public bool IsStreaming { get; set; } = false; + public bool IsStreaming { get; set; } /// [JsonIgnore] @@ -32,6 +32,15 @@ public sealed class ContentImage : IContent, IImageSource { throw new NotImplementedException(); } + + /// + public IContent DeepClone() => new ContentImage + { + Source = this.Source, + InitialRemoteWait = this.InitialRemoteWait, + IsStreaming = this.IsStreaming, + SourceType = this.SourceType, + }; #endregion diff --git a/app/MindWork AI Studio/Chat/ContentText.cs b/app/MindWork AI Studio/Chat/ContentText.cs index 38872edf..13d8f3ce 100644 --- a/app/MindWork AI Studio/Chat/ContentText.cs +++ b/app/MindWork AI Studio/Chat/ContentText.cs @@ -125,6 +125,14 @@ public sealed class ContentText : IContent return chatThread; } + /// + public IContent DeepClone() => new ContentText + { + Text = this.Text, + InitialRemoteWait = this.InitialRemoteWait, + IsStreaming = this.IsStreaming, + }; + #endregion /// diff --git a/app/MindWork AI Studio/Chat/IContent.cs b/app/MindWork AI Studio/Chat/IContent.cs index be3bf097..c03f6574 100644 --- a/app/MindWork AI Studio/Chat/IContent.cs +++ b/app/MindWork AI Studio/Chat/IContent.cs @@ -43,6 +43,12 @@ public interface IContent /// public Task CreateFromProviderAsync(IProvider provider, Model chatModel, IContent? lastPrompt, ChatThread? chatChatThread, CancellationToken token = default); + /// + /// Creates a deep copy + /// + /// The copy + public IContent DeepClone(); + /// /// Returns the corresponding ERI content type. /// diff --git a/app/MindWork AI Studio/Components/AssistantBlock.razor b/app/MindWork AI Studio/Components/AssistantBlock.razor index 3d0d9723..754a9e24 100644 --- a/app/MindWork AI Studio/Components/AssistantBlock.razor +++ b/app/MindWork AI Studio/Components/AssistantBlock.razor @@ -1,3 +1,4 @@ +@inherits MSGComponentBase @typeparam TSettings diff --git a/app/MindWork AI Studio/Components/AssistantBlock.razor.cs b/app/MindWork AI Studio/Components/AssistantBlock.razor.cs index df5c84cd..ef0e7a4d 100644 --- a/app/MindWork AI Studio/Components/AssistantBlock.razor.cs +++ b/app/MindWork AI Studio/Components/AssistantBlock.razor.cs @@ -1,12 +1,10 @@ -using AIStudio.Settings; - using Microsoft.AspNetCore.Components; using DialogOptions = AIStudio.Dialogs.DialogOptions; namespace AIStudio.Components; -public partial class AssistantBlock : ComponentBase, IMessageBusReceiver, IDisposable where TSettings : IComponent +public partial class AssistantBlock : MSGComponentBase where TSettings : IComponent { [Parameter] public string Name { get; set; } = string.Empty; @@ -26,12 +24,6 @@ public partial class AssistantBlock : ComponentBase, IMessageBusRecei [Inject] private MudTheme ColorTheme { get; init; } = null!; - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - - [Inject] - private MessageBus MessageBus { get; init; } = null!; - [Inject] private IDialogService DialogService { get; init; } = null!; @@ -39,43 +31,8 @@ public partial class AssistantBlock : ComponentBase, IMessageBusRecei { var dialogParameters = new DialogParameters(); - await this.DialogService.ShowAsync("Open Settings", dialogParameters, DialogOptions.FULLSCREEN); + await this.DialogService.ShowAsync(T("Open Settings"), dialogParameters, DialogOptions.FULLSCREEN); } - - #region Overrides of ComponentBase - - protected override async Task OnInitializedAsync() - { - this.MessageBus.RegisterComponent(this); - this.MessageBus.ApplyFilters(this, [], [ Event.COLOR_THEME_CHANGED ]); - - await base.OnInitializedAsync(); - } - - #endregion - - #region Implementation of IMessageBusReceiver - - public string ComponentName => nameof(AssistantBlock); - - public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) - { - switch (triggeredEvent) - { - case Event.COLOR_THEME_CHANGED: - this.StateHasChanged(); - break; - } - - return Task.CompletedTask; - } - - public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) - { - return Task.FromResult(default); - } - - #endregion private string BorderColor => this.SettingsManager.IsDarkMode switch { @@ -84,13 +41,4 @@ public partial class AssistantBlock : ComponentBase, IMessageBusRecei }; private string BlockStyle => $"border-width: 2px; border-color: {this.BorderColor}; border-radius: 12px; border-style: solid; max-width: 20em;"; - - #region Implementation of IDisposable - - public void Dispose() - { - this.MessageBus.Unregister(this); - } - - #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Changelog.Logs.cs b/app/MindWork AI Studio/Components/Changelog.Logs.cs index 5033852d..f2f20bab 100644 --- a/app/MindWork AI Studio/Components/Changelog.Logs.cs +++ b/app/MindWork AI Studio/Components/Changelog.Logs.cs @@ -13,7 +13,13 @@ public partial class Changelog public static readonly Log[] LOGS = [ - new (214, "v0.9.39, build 214 (2025-04-06 10:18 UTC)", "v0.9.39.md"), + new (220, "v0.9.45, build 220 (2025-05-25 13:56 UTC)", "v0.9.45.md"), + new (219, "v0.9.44, build 219 (2025-05-18 19:33 UTC)", "v0.9.44.md"), + new (218, "v0.9.43, build 218 (2025-05-11 17:22 UTC)", "v0.9.43.md"), + new (217, "v0.9.42, build 217 (2025-05-04 13:03 UTC)", "v0.9.42.md"), + new (216, "v0.9.41, build 216 (2025-04-27 14:18 UTC)", "v0.9.41.md"), + new (215, "v0.9.40, build 215 (2025-04-20 13:30 UTC)", "v0.9.40.md"), + new (214, "v0.9.39, build 214 (2025-04-07 17:39 UTC)", "v0.9.39.md"), new (213, "v0.9.38, build 213 (2025-03-17 18:18 UTC)", "v0.9.38.md"), new (212, "v0.9.37, build 212 (2025-03-16 20:32 UTC)", "v0.9.37.md"), new (211, "v0.9.36, build 211 (2025-03-15 10:42 UTC)", "v0.9.36.md"), diff --git a/app/MindWork AI Studio/Components/Changelog.razor b/app/MindWork AI Studio/Components/Changelog.razor index 407aa9ec..b83c659d 100644 --- a/app/MindWork AI Studio/Components/Changelog.razor +++ b/app/MindWork AI Studio/Components/Changelog.razor @@ -1,4 +1,5 @@ - +@inherits MSGComponentBase + @foreach (var log in LOGS) { diff --git a/app/MindWork AI Studio/Components/Changelog.razor.cs b/app/MindWork AI Studio/Components/Changelog.razor.cs index bba8b8a5..6402b1dd 100644 --- a/app/MindWork AI Studio/Components/Changelog.razor.cs +++ b/app/MindWork AI Studio/Components/Changelog.razor.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class Changelog : ComponentBase +public partial class Changelog : MSGComponentBase { [Inject] private HttpClient HttpClient { get; set; } = null!; diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor b/app/MindWork AI Studio/Components/ChatComponent.razor index 703d9175..66538eda 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor +++ b/app/MindWork AI Studio/Components/ChatComponent.razor @@ -58,19 +58,19 @@ this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES && this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_OVERLAY) { - + } @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_MANUALLY) { - + } - + @@ -80,17 +80,18 @@ } - + + @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY) { - + } @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES) { - + } @@ -102,13 +103,13 @@ @if (this.isStreaming && this.cancellationTokenSource is not null) { - + } - - + + @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) { @@ -116,7 +117,7 @@ @if (!this.ChatThread.IsLLMProviderAllowed(this.Provider)) { - + } diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor.cs b/app/MindWork AI Studio/Components/ChatComponent.razor.cs index 0759d5b4..29b75f74 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor.cs +++ b/app/MindWork AI Studio/Components/ChatComponent.razor.cs @@ -46,6 +46,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable private DataSourceSelection? dataSourceSelectionComponent; private DataSourceOptions earlyDataSourceOptions = new(); private Profile currentProfile = Profile.NO_PROFILE; + private ChatTemplate currentChatTemplate = ChatTemplate.NO_CHAT_TEMPLATE; private bool hasUnsavedChanges; private bool mustScrollToBottomAfterRender; private InnerScrolling scrollingArea = null!; @@ -59,7 +60,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable private string currentWorkspaceName = string.Empty; private Guid currentWorkspaceId = Guid.Empty; private CancellationTokenSource? cancellationTokenSource; - + // Unfortunately, we need the input field reference to blur the focus away. Without // this, we cannot clear the input field. private MudTextField inputField = null!; @@ -77,6 +78,9 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable // Get the preselected profile: this.currentProfile = this.SettingsManager.GetPreselectedProfile(Tools.Components.CHAT); + // Get the preselected chat template: + this.currentChatTemplate = this.SettingsManager.GetPreselectedChatTemplate(Tools.Components.CHAT); + // // Check for deferred messages of the kind 'SEND_TO_CHAT', // aka the user sends an assistant result to the chat: @@ -255,13 +259,22 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable private bool IsProviderSelected => this.Provider.UsedLLMProvider != LLMProviders.NONE; - private string ProviderPlaceholder => this.IsProviderSelected ? "Type your input here..." : "Select a provider first"; + private string ProviderPlaceholder => this.IsProviderSelected ? T("Type your input here...") : T("Select a provider first"); + + private string InputLabel + { + get + { + if (this.IsProviderSelected) + return string.Format(T("Your Prompt (use selected instance '{0}', provider '{1}')"), this.Provider.InstanceName, this.Provider.UsedLLMProvider.ToName()); + + return this.T("Select a provider first"); + } + } - private string InputLabel => this.IsProviderSelected ? $"Your Prompt (use selected instance '{this.Provider.InstanceName}', provider '{this.Provider.UsedLLMProvider.ToName()}')" : "Select a provider first"; - private bool CanThreadBeSaved => this.ChatThread is not null && this.ChatThread.Blocks.Count > 0; - private string TooltipAddChatToWorkspace => $"Start new chat in workspace \"{this.currentWorkspaceName}\""; + private string TooltipAddChatToWorkspace => string.Format(T("Start new chat in workspace '{0}'"), this.currentWorkspaceName); private string UserInputStyle => this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence ? this.Provider.UsedLLMProvider.GetConfidence(this.SettingsManager).SetColorStyle(this.SettingsManager) : string.Empty; @@ -282,6 +295,12 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable // We select the first 10 words of the user input: var words = firstUserInput.Split(' ', StringSplitOptions.RemoveEmptyEntries); var threadName = string.Join(' ', words.Take(10)); + threadName = threadName.Trim(); + + // Remove all line breaks: + threadName = threadName.Replace("\r", string.Empty); + threadName = threadName.Replace("\n", " "); + threadName = threadName.Replace("\t", " "); // If the thread name is empty, we use a default name: if (string.IsNullOrWhiteSpace(threadName)) @@ -303,6 +322,15 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable await this.ChatThreadChanged.InvokeAsync(this.ChatThread); } + + private async Task ChatTemplateWasChanged(ChatTemplate chatTemplate) + { + this.currentChatTemplate = chatTemplate; + if(this.ChatThread is null) + return; + + await this.StartNewChat(true); + } private IReadOnlyList GetAgentSelectedDataSources() { @@ -398,13 +426,14 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable { SelectedProvider = this.Provider.Id, SelectedProfile = this.currentProfile.Id, + SelectedChatTemplate = this.currentChatTemplate.Id, SystemPrompt = SystemPrompts.DEFAULT, WorkspaceId = this.currentWorkspaceId, ChatId = Guid.NewGuid(), DataSourceOptions = this.earlyDataSourceOptions, Name = this.ExtractThreadName(this.userInput), Seed = this.RNG.Next(), - Blocks = [], + Blocks = this.currentChatTemplate == default ? [] : this.currentChatTemplate.ExampleConversation.Select(x => x.DeepClone()).ToList(), }; await this.ChatThreadChanged.InvokeAsync(this.ChatThread); @@ -415,9 +444,15 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable if (string.IsNullOrWhiteSpace(this.ChatThread.Name)) this.ChatThread.Name = this.ExtractThreadName(this.userInput); - // Update provider and profile: + // Update provider, profile and chat template: this.ChatThread.SelectedProvider = this.Provider.Id; this.ChatThread.SelectedProfile = this.currentProfile.Id; + + // + // Remark: We do not update the chat template here + // because the chat template is only used when starting a new chat. + // Updating the chat template afterward is not supported. + // } var time = DateTimeOffset.Now; @@ -628,12 +663,13 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable { SelectedProvider = this.Provider.Id, SelectedProfile = this.currentProfile.Id, + SelectedChatTemplate = this.currentChatTemplate.Id, SystemPrompt = SystemPrompts.DEFAULT, WorkspaceId = this.currentWorkspaceId, ChatId = Guid.NewGuid(), Name = string.Empty, Seed = this.RNG.Next(), - Blocks = [], + Blocks = this.currentChatTemplate == default ? [] : this.currentChatTemplate.ExampleConversation.Select(x => x.DeepClone()).ToList(), }; } @@ -653,7 +689,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable { var confirmationDialogParameters = new DialogParameters { - { "Message", "Are you sure you want to move this chat? All unsaved changes will be lost." }, + { "Message", T("Are you sure you want to move this chat? All unsaved changes will be lost.") }, }; var confirmationDialogReference = await this.DialogService.ShowAsync("Unsaved Changes", confirmationDialogParameters, DialogOptions.FULLSCREEN); @@ -664,12 +700,12 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable var dialogParameters = new DialogParameters { - { "Message", "Please select the workspace where you want to move the chat to." }, + { "Message", T("Please select the workspace where you want to move the chat to.") }, { "SelectedWorkspace", this.ChatThread?.WorkspaceId }, - { "ConfirmText", "Move chat" }, + { "ConfirmText", T("Move chat") }, }; - var dialogReference = await this.DialogService.ShowAsync("Move Chat to Workspace", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Move Chat to Workspace"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -739,6 +775,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable { var chatProvider = this.ChatThread?.SelectedProvider; var chatProfile = this.ChatThread?.SelectedProfile; + var chatChatTemplate = this.ChatThread?.SelectedChatTemplate; switch (this.SettingsManager.ConfigurationData.Chat.LoadingProviderBehavior) { @@ -766,6 +803,14 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable if(this.currentProfile == default) this.currentProfile = Profile.NO_PROFILE; } + + // Try to select the chat template: + if (!string.IsNullOrWhiteSpace(chatChatTemplate)) + { + this.currentChatTemplate = this.SettingsManager.ConfigurationData.ChatTemplates.FirstOrDefault(x => x.Id == chatChatTemplate); + if(this.currentChatTemplate == default) + this.currentChatTemplate = ChatTemplate.NO_CHAT_TEMPLATE; + } } private async Task ToggleWorkspaceOverlay() @@ -838,10 +883,8 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable } #region Overrides of MSGComponentBase - - public override string ComponentName => nameof(ChatComponent); - public override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default + protected override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) { @@ -860,7 +903,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable } } - public override Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) where TResult : default where TPayload : default + protected override Task ProcessIncomingMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) where TResult : default where TPayload : default { switch (triggeredEvent) { @@ -880,7 +923,6 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable public async ValueTask DisposeAsync() { - this.MessageBus.Unregister(this); if(this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY) { await this.SaveThread(); diff --git a/app/MindWork AI Studio/Components/ChatTemplateSelection.razor b/app/MindWork AI Studio/Components/ChatTemplateSelection.razor new file mode 100644 index 00000000..7f9f09cf --- /dev/null +++ b/app/MindWork AI Studio/Components/ChatTemplateSelection.razor @@ -0,0 +1,29 @@ +@using AIStudio.Settings +@inherits MSGComponentBase + + + + + @if (this.CurrentChatTemplate != ChatTemplate.NO_CHAT_TEMPLATE) + { + + @this.CurrentChatTemplate.Name + + } + else + { + + } + + + + + @foreach (var chatTemplate in this.SettingsManager.ConfigurationData.ChatTemplates.GetAllChatTemplates()) + { + + @chatTemplate.Name + + } + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ChatTemplateSelection.razor.cs b/app/MindWork AI Studio/Components/ChatTemplateSelection.razor.cs new file mode 100644 index 00000000..e624884c --- /dev/null +++ b/app/MindWork AI Studio/Components/ChatTemplateSelection.razor.cs @@ -0,0 +1,39 @@ +using AIStudio.Dialogs.Settings; +using AIStudio.Settings; + +using Microsoft.AspNetCore.Components; +using DialogOptions = AIStudio.Dialogs.DialogOptions; + +namespace AIStudio.Components; + +public partial class ChatTemplateSelection : MSGComponentBase +{ + [Parameter] + public ChatTemplate CurrentChatTemplate { get; set; } = ChatTemplate.NO_CHAT_TEMPLATE; + + [Parameter] + public EventCallback CurrentChatTemplateChanged { get; set; } + + [Parameter] + public string MarginLeft { get; set; } = "ml-1"; + + [Parameter] + public string MarginRight { get; set; } = string.Empty; + + [Inject] + private IDialogService DialogService { get; init; } = null!; + + private string MarginClass => $"{this.MarginLeft} {this.MarginRight}"; + + private async Task SelectionChanged(ChatTemplate chatTemplate) + { + this.CurrentChatTemplate = chatTemplate; + await this.CurrentChatTemplateChanged.InvokeAsync(chatTemplate); + } + + private async Task OpenSettingsDialog() + { + var dialogParameters = new DialogParameters(); + await this.DialogService.ShowAsync(T("Open Chat Template Options"), dialogParameters, DialogOptions.FULLSCREEN); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ConfidenceInfo.razor b/app/MindWork AI Studio/Components/ConfidenceInfo.razor index 7870c9a9..f27fe58e 100644 --- a/app/MindWork AI Studio/Components/ConfidenceInfo.razor +++ b/app/MindWork AI Studio/Components/ConfidenceInfo.razor @@ -1,6 +1,8 @@ @using AIStudio.Provider +@inherits MSGComponentBase +
- + @if (this.Mode is PopoverTriggerMode.ICON) { @@ -8,7 +10,7 @@ else { - Confidence + @T("Confidence") } @@ -17,16 +19,22 @@ - Confidence Card + + @T("Confidence Card") + - Description + + @T("Description") + @if (this.currentConfidence.Sources.Count > 0) { - Sources + + @T("Sources") + @foreach (var sourceTuple in this.GetConfidenceSources()) { @@ -37,13 +45,17 @@ @if (!string.IsNullOrWhiteSpace(this.currentConfidence.Region)) { - Region + + @T("Region") + @this.currentConfidence.Region } - Confidence Level + + @T("Confidence Level") + @this.currentConfidence.Level.GetName() diff --git a/app/MindWork AI Studio/Components/ConfidenceInfo.razor.cs b/app/MindWork AI Studio/Components/ConfidenceInfo.razor.cs index 3bad56ea..336ab64b 100644 --- a/app/MindWork AI Studio/Components/ConfidenceInfo.razor.cs +++ b/app/MindWork AI Studio/Components/ConfidenceInfo.razor.cs @@ -1,23 +1,16 @@ using AIStudio.Provider; -using AIStudio.Settings; using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class ConfidenceInfo : ComponentBase, IMessageBusReceiver, IDisposable +public partial class ConfidenceInfo : MSGComponentBase { [Parameter] public PopoverTriggerMode Mode { get; set; } = PopoverTriggerMode.BUTTON; [Parameter] public LLMProviders LLMProvider { get; set; } - - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - - [Inject] - private MessageBus MessageBus { get; init; } = null!; private Confidence currentConfidence; private bool showConfidence; @@ -31,9 +24,6 @@ public partial class ConfidenceInfo : ComponentBase, IMessageBusReceiver, IDispo protected override async Task OnParametersSetAsync() { - this.MessageBus.RegisterComponent(this); - this.MessageBus.ApplyFilters(this, [], [ Event.COLOR_THEME_CHANGED ]); - this.currentConfidence = this.LLMProvider.GetConfidence(this.SettingsManager); await base.OnParametersSetAsync(); } @@ -54,43 +44,10 @@ public partial class ConfidenceInfo : ComponentBase, IMessageBusReceiver, IDispo { var index = 0; foreach (var source in this.currentConfidence.Sources) - yield return ($"Source {++index}", source); + yield return (string.Format(T("Source {0}"), ++index), source); } private string GetCurrentConfidenceColor() => $"color: {this.currentConfidence.Level.GetColor(this.SettingsManager)};"; private string GetPopoverStyle() => $"border-color: {this.currentConfidence.Level.GetColor(this.SettingsManager)};"; - - #region Implementation of IMessageBusReceiver - - public string ComponentName => nameof(ConfidenceInfo); - - public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) - { - switch (triggeredEvent) - { - case Event.COLOR_THEME_CHANGED: - this.showConfidence = false; - this.StateHasChanged(); - break; - } - - return Task.CompletedTask; - } - - public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) - { - return Task.FromResult(default); - } - - #endregion - - #region Implementation of IDisposable - - public void Dispose() - { - this.MessageBus.Unregister(this); - } - - #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ConfigurationBase.razor b/app/MindWork AI Studio/Components/ConfigurationBase.razor index e69de29b..2233093a 100644 --- a/app/MindWork AI Studio/Components/ConfigurationBase.razor +++ b/app/MindWork AI Studio/Components/ConfigurationBase.razor @@ -0,0 +1 @@ +@inherits MSGComponentBase \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ConfigurationBase.razor.cs b/app/MindWork AI Studio/Components/ConfigurationBase.razor.cs index 64217ffe..10f4ae3f 100644 --- a/app/MindWork AI Studio/Components/ConfigurationBase.razor.cs +++ b/app/MindWork AI Studio/Components/ConfigurationBase.razor.cs @@ -1,5 +1,3 @@ -using AIStudio.Settings; - using Microsoft.AspNetCore.Components; namespace AIStudio.Components; @@ -7,7 +5,7 @@ namespace AIStudio.Components; /// /// A base class for configuration options. /// -public partial class ConfigurationBase : ComponentBase, IMessageBusReceiver, IDisposable +public partial class ConfigurationBase : MSGComponentBase { /// /// The description of the option, i.e., the name. Should be @@ -28,12 +26,6 @@ public partial class ConfigurationBase : ComponentBase, IMessageBusReceiver, IDi [Parameter] public Func Disabled { get; set; } = () => false; - [Inject] - protected SettingsManager SettingsManager { get; init; } = null!; - - [Inject] - protected MessageBus MessageBus { get; init; } = null!; - protected const string MARGIN_CLASS = "mb-6"; protected static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); @@ -41,25 +33,18 @@ public partial class ConfigurationBase : ComponentBase, IMessageBusReceiver, IDi protected override async Task OnInitializedAsync() { - // Configure the spellchecking for the instance name input: this.SettingsManager.InjectSpellchecking(SPELLCHECK_ATTRIBUTES); - - // Register this component with the message bus: - this.MessageBus.RegisterComponent(this); - this.MessageBus.ApplyFilters(this, [], [ Event.CONFIGURATION_CHANGED ]); - + this.ApplyFilters([], [ Event.CONFIGURATION_CHANGED ]); await base.OnInitializedAsync(); } #endregion protected async Task InformAboutChange() => await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); - - #region Implementation of IMessageBusReceiver - public string ComponentName => nameof(ConfigurationBase); - - public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, TMsg? data) + #region Overrides of MSGComponentBase + + protected override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) { @@ -71,19 +56,5 @@ public partial class ConfigurationBase : ComponentBase, IMessageBusReceiver, IDi return Task.CompletedTask; } - public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) - { - return Task.FromResult(default); - } - - #endregion - - #region Implementation of IDisposable - - public void Dispose() - { - this.MessageBus.Unregister(this); - } - #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ConfigurationMinConfidenceSelection.razor b/app/MindWork AI Studio/Components/ConfigurationMinConfidenceSelection.razor index 75290baa..c3f21593 100644 --- a/app/MindWork AI Studio/Components/ConfigurationMinConfidenceSelection.razor +++ b/app/MindWork AI Studio/Components/ConfigurationMinConfidenceSelection.razor @@ -1,2 +1,3 @@ @using AIStudio.Settings - \ No newline at end of file +@inherits MSGComponentBase + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ConfigurationMinConfidenceSelection.razor.cs b/app/MindWork AI Studio/Components/ConfigurationMinConfidenceSelection.razor.cs index 5271b8f6..858bbc01 100644 --- a/app/MindWork AI Studio/Components/ConfigurationMinConfidenceSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ConfigurationMinConfidenceSelection.razor.cs @@ -1,11 +1,10 @@ using AIStudio.Provider; -using AIStudio.Settings; using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class ConfigurationMinConfidenceSelection : ComponentBase +public partial class ConfigurationMinConfidenceSelection : MSGComponentBase { /// /// The selected value. @@ -30,9 +29,6 @@ public partial class ConfigurationMinConfidenceSelection : ComponentBase /// [Parameter] public bool RestrictToGlobalMinimumConfidence { get; set; } - - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; private ConfidenceLevel FilteredSelectedValue() { diff --git a/app/MindWork AI Studio/Components/ConfigurationMultiSelect.razor b/app/MindWork AI Studio/Components/ConfigurationMultiSelect.razor index 0ab1b73d..9c974e02 100644 --- a/app/MindWork AI Studio/Components/ConfigurationMultiSelect.razor +++ b/app/MindWork AI Studio/Components/ConfigurationMultiSelect.razor @@ -1,8 +1,8 @@ @inherits ConfigurationBase -@typeparam T +@typeparam TData /// Configuration component for selecting many values from a list. /// -/// The type of the value to select. -public partial class ConfigurationMultiSelect : ConfigurationBase +/// The type of the value to select. +public partial class ConfigurationMultiSelect : ConfigurationBase { /// /// The data to select from. /// [Parameter] - public IEnumerable> Data { get; set; } = []; + public IEnumerable> Data { get; set; } = []; /// /// The selected values. /// [Parameter] - public Func> SelectedValues { get; set; } = () => []; + public Func> SelectedValues { get; set; } = () => []; /// /// An action that is called when the selection changes. /// [Parameter] - public Action> SelectionUpdate { get; set; } = _ => { }; + public Action> SelectionUpdate { get; set; } = _ => { }; - private async Task OptionChanged(IEnumerable? updatedValues) + private async Task OptionChanged(IEnumerable? updatedValues) { if(updatedValues is null) this.SelectionUpdate([]); @@ -41,14 +41,14 @@ public partial class ConfigurationMultiSelect : ConfigurationBase private static string GetClass => $"{MARGIN_CLASS} rounded-lg"; - private string GetMultiSelectionText(List? selectedValues) + private string GetMultiSelectionText(List? selectedValues) { if(selectedValues is null || selectedValues.Count == 0) - return "No preview features selected."; + return T("No preview features selected."); if(selectedValues.Count == 1) - return $"You have selected 1 preview feature."; + return T("You have selected 1 preview feature."); - return $"You have selected {selectedValues.Count} preview features."; + return string.Format(T("You have selected {0} preview features."), selectedValues.Count); } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor b/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor index 3f0978cc..4653822f 100644 --- a/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor +++ b/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor @@ -1 +1,2 @@ - \ No newline at end of file +@inherits MSGComponentBase + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs b/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs index a1e60c87..28298f75 100644 --- a/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ConfigurationProviderSelection.razor.cs @@ -2,13 +2,15 @@ using System.Diagnostics.CodeAnalysis; using AIStudio.Provider; using AIStudio.Settings; - +using AIStudio.Tools.PluginSystem; using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class ConfigurationProviderSelection : ComponentBase, IMessageBusReceiver, IDisposable +public partial class ConfigurationProviderSelection : MSGComponentBase { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ConfigurationProviderSelection).Namespace, nameof(ConfigurationProviderSelection)); + [Parameter] public Func SelectedValue { get; set; } = () => string.Empty; @@ -25,25 +27,16 @@ public partial class ConfigurationProviderSelection : ComponentBase, IMessageBus public Func Disabled { get; set; } = () => false; [Parameter] - public Func HelpText { get; set; } = () => "Select a provider that is preselected."; + public Func HelpText { get; set; } = () => TB("Select a provider that is preselected."); [Parameter] public Tools.Components Component { get; set; } = Tools.Components.NONE; - - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - - [Inject] - private MessageBus MessageBus { get; init; } = null!; #region Overrides of ComponentBase protected override async Task OnParametersSetAsync() { - // Register this component with the message bus: - this.MessageBus.RegisterComponent(this); - this.MessageBus.ApplyFilters(this, [], [ Event.CONFIGURATION_CHANGED ]); - + this.ApplyFilters([], [ Event.CONFIGURATION_CHANGED ]); await base.OnParametersSetAsync(); } @@ -53,7 +46,7 @@ public partial class ConfigurationProviderSelection : ComponentBase, IMessageBus private IEnumerable> FilteredData() { if(this.Component is not Tools.Components.NONE and not Tools.Components.APP_SETTINGS) - yield return new("Use app default", string.Empty); + yield return new(T("Use app default"), string.Empty); var minimumLevel = this.SettingsManager.GetMinimumConfidenceLevel(this.Component); foreach (var providerId in this.Data) @@ -63,12 +56,10 @@ public partial class ConfigurationProviderSelection : ComponentBase, IMessageBus yield return providerId; } } - - #region Implementation of IMessageBusReceiver - public string ComponentName => nameof(ConfigurationProviderSelection); - - public async Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) + #region Overrides of MSGComponentBase + + protected override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) { @@ -90,19 +81,5 @@ public partial class ConfigurationProviderSelection : ComponentBase, IMessageBus } } - public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) - { - return Task.FromResult(default); - } - - #endregion - - #region Implementation of IDisposable - - public void Dispose() - { - this.MessageBus.Unregister(this); - } - #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DataSourceSelection.razor b/app/MindWork AI Studio/Components/DataSourceSelection.razor index f99aa6fa..29c0d709 100644 --- a/app/MindWork AI Studio/Components/DataSourceSelection.razor +++ b/app/MindWork AI Studio/Components/DataSourceSelection.razor @@ -1,9 +1,9 @@ @using AIStudio.Settings - +@inherits MSGComponentBase @if (this.SelectionMode is DataSourceSelectionMode.SELECTION_MODE) {
- + @if (this.PopoverTriggerMode is PopoverTriggerMode.ICON) { @@ -11,7 +11,7 @@ else { - Select data + @T("Select data") } @@ -22,10 +22,12 @@ - Data Source Selection + + @T("Data Source Selection") + - - + + @@ -40,57 +42,52 @@ else if (this.SettingsManager.ConfigurationData.DataSources.Count == 0) { - You haven't configured any data sources. To grant the AI access to your data, you need to - add such a source. However, if you wish to use data from your device, you first have to set up - a so-called embedding. This embedding is necessary so the AI can effectively search your data, - find and retrieve the correct information required for each task. In addition to local data, - you can also incorporate your company's data. To do so, your company must provide the data through - an ERI (External Retrieval Interface). + @T("You haven't configured any data sources. To grant the AI access to your data, you need to add such a source. However, if you wish to use data from your device, you first have to set up a so-called embedding. This embedding is necessary so the AI can effectively search your data, find and retrieve the correct information required for each task. In addition to local data, you can also incorporate your company's data. To do so, your company must provide the data through an ERI (External Retrieval Interface).") - Manage Data Sources + @T("Manage Data Sources") - Read more about ERI + @T("Read more about ERI") } else if (this.showDataSourceSelection) { - + @if (this.areDataSourcesEnabled) { - + @if (this.SettingsManager.ConfigurationData.AgentRetrievalContextValidation.EnableRetrievalContextValidation) { - + } @switch (this.aiBasedSourceSelection) { case true when this.availableDataSources.Count == 0: - Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable. + @T("Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable.") break; case true when this.DataSourcesAISelected.Count == 0: - The AI evaluates each of your inputs to determine whether and which data sources are necessary. Currently, the AI has not selected any source. + @T("The AI evaluates each of your inputs to determine whether and which data sources are necessary. Currently, the AI has not selected any source.") break; case false when this.availableDataSources.Count == 0: - Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable. + @T("Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable.") break; case false: - + @foreach (var source in this.availableDataSources) { @@ -104,7 +101,7 @@ case true: - + @foreach (var source in this.availableDataSources) { @@ -114,7 +111,7 @@ } - + @foreach (var source in this.DataSourcesAISelected) { @@ -141,7 +138,7 @@ - Close + @T("Close") @@ -152,7 +149,9 @@ else if (this.SelectionMode is DataSourceSelectionMode.CONFIGURATION_MODE) { - Data Source Selection + + @T("Data Source Selection") + @if (!string.IsNullOrWhiteSpace(this.ConfigurationHeaderMessage)) { @@ -161,12 +160,12 @@ else if (this.SelectionMode is DataSourceSelectionMode.CONFIGURATION_MODE) } - + @if (this.areDataSourcesEnabled) { - - - + + + @foreach (var source in this.availableDataSources) { diff --git a/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs b/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs index 22d4b0cb..5715d52f 100644 --- a/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs +++ b/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs @@ -9,7 +9,7 @@ using DialogOptions = AIStudio.Dialogs.DialogOptions; namespace AIStudio.Components; -public partial class DataSourceSelection : ComponentBase, IMessageBusReceiver, IDisposable +public partial class DataSourceSelection : MSGComponentBase { [Parameter] public DataSourceSelectionMode SelectionMode { get; set; } = DataSourceSelectionMode.SELECTION_MODE; @@ -38,12 +38,6 @@ public partial class DataSourceSelection : ComponentBase, IMessageBusReceiver, I [Parameter] public bool AutoSaveAppSettings { get; set; } - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - - [Inject] - private MessageBus MessageBus { get; init; } = null!; - [Inject] private DataSourceService DataSourceService { get; init; } = null!; @@ -63,8 +57,7 @@ public partial class DataSourceSelection : ComponentBase, IMessageBusReceiver, I protected override async Task OnInitializedAsync() { - this.MessageBus.RegisterComponent(this); - this.MessageBus.ApplyFilters(this, [], [ Event.COLOR_THEME_CHANGED, Event.RAG_AUTO_DATA_SOURCES_SELECTED ]); + this.ApplyFilters([], [ Event.RAG_AUTO_DATA_SOURCES_SELECTED ]); // // Load the settings: @@ -253,19 +246,12 @@ public partial class DataSourceSelection : ComponentBase, IMessageBusReceiver, I private void HideDataSourceSelection() => this.showDataSourceSelection = false; - #region Implementation of IMessageBusReceiver + #region Overrides of MSGComponentBase - public string ComponentName => nameof(ConfidenceInfo); - - public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) + protected override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) { - case Event.COLOR_THEME_CHANGED: - this.showDataSourceSelection = false; - this.StateHasChanged(); - break; - case Event.RAG_AUTO_DATA_SOURCES_SELECTED: if(data is IReadOnlyList aiSelectedDataSources) this.DataSourcesAISelected = aiSelectedDataSources; @@ -273,23 +259,9 @@ public partial class DataSourceSelection : ComponentBase, IMessageBusReceiver, I this.StateHasChanged(); break; } - + return Task.CompletedTask; } - public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) - { - return Task.FromResult(default); - } - - #endregion - - #region Implementation of IDisposable - - public void Dispose() - { - this.MessageBus.Unregister(this); - } - #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DebouncedTextField.razor b/app/MindWork AI Studio/Components/DebouncedTextField.razor new file mode 100644 index 00000000..83e205d8 --- /dev/null +++ b/app/MindWork AI Studio/Components/DebouncedTextField.razor @@ -0,0 +1,3 @@ +@inherits MudComponentBase + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/DebouncedTextField.razor.cs b/app/MindWork AI Studio/Components/DebouncedTextField.razor.cs new file mode 100644 index 00000000..885a8488 --- /dev/null +++ b/app/MindWork AI Studio/Components/DebouncedTextField.razor.cs @@ -0,0 +1,80 @@ +using Microsoft.AspNetCore.Components; + +using Timer = System.Timers.Timer; + +namespace AIStudio.Components; + +public partial class DebouncedTextField : MudComponentBase +{ + [Parameter] + public string Label { get; set; } = string.Empty; + + [Parameter] + public string Text { get; set; } = string.Empty; + + [Parameter] + public EventCallback TextChanged { get; set; } + + [Parameter] + public Func WhenTextChangedAsync { get; set; } = _ => Task.CompletedTask; + + [Parameter] + public Action WhenTextCanged { get; set; } = _ => { }; + + [Parameter] + public int Lines { get; set; } = 1; + + [Parameter] + public int MaxLines { get; set; } = 1; + + [Parameter] + public Dictionary Attributes { get; set; } = []; + + [Parameter] + public Func ValidationFunc { get; set; } = _ => null; + + [Parameter] + public string HelpText { get; set; } = string.Empty; + + [Parameter] + public string Placeholder { get; set; } = string.Empty; + + [Parameter] + public string Icon { get; set; } = string.Empty; + + [Parameter] + public TimeSpan DebounceTime { get; set; } = TimeSpan.FromMilliseconds(800); + + [Parameter] + public bool Disabled { get; set; } + + private readonly Timer debounceTimer = new(); + private string text = string.Empty; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + this.text = this.Text; + this.debounceTimer.AutoReset = false; + this.debounceTimer.Interval = this.DebounceTime.TotalMilliseconds; + this.debounceTimer.Elapsed += (_, _) => + { + this.debounceTimer.Stop(); + this.InvokeAsync(async () => await this.TextChanged.InvokeAsync(this.text)); + this.InvokeAsync(async () => await this.WhenTextChangedAsync(this.text)); + this.InvokeAsync(() => this.WhenTextCanged(this.text)); + }; + + await base.OnInitializedAsync(); + } + + #endregion + + private void OnTextChanged(string value) + { + this.text = value; + this.debounceTimer.Stop(); + this.debounceTimer.Start(); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ExpansionPanel.razor b/app/MindWork AI Studio/Components/ExpansionPanel.razor index 278207ea..713444ea 100644 --- a/app/MindWork AI Studio/Components/ExpansionPanel.razor +++ b/app/MindWork AI Studio/Components/ExpansionPanel.razor @@ -2,7 +2,9 @@
- @this.HeaderText + + @this.HeaderText + @if (this.ShowEndButton) { diff --git a/app/MindWork AI Studio/Components/InnerScrolling.razor.cs b/app/MindWork AI Studio/Components/InnerScrolling.razor.cs index 6dd0143e..d8ca22c6 100644 --- a/app/MindWork AI Studio/Components/InnerScrolling.razor.cs +++ b/app/MindWork AI Studio/Components/InnerScrolling.razor.cs @@ -44,10 +44,8 @@ public partial class InnerScrolling : MSGComponentBase #endregion #region Overrides of MSGComponentBase - - public override string ComponentName => nameof(InnerScrolling); - public override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default + protected override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) { @@ -59,11 +57,6 @@ public partial class InnerScrolling : MSGComponentBase return Task.CompletedTask; } - public override Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) where TResult : default where TPayload : default - { - return Task.FromResult(default(TResult)); - } - #endregion private string MinWidthStyle => string.IsNullOrWhiteSpace(this.MinWidth) ? string.Empty : $"min-width: {this.MinWidth}; "; diff --git a/app/MindWork AI Studio/Components/Issues.razor b/app/MindWork AI Studio/Components/Issues.razor index 413545de..39eda730 100644 --- a/app/MindWork AI Studio/Components/Issues.razor +++ b/app/MindWork AI Studio/Components/Issues.razor @@ -1,7 +1,10 @@ +@inherits MSGComponentBase @if (this.IssuesData.Any()) { - Issues + + @T("Issues") + @foreach (var issue in this.IssuesData) { diff --git a/app/MindWork AI Studio/Components/Issues.razor.cs b/app/MindWork AI Studio/Components/Issues.razor.cs index effd20f6..5d01a029 100644 --- a/app/MindWork AI Studio/Components/Issues.razor.cs +++ b/app/MindWork AI Studio/Components/Issues.razor.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class Issues : ComponentBase +public partial class Issues : MSGComponentBase { [Parameter] public IEnumerable IssuesData { get; set; } = []; diff --git a/app/MindWork AI Studio/Components/MSGComponentBase.cs b/app/MindWork AI Studio/Components/MSGComponentBase.cs index 4dddb57d..739f6c68 100644 --- a/app/MindWork AI Studio/Components/MSGComponentBase.cs +++ b/app/MindWork AI Studio/Components/MSGComponentBase.cs @@ -1,10 +1,11 @@ using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public abstract class MSGComponentBase : ComponentBase, IDisposable, IMessageBusReceiver +public abstract class MSGComponentBase : ComponentBase, IDisposable, IMessageBusReceiver, ILang { [Inject] protected SettingsManager SettingsManager { get; init; } = null!; @@ -12,21 +13,37 @@ public abstract class MSGComponentBase : ComponentBase, IDisposable, IMessageBus [Inject] protected MessageBus MessageBus { get; init; } = null!; + [Inject] + // ReSharper disable once UnusedAutoPropertyAccessor.Local + private ILogger Logger { get; init; } = null!; + + private ILanguagePlugin Lang { get; set; } = PluginFactory.BaseLanguage; + #region Overrides of ComponentBase - protected override void OnInitialized() + protected override async Task OnInitializedAsync() { + this.Lang = await this.SettingsManager.GetActiveLanguagePlugin(); + this.MessageBus.RegisterComponent(this); - base.OnInitialized(); + await base.OnInitializedAsync(); } #endregion + #region Implementation of ILang + + /// + public string T(string fallbackEN) => this.GetText(this.Lang, fallbackEN); + + /// + public string T(string fallbackEN, string? typeNamespace, string? typeName) => this.GetText(this.Lang, fallbackEN, typeNamespace, typeName); + + #endregion + #region Implementation of IMessageBusReceiver - public abstract string ComponentName { get; } - - public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) + public async Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) { switch (triggeredEvent) { @@ -34,27 +51,31 @@ public abstract class MSGComponentBase : ComponentBase, IDisposable, IMessageBus this.StateHasChanged(); break; - default: - return this.ProcessIncomingMessage(sendingComponent, triggeredEvent, data); + case Event.PLUGINS_RELOADED: + this.Lang = await this.SettingsManager.GetActiveLanguagePlugin(); + await this.InvokeAsync(this.StateHasChanged); + break; } + await this.ProcessIncomingMessage(sendingComponent, triggeredEvent, data); + } + + public async Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) + { + return await this.ProcessIncomingMessageWithResult(sendingComponent, triggeredEvent, data); + } + + #endregion + + protected virtual Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) + { return Task.CompletedTask; } - - public abstract Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data); - - public abstract Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data); - #endregion - - #region Implementation of IDisposable - - public void Dispose() + protected virtual Task ProcessIncomingMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) { - this.MessageBus.Unregister(this); + return Task.FromResult(default); } - - #endregion protected async Task SendMessage(Event triggeredEvent, T? data = default) { @@ -66,14 +87,34 @@ public abstract class MSGComponentBase : ComponentBase, IDisposable, IMessageBus return await this.MessageBus.SendMessageUseFirstResult(this, triggeredEvent, data); } - protected void ApplyFilters(ComponentBase[] components, Event[] events) + /// + /// Define for which components and events you want to receive messages. + /// + /// A list of components for which you want to receive messages. Use an empty list to receive messages from all components. + /// A list of events for which you want to receive messages. + protected void ApplyFilters(ComponentBase[] filterComponents, Event[] events) { // Append the color theme changed event to the list of events: var eventsList = new List(events) { - Event.COLOR_THEME_CHANGED + Event.COLOR_THEME_CHANGED, + Event.PLUGINS_RELOADED, }; - this.MessageBus.ApplyFilters(this, components, eventsList.ToArray()); + this.MessageBus.ApplyFilters(this, filterComponents, eventsList.ToArray()); } + + protected virtual void DisposeResources() + { + } + + #region Implementation of IDisposable + + public void Dispose() + { + this.MessageBus.Unregister(this); + this.DisposeResources(); + } + + #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Motivation.razor b/app/MindWork AI Studio/Components/Motivation.razor index 5b938978..a8242f22 100644 --- a/app/MindWork AI Studio/Components/Motivation.razor +++ b/app/MindWork AI Studio/Components/Motivation.razor @@ -1,31 +1,32 @@ +@inherits MSGComponentBase - Hello, my name is Thorsten Sommer, and I am the initial creator of MindWork AI Studio. The motivation behind developing this app stems from several crucial needs and observations I made over time. + @T("Hello, my name is Thorsten Sommer, and I am the initial creator of MindWork AI Studio. The motivation behind developing this app stems from several crucial needs and observations I made over time.") - Personal Needs and Limitations of Web Services + @T("Personal Needs and Limitations of Web Services") - Relying on web services like ChatGPT was not a sustainable solution for me. I needed an AI that could also access files directly on my device, a functionality web services inherently lack due to security and privacy constraints. Although I could have scripted something in Python to meet my needs, this approach was too cumbersome for daily use. More importantly, I wanted to develop a solution that anyone could use without needing any programming knowledge. + @T("Relying on web services like ChatGPT was not a sustainable solution for me. I needed an AI that could also access files directly on my device, a functionality web services inherently lack due to security and privacy constraints. Although I could have scripted something in Python to meet my needs, this approach was too cumbersome for daily use. More importantly, I wanted to develop a solution that anyone could use without needing any programming knowledge.") - Limitations of Existing Solutions + @T("Limitations of Existing Solutions") - While exploring available solutions, I found a desktop application called Anything LLM. Unfortunately, it fell short of meeting my specific requirements and lacked the user interface design I envisioned. For macOS, there were several apps similar to what I had in mind, but they were all commercial solutions shrouded in uncertainty. The developers' identities and the origins of these apps were unclear, raising significant security concerns. Reports from users about stolen API keys and unwanted charges only amplified my reservations. + @T("While exploring available solutions, I found a desktop application called Anything LLM. Unfortunately, it fell short of meeting my specific requirements and lacked the user interface design I envisioned. For macOS, there were several apps similar to what I had in mind, but they were all commercial solutions shrouded in uncertainty. The developers' identities and the origins of these apps were unclear, raising significant security concerns. Reports from users about stolen API keys and unwanted charges only amplified my reservations.") - Cross-Platform and Modern Development + @T("Cross-Platform and Modern Development") - Given that my employer's workplace uses both Windows and Linux, I wanted a cross-platform solution that would work seamlessly across all major operating systems, including macOS. Additionally, I wanted to demonstrate that it is possible to create modern, efficient, cross-platform applications without resorting to Electron bloatware. The combination of .NET and Rust with Tauri proved to be an excellent technology stack for building such robust applications. + @T("Given that my employer's workplace uses both Windows and Linux, I wanted a cross-platform solution that would work seamlessly across all major operating systems, including macOS. Additionally, I wanted to demonstrate that it is possible to create modern, efficient, cross-platform applications without resorting to Electron bloatware. The combination of .NET and Rust with Tauri proved to be an excellent technology stack for building such robust applications.") - Through MindWork AI Studio, I aim to provide a secure, flexible, and user-friendly tool that caters to a wider audience without compromising on functionality or design. This app is the culmination of my desire to meet personal requirements, address existing gaps in the market, and showcase innovative development practices. + @T("Through MindWork AI Studio, I aim to provide a secure, flexible, and user-friendly tool that caters to a wider audience without compromising on functionality or design. This app is the culmination of my desire to meet personal requirements, address existing gaps in the market, and showcase innovative development practices.") \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Motivation.razor.cs b/app/MindWork AI Studio/Components/Motivation.razor.cs index 23e1a767..21ed26ee 100644 --- a/app/MindWork AI Studio/Components/Motivation.razor.cs +++ b/app/MindWork AI Studio/Components/Motivation.razor.cs @@ -1,7 +1,3 @@ -using Microsoft.AspNetCore.Components; - namespace AIStudio.Components; -public partial class Motivation : ComponentBase -{ -} \ No newline at end of file +public partial class Motivation : MSGComponentBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/MudTextList.razor b/app/MindWork AI Studio/Components/MudTextList.razor index f0ec6295..0b4a3fa3 100644 --- a/app/MindWork AI Studio/Components/MudTextList.razor +++ b/app/MindWork AI Studio/Components/MudTextList.razor @@ -2,7 +2,9 @@ @foreach(var item in this.Items) { - @item.Header: @item.Text + + @item.Header: @item.Text + } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/PreviewAlpha.razor b/app/MindWork AI Studio/Components/PreviewAlpha.razor index b1b629d8..46a1a9b3 100644 --- a/app/MindWork AI Studio/Components/PreviewAlpha.razor +++ b/app/MindWork AI Studio/Components/PreviewAlpha.razor @@ -1,19 +1,18 @@ +@inherits MSGComponentBase - Alpha + @T("Alpha")
- This feature is currently in the alpha phase. - Expect bugs and unfinished work. + @T("This feature is currently in the alpha phase. Expect bugs and unfinished work.") - Alpha phase means that we are working on the - last details before the beta phase. + @T("Alpha phase means that we are working on the last details before the beta phase.")
diff --git a/app/MindWork AI Studio/Components/PreviewAlpha.razor.cs b/app/MindWork AI Studio/Components/PreviewAlpha.razor.cs index deb962c4..4af15f39 100644 --- a/app/MindWork AI Studio/Components/PreviewAlpha.razor.cs +++ b/app/MindWork AI Studio/Components/PreviewAlpha.razor.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class PreviewAlpha : ComponentBase +public partial class PreviewAlpha : MSGComponentBase { [Parameter] public bool ApplyInnerScrollingFix { get; set; } diff --git a/app/MindWork AI Studio/Components/PreviewBeta.razor b/app/MindWork AI Studio/Components/PreviewBeta.razor index dd54225e..5494f51a 100644 --- a/app/MindWork AI Studio/Components/PreviewBeta.razor +++ b/app/MindWork AI Studio/Components/PreviewBeta.razor @@ -1,18 +1,18 @@ +@inherits MSGComponentBase - Beta + @T("Beta")
- This feature is currently in the beta phase. - It is still be possible that there are some bugs. + @T("This feature is currently in the beta phase. It is still be possible that there are some bugs.") - Beta phase means that we are testing the feature. + @T("Beta phase means that we are testing the feature.")
diff --git a/app/MindWork AI Studio/Components/PreviewBeta.razor.cs b/app/MindWork AI Studio/Components/PreviewBeta.razor.cs index d8fee758..d73a9c53 100644 --- a/app/MindWork AI Studio/Components/PreviewBeta.razor.cs +++ b/app/MindWork AI Studio/Components/PreviewBeta.razor.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class PreviewBeta : ComponentBase +public partial class PreviewBeta : MSGComponentBase { [Parameter] public bool ApplyInnerScrollingFix { get; set; } diff --git a/app/MindWork AI Studio/Components/PreviewExperimental.razor b/app/MindWork AI Studio/Components/PreviewExperimental.razor index bedc9e4f..a63f44a5 100644 --- a/app/MindWork AI Studio/Components/PreviewExperimental.razor +++ b/app/MindWork AI Studio/Components/PreviewExperimental.razor @@ -1,21 +1,18 @@ +@inherits MSGComponentBase - Experimental + @T("Experimental")
- This feature is currently in the experimental phase. - Expect bugs, unfinished work, changes in future - versions, and more. + @T("This feature is currently in the experimental phase. Expect bugs, unfinished work, changes in future versions, and more.") - Experimental phase means that we have a vision for a feature - but not a clear plan yet. We are still exploring the - possibilities. + @T("Experimental phase means that we have a vision for a feature but not a clear plan yet. We are still exploring the possibilities.")
diff --git a/app/MindWork AI Studio/Components/PreviewExperimental.razor.cs b/app/MindWork AI Studio/Components/PreviewExperimental.razor.cs index 0588d489..d4184806 100644 --- a/app/MindWork AI Studio/Components/PreviewExperimental.razor.cs +++ b/app/MindWork AI Studio/Components/PreviewExperimental.razor.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class PreviewExperimental : ComponentBase +public partial class PreviewExperimental : MSGComponentBase { [Parameter] public bool ApplyInnerScrollingFix { get; set; } diff --git a/app/MindWork AI Studio/Components/PreviewPrototype.razor b/app/MindWork AI Studio/Components/PreviewPrototype.razor index 9aa8bbc0..e3cfc917 100644 --- a/app/MindWork AI Studio/Components/PreviewPrototype.razor +++ b/app/MindWork AI Studio/Components/PreviewPrototype.razor @@ -1,20 +1,18 @@ +@inherits MSGComponentBase - Prototype + @T("Prototype")
- This feature is currently in the prototype phase. - Expect bugs, unfinished work, changes in future - versions, and more. + @T("This feature is currently in the prototype phase. Expect bugs, unfinished work, changes in future versions, and more.") - Prototype phase means that we have a plan but we - are still working on it. + @T("Prototype phase means that we have a plan but we are still working on it.")
diff --git a/app/MindWork AI Studio/Components/PreviewPrototype.razor.cs b/app/MindWork AI Studio/Components/PreviewPrototype.razor.cs index 3ceab4d1..ad4c3c9c 100644 --- a/app/MindWork AI Studio/Components/PreviewPrototype.razor.cs +++ b/app/MindWork AI Studio/Components/PreviewPrototype.razor.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class PreviewPrototype : ComponentBase +public partial class PreviewPrototype : MSGComponentBase { [Parameter] public bool ApplyInnerScrollingFix { get; set; } diff --git a/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor b/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor index 86954ddd..4ee266b0 100644 --- a/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor +++ b/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor @@ -1,18 +1,18 @@ +@inherits MSGComponentBase - Release Candidate + @T("Release Candidate")
- This feature is about to be released. We think it's ready for production. - There should be no more bugs. + @T("This feature is about to be released. We think it's ready for production. There should be no more bugs.") - Release candidates are the final step before a feature is proven to be stable. + @T("Release candidates are the final step before a feature is proven to be stable.")
diff --git a/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor.cs b/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor.cs index 249f1f35..4de0ec86 100644 --- a/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor.cs +++ b/app/MindWork AI Studio/Components/PreviewReleaseCandidate.razor.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class PreviewReleaseCandidate : ComponentBase +public partial class PreviewReleaseCandidate : MSGComponentBase { [Parameter] public bool ApplyInnerScrollingFix { get; set; } diff --git a/app/MindWork AI Studio/Components/ProfileFormSelection.razor b/app/MindWork AI Studio/Components/ProfileFormSelection.razor index 075a0b2a..f963ced7 100644 --- a/app/MindWork AI Studio/Components/ProfileFormSelection.razor +++ b/app/MindWork AI Studio/Components/ProfileFormSelection.razor @@ -1,10 +1,15 @@ @using AIStudio.Settings +@inherits MSGComponentBase - - @foreach (var profile in this.SettingsManager.ConfigurationData.Profiles.GetAllProfiles()) - { - - @profile.Name - - } - \ No newline at end of file + + + @foreach (var profile in this.SettingsManager.ConfigurationData.Profiles.GetAllProfiles()) + { + + @profile.Name + + } + + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ProfileFormSelection.razor.cs b/app/MindWork AI Studio/Components/ProfileFormSelection.razor.cs index 2b27e6c3..ec71737e 100644 --- a/app/MindWork AI Studio/Components/ProfileFormSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ProfileFormSelection.razor.cs @@ -1,10 +1,13 @@ +using AIStudio.Dialogs.Settings; using AIStudio.Settings; using Microsoft.AspNetCore.Components; +using DialogOptions = AIStudio.Dialogs.DialogOptions; + namespace AIStudio.Components; -public partial class ProfileFormSelection : ComponentBase +public partial class ProfileFormSelection : MSGComponentBase { [Parameter] public Profile Profile { get; set; } = Profile.NO_PROFILE; @@ -16,11 +19,17 @@ public partial class ProfileFormSelection : ComponentBase public Func Validation { get; set; } = _ => null; [Inject] - private SettingsManager SettingsManager { get; init; } = null!; + public IDialogService DialogService { get; init; } = null!; private async Task SelectionChanged(Profile profile) { this.Profile = profile; await this.ProfileChanged.InvokeAsync(profile); } + + private async Task OpenSettingsDialog() + { + var dialogParameters = new DialogParameters(); + await this.DialogService.ShowAsync(T("Open Profile Options"), dialogParameters, DialogOptions.FULLSCREEN); + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ProfileSelection.razor b/app/MindWork AI Studio/Components/ProfileSelection.razor index f4acf35a..b33a8b42 100644 --- a/app/MindWork AI Studio/Components/ProfileSelection.razor +++ b/app/MindWork AI Studio/Components/ProfileSelection.razor @@ -1,10 +1,28 @@ - - - @foreach (var profile in this.SettingsManager.ConfigurationData.Profiles.GetAllProfiles()) - { - - @profile.Name - - } +@using AIStudio.Settings +@inherits MSGComponentBase + + + + @if (this.CurrentProfile != Profile.NO_PROFILE) + { + + @this.CurrentProfile.Name + + } + else + { + + } + + + + + @foreach (var profile in this.SettingsManager.ConfigurationData.Profiles.GetAllProfiles()) + { + + @profile.Name + + } + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ProfileSelection.razor.cs b/app/MindWork AI Studio/Components/ProfileSelection.razor.cs index d2b41a57..85450db3 100644 --- a/app/MindWork AI Studio/Components/ProfileSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ProfileSelection.razor.cs @@ -1,11 +1,16 @@ +using AIStudio.Dialogs.Settings; using AIStudio.Settings; - +using AIStudio.Tools.PluginSystem; using Microsoft.AspNetCore.Components; +using DialogOptions = AIStudio.Dialogs.DialogOptions; + namespace AIStudio.Components; -public partial class ProfileSelection : ComponentBase +public partial class ProfileSelection : MSGComponentBase { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ProfileSelection).Namespace, nameof(ProfileSelection)); + [Parameter] public Profile CurrentProfile { get; set; } = Profile.NO_PROFILE; @@ -18,8 +23,18 @@ public partial class ProfileSelection : ComponentBase [Parameter] public string MarginRight { get; set; } = string.Empty; + [Parameter] + public bool Disabled { get; set; } + + [Parameter] + public string DisabledText { get; set; } = string.Empty; + [Inject] - private SettingsManager SettingsManager { get; init; } = null!; + private IDialogService DialogService { get; init; } = null!; + + private readonly string defaultToolTipText = TB("You can switch between your profiles here"); + + private string ToolTipText => this.Disabled ? this.DisabledText : this.defaultToolTipText; private string MarginClass => $"{this.MarginLeft} {this.MarginRight}"; @@ -28,4 +43,10 @@ public partial class ProfileSelection : ComponentBase this.CurrentProfile = profile; await this.CurrentProfileChanged.InvokeAsync(profile); } + + private async Task OpenSettingsDialog() + { + var dialogParameters = new DialogParameters(); + await this.DialogService.ShowAsync(T("Open Profile Options"), dialogParameters, DialogOptions.FULLSCREEN); + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ProviderSelection.razor b/app/MindWork AI Studio/Components/ProviderSelection.razor index 9082f016..793f87c7 100644 --- a/app/MindWork AI Studio/Components/ProviderSelection.razor +++ b/app/MindWork AI Studio/Components/ProviderSelection.razor @@ -1,6 +1,6 @@ @using AIStudio.Settings - - +@inherits MSGComponentBase + @foreach (var provider in this.GetAvailableProviders()) { diff --git a/app/MindWork AI Studio/Components/ProviderSelection.razor.cs b/app/MindWork AI Studio/Components/ProviderSelection.razor.cs index 66158211..b476b19f 100644 --- a/app/MindWork AI Studio/Components/ProviderSelection.razor.cs +++ b/app/MindWork AI Studio/Components/ProviderSelection.razor.cs @@ -2,13 +2,12 @@ using System.Diagnostics.CodeAnalysis; using AIStudio.Assistants; using AIStudio.Provider; -using AIStudio.Settings; using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class ProviderSelection : ComponentBase +public partial class ProviderSelection : MSGComponentBase { [CascadingParameter] public AssistantBase? AssistantBase { get; set; } @@ -22,9 +21,6 @@ public partial class ProviderSelection : ComponentBase [Parameter] public Func ValidateProvider { get; set; } = _ => null; - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - private async Task SelectionChanged(AIStudio.Settings.Provider provider) { this.ProviderSettings = provider; diff --git a/app/MindWork AI Studio/Components/ReadPDFContent.razor b/app/MindWork AI Studio/Components/ReadPDFContent.razor new file mode 100644 index 00000000..bd101740 --- /dev/null +++ b/app/MindWork AI Studio/Components/ReadPDFContent.razor @@ -0,0 +1,4 @@ +@inherits MSGComponentBase + + @T("Use PDF content as input") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ReadPDFContent.razor.cs b/app/MindWork AI Studio/Components/ReadPDFContent.razor.cs new file mode 100644 index 00000000..ab050bd3 --- /dev/null +++ b/app/MindWork AI Studio/Components/ReadPDFContent.razor.cs @@ -0,0 +1,31 @@ +using AIStudio.Tools.Rust; +using AIStudio.Tools.Services; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Components; + +public partial class ReadPDFContent : MSGComponentBase +{ + [Parameter] + public string PDFContent { get; set; } = string.Empty; + + [Parameter] + public EventCallback PDFContentChanged { get; set; } + + [Inject] + private RustService RustService { get; init; } = null!; + + private async Task SelectFile() + { + var pdfFile = await this.RustService.SelectFile(T("Select PDF file"), FileTypeFilter.PDF); + if (pdfFile.UserCancelled) + return; + + if(!File.Exists(pdfFile.SelectedFilePath)) + return; + + var pdfText = await this.RustService.GetPDFText(pdfFile.SelectedFilePath); + await this.PDFContentChanged.InvokeAsync(pdfText); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ReadWebContent.razor b/app/MindWork AI Studio/Components/ReadWebContent.razor index 9cb451b2..f5524a20 100644 --- a/app/MindWork AI Studio/Components/ReadWebContent.razor +++ b/app/MindWork AI Studio/Components/ReadWebContent.razor @@ -1,12 +1,13 @@ - - +@inherits MSGComponentBase + + @if (this.showWebContentReader) { - + - + @if (this.AgentIsRunning) diff --git a/app/MindWork AI Studio/Components/ReadWebContent.razor.cs b/app/MindWork AI Studio/Components/ReadWebContent.razor.cs index 6cf40701..455c87dd 100644 --- a/app/MindWork AI Studio/Components/ReadWebContent.razor.cs +++ b/app/MindWork AI Studio/Components/ReadWebContent.razor.cs @@ -1,21 +1,17 @@ using AIStudio.Agents; using AIStudio.Chat; -using AIStudio.Settings; using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class ReadWebContent : ComponentBase +public partial class ReadWebContent : MSGComponentBase { [Inject] private HTMLParser HTMLParser { get; init; } = null!; [Inject] private AgentTextContentCleaner AgentTextContentCleaner { get; init; } = null!; - - [Inject] - protected SettingsManager SettingsManager { get; set; } = null!; [Parameter] public string Content { get; set; } = string.Empty; @@ -156,7 +152,7 @@ public partial class ReadWebContent : ComponentBase if(shouldUseAgent && this.providerSettings == default) { this.isProviderValid = false; - return "Please select a provider to use the cleanup agent."; + return T("Please select a provider to use the cleanup agent."); } this.isProviderValid = true; @@ -168,20 +164,20 @@ public partial class ReadWebContent : ComponentBase if(string.IsNullOrWhiteSpace(url)) { this.urlIsValid = false; - return "Please provide a URL to load the content from."; + return T("Please provide a URL to load the content from."); } var urlParsingResult = Uri.TryCreate(url, UriKind.Absolute, out var uriResult); if(!urlParsingResult) { this.urlIsValid = false; - return "Please provide a valid URL."; + return T("Please provide a valid URL."); } if(uriResult is not { Scheme: "http" or "https" }) { this.urlIsValid = false; - return "Please provide a valid HTTP or HTTPS URL."; + return T("Please provide a valid HTTP or HTTPS URL."); } this.urlIsValid = true; diff --git a/app/MindWork AI Studio/Components/SecretInputField.razor b/app/MindWork AI Studio/Components/SecretInputField.razor new file mode 100644 index 00000000..c1e9ddba --- /dev/null +++ b/app/MindWork AI Studio/Components/SecretInputField.razor @@ -0,0 +1,20 @@ +@inherits MSGComponentBase + + + + + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/SecretInputField.razor.cs b/app/MindWork AI Studio/Components/SecretInputField.razor.cs new file mode 100644 index 00000000..e4c63a56 --- /dev/null +++ b/app/MindWork AI Studio/Components/SecretInputField.razor.cs @@ -0,0 +1,54 @@ +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Components; + +public partial class SecretInputField : MSGComponentBase +{ + private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); + + [Parameter] + public string Secret { get; set; } = string.Empty; + + [Parameter] + public EventCallback SecretChanged { get; set; } + + [Parameter] + public string Label { get; set; } = string.Empty; + + [Parameter] + public string Placeholder { get; set; } = string.Empty; + + [Parameter] + public Func Validation { get; set; } = _ => null; + + [Parameter] + public string Class { get; set; } = "mb-3"; + + #region Overrides of MSGComponentBase + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + + // Configure the spellchecking for the instance name input: + this.SettingsManager.InjectSpellchecking(SPELLCHECK_ATTRIBUTES); + } + + #endregion + + private bool isSecretVisible; + + private InputType InputType => this.isSecretVisible ? InputType.Text : InputType.Password; + + private string InputTypeIcon => this.isSecretVisible ? Icons.Material.Filled.Visibility : Icons.Material.Filled.VisibilityOff; + + private string ToggleVisibilityTooltip => this.isSecretVisible ? T("Hide content") : T("Show content"); + + private Task OnSecretChanged(string arg) + { + this.Secret = arg; + return this.SecretChanged.InvokeAsync(arg); + } + + private void ToggleVisibility() => this.isSecretVisible = !this.isSecretVisible; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/SelectDirectory.razor b/app/MindWork AI Studio/Components/SelectDirectory.razor index 29a0fc8f..1cf19ec4 100644 --- a/app/MindWork AI Studio/Components/SelectDirectory.razor +++ b/app/MindWork AI Studio/Components/SelectDirectory.razor @@ -1,3 +1,5 @@ +@inherits MSGComponentBase + - Choose Directory + @T("Choose Directory") \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/SelectDirectory.razor.cs b/app/MindWork AI Studio/Components/SelectDirectory.razor.cs index a4ebbf8b..a305f2b7 100644 --- a/app/MindWork AI Studio/Components/SelectDirectory.razor.cs +++ b/app/MindWork AI Studio/Components/SelectDirectory.razor.cs @@ -1,11 +1,10 @@ -using AIStudio.Settings; using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class SelectDirectory : ComponentBase +public partial class SelectDirectory : MSGComponentBase { [Parameter] public string Directory { get; set; } = string.Empty; @@ -24,9 +23,6 @@ public partial class SelectDirectory : ComponentBase [Parameter] public Func Validation { get; set; } = _ => null; - - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; [Inject] public RustService RustService { get; set; } = null!; diff --git a/app/MindWork AI Studio/Components/SelectFile.razor b/app/MindWork AI Studio/Components/SelectFile.razor index 34842360..de3971e5 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor +++ b/app/MindWork AI Studio/Components/SelectFile.razor @@ -1,3 +1,5 @@ +@inherits MSGComponentBase + - Choose File + @T("Choose File") \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/SelectFile.razor.cs b/app/MindWork AI Studio/Components/SelectFile.razor.cs index d4a03ad5..9caf3cd7 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor.cs +++ b/app/MindWork AI Studio/Components/SelectFile.razor.cs @@ -1,11 +1,11 @@ -using AIStudio.Settings; +using AIStudio.Tools.Rust; using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class SelectFile : ComponentBase +public partial class SelectFile : MSGComponentBase { [Parameter] public string File { get; set; } = string.Empty; @@ -23,10 +23,10 @@ public partial class SelectFile : ComponentBase public string FileDialogTitle { get; set; } = "Select File"; [Parameter] - public Func Validation { get; set; } = _ => null; + public FileTypeFilter? Filter { get; set; } - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; + [Parameter] + public Func Validation { get; set; } = _ => null; [Inject] public RustService RustService { get; set; } = null!; @@ -55,7 +55,7 @@ public partial class SelectFile : ComponentBase private async Task OpenFileDialog() { - var response = await this.RustService.SelectFile(this.FileDialogTitle, string.IsNullOrWhiteSpace(this.File) ? null : this.File); + var response = await this.RustService.SelectFile(this.FileDialogTitle, this.Filter, string.IsNullOrWhiteSpace(this.File) ? null : this.File); this.Logger.LogInformation($"The user selected the file '{response.SelectedFilePath}'."); if (!response.UserCancelled) diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor index 8da6ff3e..b59f1ca8 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentContentCleaner.razor @@ -3,10 +3,9 @@ - Use Case: this agent is used to clean up text content. It extracts the main content, removes advertisements and other irrelevant things, - and attempts to convert relative links into absolute links so that they can be used. + @T("Use Case: this agent is used to clean up text content. It extracts the main content, removes advertisements and other irrelevant things, and attempts to convert relative links into absolute links so that they can be used.") - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor index f3c1df20..5077aace 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentDataSourceSelection.razor @@ -1,11 +1,11 @@ @inherits SettingsPanelBase - + - Use Case: this agent is used to select the appropriate data sources for the current prompt. + @T("Use Case: this agent is used to select the appropriate data sources for the current prompt.") - + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor index 7de4ea81..f6989939 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelAgentRetrievalContextValidation.razor @@ -1,17 +1,15 @@ @inherits SettingsPanelBase - + - Use Case: this agent is used to validate any retrieval context of any retrieval process. Perhaps there are many of these - retrieval contexts and you want to validate them all. Therefore, you might want to use a cheap and fast LLM for this - job. When using a local or self-hosted LLM, look for a small (e.g. 3B) and fast model. + @T("Use Case: this agent is used to validate any retrieval context of any retrieval process. Perhaps there are many of these retrieval contexts and you want to validate them all. Therefore, you might want to use a cheap and fast LLM for this job. When using a local or self-hosted LLM, look for a small (e.g. 3B) and fast model.") - + @if (this.SettingsManager.ConfigurationData.AgentRetrievalContextValidation.EnableRetrievalContextValidation) { - - + + } diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor index e67aaf5f..88eb9f9c 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor @@ -2,23 +2,34 @@ @using AIStudio.Settings.DataModel @inherits SettingsPanelBase - - - - - - - + - @if(this.SettingsManager.ConfigurationData.App.PreviewVisibility > PreviewVisibility.NONE) + @if (PreviewFeatures.PRE_PLUGINS_2025.IsEnabled(this.SettingsManager)) + { + + + @if (this.SettingsManager.ConfigurationData.App.LanguageBehavior is LangBehavior.MANUAL) + { + + } + } + + + + + + + + + @if (this.SettingsManager.ConfigurationData.App.PreviewVisibility > PreviewVisibility.NONE) { var availablePreviewFeatures = ConfigurationSelectDataFactory.GetPreviewFeaturesData(this.SettingsManager).ToList(); if (availablePreviewFeatures.Count > 0) { - + } } - - - + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor.cs index f4b75bfe..07e69709 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor.cs +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelApp.razor.cs @@ -9,4 +9,16 @@ public partial class SettingsPanelApp : SettingsPanelBase this.SettingsManager.ConfigurationData.App.PreviewVisibility = previewVisibility; this.SettingsManager.ConfigurationData.App.EnabledPreviewFeatures = previewVisibility.FilterPreviewFeatures(this.SettingsManager.ConfigurationData.App.EnabledPreviewFeatures); } + + private async Task UpdateLangBehaviour(LangBehavior behavior) + { + this.SettingsManager.ConfigurationData.App.LanguageBehavior = behavior; + await this.MessageBus.SendMessage(this, Event.PLUGINS_RELOADED); + } + + private async Task UpdateManuallySelectedLanguage(Guid pluginId) + { + this.SettingsManager.ConfigurationData.App.LanguagePluginId = pluginId; + await this.MessageBus.SendMessage(this, Event.PLUGINS_RELOADED); + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelBase.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelBase.cs index c3384167..bad3fca3 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelBase.cs +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelBase.cs @@ -5,20 +5,14 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components.Settings; -public abstract class SettingsPanelBase : ComponentBase +public abstract class SettingsPanelBase : MSGComponentBase { [Parameter] public Func>> AvailableLLMProvidersFunc { get; set; } = () => []; - [Inject] - protected SettingsManager SettingsManager { get; init; } = null!; - [Inject] protected IDialogService DialogService { get; init; } = null!; - [Inject] - protected MessageBus MessageBus { get; init; } = null!; - [Inject] protected RustService RustService { get; init; } = null!; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelChat.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelChat.razor deleted file mode 100644 index 8b274405..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelChat.razor +++ /dev/null @@ -1,22 +0,0 @@ -@using AIStudio.Settings -@using AIStudio.Settings.DataModel -@inherits SettingsPanelBase - - - - - - - - - - - - - - @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) - { - - - } - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelChat.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelChat.razor.cs deleted file mode 100644 index 2650923e..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelChat.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelChat : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor index 7203ff78..a3f38bb4 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor @@ -4,24 +4,17 @@ @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) { - + - Configured Embeddings + @T("Configured Embeddings") - Embeddings are a way to represent words, sentences, entire documents, or even images and videos as digital - fingerprints. Just like each person has a unique fingerprint, embedding models create unique digital patterns - that capture the meaning and characteristics of the content they analyze. When two things are similar in meaning - or content, their digital fingerprints will look very similar. For example, the fingerprints for 'happy' and - 'joyful' would be more alike than those for 'happy' and 'sad'. + @T("Embeddings are a way to represent words, sentences, entire documents, or even images and videos as digital fingerprints. Just like each person has a unique fingerprint, embedding models create unique digital patterns that capture the meaning and characteristics of the content they analyze. When two things are similar in meaning or content, their digital fingerprints will look very similar. For example, the fingerprints for 'happy' and 'joyful' would be more alike than those for 'happy' and 'sad'.") - This helps AI Studio understand and compare things in a way that's similar to how humans do. When you're working on - something, AI Studio can automatically identify related documents and data by comparing their digital fingerprints. - For instance, if you're writing about customer service, AI Studio can instantly find other documents in your data that - discuss similar topics or experiences, even if they use different words. + @T("This helps AI Studio understand and compare things in a way that's similar to how humans do. When you're working on something, AI Studio can automatically identify related documents and data by comparing their digital fingerprints. For instance, if you're writing about customer service, AI Studio can instantly find other documents in your data that discuss similar topics or experiences, even if they use different words.") @@ -29,32 +22,32 @@ - + # - Name - Provider - Model - Actions + @T("Name") + @T("Provider") + @T("Model") + @T("Actions") @context.Num @context.Name - @context.UsedLLMProvider + @context.UsedLLMProvider.ToName() @this.GetEmbeddingProviderModelName(context) - - Open Dashboard - - - Edit - - - Delete - + + + + + + + + + @@ -62,11 +55,13 @@ @if (this.SettingsManager.ConfigurationData.EmbeddingProviders.Count == 0) { - No embeddings configured yet. + + @T("No embeddings configured yet.") + } - Add Embedding + @T("Add Embedding") } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor.cs index 7520e596..5d80211c 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor.cs +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelEmbeddings.razor.cs @@ -39,7 +39,7 @@ public partial class SettingsPanelEmbeddings : SettingsPanelBase { x => x.IsEditing, false }, }; - var dialogReference = await this.DialogService.ShowAsync("Add Embedding Provider", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Add Embedding Provider"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -69,7 +69,7 @@ public partial class SettingsPanelEmbeddings : SettingsPanelBase { x => x.DataHost, embeddingProvider.Host }, }; - var dialogReference = await this.DialogService.ShowAsync("Edit Embedding Provider", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Edit Embedding Provider"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -92,10 +92,10 @@ public partial class SettingsPanelEmbeddings : SettingsPanelBase { var dialogParameters = new DialogParameters { - { "Message", $"Are you sure you want to delete the embedding provider '{provider.Name}'?" }, + { "Message", string.Format(T("Are you sure you want to delete the embedding provider '{0}'?"), provider.Name) }, }; - var dialogReference = await this.DialogService.ShowAsync("Delete Embedding Provider", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Delete Embedding Provider"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelProfiles.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelProfiles.razor deleted file mode 100644 index e49390f0..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelProfiles.razor +++ /dev/null @@ -1,52 +0,0 @@ -@inherits SettingsPanelBase - - - Your Profiles - - Store personal data about yourself in various profiles so that the AIs know your personal context. - This saves you from having to explain your context each time, for example, in every chat. When you - have different roles, you can create a profile for each role. - - - - Are you a project manager in a research facility? You might want to create a profile for your project - management activities, one for your scientific work, and a profile for when you need to write program - code. In these profiles, you can record how much experience you have or which methods you like or - dislike using. Later, you can choose when and where you want to use each profile. - - - - - - - - - # - Profile Name - Actions - - - @context.Num - @context.Name - - - - Edit - - - Delete - - - - - - - @if(this.SettingsManager.ConfigurationData.Profiles.Count == 0) - { - No profiles configured yet. - } - - - Add Profile - - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor index 51db26b4..1ec52625 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor @@ -3,13 +3,12 @@ @using AIStudio.Provider.SelfHosted @inherits SettingsPanelBase - - Configured Providers + + + @T("Configured Providers") + - What we call a provider is the combination of an LLM provider such as OpenAI and a model like GPT-4o. - You can configure as many providers as you want. This way, you can use the appropriate model for each - task. As an LLM provider, you can also choose local providers. However, to use this app, you must - configure at least one provider. + @T("What we call a provider is the combination of an LLM provider such as OpenAI and a model like GPT-4o. You can configure as many providers as you want. This way, you can use the appropriate model for each task. As an LLM provider, you can also choose local providers. However, to use this app, you must configure at least one provider.") @@ -17,19 +16,19 @@ - + # - Instance Name - Provider - Model - Actions + @T("Instance Name") + @T("Provider") + @T("Model") + @T("Actions") @context.Num @context.InstanceName - @context.UsedLLMProvider + @context.UsedLLMProvider.ToName() @if (context.UsedLLMProvider is not LLMProviders.SELF_HOSTED) { @@ -41,20 +40,20 @@ } else { - @("as selected by provider") + @T("as selected by provider") } - - - Open Dashboard - - - Edit - - - Delete - + + + + + + + + + + @@ -62,30 +61,32 @@ @if(this.SettingsManager.ConfigurationData.Providers.Count == 0) { - No providers configured yet. + + @T("No providers configured yet.") + } - Add Provider + @T("Add Provider") - LLM Provider Confidence + + @T("LLM Provider Confidence") + - Do you want to always be able to recognize how trustworthy your LLM providers are? This way, - you keep control over which provider you send your data to. You have two options for this: - Either you choose a common schema, or you configure the trust levels for each LLM provider yourself. + @T("Do you want to always be able to recognize how trustworthy your LLM providers are? This way, you keep control over which provider you send your data to. You have two options for this: Either you choose a common schema, or you configure the trust levels for each LLM provider yourself.") - + @if(this.SettingsManager.ConfigurationData.LLMProviders.EnforceGlobalMinimumConfidence) { } - + @if (this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence) { - + @if (this.SettingsManager.ConfigurationData.LLMProviders.ConfidenceScheme is ConfidenceSchemes.CUSTOM) { @@ -95,9 +96,9 @@ - LLM Provider - Description - Confidence Level + @T("LLM Provider") + @T("Description") + @T("Confidence Level") diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor.cs index 6ca2f6ca..16ba7727 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor.cs +++ b/app/MindWork AI Studio/Components/Settings/SettingsPanelProviders.razor.cs @@ -36,7 +36,7 @@ public partial class SettingsPanelProviders : SettingsPanelBase { x => x.IsEditing, false }, }; - var dialogReference = await this.DialogService.ShowAsync("Add LLM Provider", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Add LLM Provider"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -65,9 +65,10 @@ public partial class SettingsPanelProviders : SettingsPanelBase { x => x.IsSelfHosted, provider.IsSelfHosted }, { x => x.IsEditing, true }, { x => x.DataHost, provider.Host }, + { x => x.HFInferenceProviderId, provider.HFInferenceProvider }, }; - var dialogReference = await this.DialogService.ShowAsync("Edit LLM Provider", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Edit LLM Provider"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -91,10 +92,10 @@ public partial class SettingsPanelProviders : SettingsPanelBase { var dialogParameters = new DialogParameters { - { "Message", $"Are you sure you want to delete the provider '{provider.InstanceName}'?" }, + { "Message", string.Format(T("Are you sure you want to delete the provider '{0}'?"), provider.InstanceName) }, }; - var dialogReference = await this.DialogService.ShowAsync("Delete LLM Provider", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Delete LLM Provider"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -109,10 +110,10 @@ public partial class SettingsPanelProviders : SettingsPanelBase { var issueDialogParameters = new DialogParameters { - { "Message", $"Couldn't delete the provider '{provider.InstanceName}'. The issue: {deleteSecretResponse.Issue}. We can ignore this issue and delete the provider anyway. Do you want to ignore it and delete this provider?" }, + { "Message", string.Format(T("Couldn't delete the provider '{0}'. The issue: {1}. We can ignore this issue and delete the provider anyway. Do you want to ignore it and delete this provider?"), provider.InstanceName, deleteSecretResponse.Issue) }, }; - var issueDialogReference = await this.DialogService.ShowAsync("Delete LLM Provider", issueDialogParameters, DialogOptions.FULLSCREEN); + var issueDialogReference = await this.DialogService.ShowAsync(T("Delete LLM Provider"), issueDialogParameters, DialogOptions.FULLSCREEN); var issueDialogResult = await issueDialogReference.Result; if (issueDialogResult is null || issueDialogResult.Canceled) return; @@ -148,7 +149,7 @@ public partial class SettingsPanelProviders : SettingsPanelBase if (this.SettingsManager.ConfigurationData.LLMProviders.CustomConfidenceScheme.TryGetValue(llmProvider, out var level)) return level.GetName(); - return "Not yet configured"; + return T("Not yet configured"); } private string SetCurrentConfidenceLevelColorStyle(LLMProviders llmProvider) diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelWorkspaces.razor b/app/MindWork AI Studio/Components/Settings/SettingsPanelWorkspaces.razor deleted file mode 100644 index b3042982..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelWorkspaces.razor +++ /dev/null @@ -1,13 +0,0 @@ -@using AIStudio.Settings -@using AIStudio.Settings.DataModel -@inherits SettingsPanelBase - - - - - @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES) - { - - - } - \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelWorkspaces.razor.cs b/app/MindWork AI Studio/Components/Settings/SettingsPanelWorkspaces.razor.cs deleted file mode 100644 index 881a7381..00000000 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelWorkspaces.razor.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelWorkspaces : SettingsPanelBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/TextInfoLine.razor b/app/MindWork AI Studio/Components/TextInfoLine.razor index 5e5de4da..342c495d 100644 --- a/app/MindWork AI Studio/Components/TextInfoLine.razor +++ b/app/MindWork AI Studio/Components/TextInfoLine.razor @@ -1,3 +1,4 @@ +@inherits MSGComponentBase USER_INPUT_ATTRIBUTES = new(); - private string ClipboardTooltip => $"Copy {this.ClipboardTooltipSubject} to the clipboard"; + private string ClipboardTooltip => string.Format(T("Copy {0} to the clipboard"), this.ClipboardTooltipSubject); private async Task CopyToClipboard(string content) => await this.RustService.CopyText2Clipboard(this.Snackbar, content); } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/TextInfoLines.razor b/app/MindWork AI Studio/Components/TextInfoLines.razor index 68186316..a6a8e824 100644 --- a/app/MindWork AI Studio/Components/TextInfoLines.razor +++ b/app/MindWork AI Studio/Components/TextInfoLines.razor @@ -1,3 +1,4 @@ +@inherits MSGComponentBase USER_INPUT_ATTRIBUTES = new(); - private string ClipboardTooltip => $"Copy {this.ClipboardTooltipSubject} to the clipboard"; + private string ClipboardTooltip => string.Format(T("Copy {0} to the clipboard"), this.ClipboardTooltipSubject); private async Task CopyToClipboard(string content) => await this.RustService.CopyText2Clipboard(this.Snackbar, content); diff --git a/app/MindWork AI Studio/Components/ThirdPartyComponent.razor b/app/MindWork AI Studio/Components/ThirdPartyComponent.razor index 29c6e8c6..06e1c5c5 100644 --- a/app/MindWork AI Studio/Components/ThirdPartyComponent.razor +++ b/app/MindWork AI Studio/Components/ThirdPartyComponent.razor @@ -1,11 +1,14 @@ +@inherits MSGComponentBase - @this.Header + + @this.Header + - + @@ -16,7 +19,9 @@ - License: @this.LicenseName + + @T("License:") @this.LicenseName + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ThirdPartyComponent.razor.cs b/app/MindWork AI Studio/Components/ThirdPartyComponent.razor.cs index 77fdc3c0..c1d6113c 100644 --- a/app/MindWork AI Studio/Components/ThirdPartyComponent.razor.cs +++ b/app/MindWork AI Studio/Components/ThirdPartyComponent.razor.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class ThirdPartyComponent : ComponentBase +public partial class ThirdPartyComponent : MSGComponentBase { [Parameter] public string Name { get; set; } = string.Empty; diff --git a/app/MindWork AI Studio/Components/Titan.razor b/app/MindWork AI Studio/Components/Titan.razor new file mode 100644 index 00000000..a452de6b --- /dev/null +++ b/app/MindWork AI Studio/Components/Titan.razor @@ -0,0 +1,16 @@ + + + + + + + + + @this.Name + + + + @this.Acknowledgment + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Titan.razor.cs b/app/MindWork AI Studio/Components/Titan.razor.cs new file mode 100644 index 00000000..af025d13 --- /dev/null +++ b/app/MindWork AI Studio/Components/Titan.razor.cs @@ -0,0 +1,21 @@ +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Components; + +public partial class Titan : ComponentBase +{ + [Parameter] + public string Name { get; set; } = string.Empty; + + [Parameter] + public string Acknowledgment { get; set; } = string.Empty; + + [Parameter] + public string? URL { get; set; } + + [Parameter] + public SupporterType Type { get; set; } + + [Parameter] + public string? ImageSrc { get; set; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Vision.razor b/app/MindWork AI Studio/Components/Vision.razor index 25d0d2fd..463812bc 100644 --- a/app/MindWork AI Studio/Components/Vision.razor +++ b/app/MindWork AI Studio/Components/Vision.razor @@ -1,10 +1,11 @@ +@inherits MSGComponentBase - Curious about the vision for MindWork AI Studio and what the future holds? We're here to address just that. Remember, this is a free, open-source project, meaning we can't guarantee when or if this vision will be fully realized. Our aim is to share our vision with you to help you decide whether this app is right for you. + @T("Curious about the vision for MindWork AI Studio and what the future holds? We're here to address just that. Remember, this is a free, open-source project, meaning we can't guarantee when or if this vision will be fully realized. Our aim is to share our vision with you to help you decide whether this app is right for you.") - So, where are we headed, and how could the app evolve in the coming months and years? The following list outlines our ideas, though not in order of priority: + @T("So, where are we headed, and how could the app evolve in the coming months and years? The following list outlines our ideas, though not in order of priority:") - + - We hope this vision excites you as much as it excites us. Together, let's build a powerful and flexible AI toolkit to support all your creative, professional, and everyday needs with MindWork AI Studio. + @T("We hope this vision excites you as much as it excites us. Together, let's build a powerful and flexible AI toolkit to support all your creative, professional, and everyday needs with MindWork AI Studio.") \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Vision.razor.cs b/app/MindWork AI Studio/Components/Vision.razor.cs index 2f7f2659..b81c084a 100644 --- a/app/MindWork AI Studio/Components/Vision.razor.cs +++ b/app/MindWork AI Studio/Components/Vision.razor.cs @@ -2,19 +2,45 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Components; -public partial class Vision : ComponentBase +public partial class Vision : MSGComponentBase { - private static readonly TextItem[] ITEMS_VISION = - [ - new("Meet your needs", "Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer."), - new("Integrating your data", "You'll be able to integrate your data into AI Studio, like your PDF or Office files, or your Markdown notes."), - new("Integration of enterprise data", "It will soon be possible to integrate data from the corporate network using a specified interface (External Retrieval Interface, ERI for short). This will likely require development work by the organization in question."), - new("Useful assistants", "We'll develop more assistants for everyday tasks."), - new("Writing mode", "We're integrating a writing mode to help you create extensive works, like comprehensive project proposals, tenders, or your next fantasy novel."), - new("Specific requirements", "Want an assistant that suits your specific needs? We aim to offer a plugin architecture so organizations and enthusiasts can implement such ideas."), - new("Voice control", "You'll interact with the AI systems using your voice. To achieve this, we want to integrate voice input (speech-to-text) and output (text-to-speech). However, later on, it should also have a natural conversation flow, i.e., seamless conversation."), - new("Content creation", "There will be an interface for AI Studio to create content in other apps. You could, for example, create blog posts directly on the target platform or add entries to an internal knowledge management tool. This requires development work by the tool developers."), - new("Email monitoring", "You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats."), - new("Browser usage", "We're working on offering AI Studio features in your browser via a plugin, allowing, e.g., for spell-checking or text rewriting directly in the browser."), - ]; + private TextItem[] itemsVision = []; + + #region Overrides of MSGComponentBase + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + this.InitializeVisionItems(); + } + + private void InitializeVisionItems() + { + this.itemsVision = + [ + new(T("Meet your needs"), T("Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer.")), + new(T("Integrating your data"), T("You'll be able to integrate your data into AI Studio, like your PDF or Office files, or your Markdown notes.")), + new(T("Integration of enterprise data"), T("It will soon be possible to integrate data from the corporate network using a specified interface (External Retrieval Interface, ERI for short). This will likely require development work by the organization in question.")), + new(T("Useful assistants"), T("We'll develop more assistants for everyday tasks.")), + new(T("Writing mode"), T("We're integrating a writing mode to help you create extensive works, like comprehensive project proposals, tenders, or your next fantasy novel.")), + new(T("Specific requirements"), T("Want an assistant that suits your specific needs? We aim to offer a plugin architecture so organizations and enthusiasts can implement such ideas.")), + new(T("Voice control"), T("You'll interact with the AI systems using your voice. To achieve this, we want to integrate voice input (speech-to-text) and output (text-to-speech). However, later on, it should also have a natural conversation flow, i.e., seamless conversation.")), + new(T("Content creation"), T("There will be an interface for AI Studio to create content in other apps. You could, for example, create blog posts directly on the target platform or add entries to an internal knowledge management tool. This requires development work by the tool developers.")), + new(T("Email monitoring"), T("You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats.")), + new(T("Browser usage"), T("We're working on offering AI Studio features in your browser via a plugin, allowing, e.g., for spell-checking or text rewriting directly in the browser.")), + ]; + } + + protected override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default + { + switch (triggeredEvent) + { + case Event.PLUGINS_RELOADED: + this.InitializeVisionItems(); + await this.InvokeAsync(this.StateHasChanged); + break; + } + } + + #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Workspaces.razor b/app/MindWork AI Studio/Components/Workspaces.razor index 3046577d..9083af84 100644 --- a/app/MindWork AI Studio/Components/Workspaces.razor +++ b/app/MindWork AI Studio/Components/Workspaces.razor @@ -1,4 +1,5 @@ - +@inherits MSGComponentBase + @switch (item.Value) { @@ -17,7 +18,7 @@ @if (string.IsNullOrWhiteSpace(treeItem.Text)) { - @("Empty chat") + @T("Empty chat") } else { @@ -26,15 +27,15 @@
- + - + - +
@@ -47,13 +48,15 @@
- @treeItem.Text + + @treeItem.Text +
- + - +
@@ -66,7 +69,9 @@
- @treeItem.Text + + @treeItem.Text +
diff --git a/app/MindWork AI Studio/Components/Workspaces.razor.cs b/app/MindWork AI Studio/Components/Workspaces.razor.cs index 9b6b0bb6..f603a400 100644 --- a/app/MindWork AI Studio/Components/Workspaces.razor.cs +++ b/app/MindWork AI Studio/Components/Workspaces.razor.cs @@ -11,7 +11,7 @@ using DialogOptions = AIStudio.Dialogs.DialogOptions; namespace AIStudio.Components; -public partial class Workspaces : ComponentBase +public partial class Workspaces : MSGComponentBase { [Inject] private IDialogService DialogService { get; init; } = null!; @@ -39,6 +39,8 @@ public partial class Workspaces : ComponentBase protected override async Task OnInitializedAsync() { + await base.OnInitializedAsync(); + // // Notice: In order to get the server-based loading to work, we need to respect the following rules: // - We must have initial tree items @@ -46,7 +48,6 @@ public partial class Workspaces : ComponentBase // - When assigning the tree items to the MudTreeViewItem component, we must set the Value property to the value of the item // await this.LoadTreeItems(); - await base.OnInitializedAsync(); } #endregion @@ -61,7 +62,7 @@ public partial class Workspaces : ComponentBase { Depth = 0, Branch = WorkspaceBranch.WORKSPACES, - Text = "Workspaces", + Text = T("Workspaces"), Icon = Icons.Material.Filled.Folder, Expandable = true, Path = "root", @@ -77,7 +78,7 @@ public partial class Workspaces : ComponentBase { Depth = 0, Branch = WorkspaceBranch.TEMPORARY_CHATS, - Text = "Temporary chats", + Text = T("Disappearing Chats"), Icon = Icons.Material.Filled.Timer, Expandable = true, Path = "temp", @@ -178,7 +179,7 @@ public partial class Workspaces : ComponentBase workspaces.Add(new TreeItemData { Expandable = false, - Value = new TreeButton(WorkspaceBranch.WORKSPACES, 1, "Add workspace",Icons.Material.Filled.LibraryAdd, this.AddWorkspace), + Value = new TreeButton(WorkspaceBranch.WORKSPACES, 1, T("Add workspace"),Icons.Material.Filled.LibraryAdd, this.AddWorkspace), }); return workspaces; } @@ -220,7 +221,7 @@ public partial class Workspaces : ComponentBase result.Add(new() { Expandable = false, - Value = new TreeButton(WorkspaceBranch.WORKSPACES, 2, "Add chat",Icons.Material.Filled.AddComment, () => this.AddChat(workspacePath)), + Value = new TreeButton(WorkspaceBranch.WORKSPACES, 2, T("Add chat"),Icons.Material.Filled.AddComment, () => this.AddChat(workspacePath)), }); return result; @@ -250,10 +251,10 @@ public partial class Workspaces : ComponentBase { var dialogParameters = new DialogParameters { - { "Message", "Are you sure you want to load another chat? All unsaved changes will be lost." }, + { "Message", T("Are you sure you want to load another chat? All unsaved changes will be lost.") }, }; - var dialogReference = await this.DialogService.ShowAsync("Load Chat", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Load Chat"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return null; @@ -294,13 +295,13 @@ public partial class Workspaces : ComponentBase { "Message", (chat.WorkspaceId == Guid.Empty) switch { - true => $"Are you sure you want to delete the temporary chat '{chat.Name}'?", - false => $"Are you sure you want to delete the chat '{chat.Name}' in the workspace '{workspaceName}'?", + true => string.Format(T("Are you sure you want to delete the temporary chat '{0}'?"), chat.Name), + false => string.Format(T("Are you sure you want to delete the chat '{0}' in the workspace '{1}'?"), chat.Name, workspaceName), } }, }; - var dialogReference = await this.DialogService.ShowAsync("Delete Chat", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Delete Chat"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -331,18 +332,25 @@ public partial class Workspaces : ComponentBase var dialogParameters = new DialogParameters { - { "Message", $"Please enter a new or edit the name for your chat '{chat.Name}':" }, + { "Message", string.Format(T("Please enter a new or edit the name for your chat '{0}':"), chat.Name) }, { "UserInput", chat.Name }, - { "ConfirmText", "Rename" }, + { "ConfirmText", T("Rename") }, { "ConfirmColor", Color.Info }, }; - var dialogReference = await this.DialogService.ShowAsync("Rename Chat", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Rename Chat"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; chat.Name = (dialogResult.Data as string)!; + if(this.CurrentChatThread?.ChatId == chat.ChatId) + { + this.CurrentChatThread.Name = chat.Name; + await this.CurrentChatThreadChanged.InvokeAsync(this.CurrentChatThread); + await MessageBus.INSTANCE.SendMessage(this, Event.WORKSPACE_LOADED_CHAT_CHANGED); + } + await this.StoreChat(chat); await this.LoadTreeItems(); } @@ -356,13 +364,13 @@ public partial class Workspaces : ComponentBase var workspaceName = await WorkspaceBehaviour.LoadWorkspaceName(workspaceId); var dialogParameters = new DialogParameters { - { "Message", $"Please enter a new or edit the name for your workspace '{workspaceName}':" }, + { "Message", string.Format(T("Please enter a new or edit the name for your workspace '{0}':"), workspaceName) }, { "UserInput", workspaceName }, - { "ConfirmText", "Rename" }, + { "ConfirmText", T("Rename") }, { "ConfirmColor", Color.Info }, }; - var dialogReference = await this.DialogService.ShowAsync("Rename Workspace", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Rename Workspace"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -377,13 +385,13 @@ public partial class Workspaces : ComponentBase { var dialogParameters = new DialogParameters { - { "Message", "Please name your workspace:" }, + { "Message", T("Please name your workspace:") }, { "UserInput", string.Empty }, - { "ConfirmText", "Add workspace" }, + { "ConfirmText", T("Add workspace") }, { "ConfirmColor", Color.Info }, }; - var dialogReference = await this.DialogService.ShowAsync("Add Workspace", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Add Workspace"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -411,10 +419,10 @@ public partial class Workspaces : ComponentBase var dialogParameters = new DialogParameters { - { "Message", $"Are you sure you want to delete the workspace '{workspaceName}'? This will also delete {chatCount} chat(s) in this workspace." }, + { "Message", string.Format(T("Are you sure you want to delete the workspace '{0}'? This will also delete {1} chat(s) in this workspace."), workspaceName, chatCount) }, }; - var dialogReference = await this.DialogService.ShowAsync("Delete Workspace", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Delete Workspace"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -431,17 +439,17 @@ public partial class Workspaces : ComponentBase var dialogParameters = new DialogParameters { - { "Message", "Please select the workspace where you want to move the chat to." }, + { "Message", T("Please select the workspace where you want to move the chat to.") }, { "SelectedWorkspace", chat.WorkspaceId }, - { "ConfirmText", "Move chat" }, + { "ConfirmText", T("Move chat") }, }; - var dialogReference = await this.DialogService.ShowAsync("Move Chat to Workspace", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Move Chat to Workspace"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; - var workspaceId = dialogResult.Data is Guid id ? id : default; + var workspaceId = dialogResult.Data is Guid id ? id : Guid.Empty; if (workspaceId == Guid.Empty) return; @@ -478,10 +486,10 @@ public partial class Workspaces : ComponentBase { var dialogParameters = new DialogParameters { - { "Message", "Are you sure you want to create a another chat? All unsaved changes will be lost." }, + { "Message", T("Are you sure you want to create a another chat? All unsaved changes will be lost.") }, }; - var dialogReference = await this.DialogService.ShowAsync("Create Chat", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Create Chat"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -504,4 +512,19 @@ public partial class Workspaces : ComponentBase await this.LoadChat(chatPath, switchToChat: true); await this.LoadTreeItems(); } + + #region Overrides of MSGComponentBase + + protected override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default + { + switch (triggeredEvent) + { + case Event.PLUGINS_RELOADED: + await this.LoadTreeItems(); + await this.InvokeAsync(this.StateHasChanged); + break; + } + } + + #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/ChatTemplateDialog.razor b/app/MindWork AI Studio/Dialogs/ChatTemplateDialog.razor new file mode 100644 index 00000000..61070a48 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/ChatTemplateDialog.razor @@ -0,0 +1,175 @@ +@using AIStudio.Chat +@inherits MSGComponentBase + + + + + @T("Create your custom chat template to tailor the LLM's behavior for specific tasks or domains. Define a custom system prompt and provide an example conversation to design an AI experience perfectly suited to your requirements.") + + + + @T("The name of the chat template is mandatory. Each chat template must have a unique name.") + + + + @* ReSharper disable once CSharpWarnings::CS8974 *@ + + + + @T("System Prompt") + + + + + + @T("Are you unsure which system prompt to use? You might start with the default system prompt that AI Studio uses for all chats.") + + + @T("Use the default system prompt") + + + + @T("Using some chat templates in tandem with profiles might cause issues. Therefore, you might prohibit the usage of profiles here.") + + + + + @T("Example Conversation") + + + + @T("Add messages of an example conversation (user prompt followed by assistant prompt) to demonstrate the desired interaction pattern. These examples help the AI understand your expectations by showing it the correct format, style, and content of responses before it receives actual user inputs.") + + + + + + + + + + @T("Role") + @T("Entry") + @T("Actions") + + + + @context.Role.ToChatTemplateName() + + + @switch(context.Content) + { + case ContentText textContent: + + break; + + case ContentImage { SourceType: ContentImageSource.URL or ContentImageSource.LOCAL_PATH } imageContent: + + break; + + default: + @T("Unsupported content type") + break; + } + + + @if (!this.isInlineEditOnGoing) + { + + + + + + + } + + + + + + @foreach (var role in ChatRoles.ChatTemplateRoles()) + { + + @role.ToChatTemplateName() + + } + + + + @switch(context.Content) + { + case ContentText textContent: + + break; + + default: + + @T("Only text content is supported in the editing mode yet.") + + break; + } + + + + + + + + + @if (!this.isInlineEditOnGoing) + { + + @T("Add a message") + + } + + + + + + @T("Cancel") + + + @if (!this.isInlineEditOnGoing) + { + + @if (this.IsEditing) + { + @T("Update") + } + else + { + @T("Add") + } + + } + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/ChatTemplateDialog.razor.cs b/app/MindWork AI Studio/Dialogs/ChatTemplateDialog.razor.cs new file mode 100644 index 00000000..af0f7560 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/ChatTemplateDialog.razor.cs @@ -0,0 +1,241 @@ +using AIStudio.Chat; +using AIStudio.Components; +using AIStudio.Settings; + +using Microsoft.AspNetCore.Components; + +namespace AIStudio.Dialogs; + +public partial class ChatTemplateDialog : MSGComponentBase +{ + [CascadingParameter] + private IMudDialogInstance MudDialog { get; set; } = null!; + + /// + /// The chat template's number in the list. + /// + [Parameter] + public uint DataNum { get; set; } + + /// + /// The chat template's ID. + /// + [Parameter] + public string DataId { get; set; } = Guid.NewGuid().ToString(); + + /// + /// The chat template name chosen by the user. + /// + [Parameter] + public string DataName { get; set; } = string.Empty; + + /// + /// What is the system prompt? + /// + [Parameter] + public string DataSystemPrompt { get; set; } = string.Empty; + + /// + /// Should the dialog be in editing mode? + /// + [Parameter] + public bool IsEditing { get; init; } + + [Parameter] + public IReadOnlyCollection ExampleConversation { get; init; } = []; + + [Parameter] + public bool AllowProfileUsage { get; set; } = true; + + [Inject] + private ILogger Logger { get; init; } = null!; + + private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); + + /// + /// The list of used chat template names. We need this to check for uniqueness. + /// + private List UsedNames { get; set; } = []; + + private bool dataIsValid; + private List dataExampleConversation = []; + private string[] dataIssues = []; + private string dataEditingPreviousName = string.Empty; + private bool isInlineEditOnGoing; + + private ContentBlock? messageEntryBeforeEdit; + + // We get the form reference from Blazor code to validate it manually: + private MudForm form = null!; + + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + // Configure the spellchecking for the instance name input: + this.SettingsManager.InjectSpellchecking(SPELLCHECK_ATTRIBUTES); + + // Load the used instance names: + this.UsedNames = this.SettingsManager.ConfigurationData.ChatTemplates.Select(x => x.Name.ToLowerInvariant()).ToList(); + + // When editing, we need to load the data: + if(this.IsEditing) + { + this.dataEditingPreviousName = this.DataName.ToLowerInvariant(); + this.dataExampleConversation = this.ExampleConversation.Select(n => n.DeepClone()).ToList(); + } + + await base.OnInitializedAsync(); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + // Reset the validation when not editing and on the first render. + // We don't want to show validation errors when the user opens the dialog. + if(!this.IsEditing && firstRender) + this.form.ResetValidation(); + + await base.OnAfterRenderAsync(firstRender); + } + + #endregion + + private ChatTemplate CreateChatTemplateSettings() => new() + { + Num = this.DataNum, + Id = this.DataId, + + Name = this.DataName, + SystemPrompt = this.DataSystemPrompt, + ExampleConversation = this.dataExampleConversation, + AllowProfileUsage = this.AllowProfileUsage, + }; + + private void RemoveMessage(ContentBlock item) + { + this.dataExampleConversation.Remove(item); + } + + private void AddMessageToEnd() + { + var newEntry = new ContentBlock + { + Role = this.dataExampleConversation.Count is 0 ? ChatRole.USER : this.dataExampleConversation.Last().Role.SelectNextRoleForTemplate(), + Content = new ContentText(), + ContentType = ContentType.TEXT, + HideFromUser = true, + Time = DateTimeOffset.Now, + }; + + this.dataExampleConversation.Add(newEntry); + } + + private void AddMessageBelow(ContentBlock currentItem) + { + var insertedEntry = new ContentBlock + { + Role = this.dataExampleConversation.Count is 0 ? ChatRole.USER : this.dataExampleConversation.Last().Role.SelectNextRoleForTemplate(), + Content = new ContentText(), + ContentType = ContentType.TEXT, + HideFromUser = true, + Time = DateTimeOffset.Now, + }; + + // The rest of the method remains the same: + var index = this.dataExampleConversation.IndexOf(currentItem); + if (index >= 0) + this.dataExampleConversation.Insert(index + 1, insertedEntry); + else + this.dataExampleConversation.Add(insertedEntry); + } + + private void BackupItem(object? element) + { + this.isInlineEditOnGoing = true; + this.messageEntryBeforeEdit = element switch + { + ContentBlock block => block.DeepClone(), + _ => null, + }; + + this.StateHasChanged(); + } + + private void ResetItem(object? element) + { + this.isInlineEditOnGoing = false; + switch (element) + { + case ContentBlock block: + if (this.messageEntryBeforeEdit is null) + return; // No backup to restore from + + block.Content = this.messageEntryBeforeEdit.Content?.DeepClone(); + block.Role = this.messageEntryBeforeEdit.Role; + break; + } + + this.StateHasChanged(); + } + + private void CommitInlineEdit(object? element) + { + this.isInlineEditOnGoing = false; + this.StateHasChanged(); + } + + private async Task Store() + { + await this.form.Validate(); + + // When the data is not valid, we don't store it: + if (!this.dataIsValid) + return; + + // When an inline edit is ongoing, we cannot store the data: + if (this.isInlineEditOnGoing) + return; + + // Use the data model to store the chat template. + // We just return this data to the parent component: + var addedChatTemplateSettings = this.CreateChatTemplateSettings(); + + if(this.IsEditing) + this.Logger.LogInformation($"Edited chat template '{addedChatTemplateSettings.Name}'."); + else + this.Logger.LogInformation($"Created chat template '{addedChatTemplateSettings.Name}'."); + + this.MudDialog.Close(DialogResult.Ok(addedChatTemplateSettings)); + } + + private string? ValidateExampleTextMessage(string message) + { + if (string.IsNullOrWhiteSpace(message)) + return T("Please enter a message for the example conversation."); + + return null; + } + + private string? ValidateName(string name) + { + if (string.IsNullOrWhiteSpace(name)) + return T("Please enter a name for the chat template."); + + if (name.Length > 40) + return T("The chat template name must not exceed 40 characters."); + + // The instance name must be unique: + var lowerName = name.ToLowerInvariant(); + if (lowerName != this.dataEditingPreviousName && this.UsedNames.Contains(lowerName)) + return T("The chat template name must be unique; the chosen name is already in use."); + + return null; + } + + private void UseDefaultSystemPrompt() + { + this.DataSystemPrompt = SystemPrompts.DEFAULT; + } + + private void Cancel() => this.MudDialog.Cancel(); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor b/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor index 3f757260..455ac41b 100644 --- a/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor +++ b/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor @@ -1,9 +1,16 @@ +@inherits MSGComponentBase - @this.Message + + @this.Message + - No - Yes + + @T("No") + + + @T("Yes") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor.cs b/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor.cs index 78fb9ad3..f022152e 100644 --- a/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/ConfirmDialog.razor.cs @@ -1,3 +1,5 @@ +using AIStudio.Components; + using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs; @@ -5,7 +7,7 @@ namespace AIStudio.Dialogs; /// /// A confirmation dialog that can be used to ask the user for confirmation. /// -public partial class ConfirmDialog : ComponentBase +public partial class ConfirmDialog : MSGComponentBase { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor index a37a2d4d..754d15f3 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor @@ -1,5 +1,7 @@ @using AIStudio.Settings.DataModel @using AIStudio.Tools.ERIClient.DataModel +@inherits MSGComponentBase + @@ -7,7 +9,7 @@ - Please note: the connection to the ERI v1 server is not encrypted. This means that all - data sent to the server is transmitted in plain text. Please ask the ERI server administrator - to enable encryption. + @T("Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption.") } @@ -57,7 +57,7 @@ { - Test connection & read available metadata + @T("Test connection & read available metadata") @this.GetTestResultText() @@ -70,7 +70,9 @@ @foreach (var authMethod in this.availableAuthMethods) { - @authMethod.DisplayName() + + @authMethod.DisplayName() + } } @@ -83,7 +85,7 @@ } - @* ReSharper disable once CSharpWarnings::CS8974 *@ - + } @if (this.availableRetrievalProcesses.Count > 0) { - + @foreach (var retrievalProcess in this.availableRetrievalProcesses) { @@ -122,7 +111,7 @@ } - + @foreach (var policy in Enum.GetValues()) { @@ -131,19 +120,23 @@ } + + - Cancel + + @T("Cancel") + @if(this.IsEditing) { - @:Update + @T("Update") } else { - @:Add + @T("Add") } diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs index e3547d9d..539b2b2e 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1Dialog.razor.cs @@ -1,5 +1,5 @@ using AIStudio.Assistants.ERI; -using AIStudio.Settings; +using AIStudio.Components; using AIStudio.Settings.DataModel; using AIStudio.Tools.ERIClient; using AIStudio.Tools.ERIClient.DataModel; @@ -13,7 +13,7 @@ using RetrievalInfo = AIStudio.Tools.ERIClient.DataModel.RetrievalInfo; // ReSharper disable InconsistentNaming namespace AIStudio.Dialogs; -public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId +public partial class DataSourceERI_V1Dialog : MSGComponentBase, ISecretId { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; @@ -24,9 +24,6 @@ public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId [Parameter] public DataSourceERI_V1 DataSource { get; set; } - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - [Inject] private ILogger Logger { get; init; } = null!; @@ -50,6 +47,7 @@ public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId private List availableAuthMethods = []; private DataSourceSecurity dataSecurityPolicy; private SecurityRequirements dataSourceSecurityRequirements; + private ushort dataMaxMatches = 10; private bool connectionTested; private bool connectionSuccessfulTested; @@ -107,6 +105,7 @@ public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId this.dataAuthMethod = this.DataSource.AuthMethod; this.dataUsername = this.DataSource.Username; this.dataSecurityPolicy = this.DataSource.SecurityPolicy; + this.dataMaxMatches = this.DataSource.MaxMatches; if (this.dataAuthMethod is AuthMethod.TOKEN or AuthMethod.USERNAME_PASSWORD) { @@ -167,6 +166,7 @@ public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId Type = DataSourceType.ERI_V1, SecurityPolicy = this.dataSecurityPolicy, SelectedRetrievalId = this.dataSelectedRetrievalProcess.Id, + MaxMatches = this.dataMaxMatches, }; } @@ -195,7 +195,7 @@ public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId await this.form.Validate(); Array.Resize(ref this.dataIssues, this.dataIssues.Length + 1); - this.dataIssues[^1] = "Failed to connect to the ERI v1 server. The server is not supported."; + this.dataIssues[^1] = T("Failed to connect to the ERI v1 server. The server is not supported."); return; } @@ -254,7 +254,7 @@ public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId await this.form.Validate(); Array.Resize(ref this.dataIssues, this.dataIssues.Length + 1); - this.dataIssues[^1] = $"Failed to connect to the ERI v1 server. The message was: {e.Message}"; + this.dataIssues[^1] = string.Format(T("Failed to connect to the ERI v1 server. The message was: {0}"), e.Message); this.Logger.LogError($"Failed to connect to the ERI v1 server. Message: {e.Message}"); this.connectionTested = true; @@ -265,9 +265,9 @@ public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId private string GetTestResultText() { if(!this.connectionTested) - return "Not tested yet."; + return T("Not tested yet."); - return this.connectionSuccessfulTested ? "Connection successful." : "Connection failed."; + return this.connectionSuccessfulTested ? T("Connection successful.") : T("Connection failed."); } private Color GetTestResultColor() @@ -290,9 +290,9 @@ public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId private string GetSecretLabel() => this.dataAuthMethod switch { - AuthMethod.TOKEN => "Access Token", - AuthMethod.USERNAME_PASSWORD => "Password", - _ => "Secret", + AuthMethod.TOKEN => T("Access Token"), + AuthMethod.USERNAME_PASSWORD => T("Password"), + _ => T("Secret"), }; private async Task Store() @@ -320,7 +320,7 @@ public partial class DataSourceERI_V1Dialog : ComponentBase, ISecretId var storeResponse = await this.RustService.SetSecret(this, this.dataSecret); if (!storeResponse.Success) { - this.dataSecretStorageIssue = $"Failed to store the auth. secret in the operating system. The message was: {storeResponse.Issue}. Please try again."; + this.dataSecretStorageIssue = string.Format(T("Failed to store the auth. secret in the operating system. The message was: {0}. Please try again."), storeResponse.Issue); await this.form.Validate(); return; } diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1InfoDialog.razor similarity index 57% rename from app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor rename to app/MindWork AI Studio/Dialogs/DataSourceERI_V1InfoDialog.razor index dd6d2773..aa6b7b7d 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1InfoDialog.razor @@ -1,66 +1,65 @@ @using AIStudio.Settings.DataModel @using AIStudio.Tools.ERIClient.DataModel - +@inherits MSGComponentBase - Common data source information + @T("Common data source information") - - - + + + @if (!this.IsConnectionEncrypted()) { - Please note: the connection to the ERI v1 server is not encrypted. This means that all - data sent to the server is transmitted in plain text. Please ask the ERI server administrator - to enable encryption. + @T("Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption.") } @if (this.DataSource.AuthMethod is AuthMethod.USERNAME_PASSWORD) { - + } - - - + + + + - Retrieval information + @T("Retrieval information") @if (!this.retrievalInfoformation.Any()) { - The data source does not provide any retrieval information. + @T("The data source does not provide any retrieval information.") } else { - - + + @if (!string.IsNullOrWhiteSpace(this.selectedRetrievalInfo.Link)) { - Open web link, show more information + @T("Open web link, show more information") } - Embeddings + @T("Embeddings") @* ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract *@ @if (this.selectedRetrievalInfo.Embeddings is null || !this.selectedRetrievalInfo.Embeddings.Any()) { - The data source does not provide any embedding information. + @T("The data source does not provide any embedding information.") } else @@ -70,14 +69,14 @@ { var embedding = this.selectedRetrievalInfo.Embeddings[embeddingIndex]; - - - + + + @if (!string.IsNullOrWhiteSpace(embedding.Link)) { - Open web link, show more information + @T("Open web link, show more information") } @@ -95,7 +94,11 @@ { } - Reload - Close + + @T("Reload") + + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1InfoDialog.razor.cs similarity index 88% rename from app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor.cs rename to app/MindWork AI Studio/Dialogs/DataSourceERI_V1InfoDialog.razor.cs index 2594ee58..38ed220a 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceERI-V1InfoDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/DataSourceERI_V1InfoDialog.razor.cs @@ -3,6 +3,7 @@ using System.Text; using AIStudio.Assistants.ERI; +using AIStudio.Components; using AIStudio.Settings.DataModel; using AIStudio.Tools.ERIClient; using AIStudio.Tools.ERIClient.DataModel; @@ -14,7 +15,7 @@ using RetrievalInfo = AIStudio.Tools.ERIClient.DataModel.RetrievalInfo; namespace AIStudio.Dialogs; -public partial class DataSourceERI_V1InfoDialog : ComponentBase, IAsyncDisposable, ISecretId +public partial class DataSourceERI_V1InfoDialog : MSGComponentBase, IAsyncDisposable, ISecretId { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; @@ -29,8 +30,8 @@ public partial class DataSourceERI_V1InfoDialog : ComponentBase, IAsyncDisposabl protected override async Task OnInitializedAsync() { - this.eriServerTasks.Add(this.GetERIMetadata()); await base.OnInitializedAsync(); + this.eriServerTasks.Add(this.GetERIMetadata()); } #endregion @@ -59,21 +60,21 @@ public partial class DataSourceERI_V1InfoDialog : ComponentBase, IAsyncDisposabl return $"[{retrievalInfo.Id}] {retrievalInfo.Name}"; if (hasId) - return $"[{retrievalInfo.Id}] Unnamed retrieval process"; + return string.Format(T("[{0}] Unnamed retrieval process"), retrievalInfo.Id); - return hasName ? retrievalInfo.Name : "Unnamed retrieval process"; + return hasName ? retrievalInfo.Name : T("Unnamed retrieval process"); } private string RetrievalParameters(RetrievalInfo retrievalInfo) { var parameters = retrievalInfo.ParametersDescription; if (parameters is null || parameters.Count == 0) - return "This retrieval process has no parameters."; + return T("This retrieval process has no parameters."); var sb = new StringBuilder(); foreach (var (paramName, description) in parameters) { - sb.Append("Parameter: "); + sb.Append(T("Parameter: ")); sb.AppendLine(paramName); sb.AppendLine(description); sb.AppendLine(); @@ -94,7 +95,7 @@ public partial class DataSourceERI_V1InfoDialog : ComponentBase, IAsyncDisposabl using var client = ERIClientFactory.Get(ERIVersion.V1, this.DataSource); if(client is null) { - this.dataIssues.Add("Failed to connect to the ERI v1 server. The server is not supported."); + this.dataIssues.Add(T("Failed to connect to the ERI v1 server. The server is not supported.")); return; } @@ -136,7 +137,7 @@ public partial class DataSourceERI_V1InfoDialog : ComponentBase, IAsyncDisposabl } catch (Exception e) { - this.dataIssues.Add($"Failed to connect to the ERI v1 server. The message was: {e.Message}"); + this.dataIssues.Add(string.Format(T("Failed to connect to the ERI v1 server. The message was: {0}"), e.Message)); } finally { diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor index e7863285..badb9b80 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor @@ -1,4 +1,5 @@ @using AIStudio.Settings.DataModel +@inherits MSGComponentBase @@ -7,7 +8,7 @@ - Select a root directory for this data source. All data in this directory and all - its subdirectories will be processed for this data source. + @T("Select a root directory for this data source. All data in this directory and all its subdirectories will be processed for this data source.") - + - In order for the AI to be able to determine the appropriate data at any time, you must - choose an embedding method. + @T("In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method.") - + @foreach (var embedding in this.AvailableEmbeddings) { - @embedding.Name + + @embedding.Name + } @@ -43,45 +44,48 @@ @if (string.IsNullOrWhiteSpace(this.dataPath)) { - @: Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. - @: Please confirm that you have read and understood this. + @T("Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this.") } else { - @: Please note: the embedding you selected runs in the cloud. All your data from the - @: folder '@this.dataPath' and all its subdirectories will be sent to the cloud. Please - @: confirm that you have read and understood this. + @string.Format(T("Please note: the embedding you selected runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud. Please confirm that you have read and understood this."), this.dataPath) } - + } else { - The embedding you selected runs locally or in your organization. Your data is not sent to the cloud. + @T("The embedding you selected runs locally or in your organization. Your data is not sent to the cloud.") } } - + @foreach (var policy in Enum.GetValues()) { - @policy.ToSelectionText() + + @policy.ToSelectionText() + } + + - Cancel + + @T("Cancel") + @if(this.IsEditing) { - @:Update + @T("Update") } else { - @:Add + @T("Add") } diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor.cs index 16c2e677..b4f62a79 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryDialog.razor.cs @@ -1,3 +1,4 @@ +using AIStudio.Components; using AIStudio.Settings; using AIStudio.Settings.DataModel; using AIStudio.Tools.Validation; @@ -6,7 +7,7 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs; -public partial class DataSourceLocalDirectoryDialog : ComponentBase +public partial class DataSourceLocalDirectoryDialog : MSGComponentBase { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; @@ -20,9 +21,6 @@ public partial class DataSourceLocalDirectoryDialog : ComponentBase [Parameter] public IReadOnlyList> AvailableEmbeddings { get; set; } = []; - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); private readonly DataSourceValidation dataSourceValidation; @@ -42,6 +40,7 @@ public partial class DataSourceLocalDirectoryDialog : ComponentBase private bool dataUserAcknowledgedCloudEmbedding; private string dataEmbeddingId = string.Empty; private string dataPath = string.Empty; + private ushort dataMaxMatches = 10; private DataSourceSecurity dataSecurityPolicy; // We get the form reference from Blazor code to validate it manually: @@ -77,6 +76,7 @@ public partial class DataSourceLocalDirectoryDialog : ComponentBase this.dataEmbeddingId = this.DataSource.EmbeddingId; this.dataPath = this.DataSource.Path; this.dataSecurityPolicy = this.DataSource.SecurityPolicy; + this.dataMaxMatches = this.DataSource.MaxMatches; } await base.OnInitializedAsync(); @@ -105,6 +105,7 @@ public partial class DataSourceLocalDirectoryDialog : ComponentBase EmbeddingId = this.dataEmbeddingId, Path = this.dataPath, SecurityPolicy = this.dataSecurityPolicy, + MaxMatches = this.dataMaxMatches, }; private async Task Store() diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor index a4b647b0..b529a78a 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor @@ -1,56 +1,59 @@ @using AIStudio.Settings.DataModel +@inherits MSGComponentBase - + - + @if (!this.IsDirectoryAvailable) { - The directory chosen for the data source does not exist anymore. Please edit the data source and correct the path. + @T("The directory chosen for the data source does not exist anymore. Please edit the data source and correct the path.") } else { - The directory chosen for the data source exists. + @T("The directory chosen for the data source exists.") } - + @if (this.IsCloudEmbedding) { - The embedding runs in the cloud. All your data from the folder '@this.DataSource.Path' and all its subdirectories - will be sent to the cloud. + @string.Format(T("The embedding runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud."), this.DataSource.Path) } else { - The embedding runs locally or in your organization. Your data is not sent to the cloud. + @T("The embedding runs locally or in your organization. Your data is not sent to the cloud.") } - + + - - + + @if (this.directorySizeNumFiles > 100) { - For performance reasons, only the first 100 files are shown. The directory contains @this.NumberFilesInDirectory files in total. + @string.Format(T("For performance reasons, only the first 100 files are shown. The directory contains {0} files in total."), this.NumberFilesInDirectory) } - + @if (this.IsOperationInProgress) { } - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor.cs index af8c0df8..839fd5b8 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalDirectoryInfoDialog.razor.cs @@ -1,5 +1,6 @@ using System.Text; +using AIStudio.Components; using AIStudio.Settings; using AIStudio.Settings.DataModel; @@ -9,16 +10,13 @@ using Timer = System.Timers.Timer; namespace AIStudio.Dialogs; -public partial class DataSourceLocalDirectoryInfoDialog : ComponentBase, IAsyncDisposable +public partial class DataSourceLocalDirectoryInfoDialog : MSGComponentBase, IAsyncDisposable { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; [Parameter] public DataSourceLocalDirectory DataSource { get; set; } - - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; private readonly Timer refreshTimer = new(TimeSpan.FromSeconds(1.6)) { diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor index ebd0a5bc..1325a336 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor @@ -1,4 +1,6 @@ @using AIStudio.Settings.DataModel +@inherits MSGComponentBase + @@ -6,7 +8,7 @@ - Select a file for this data source. The content of this file will be processed for the data source. + @T("Select a file for this data source. The content of this file will be processed for the data source.") - + - In order for the AI to be able to determine the appropriate data at any time, you must - choose an embedding method. + @T("In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method.") - + @foreach (var embedding in this.AvailableEmbeddings) { - @embedding.Name + + @embedding.Name + } @@ -41,45 +44,48 @@ @if (string.IsNullOrWhiteSpace(this.dataFilePath)) { - @: Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. - @: Please confirm that you have read and understood this. + @T("Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this.") } else { - @: Please note: the embedding you selected runs in the cloud. All your data within the - @: file '@this.dataFilePath' will be sent to the cloud. Please confirm that you have read - @: and understood this. + @string.Format(T("Please note: the embedding you selected runs in the cloud. All your data within the file '{0}' will be sent to the cloud. Please confirm that you have read and understood this."), this.dataFilePath) } - + } else { - The embedding you selected runs locally or in your organization. Your data is not sent to the cloud. + @T("The embedding you selected runs locally or in your organization. Your data is not sent to the cloud.") } } - + @foreach (var policy in Enum.GetValues()) { - @policy.ToSelectionText() + + @policy.ToSelectionText() + } + + - Cancel + + @T("Cancel") + @if(this.IsEditing) { - @:Update + @T("Update") } else { - @:Add + @T("Add") } diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor.cs index 902899fe..7418a4fa 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileDialog.razor.cs @@ -1,3 +1,4 @@ +using AIStudio.Components; using AIStudio.Settings; using AIStudio.Settings.DataModel; using AIStudio.Tools.Validation; @@ -6,7 +7,7 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs; -public partial class DataSourceLocalFileDialog : ComponentBase +public partial class DataSourceLocalFileDialog : MSGComponentBase { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; @@ -20,9 +21,6 @@ public partial class DataSourceLocalFileDialog : ComponentBase [Parameter] public IReadOnlyList> AvailableEmbeddings { get; set; } = []; - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); private readonly DataSourceValidation dataSourceValidation; @@ -42,6 +40,7 @@ public partial class DataSourceLocalFileDialog : ComponentBase private bool dataUserAcknowledgedCloudEmbedding; private string dataEmbeddingId = string.Empty; private string dataFilePath = string.Empty; + private ushort dataMaxMatches = 10; private DataSourceSecurity dataSecurityPolicy; // We get the form reference from Blazor code to validate it manually: @@ -77,6 +76,7 @@ public partial class DataSourceLocalFileDialog : ComponentBase this.dataEmbeddingId = this.DataSource.EmbeddingId; this.dataFilePath = this.DataSource.FilePath; this.dataSecurityPolicy = this.DataSource.SecurityPolicy; + this.dataMaxMatches = this.DataSource.MaxMatches; } await base.OnInitializedAsync(); @@ -105,6 +105,7 @@ public partial class DataSourceLocalFileDialog : ComponentBase EmbeddingId = this.dataEmbeddingId, FilePath = this.dataFilePath, SecurityPolicy = this.dataSecurityPolicy, + MaxMatches = this.dataMaxMatches, }; private async Task Store() diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor index 0605ff93..2b4a9d78 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor @@ -1,42 +1,44 @@ @using AIStudio.Settings.DataModel +@inherits MSGComponentBase - - - + + @if (!this.IsFileAvailable) { - The file chosen for the data source does not exist anymore. Please edit the data source and choose another file or correct the path. + @T("The file chosen for the data source does not exist anymore. Please edit the data source and choose another file or correct the path.") } else { - The file chosen for the data source exists. + @T("The file chosen for the data source exists.") } - + @if (this.IsCloudEmbedding) { - The embedding runs in the cloud. All your data within the - file '@this.DataSource.FilePath' will be sent to the cloud. + @string.Format(T("The embedding runs in the cloud. All your data within the file '{0}' will be sent to the cloud."), this.DataSource.FilePath) } else { - The embedding runs locally or in your organization. Your data is not sent to the cloud. + @T("The embedding runs locally or in your organization. Your data is not sent to the cloud.") } - - + + + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor.cs b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor.cs index 7dc204c1..0601c182 100644 --- a/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/DataSourceLocalFileInfoDialog.razor.cs @@ -1,3 +1,4 @@ +using AIStudio.Components; using AIStudio.Settings; using AIStudio.Settings.DataModel; @@ -5,16 +6,13 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs; -public partial class DataSourceLocalFileInfoDialog : ComponentBase +public partial class DataSourceLocalFileInfoDialog : MSGComponentBase { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; [Parameter] public DataSourceLocalFile DataSource { get; set; } - - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; #region Overrides of ComponentBase diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor b/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor index 5d8da890..44e697cf 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor +++ b/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor @@ -1,3 +1,5 @@ +@inherits MSGComponentBase + @@ -5,8 +7,8 @@ - - + + @* ReSharper disable once CSharpWarnings::CS8974 *@ - Cancel + + @T("Cancel") + @if(this.IsEditing) { - @:Update + @T("Update") } else { - @:Add + @T("Add") } diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor.cs index 36ee9417..5c998656 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingMethodDialog.razor.cs @@ -1,11 +1,11 @@ using AIStudio.Assistants.ERI; -using AIStudio.Settings; +using AIStudio.Components; using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs; -public partial class EmbeddingMethodDialog : ComponentBase +public partial class EmbeddingMethodDialog : MSGComponentBase { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; @@ -52,9 +52,6 @@ public partial class EmbeddingMethodDialog : ComponentBase [Parameter] public bool IsEditing { get; init; } - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); private bool dataIsValid; @@ -90,13 +87,13 @@ public partial class EmbeddingMethodDialog : ComponentBase private string? ValidateName(string name) { if (string.IsNullOrWhiteSpace(name)) - return "The embedding name must not be empty. Please name the embedding."; + return T("The embedding name must not be empty. Please name the embedding."); if (name.Length > 26) - return "The embedding name must not be longer than 26 characters."; + return T("The embedding name must not be longer than 26 characters."); if (this.UsedEmbeddingMethodNames.Contains(name)) - return $"The embedding method name '{name}' is already used. Please choose a unique name."; + return string.Format(T("The embedding method name '{0}' is already used. Please choose a unique name."), name); return null; } @@ -104,10 +101,10 @@ public partial class EmbeddingMethodDialog : ComponentBase private string? ValidateType(string type) { if (string.IsNullOrWhiteSpace(type)) - return "The embedding type must not be empty. Please specify the embedding type."; + return T("The embedding type must not be empty. Please specify the embedding type."); if (type.Length > 56) - return "The embedding type must not be longer than 56 characters."; + return T("The embedding type must not be longer than 56 characters."); return null; } @@ -115,7 +112,7 @@ public partial class EmbeddingMethodDialog : ComponentBase private string? ValidateDescription(string description) { if (string.IsNullOrWhiteSpace(description)) - return "The description must not be empty. Please describe the embedding method."; + return T("The description must not be empty. Please describe the embedding method."); return null; } @@ -123,7 +120,7 @@ public partial class EmbeddingMethodDialog : ComponentBase private string? ValidateUsedWhen(string usedWhen) { if (string.IsNullOrWhiteSpace(usedWhen)) - return "Please describe when the embedding is used. Might be anytime or when certain keywords are present, etc."; + return T("Please describe when the embedding is used. Might be anytime or when certain keywords are present, etc."); return null; } diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor index 5305e433..c79c80dd 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor @@ -1,93 +1,113 @@ @using AIStudio.Provider @using AIStudio.Provider.SelfHosted +@inherits MSGComponentBase @* ReSharper disable once CSharpWarnings::CS8974 *@ - + @foreach (LLMProviders provider in Enum.GetValues(typeof(LLMProviders))) { - if (provider.ProvideEmbeddings()) + if (provider.ProvideEmbeddings() || provider is LLMProviders.NONE) { - @provider + + @provider.ToName() + } } - Create account + + @T("Create account") + - @* ReSharper disable once CSharpWarnings::CS8974 *@ - - - + @if (this.DataLLMProvider.IsAPIKeyNeeded(this.DataHost)) + { + + } - - @foreach (Host host in Enum.GetValues(typeof(Host))) - { - if (host.AreEmbeddingsSupported()) + @if (this.DataLLMProvider.IsHostnameNeeded()) + { + + } + + @if (this.DataLLMProvider.IsHostNeeded()) + { + + @foreach (Host host in Enum.GetValues(typeof(Host))) { - @host.Name() - } - } - - - - @if (this.DataLLMProvider.IsEmbeddingModelProvidedManually(this.DataHost)) - { - - } - else - { - Load - - @foreach (var model in this.availableModels) + if (host.AreEmbeddingsSupported()) { - @model + + @host.Name() + } - - } - + } + + } + + + + @if (this.DataLLMProvider.IsEmbeddingModelProvidedManually(this.DataHost)) + { + + } + else + { + + @T("Load") + + @if(this.availableModels.Count is 0) + { + + @T("No models loaded or available.") + + } + else + { + + @foreach (var model in this.availableModels) + { + + @model + + } + + } + } + + @* ReSharper disable once CSharpWarnings::CS8974 *@ - Cancel + + @T("Cancel") + @if(this.IsEditing) { - @:Update + @T("Update") } else { - @:Add + @T("Add") } diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs index 1d09fa52..d08ff0a7 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs @@ -1,3 +1,4 @@ +using AIStudio.Components; using AIStudio.Provider; using AIStudio.Settings; using AIStudio.Tools.Services; @@ -9,7 +10,7 @@ using Host = AIStudio.Provider.SelfHosted.Host; namespace AIStudio.Dialogs; -public partial class EmbeddingProviderDialog : ComponentBase, ISecretId +public partial class EmbeddingProviderDialog : MSGComponentBase, ISecretId { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; @@ -68,9 +69,6 @@ public partial class EmbeddingProviderDialog : ComponentBase, ISecretId [Parameter] public bool IsEditing { get; init; } - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - [Inject] private ILogger Logger { get; init; } = null!; @@ -175,7 +173,7 @@ public partial class EmbeddingProviderDialog : ComponentBase, ISecretId this.dataAPIKey = string.Empty; if (this.DataLLMProvider is not LLMProviders.SELF_HOSTED) { - this.dataAPIKeyStorageIssue = $"Failed to load the API key from the operating system. The message was: {requestedSecret.Issue}. You might ignore this message and provide the API key again."; + this.dataAPIKeyStorageIssue = string.Format(T("Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again."), requestedSecret.Issue); await this.form.Validate(); } } @@ -224,7 +222,7 @@ public partial class EmbeddingProviderDialog : ComponentBase, ISecretId var storeResponse = await this.RustService.SetAPIKey(this, this.dataAPIKey); if (!storeResponse.Success) { - this.dataAPIKeyStorageIssue = $"Failed to store the API key in the operating system. The message was: {storeResponse.Issue}. Please try again."; + this.dataAPIKeyStorageIssue = string.Format(T("Failed to store the API key in the operating system. The message was: {0}. Please try again."), storeResponse.Issue); await this.form.Validate(); return; } @@ -236,7 +234,7 @@ public partial class EmbeddingProviderDialog : ComponentBase, ISecretId private string? ValidateManuallyModel(string manuallyModel) { if (this.DataLLMProvider is LLMProviders.SELF_HOSTED && string.IsNullOrWhiteSpace(manuallyModel)) - return "Please enter an embedding model name."; + return T("Please enter an embedding model name."); return null; } @@ -261,8 +259,8 @@ public partial class EmbeddingProviderDialog : ComponentBase, ISecretId private string APIKeyText => this.DataLLMProvider switch { - LLMProviders.SELF_HOSTED => "(Optional) API Key", - _ => "API Key", + LLMProviders.SELF_HOSTED => T("(Optional) API Key"), + _ => T("API Key"), }; private bool IsNoneProvider => this.DataLLMProvider is LLMProviders.NONE; diff --git a/app/MindWork AI Studio/Dialogs/ProfileDialog.razor b/app/MindWork AI Studio/Dialogs/ProfileDialog.razor index fb44439a..b7440a40 100644 --- a/app/MindWork AI Studio/Dialogs/ProfileDialog.razor +++ b/app/MindWork AI Studio/Dialogs/ProfileDialog.razor @@ -1,29 +1,23 @@ +@inherits MSGComponentBase - Store personal data about yourself in various profiles so that the AIs know your personal context. - This saves you from having to explain your context each time, for example, in every chat. When you - have different roles, you can create a profile for each role. + @T("Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role.") - Are you a project manager in a research facility? You might want to create a profile for your project - management activities, one for your scientific work, and a profile for when you need to write program - code. In these profiles, you can record how much experience you have or which methods you like or - dislike using. Later, you can choose when and where you want to use each profile. + @T("Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile.") - The name of the profile is mandatory. Each profile must have a unique name. Whether you provide - information about yourself or only fill out the actions is up to you. Only one of these pieces - is required. + @T("The name of the profile is mandatory. Each profile must have a unique name. Whether you provide information about yourself or only fill out the actions is up to you. Only one of these pieces is required.") @* ReSharper disable once CSharpWarnings::CS8974 *@ - Cancel + + @T("Cancel") + @if(this.IsEditing) { - @:Update + @T("Update") } else { - @:Add + @T("Add") } diff --git a/app/MindWork AI Studio/Dialogs/ProfileDialog.razor.cs b/app/MindWork AI Studio/Dialogs/ProfileDialog.razor.cs index 28b9b4b1..0b2a65a0 100644 --- a/app/MindWork AI Studio/Dialogs/ProfileDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/ProfileDialog.razor.cs @@ -1,10 +1,11 @@ +using AIStudio.Components; using AIStudio.Settings; using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs; -public partial class ProfileDialog : ComponentBase +public partial class ProfileDialog : MSGComponentBase { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; @@ -45,9 +46,6 @@ public partial class ProfileDialog : ComponentBase [Parameter] public bool IsEditing { get; init; } - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - [Inject] private ILogger Logger { get; init; } = null!; @@ -129,10 +127,10 @@ public partial class ProfileDialog : ComponentBase private string? ValidateNeedToKnow(string text) { if (string.IsNullOrWhiteSpace(this.DataNeedToKnow) && string.IsNullOrWhiteSpace(this.DataActions)) - return "Please enter what the LLM should know about you and/or what actions it should take."; + return T("Please enter what the LLM should know about you and/or what actions it should take."); if(text.Length > 444) - return "The text must not exceed 444 characters."; + return T("The text must not exceed 444 characters."); return null; } @@ -140,10 +138,10 @@ public partial class ProfileDialog : ComponentBase private string? ValidateActions(string text) { if (string.IsNullOrWhiteSpace(this.DataNeedToKnow) && string.IsNullOrWhiteSpace(this.DataActions)) - return "Please enter what the LLM should know about you and/or what actions it should take."; + return T("Please enter what the LLM should know about you and/or what actions it should take."); if(text.Length > 256) - return "The text must not exceed 256 characters."; + return T("The text must not exceed 256 characters."); return null; } @@ -151,15 +149,15 @@ public partial class ProfileDialog : ComponentBase private string? ValidateName(string name) { if (string.IsNullOrWhiteSpace(name)) - return "Please enter a profile name."; + return T("Please enter a profile name."); if (name.Length > 40) - return "The profile name must not exceed 40 characters."; + return T("The profile name must not exceed 40 characters."); // The instance name must be unique: var lowerName = name.ToLowerInvariant(); if (lowerName != this.dataEditingPreviousName && this.UsedNames.Contains(lowerName)) - return "The profile name must be unique; the chosen name is already in use."; + return T("The profile name must be unique; the chosen name is already in use."); return null; } diff --git a/app/MindWork AI Studio/Dialogs/ProviderDialog.razor b/app/MindWork AI Studio/Dialogs/ProviderDialog.razor index 108f7375..9da54aaf 100644 --- a/app/MindWork AI Studio/Dialogs/ProviderDialog.razor +++ b/app/MindWork AI Studio/Dialogs/ProviderDialog.razor @@ -1,87 +1,124 @@ @using AIStudio.Provider +@using AIStudio.Provider.HuggingFace @using AIStudio.Provider.SelfHosted - +@inherits MSGComponentBase @* ReSharper disable once CSharpWarnings::CS8974 *@ - + @foreach (LLMProviders provider in Enum.GetValues(typeof(LLMProviders))) { - @provider + + @provider.ToName() + } - Create account + + @T("Create account") + - @* ReSharper disable once CSharpWarnings::CS8974 *@ - - - + @if (this.DataLLMProvider.IsAPIKeyNeeded(this.DataHost)) + { + + } - - @foreach (Host host in Enum.GetValues(typeof(Host))) - { - @host.Name() - } - + @if (this.DataLLMProvider.IsHostnameNeeded()) + { + + } - - @if (this.DataLLMProvider.IsLLMModelProvidedManually()) - { - Show available models - - } - else - { - Load - - @foreach (var model in this.availableModels) + @if (this.DataLLMProvider.IsHostNeeded()) + { + + @foreach (Host host in Enum.GetValues(typeof(Host))) + { + + @host.Name() + + } + + } + + @if (this.DataLLMProvider.IsHFInstanceProviderNeeded()) + { + + @foreach (HFInferenceProvider inferenceProvider in Enum.GetValues(typeof(HFInferenceProvider))) + { + + @inferenceProvider.ToName() + + } + + @* ReSharper disable Asp.Entity *@ + + Please double-check if your model name matches the curl specifications provided by the inference provider. If it doesn't, you might get a Not Found error when trying to use the model. Here's a curl example. + + @* ReSharper restore Asp.Entity *@ + } + + + + @if (this.DataLLMProvider.IsLLMModelProvidedManually()) + { + + @T("Show available models") + + + } + else + { + + @T("Load models") + + @if(this.availableModels.Count is 0) { - @model + + @T("No models loaded or available.") + } - - } - + else + { + + @foreach (var model in this.availableModels) + { + + @model + + } + + } + } + + @* ReSharper disable once CSharpWarnings::CS8974 *@ - Cancel + + @T("Cancel") + @if(this.IsEditing) { - @:Update + @T("Update") } else { - @:Add + @T("Add") } diff --git a/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs index f1a71739..562e424e 100644 --- a/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/ProviderDialog.razor.cs @@ -1,5 +1,6 @@ +using AIStudio.Components; using AIStudio.Provider; -using AIStudio.Settings; +using AIStudio.Provider.HuggingFace; using AIStudio.Tools.Services; using AIStudio.Tools.Validation; @@ -12,7 +13,7 @@ namespace AIStudio.Dialogs; /// /// The provider settings dialog. /// -public partial class ProviderDialog : ComponentBase, ISecretId +public partial class ProviderDialog : MSGComponentBase, ISecretId { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; @@ -47,6 +48,12 @@ public partial class ProviderDialog : ComponentBase, ISecretId [Parameter] public Host DataHost { get; set; } = Host.NONE; + /// + /// The HFInstanceProvider to use, e.g., CEREBRAS. + /// + [Parameter] + public HFInferenceProvider HFInferenceProviderId { get; set; } = HFInferenceProvider.NONE; + /// /// Is this provider self-hosted? /// @@ -71,9 +78,6 @@ public partial class ProviderDialog : ComponentBase, ISecretId [Parameter] public bool IsEditing { get; init; } - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - [Inject] private ILogger Logger { get; init; } = null!; @@ -122,10 +126,16 @@ public partial class ProviderDialog : ComponentBase, ISecretId Id = this.DataId, InstanceName = this.DataInstanceName, UsedLLMProvider = this.DataLLMProvider, - Model = this.DataLLMProvider is LLMProviders.FIREWORKS ? new Model(this.dataManuallyModel, null) : this.DataModel, + Model = this.DataLLMProvider switch + { + LLMProviders.FIREWORKS => new Model(this.dataManuallyModel, null), + LLMProviders.HUGGINGFACE => new Model(this.dataManuallyModel, null), + _ => this.DataModel + }, IsSelfHosted = this.DataLLMProvider is LLMProviders.SELF_HOSTED, Hostname = cleanedHostname.EndsWith('/') ? cleanedHostname[..^1] : cleanedHostname, Host = this.DataHost, + HFInferenceProvider = this.HFInferenceProviderId, }; } @@ -146,8 +156,8 @@ public partial class ProviderDialog : ComponentBase, ISecretId { this.dataEditingPreviousInstanceName = this.DataInstanceName.ToLowerInvariant(); - // When using Fireworks, we must copy the model name: - if (this.DataLLMProvider is LLMProviders.FIREWORKS) + // When using Fireworks or Hugging Face, we must copy the model name: + if (this.DataLLMProvider is LLMProviders.FIREWORKS or LLMProviders.HUGGINGFACE) this.dataManuallyModel = this.DataModel.Id; // @@ -169,7 +179,7 @@ public partial class ProviderDialog : ComponentBase, ISecretId this.dataAPIKey = string.Empty; if (this.DataLLMProvider is not LLMProviders.SELF_HOSTED) { - this.dataAPIKeyStorageIssue = $"Failed to load the API key from the operating system. The message was: {requestedSecret.Issue}. You might ignore this message and provide the API key again."; + this.dataAPIKeyStorageIssue = string.Format(T("Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again."), requestedSecret.Issue); await this.form.Validate(); } } @@ -219,7 +229,7 @@ public partial class ProviderDialog : ComponentBase, ISecretId var storeResponse = await this.RustService.SetAPIKey(this, this.dataAPIKey); if (!storeResponse.Success) { - this.dataAPIKeyStorageIssue = $"Failed to store the API key in the operating system. The message was: {storeResponse.Issue}. Please try again."; + this.dataAPIKeyStorageIssue = string.Format(T("Failed to store the API key in the operating system. The message was: {0}. Please try again."), storeResponse.Issue); await this.form.Validate(); return; } @@ -230,8 +240,8 @@ public partial class ProviderDialog : ComponentBase, ISecretId private string? ValidateManuallyModel(string manuallyModel) { - if (this.DataLLMProvider is LLMProviders.FIREWORKS && string.IsNullOrWhiteSpace(manuallyModel)) - return "Please enter a model name."; + if ((this.DataLLMProvider is LLMProviders.FIREWORKS or LLMProviders.HUGGINGFACE) && string.IsNullOrWhiteSpace(manuallyModel)) + return T("Please enter a model name."); return null; } @@ -256,9 +266,7 @@ public partial class ProviderDialog : ComponentBase, ISecretId private string APIKeyText => this.DataLLMProvider switch { - LLMProviders.SELF_HOSTED => "(Optional) API Key", - _ => "API Key", + LLMProviders.SELF_HOSTED => T("(Optional) API Key"), + _ => T("API Key"), }; - - private bool IsNoneProvider => this.DataLLMProvider is LLMProviders.NONE; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor b/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor index fb7e3b00..72590f20 100644 --- a/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor +++ b/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor @@ -1,24 +1,25 @@ @using AIStudio.Assistants.ERI @using MudExtensions +@inherits MSGComponentBase + - General Information + @T("General Information") - Please provide some general information about your retrieval process first. This data may be - displayed to the users. + @T("Please provide some general information about your retrieval process first. This data may be displayed to the users.") @* ReSharper disable once CSharpWarnings::CS8974 *@ - Retrieval Process Parameters + @T("Retrieval Process Parameters") - You may want to parameterize your retrieval process. However, this is optional. You can specify any - parameters that can be set by the user or the system during the call. Nevertheless, you should use - sensible default values in your code so that users are not forced to set the parameters manually. + @T("You may want to parameterize your retrieval process. However, this is optional. You can specify any parameters that can be set by the user or the system during the call. Nevertheless, you should use sensible default values in your code so that users are not forced to set the parameters manually.") @@ -87,7 +86,7 @@ } - Add Parameter + @T("Add Parameter") @@ -98,13 +97,13 @@ @if(this.retrievalParameters.Count == 0) { - Add a parameter first, then select it to edit. + @T("Add a parameter first, then select it to edit.") } else { - Select a parameter to show and edit it. + @T("Select a parameter to show and edit it.") } } @@ -114,8 +113,8 @@ - Delete this parameter + @T("Delete this parameter") @@ -155,22 +154,19 @@ - Embeddings + @T("Embeddings") @if(this.AvailableEmbeddings.Count == 0) { - Currently, you have not defined any embedding methods. If your retrieval process does not require embedding, you can ignore this part. - Otherwise, you can define one or more embedding methods in the previous view to assign them to your retrieval process here. + @T("Currently, you have not defined any embedding methods. If your retrieval process does not require embedding, you can ignore this part. Otherwise, you can define one or more embedding methods in the previous view to assign them to your retrieval process here.") } else { - Here you can select which embedding methods are used for this retrieval process. Embeddings are optional; - if your retrieval process works without embedding, you can ignore this part. You can only choose the embedding - methods you have previously defined. + @T("Here you can select which embedding methods are used for this retrieval process. Embeddings are optional; if your retrieval process works without embedding, you can ignore this part. You can only choose the embedding methods you have previously defined.") + HelperText="@T("Optional. Select the embedding methods that are used for this retrieval process.")"> @foreach (var embedding in this.AvailableEmbeddings) { @@ -198,15 +194,17 @@ - Cancel + + @T("Cancel") + @if(this.IsEditing) { - @:Update + @T("Update") } else { - @:Add + @T("Add") } diff --git a/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor.cs b/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor.cs index 99b5d9f8..7aa33760 100644 --- a/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/RetrievalProcessDialog.razor.cs @@ -1,11 +1,11 @@ using AIStudio.Assistants.ERI; -using AIStudio.Settings; +using AIStudio.Components; using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs; -public partial class RetrievalProcessDialog : ComponentBase +public partial class RetrievalProcessDialog : MSGComponentBase { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; @@ -60,9 +60,6 @@ public partial class RetrievalProcessDialog : ComponentBase [Parameter] public bool IsEditing { get; init; } - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); private bool dataIsValid; @@ -80,13 +77,13 @@ public partial class RetrievalProcessDialog : ComponentBase protected override async Task OnInitializedAsync() { + await base.OnInitializedAsync(); + // Configure the spellchecking for the instance name input: this.SettingsManager.InjectSpellchecking(SPELLCHECK_ATTRIBUTES); // Convert the parameters: this.retrievalParameters = this.DataParametersDescription.Select(pair => new RetrievalParameter { Name = pair.Key, Description = pair.Value }).ToList(); - - await base.OnInitializedAsync(); } protected override async Task OnAfterRenderAsync(bool firstRender) @@ -104,13 +101,13 @@ public partial class RetrievalProcessDialog : ComponentBase private string? ValidateName(string name) { if (string.IsNullOrWhiteSpace(name)) - return "The retrieval process name must not be empty. Please name your retrieval process."; + return T("The retrieval process name must not be empty. Please name your retrieval process."); if (name.Length > 26) - return "The retrieval process name must not be longer than 26 characters."; + return T("The retrieval process name must not be longer than 26 characters."); if (this.UsedRetrievalProcessNames.Contains(name)) - return $"The retrieval process name '{name}' must be unique. Please choose a different name."; + return string.Format(T("The retrieval process name '{0}' must be unique. Please choose a different name."), name); return null; } @@ -118,26 +115,26 @@ public partial class RetrievalProcessDialog : ComponentBase private string? ValidateDescription(string description) { if (string.IsNullOrWhiteSpace(description)) - return "The description must not be empty. Please describe the retrieval process."; + return T("The description must not be empty. Please describe the retrieval process."); return null; } private void AddRetrievalProcessParameter() { - this.retrievalParameters.Add(new() { Name = $"New Parameter {this.nextParameterId++}", Description = string.Empty }); + this.retrievalParameters.Add(new() { Name = string.Format(T("New Parameter {0}"), this.nextParameterId++), Description = string.Empty }); } private string? ValidateParameterName(string name) { if (string.IsNullOrWhiteSpace(name)) - return "The parameter name must not be empty. Please name the parameter."; + return T("The parameter name must not be empty. Please name the parameter."); if(name.Length > 26) - return "The parameter name must not be longer than 26 characters."; + return T("The parameter name must not be longer than 26 characters."); if (this.retrievalParameters.Count(parameter => parameter.Name == name) > 1) - return $"The parameter name '{name}' must be unique. Please choose a different name."; + return string.Format(T("The parameter name '{0}' must be unique. Please choose a different name."), name); return null; } @@ -145,7 +142,7 @@ public partial class RetrievalProcessDialog : ComponentBase private string? ValidateParameterDescription(string description) { if (string.IsNullOrWhiteSpace(description)) - return $"The parameter description must not be empty. Please describe the parameter '{this.selectedParameter?.Name}'. What data type is it? What is it used for? What are the possible values?"; + return string.Format(T("The parameter description must not be empty. Please describe the parameter '{0}'. What data type is it? What is it used for? What are the possible values?"), this.selectedParameter?.Name); return null; } @@ -156,7 +153,7 @@ public partial class RetrievalProcessDialog : ComponentBase return nameIssue; if (string.IsNullOrWhiteSpace(parameter.Description)) - return $"The parameter description must not be empty. Please describe the parameter '{parameter.Name}'. What data type is it? What is it used for? What are the possible values?"; + return string.Format(T("The parameter description must not be empty. Please describe the parameter '{0}'. What data type is it? What is it used for? What are the possible values?"), parameter.Name); return null; } @@ -172,12 +169,12 @@ public partial class RetrievalProcessDialog : ComponentBase private string GetMultiSelectionText(List selectedEmbeddings) { if(selectedEmbeddings.Count == 0) - return "No embedding methods selected."; + return T("No embedding methods selected."); if(selectedEmbeddings.Count == 1) - return "You have selected 1 embedding method."; + return T("You have selected 1 embedding method."); - return $"You have selected {selectedEmbeddings.Count} embedding methods."; + return string.Format(T("You have selected {0} embedding methods."), selectedEmbeddings.Count); } private void EmbeddingsChanged(IEnumerable? updatedEmbeddings) diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor index cfdbdd47..f217da79 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAgenda.razor @@ -5,39 +5,41 @@ - Assistant: Agenda Planner Options + @T("Assistant: Agenda Planner Options") - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + @if (this.SettingsManager.ConfigurationData.Agenda.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } - + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor index 1aef4b4e..ec6776f0 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor @@ -1,40 +1,41 @@ @using AIStudio.Settings -@using AIStudio.Settings.DataModel @inherits SettingsDialogBase - Assistant: Bias of the Day Options + @T("Assistant: Bias of the Day Options") - - + + - You have learned about @this.SettingsManager.ConfigurationData.BiasOfTheDay.UsedBias.Count out of @BiasCatalog.ALL_BIAS.Count biases. + @this.StatText - Reset + @T("Reset") - - + + @if (this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } - + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor.cs index 75767049..27686673 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor.cs +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogAssistantBias.razor.cs @@ -1,15 +1,19 @@ +using AIStudio.Settings.DataModel; + namespace AIStudio.Dialogs.Settings; public partial class SettingsDialogAssistantBias : SettingsDialogBase { + private string StatText => string.Format(T("You have learned about {0} out of {1} biases."), this.SettingsManager.ConfigurationData.BiasOfTheDay.UsedBias.Count, BiasCatalog.ALL_BIAS.Count); + private async Task ResetBiasOfTheDayHistory() { var dialogParameters = new DialogParameters { - { "Message", "Are you sure you want to reset your bias-of-the-day statistics? The system will no longer remember which biases you already know. As a result, biases you are already familiar with may be addressed again." }, + { "Message", T("Are you sure you want to reset your bias-of-the-day statistics? The system will no longer remember which biases you already know. As a result, biases you are already familiar with may be addressed again.") }, }; - var dialogReference = await this.DialogService.ShowAsync("Reset your bias-of-the-day statistics", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Reset your bias-of-the-day statistics"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBase.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBase.cs index b1568427..1dd94c1c 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBase.cs +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogBase.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; +using AIStudio.Components; using AIStudio.Settings; using AIStudio.Tools.Services; @@ -7,20 +8,14 @@ using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs.Settings; -public abstract class SettingsDialogBase : ComponentBase, IMessageBusReceiver, IDisposable +public abstract class SettingsDialogBase : MSGComponentBase { [CascadingParameter] protected IMudDialogInstance MudDialog { get; set; } = null!; - [Inject] - protected SettingsManager SettingsManager { get; init; } = null!; - [Inject] protected IDialogService DialogService { get; init; } = null!; - [Inject] - protected MessageBus MessageBus { get; init; } = null!; - [Inject] protected RustService RustService { get; init; } = null!; @@ -32,13 +27,13 @@ public abstract class SettingsDialogBase : ComponentBase, IMessageBusReceiver, I /// protected override async Task OnInitializedAsync() { - // Register this component with the message bus: - this.MessageBus.RegisterComponent(this); - this.MessageBus.ApplyFilters(this, [], [ Event.CONFIGURATION_CHANGED ]); + await base.OnInitializedAsync(); + this.MudDialog.StateHasChanged(); + + this.ApplyFilters([], [ Event.CONFIGURATION_CHANGED ]); this.UpdateProviders(); this.UpdateEmbeddingProviders(); - await base.OnInitializedAsync(); } #endregion @@ -59,12 +54,10 @@ public abstract class SettingsDialogBase : ComponentBase, IMessageBusReceiver, I foreach (var provider in this.SettingsManager.ConfigurationData.EmbeddingProviders) this.availableEmbeddingProviders.Add(new (provider.Name, provider.Id)); } - - #region Implementation of IMessageBusReceiver - public string ComponentName => nameof(Settings); - - public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, TMsg? data) + #region Overrides of MSGComponentBase + + protected override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) { @@ -72,23 +65,9 @@ public abstract class SettingsDialogBase : ComponentBase, IMessageBusReceiver, I this.StateHasChanged(); break; } - + return Task.CompletedTask; } - public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) - { - return Task.FromResult(default); - } - - #endregion - - #region Implementation of IDisposable - - public void Dispose() - { - this.MessageBus.Unregister(this); - } - #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChat.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChat.razor new file mode 100644 index 00000000..111b6a93 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChat.razor @@ -0,0 +1,36 @@ +@using AIStudio.Settings +@using AIStudio.Settings.DataModel +@inherits SettingsDialogBase + + + + + + @T("Chat Options") + + + + + + + + + + + + + + + + @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) + { + + + } + + + + @T("Close") + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChat.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChat.razor.cs new file mode 100644 index 00000000..87a687e3 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChat.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogChat : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChatTemplate.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChatTemplate.razor new file mode 100644 index 00000000..a11c9de0 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChatTemplate.razor @@ -0,0 +1,62 @@ +@inherits SettingsDialogBase + + + + + + @T("Your Chat Templates") + + + + + @T("Customize your AI experience with chat templates. Whether you want to experiment with prompt engineering, simply use a custom system prompt in the standard chat interface, or create a specialized assistant, our templates give you full control. Similar to common AI companies' playgrounds, you can define your own system prompts and leverage assistant prompts for providers that support them.") + + + + @T("Note: This advanced feature is designed for users familiar with prompt engineering concepts. Furthermore, you have to make sure yourself that your chosen provider supports the use of assistant prompts.") + + + + + + + + + + # + @T("Chat Template Name") + @T("Actions") + + + @context.Num + @context.Name + + + + + + + + + + + + + + @if(this.SettingsManager.ConfigurationData.ChatTemplates.Count == 0) + { + + @T("No chat templates configured yet.") + + } + + + @T("Add Chat Template") + + + + + @T("Close") + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChatTemplate.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChatTemplate.razor.cs new file mode 100644 index 00000000..df45daae --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogChatTemplate.razor.cs @@ -0,0 +1,70 @@ +using AIStudio.Settings; + +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogChatTemplate : SettingsDialogBase +{ + private async Task AddChatTemplate() + { + var dialogParameters = new DialogParameters + { + { x => x.IsEditing, false }, + }; + + var dialogReference = await this.DialogService.ShowAsync(T("Add Chat Template"), dialogParameters, DialogOptions.FULLSCREEN); + var dialogResult = await dialogReference.Result; + if (dialogResult is null || dialogResult.Canceled) + return; + + var addedChatTemplate = (ChatTemplate)dialogResult.Data!; + addedChatTemplate = addedChatTemplate with { Num = this.SettingsManager.ConfigurationData.NextChatTemplateNum++ }; + + this.SettingsManager.ConfigurationData.ChatTemplates.Add(addedChatTemplate); + + await this.SettingsManager.StoreSettings(); + await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); + } + + private async Task EditChatTemplate(ChatTemplate chatTemplate) + { + var dialogParameters = new DialogParameters + { + { x => x.DataNum, chatTemplate.Num }, + { x => x.DataId, chatTemplate.Id }, + { x => x.DataName, chatTemplate.Name }, + { x => x.DataSystemPrompt, chatTemplate.SystemPrompt }, + { x => x.IsEditing, true }, + { x => x.ExampleConversation, chatTemplate.ExampleConversation }, + { x => x.AllowProfileUsage, chatTemplate.AllowProfileUsage }, + }; + + var dialogReference = await this.DialogService.ShowAsync(T("Edit Chat Template"), dialogParameters, DialogOptions.FULLSCREEN); + var dialogResult = await dialogReference.Result; + if (dialogResult is null || dialogResult.Canceled) + return; + + var editedChatTemplate = (ChatTemplate)dialogResult.Data!; + this.SettingsManager.ConfigurationData.ChatTemplates[this.SettingsManager.ConfigurationData.ChatTemplates.IndexOf(chatTemplate)] = editedChatTemplate; + + await this.SettingsManager.StoreSettings(); + await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); + } + + private async Task DeleteChatTemplate(ChatTemplate chatTemplate) + { + var dialogParameters = new DialogParameters + { + { "Message", string.Format(T("Are you sure you want to delete the chat template '{0}'?"), chatTemplate.Name) }, + }; + + var dialogReference = await this.DialogService.ShowAsync(T("Delete Chat Template"), dialogParameters, DialogOptions.FULLSCREEN); + var dialogResult = await dialogReference.Result; + if (dialogResult is null || dialogResult.Canceled) + return; + + this.SettingsManager.ConfigurationData.ChatTemplates.Remove(chatTemplate); + await this.SettingsManager.StoreSettings(); + + await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor index c5a09136..dde19c0c 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogCoding.razor @@ -6,21 +6,21 @@ - Assistant: Coding Options + @T("Assistant: Coding Options") - - - + + + @if (this.SettingsManager.ConfigurationData.Coding.PreselectedProgrammingLanguage is CommonCodingLanguages.OTHER) { - + } - + diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor index 17c05fc2..74b15fdb 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor @@ -6,14 +6,12 @@ - Configured Data Sources + @T("Configured Data Sources") - You might configure different data sources. A data source can include one file, all files - in a directory, or data from your company. Later, you can incorporate these data sources - as needed when the AI requires this data to complete a certain task. + @T("You might configure different data sources. A data source can include one file, all files in a directory, or data from your company. Later, you can incorporate these data sources as needed when the AI requires this data to complete a certain task.") @@ -26,10 +24,10 @@ # - Name - Type - Embedding - Actions + @T("Name") + @T("Type") + @T("Embedding") + @T("Actions") @context.Num @@ -41,10 +39,10 @@ - Edit + @T("Edit") - Delete + @T("Delete") @@ -53,16 +51,26 @@ @if (this.SettingsManager.ConfigurationData.DataSources.Count == 0) { - No data sources configured yet. + + @T("No data sources configured yet.") + } - - External Data (ERI-Server v1) - Local Directory - Local File + + + @T("External Data (ERI-Server v1)") + + + @T("Local Directory") + + + @T("Local File") + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs index d2c6cef8..2c2eff67 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs @@ -12,15 +12,15 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { var matchedEmbedding = this.SettingsManager.ConfigurationData.EmbeddingProviders.FirstOrDefault(x => x.Id == internalDataSource.EmbeddingId); if(matchedEmbedding == default) - return "No valid embedding"; + return T("No valid embedding"); return matchedEmbedding.Name; } if(dataSource is IExternalDataSource) - return "External (ERI)"; + return T("External (ERI)"); - return "Unknown"; + return T("Unknown"); } private async Task AddDataSource(DataSourceType type) @@ -35,7 +35,7 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { x => x.AvailableEmbeddings, this.availableEmbeddingProviders } }; - var localFileDialogReference = await this.DialogService.ShowAsync("Add Local File as Data Source", localFileDialogParameters, DialogOptions.FULLSCREEN); + var localFileDialogReference = await this.DialogService.ShowAsync(T("Add Local File as Data Source"), localFileDialogParameters, DialogOptions.FULLSCREEN); var localFileDialogResult = await localFileDialogReference.Result; if (localFileDialogResult is null || localFileDialogResult.Canceled) return; @@ -52,7 +52,7 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { x => x.AvailableEmbeddings, this.availableEmbeddingProviders } }; - var localDirectoryDialogReference = await this.DialogService.ShowAsync("Add Local Directory as Data Source", localDirectoryDialogParameters, DialogOptions.FULLSCREEN); + var localDirectoryDialogReference = await this.DialogService.ShowAsync(T("Add Local Directory as Data Source"), localDirectoryDialogParameters, DialogOptions.FULLSCREEN); var localDirectoryDialogResult = await localDirectoryDialogReference.Result; if (localDirectoryDialogResult is null || localDirectoryDialogResult.Canceled) return; @@ -68,7 +68,7 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { x => x.IsEditing, false }, }; - var eriDialogReference = await this.DialogService.ShowAsync("Add ERI v1 Data Source", eriDialogParameters, DialogOptions.FULLSCREEN); + var eriDialogReference = await this.DialogService.ShowAsync(T("Add ERI v1 Data Source"), eriDialogParameters, DialogOptions.FULLSCREEN); var eriDialogResult = await eriDialogReference.Result; if (eriDialogResult is null || eriDialogResult.Canceled) return; @@ -100,7 +100,7 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { x => x.AvailableEmbeddings, this.availableEmbeddingProviders } }; - var localFileDialogReference = await this.DialogService.ShowAsync("Edit Local File Data Source", localFileDialogParameters, DialogOptions.FULLSCREEN); + var localFileDialogReference = await this.DialogService.ShowAsync(T("Edit Local File Data Source"), localFileDialogParameters, DialogOptions.FULLSCREEN); var localFileDialogResult = await localFileDialogReference.Result; if (localFileDialogResult is null || localFileDialogResult.Canceled) return; @@ -116,7 +116,7 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { x => x.AvailableEmbeddings, this.availableEmbeddingProviders } }; - var localDirectoryDialogReference = await this.DialogService.ShowAsync("Edit Local Directory Data Source", localDirectoryDialogParameters, DialogOptions.FULLSCREEN); + var localDirectoryDialogReference = await this.DialogService.ShowAsync(T("Edit Local Directory Data Source"), localDirectoryDialogParameters, DialogOptions.FULLSCREEN); var localDirectoryDialogResult = await localDirectoryDialogReference.Result; if (localDirectoryDialogResult is null || localDirectoryDialogResult.Canceled) return; @@ -131,7 +131,7 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { x => x.DataSource, eriDataSource }, }; - var eriDialogReference = await this.DialogService.ShowAsync("Edit ERI v1 Data Source", eriDialogParameters, DialogOptions.FULLSCREEN); + var eriDialogReference = await this.DialogService.ShowAsync(T("Edit ERI v1 Data Source"), eriDialogParameters, DialogOptions.FULLSCREEN); var eriDialogResult = await eriDialogReference.Result; if (eriDialogResult is null || eriDialogResult.Canceled) return; @@ -153,10 +153,10 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { var dialogParameters = new DialogParameters { - { "Message", $"Are you sure you want to delete the data source '{dataSource.Name}' of type {dataSource.Type.GetDisplayName()}?" }, + { "Message", string.Format(T("Are you sure you want to delete the data source '{0}' of type {1}?"), dataSource.Name, dataSource.Type.GetDisplayName()) }, }; - var dialogReference = await this.DialogService.ShowAsync("Delete Data Source", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Delete Data Source"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -198,7 +198,7 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { x => x.DataSource, localFile }, }; - await this.DialogService.ShowAsync("Local File Data Source Information", localFileDialogParameters, DialogOptions.FULLSCREEN); + await this.DialogService.ShowAsync(T("Local File Data Source Information"), localFileDialogParameters, DialogOptions.FULLSCREEN); break; case DataSourceLocalDirectory localDirectory: @@ -207,7 +207,7 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { x => x.DataSource, localDirectory }, }; - await this.DialogService.ShowAsync("Local Directory Data Source Information", localDirectoryDialogParameters, DialogOptions.FULLSCREEN); + await this.DialogService.ShowAsync(T("Local Directory Data Source Information"), localDirectoryDialogParameters, DialogOptions.FULLSCREEN); break; case DataSourceERI_V1 eriV1DataSource: @@ -216,7 +216,7 @@ public partial class SettingsDialogDataSources : SettingsDialogBase { x => x.DataSource, eriV1DataSource }, }; - await this.DialogService.ShowAsync("ERI v1 Data Source Information", eriV1DialogParameters, DialogOptions.FULLSCREEN); + await this.DialogService.ShowAsync(T("ERI v1 Data Source Information"), eriV1DialogParameters, DialogOptions.FULLSCREEN); break; } } diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor index 7ce8cc3b..cb4e20ac 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogERIServer.razor @@ -6,22 +6,23 @@ - Assistant: ERI Server Options + @T("Assistant: ERI Server Options") - + - + - Most ERI server options can be customized and saved directly in the ERI server assistant. - For this, the ERI server assistant has an auto-save function. + @T("Most ERI server options can be customized and saved directly in the ERI server assistant. For this, the ERI server assistant has an auto-save function.") - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor index c7ae29dd..7130f3cf 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogGrammarSpelling.razor @@ -5,22 +5,24 @@ - Assistant: Grammar & Spelling Checker Options + @T("Assistant: Grammar & Spelling Checker Options") - - + + @if (this.SettingsManager.ConfigurationData.GrammarSpelling.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogI18N.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogI18N.razor new file mode 100644 index 00000000..a64528d0 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogI18N.razor @@ -0,0 +1,28 @@ +@using AIStudio.Settings +@inherits SettingsDialogBase + + + + + + @T("Assistant: Localization") + + + + + + + @if (this.SettingsManager.ConfigurationData.I18N.PreselectedTargetLanguage is CommonLanguages.OTHER) + { + + } + + + + + + + @T("Close") + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogI18N.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogI18N.razor.cs new file mode 100644 index 00000000..22cbbfb9 --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogI18N.razor.cs @@ -0,0 +1,5 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogI18N : SettingsDialogBase +{ +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor index 0562b38e..187e0523 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogIconFinder.razor @@ -5,18 +5,20 @@ - Assistant: Icon Finder Options + @T("Assistant: Icon Finder Options") - - + + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor index 505d5624..9d2c47bc 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogJobPostings.razor @@ -5,29 +5,31 @@ - Assistant: Job Posting Options + @T("Assistant: Job Posting Options") - - - - - - - + + + + + + + - + @if (this.SettingsManager.ConfigurationData.JobPostings.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor index 10b2c286..42cb70d4 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogLegalCheck.razor @@ -4,21 +4,23 @@ - Assistant: Legal Check Options + @T("Assistant: Legal Check Options") - + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor index 91d318af..626f421d 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogMyTasks.razor @@ -5,23 +5,25 @@ - Assistant: My Tasks Options + @T("Assistant: My Tasks Options") - - + + @if (this.SettingsManager.ConfigurationData.MyTasks.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } - + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogProfiles.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogProfiles.razor new file mode 100644 index 00000000..ba476b3b --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogProfiles.razor @@ -0,0 +1,61 @@ +@inherits SettingsDialogBase + + + + + + @T("Your Profiles") + + + + + @T("Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role.") + + + + @T("Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile.") + + + + + + + + + # + @T("Profile Name") + @T("Actions") + + + @context.Num + @context.Name + + + + + + + + + + + + + + @if(this.SettingsManager.ConfigurationData.Profiles.Count == 0) + { + + @T("No profiles configured yet.") + + } + + + @T("Add Profile") + + + + + @T("Close") + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/Settings/SettingsPanelProfiles.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogProfiles.razor.cs similarity index 83% rename from app/MindWork AI Studio/Components/Settings/SettingsPanelProfiles.razor.cs rename to app/MindWork AI Studio/Dialogs/Settings/SettingsDialogProfiles.razor.cs index 15b3214d..acb5e5a6 100644 --- a/app/MindWork AI Studio/Components/Settings/SettingsPanelProfiles.razor.cs +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogProfiles.razor.cs @@ -1,11 +1,8 @@ -using AIStudio.Dialogs; using AIStudio.Settings; -using DialogOptions = AIStudio.Dialogs.DialogOptions; +namespace AIStudio.Dialogs.Settings; -namespace AIStudio.Components.Settings; - -public partial class SettingsPanelProfiles : SettingsPanelBase +public partial class SettingsDialogProfiles : SettingsDialogBase { private async Task AddProfile() { @@ -14,7 +11,7 @@ public partial class SettingsPanelProfiles : SettingsPanelBase { x => x.IsEditing, false }, }; - var dialogReference = await this.DialogService.ShowAsync("Add Profile", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Add Profile"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -40,7 +37,7 @@ public partial class SettingsPanelProfiles : SettingsPanelBase { x => x.IsEditing, true }, }; - var dialogReference = await this.DialogService.ShowAsync("Edit Profile", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Edit Profile"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -56,10 +53,10 @@ public partial class SettingsPanelProfiles : SettingsPanelBase { var dialogParameters = new DialogParameters { - { "Message", $"Are you sure you want to delete the profile '{profile.Name}'?" }, + { "Message", string.Format(T("Are you sure you want to delete the profile '{0}'?"), profile.Name) }, }; - var dialogReference = await this.DialogService.ShowAsync("Delete Profile", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Delete Profile"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor index e6bcf79f..6cdfc96f 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogRewrite.razor @@ -5,24 +5,26 @@ - Assistant: Rewrite & Improve Text Options + @T("Assistant: Rewrite & Improve Text Options") - - + + @if (this.SettingsManager.ConfigurationData.RewriteImprove.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } - - + + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor index 2d7e29f4..0a78e616 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogSynonyms.razor @@ -5,22 +5,24 @@ - Assistant: Synonyms Options + @T("Assistant: Synonyms Options") - - + + @if (this.SettingsManager.ConfigurationData.Synonyms.PreselectedLanguage is CommonLanguages.OTHER) { - + } - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor index 111fda45..0568c491 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTextSummarizer.razor @@ -6,30 +6,32 @@ - Assistant: Text Summarizer Options + @T("Assistant: Text Summarizer Options") - + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor index 8cb87ac7..f3db4a3c 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogTranslation.razor @@ -4,27 +4,29 @@ - Assistant: Translator Options + @T("Assistant: Translator Options") - - + + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWorkspaces.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWorkspaces.razor new file mode 100644 index 00000000..0095398c --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWorkspaces.razor @@ -0,0 +1,26 @@ +@using AIStudio.Settings +@using AIStudio.Settings.DataModel +@inherits SettingsDialogBase + + + + + + @T("Your Workspaces Configuration") + + + + + + @if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES) + { + + + } + + + + @T("Close") + + + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWorkspaces.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWorkspaces.razor.cs new file mode 100644 index 00000000..0d7d677c --- /dev/null +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWorkspaces.razor.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Dialogs.Settings; + +public partial class SettingsDialogWorkspaces : SettingsDialogBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor index a6f4bca9..6f31f266 100644 --- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor +++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogWritingEMails.razor @@ -5,26 +5,28 @@ - Assistant: Writing E-Mails Options + @T("Assistant: Writing E-Mails Options") - - - - + + + + @if (this.SettingsManager.ConfigurationData.EMail.PreselectedTargetLanguage is CommonLanguages.OTHER) { - + } - + - + - Close + + @T("Close") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor b/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor index f58d5ecf..1583fc04 100644 --- a/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor +++ b/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor @@ -1,10 +1,17 @@ +@inherits MSGComponentBase - @this.Message - + + @this.Message + + - Cancel - @this.ConfirmText + + @T("Cancel") + + + @this.ConfirmText + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor.cs b/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor.cs index 914b20e4..c4686571 100644 --- a/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/SingleInputDialog.razor.cs @@ -1,10 +1,10 @@ -using AIStudio.Settings; +using AIStudio.Components; using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs; -public partial class SingleInputDialog : ComponentBase +public partial class SingleInputDialog : MSGComponentBase { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; @@ -21,9 +21,6 @@ public partial class SingleInputDialog : ComponentBase [Parameter] public Color ConfirmColor { get; set; } = Color.Error; - [Inject] - private SettingsManager SettingsManager { get; set; } = null!; - private static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); #region Overrides of ComponentBase diff --git a/app/MindWork AI Studio/Dialogs/UpdateDialog.razor b/app/MindWork AI Studio/Dialogs/UpdateDialog.razor index f3551424..9f3ef694 100644 --- a/app/MindWork AI Studio/Dialogs/UpdateDialog.razor +++ b/app/MindWork AI Studio/Dialogs/UpdateDialog.razor @@ -1,13 +1,18 @@ +@inherits MSGComponentBase - Update from v@(META_DATA.Version) to v@(this.UpdateResponse.NewVersion) + @this.HeaderText - Install later - Install now + + @T("Install later") + + + @T("Install now") + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/UpdateDialog.razor.cs b/app/MindWork AI Studio/Dialogs/UpdateDialog.razor.cs index 555cb182..51280dce 100644 --- a/app/MindWork AI Studio/Dialogs/UpdateDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/UpdateDialog.razor.cs @@ -1,5 +1,7 @@ using System.Reflection; +using AIStudio.Components; +using AIStudio.Tools.Metadata; using AIStudio.Tools.Rust; using Microsoft.AspNetCore.Components; @@ -9,7 +11,7 @@ namespace AIStudio.Dialogs; /// /// The update dialog that is used to inform the user about an available update. /// -public partial class UpdateDialog : ComponentBase +public partial class UpdateDialog : MSGComponentBase { private static readonly Assembly ASSEMBLY = Assembly.GetExecutingAssembly(); private static readonly MetaDataAttribute META_DATA = ASSEMBLY.GetCustomAttribute()!; @@ -19,7 +21,9 @@ public partial class UpdateDialog : ComponentBase [Parameter] public UpdateResponse UpdateResponse { get; set; } - + + private string HeaderText => string.Format(T("Update from v{0} to v{1}"), META_DATA.Version, this.UpdateResponse.NewVersion); + private void Cancel() => this.MudDialog.Cancel(); private void Confirm() => this.MudDialog.Close(DialogResult.Ok(true)); diff --git a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor index 3c185087..05493cff 100644 --- a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor +++ b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor @@ -1,6 +1,9 @@ +@inherits MSGComponentBase - @this.Message + + @this.Message + @foreach (var (workspaceName, workspaceId) in this.workspaces) { @@ -9,7 +12,11 @@ - Cancel - @this.ConfirmText + + @T("Cancel") + + + @this.ConfirmText + \ No newline at end of file diff --git a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs index f2c3d090..9a096e27 100644 --- a/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/WorkspaceSelectionDialog.razor.cs @@ -1,12 +1,13 @@ using System.Text; +using AIStudio.Components; using AIStudio.Settings; using Microsoft.AspNetCore.Components; namespace AIStudio.Dialogs; -public partial class WorkspaceSelectionDialog : ComponentBase +public partial class WorkspaceSelectionDialog : MSGComponentBase { [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = null!; diff --git a/app/MindWork AI Studio/Layout/MainLayout.razor b/app/MindWork AI Studio/Layout/MainLayout.razor index 96ebb50a..23937719 100644 --- a/app/MindWork AI Studio/Layout/MainLayout.razor +++ b/app/MindWork AI Studio/Layout/MainLayout.razor @@ -15,7 +15,9 @@ @foreach (var navBarItem in this.navItems) { - @navBarItem.Name + + @navBarItem.Name + } @@ -51,7 +53,7 @@ } - Please wait for the update to complete... + @T("Please wait for the update to complete...") diff --git a/app/MindWork AI Studio/Layout/MainLayout.razor.cs b/app/MindWork AI Studio/Layout/MainLayout.razor.cs index 586772f2..b3c5b0a2 100644 --- a/app/MindWork AI Studio/Layout/MainLayout.razor.cs +++ b/app/MindWork AI Studio/Layout/MainLayout.razor.cs @@ -12,7 +12,7 @@ using DialogOptions = AIStudio.Dialogs.DialogOptions; namespace AIStudio.Layout; -public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDisposable +public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, ILang, IDisposable { [Inject] private SettingsManager SettingsManager { get; init; } = null!; @@ -38,6 +38,8 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis [Inject] private MudTheme ColorTheme { get; init; } = null!; + private ILanguagePlugin Lang { get; set; } = PluginFactory.BaseLanguage; + private string PaddingLeft => this.navBarOpen ? $"padding-left: {NAVBAR_EXPANDED_WIDTH_INT - NAVBAR_COLLAPSED_WIDTH_INT}em;" : "padding-left: 0em;"; private const int NAVBAR_COLLAPSED_WIDTH_INT = 4; @@ -78,31 +80,19 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis // Read the user language from Rust: // var userLanguage = await this.RustService.ReadUserLanguage(); - this.Logger.LogInformation($"The user language is: '{userLanguage}'"); + this.Logger.LogInformation($"The OS says '{userLanguage}' is the user language."); // Ensure that all settings are loaded: await this.SettingsManager.LoadSettings(); - // - // We cannot process the plugins before the settings are loaded, - // and we know our data directory. - // - if(PreviewFeatures.PRE_PLUGINS_2025.IsEnabled(this.SettingsManager)) - { - // Ensure that all internal plugins are present: - await PluginFactory.EnsureInternalPlugins(); - - // Load (but not start) all plugins, without waiting for them: - var pluginLoadingTimeout = new CancellationTokenSource(TimeSpan.FromSeconds(5)); - _ = PluginFactory.LoadAll(pluginLoadingTimeout.Token); - - // Set up hot reloading for plugins: - PluginFactory.SetUpHotReloading(); - } - // Register this component with the message bus: this.MessageBus.RegisterComponent(this); - this.MessageBus.ApplyFilters(this, [], [ Event.UPDATE_AVAILABLE, Event.CONFIGURATION_CHANGED, Event.COLOR_THEME_CHANGED, Event.SHOW_ERROR, Event.SHOW_WARNING, Event.SHOW_SUCCESS, ]); + this.MessageBus.ApplyFilters(this, [], + [ + Event.UPDATE_AVAILABLE, Event.CONFIGURATION_CHANGED, Event.COLOR_THEME_CHANGED, Event.SHOW_ERROR, + Event.SHOW_ERROR, Event.SHOW_WARNING, Event.SHOW_SUCCESS, Event.STARTUP_PLUGIN_SYSTEM, + Event.PLUGINS_RELOADED + ]); // Set the snackbar for the update service: UpdateService.SetBlazorDependencies(this.Snackbar); @@ -115,6 +105,9 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis // Solve issue https://github.com/MudBlazor/MudBlazor/issues/11133: MudGlobal.TooltipDefaults.Duration = TimeSpan.Zero; + // Send a message to start the plugin system: + await this.MessageBus.SendMessage(this, Event.STARTUP_PLUGIN_SYSTEM); + await this.themeProvider.WatchSystemPreference(this.SystemeThemeChanged); await this.UpdateThemeConfiguration(); this.LoadNavItems(); @@ -129,11 +122,21 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis #endregion + #region Implementation of ILang + + /// + public string T(string fallbackEN) => this.GetText(this.Lang, fallbackEN); + + /// + public string T(string fallbackEN, string? typeNamespace, string? typeName) => this.GetText(this.Lang, fallbackEN, typeNamespace, typeName); + + #endregion + #region Implementation of IMessageBusReceiver public string ComponentName => nameof(MainLayout); - public async Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) + public async Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, TMessage? data) { switch (triggeredEvent) { @@ -141,7 +144,8 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis if (data is UpdateResponse updateResponse) { this.currentUpdateResponse = updateResponse; - this.Snackbar.Add($"An update to version {updateResponse.NewVersion} is available.", Severity.Info, config => + var message = string.Format(T("An update to version {0} is available."), updateResponse.NewVersion); + this.Snackbar.Add(message, Severity.Info, config => { config.Icon = Icons.Material.Filled.Update; config.IconSize = Size.Large; @@ -151,9 +155,8 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis { await this.ShowUpdateDialog(); }; - config.Action = "Show details"; + config.Action = T("Show details"); config.ActionVariant = Variant.Filled; - config.ActionColor = Color.Dark; }); } @@ -191,6 +194,37 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis warning.Show(this.Snackbar); break; + + case Event.STARTUP_PLUGIN_SYSTEM: + if(PreviewFeatures.PRE_PLUGINS_2025.IsEnabled(this.SettingsManager)) + { + _ = Task.Run(async () => + { + // Set up the plugin system: + if (PluginFactory.Setup()) + { + // Ensure that all internal plugins are present: + await PluginFactory.EnsureInternalPlugins(); + + // Load (but not start) all plugins, without waiting for them: + var pluginLoadingTimeout = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + await PluginFactory.LoadAll(pluginLoadingTimeout.Token); + + // Set up hot reloading for plugins: + PluginFactory.SetUpHotReloading(); + } + }); + } + + break; + + case Event.PLUGINS_RELOADED: + this.Lang = await this.SettingsManager.GetActiveLanguagePlugin(); + I18N.Init(this.Lang); + this.LoadNavItems(); + + await this.InvokeAsync(this.StateHasChanged); + break; } } @@ -205,19 +239,19 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis { var palette = this.ColorTheme.GetCurrentPalette(this.SettingsManager); - yield return new("Home", Icons.Material.Filled.Home, palette.DarkLighten, palette.GrayLight, Routes.HOME, true); - yield return new("Chat", Icons.Material.Filled.Chat, palette.DarkLighten, palette.GrayLight, Routes.CHAT, false); - yield return new("Assistants", Icons.Material.Filled.Apps, palette.DarkLighten, palette.GrayLight, Routes.ASSISTANTS, false); + yield return new(T("Home"), Icons.Material.Filled.Home, palette.DarkLighten, palette.GrayLight, Routes.HOME, true); + yield return new(T("Chat"), Icons.Material.Filled.Chat, palette.DarkLighten, palette.GrayLight, Routes.CHAT, false); + yield return new(T("Assistants"), Icons.Material.Filled.Apps, palette.DarkLighten, palette.GrayLight, Routes.ASSISTANTS, false); if (PreviewFeatures.PRE_WRITER_MODE_2024.IsEnabled(this.SettingsManager)) - yield return new("Writer", Icons.Material.Filled.Create, palette.DarkLighten, palette.GrayLight, Routes.WRITER, false); + yield return new(T("Writer"), Icons.Material.Filled.Create, palette.DarkLighten, palette.GrayLight, Routes.WRITER, false); if (PreviewFeatures.PRE_PLUGINS_2025.IsEnabled(this.SettingsManager)) - yield return new("Plugins", Icons.Material.TwoTone.Extension, palette.DarkLighten, palette.GrayLight, Routes.PLUGINS, false); + yield return new(T("Plugins"), Icons.Material.TwoTone.Extension, palette.DarkLighten, palette.GrayLight, Routes.PLUGINS, false); - yield return new("Supporters", Icons.Material.Filled.Favorite, palette.Error.Value, "#801a00", Routes.SUPPORTERS, false); - yield return new("About", Icons.Material.Filled.Info, palette.DarkLighten, palette.GrayLight, Routes.ABOUT, false); - yield return new("Settings", Icons.Material.Filled.Settings, palette.DarkLighten, palette.GrayLight, Routes.SETTINGS, false); + yield return new(T("Supporters"), Icons.Material.Filled.Favorite, palette.Error.Value, "#801a00", Routes.SUPPORTERS, false); + yield return new(T("About"), Icons.Material.Filled.Info, palette.DarkLighten, palette.GrayLight, Routes.ABOUT, false); + yield return new(T("Settings"), Icons.Material.Filled.Settings, palette.DarkLighten, palette.GrayLight, Routes.SETTINGS, false); } private async Task ShowUpdateDialog() @@ -244,7 +278,7 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis { x => x.UpdateResponse, updatedResponse } }; - var dialogReference = await this.DialogService.ShowAsync("Update", dialogParameters, DialogOptions.FULLSCREEN_NO_HEADER); + var dialogReference = await this.DialogService.ShowAsync(T("Update"), dialogParameters, DialogOptions.FULLSCREEN_NO_HEADER); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; @@ -260,10 +294,10 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, IDis { var dialogParameters = new DialogParameters { - { "Message", "Are you sure you want to leave the chat page? All unsaved changes will be lost." }, + { "Message", T("Are you sure you want to leave the chat page? All unsaved changes will be lost.") }, }; - var dialogReference = await this.DialogService.ShowAsync("Leave Chat Page", dialogParameters, DialogOptions.FULLSCREEN); + var dialogReference = await this.DialogService.ShowAsync(T("Leave Chat Page"), dialogParameters, DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) { diff --git a/app/MindWork AI Studio/MetaDataAttribute.cs b/app/MindWork AI Studio/MetaDataAttribute.cs deleted file mode 100644 index 4b610eb2..00000000 --- a/app/MindWork AI Studio/MetaDataAttribute.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace AIStudio; - -[AttributeUsage(AttributeTargets.Assembly)] -public class MetaDataAttribute( - string version, - string buildTime, - uint buildNum, - string dotnetSdkVersion, - string dotnetVersion, - string rustVersion, - string mudBlazorVersion, - string tauriVersion, - string appCommitHash - ) : Attribute -{ - public string BuildTime { get; } = buildTime; - - public string Version { get; } = version; - - public uint BuildNum { get; } = buildNum; - - public string DotnetVersion { get; } = dotnetVersion; - - public string DotnetSdkVersion { get; } = dotnetSdkVersion; - - public string RustVersion { get; } = rustVersion; - - public string MudBlazorVersion { get; } = mudBlazorVersion; - - public string TauriVersion { get; } = tauriVersion; - - public string AppCommitHash { get; } = appCommitHash; -} \ No newline at end of file diff --git a/app/MindWork AI Studio/MindWork AI Studio.csproj b/app/MindWork AI Studio/MindWork AI Studio.csproj index a4fae3cb..41dd9a09 100644 --- a/app/MindWork AI Studio/MindWork AI Studio.csproj +++ b/app/MindWork AI Studio/MindWork AI Studio.csproj @@ -43,19 +43,21 @@ + - - - - - + + + + + + @@ -77,6 +79,8 @@ $([System.String]::Copy( $(Metadata) ).Split( ';' )[ 6 ]) $([System.String]::Copy( $(Metadata) ).Split( ';' )[ 7 ]) $([System.String]::Copy( $(Metadata) ).Split( ';' )[ 8 ]) + $([System.String]::Copy( $(Metadata) ).Split( ';' )[ 9 ]) + $([System.String]::Copy( $(Metadata) ).Split( ';' )[ 10 ]) true @@ -86,7 +90,7 @@ - + <_Parameter1>$(MetaVersion) <_Parameter2>$(MetaBuildTime) <_Parameter3>$(MetaBuild) @@ -98,6 +102,12 @@ <_Parameter8>$(MetaTauriVersion) <_Parameter9>$(MetaAppCommitHash) + + <_Parameter1>$(MetaArchitecture) + + + <_Parameter1>$(MetaPdfiumVersion) + diff --git a/app/MindWork AI Studio/Pages/About.razor b/app/MindWork AI Studio/Pages/About.razor index 32c8b5df..0f5329d0 100644 --- a/app/MindWork AI Studio/Pages/About.razor +++ b/app/MindWork AI Studio/Pages/About.razor @@ -1,13 +1,16 @@ @attribute [Route(Routes.ABOUT)] +@inherits MSGComponentBase
- About MindWork AI Studio + + @T("About MindWork AI Studio") + - + - The following list shows the versions of the MindWork AI Studio, the used compilers, build time, etc.: + @T("The following list shows the versions of the MindWork AI Studio, the used compilers, build time, etc.:") @@ -15,109 +18,107 @@ + + - Check for updates + @T("Check for updates") - + - Discover MindWork AI's mission and vision on our official homepage. + @T("Discover MindWork AI's mission and vision on our official homepage.") - Browse AI Studio's source code on GitHub — we welcome your contributions. + @T("Browse AI Studio's source code on GitHub — we welcome your contributions.") - Connect AI Studio to your organization's data with our External Retrieval Interface (ERI). + @T("Connect AI Studio to your organization's data with our External Retrieval Interface (ERI).") - View our project roadmap and help shape AI Studio's future development. - + @T("View our project roadmap and help shape AI Studio's future development.") + - Did you find a bug or are you experiencing issues? Report your concern here. + @T("Did you find a bug or are you experiencing issues? Report your concern here.") - Have feature ideas? Submit suggestions for future AI Studio enhancements. + @T("Have feature ideas? Submit suggestions for future AI Studio enhancements.") - + - + - Explanation + @T("Explanation") - AI Studio creates a log file at startup, in which events during startup are recorded. After startup, - another log file is created that records all events that occur during the use of the app. This - includes any errors that may occur. Depending on when an error occurs (at startup or during use), - the contents of these log files can be helpful for troubleshooting. Sensitive information such as - passwords is not included in the log files. + @T("AI Studio creates a log file at startup, in which events during startup are recorded. After startup, another log file is created that records all events that occur during the use of the app. This includes any errors that may occur. Depending on when an error occurs (at startup or during use), the contents of these log files can be helpful for troubleshooting. Sensitive information such as passwords is not included in the log files.") - By clicking on the respective path, the path is copied to the clipboard. You might open these files - with a text editor to view their contents. + @T("By clicking on the respective path, the path is copied to the clipboard. You might open these files with a text editor to view their contents.") - Startup log file + @T("Startup log file") - Usage log file + @T("Usage log file") - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/MindWork AI Studio/Pages/About.razor.cs b/app/MindWork AI Studio/Pages/About.razor.cs index 51727506..66657077 100644 --- a/app/MindWork AI Studio/Pages/About.razor.cs +++ b/app/MindWork AI Studio/Pages/About.razor.cs @@ -1,17 +1,18 @@ using System.Reflection; +using AIStudio.Components; +using AIStudio.Tools.Metadata; using AIStudio.Tools.Rust; using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; +using SharedTools; + namespace AIStudio.Pages; -public partial class About : ComponentBase +public partial class About : MSGComponentBase { - [Inject] - private MessageBus MessageBus { get; init; } = null!; - [Inject] private RustService RustService { get; init; } = null!; @@ -20,24 +21,41 @@ public partial class About : ComponentBase private static readonly Assembly ASSEMBLY = Assembly.GetExecutingAssembly(); private static readonly MetaDataAttribute META_DATA = ASSEMBLY.GetCustomAttribute()!; - - private static string VersionDotnetRuntime => $"Used .NET runtime: v{META_DATA.DotnetVersion}"; - - private static string VersionDotnetSdk => $"Used .NET SDK: v{META_DATA.DotnetSdkVersion}"; - - private static string VersionRust => $"Used Rust compiler: v{META_DATA.RustVersion}"; + private static readonly MetaDataArchitectureAttribute META_DATA_ARCH = ASSEMBLY.GetCustomAttribute()!; + private static readonly MetaDataLibrariesAttribute META_DATA_LIBRARIES = ASSEMBLY.GetCustomAttribute()!; - private static string VersionApp => $"MindWork AI Studio: v{META_DATA.Version} (commit {META_DATA.AppCommitHash}, build {META_DATA.BuildNum})"; + private string osLanguage = string.Empty; - private static string BuildTime => $"Build time: {META_DATA.BuildTime}"; + private static string VersionApp => $"MindWork AI Studio: v{META_DATA.Version} (commit {META_DATA.AppCommitHash}, build {META_DATA.BuildNum}, {META_DATA_ARCH.Architecture.ToRID().ToUserFriendlyName()})"; private static string MudBlazorVersion => $"MudBlazor: v{META_DATA.MudBlazorVersion}"; private static string TauriVersion => $"Tauri: v{META_DATA.TauriVersion}"; + + private string OSLanguage => $"{T("User-language provided by the OS")}: '{this.osLanguage}'"; + + private string VersionRust => $"{T("Used Rust compiler")}: v{META_DATA.RustVersion}"; + + private string VersionDotnetRuntime => $"{T("Used .NET runtime")}: v{META_DATA.DotnetVersion}"; + + private string VersionDotnetSdk => $"{T("Used .NET SDK")}: v{META_DATA.DotnetSdkVersion}"; + + private string BuildTime => $"{T("Build time")}: {META_DATA.BuildTime}"; + + private string VersionPdfium => $"{T("Used PDFium version")}: v{META_DATA_LIBRARIES.PdfiumVersion}"; private GetLogPathsResponse logPaths; - + #region Overrides of ComponentBase + + protected override async Task OnInitializedAsync() + { + this.osLanguage = await this.RustService.ReadUserLanguage(); + this.logPaths = await this.RustService.GetLogPaths(); + await base.OnInitializedAsync(); + } + + #endregion private async Task CopyStartupLogPath() { @@ -49,14 +67,6 @@ public partial class About : ComponentBase await this.RustService.CopyText2Clipboard(this.Snackbar, this.logPaths.LogAppPath); } - protected override async Task OnInitializedAsync() - { - this.logPaths = await this.RustService.GetLogPaths(); - await base.OnInitializedAsync(); - } - - #endregion - private const string LICENSE = """ # Functional Source License, Version 1.1, MIT Future License diff --git a/app/MindWork AI Studio/Pages/Assistants.razor b/app/MindWork AI Studio/Pages/Assistants.razor index 58c0deb1..15986375 100644 --- a/app/MindWork AI Studio/Pages/Assistants.razor +++ b/app/MindWork AI Studio/Pages/Assistants.razor @@ -1,54 +1,65 @@ @using AIStudio.Dialogs.Settings @using AIStudio.Settings.DataModel @attribute [Route(Routes.ASSISTANTS)] +@inherits MSGComponentBase
- Assistants + @T("Assistants") - General + @T("General") - - - - - + + + + + - Business + @T("Business") - - - - - - + + + + + + - Learning + @T("Learning") - + - Software Engineering + @T("Software Engineering") - + @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) { - + } - + + @if (PreviewFeatures.PRE_PLUGINS_2025.IsEnabled(this.SettingsManager)) + { + + @T("AI Studio Development") + + + + + } +
\ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Assistants.razor.cs b/app/MindWork AI Studio/Pages/Assistants.razor.cs index ef2af6db..e2c2de49 100644 --- a/app/MindWork AI Studio/Pages/Assistants.razor.cs +++ b/app/MindWork AI Studio/Pages/Assistants.razor.cs @@ -1,11 +1,5 @@ -using AIStudio.Settings; - -using Microsoft.AspNetCore.Components; +using AIStudio.Components; namespace AIStudio.Pages; -public partial class Assistants : ComponentBase -{ - [Inject] - public SettingsManager SettingsManager { get; set; } = null!; -} \ No newline at end of file +public partial class Assistants : MSGComponentBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Chat.razor b/app/MindWork AI Studio/Pages/Chat.razor index b77edf18..d2b96e94 100644 --- a/app/MindWork AI Studio/Pages/Chat.razor +++ b/app/MindWork AI Studio/Pages/Chat.razor @@ -4,16 +4,22 @@
- - @if (this.chatThread is not null && this.chatThread.WorkspaceId != Guid.Empty) - { - @($"Chat in Workspace \"{this.currentWorkspaceName}\"") - } - else - { - @("Temporary Chat") - } - + + + @if (this.chatThread is not null && this.chatThread.WorkspaceId != Guid.Empty) + { + @(T("Chat in Workspace") + $" \"{this.currentWorkspaceName}\"") + } + else + { + @T("Disappearing Chat") + } + + + + + + @if (this.AreWorkspacesVisible) @@ -25,9 +31,17 @@ // Case: Sidebar can be toggled and is currently visible - - - + + + @T("Your workspaces") + + + + + + + + @@ -38,6 +52,17 @@ { // Case: Sidebar is always visible + + + + @T("Your workspaces") + + + + + + + @@ -57,10 +82,18 @@ { // Case: Sidebar can be toggled and is currently hidden - - - - + + + + + + + @T("Your workspaces") + + + + + - + - Your workspaces + @T("Your workspaces") - + + + + + diff --git a/app/MindWork AI Studio/Pages/Chat.razor.cs b/app/MindWork AI Studio/Pages/Chat.razor.cs index 3ee7ecc9..e411a9fa 100644 --- a/app/MindWork AI Studio/Pages/Chat.razor.cs +++ b/app/MindWork AI Studio/Pages/Chat.razor.cs @@ -1,8 +1,10 @@ using AIStudio.Chat; using AIStudio.Components; +using AIStudio.Dialogs.Settings; using AIStudio.Settings.DataModel; using Microsoft.AspNetCore.Components; +using DialogOptions = AIStudio.Dialogs.DialogOptions; using Timer = System.Timers.Timer; @@ -15,6 +17,9 @@ public partial class Chat : MSGComponentBase { private const Placement TOOLBAR_TOOLTIP_PLACEMENT = Placement.Bottom; + [Inject] + private IDialogService DialogService { get; init; } = null!; + private ChatThread? chatThread; private AIStudio.Settings.Provider providerSettings; private bool workspaceOverlayVisible; @@ -80,11 +85,22 @@ public partial class Chat : MSGComponentBase this.StateHasChanged(); } + private async Task OpenChatSettingsDialog() + { + var dialogParameters = new DialogParameters(); + + await this.DialogService.ShowAsync(T("Open Chat Options"), dialogParameters, DialogOptions.FULLSCREEN); + } + + private async Task OpenWorkspacesSettingsDialog() + { + var dialogParameters = new DialogParameters(); + await this.DialogService.ShowAsync(T("Open Workspaces Configuration"), dialogParameters, DialogOptions.FULLSCREEN); + } + #region Overrides of MSGComponentBase - public override string ComponentName => nameof(Chat); - - public override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default + protected override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) { @@ -96,10 +112,5 @@ public partial class Chat : MSGComponentBase return Task.CompletedTask; } - public override Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) where TResult : default where TPayload : default - { - return Task.FromResult(default(TResult)); - } - #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Home.razor b/app/MindWork AI Studio/Pages/Home.razor index de74a626..e43e1d13 100644 --- a/app/MindWork AI Studio/Pages/Home.razor +++ b/app/MindWork AI Studio/Pages/Home.razor @@ -1,39 +1,40 @@ @attribute [Route(Routes.HOME)] +@inherits MSGComponentBase
- Let's get started + + @T("Let's get started") + - + - Welcome to MindWork AI Studio! + @T("Welcome to MindWork AI Studio!") - Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness - the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated - LLM. Instead, you will need to bring an API key from a suitable provider. + @T("Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider.") - Here's what makes MindWork AI Studio stand out: + @T("Here's what makes MindWork AI Studio stand out:") - + - We hope you enjoy using MindWork AI Studio to bring your AI projects to life! + @T("We hope you enjoy using MindWork AI Studio to bring your AI projects to life!") - + - + - + diff --git a/app/MindWork AI Studio/Pages/Home.razor.cs b/app/MindWork AI Studio/Pages/Home.razor.cs index 026fafe5..aece90c4 100644 --- a/app/MindWork AI Studio/Pages/Home.razor.cs +++ b/app/MindWork AI Studio/Pages/Home.razor.cs @@ -6,42 +6,63 @@ using Changelog = AIStudio.Components.Changelog; namespace AIStudio.Pages; -public partial class Home : ComponentBase +public partial class Home : MSGComponentBase { [Inject] - private HttpClient HttpClient { get; set; } = null!; + private HttpClient HttpClient { get; init; } = null!; private string LastChangeContent { get; set; } = string.Empty; - + + private TextItem[] itemsAdvantages = []; + #region Overrides of ComponentBase protected override async Task OnInitializedAsync() { await this.ReadLastChangeAsync(); await base.OnInitializedAsync(); + + this.InitializeAdvantagesItems(); + } + + private void InitializeAdvantagesItems() + { + this.itemsAdvantages = [ + new(this.T("Free of charge"), this.T("The app is free to use, both for personal and commercial purposes.")), + new(this.T("Independence"), this.T("You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT4o, o1, etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), Hugging Face, and self-hosted models using llama.cpp, ollama, LM Studio, Groq, or Fireworks. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities.")), + new(this.T("Assistants"), this.T("You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants.")), + new(this.T("Unrestricted usage"), this.T("Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API.")), + new(this.T("Cost-effective"), this.T("You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit.")), + new(this.T("Privacy"), this.T("You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems.")), + new(this.T("Flexibility"), this.T("Choose the provider and model best suited for your current task.")), + new(this.T("No bloatware"), this.T("The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life.")), + ]; } #endregion - + + #region Overrides of MSGComponentBase + + protected override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default + { + switch (triggeredEvent) + { + case Event.PLUGINS_RELOADED: + this.InitializeAdvantagesItems(); + await this.InvokeAsync(this.StateHasChanged); + break; + } + } + + #endregion + private async Task ReadLastChangeAsync() { var latest = Changelog.LOGS.MaxBy(n => n.Build); using var response = await this.HttpClient.GetAsync($"changelog/{latest.Filename}"); this.LastChangeContent = await response.Content.ReadAsStringAsync(); } - - private static readonly TextItem[] ITEMS_ADVANTAGES = - [ - new("Free of charge", "The app is free to use, both for personal and commercial purposes."), - new("Independence", "You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT4o, o1, etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, and self-hosted models using llama.cpp, ollama, LM Studio, Groq, or Fireworks. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities."), - new("Assistants", "You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants."), - new("Unrestricted usage", "Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API."), - new("Cost-effective", "You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit."), - new("Privacy", "You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems."), - new("Flexibility", "Choose the provider and model best suited for your current task."), - new("No bloatware", "The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life."), - ]; - + private const string QUICK_START_GUIDE = """ Ready to dive in and get started with MindWork AI Studio? This quick start guide will help you set up everything you need to start using the app. diff --git a/app/MindWork AI Studio/Pages/Plugins.razor b/app/MindWork AI Studio/Pages/Plugins.razor index 6d5bf8ce..0db15706 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor +++ b/app/MindWork AI Studio/Pages/Plugins.razor @@ -1,9 +1,10 @@ @using AIStudio.Tools.PluginSystem +@inherits MSGComponentBase @attribute [Route(Routes.PLUGINS)]
- Plugins + @T("Plugins") @@ -17,8 +18,8 @@ - Plugins - Actions + @T("Plugins") + @T("Actions") @@ -26,19 +27,19 @@ { case GROUP_ENABLED: - Enabled Plugins + @T("Enabled Plugins") break; case GROUP_DISABLED: - Disabled Plugins + @T("Disabled Plugins") break; case GROUP_INTERNAL: - Internal Plugins + @T("Internal Plugins") break; } @@ -66,7 +67,7 @@ @if (!context.IsInternal) { var isEnabled = this.SettingsManager.IsPluginEnabled(context); - + } diff --git a/app/MindWork AI Studio/Pages/Plugins.razor.cs b/app/MindWork AI Studio/Pages/Plugins.razor.cs index 9504c0ff..4eb6078c 100644 --- a/app/MindWork AI Studio/Pages/Plugins.razor.cs +++ b/app/MindWork AI Studio/Pages/Plugins.razor.cs @@ -1,30 +1,23 @@ -using AIStudio.Settings; +using AIStudio.Components; using AIStudio.Tools.PluginSystem; using Microsoft.AspNetCore.Components; namespace AIStudio.Pages; -public partial class Plugins : ComponentBase, IMessageBusReceiver +public partial class Plugins : MSGComponentBase { private const string GROUP_ENABLED = "Enabled"; private const string GROUP_DISABLED = "Disabled"; private const string GROUP_INTERNAL = "Internal"; - [Inject] - private MessageBus MessageBus { get; init; } = null!; - - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - private TableGroupDefinition groupConfig = null!; #region Overrides of ComponentBase protected override async Task OnInitializedAsync() { - this.MessageBus.RegisterComponent(this); - this.MessageBus.ApplyFilters(this, [], [ Event.PLUGINS_RELOADED ]); + this.ApplyFilters([], [ Event.PLUGINS_RELOADED ]); this.groupConfig = new TableGroupDefinition { @@ -45,7 +38,7 @@ public partial class Plugins : ComponentBase, IMessageBusReceiver } #endregion - + private async Task PluginActivationStateChanged(IPluginMetadata pluginMeta) { if (this.SettingsManager.IsPluginEnabled(pluginMeta)) @@ -56,26 +49,17 @@ public partial class Plugins : ComponentBase, IMessageBusReceiver await this.SettingsManager.StoreSettings(); await this.MessageBus.SendMessage(this, Event.CONFIGURATION_CHANGED); } - - #region Implementation of IMessageBusReceiver - public string ComponentName => nameof(Plugins); - - public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) + #region Overrides of MSGComponentBase + + protected override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) { case Event.PLUGINS_RELOADED: - this.InvokeAsync(this.StateHasChanged); + await this.InvokeAsync(this.StateHasChanged); break; } - - return Task.CompletedTask; - } - - public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) - { - return Task.FromResult(default); } #endregion diff --git a/app/MindWork AI Studio/Pages/Settings.razor b/app/MindWork AI Studio/Pages/Settings.razor index c048a542..da1f837d 100644 --- a/app/MindWork AI Studio/Pages/Settings.razor +++ b/app/MindWork AI Studio/Pages/Settings.razor @@ -1,9 +1,10 @@ -@attribute [Route(Routes.SETTINGS)] @using AIStudio.Components.Settings @using AIStudio.Settings.DataModel +@attribute [Route(Routes.SETTINGS)] +@inherits MSGComponentBase
- Settings + @T("Settings") @@ -14,10 +15,7 @@ } - - - @if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager)) { diff --git a/app/MindWork AI Studio/Pages/Settings.razor.cs b/app/MindWork AI Studio/Pages/Settings.razor.cs index 57c34c5a..89c7338b 100644 --- a/app/MindWork AI Studio/Pages/Settings.razor.cs +++ b/app/MindWork AI Studio/Pages/Settings.razor.cs @@ -1,17 +1,12 @@ +using AIStudio.Components; using AIStudio.Settings; using Microsoft.AspNetCore.Components; namespace AIStudio.Pages; -public partial class Settings : ComponentBase, IMessageBusReceiver, IDisposable +public partial class Settings : MSGComponentBase { - [Inject] - private SettingsManager SettingsManager { get; init; } = null!; - - [Inject] - private MessageBus MessageBus { get; init; } = null!; - private List> availableLLMProviders = new(); private List> availableEmbeddingProviders = new(); @@ -19,20 +14,16 @@ public partial class Settings : ComponentBase, IMessageBusReceiver, IDisposable protected override async Task OnInitializedAsync() { - // Register this component with the message bus: - this.MessageBus.RegisterComponent(this); - this.MessageBus.ApplyFilters(this, [], [ Event.CONFIGURATION_CHANGED ]); + this.ApplyFilters([], [ Event.CONFIGURATION_CHANGED ]); await base.OnInitializedAsync(); } #endregion - - #region Implementation of IMessageBusReceiver - public string ComponentName => nameof(Settings); + #region Overrides of MSGComponentBase - public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, TMsg? data) + protected override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default { switch (triggeredEvent) { @@ -40,23 +31,9 @@ public partial class Settings : ComponentBase, IMessageBusReceiver, IDisposable this.StateHasChanged(); break; } - + return Task.CompletedTask; } - public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) - { - return Task.FromResult(default); - } - - #endregion - - #region Implementation of IDisposable - - public void Dispose() - { - this.MessageBus.Unregister(this); - } - #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Supporters.razor b/app/MindWork AI Studio/Pages/Supporters.razor index cffedf7d..5eb7963e 100644 --- a/app/MindWork AI Studio/Pages/Supporters.razor +++ b/app/MindWork AI Studio/Pages/Supporters.razor @@ -1,22 +1,32 @@ @attribute [Route(Routes.SUPPORTERS)] +@inherits MSGComponentBase
- Supporters + + @T("Supporters") + - +
- Our Titans - - In this section, we highlight the titan supporters of MindWork AI Studio. Titans are prestigious companies that provide significant support to our mission. + + @T("Our Titans") - For companies, sponsoring MindWork AI Studio is not only a way to support innovation but also a valuable opportunity for public relations and marketing. Your company's name and logo will be featured prominently, showcasing your commitment to using cutting-edge AI tools and enhancing your reputation as an innovative enterprise. + @T("In this section, we highlight the titan supporters of MindWork AI Studio. Titans are prestigious companies that provide significant support to our mission.") + + @T("For companies, sponsoring MindWork AI Studio is not only a way to support innovation but also a valuable opportunity for public relations and marketing. Your company's name and logo will be featured prominently, showcasing your commitment to using cutting-edge AI tools and enhancing your reputation as an innovative enterprise.") + + + + + + - Become our first Titan + @T("Become one of our titans")
@@ -25,27 +35,27 @@ - Individual Contributors + @T("Individual Contributors") - Become a contributor + @T("Become a contributor") - The first 10 supporters who make a monthly contribution: + @T("The first 10 supporters who make a monthly contribution:") - - - + + + - The first 10 supporters who make a one-time contribution: + @T("The first 10 supporters who make a one-time contribution:") - + @@ -54,32 +64,32 @@ - Business Contributors + @T("Business Contributors") - Become a contributor + @T("Become a contributor")
- + - Code Contributions + @T("Code Contributions") - - - - + + + + @@ -88,11 +98,11 @@ - Moderation, Design, Wiki, and Documentation + @T("Moderation, Design, Wiki, and Documentation") - + diff --git a/app/MindWork AI Studio/Pages/Supporters.razor.cs b/app/MindWork AI Studio/Pages/Supporters.razor.cs index 45065ad9..bb82da0b 100644 --- a/app/MindWork AI Studio/Pages/Supporters.razor.cs +++ b/app/MindWork AI Studio/Pages/Supporters.razor.cs @@ -1,7 +1,5 @@ -using Microsoft.AspNetCore.Components; +using AIStudio.Components; namespace AIStudio.Pages; -public partial class Supporters : ComponentBase -{ -} \ No newline at end of file +public partial class Supporters : MSGComponentBase; \ No newline at end of file diff --git a/app/MindWork AI Studio/Pages/Writer.razor b/app/MindWork AI Studio/Pages/Writer.razor index 790e3e07..bead1792 100644 --- a/app/MindWork AI Studio/Pages/Writer.razor +++ b/app/MindWork AI Studio/Pages/Writer.razor @@ -3,7 +3,7 @@
- Writer + @T("Writer") @@ -13,7 +13,7 @@ Logger { get; init; } = null!; @@ -24,12 +24,11 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable private string userInput = string.Empty; private string userDirection = string.Empty; private string suggestion = string.Empty; - + #region Overrides of ComponentBase protected override async Task OnInitializedAsync() { - this.ApplyFilters([], []); this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES); this.typeTimer.Elapsed += async (_, _) => await this.InvokeAsync(this.GetSuggestions); this.typeTimer.AutoReset = false; @@ -39,22 +38,6 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable #endregion - #region Overrides of MSGComponentBase - - public override string ComponentName => nameof(Writer); - - public override Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default - { - return Task.CompletedTask; - } - - public override Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data) where TResult : default where TPayload : default - { - return Task.FromResult(default(TResult)); - } - - #endregion - private bool IsProviderSelected => this.providerSettings.UsedLLMProvider != LLMProviders.NONE; private async Task InputKeyEvent(KeyboardEventArgs keyEvent) @@ -169,13 +152,4 @@ public partial class Writer : MSGComponentBase, IAsyncDisposable this.suggestion = string.Join(' ', words.Skip(1)); this.StateHasChanged(); } - - #region Implementation of IAsyncDisposable - - public ValueTask DisposeAsync() - { - return ValueTask.CompletedTask; - } - - #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/contentHome.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/contentHome.lua deleted file mode 100644 index f26d9aff..00000000 --- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/contentHome.lua +++ /dev/null @@ -1,3 +0,0 @@ -CONTENT_HOME = { - LetsGetStarted = "Lass uns anfangen", -} \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua index 634c8e74..27a02a78 100644 --- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua @@ -1,4 +1,3 @@ -require("contentHome") require("icon") -- The ID for this plugin: @@ -44,6 +43,5338 @@ DEPRECATION_MESSAGE = "" -- code followed by the ISO 3166-1 country code: IETF_TAG = "de-DE" -UI_TEXT_CONTENT = { - HOME = CONTENT_HOME, -} +-- The language name in the user's language: +LANG_NAME = "Deutsch (Deutschland)" + +UI_TEXT_CONTENT = {} + +-- Objective +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1121586136"] = "Ziel" + +-- Describe the topic of the meeting, seminar, etc. Is it about quantum computing, software engineering, or is it a general business meeting? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T12079368"] = "Beschreiben Sie das Thema des Treffens, Seminars usw. Geht es um Quantencomputing, Softwareentwicklung oder handelt es sich um ein allgemeines Geschäftstreffen?" + +-- Should there be a social activity? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1222794463"] = "Sollte es eine soziale Aktivität geben?" + +-- Is this a virtual event, e.g., a call or webinar? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T123591568"] = "Handelt es sich um eine virtuelle Veranstaltung, z. B. einen Anruf oder ein Webinar?" + +-- Active participation, like world café, discussions, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1276489759"] = "Aktive Teilnahme, wie zum Beispiel World Café, Diskussionen usw." + +-- Project meeting +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1307971935"] = "Projektbesprechung" + +-- Who will moderate the meeting, seminar, etc.? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1328622016"] = "Wer wird das Meeting, Seminar usw. moderieren?" + +-- Passive participation, like presentations, lectures, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1331274154"] = "Passive Teilnahme, wie Präsentationen, Vorlesungen usw." + +-- Please provide a moderator for the meeting or the seminar. Who will lead the discussion? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1345848634"] = "Bitte stellen Sie einen Moderator für das Meeting oder Seminar zur Verfügung. Wer wird die Diskussion leiten?" + +-- Please start each line of your content list with a dash (-) to create a bullet point list. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1384718254"] = "Bitte beginnen Sie jede Zeile ihrer Inhaltsliste mit einem Strich (-), um eine Aufzählungsliste zu erstellen." + +-- Describe the objective(s) of the meeting, seminar, etc. What should be achieved? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T142537978"] = "Beschreiben Sie das Ziel bzw. die Ziele des Treffens, Seminars usw. Was soll erreicht werden?" + +-- Location +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1539345862"] = "Standort" + +-- Meeting Name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1581597965"] = "Besprechungsname" + +-- Topic +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1750080356"] = "Thema" + +-- Please provide a location for the meeting or the seminar. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1812212200"] = "Bitte geben Sie einen Ort für das Meeting oder Seminar an." + +-- Content list +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1823782898"] = "Inhaltsverzeichnis" + +-- Please provide a topic for the agenda. What is the meeting or the seminar about? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1862110661"] = "Bitte geben Sie ein Thema für die Tagesordnung an. Worum geht es in dem Meeting oder Seminar?" + +-- Create Agenda +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1974034983"] = "Agenda erstellen" + +-- Number of participants +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2155351093"] = "Anzahl der Teilnehmer" + +-- Please provide an objective for the meeting or the seminar. What do you want to achieve? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2162394691"] = "Bitte geben Sie ein Ziel für das Meeting oder Seminar an. Was möchten Sie erreichen?" + +-- Discuss the current project status and plan the next steps. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2213481631"] = "Besprechen Sie den aktuellen Projektstatus und planen Sie die nächsten Schritte." + +-- Please provide a start time for the meeting or the seminar. When the meeting is a multi-day event, specify the start time for each day, e.g. '9:00 AM, 10:00 AM', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2231343846"] = "Bitte geben Sie eine Startzeit für das Meeting oder Seminar an. Wenn es sich um eine mehrtägige Veranstaltung handelt, nennen Sie bitte die Startzeit für jeden Tag, z. B. „9:00 Uhr, 10:00 Uhr“ usw." + +-- Please provide some content for the agenda. What are the main points of the meeting or the seminar? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2263830489"] = "Bitte geben Sie Inhalte für die Agenda an. Was sind die wichtigsten Punkte des Treffens oder Seminars?" + +-- Name the meeting, seminar, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2295548803"] = "Benennen Sie das Meeting, Seminar usw." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T237828418"] = "Zielsprache" + +-- 9:00 AM +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2380198832"] = "9:00 Uhr" + +-- Agenda Planner +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2435638853"] = "Agenda-Assistent" + +-- When will the meeting, seminar, etc. start? E.g., '9:00 AM', or '9:00 AM (CET)', etc. When the meeting is a multi-day event, specify the start time for each day. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2446959989"] = "Wann beginnt das Meeting, Seminar usw.? Zum Beispiel: „9:00 Uhr“ oder „9:00 Uhr (MEZ)“ usw. Wenn das Meeting eine mehrtägige Veranstaltung ist, geben Sie bitte die Startzeit für jeden Tag an." + +-- Do the participants need to get to know each other first? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2463643444"] = "Müssen sich die Teilnehmer zuerst kennenlernen?" + +-- How long will the meeting, seminar, etc. last? E.g., '2 hours', or '2 days (first day 8 hours, then 4 hours)', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2545969476"] = "Wie lange dauert das Meeting, Seminar usw.? Zum Beispiel: „2 Stunden“ oder „2 Tage (erster Tag 8 Stunden, dann 4 Stunden)“ usw." + +-- No, there should be no social activity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2563466975"] = "Nein, es sollte keine sozialen Aktivitäten geben." + +-- (Optional) What topics should only be briefly addressed? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2604490939"] = "(Optional) Welche Themen sollten nur kurz angesprochen werden?" + +-- Weekly jour fixe +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2610771512"] = "Wöchentlicher Jour fixe" + +-- Hamburg, Germany +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2771142216"] = "Hamburg, Deutschland" + +-- Please select the number of participants. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T279660796"] = "Bitte wählen Sie die Anzahl der Teilnehmer aus." + +-- Moderator +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T283265988"] = "Moderator" + +-- Bullet list the content of the meeting, seminar, etc. roughly. Use dashes (-) to separate the items. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2882624953"] = "Fassen Sie den Inhalt des Treffens, Seminars usw. stichpunktartig zusammen. Verwenden Sie Bindestriche (-), um die einzelnen Punkte zu trennen." + +-- No, this is a physical event +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2903581470"] = "Nein, das ist eine Präsenzveranstaltung." + +-- minutes +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2914829806"] = "Minuten" + +-- (Optional) List the persons who will present at the meeting, seminar, etc. Use dashes (-) to separate the items. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3037376304"] = "(Optional) Listen Sie die Personen auf, die beim Meeting, Seminar usw. präsentieren werden. Trennen Sie die einzelnen Einträge mit Bindestrichen (-)." + +-- (Optional) Who is presenting? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3063488920"] = "(Optional) Wer präsentiert?" + +-- Yes, introduce participants +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3277432669"] = "Ja, Teilnehmer vorstellen" + +-- (Optional) What topics should be the focus? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3292480692"] = "(Optional) Auf welche Themen sollte der Fokus liegen?" + +-- Approx. duration of the coffee or tea breaks +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3310841480"] = "Ungefähre Dauer der Kaffee- oder Teepausen" + +-- Please provide a duration for the meeting or the seminar, e.g. '2 hours', or '2 days (8 hours and 4 hours)', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3535835316"] = "Bitte geben Sie eine Dauer für das Meeting oder Seminar an, z. B. „2 Stunden“ oder „2 Tage (8 Stunden und 4 Stunden)“ usw." + +-- Duration +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3569830189"] = "Dauer" + +-- 2 hours +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3689752318"] = "2 Stunden" + +-- No, participants do not need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3704775613"] = "Nein, die Teilnehmer müssen nicht anreisen oder abreisen." + +-- Please provide a name for the meeting or the seminar. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3717566228"] = "Bitte geben Sie einen Namen für das Meeting oder Seminar an." + +-- No, participants know each other +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3771122854"] = "Nein, die Teilnehmer kennen sich untereinander." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3848935911"] = "Benutzerdefinierte Zielsprache" + +-- Yes, there should be a social activity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3973813377"] = "Ja, es sollte eine soziale Aktivität geben." + +-- Yes, there should be a joint dinner +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4001248011"] = "Ja, es sollte ein gemeinsames Abendessen geben." + +-- No, there should be no joint dinner +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4150931417"] = "Nein, es sollte kein gemeinsames Abendessen geben." + +-- Where will the meeting, seminar, etc. take place? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4155424204"] = "Wo findet das Treffen, Seminar usw. statt?" + +-- Please select a target language for the agenda. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4163183653"] = "Bitte wählen Sie eine Zielsprache für die Agenda aus." + +-- This agenda planner helps you create a structured agenda for your meeting or seminar. Just provide some basic information about the event, and the assistant will generate an agenda for you. You can also specify the duration, the start time, the location, the target language, and other details. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4178438053"] = "Dieser Agenda-Assistent hilft Ihnen, eine strukturierte Tagesordnung für Ihr Meeting oder Seminar zu erstellen. Geben Sie einfach einige grundlegende Informationen zur Veranstaltung an, und der Assistent erstellt eine Agenda für Sie. Sie können außerdem die Dauer, die Startzeit, den Ort, die Zielsprache und weitere Details festlegen." + +-- Yes, participants need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4266648123"] = "Ja, die Teilnehmenden müssen anreisen und abreisen." + +-- Should there be a joint dinner? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T553265703"] = "Soll es ein gemeinsames Abendessen geben?" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T656744944"] = "Bitte wählen Sie eine benutzerdefinierte Sprache aus." + +-- Should the participants be involved passively or actively? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T749354834"] = "Sollten die Teilnehmer passiv oder aktiv eingebunden werden?" + +-- Yes, this is a virtual event +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T829874736"] = "Ja, dies ist eine virtuelle Veranstaltung." + +-- Approx. duration of the lunch break +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T92038124"] = "Ca. Dauer der Mittagspause" + +-- Do participants need to arrive and depart? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T945792620"] = "Müssen die Teilnehmenden anreisen und abreisen?" + +-- 13 - 20 (multiple small groups) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1248612832"] = "13 – 20 (mehrere kleine Gruppen)" + +-- 101 - 200 (conference) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1576140451"] = "101 - 200 (Konferenz)" + +-- Please select how many participants are expected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1761209658"] = "Bitte wählen Sie aus, wie viele Teilnehmende erwartet werden" + +-- 31 - 100 (symposium) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1884554098"] = "31 - 100 (Symposium)" + +-- 21 - 30 (multiple large groups) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T2544279674"] = "21 - 30 (mehrere große Gruppen)" + +-- 6 - 12 (large group) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T3462231762"] = "6 - 12 (große Gruppe)" + +-- 201 - 1,000 (congress) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T3871655179"] = "201 - 1.000 (Kongress)" + +-- 2 (peer to peer) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T4200229473"] = "2 (Peer-to-Peer)" + +-- 3 - 5 (small group) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T568372961"] = "3–5 (kleine Gruppe)" + +-- 1,000+ (large event) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T812476179"] = "1.000+ (Großveranstaltung)" + +-- Stop generation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T1317408357"] = "Generierung stoppen" + +-- Reset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T180921696"] = "Zurücksetzen" + +-- Please select a provider. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T1809312323"] = "Bitte wählen Sie einen Anbieter aus." + +-- Assistant - {0} +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T3043922"] = "Assistent – {0}" + +-- Send to ... +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T4242312602"] = "Senden an ..." + +-- Copy result +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T83711157"] = "Ergebnis kopieren" + +-- Extended bias poster +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T1241605514"] = "Erweitertes Bias-Poster" + +-- Please select a target language for the bias. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T1380819730"] = "Bitte wählen Sie eine Zielsprache für die Voreingenommenheit aus." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T237828418"] = "Zielsprache" + +-- Blog post of Buster Benson: +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T2524573984"] = "Blogbeitrag von Buster Benson:" + +-- Wikipedia list of cognitive biases +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3097054642"] = "Wikipedia-Liste kognitiver Verzerrungen" + +-- Show me the bias of the day +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3489946962"] = "Zeig mir das Vorurteil des Tages" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3848935911"] = "Benutzerdefinierte Zielsprache" + +-- Learn about a different cognitive bias every day. You can also ask the LLM your questions. The idea behind "Bias of the Day" is based on work by Buster Benson, John Manoogian III, and Brian Rene Morrissette. Buster Benson grouped the biases, and the original texts come from Wikipedia. Brian Rene Morrissette condensed them into a shorter version. Finally, John Manoogian III created the original poster based on Benson's work and Morrissette's texts. Thorsten Sommer compared all texts for integration into AI Studio with the current Wikipedia versions, updated them, and added source references. The idea of learning about one bias each day based on John's poster comes from Drew Nelson. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3882885376"] = "Lerne jeden Tag einen neuen kognitiven Bias kennen. Sie können dem LLM auch eigenen Fragen stellen. Die Idee hinter „Bias des Tages” basiert auf der Arbeit von Buster Benson, John Manoogian III und Brian Rene Morrissette. Buster Benson hat die Biases gruppiert, und die Originaltexte stammen aus der Wikipedia. Brian Rene Morrissette hat sie in einer kürzeren Version zusammengefasst. Schließlich hat John Manoogian III auf Grundlage von Bensons Arbeit und den Texten von Morrissette das Original-Poster erstellt. Thorsten Sommer hat alle Texte für die Integration in AI Studio mit den aktuellen Wikipedia-Versionen verglichen, sie aktualisiert und Quellenangaben hinzugefügt. Die Idee, jeden Tag einen Bias anhand von Johns Poster kennenzulernen, stammt von Drew Nelson." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T656744944"] = "Bitte geben Sie eine benutzerdefinierte Sprache an." + +-- Bias of the Day +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T782102948"] = "Vorurteil des Tages" + +-- Coding Assistant +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T1082499335"] = "Assistent zum Programmieren" + +-- Yes, provide compiler messages +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T1267219550"] = "Ja, Kompilermeldungen bereitstellen" + +-- Compiler messages +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T2339992872"] = "Kompilermeldungen" + +-- Do you want to provide compiler messages? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T2479378307"] = "Möchten Sie Kompilermeldungen bereitstellen?" + +-- Get Support +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T2694436440"] = "Support erhalten" + +-- Context {0} +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T3205224990"] = "Kontext {0}" + +-- Delete context +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T3491455017"] = "Kontext löschen" + +-- Your question(s) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T3576319998"] = "Ihre Frage(n)" + +-- Please provide your questions. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T4120171174"] = "Bitte stellen Sie Ihre Fragen." + +-- No, there are no compiler messages +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T412437274"] = "Nein, es gibt keine Kompilermeldungen" + +-- Please provide the compiler messages. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T4225294332"] = "Bitte geben Sie die Kompilermeldungen an." + +-- This coding assistant supports you in writing code. Provide some coding context by pasting your code into the input fields. You might assign an ID to your code snippet to easily reference it later. When you have compiler messages, you can paste them into the input fields to get help with debugging as well. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T566604388"] = "Dieser Assistent zum Programmieren unterstützt Sie beim Schreiben von Code. Geben Sie den Programmierkontext an, indem Sie Ihren Code in die Eingabefelder einfügen. Sie können Ihrem Code eine ID zuweisen, um später leichter auf diesen verweisen zu können. Wenn Sie Kompilermeldungen erhalten haben, können Sie diese ebenfalls einfügen, um Unterstützung beim Debuggen zu erhalten." + +-- Add context +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T882607103"] = "Kontext hinzufügen" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T2591284123"] = "Sprache" + +-- Your code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3144719651"] = "Ihr Code" + +-- {0}: Please provide your input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3160504659"] = "{0}: Bitte geben Sie Ihren Inhalt ein." + +-- (Optional) Identifier +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3208138853"] = "(Optional) Kennung bzw. ID" + +-- Other language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3374524465"] = "Andere Sprache" + +-- Please specify the language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3406207295"] = "Bitte geben Sie die Sprache an." + +-- Other +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::COMMONCODINGLANGUAGEEXTENSIONS::T1849229205"] = "Andere" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::COMMONCODINGLANGUAGEEXTENSIONS::T3424652889"] = "Unbekannt" + +-- None +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::COMMONCODINGLANGUAGEEXTENSIONS::T810547195"] = "Keine" + +-- Provide a list of bullet points and some basic information for an e-mail. The assistant will generate an e-mail based on that input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T1143222914"] = "Geben Sie eine Liste von Stichpunkten sowie einige Basisinformationen für eine E-Mail ein. Der Assistent erstellt anschließend eine E-Mail auf Grundlage ihrer Angaben." + +-- Your name for the closing salutation of your e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T134060413"] = "Ihr Name für die Grußformel am Ende ihrer E-Mail." + +-- Please start each line of your content list with a dash (-) to create a bullet point list. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T1384718254"] = "Bitte beginnen Sie jede Zeile der Inhaltsliste mit einem Bindestrich (-), um eine Aufzählung zu erstellen." + +-- Create email +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T1686330485"] = "E-Mail erstellen" + +-- Previous conversation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2074063439"] = "Frühere Unterhaltung" + +-- Select the writing style +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2241531659"] = "Schreibstil auswählen" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T237828418"] = "Zielsprache" + +-- Please provide some content for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2381517938"] = "Bitte geben Sie einen Text für die E-Mail ein." + +-- Please provide some history for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2471325767"] = "Bitte geben Sie einen Verlauf für die E-Mail an." + +-- Your bullet points +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2582330385"] = "Ihre Stichpunkte" + +-- Yes, I provide the previous conversation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2652980489"] = "Ja, ich stelle den bisherigen Mail-Verlauf zur Verfügung." + +-- Please select a writing style for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2969942806"] = "Bitte wählen Sie einen Schreibstil für die E-Mail aus." + +-- E-Mail +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3026443472"] = "E-Mail" + +-- (Optional) The greeting phrase to use +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T306513209"] = "(Optional) Die zu verwendende Begrüßung" + +-- Bullet list the content of the e-mail roughly. Use dashes (-) to separate the items. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3259604530"] = "Fasse den Inhalt der E-Mail stichpunktartig zusammen. Verwende dafür Striche (-), um die Punkte zu trennen." + +-- Is there a history, a previous conversation? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3438127996"] = "Gibt es einen Verlauf, ein vorheriges Gespräch?" + +-- Provide the previous conversation, e.g., the last e-mail, the last chat, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3706154604"] = "Stellen Sie die vorherige Unterhaltung bereit, z. B. die letzte E-Mail, den letzten Chat usw." + +-- No, I don't provide a previous conversation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3823693145"] = "Nein, ich stelle keinen Mail-Verlauf zur Verfügung." + +-- (Optional) Are any of your points particularly important? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3843104162"] = "(Optional) Sind einige ihrer Punkte besonders wichtig?" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3848935911"] = "Benutzerdefinierte Zielsprache" + +-- (Optional) Your name for the closing salutation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T453962275"] = "(Optional) Ihr Name für die abschließende Grußformel" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T656744944"] = "Bitte wählen Sie eine benutzerdefinierte Sprache aus." + +-- Dear Colleagues +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T759263763"] = "Liebe Kolleginnen und Kollegen" + +-- Please select a target language for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T891073054"] = "Bitte wählen Sie eine Zielsprache für die E-Mail aus." + +-- Personal +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T1851428013"] = "Persönlich" + +-- Academic +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T2055733914"] = "Akademisch" + +-- Business informal +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T4031465193"] = "Geschäftlich informell" + +-- Business formal +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T477550214"] = "Geschäftlich formell" + +-- Not specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T641241064"] = "Nicht angegeben" + +-- Self-hosted LLM providers are allowed: users cannot choose any cloud-based provider +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T1196461290"] = "Selbst gehostete LLM-Anbieter sind erlaubt: Nutzer können keinen Cloud-basierten Anbieter auswählen" + +-- Please select what kind of LLM provider are allowed for this data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T1641796568"] = "Bitte wählen Sie aus, welche Art von LLM-Anbieter für diese Datenquelle zulässig ist." + +-- Any LLM provider is allowed: users might choose a cloud-based or a self-hosted provider +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T3264558650"] = "Jeder LLM-Anbieter ist erlaubt: Nutzer können einen Cloud-basierten oder einen selbst gehosteten Anbieter wählen." + +-- Unknown option was selected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T4096790096"] = "Eine unbekannte Option wurde ausgewählt" + +-- Please describe at least one retrieval process. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1035068989"] = "Bitte beschreiben Sie mindestens einen Abrufprozess." + +-- Please select which types of LLMs users are allowed to use with the data from this ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1047631678"] = "Bitte wählen Sie aus, welche Typen von LLMs mit den Daten dieses ERI-Servers verwendet werden dürfen." + +-- No, I will enter everything again or configure it manually in the settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1051078592"] = "Nein, ich werde alles erneut eingeben oder es manuell in den Einstellungen konfigurieren" + +-- ERI server name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1104420863"] = "ERI-Servername" + +-- The embedding '{0}' is used in one or more retrieval processes. Are you sure you want to delete it? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1125425983"] = "Die Einbettung „{0}“ wird in einem oder mehreren Abrufprozessen verwendet. Sind Sie sicher, dass Sie sie löschen möchten?" + +-- The port of the data source must be between 1 and 65535. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1201129536"] = "Der Port der Datenquelle muss zwischen 1 und 65535 liegen." + +-- AI Studio can save the generated code to the file system. You can select a base folder for this. AI Studio ensures that no files are created outside of this base folder. Furthermore, we recommend that you create a Git repository in this folder. This way, you can see what changes the AI has made in which files. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T121294173"] = "AI Studio kann den generierten Code im Dateisystem speichern. Sie können dafür einen Basisordner auswählen. AI Studio stellt sicher, dass keine Dateien außerhalb dieses Basisordners erstellt werden. Außerdem empfehlen wir, in diesem Ordner ein Git-Repository anzulegen. So können Sie nachvollziehen, welche Änderungen die KI in welchen Dateien vorgenommen hat." + +-- Here you have the option to save different configurations for various ERI servers and switch between them. This is useful if you are responsible for multiple ERI servers. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1244355152"] = "Hier haben Sie die Möglichkeit, verschiedene Konfigurationen für unterschiedliche ERI-Server zu speichern und zwischen ihnen zu wechseln. Das ist nützlich, wenn Sie für mehrere ERI-Server verantwortlich sind." + +-- Please provide a name for your ERI server. This name will be used to identify the server in AI Studio. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1261836894"] = "Bitte geben Sie einen Namen für Ihren ERI-Server an. Dieser Name wird verwendet, um den Server in AI Studio zu identifizieren." + +-- You have not yet added any ERI server presets. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1267931972"] = "Sie haben bislang keine ERI-Server-Voreinstellung hinzugefügt." + +-- Warning: Ports below 1024 are reserved for system services. Your ERI server need to run with elevated permissions (root user). +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1287629674"] = "Warnung: Ports unter 1024 sind für Systemdienste reserviert. Ihr ERI-Server muss mit erhöhten Rechten (als Root-Benutzer) ausgeführt werden." + +-- The task of writing the ERI server for you is very complex. Therefore, a very powerful LLM is needed to successfully accomplish this task. Small local models will probably not be sufficient. Instead, try using a large cloud-based or a large self-hosted model. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1302705248"] = "Die Aufgabe, den ERI-Server für Sie zu schreiben, ist sehr komplex. Daher wird ein sehr leistungsfähiges LLM benötigt, um diese Aufgabe erfolgreich zu bewältigen. Kleine lokale Modelle werden dafür wahrscheinlich nicht ausreichen. Versuchen Sie stattdessen, ein großes Cloud-basiertes oder ein großes selbst gehostetes Modell zu verwenden." + +-- Please give your ERI server a name that provides information about the data source and/or its intended purpose. The name will be displayed to users in AI Studio. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1312468048"] = "Bitte geben Sie Ihrem ERI-Server einen Namen, der Aufschluss über die Datenquelle und/oder den vorgesehenen Zweck gibt. Der Name wird den Nutzern in AI Studio angezeigt." + +-- Please describe how the selected authentication methods should be used. Especially, explain for what data the NONE method (public access) is used. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1365243213"] = "Bitte beschreiben Sie, wie die ausgewählten Authentifizierungsmethoden verwendet werden sollen. Erklären Sie dabei insbesondere, für welche Daten die Methode KEINE (öffentlicher Zugriff) genutzt wird." + +-- No embedding methods configured yet. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1391635161"] = "Noch keine Einbettungsmethoden konfiguriert." + +-- Edit Retrieval Process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1423501360"] = "Abrufprozess bearbeiten" + +-- Please select the operating system on which the ERI server will run. This is necessary when using SSO with Kerberos. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1456749976"] = "Bitte wählen Sie das Betriebssystem aus, auf dem der ERI-Server laufen wird. Dies ist erforderlich, wenn SSO mit Kerberos verwendet wird." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1469573738"] = "Löschen" + +-- Related links: +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1565111217"] = "Relevante Links:" + +-- Please select an ERI specification version for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1612890554"] = "Bitte wählen Sie eine Version der ERI-Spezifikation für den ERI-Server aus." + +-- Write code to file system +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1717303021"] = "Code in das Dateisystem schreiben" + +-- Hint: to allow this assistant to automatically save your changes, you must enable the preselection of values in the settings. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1729922656"] = "Hinweis: Damit dieser Assistent Ihre Änderungen automatisch speichern kann, müssen Sie in den Einstellungen die Vorauswahl von Optionen aktivieren." + +-- You have selected {0} authentication methods +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1755088321"] = "Sie haben {0} Authentifizierungsmethoden ausgewählt" + +-- Select the target directory for the ERI server +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T175742733"] = "Wählen Sie das Zielverzeichnis für den ERI-Server aus" + +-- Data source: port +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T179799739"] = "Datenquelle: Port" + +-- Delete Retrieval Process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T180938091"] = "Abrufprozess löschen" + +-- Provider selection for generation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1840198821"] = "Anbieterauswahl für die Generierung" + +-- Should we automatically save any input made? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1980659256"] = "Sollen wir sämtliche Eingaben automatisch speichern?" + +-- Auto save +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1997164591"] = "Automatisches Speichern" + +-- An ERI server preset with this name already exists. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2031461801"] = "Ein ERI-Server-Voreinstellung mit diesem Namen existiert bereits. Bitte wählen Sie einen anderen Namen." + +-- Data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2034620186"] = "Datenquelle" + +-- Interactive documentation aka Swagger UI +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2064957876"] = "Interaktive Dokumentation (auch bekannt als Swagger UI)" + +-- When you rebuild / re-generate the ERI server code, AI Studio proceeds as follows: All files generated last time will be deleted. All other files you have created remain. Then, the AI generates the new files. But beware: It may happen that the AI generates a file this time that you manually created last time. In this case, your manually created file will then be overwritten. Therefore, you should always create a Git repository and commit or revert all changes before using this assistant. With a diff visualization, you can immediately see where the AI has made changes. It is best to use an IDE suitable for your selected language for this purpose. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2155983785"] = "Wenn Sie den ERI-Server-Code neu erstellen oder generieren, geht AI Studio wie folgt vor: Alle beim letzten Mal generierten Dateien werden gelöscht. Alle anderen von ihnen erstellten Dateien bleiben erhalten. Anschließend generiert die KI die neuen Dateien. Aber Vorsicht: Es kann passieren, dass die KI diesmal eine Datei generiert, die Sie beim letzten Mal manuell erstellt haben. In diesem Fall wird ihre manuell erstellte Datei überschrieben. Sie sollten daher immer ein Git-Repository anlegen und alle Änderungen vor der Nutzung dieses Assistenten committen oder gegebenenfalls zurücksetzen. Mit einer Diff-Ansicht können Sie sofort erkennen, wo die KI Änderungen vorgenommen hat. Am besten nutzen Sie dafür eine IDE, die für die von ihnen gewählte Programmiersprache geeignet ist." + +-- Add Embedding Method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2176833082"] = "Einbettungsmethode hinzufügen" + +-- For your ERI server, you need to retrieve data that matches a chat or prompt in some way. We call this the retrieval process. You must describe at least one such process. You may offer several retrieval processes from which users can choose. This allows you to test with beta users which process works better. Or you might generally want to give users the choice so they can select the process that best suits their circumstances. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T218617347"] = "Für ihren ERI-Server müssen Sie Daten abrufen, die in irgendeiner Weise zu einem Chat oder einem Prompt passen. Diesen Vorgang nennen wir „Retrieval-Prozess“ (Abrufprozess). Sie müssen mindestens einen solchen Prozess beschreiben. Sie können auch mehrere Abrufprozesse anbieten, aus denen die Nutzer wählen können. So können Sie mit Beta-Nutzern testen, welcher Prozess besser funktioniert. Oder Sie möchten den Nutzern grundsätzlich die Wahl lassen, damit sie den Prozess auswählen können, der am besten zu ihren Bedürfnissen passt." + +-- You can specify more than one embedding method. This can be useful when you want to use different embeddings for different queries or data types. For example, one embedding for texts, another for images, and a third for videos, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2202387805"] = "Sie können mehr als eine Einbettungsmethode angeben. Das ist nützlich, wenn Sie unterschiedliche Einbettungen für verschiedene Abfragen oder Datentypen verwenden möchten. Zum Beispiel eine Einbettung für Texte, eine andere für Bilder und eine dritte für Videos usw." + +-- Operating system on which your ERI server will run +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2205711729"] = "Betriebssystem, auf dem ihr ERI-Server ausgeführt wird" + +-- You can integrate additional libraries. Perhaps you want to evaluate the prompts in advance using a machine learning method or analyze them with a text mining approach? Or maybe you want to preprocess images in the prompts? For such advanced scenarios, you can specify which libraries you want to use here. It's best to describe which library you want to integrate for which purpose. This way, the LLM that writes the ERI server for you can try to use these libraries effectively. This should result in less rework being necessary. If you don't know the necessary libraries, you can instead attempt to describe the intended use. The LLM can then attempt to choose suitable libraries. However, hallucinations can occur, and fictional libraries might be selected. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2241311898"] = "Sie können zusätzliche Bibliotheken integrieren. Vielleicht möchten Sie die Prompts im Voraus mit einer Machine-Learning-Methode auswerten oder sie mithilfe eines Text-Mining-Ansatzes analysieren? Oder möchten Sie vielleicht Bilder in den Prompts vorverarbeiten? Für solche erweiterten Szenarien können Sie hier angeben, welche Bibliotheken Sie verwenden möchten. Beschreiben Sie am besten, welche Bibliothek Sie für welchen Zweck einbinden möchten. So kann das LLM, das den ERI-Server für Sie erstellt, versuchen, diese Bibliotheken effektiv zu nutzen. Dadurch sollte weniger Nacharbeit nötig sein. Falls Sie die benötigten Bibliotheken nicht kennen, können Sie stattdessen versuchen, den geplanten Einsatzzweck zu beschreiben. Das LLM kann dann versuchen, passende Bibliotheken auszuwählen. Allerdings können dabei Halluzinationen auftreten und fiktive Bibliotheken gewählt werden." + +-- The ERI specification could not be loaded. Please try again later. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2265640084"] = "Die ERI-Spezifikation konnte nicht geladen werden. Bitte versuchen Sie es später erneut." + +-- You can imagine it like this: Hypothetically, when Wikipedia implemented the ERI, it would vectorize all pages using an embedding method. All of Wikipedia’s data would remain with Wikipedia, including the vector database (decentralized approach). Then, any AI Studio user could add Wikipedia as a data source to significantly reduce the hallucination of the LLM in knowledge questions. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2299793803"] = "Sie können es sich so vorstellen: Hypothetisch gesehen würde die Wikipedia beim Einsatz von ERI alle Seiten mithilfe einer Einbettungsmethode „vektorisieren“. Alle Daten von Wikipedia, einschließlich der Vektordatenbank, würden bei der Wikipedia bleiben (dezentraler Ansatz). Danach könnte jeder Nutzer von MindWork AI Studio Wikipedia als Datenquelle hinzufügen, um Halluzinationen des LLM bei Wissensfragen deutlich zu reduzieren." + +-- Are you sure you want to delete the ERI server preset '{0}'? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2417944396"] = "Sind Sie sicher, dass Sie die ERI-Server-Voreinstellung '{0}' löschen möchten?" + +-- Data source settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2440619931"] = "Datenquellen-Einstellungen" + +-- Yes, please write or update all generated code to the file system +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T252707279"] = "Ja, bitte schreibe oder aktualisiere allen erzeugten Code im Dateisystem." + +-- Describe how you planned the authentication process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2531113337"] = "Beschreiben Sie, wie Sie den Authentifizierungsprozess geplant haben" + +-- Please specify the custom programming language for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T257210674"] = "Bitte geben Sie die benutzerdefinierte Programmiersprache für den ERI-Server an." + +-- Edit Embedding Method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T260789321"] = "Einbettungsmethode bearbeiten" + +-- Base directory where to write the code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2610795494"] = "Basisverzeichnis, in dem der Code gespeichert wird" + +-- Delete ERI server preset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2627399122"] = "ERI-Server-Voreinstellung löschen" + +-- Name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T266367750"] = "Name" + +-- Create the ERI server +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2903289059"] = "ERI-Server erstellen" + +-- Data retrieval settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T295114338"] = "Datenabruf-Einstellungen" + +-- Please provide a base directory for the ERI server to write files to. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2989655350"] = "Bitte geben Sie ein Basisverzeichnis an, in das der ERI-Server Dateien schreiben kann." + +-- You have selected 1 authentication method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2997584553"] = "Sie haben eine Authentifizierungsmethode ausgewählt" + +-- ERI server presets +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3021250792"] = "ERI-Server-Voreinstellungen" + +-- Authentication method(s) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3044928058"] = "Authentifizierungsmethode(n)" + +-- (Optional) Describe how you planned the authentication process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3052867096"] = "(Optional) Beschreiben Sie, wie Sie den Authentifizierungsprozess geplant haben" + +-- Do you want to include additional libraries? Then name them and briefly describe what you want to achieve with them. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3088814795"] = "Möchten Sie zusätzliche Bibliotheken einbinden? Nennen Sie diese bitte und beschreiben Sie kurz, was Sie damit erreichen möchten." + +-- Add ERI server preset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3090449320"] = "ERI-Server-Voreinstellung hinzufügen" + +-- Please specify the product name of the data source, e.g., 'MongoDB', 'Redis', 'PostgreSQL', 'Neo4j', or 'MinIO', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3105554044"] = "Bitte geben Sie den Produktnamen der Datenquelle an, z. B. „MongoDB“, „Redis“, „PostgreSQL“, „Neo4j“ oder „MinIO“ usw." + +-- Embedding settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T315946275"] = "Einbettungs-Einstellungen" + +-- Please select at least one authentication method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3178184134"] = "Bitte wählen Sie mindestens eine Authentifizierungsmethode aus." + +-- The ERI specification will change over time. You probably want to keep your ERI server up to date. This means you might want to regenerate the code for your ERI server. To avoid having to make all inputs each time, all your inputs and decisions can be automatically saved. Would you like this? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3203532492"] = "Die ERI-Spezifikation wird sich im Laufe der Zeit ändern. Sie möchten wahrscheinlich, dass ihr ERI-Server immer auf dem neuesten Stand ist. Das bedeutet, dass Sie den Code für ihren ERI-Server eventuell erneut generieren müssen. Damit Sie nicht jedes Mal alle Eingaben erneut machen müssen, können alle ihre Eingaben und Entscheidungen automatisch gespeichert werden. Möchten Sie das?" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3267849393"] = "Bearbeiten" + +-- Programming language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3295594136"] = "Programmiersprache" + +-- Data source: product name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3315518334"] = "Datenquelle" + +-- No, just show me the code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3316699247"] = "Nein, zeig mir einfach den Code." + +-- Other language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3374524465"] = "Andere Sprache" + +-- ERI Server {0} +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3443687246"] = "ERI-Server {0}" + +-- You will likely use one or more embedding methods to encode the meaning of your data into a typically high-dimensional vector space. In this case, you will use a vector database to store and search these vectors (called embeddings). However, you don't have to use embedding methods. When your retrieval method works without any embedding, you can ignore this section. An example: You store files on a file server, and your retrieval method works exclusively with file names in the file system, so you don't need embeddings. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3446047228"] = "Sie werden wahrscheinlich eine oder mehrere Einbettungs-Methoden verwenden, um die Bedeutung Ihrer Daten in einen typischerweise hochdimensionalen Vektorraum zu kodieren. In diesem Fall nutzen Sie eine Vektordatenbank, um diese Vektoren (sogenannte Einbettungen) zu speichern und zu durchsuchen. Es ist jedoch nicht zwingend erforderlich, Einbettungs-Methoden zu verwenden. Wenn ihre Suchmethode ohne Einbettungen funktioniert, können Sie diesen Abschnitt ignorieren. Ein Beispiel: Sie speichern Dateien auf einem Dateiserver, und ihre Suchmethode arbeitet ausschließlich mit Dateinamen im Dateisystem – dann benötigen Sie keine Einbettungen." + +-- Important: The LLM may need to generate many files. This reaches the request limit of most providers. Typically, only a certain number of requests can be made per minute, and only a maximum number of tokens can be generated per minute. AI Studio automatically considers this. However, generating all the files takes a certain amount of time. Local or self-hosted models may work without these limitations and can generate responses faster. AI Studio dynamically adapts its behavior and always tries to achieve the fastest possible data processing. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3485079498"] = "Wichtig: Das LLM muss möglicherweise viele Dateien generieren. Dadurch wird das Anfrage-Limit der meisten LLM-Anbieter erreicht. In der Regel kann nur eine bestimmte Anzahl von Anfragen pro Minute gestellt werden, und es dürfen nur eine maximale Anzahl von Tokens pro Minute erzeugt werden. AI Studio berücksichtigt dies automatisch. Das Erzeugen aller Dateien benötigt jedoch eine gewisse Zeit. Lokale oder selbst gehostete Modelle funktionieren möglicherweise ohne diese Einschränkungen und können schneller antworten. AI Studio passt sein Verhalten dynamisch an und versucht immer, die Daten so schnell wie möglich zu verarbeiten." + +-- Type +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3512062061"] = "Typ" + +-- Please describe how the selected authentication methods should be used. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T356079033"] = "Bitte beschreiben Sie, wie die ausgewählten Authentifizierungsmethoden verwendet werden sollen." + +-- Authentication settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3565127422"] = "Authentifizierungs-Einstellungen" + +-- Add Retrieval Process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3617128581"] = "Abrufprozess hinzufügen" + +-- Please provide a brief description of your ERI server. Describe or explain what your ERI server does and what data it uses for this purpose. This description will be shown to users in AI Studio. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3637826231"] = "Bitte geben Sie eine kurze Beschreibung ihres ERI-Servers an. Beschreiben oder erklären Sie, was Ihr ERI-Server macht und welche Daten dafür verwendet werden. Diese Beschreibung wird den Nutzern in AI Studio angezeigt." + +-- Please provide the port of the data source. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3641304143"] = "Bitte geben Sie den Port der Datenquelle an." + +-- Please provide the hostname of the data source. Use 'localhost' if the data source is on the same machine as the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3668870799"] = "Bitte geben Sie den Hostnamen der Datenquelle an. Verwenden Sie „localhost“, wenn sich die Datenquelle auf demselben Rechner wie der ERI-Server befindet." + +-- Delete Embedding +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3691399003"] = "Einbettung löschen" + +-- Yes, please save my inputs +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3709185824"] = "Ja, bitte speichere meine Eingaben." + +-- Common ERI server settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T371718034"] = "Allgemeine ERI-Server-Einstellungen" + +-- Download specification +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3770339156"] = "Spezifikation herunterladen" + +-- Are you sure you want to delete the embedding '{0}'? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3792084967"] = "Möchten Sie die Einbettung „{0}“ wirklich löschen?" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3865031940"] = "Aktionen" + +-- ERI specification version +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3897494556"] = "ERI-Spezifikations-Version" + +-- Please provide a description for your ERI server. What data will the server retrieve? This description will be used to inform users about the purpose of your ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3973182416"] = "Bitte geben Sie eine Beschreibung für Ihren ERI-Server an. Welche Daten wird der Server abrufen? Diese Beschreibung wird dazu verwendet, die Nutzer über den Zweck ihres ERI-Servers zu informieren." + +-- Please select a data source for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4010020894"] = "Bitte wählen Sie eine Datenquelle für den ERI-Server aus." + +-- Please select at least one authentication method for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4027569219"] = "Bitte wählen Sie mindestens eine Authentifizierungsmethode für den ERI-Server aus." + +-- Data protection settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4078115997"] = "Datenschutzeinstellungen" + +-- Please describe the data source of your ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4156384463"] = "Bitte beschreiben Sie die Datenquelle ihres ERI-Servers." + +-- ERI Server +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4204533420"] = "ERI-Server" + +-- The name of your ERI server must be between 6 and 60 characters long. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4215418115"] = "Der Name ihres ERI-Servers muss zwischen 6 und 60 Zeichen lang sein." + +-- Describe your data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4272497758"] = "Beschreiben Sie ihre Datenquelle" + +-- The ERI is the External Retrieval Interface for AI Studio and other tools. The ERI acts as a contract between decentralized data sources and, e.g., AI Studio. The ERI is implemented by the data sources, allowing them to be integrated into AI Studio later. This means that the data sources assume the server role and AI Studio (or any other LLM tool) assumes the client role of the API. This approach serves to realize a Retrieval-Augmented Generation (RAG) process with external data. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T458158948"] = "Das ERI ist die externe Abrufschnittstelle (External Retrieval Interface) für AI Studio und andere Werkzeuge. Das ERI fungiert als Vertrag zwischen dezentralen Datenquellen und beispielsweise AI Studio. Die Implementierung des ERI erfolgt durch die Datenquellen, wodurch diese später in AI Studio integriert werden können. Das bedeutet, dass die Datenquellen die Serverrolle übernehmen und AI Studio (oder ein anderes LLM-Werkzeug) die Rolle des API-Clients einnimmt. Dieser Ansatz dient dazu, einen Retrieval-Augmented Generation (RAG)-Prozess mit externen Daten zu ermöglichen." + +-- Allowed LLM providers for this data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T476513814"] = "Zulässige LLM-Anbieter für diese Datenquelle" + +-- The description of your ERI server must be between 32 and 512 characters long. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T528250165"] = "Die Beschreibung ihres ERI-Servers muss zwischen 32 und 512 Zeichen lang sein." + +-- (Optional) Additional libraries +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T605643256"] = "(Optional) Zusätzliche Bibliotheken" + +-- Delete this server preset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T662220520"] = "Diese Server-Voreinstellung löschen" + +-- No retrieval process configured yet. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T701892387"] = "Noch kein Abrufprozess konfiguriert." + +-- Hint: to allow this assistant to manage multiple presets, you must enable the preselection of values in the settings. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T726548639"] = "Hinweis: Damit dieser Assistent mehrere Voreinstellungen verwalten kann, müssen Sie in den Einstellungen die Vorauswahl von Optionen aktivieren." + +-- Should we write the generated code to the file system? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T732123150"] = "Sollen wir den erzeugten Code im Dateisystem speichern?" + +-- ERI server description +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T746826190"] = "ERI-Serverbeschreibung" + +-- Are you sure you want to delete the retrieval process '{0}'? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T748762927"] = "Sind Sie sicher, dass Sie den Abrufvorgang '{0}' löschen möchten?" + +-- Data source: hostname +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T761552889"] = "Datenquelle: Hostname" + +-- Please select a programming language for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T884206922"] = "Bitte wählen Sie eine Programmiersprache für den ERI-Server aus." + +-- The hostname of the data source must not exceed 255 characters. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T891356210"] = "Der Hostname der Datenquelle darf nicht länger als 255 Zeichen sein." + +-- ERI repository with example implementation in .NET and C# +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T907948048"] = "ERI-Repository mit einer Beispiel-Implementierung in .NET und C#" + +-- Login by token: simple to implement and to operate, useful for few users; unusual for many users +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T1080772923"] = "Anmeldung per Token: Einfach zu implementieren und zu bedienen, sinnvoll für wenige Nutzer; unüblich bei vielen Nutzern" + +-- Unknown login method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T1650512217"] = "Unbekannte Anmeldemethode" + +-- Login by single-sign-on (SSO) using Kerberos: very complex to implement and to operate, useful for many users +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T2755085876"] = "Anmeldung per Single Sign-On (SSO) mit Kerberos: sehr komplex in der Umsetzung und im Betrieb, aber für viele Nutzer hilfreich" + +-- Login by username and password: simple to implement and to operate, useful for few users; easy to use for users +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T2776614042"] = "Login per Benutzername und Passwort: einfach zu implementieren und zu bedienen, sinnvoll bei wenigen Nutzern; benutzerfreundlich" + +-- No login necessary: useful for public data sources +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T80942322"] = "Kein Login erforderlich: nützlich für öffentliche Datenquellen" + +-- Custom description +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T1927732460"] = "Benutzerdefinierte Beschreibung" + +-- Object storage, like Amazon S3, MinIO, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T1950971562"] = "Objektspeicher wie Amazon S3, MinIO usw." + +-- Key-Value store, like Redis, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T206122953"] = "Schlüssel-Werte-Speicher, wie Redis usw." + +-- No data source selected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T2241819332"] = "Keine Datenquelle ausgewählt" + +-- Graph database, like Neo4j, ArangoDB, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T2327735815"] = "Graphdatenbank, wie Neo4j, ArangoDB usw." + +-- File system (local or network share) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T2883797032"] = "Dateisystem (lokal oder Netzwerkfreigabe)" + +-- Document store, like MongoDB, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T3377619148"] = "Dokumentenspeicher, wie MongoDB usw." + +-- Relational database, like MySQL, PostgreSQL, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T3394837922"] = "Relationale Datenbank, wie MySQL, PostgreSQL usw." + +-- Unknown data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T752426884"] = "Unbekannte Datenquelle" + +-- Windows +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T104858250"] = "Windows" + +-- No operating system specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T1453731272"] = "Kein Betriebssystem angegeben" + +-- Linux +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T2498953917"] = "Linux" + +-- Unknown operating system +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T2961688575"] = "Unbekanntes Betriebssystem" + +-- Other +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::PROGRAMMINGLANGUAGESEXTENSIONS::T1849229205"] = "Sonstiges" + +-- No programming language selected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::PROGRAMMINGLANGUAGESEXTENSIONS::T2044057328"] = "Keine Programmiersprache ausgewählt" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::PROGRAMMINGLANGUAGESEXTENSIONS::T3424652889"] = "Unbekannt" + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T137304886"] = "Bitte geben Sie einen Text ein. Sie können den gewünschten Text aus einem Dokument oder einer Website kopieren." + +-- Proofread +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T2325568297"] = "Korrekturlesen" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T2591284123"] = "Sprache" + +-- Your input to check +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T2861221443"] = "Ihre Eingabe zur Überprüfung" + +-- Custom language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T3032662264"] = "Benutzerdefinierte Sprache" + +-- Grammar & Spelling Checker +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T3169549433"] = "Grammatik- und Rechtschreibprüfung" + +-- Check the grammar and spelling of a text. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T3184716499"] = "Grammatik und Rechtschreibung eines Textes überprüfen." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T656744944"] = "Bitte geben Sie eine benutzerdefinierte Sprache an." + +-- Text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1041509726"] = "Text" + +-- While loading the I18N data, an issue occurred: +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1115416642"] = "Beim Laden der I18N-Daten ist ein Fehler aufgetreten:" + +-- Please select a target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1173859091"] = "Bitte wählen Sie eine Zielsprache aus." + +-- Removed Content ({0} entries) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1214535771"] = "Entfernte Inhalte ({0} Einträge)" + +-- Added Content ({0} entries) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1258080997"] = "Hinzugefügte Inhalte ({0} Einträge)" + +-- Localized Content ({0} entries of {1}) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1492071634"] = "Lokalisierte Inhalte ({0} von {1} Einträgen)" + +-- Select the language plugin used for comparision. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1523568309"] = "Wählen Sie das Sprach-Plugin für den Vergleich aus." + +-- Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1893011391"] = "Das Sprach-Plugin für den Vergleich konnte nicht geladen werden ({0}). Bitte wählen Sie ein gültiges, geladenes und laufendes Sprach-Plugin." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T237828418"] = "Zielsprache" + +-- Language plugin used for comparision +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T263317578"] = "Sprach-Plugin für den Vergleich" + +-- Localize AI Studio & generate the Lua code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3055634395"] = "Lokalisiere AI Studio & generiere den Lua-Code" + +-- Translate MindWork AI Studio text content into another language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3206202961"] = "Übersetze MindWork AI Studio-Textinhalte in eine andere Sprache." + +-- Search +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3326517961"] = "Suchen" + +-- Key +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3441084684"] = "Schlüssel" + +-- Please select a language plugin for comparison. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3505664865"] = "Bitte wählen Sie ein Sprach-Plugin für den Vergleich aus." + +-- Was not able to load the I18N plugin. Please check the plugin code. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3687333329"] = "Das I18N-Plugin konnte nicht geladen werden. Bitte überprüfen Sie den Plugin-Code." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3848935911"] = "Benutzerdefinierte Zielsprache" + +-- Copy Lua code to clipboard +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3875738742"] = "Lua-Code in die Zwischenablage kopieren" + +-- The data is being loaded, please wait... +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T453060723"] = "Die Daten werden geladen. Bitte warten ..." + +-- The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T458999393"] = "Das ausgewählte Sprach-Plugin für den Vergleich verwendet das IETF-Tag „{0}“, das nicht mit der ausgewählten Zielsprache „{1}“ übereinstimmt. Bitte wähle ein gültiges, geladenes und laufendes Sprach-Plugin aus, das mit der Zielsprache übereinstimmt." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T656744944"] = "Bitte geben Sie eine benutzerdefinierte Sprache an." + +-- Please note: neither is a translation needed nor performed for English (USA). Anyway, you might want to generate the related Lua code. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T851515643"] = "Bitte beachten Sie: Für Englisch (USA) ist weder eine Übersetzung erforderlich noch wird eine durchgeführt. Sie können trotzdem den entsprechenden Lua-Code generieren." + +-- Localization +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T897888480"] = "Lokalisierung" + +-- Your icon source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T1302165948"] = "Ihre Icons-Quelle" + +-- Find Icon +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T1975161003"] = "Icon suchen" + +-- Finding the right icon for a context, such as for a piece of text, is not easy. The first challenge: You need to extract a concept from your context, such as from a text. Let's take an example where your text contains statements about multiple departments. The sought-after concept could be "departments." The next challenge is that we need to anticipate the bias of the icon designers: under the search term "departments," there may be no relevant icons or only unsuitable ones. Depending on the icon source, it might be more effective to search for "buildings," for instance. LLMs assist you with both steps. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T347756684"] = "Das richtige Icon für einen bestimmten Kontext zu finden, zum Beispiel für einen Text, ist nicht einfach. Die erste Herausforderung besteht darin, ein Konzept aus dem Kontext, wie etwa aus einem Text, herauszufiltern. Nehmen wir ein Beispiel: Ihr Text enthält Aussagen über verschiedene Abteilungen. Das gesuchte Konzept könnte also „Abteilungen“ sein. Die nächste Herausforderung ist, die Denkweise der Icon-Designer vorherzusehen: Unter dem Suchbegriff „Abteilungen“ gibt es möglicherweise keine passenden oder sogar völlig ungeeignete Icons. Je nach Icon-Quelle kann es daher effektiver sein, zum Beispiel nach „Gebäude“ zu suchen. LLMs unterstützen Sie bei beiden Schritten." + +-- Icon Finder +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T3693102312"] = "Iconfinder" + +-- Open website +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T4239378936"] = "Website öffnen" + +-- Your context +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T596802185"] = "Ihr Kontext" + +-- Please provide a context. This will help the AI to find the right icon. You might type just a keyword or copy a sentence from your text, e.g., from a slide where you want to use the icon. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T653229070"] = "Bitte geben Sie einen Kontext an. Das hilft der KI, das passende Icon zu finden. Sie können einfach ein Stichwort eingeben oder einen Satz aus ihrem Text kopieren, zum Beispiel von einer Folie, auf der Sie das Icon verwenden möchten." + +-- (Optional) The company name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1134022609"] = "(Optional) Unternehmensname" + +-- (Optional) Provide mandatory information +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1206803170"] = "(Optional) Pflichtangaben" + +-- Please provide the country where the job is posted (legal framework). +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1257297967"] = "Bitte geben Sie das Land an, in dem die Stelle ausgeschrieben ist (rechtlicher Rahmen)." + +-- (Optional) Provide necessary job qualifications +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1288034407"] = "(Optional) Erforderliche Qualifikationen angeben" + +-- Describe the responsibilities the person should take on in the company. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1289043339"] = "Beschreiben Sie die Aufgaben, welche die Person im Unternehmen übernehmen wird." + +-- Please provide a custom target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1330607941"] = "Bitte geben Sie die benutzerdefinierte Zielsprache an." + +-- Create the job posting +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1348170275"] = "Stellenanzeige erstellen" + +-- This is important to consider the legal framework of the country. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1652348489"] = "Diese Angabe ist wichtig, um den rechtlichen Rahmen des jeweiligen Landes berücksichtigen zu können." + +-- Mandatory information that your company requires for all job postings. This can include the company description, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1860534017"] = "Pflichtangaben, die Ihr Unternehmen für alle Stellenanzeigen verlangt. Dazu kann auch die Unternehmensbeschreibung gehören." + +-- (Optional) Provide the entry date +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1911333264"] = "(Optional) Geben Sie das Datum der Einstellung an" + +-- Describe what the person is supposed to do in the company. This might be just short bullet points. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1965813611"] = "Beschreiben Sie, was die Person im Unternehmen machen soll. Das können auch kurze Stichpunkte sein." + +-- Describe what the person should bring to the table. This might be just short bullet points. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T2223185050"] = "Beschreiben Sie, welche Fähigkeiten die Person haben sollte. Das können auch kurze Stichpunkte sein." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T237828418"] = "Zielsprache" + +-- Please provide a job description. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3056799310"] = "Bitte beschreiben Sie die Stelle." + +-- Job description +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3063567486"] = "Stellenbeschreibung" + +-- Provide the country, where the company is located +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3414839564"] = "Geben Sie das Land an, in dem sich das Unternehmen befindet" + +-- (Optional) Provide the date until the job posting is valid +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3471426808"] = "(Optional) Geben Sie das Ablaufdatum der Stellenausschreibung an" + +-- Provide some key points about the job you want to post. The AI will then formulate a suggestion that you can finalize. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3644893573"] = "Nennen Sie einige wichtige Punkte zu dem Job, den Sie ausschreiben möchten. Die KI wird daraus einen Vorschlag formulieren, den Sie anschließend anpassen können." + +-- (Optional) Provide job responsibilities +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3657997222"] = "(Optional) Geben Sie an, welche Verantwortlichkeiten die Person haben wird" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3848935911"] = "Benutzerdefinierte Zielsprache" + +-- Job Posting +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3930052338"] = "Stellenausschreibung" + +-- (Optional) Provide the work location +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3972042680"] = "(Optional) Geben Sie den Arbeitsort an" + +-- Please provide a legal document as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1160217683"] = "Bitte geben Sie ein rechtliches Dokument ein. Sie können den gewünschten Text aus einem Dokument oder von einer Website kopieren." + +-- Legal Check +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1348190638"] = "Rechtliche Prüfung" + +-- Legal document +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1887742531"] = "Rechtsdokument" + +-- Your questions +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1947954583"] = "Ihre Fragen" + +-- Provide a legal document and ask a question about it. This assistant does not replace legal advice. Consult a lawyer to get professional advice. Remember that LLMs can invent answers and facts. Please do not rely on this answers. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T4016275181"] = "Stellen Sie ein juristisches Dokument bereit und stellen Sie eine Frage dazu. Dieser Assistent ersetzt keine Rechtsberatung. Wenden Sie sich an einen Anwalt, um professionelle Beratung zu erhalten. Bitte beachten Sie, dass Sprachmodelle Antworten und Fakten erfinden können. Verlassen Sie sich daher nicht auf diese Antworten." + +-- Please provide your questions as input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T4154383818"] = "Bitte geben Sie ihre Fragen ein." + +-- Ask your questions +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T467099852"] = "Stellen Sie ihre Fragen" + +-- Please provide some text as input. For example, an email. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T1962809521"] = "Bitte geben Sie einen Text ein. Zum Beispiel eine E-Mail." + +-- Analyze text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T2268303626"] = "Text analysieren" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T237828418"] = "Zielsprache" + +-- My Tasks +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3011450657"] = "Meine Aufgaben" + +-- You received a cryptic email that was sent to many recipients and you are now wondering if you need to do something? Copy the email into the input field. You also need to select a personal profile. In this profile, you should describe your role in the organization. The AI will then try to give you hints on what your tasks might be. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3646084045"] = "Sie haben eine rätselhafte E-Mail erhalten, die an viele Empfänger verschickt wurde, und fragen sich nun, ob Sie etwas unternehmen müssen? Kopieren Sie die E-Mail in das Eingabefeld. Außerdem müssen Sie ein persönliches Profil auswählen. In diesem Profil sollten Sie ihre Rolle in der Organisation beschreiben. Die KI wird Ihnen dann Hinweise geben, welche Aufgaben für Sie daraus entstehen könnten." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3848935911"] = "Benutzerdefinierte Zielsprache" + +-- Please select one of your profiles. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T465395981"] = "Bitte wählen Sie eines ihrer Profile aus." + +-- Text or email +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T534887559"] = "Text oder E-Mail" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T656744944"] = "Bitte wählen Sie eine eigene Sprache aus." + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T137304886"] = "Bitte geben Sie einen Text ein. Sie können den gewünschten Text aus einem Dokument oder einer Website kopieren." + +-- Sentence structure +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T1714063121"] = "Satzstruktur" + +-- Rewrite & Improve Text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T1994150308"] = "Text umschreiben & verbessern" + +-- Improve your text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T2163831433"] = "Verbessern Sie ihren Text" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T2591284123"] = "Sprache" + +-- Custom language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T3032662264"] = "Benutzerdefinierte Sprache" + +-- Your input to improve +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T3037449423"] = "Ihr Vorschlag zur Verbesserung" + +-- Writing style +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T3754048862"] = "Schreibstil" + +-- Rewrite and improve your text. Please note, that the capabilities of the different LLM providers will vary. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T480915300"] = "Überarbeiten und verbesseren Sie ihren Text. Bitte beachte Sie, dass die Fähigkeiten der verschiedenen LLM-Anbieter unterschiedlich sein können." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T656744944"] = "Bitte geben Sie eine benutzerdefinierte Sprache an." + +-- Passive voice +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::SENTENCESTRUCTUREEXTENSIONS::T132535068"] = "Passive Sprache" + +-- Active voice +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::SENTENCESTRUCTUREEXTENSIONS::T3548001825"] = "Aktive Sprache" + +-- Not Specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::SENTENCESTRUCTUREEXTENSIONS::T4281286216"] = "Nicht angegeben" + +-- Scientific (scientific papers, research reports) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1488581017"] = "Wissenschaftlich (wissenschaftliche Arbeiten, Forschungsberichte)" + +-- Technical (manuals, documentation) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1577933546"] = "Technisch (Handbücher, Dokumentation)" + +-- Changelog (release notes, version history) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1755311660"] = "Änderungsprotokoll (Versionshinweise, Versionsverlauf)" + +-- Literary (fiction, poetry) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1823468337"] = "Literarisch (Belletristik, Lyrik)" + +-- Journalistic (magazines, newspapers, news) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T302304243"] = "Journalistisch (Zeitschriften, Zeitungen, Nachrichten)" + +-- Everyday (personal texts, social media) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T3607558508"] = "Alltag (persönliche Texte, soziale Medien)" + +-- Business (business emails, reports, presentations) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T3674741297"] = "Geschäftlich (geschäftliche E-Mails, Berichte, Präsentationen)" + +-- Legal (legal texts, contracts) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T3749505397"] = "Rechtlich (rechtliche Texte, Verträge)" + +-- Academic (essays, seminar papers) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T4090727535"] = "Akademisch (Essays, Seminararbeiten)" + +-- Not specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T641241064"] = "Nicht angegeben" + +-- Marketing (advertisements, sales texts) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T945714286"] = "Marketing (Werbung, Verkaufstexte)" + +-- Your word or phrase +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T1847246020"] = "Ihr Wort oder Phrase" + +-- (Optional) The context for the given word or phrase +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2250963999"] = "(Optional) Der Kontext für das angegebene Wort oder die Phrase" + +-- Synonyms +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2547582747"] = "Synonyme" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2591284123"] = "Sprache" + +-- Find synonyms for words or phrases. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2733641217"] = "Synonyme für Wörter oder Ausdrücke finden." + +-- Find synonyms +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T3106607224"] = "Synonyme finden" + +-- Please provide a word or phrase as input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T3501110371"] = "Bitte geben Sie ein Wort oder eine Phrase ein." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T3848935911"] = "Benutzerdefinierte Zielsprache" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T656744944"] = "Bitte geben Sie eine benutzerdefinierte Sprache an." + +-- Your input +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T1249704194"] = "Ihre Eingabe" + +-- Target complexity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T1318882688"] = "Ziel-Komplexität" + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T137304886"] = "Bitte geben Sie einen Text ein. Sie können den gewünschten Text aus einem Dokument oder einer Webseite kopieren." + +-- Text Summarizer +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T1907192403"] = "Texte zusammenfassen" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T237828418"] = "Zielsprache" + +-- Summarize long text into a shorter version while retaining the main points. You might want to change the language of the summary to make it more readable. It is also possible to change the complexity of the summary to make it easy to understand. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T359929871"] = "Fasse einen langen Text zu einer kürzeren Version zusammen und behalte dabei die wichtigsten Punkte bei. Sie können die Sprache des Textes anpassen, um die Zusammenfassung verständlicher zu machen. Außerdem ist es möglich, die Zusammenfassung einfacher zu formulieren, damit sie leichter zu verstehen ist." + +-- Please provide your field of expertise. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T3610378685"] = "Bitte geben Sie Ihr Fachgebiet an." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T3848935911"] = "Benutzerdefinierte Zielsprache" + +-- Summarize +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T502888730"] = "Zusammenfassen" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T656744944"] = "Bitte wähle eine benutzerdefinierte Sprache aus." + +-- Your expertise +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T970222193"] = "Ihre Fachkenntnisse" + +-- No change in complexity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T1001090711"] = "Keine Änderung der Komplexität" + +-- Teen language, e.g., for teenagers +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T1177455058"] = "Jugendsprache, z. B. für Teenager" + +-- Scientific language for experts in this field +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T2687197281"] = "Wissenschaftliche Fachsprache für Experten auf diesem Gebiet" + +-- Scientific language for experts from other fields (interdisciplinary) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T2931193867"] = "Wissenschaftliche Sprache für Experten aus anderen Disziplinen" + +-- Popular science language, e.g., for people interested in science +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T3161914110"] = "Populärwissenschaftliche Sprache, z. B. für wissenschaftlich Interessierte" + +-- Everyday language, e.g., for adults +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T3382050522"] = "Alltagssprache, z. B. für Erwachsene" + +-- Simple language, e.g., for children +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T530584375"] = "Einfache Sprache, zum Beispiel für Kinder" + +-- Please select a target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T1173859091"] = "Bitte wählen Sie eine Zielsprache aus." + +-- Your input +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T1249704194"] = "Ihre Eingabe" + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T137304886"] = "Bitte geben Sie einen Text ein. Sie können den gewünschten Text aus einem Dokument oder einer Webseite kopieren." + +-- Translate +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T2028202101"] = "Übersetzen" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T237828418"] = "Zielsprache" + +-- Translate text from one language to another. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T3230457846"] = "Text aus einer Sprache in eine andere übersetzen." + +-- No live translation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T3556243327"] = "Keine Live-Übersetzung" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T3848935911"] = "Benutzerdefinierte Zielsprache" + +-- Live translation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T4279308324"] = "Live-Übersetzung" + +-- Translation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T613888204"] = "Übersetzung" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T656744944"] = "Bitte geben Sie eine eigene Sprache an." + +-- System +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T2402387132"] = "System" + +-- You +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3049115964"] = "Sie" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3424652889"] = "Unbekannt" + +-- Assistant +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3662687431"] = "Assistent" + +-- User +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3768991250"] = "Benutzer" + +-- AI +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T601166687"] = "KI" + +-- Edit Message +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1183581066"] = "Nachricht bearbeiten" + +-- Copies the content to the clipboard +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T12948066"] = "Kopiert den Inhalt in die Zwischenablage" + +-- Do you really want to remove this message? +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1347427447"] = "Möchten Sie diese Nachricht wirklich löschen?" + +-- Yes, remove the AI response and edit it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1350385882"] = "Ja, entferne die KI-Antwort und bearbeite sie." + +-- Yes, regenerate it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1603883875"] = "Ja, neu generieren" + +-- Yes, remove it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1820166585"] = "Ja, entferne es" + +-- Do you really want to edit this message? In order to edit this message, the AI response will be deleted. +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T2018431076"] = "Möchten Sie diese Nachricht wirklich bearbeiten? Um die Nachricht zu bearbeiten, wird die Antwort der KI gelöscht." + +-- Removes this block +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T2093355991"] = "Entfernt diesen Block" + +-- Regenerate Message +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T2308444540"] = "Nachricht neu erstellen" + +-- Cannot render content of type {0} yet. +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3175548294"] = "Der Inhaltstyp {0} kann noch nicht angezeigt werden." + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3267849393"] = "Bearbeiten" + +-- Regenerate +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3587744975"] = "Neu generieren" + +-- Do you really want to regenerate this message? +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3878878761"] = "Möchten Sie diese Nachricht wirklich neu generieren?" + +-- Cannot copy this content type to clipboard! +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T4021525742"] = "Dieser Inhaltstyp kann nicht in die Zwischenablage kopiert werden!" + +-- Remove Message +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T4070211974"] = "Nachricht entfernen" + +-- No, keep it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T4188329028"] = "Nein, behalten" + +-- Open Settings +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ASSISTANTBLOCK::T1172211894"] = "Einstellungen öffnen" + +-- Changelog +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHANGELOG::T3017574265"] = "Änderungsprotokoll" + +-- Move chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1133040906"] = "Chat verschieben" + +-- Are you sure you want to move this chat? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1142475422"] = "Sind Sie sicher, dass Sie diesen Chat verschieben möchten? Alle ungespeicherten Änderungen gehen verloren." + +-- Stop generation +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1317408357"] = "Generierung stoppen" + +-- Save chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1516264254"] = "Chat speichern" + +-- Type your input here... +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1849313532"] = "Geben Sie hier Ihre Eingabe ein..." + +-- Your Prompt (use selected instance '{0}', provider '{1}') +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1967611328"] = "Ihr Prompt (verwendete Instanz: '{0}', Anbieter: '{1}')" + +-- Profile usage is disabled according to your chat template settings. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2670286472"] = "Die Profilnutzung ist gemäß den Einstellungen ihrer Chat-Vorlage deaktiviert." + +-- Delete this chat & start a new one. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2991985411"] = "Diesen Chat löschen & einen neuen beginnen." + +-- Move Chat to Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3045856778"] = "Chat in den Arbeitsbereich verschieben" + +-- The selected provider is not allowed in this chat due to data security reasons. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3403290862"] = "Der ausgewählte Anbieter ist aus Gründen der Datensicherheit in diesem Chat nicht erlaubt." + +-- Select a provider first +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3654197869"] = "Wähle zuerst einen Anbieter aus" + +-- Start new chat in workspace "{0}" +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3928697643"] = "Neuen Chat im Arbeitsbereich \"{0}\" starten" + +-- New disappearing chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4113970938"] = "Neuen selbstlöschenden Chat starten" + +-- Please select the workspace where you want to move the chat to. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T474393241"] = "Bitte wählen Sie den Arbeitsbereich aus, in den Sie den Chat verschieben möchten." + +-- Move the chat to a workspace, or to another if it is already in one. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T636393754"] = "Verschieben Sie den Chat in einen Arbeitsbereich oder in einen anderen, falls er sich bereits in einem befindet." + +-- Show your workspaces +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T733672375"] = "Ihre Arbeitsbereiche anzeigen" + +-- Start a new chat with a chat template +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATTEMPLATESELECTION::T1333844707"] = "Neuen Chat mit einer Chat-Vorlage starten" + +-- Open Chat Template Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATTEMPLATESELECTION::T1335399555"] = "Einstellungen der Chat-Vorlagen öffnen" + +-- Manage your templates +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATTEMPLATESELECTION::T3058934130"] = "Verwalten Sie ihre Vorlagen" + +-- Region +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T1227782301"] = "Region" + +-- Source {0} +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T1700986546"] = "Quelle {0}" + +-- Description +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T1725856265"] = "Beschreibung" + +-- Confidence Level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T2492230131"] = "Vertrauensniveau" + +-- Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T2730980305"] = "Quellen" + +-- Confidence Card +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T2960002005"] = "Vertrauenskarte" + +-- Confidence +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T3243388657"] = "Vertrauenskarte" + +-- Shows and hides the confidence card with information about the selected LLM provider. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T847071819"] = "Zeigt oder verbirgt die Vertrauenskarte mit Informationen über den ausgewählten LLM-Anbieter." + +-- Choose the minimum confidence level that all LLM providers must meet. This way, you can ensure that only trustworthy providers are used. You cannot use any provider that falls below this level. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMINCONFIDENCESELECTION::T2526727283"] = "Wählen Sie das minimale Vertrauensniveau, das alle LLM-Anbieter erfüllen müssen. So stellen Sie sicher, dass nur vertrauenswürdige Anbieter verwendet werden. Anbieter, die dieses Niveau unterschreiten, können nicht verwendet werden." + +-- Select a minimum confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMINCONFIDENCESELECTION::T2579793544"] = "Wählen Sie ein minimales Vertrauensniveau aus" + +-- You have selected 1 preview feature. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMULTISELECT::T1384241824"] = "Sie haben 1 Vorschaufunktion ausgewählt." + +-- No preview features selected. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMULTISELECT::T2809641588"] = "Keine Vorschaufunktionen ausgewählt." + +-- You have selected {0} preview features. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMULTISELECT::T3513450626"] = "Sie haben {0} Vorschaufunktionen ausgewählt." + +-- Preselected provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONPROVIDERSELECTION::T1469984996"] = "Vorausgewählter Anbieter" + +-- Select a provider that is preselected. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONPROVIDERSELECTION::T20906218"] = "Wählen Sie einen vorausgewählten Anbieter aus." + +-- Use app default +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONPROVIDERSELECTION::T3672477670"] = "App-Standard verwenden" + +-- Yes, let the AI decide which data sources are needed. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1031370894"] = "Ja, lassen Sie die KI entscheiden, welche Datenquellen benötigt werden." + +-- Yes, let the AI validate & filter the retrieved data. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1309929755"] = "Ja, die KI soll die abgerufenen Daten überprüfen und filtern." + +-- Data Source Selection +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T15302104"] = "Datenauswahl" + +-- AI-Selected Data Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T168406579"] = "KI-ausgewählte Datenquellen" + +-- AI-based data validation +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1744745490"] = "KI-gestützte Datenvalidierung" + +-- Yes, I want to use data sources. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1975014927"] = "Ja, ich möchte Datenquellen verwenden." + +-- You haven't configured any data sources. To grant the AI access to your data, you need to add such a source. However, if you wish to use data from your device, you first have to set up a so-called embedding. This embedding is necessary so the AI can effectively search your data, find and retrieve the correct information required for each task. In addition to local data, you can also incorporate your company's data. To do so, your company must provide the data through an ERI (External Retrieval Interface). +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T2113594442"] = "Sie haben noch keine Datenquellen konfiguriert. Um der KI Zugriff auf ihre Daten zu ermöglichen, müssen Sie zunächst eine solche Quelle hinzufügen. Wenn Sie jedoch Daten von ihrem Gerät verwenden möchten, müssen Sie zuerst eine sogenannte Einbettung einrichten. Diese Einbettung ist notwendig, damit die KI ihre Daten effektiv durchsuchen, die passenden Informationen finden und für jede Aufgabe bereitstellen kann. Neben lokalen Daten können Sie auch die Daten ihres Unternehmens einbinden. Dafür muss Ihr Unternehmen die Daten über eine ERI (External Retrieval Interface) bereitstellen." + +-- Select the data you want to use here. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T21181525"] = "Wählen Sie hier die Daten aus, die Sie verwenden möchten." + +-- Manage your data sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T2149927097"] = "Verwalten Sie ihre Datenquellen" + +-- Select data +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T274155039"] = "Daten auswählen" + +-- Read more about ERI +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3095532189"] = "Mehr über ERI erfahren" + +-- AI-based data source selection +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3100256862"] = "KI-basierte Datenauswahl" + +-- No, I don't want to use data sources. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3135725655"] = "Nein, ich möchte keine Datenquellen verwenden." + +-- Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3215374102"] = "Ihre Datenquellen können mit dem von Ihnen ausgewählten LLM-Anbieter aufgrund von Datenschutzbestimmungen nicht verwendet werden oder sind derzeit nicht verfügbar." + +-- No, I manually decide which data source to use. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3440789294"] = "Nein, ich wähle die Datenquelle manuell aus." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3448155331"] = "Schließen" + +-- The AI evaluates each of your inputs to determine whether and which data sources are necessary. Currently, the AI has not selected any source. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3574254516"] = "Die KI bewertet jede ihrer Eingaben, um zu bestimmen, ob und welche Datenquellen notwendig sind. Derzeit hat die KI keine Quelle ausgewählt." + +-- No, use all data retrieved from the data sources. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3751463241"] = "Nein, verwende alle Daten, die aus den Datenquellen abgerufen wurden." + +-- Are data sources enabled? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T396683085"] = "Sind Datenquellen aktiviert?" + +-- Manage Data Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T700666808"] = "Datenquellen verwalten" + +-- Available Data Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T86053874"] = "Verfügbare Datenquellen" + +-- Issues +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ISSUES::T3229841001"] = "Probleme" + +-- Given that my employer's workplace uses both Windows and Linux, I wanted a cross-platform solution that would work seamlessly across all major operating systems, including macOS. Additionally, I wanted to demonstrate that it is possible to create modern, efficient, cross-platform applications without resorting to Electron bloatware. The combination of .NET and Rust with Tauri proved to be an excellent technology stack for building such robust applications. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1057189794"] = "Da mein Arbeitgeber sowohl Windows als auch Linux am Arbeitsplatz nutzt, wollte ich eine plattformübergreifende Lösung, die nahtlos auf allen wichtigen Betriebssystemen, einschließlich macOS, funktioniert. Außerdem wollte ich zeigen, dass es möglich ist, moderne, effiziente und plattformübergreifende Anwendungen zu erstellen, ohne auf Software-Balast, wie z.B. das Electron-Framework, zurückzugreifen. Die Kombination aus .NET und Rust mit Tauri hat sich dabei als hervorragender Technologiestapel für den Bau solch robuster Anwendungen erwiesen." + +-- Limitations of Existing Solutions +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1086130692"] = "Einschränkungen bestehender Lösungen" + +-- Personal Needs and Limitations of Web Services +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1839655973"] = "Persönliche Bedürfnisse und Einschränkungen von Webdiensten" + +-- While exploring available solutions, I found a desktop application called Anything LLM. Unfortunately, it fell short of meeting my specific requirements and lacked the user interface design I envisioned. For macOS, there were several apps similar to what I had in mind, but they were all commercial solutions shrouded in uncertainty. The developers' identities and the origins of these apps were unclear, raising significant security concerns. Reports from users about stolen API keys and unwanted charges only amplified my reservations. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3552777197"] = "Während ich nach passenden Lösungen suchte, stieß ich auf eine Desktop-Anwendung namens Anything LLM. Leider konnte sie meine spezifischen Anforderungen nicht erfüllen und entsprach auch nicht dem Benutzeroberflächendesign, das ich mir vorgestellt hatte. Für macOS gab es zwar mehrere Apps, die meiner Vorstellung ähnelten, aber sie waren allesamt kostenpflichtige Lösungen mit unklarer Herkunft. Die Identität der Entwickler und die Ursprünge dieser Apps waren nicht ersichtlich, was erhebliche Sicherheitsbedenken hervorrief. Berichte von Nutzern über gestohlene API-Schlüssel und unerwünschte Abbuchungen verstärkten meine Bedenken zusätzlich." + +-- Hello, my name is Thorsten Sommer, and I am the initial creator of MindWork AI Studio. The motivation behind developing this app stems from several crucial needs and observations I made over time. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3569462457"] = "Hallo, mein Name ist Thorsten Sommer und ich bin der ursprüngliche Entwickler von MindWork AI Studio. Die Motivation zur Entwicklung dieser App entstand aus mehreren wichtigen Bedürfnissen und Beobachtungen, die ich im Laufe der Zeit gemacht habe." + +-- Through MindWork AI Studio, I aim to provide a secure, flexible, and user-friendly tool that caters to a wider audience without compromising on functionality or design. This app is the culmination of my desire to meet personal requirements, address existing gaps in the market, and showcase innovative development practices. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3622193740"] = "Mit MindWork AI Studio möchte ich ein sicheres, flexibles und benutzerfreundliches Werkzeug bereitstellen, das für ein breites Publikum geeignet ist, ohne Kompromisse bei Funktionalität oder Design einzugehen. Diese App ist das Ergebnis meines Wunsches, persönliche Anforderungen zu erfüllen, bestehende Lücken auf dem Markt zu schließen und innovative Entwicklungsmethoden zu präsentieren." + +-- Relying on web services like ChatGPT was not a sustainable solution for me. I needed an AI that could also access files directly on my device, a functionality web services inherently lack due to security and privacy constraints. Although I could have scripted something in Python to meet my needs, this approach was too cumbersome for daily use. More importantly, I wanted to develop a solution that anyone could use without needing any programming knowledge. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T372007989"] = "Sich auf Webdienste wie ChatGPT zu verlassen, war für mich keine nachhaltige Lösung. Ich brauchte eine KI, die auch direkt auf Dateien auf meinem Gerät zugreifen kann – eine Funktion, die Webdienste aus Sicherheits- und Datenschutzgründen grundsätzlich nicht bieten. Zwar hätte ich mir eine eigene Lösung in Python programmieren können, aber das wäre für den Alltag zu umständlich gewesen. Noch wichtiger war mir, eine Lösung zu entwickeln, die jeder nutzen kann, ganz ohne Programmierkenntnisse." + +-- Cross-Platform and Modern Development +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T843057510"] = "Plattformübergreifende und moderne Entwicklung" + +-- Alpha phase means that we are working on the last details before the beta phase. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWALPHA::T166807685"] = "Alpha-Phase bedeutet, dass wir an den letzten Details arbeiten, bevor die Beta-Phase beginnt." + +-- This feature is currently in the alpha phase. Expect bugs and unfinished work. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWALPHA::T2635524607"] = "Diese Funktion befindet sich derzeit in der Alpha-Phase. Es können Fehler und unfertige Elemente auftreten." + +-- Alpha +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWALPHA::T55079499"] = "Alpha" + +-- This feature is currently in the beta phase. It is still be possible that there are some bugs. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWBETA::T1045026949"] = "Diese Funktion befindet sich derzeit in der Beta-Phase. Es kann noch zu Fehlern kommen." + +-- Beta phase means that we are testing the feature. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWBETA::T3605158616"] = "Beta-Phase bedeutet, dass wir diese Funktion testen." + +-- Beta +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWBETA::T375487463"] = "Beta" + +-- This feature is currently in the experimental phase. Expect bugs, unfinished work, changes in future versions, and more. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWEXPERIMENTAL::T1735169242"] = "Dieses Feature befindet sich derzeit in der experimentellen Phase. Es kann zu Fehlern, unfertigen Funktionen, Änderungen in zukünftigen Versionen und Ähnlichem kommen." + +-- Experimental phase means that we have a vision for a feature but not a clear plan yet. We are still exploring the possibilities. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWEXPERIMENTAL::T3709099979"] = "Experimentelle Phase bedeutet, dass wir eine Vorstellung von einer Funktion haben, aber noch keinen klaren Plan. Wir erkunden derzeit noch die Möglichkeiten." + +-- Experimental +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWEXPERIMENTAL::T3729365343"] = "Experimentell" + +-- Prototype +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWPROTOTYPE::T1043365177"] = "Prototyp" + +-- Prototype phase means that we have a plan but we are still working on it. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWPROTOTYPE::T2995187557"] = "Die Prototypenphase bedeutet, dass wir einen Plan haben, aber noch daran arbeiten." + +-- This feature is currently in the prototype phase. Expect bugs, unfinished work, changes in future versions, and more. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWPROTOTYPE::T4145334644"] = "Diese Funktion befindet sich derzeit in der Prototypphase. Es können Fehler, unfertige Arbeiten, Änderungen in zukünftigen Versionen und anderes auftreten." + +-- This feature is about to be released. We think it's ready for production. There should be no more bugs. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T2003588956"] = "Diese Funktion wird in Kürze veröffentlicht. Wir halten sie für bereit zur Nutzung. Es sollten keine Fehler mehr auftreten." + +-- Release Candidate +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T3451939995"] = "Release-Kandidat" + +-- Release candidates are the final step before a feature is proven to be stable. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T696585888"] = "Release-Kandidaten sind der letzte Schritt, bevor eine Funktion als stabil gilt." + +-- Select one of your profiles +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILEFORMSELECTION::T2003449133"] = "Wählen Sie eines ihrer Profile aus" + +-- Open Profile Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILEFORMSELECTION::T3654011106"] = "Profil-Optionen öffnen" + +-- Manage your profiles +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILESELECTION::T3609533889"] = "Verwalten Sie ihre Profile" + +-- Open Profile Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILESELECTION::T3654011106"] = "Profil-Optionen öffnen" + +-- You can switch between your profiles here +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILESELECTION::T918741365"] = "Hier können Sie zwischen ihren Profilen wechseln." + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROVIDERSELECTION::T900237532"] = "Anbieter" + +-- Use PDF content as input +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READPDFCONTENT::T2849276709"] = "PDF-Inhalt als Eingabe verwenden" + +-- Select PDF file +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READPDFCONTENT::T63272795"] = "PDF-Datei auswählen" + +-- The content is cleaned using an LLM agent: the main content is extracted, advertisements and other irrelevant things are attempted to be removed; relative links are attempted to be converted into absolute links so that they can be used. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T1164201762"] = "Der Inhalt wird mithilfe eines LLM-Agents bereinigt: Der Hauptinhalt wird extrahiert, Werbung und andere irrelevante Elemente werden nach Möglichkeit entfernt. Relative Links werden nach Möglichkeit in absolute Links umgewandelt, damit sie verwendet werden können." + +-- Fetch +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T1396322691"] = "Abrufen" + +-- Please select a provider to use the cleanup agent. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2035652317"] = "Bitte wählen Sie einen Anbieter aus, um den Bereinigungsagenten zu verwenden." + +-- Please provide a URL to load the content from. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2235427807"] = "Bitte geben Sie eine URL an, von der der Inhalt geladen werden soll." + +-- Loads the content from your URL. Does not work when the content is hidden behind a paywall. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2672192696"] = "Lädt den Inhalt von der übergebenen URL. Funktioniert nicht, wenn der Inhalt hinter einer Paywall verborgen ist." + +-- URL from which to load the content +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2883163022"] = "URL, von der der Inhalt geladen werden soll" + +-- Read content from web? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2927391091"] = "Inhalte aus dem Internet lesen?" + +-- Cleanup content by using an LLM agent? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2939928117"] = "Inhalte mit einem LLM-Agenten bereinigen?" + +-- Hide web content options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T3031774728"] = "Web-Inhaltsoptionen ausblenden" + +-- Please provide a valid HTTP or HTTPS URL. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T307442288"] = "Bitte geben Sie eine gültige HTTP- oder HTTPS-URL ein." + +-- No content cleaning +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T3588401674"] = "Keine Inhaltsbereinigung" + +-- Please provide a valid URL. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T3825586228"] = "Bitte geben Sie eine gültige URL ein." + +-- Show web content options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T4249712357"] = "Web-Inhalte anzeigen" + +-- Hide content +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SECRETINPUTFIELD::T1273315904"] = "Inhalt ausblenden" + +-- Show content +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SECRETINPUTFIELD::T2891011873"] = "Inhalt anzeigen" + +-- Choose Directory +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SELECTDIRECTORY::T4256489763"] = "Verzeichnis auswählen" + +-- Choose File +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SELECTFILE::T4285779702"] = "Datei auswählen" + +-- When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T1297967572"] = "Wenn diese Option aktiviert ist, können Sie einige Agenten-Optionen vorauswählen. Das kann nützlich sein, wenn Sie ein bestimmtes LLM bevorzugen." + +-- Use Case: this agent is used to clean up text content. It extracts the main content, removes advertisements and other irrelevant things, and attempts to convert relative links into absolute links so that they can be used. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T1299550589"] = "Anwendungsfall: Dieser Agent wird verwendet, um Textinhalte zu bereinigen. Er extrahiert den Hauptinhalt, entfernt Werbung und andere irrelevante Elemente und versucht, relative Links in absolute Links umzuwandeln, damit diese verwendet werden können." + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T354528094"] = "Keine Optionen sind vorausgewählt" + +-- Preselect text content cleaner options? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T3659087305"] = "Textbereinigungs-Optionen vorauswählen?" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T3875604319"] = "Optionen sind vorausgewählt" + +-- When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T1297967572"] = "Wenn diese Option aktiviert ist, können Sie einige Agenten-Optionen vorauswählen. Das kann hilfreich sein, wenn Sie ein bestimmtes LLM bevorzugen." + +-- Use Case: this agent is used to select the appropriate data sources for the current prompt. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T2208143316"] = "Anwendungsfall: Dieser Assistent wird verwendet, um die passenden Datenquellen für die aktuelle Eingabe auszuwählen." + +-- Agent: Data Source Selection Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T2258031949"] = "Agent: Auswahlmöglichkeiten für Datenquellen" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T354528094"] = "Keine Optionen sind vorausgewählt" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T3875604319"] = "Optionen sind vorausgewählt" + +-- Preselect data source selection options? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T991598424"] = "Datenquellen-Auswahloptionen vorauswählen?" + +-- When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T1297967572"] = "Wenn diese Option aktiviert ist, können Sie einige Agenten-Optionen vorauswählen. Dies kann nützlich sein, wenn Sie ein bestimmtes LLM bevorzugen." + +-- Use Case: this agent is used to validate any retrieval context of any retrieval process. Perhaps there are many of these retrieval contexts and you want to validate them all. Therefore, you might want to use a cheap and fast LLM for this job. When using a local or self-hosted LLM, look for a small (e.g. 3B) and fast model. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T1326813386"] = "Anwendungsfall: Dieser Agent wird verwendet, um beliebige Abrufkontexte in jedem Abrufprozess zu validieren. Möglicherweise gibt es viele solcher Abrufkontexte, und Sie möchten sie alle überprüfen. Daher empfiehlt es sich, für diese Aufgabe ein günstiges und schnelles LLM zu verwenden. Wenn Sie ein lokales oder selbst gehostetes LLM nutzen, sollten Sie auf ein kleines (z. B. 3B) und schnelles Modell achten." + +-- The validation agent is enabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2274149855"] = "Der Validierungs-Agent ist aktiviert" + +-- Enable the retrieval context validation agent? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2663872937"] = "Den Validierungs-Agenten für den Abrufkontext aktivieren?" + +-- Preselect retrieval context validation options? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2663938643"] = "Vorauswahl der Optionen zur Überprüfung des Abrufkontexts?" + +-- agents +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2669785679"] = "Agenten" + +-- When enabled, the retrieval context validation agent will check each retrieval context of any retrieval process, whether a context makes sense for the given prompt. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T298440039"] = "Wenn aktiviert, prüft der Validierungs-Agent für Abrufkontexte bei jedem Abrufprozess, ob der jeweilige Kontext zum eingegebenen Prompt passt." + +-- How many validation agents should work simultaneously? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T3431541788"] = "Wie viele Validierungs-Agenten sollten gleichzeitig arbeiten?" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T354528094"] = "Keine Optionen sind vorausgewählt" + +-- More active agents also mean that a corresponding number of requests are made simultaneously. Some providers limit the number of requests per minute. When you are unsure, choose a low setting between 1 to 6 agents. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T3819544890"] = "Mehr aktive Agenten bedeuten auch, dass entsprechend viele Anfragen gleichzeitig gestellt werden. Einige Anbieter begrenzen die Anzahl der Anfragen pro Minute. Wenn Sie unsicher sind, wählen Sie eine niedrige Einstellung zwischen 1 und 6 Agenten." + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T3875604319"] = "Optionen sind vorausgewählt" + +-- Agent: Retrieval Context Validation Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T928989804"] = "Agent: Optionen zur Überprüfung des Abruf-Kontexts" + +-- No validation is performed +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T95175095"] = "Es findet keine Überprüfung statt" + +-- Spellchecking is disabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1059411425"] = "Rechtschreibprüfung ist deaktiviert" + +-- Do you want to show preview features in the app? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1118505044"] = "Möchten Sie Vorschaufunktionen in der App anzeigen lassen?" + +-- How often should we check for app updates? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1364944735"] = "Wie oft sollen wir nach App-Updates suchen?" + +-- Select preview features +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1439783084"] = "Vorschaufunktionen auswählen" + +-- Select the desired behavior for the navigation bar. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1555038969"] = "Wählen Sie das gewünschte Verhalten für die Navigationsleiste aus." + +-- Color theme +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1599198973"] = "Farbschema" + +-- Would you like to set one of your profiles as the default for the entire app? When you configure a different profile for an assistant, it will always take precedence. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1666052109"] = "Möchten Sie eines ihrer Profile als Standard für die gesamte App festlegen? Wenn Sie einem Assistenten ein anderes Profil zuweisen, hat dieses immer Vorrang." + +-- Select the language behavior for the app. The default is to use the system language. You might want to choose a language manually? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T186780842"] = "Wählen Sie das Sprachverhalten für die App aus. Standardmäßig wird die Systemsprache verwendet. Möchten Sie die Sprache manuell einstellen?" + +-- Check for updates +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1890416390"] = "Nach Updates suchen" + +-- Which preview features would you like to enable? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1898060643"] = "Welche Vorschaufunktionen möchten Sie aktivieren?" + +-- Select the language for the app. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1907446663"] = "Wählen Sie die Sprache für die App aus." + +-- Language behavior +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2341504363"] = "Sprachverhalten" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591284123"] = "Sprache" + +-- Save energy? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3100928009"] = "Energie sparen?" + +-- Spellchecking is enabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3165555978"] = "Rechtschreibprüfung ist aktiviert" + +-- App Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3577148634"] = "App-Einstellungen" + +-- When enabled, streamed content from the AI is updated once every third second. When disabled, streamed content will be updated as soon as it is available. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3652888444"] = "Wenn aktiviert, wird gestreamter Inhalt von der KI alle drei Sekunden aktualisiert. Wenn deaktiviert, wird gestreamter Inhalt sofort aktualisiert, sobald er verfügbar ist." + +-- Enable spellchecking? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3914529369"] = "Rechtschreibprüfung aktivieren?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T4004501229"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- When enabled, spellchecking will be active in all input fields. Depending on your operating system, errors may not be visually highlighted, but right-clicking may still offer possible corrections. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T4067492921"] = "Wenn aktiviert, ist die Rechtschreibprüfung in allen Eingabefeldern aktiv. Je nach Betriebssystem werden Fehler möglicherweise nicht visuell hervorgehoben, aber ein Rechtsklick kann dennoch Korrekturvorschläge anzeigen." + +-- Navigation bar behavior +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T602293588"] = "Verhalten der Navigationsleiste" + +-- Choose the color theme that best suits for you. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T654667432"] = "Wählen Sie das Farbschema, das am besten zu Ihnen passt." + +-- Energy saving is enabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T71162186"] = "Energiesparmodus ist aktiviert" + +-- Energy saving is disabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T716338721"] = "Energiesparmodus ist deaktiviert" + +-- Preview feature visibility +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T817101267"] = "Sichtbarkeit der Vorschaufunktion" + +-- Would you like to set one provider as the default for the entire app? When you configure a different provider for an assistant, it will always take precedence. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T844514734"] = "Möchten Sie einen Anbieter als Standard für die gesamte App festlegen? Wenn Sie einen anderen Anbieter für einen Assistenten konfigurieren, hat dieser immer Vorrang." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T1469573738"] = "Löschen" + +-- Add Embedding +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T1738753945"] = "Einbettung hinzufügen" + +-- Are you sure you want to delete the embedding provider '{0}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T1825371968"] = "Sind Sie sicher, dass Sie den Einbettungsanbieter '{0}' löschen möchten?" + +-- Add Embedding Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T190634634"] = "Einbettungsanbieter hinzufügen" + +-- Model +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T2189814010"] = "Modell" + +-- Embeddings are a way to represent words, sentences, entire documents, or even images and videos as digital fingerprints. Just like each person has a unique fingerprint, embedding models create unique digital patterns that capture the meaning and characteristics of the content they analyze. When two things are similar in meaning or content, their digital fingerprints will look very similar. For example, the fingerprints for 'happy' and 'joyful' would be more alike than those for 'happy' and 'sad'. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T2419962612"] = "Einbettungen sind eine Methode, um Wörter, Sätze, ganze Dokumente oder sogar Bilder und Videos als digitale Fingerabdrücke darzustellen. So wie jeder Mensch einen einzigartigen Fingerabdruck hat, erzeugen Einbetttungs-Modelle einzigartige digitale Muster, die die Bedeutung und Eigenschaften der von ihnen analysierten Inhalte erfassen. Wenn zwei Dinge sich in ihrer Bedeutung oder ihrem Inhalt ähneln, sehen auch ihre digitalen Fingerabdrücke sehr ähnlich aus. Zum Beispiel wären die Fingerabdrücke für „glücklich“ und „freudig“ einander ähnlicher als die für „glücklich“ und „traurig“." + +-- Name +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T266367750"] = "Name" + +-- This helps AI Studio understand and compare things in a way that's similar to how humans do. When you're working on something, AI Studio can automatically identify related documents and data by comparing their digital fingerprints. For instance, if you're writing about customer service, AI Studio can instantly find other documents in your data that discuss similar topics or experiences, even if they use different words. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3251217940"] = "Dies hilft AI Studio, Dinge auf eine Art und Weise zu verstehen und zu vergleichen, die der menschlichen Denkweise ähnelt. Wenn Sie an etwas arbeiten, kann AI Studio automatisch verwandte Dokumente und Daten erkennen, indem es ihre digitalen Fingerabdrücke vergleicht. Wenn Sie zum Beispiel über Kundenservice schreiben, kann AI Studio sofort andere Dokumente in ihren Daten finden, die über ähnliche Themen oder Erfahrungen sprechen – selbst wenn sie andere Begriffe verwenden." + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3267849393"] = "Bearbeiten" + +-- Configured Embeddings +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3526613453"] = "Konfigurierte Einbettungen" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3865031940"] = "Aktionen" + +-- No embeddings configured yet. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T4068015588"] = "Es wurden bislang keine Einbettungen konfiguriert." + +-- Edit Embedding Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T4264602229"] = "Einbettungsanbieter bearbeiten" + +-- Delete Embedding Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T511304264"] = "Einbettungsanbieter löschen" + +-- Open Dashboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T78223861"] = "Dashboard öffnen" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T900237532"] = "Anbieter" + +-- Configure Embeddings +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T970042679"] = "Einbettungen konfigurieren" + +-- Show provider's confidence level? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1052533048"] = "Anzeigen, wie sicher sich der Anbieter ist?" + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1469573738"] = "Löschen" + +-- When enabled, we show you the confidence level for the selected provider in the app. This helps you assess where you are sending your data at any time. Example: are you currently working with sensitive data? Then choose a particularly trustworthy provider, etc. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1505516304"] = "Wenn diese Option aktiviert ist, zeigen wir Ihnen das Vertrauensniveau des ausgewählten Anbieters in der App an. So können Sie jederzeit einschätzen, wohin ihre Daten gesendet werden. Beispiel: Arbeiten Sie gerade mit sensiblen Daten? Dann wählen Sie einen besonders vertrauenswürdigen Anbieter usw." + +-- No, please hide the confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1628475119"] = "Nein, bitte verbergen Sie das Vertrauensniveau." + +-- Description +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1725856265"] = "Beschreibung" + +-- Add Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1806589097"] = "Anbieter hinzufügen" + +-- Edit LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1868766523"] = "LLM-Anbieter bearbeiten" + +-- Are you sure you want to delete the provider '{0}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2031310917"] = "Möchten Sie den Anbieter „{0}“ wirklich löschen?" + +-- Do you want to always be able to recognize how trustworthy your LLM providers are? This way, you keep control over which provider you send your data to. You have two options for this: Either you choose a common schema, or you configure the trust levels for each LLM provider yourself. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2082904277"] = "Möchten Sie immer erkennen können, wie vertrauenswürdig ihre LLM-Anbieter sind? So behalten Sie die Kontrolle darüber, an welchen Anbieter Sie ihre Daten senden. Dafür haben Sie zwei Möglichkeiten: Entweder wählen Sie ein vorkonfiguriertes Schema, oder Sie konfigurieren die Vertrauensstufen für jeden LLM-Anbieter selbst." + +-- Model +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2189814010"] = "Modell" + +-- Choose the scheme that best suits you and your life. Do you trust any western provider? Or only providers from the USA or exclusively European providers? Then choose the appropriate scheme. Alternatively, you can assign the confidence levels to each provider yourself. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2283885378"] = "Wählen Sie das Schema, das am besten zu Ihnen und ihren Umständen passt. Vertrauen Sie einem westlichen Anbieter? Oder nur Anbietern aus den USA oder ausschließlich europäischen Anbietern? Dann wählen Sie das passende Schema aus. Alternativ können Sie auch die Vertrauensstufen für jeden Anbieter eigenständig festlegen." + +-- LLM Provider Confidence +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2349972795"] = "Vertrauenswürdigkeit in LLM-Anbieter" + +-- What we call a provider is the combination of an LLM provider such as OpenAI and a model like GPT-4o. You can configure as many providers as you want. This way, you can use the appropriate model for each task. As an LLM provider, you can also choose local providers. However, to use this app, you must configure at least one provider. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2460361126"] = "Was wir als „Anbieter“ bezeichnen, ist die Kombination aus einem LLM-Anbieter wie OpenAI und einem Modell wie GPT-4o. Sie können beliebig viele Anbieter einrichten. So können Sie für jede Aufgabe das passende Modell nutzen. Als LLM-Anbieter können Sie auch lokale Anbieter auswählen. Um diese App zu verwenden, müssen Sie jedoch mindestens einen Anbieter konfigurieren." + +-- Confidence Level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2492230131"] = "Vertrauensniveau" + +-- When enabled, you can enforce a minimum confidence level for all LLM providers. This way, you can ensure that only trustworthy providers are used. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T281063702"] = "Wenn aktiviert, können Sie ein minimales Vertrauensniveau für alle LLM-Anbieter festlegen. So stellen Sie sicher, dass nur vertrauenswürdige Anbieter verwendet werden." + +-- Instance Name +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2842060373"] = "Instanzname" + +-- No providers configured yet. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2911731076"] = "Noch keine Anbieter konfiguriert." + +-- Configure Providers +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3027859089"] = "Anbieter konfigurieren" + +-- as selected by provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3082210376"] = "wie vom Anbieter ausgewählt" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3267849393"] = "Bearbeiten" + +-- Couldn't delete the provider '{0}'. The issue: {1}. We can ignore this issue and delete the provider anyway. Do you want to ignore it and delete this provider? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3313715309"] = "Der Anbieter „{0}“ konnte nicht gelöscht werden. Das Problem: {1}. Sie können dieses Problem ignorieren und den Anbieter trotzdem löschen. Möchten Sie das Problem ignorieren und diesen Anbieter löschen?" + +-- Add LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3346433704"] = "LLM-Anbieter hinzufügen" + +-- LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3612415205"] = "LLM-Anbieter" + +-- No, do not enforce a minimum confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3642102079"] = "Nein, kein Mindestvertrauensniveau erzwingen" + +-- Configured Providers +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3850871263"] = "Konfigurierte Anbieter" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3865031940"] = "Aktionen" + +-- Select a confidence scheme +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T4144206465"] = "Wählen Sie ein Vertrauensschema aus" + +-- Do you want to enforce an app-wide minimum confidence level? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T4258968041"] = "Möchten Sie ein appweites Mindestvertrauensniveau festlegen?" + +-- Delete LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T4269256234"] = "LLM-Anbieter löschen" + +-- Yes, enforce a minimum confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T458854917"] = "Ja, ein Mindestvertrauensniveau erzwingen" + +-- Not yet configured +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T48051324"] = "Noch nicht konfiguriert" + +-- Open Dashboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T78223861"] = "Dashboard öffnen" + +-- Yes, show me the confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T853225204"] = "Ja, zeige mir das Vertrauensniveau" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T900237532"] = "Anbieter" + +-- Copy {0} to the clipboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::TEXTINFOLINE::T2206391442"] = "Kopiere {0} in die Zwischenablage" + +-- Copy {0} to the clipboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::TEXTINFOLINES::T2206391442"] = "{0} in die Zwischenablage kopieren" + +-- Open the repository or website +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::THIRDPARTYCOMPONENT::T1392042694"] = "Repository oder Website öffnen" + +-- License: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::THIRDPARTYCOMPONENT::T1908172666"] = "Lizenz:" + +-- You'll interact with the AI systems using your voice. To achieve this, we want to integrate voice input (speech-to-text) and output (text-to-speech). However, later on, it should also have a natural conversation flow, i.e., seamless conversation. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1015366320"] = "Sie werden mit den KI-Systemen über ihre Stimme interagieren. Dafür möchten wir Spracheingabe (Sprache-zu-Text) und Sprachausgabe (Text-zu-Sprache) integrieren. Später soll außerdem ein natürlicher Gesprächsfluss möglich sein, also eine nahtlose Unterhaltung." + +-- We hope this vision excites you as much as it excites us. Together, let's build a powerful and flexible AI toolkit to support all your creative, professional, and everyday needs with MindWork AI Studio. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1061000046"] = "Wir hoffen, dass diese Vision Sie genauso begeistert wie uns. Lassen Sie uns gemeinsam mit MindWork AI Studio ein leistungsstarkes und flexibles KI-Werkzeug schaffen, das Sie bei all ihren kreativen, beruflichen und alltäglichen Aufgaben unterstützt." + +-- Integration of enterprise data +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1127694951"] = "Integration von Unternehmensdaten" + +-- Meet your needs +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T127032776"] = "Entspricht ihren Bedürfnissen" + +-- We're integrating a writing mode to help you create extensive works, like comprehensive project proposals, tenders, or your next fantasy novel. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1457213518"] = "Wir integrieren einen Schreibmodus, der Ihnen dabei hilft, umfangreiche Werke zu erstellen – zum Beispiel ausführliche Projektvorschläge, Ausschreibungen oder ihren nächsten Fantasyroman." + +-- Email monitoring +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1520989255"] = "E-Mail-Überwachung" + +-- You'll be able to integrate your data into AI Studio, like your PDF or Office files, or your Markdown notes. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1648606751"] = "Sie können ihre Daten in AI Studio integrieren, zum Beispiel ihre PDF- oder Office-Dateien oder ihre Markdown-Notizen." + +-- It will soon be possible to integrate data from the corporate network using a specified interface (External Retrieval Interface, ERI for short). This will likely require development work by the organization in question. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1926587044"] = "Bald wird es möglich sein, Daten aus dem Firmennetzwerk über eine festgelegte Schnittstelle (External Retrieval Interface, kurz ERI) zu integrieren. Dafür wird voraussichtlich Entwicklungsaufwand seitens der jeweiligen Organisation nötig sein." + +-- Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2144737937"] = "Was auch immer ihr Beruf oder ihre Aufgabe ist, MindWork AI Studio möchte ihre Bedürfnisse erfüllen: Egal, ob Sie Projektmanager, Wissenschaftler, Künstler, Autor, Softwareentwickler oder Spieleentwickler sind." + +-- You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2289234741"] = "Sie können ihre E-Mail-Postfächer mit AI Studio verbinden. Die KI liest ihre E-Mails und benachrichtigt Sie über wichtige Ereignisse. Außerdem haben Sie in ihren Chats Zugriff auf das Wissen aus ihren E-Mails." + +-- Browser usage +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2345974992"] = "Browser-Nutzung" + +-- Integrating your data +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2416595938"] = "Integration ihrer Daten" + +-- Curious about the vision for MindWork AI Studio and what the future holds? We're here to address just that. Remember, this is a free, open-source project, meaning we can't guarantee when or if this vision will be fully realized. Our aim is to share our vision with you to help you decide whether this app is right for you. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2491403346"] = "Neugierig auf die Vision von MindWork AI Studio und darauf, was die Zukunft bringt? Genau darauf möchten wir eingehen. Bitte denken Sie daran, dass dies ein kostenloses Open-Source-Projekt ist. Das bedeutet, wir können nicht garantieren, wann oder ob diese Vision vollständig umgesetzt wird. Unser Ziel ist es, Ihnen unsere Vision zu vermitteln, damit Sie entscheiden können, ob diese App das Richtige für Sie ist." + +-- Voice control +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2827242540"] = "Sprachsteuerung" + +-- Specific requirements +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2868740431"] = "Spezifische Anforderungen" + +-- We'll develop more assistants for everyday tasks. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2899555955"] = "Wir werden weitere Assistenten für alltägliche Aufgaben entwickeln." + +-- We're working on offering AI Studio features in your browser via a plugin, allowing, e.g., for spell-checking or text rewriting directly in the browser. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T308543246"] = "Wir arbeiten daran, die Funktionen von AI Studio über ein Plugin auch in ihrem Browser anzubieten. So können Sie zum Beispiel direkt im Browser Rechtschreibprüfungen durchführen oder Texte umschreiben lassen." + +-- There will be an interface for AI Studio to create content in other apps. You could, for example, create blog posts directly on the target platform or add entries to an internal knowledge management tool. This requires development work by the tool developers. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T3290746961"] = "Es wird eine Schnittstelle für AI Studio geben, um Inhalte in anderen Apps zu erstellen. So könnten Sie zum Beispiel Blogbeiträge direkt auf der Zielplattform verfassen oder Einträge zu einem internen Wissensmanagement-Tool hinzufügen. Dafür ist Entwicklungsarbeit durch die jeweiligen Tool-Entwickler erforderlich." + +-- Want an assistant that suits your specific needs? We aim to offer a plugin architecture so organizations and enthusiasts can implement such ideas. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T3440464089"] = "Sie möchten einen Assistenten, der genau auf ihre Bedürfnisse zugeschnitten ist? Wir planen, eine Plugin-Architektur anzubieten, damit Organisationen und Interessierte solche Ideen umsetzen können." + +-- Writing mode +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T3640675146"] = "Schreibmodus" + +-- So, where are we headed, and how could the app evolve in the coming months and years? The following list outlines our ideas, though not in order of priority: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T4106960135"] = "Wohin geht die Reise, und wie könnte sich die App in den kommenden Monaten und Jahren weiterentwickeln? Die folgende Liste stellt unsere Ideen vor, allerdings ohne Priorisierung:" + +-- Content creation +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T428040679"] = "Erstellung von Inhalten" + +-- Useful assistants +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T586430036"] = "Nützliche Assistenten" + +-- Are you sure you want to delete the chat '{0}' in the workspace '{1}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1016188706"] = "Möchten Sie den Chat „{0}“ im Arbeitsbereich „{1}“ wirklich löschen?" + +-- Move chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1133040906"] = "Chat verschieben" + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1469573738"] = "Löschen" + +-- Rename Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1474303418"] = "Arbeitsbereich umbenennen" + +-- Rename Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T156144855"] = "Chat umbenennen" + +-- Add workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1586005241"] = "Arbeitsbereich hinzufügen" + +-- Add chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1874060138"] = "Chat hinzufügen" + +-- Create Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1939006681"] = "Chat erstellen" + +-- Please name your workspace: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T201482774"] = "Bitte benennen Sie ihren Arbeitsbereich:" + +-- Are you sure you want to load another chat? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2133593288"] = "Möchten Sie wirklich einen anderen Chat laden? Alle ungespeicherten Änderungen gehen dabei verloren." + +-- Are you sure you want to delete the workspace '{0}'? This will also delete {1} chat(s) in this workspace. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2151341762"] = "Möchten Sie den Arbeitsbereich „{0}“ wirklich löschen? Dadurch werden auch {1} Chat(s) in diesem Arbeitsbereich gelöscht." + +-- Are you sure you want to create a another chat? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2237618267"] = "Möchten Sie wirklich einen neuen Chat erstellen? Alle nicht gespeicherten Änderungen gehen verloren." + +-- Delete Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2244038752"] = "Chat löschen" + +-- Move to workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2509305748"] = "In einen Arbeitsbereich verschieben" + +-- Are you sure you want to delete the chat '{0}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3043761007"] = "Sind Sie sicher, dass Sie den Chat „{0}“ löschen möchten?" + +-- Move Chat to Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3045856778"] = "Chat in den Arbeitsbereich verschieben" + +-- Please enter a new or edit the name for your workspace '{0}': +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T323280982"] = "Bitte geben Sie einen neuen Namen für ihren Arbeitsbereich „{0}“ ein oder bearbeiten Sie ihn:" + +-- Rename +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3355849203"] = "Umbenennen" + +-- Please enter a new or edit the name for your chat '{0}': +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3419791373"] = "Bitte geben Sie einen neuen Namen für ihren Chat „{0}“ ein oder bearbeiten Sie ihn:" + +-- Load Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3555709365"] = "Chat laden" + +-- Add Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3672981145"] = "Arbeitsbereich hinzufügen" + +-- Empty chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T4019509364"] = "Leerer Chat" + +-- Workspaces +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T4048389951"] = "Arbeitsbereiche" + +-- Disappearing Chats +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T4201703117"] = "Selbstlöschende Chats" + +-- Please select the workspace where you want to move the chat to. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T474393241"] = "Bitte wählen Sie den Arbeitsbereich aus, in den Sie den Chat verschieben möchten." + +-- Delete Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T701874671"] = "Arbeitsbereich löschen" + +-- Only text content is supported in the editing mode yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1352914344"] = "Im Bearbeitungsmodus wird bisher nur Textinhalt unterstützt." + +-- Please enter a message for the example conversation. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1362948628"] = "Bitte gib eine Nachricht für die Beispiel-Konversation ein." + +-- The chat template name must be unique; the chosen name is already in use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1396308587"] = "Der Name der Chat-Vorlage muss eindeutig sein; der gewählte Name wird bereits verwendet." + +-- Please enter a name for the chat template. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1548747185"] = "Bitte geben Sie einen Namen für die Chat-Vorlage ein." + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1847791252"] = "Aktualisieren" + +-- The chat template name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T204496403"] = "Der Name der Chat-Vorlage darf maximal 40 Zeichen lang sein." + +-- Add messages of an example conversation (user prompt followed by assistant prompt) to demonstrate the desired interaction pattern. These examples help the AI understand your expectations by showing it the correct format, style, and content of responses before it receives actual user inputs. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2292424657"] = "Fügen Sie Nachrichten einer Beispiel-Konversation hinzu (Nutzereingabe, gefolgt von einer Antwort des Assistenten), um das gewünschte Interaktionsmuster zu demonstrieren. Diese Beispiele helfen der KI, ihre Erwartungen zu verstehen, indem Sie das korrekte Format, den Stil und den Inhalt von Antworten zeigen, bevor tatsächliche Nutzereingaben erfolgen." + +-- Role +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2418769465"] = "Rolle" + +-- Tell the AI your system prompt. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2552381261"] = "Teilen Sie der KI einen System-Prompt mit." + +-- No, prohibit profile use for this template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2579080722"] = "Nein, die Profilnutzung für diese Vorlage verbieten" + +-- Entry +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2629823795"] = "Eintrag" + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2646845972"] = "Hinzufügen" + +-- The message +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2719480499"] = "Die Nachricht" + +-- Chat Template Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T275026390"] = "Name der Chat-Vorlage" + +-- Commit Changes +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2996302517"] = "Änderungen übernehmen" + +-- The name of the chat template is mandatory. Each chat template must have a unique name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3016903701"] = "Der Name der Chat-Vorlage ist erforderlich. Jede Chat-Vorlage muss einen eindeutigen Namen haben." + +-- Image content +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3094908719"] = "Bildinhalt" + +-- Are you unsure which system prompt to use? You might start with the default system prompt that AI Studio uses for all chats. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3127437308"] = "Sind Sie unsicher, welchen System-Prompt Sie verwenden sollen? Sie können mit dem Standard-System-Prompt beginnen, den AI Studio für alle Chats verwendet." + +-- Using some chat templates in tandem with profiles might cause issues. Therefore, you might prohibit the usage of profiles here. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3227981830"] = "Die gleichzeitige Verwendung einiger Chat-Vorlagen mit Profilen kann zu Problemen führen. Deshalb könnten Sie hier die Nutzung von Profilen untersagen." + +-- Add a message +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3372872324"] = "Nachricht hinzufügen" + +-- Unsupported content type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3570316759"] = "Nicht unterstützter Inhaltstyp" + +-- What system prompt do you want to use? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3652587353"] = "Welchen System-Prompt möchten Sie verwenden?" + +-- Yes, allow profiles when using this template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3675108201"] = "Ja, Profile bei Verwendung dieser Vorlage zulassen" + +-- Add a new message below +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3757779731"] = "Neue Nachricht unten hinzufügen" + +-- Example Conversation +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T380891852"] = "Beispiel-Konversation" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3865031940"] = "Aktionen" + +-- Messages per page +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3893704289"] = "Nachrichten pro Seite" + +-- Use the default system prompt +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T4051106111"] = "Verwenden Sie den Standard-System-Prompt" + +-- Create your custom chat template to tailor the LLM's behavior for specific tasks or domains. Define a custom system prompt and provide an example conversation to design an AI experience perfectly suited to your requirements. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T4199560726"] = "Erstellen Sie ihre eigene Chat-Vorlage, um das Verhalten des LLMs für bestimmte Aufgaben oder Bereiche anzupassen. Definieren Sie einen individuellen System-Prompt und geben Sie eine Beispiel-Konversation vor, um eine KI-Erfahrung zu gestalten, die genau auf ihre Anforderungen zugeschnitten ist." + +-- Enter a message +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T446374405"] = "Nachricht eingeben" + +-- System Prompt +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T628396066"] = "System-Prompt" + +-- Allow the use of profiles together with this chat template? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T823785464"] = "Erlauben Sie die Verwendung von Profilen zusammen mit dieser Chat-Vorlage?" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T900713019"] = "Abbrechen" + +-- No +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CONFIRMDIALOG::T1642511898"] = "Nein" + +-- Yes +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CONFIRMDIALOG::T3013883440"] = "Ja" + +-- How many matches do you want at most per query? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T1827669611"] = "Wie viele Treffer möchten Sie maximal pro Abfrage erhalten?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T1847791252"] = "Aktualisieren" + +-- Failed to connect to the ERI v1 server. The message was: {0} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2150703468"] = "Verbindung zum ERI v1-Server fehlgeschlagen. Die Meldung war: {0}" + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2646845972"] = "Hinzufügen" + +-- Failed to store the auth. secret in the operating system. The message was: {0}. Please try again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2772567701"] = "Das Authentifizierungsgeheimnis konnte nicht im Betriebssystem gespeichert werden. Die Meldung war: {0}. Bitte versuchen Sie es erneut." + +-- Connection successful. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T279774933"] = "Verbindung erfolgreich." + +-- Access Token +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2891154022"] = "Zugangstoken" + +-- Secret +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2895110961"] = "Geheimnis" + +-- Select one retrieval process +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2916077548"] = "Wählen Sie einen Abrufprozess aus" + +-- Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T299279954"] = "Bitte beachten Sie: Die Verbindung zum ERI v1-Server ist nicht verschlüsselt. Das bedeutet, dass alle an den Server gesendeten Daten im Klartext übertragen werden. Bitte wenden Sie sich an den Administrator des ERI-Servers und bitten Sie ihn, die Verschlüsselung zu aktivieren." + +-- ERI v1 Server Hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T3494933602"] = "ERI v1 Server-Hostname" + +-- Port +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T3804576966"] = "Port" + +-- Connection failed. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T3820825672"] = "Verbindung fehlgeschlagen." + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T4081226330"] = "Ihre Sicherheitsrichtlinie" + +-- Not tested yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T417002657"] = "Noch nicht getestet." + +-- Failed to connect to the ERI v1 server. The server is not supported. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T449168182"] = "Verbindung zum ERI v1-Server fehlgeschlagen. Der Server wird nicht unterstützt." + +-- Username +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T470340825"] = "Benutzername" + +-- Password +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T750979128"] = "Passwort" + +-- Data Source Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T813773421"] = "Name der Datenquelle" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T900713019"] = "Abbrechen" + +-- Test connection & read available metadata +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T988671749"] = "Verbindung testen & verfügbare Metadaten auslesen" + +-- the ERI server port +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T103013936"] = "den ERI-Server-Port" + +-- Unnamed retrieval process +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1038776502"] = "Unbenannter Abrufprozess" + +-- the retrieval parameters +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1497074068"] = "die Abrufparameter" + +-- [{0}] Unnamed retrieval process +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1501892586"] = "[{0}] Unbenannter Abrufprozess" + +-- the embedding type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T16293243"] = "den Einbettungstyp" + +-- the embedding description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1657824119"] = "die Einbettungsbeschreibung" + +-- Data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T171124909"] = "Name der Datenquelle" + +-- Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1725856265"] = "Beschreibung" + +-- the retrieval description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1752127658"] = "die Abruf-Beschreibung" + +-- Security requirements of the data provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1891090932"] = "Sicherheitsanforderungen des Datenanbieters" + +-- Parameter: +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1917353274"] = "Parameter:" + +-- the server description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1966565081"] = "Die Serverbeschreibung" + +-- Failed to connect to the ERI v1 server. The message was: {0} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2150703468"] = "Verbindung zum ERI v1-Server fehlgeschlagen. Die Meldung war: {0}" + +-- ERI server hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T215899701"] = "ERI-Server-Hostname" + +-- the maximum number of matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2479753122"] = "die maximale Anzahl an Treffern pro Abfrage" + +-- Server description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2562330120"] = "Serverbeschreibung" + +-- the data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2717738728"] = "den Namen der Datenquelle" + +-- the ERI server hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2753279450"] = "den Hostnamen des ERI-Servers" + +-- This retrieval process has no parameters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2863339893"] = "Dieser Abrufprozess hat keine Parameter." + +-- your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2879113658"] = "Ihre Sicherheitsrichtlinie" + +-- Maximum matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2889706179"] = "Maximale Treffer pro Abfrage" + +-- Open web link, show more information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2968752071"] = "Weblink öffnen & mehr Informationen anzeigen" + +-- the username +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2991677780"] = "den Benutzernamen" + +-- Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T299279954"] = "Bitte beachten Sie: Die Verbindung zum ERI v1-Server ist nicht verschlüsselt. Das bedeutet, dass alle an den Server gesendeten Daten im Klartext übertragen werden. Bitten Sie den Administrator des ERI-Servers, die Verschlüsselung zu aktivieren." + +-- The data source does not provide any retrieval information. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T306340560"] = "Die Datenquelle stellt keine Abrufinformationen bereit." + +-- Common data source information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3206517471"] = "Allgemeine Informationen zur Datenquelle" + +-- when is the embedding used +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3259327370"] = "Wann wird diese Einbettung verwendet?" + +-- The data source does not provide any embedding information. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3425007227"] = "Die Datenquelle stellt keine Einbettungsinformationen zur Verfügung." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3448155331"] = "Schließen" + +-- ERI server port +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3843835535"] = "ERI-Server-Port" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T4081226330"] = "Ihre Sicherheitsrichtlinie" + +-- Reload +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T440640172"] = "Neu laden" + +-- Failed to connect to the ERI v1 server. The server is not supported. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T449168182"] = "Verbindung zum ERI v1-Server fehlgeschlagen. Der Server wird nicht unterstützt." + +-- Username +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T470340825"] = "Benutzername" + +-- the security requirements of the data provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T503852885"] = "Die Sicherheitsanforderungen des Datenanbieters" + +-- When to use +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T629595477"] = "Wann verwenden" + +-- Retrieval information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T742006305"] = "Abrufinformationen" + +-- Embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T951463987"] = "Einbettungen" + +-- Select a root directory for this data source. All data in this directory and all its subdirectories will be processed for this data source. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1265737624"] = "Wählen Sie ein Stammverzeichnis für diese Datenquelle aus. Alle Daten in diesem Verzeichnis und in allen Unterverzeichnissen werden für diese Datenquelle verarbeitet." + +-- Selected base directory for this data source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1312296210"] = "Ausgewähltes Stammverzeichnis für diese Datenquelle" + +-- How many matches do you want at most per query? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1827669611"] = "Wie viele Treffer möchten Sie maximal pro Abfrage erhalten?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1847791252"] = "Aktualisieren" + +-- Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1922618794"] = "Bitte beachten Sie: Die von Ihnen ausgewählte Einbettung läuft in der Cloud. Alle ihre Daten werden in die Cloud gesendet. Bitte bestätigen Sie, dass Sie dies gelesen und verstanden haben." + +-- In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1948697886"] = "Damit die KI jederzeit die passenden Daten ermitteln kann, müssen Sie eine Einbettungsmethode auswählen." + +-- Please note: the embedding you selected runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2403121734"] = "Bitte beachten Sie: Die von Ihnen ausgewählte Einbettung wird in der Cloud ausgeführt. Alle ihre Daten aus dem Ordner „{0}“ sowie aus allen Unterordnern werden in die Cloud gesendet. Bitte bestätigen Sie, dass Sie dies gelesen und verstanden haben." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2646845972"] = "Hinzufügen" + +-- The embedding you selected runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2814869210"] = "Die von Ihnen ausgewählte Einbettung läuft lokal oder innerhalb ihrer Organisation. Ihre Daten werden nicht in die Cloud übertragen." + +-- Embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2838542994"] = "Einbettung" + +-- Yes, please send my data to the cloud +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T3572613009"] = "Ja, bitte senden Sie meine Daten in die Cloud" + +-- I confirm that I have read and understood the above +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T3683380716"] = "Ich bestätige, dass ich das oben Genannte gelesen und verstanden habe" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T4081226330"] = "Ihre Sicherheitsrichtlinie" + +-- No, I will chose another embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T4253147533"] = "Nein, ich wähle eine andere Einbettung aus" + +-- Select the base directory +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T562479068"] = "Wählen Sie das Stammverzeichnis aus" + +-- Data Source Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T813773421"] = "Name der Datenquelle" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T900713019"] = "Abbrechen" + +-- the total directory size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1082241458"] = "die Gesamtgröße des Verzeichnisses" + +-- Total directory size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1101400963"] = "Gesamte Verzeichnisgröße" + +-- Data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T171124909"] = "Name der Datenquellen" + +-- the number of files in the directory +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1795263412"] = "die Anzahl der Dateien im Verzeichnis" + +-- The embedding runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1950544032"] = "Die Einbettung läuft lokal oder in ihrer Organisation. Ihre Daten werden nicht in die Cloud gesendet." + +-- the files list +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2072700997"] = "Die Dateiliste" + +-- the maximum number of matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2479753122"] = "die maximale Anzahl an Treffern pro Abfrage" + +-- the data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2717738728"] = "den Namen der Datenquelle" + +-- The directory chosen for the data source does not exist anymore. Please edit the data source and correct the path. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2875614207"] = "Das für die Datenquelle gewählte Verzeichnis existiert nicht mehr. Bitte bearbeiten Sie die Datenquelle und korrigieren Sie den Pfad." + +-- your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2879113658"] = "Ihre Sicherheitsrichtlinie" + +-- Maximum matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2889706179"] = "Maximale Treffer pro Abfrage" + +-- the embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2937209992"] = "den Namen der Einbettung" + +-- this path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2944855252"] = "diesen Pfad" + +-- Embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3153201045"] = "Name der Einbettung" + +-- Files list +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3238813368"] = "Dateiliste" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3448155331"] = "Schließen" + +-- For performance reasons, only the first 100 files are shown. The directory contains {0} files in total. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T360238400"] = "Aus Leistungsgründen werden nur die ersten 100 Dateien angezeigt. Das Verzeichnis enthält insgesamt {0} Dateien." + +-- Path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3949388886"] = "Pfad" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T4081226330"] = "Ihre Sicherheitsrichtlinie" + +-- Number of files +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T417749210"] = "Anzahl der Dateien" + +-- The embedding runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T443873444"] = "Das Einbetten erfolgt in der Cloud. Alle ihre Daten aus dem Ordner '{0}' und allen seinen Unterordnern werden in die Cloud gesendet." + +-- The directory chosen for the data source exists. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T445858624"] = "Das ausgewählte Verzeichnis für die Datenquelle ist vorhanden." + +-- Select a file for this data source. The content of this file will be processed for the data source. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1190880267"] = "Wählen Sie eine Datei für diese Datenquelle aus. Der Inhalt dieser Datei wird für die Datenquelle verarbeitet." + +-- How many matches do you want at most per query? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1827669611"] = "Wie viele Treffer möchten Sie maximal pro Abfrage erhalten?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1847791252"] = "Aktualisieren" + +-- Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1922618794"] = "Bitte beachten Sie: Die von Ihnen ausgewählte Einbettung läuft in der Cloud. Alle ihre Daten werden in die Cloud gesendet. Bitte bestätigen Sie, dass Sie dies gelesen und verstanden haben." + +-- In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1948697886"] = "Damit die KI jederzeit die passenden Daten ermitteln kann, müssen Sie eine Methode für die Einbettung auswählen." + +-- Please note: the embedding you selected runs in the cloud. All your data within the file '{0}' will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2090178026"] = "Bitte beachten Sie: Die von Ihnen ausgewählte Einbettung läuft in der Cloud. Alle ihre Daten aus der Datei „{0}“ werden in die Cloud übertragen. Bitte bestätigen Sie, dass Sie dies gelesen und verstanden haben." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2646845972"] = "Hinzufügen" + +-- The embedding you selected runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2814869210"] = "Die von Ihnen ausgewählte Einbettung läuft lokal oder innerhalb ihrer Organisation. Ihre Daten werden nicht in die Cloud gesendet." + +-- Embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2838542994"] = "Einbettung" + +-- Yes, please send my data to the cloud +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T3572613009"] = "Ja, bitte senden Sie meine Daten in die Cloud." + +-- I confirm that I have read and understood the above +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T3683380716"] = "Ich bestätige, dass ich das oben Genannte gelesen und verstanden habe." + +-- Select the file +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T3740148848"] = "Datei auswählen" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T4081226330"] = "Ihre Sicherheitsrichtlinie" + +-- No, I will chose another embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T4253147533"] = "Nein, ich wähle eine andere Einbettung aus." + +-- Data Source Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T813773421"] = "Name der Datenquelle" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T900713019"] = "Abbrechen" + +-- Selected file path for this data source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T939749563"] = "Ausgewählter Dateipfad für diese Datenquelle" + +-- The file chosen for the data source exists. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T1294177559"] = "Die für die Datenquelle ausgewählte Datei ist vorhanden." + +-- Data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T171124909"] = "Name der Datenquelle" + +-- The embedding runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T1950544032"] = "Die Einbettung erfolgt lokal oder in ihrem Unternehmen. Ihre Daten werden nicht in die Cloud gesendet." + +-- The file chosen for the data source does not exist anymore. Please edit the data source and choose another file or correct the path. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2235729121"] = "Die für die Datenquelle ausgewählte Datei existiert nicht mehr. Bitte bearbeiten Sie die Datenquelle und wählen Sie eine andere Datei aus oder korrigieren Sie den Pfad." + +-- the maximum number of matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2479753122"] = "die maximale Anzahl an Treffern pro Abfrage" + +-- the data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2717738728"] = "den Namen der Datenquelle" + +-- the file size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2837935239"] = "die Dateigröße" + +-- your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2879113658"] = "Ihre Sicherheitsrichtlinie" + +-- File path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2879895266"] = "Dateipfad" + +-- Maximum matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2889706179"] = "Maximale Treffer pro Abfrage" + +-- the embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2937209992"] = "den Namen der Einbettung" + +-- this path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2944855252"] = "diesen Pfad" + +-- Embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3153201045"] = "Name der Einbettung" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3448155331"] = "Schließen" + +-- File size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3650018664"] = "Dateigröße" + +-- The embedding runs in the cloud. All your data within the file '{0}' will be sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3688254408"] = "Das Einbetten erfolgt in der Cloud. Alle ihre Daten in der Datei „{0}“ werden in die Cloud gesendet." + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T4081226330"] = "Ihre Sicherheitsrichtlinie" + +-- Embedding Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T1427271797"] = "Name der Einbettung" + +-- Embedding Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T1625164424"] = "Beschreibung der Einbettung" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T1847791252"] = "Aktualisieren" + +-- Please describe when the embedding is used. Might be anytime or when certain keywords are present, etc. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T2346653528"] = "Bitte beschreiben Sie, wann die Einbettung verwendet wird. Zum Beispiel jederzeit oder nur, wenn bestimmte Schlüsselwörter vorhanden sind, usw." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T2646845972"] = "Hinzufügen" + +-- Embedding Type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T2764429350"] = "Typ der Einbettung" + +-- Embedding Link +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T290945550"] = "Link zur Einbettung" + +-- Used when +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3229398952"] = "Verwenden, wenn" + +-- The embedding type must not be longer than 56 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T32602319"] = "Der Typ der Einbettung darf nicht länger als 56 Zeichen sein." + +-- The name of the embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3415350123"] = "Die Bezeichnung der Methode zur Einbettung." + +-- A short description of the embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3588690510"] = "Eine kurze Beschreibung der Methode zur Einbettung." + +-- The embedding name must not be longer than 26 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T359150945"] = "Die Bezeichnung der Einbettung darf nicht länger als 26 Zeichen sein." + +-- The embedding method name '{0}' is already used. Please choose a unique name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3601888052"] = "Die Bezeichnung der Methode zur Einbettung '{0}' wird bereits verwendet. Bitte wähle einen eindeutigen Namen." + +-- When is this embedding used? When you define multiple embeddings, it is helpful to know when to use which one. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3779802582"] = "Wann wird diese Einbettung verwendet? Wenn Sie mehrere Einbettungen definiert haben, ist es hilfreich zu wissen, wann welche verwendet wird." + +-- See Wikipedia for more information about word embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3806477732"] = "Weitere Informationen zu Wort-Einbettung finden Sie auf Wikipedia" + +-- The embedding type must not be empty. Please specify the embedding type. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3902812924"] = "Der Typ der Einbettung darf nicht leer sein. Bitte geben Sie den Typ an." + +-- See Wikipedia for more information about knowledge graph embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3928412408"] = "Siehe Wikipedia für weitere Informationen über Wissensgraph-Einbettungen" + +-- The embedding name must not be empty. Please name the embedding. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T4242514061"] = "Der Name der Einbettung darf nicht leer sein. Bitte geben Sie der Einbettung einen Namen." + +-- What kind of embedding is used. For example, Transformer Embedding, Contextual Word Embedding, Graph Embedding, etc. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T4263395074"] = "Welche Art von Einbettung wird verwendet? Zum Beispiel Transformer-Einbettung, kontextbezogene Wort-Einbettung, Graph-Einbettung usw." + +-- The description must not be empty. Please describe the embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T4268946588"] = "Die Beschreibung darf nicht leer sein. Bitte beschreiben Sie die Methode der Einbettung." + +-- A link to the embedding, e.g., to the model, the source code, the paper, it's Wikipedia page, etc. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T662524223"] = "Ein Link zur Einbettung, z. B. zum Modell, dem Quellcode, der wissenschaftlichen Veröffentlichung, der Wikipedia-Seite usw." + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T900713019"] = "Abbrechen" + +-- Failed to store the API key in the operating system. The message was: {0}. Please try again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1122745046"] = "Der API-Schlüssel konnte nicht im Betriebssystem gespeichert werden. Die Meldung war: {0}. Bitte versuchen Sie es erneut." + +-- API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1324664716"] = "API-Schlüssel" + +-- Create account +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1356621346"] = "Konto erstellen" + +-- Please enter an embedding model name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1661085403"] = "Bitte geben Sie einen Modellnamen für die Einbettung ein." + +-- Hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1727440780"] = "Hostname" + +-- Load +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1756340745"] = "Laden" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1847791252"] = "Aktualisieren" + +-- Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1870831108"] = "Der API-Schlüssel konnte nicht vom Betriebssystem geladen werden. Die Meldung war: {0}. Sie können diese Meldung ignorieren und den API-Schlüssel erneut eingeben." + +-- Model +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2189814010"] = "Modell" + +-- (Optional) API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2331453405"] = "(Optional) API-Schlüssel" + +-- Currently, we cannot query the embedding models of self-hosted systems. Therefore, enter the model name manually. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2615586687"] = "Derzeit können wir die Einbettungs-Modelle von selbst gehosteten Systemen nicht abfragen. Bitte geben Sie daher den Modellnamen manuell ein." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2646845972"] = "Hinzufügen" + +-- No models loaded or available. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2810182573"] = "Keine Modelle geladen oder verfügbar." + +-- Instance Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2842060373"] = "Instanzname" + +-- Model selection +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T416738168"] = "Modellauswahl" + +-- Host +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T808120719"] = "Host" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T900237532"] = "Anbieter" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T900713019"] = "Abbrechen" + +-- Tell the AI what you want it to do for you. What are your goals or are you trying to achieve? Like having the AI address you informally. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T1458195391"] = "Teilen Sie der KI mit, was sie machen soll. Was sind ihre Ziele oder was möchten Sie erreichen? Zum Beispiel, dass die KI Sie duzt." + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T1847791252"] = "Aktualisieren" + +-- Tell the AI something about yourself. What is your profession? How experienced are you in this profession? Which technologies do you like? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2119274961"] = "Erzählen Sie der KI etwas über sich. Was ist ihr Beruf? Wie erfahren sind Sie in diesem Beruf? Welche Technologien verwenden Sie?" + +-- What should the AI do for you? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2261456575"] = "Was soll die KI für Sie tun?" + +-- Please enter a profile name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2386844536"] = "Bitte geben Sie einen Profilnamen ein." + +-- The text must not exceed 256 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2560188276"] = "Der Text darf 256 Zeichen nicht überschreiten." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2646845972"] = "Hinzufügen" + +-- The profile name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3243902394"] = "Der Profilname darf nicht länger als 40 Zeichen sein." + +-- The text must not exceed 444 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3253349421"] = "Der Text darf 444 Zeichen nicht überschreiten." + +-- Profile Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3392578705"] = "Profilname" + +-- Please enter what the LLM should know about you and/or what actions it should take. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3708405102"] = "Bitte geben Sie ein, was das LLM über Sie wissen sollte und/oder welche Aktionen es ausführen soll." + +-- The name of the profile is mandatory. Each profile must have a unique name. Whether you provide information about yourself or only fill out the actions is up to you. Only one of these pieces is required. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T4061896123"] = "Der Name des Profils ist erforderlich. Jedes Profil muss einen eindeutigen Namen haben. Ob Sie zusätzliche Angaben zu ihrer Person machen oder nur die Aktionen ausfüllen, bleibt Ihnen überlassen. Es reicht aus, eines von beidem anzugeben." + +-- Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T4125557797"] = "Speichern Sie persönliche Daten über sich in verschiedenen Profilen, damit die KIs ihren persönlichen Kontext kennen. So müssen Sie ihren Kontext nicht jedes Mal, zum Beispiel in jedem Chat, neu erklären. Wenn Sie unterschiedlichen Rollen haben, können Sie für jede Rolle ein eigenes Profil anlegen." + +-- What should the AI know about you? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T4227846635"] = "Was sollte die KI über Sie wissen?" + +-- Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T56359901"] = "Sind Sie Projektleiter in einer Forschungseinrichtung? Dann möchten Sie vielleicht ein Profil für ihre Projektmanagement-Aufgaben erstellen, eines für ihre wissenschaftliche Arbeit und ein Profil für das Schreiben von Programmcode. In diesen Profilen können Sie festhalten, wie viel Erfahrung Sie haben oder welche Methoden Sie gerne oder weniger gerne nutzen. Später können Sie auswählen, wann und wo Sie jedes Profil verwenden möchten." + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T900713019"] = "Abbrechen" + +-- The profile name must be unique; the chosen name is already in use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T911748898"] = "Der Profilname muss eindeutig sein; der ausgewählte Name wird bereits verwendet." + +-- Hugging Face Inference Provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1085481431"] = "Hugging Face Inferenz-Anbieter" + +-- Failed to store the API key in the operating system. The message was: {0}. Please try again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1122745046"] = "Der API-Schlüssel konnte nicht im Betriebssystem gespeichert werden. Die Meldung war: {0}. Bitte versuchen Sie es erneut." + +-- API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1324664716"] = "API-Schlüssel" + +-- Create account +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1356621346"] = "Konto erstellen" + +-- Load models +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T15352225"] = "Modelle laden" + +-- Hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1727440780"] = "Hostname" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1847791252"] = "Aktualisieren" + +-- Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1870831108"] = "Der API-Schlüssel konnte nicht vom Betriebssystem geladen werden. Die Meldung war: {0}. Sie können diese Meldung ignorieren und den API-Schlüssel erneut eingeben." + +-- Please enter a model name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1936099896"] = "Bitte geben Sie einen Modellnamen ein." + +-- Model +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2189814010"] = "Modell" + +-- (Optional) API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2331453405"] = "(Optional) API-Schlüssel" + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2646845972"] = "Hinzufügen" + +-- No models loaded or available. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2810182573"] = "Keine Modelle geladen oder verfügbar." + +-- Instance Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2842060373"] = "Instanzname" + +-- Show available models +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3763891899"] = "Verfügbare Modelle anzeigen" + +-- Model selection +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T416738168"] = "Modellauswahl" + +-- Host +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T808120719"] = "Host" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T900237532"] = "Anbieter" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T900713019"] = "Abbrechen" + +-- The parameter name. It must be unique within the retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T100726215"] = "Der Parametername. Er muss innerhalb des Abrufprozesses eindeutig sein." + +-- New Parameter {0} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1064532992"] = "Neuer Parameter {0}" + +-- Add Parameter +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1082847843"] = "Parameter hinzufügen" + +-- Parameter Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1093935834"] = "Parameterbeschreibung" + +-- The retrieval process name must not be empty. Please name your retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1133451355"] = "Der Name des Abrufprozesses darf nicht leer sein. Bitte benennen Sie ihren Abrufvorgang." + +-- The parameter name must not be empty. Please name the parameter. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1359500913"] = "Der Parametername darf nicht leer sein. Bitte geben Sie einen Namen für den Parameter ein." + +-- A short description of the parameter. What data type is it? What is it used for? What are the possible values? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1519220950"] = "Eine kurze Beschreibung des Parameters. Welcher Datentyp ist es? Wofür wird er verwendet? Welche Werte sind möglich?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1847791252"] = "Aktualisieren" + +-- Optional. Select the embedding methods that are used for this retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1869391009"] = "Optional. Wählen Sie die Methoden zur Einbettung aus, die für diesen Abrufprozess verwendet werden." + +-- Retrieval Process Link +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1936369410"] = "Link zum Abrufprozess" + +-- Here you can select which embedding methods are used for this retrieval process. Embeddings are optional; if your retrieval process works without embedding, you can ignore this part. You can only choose the embedding methods you have previously defined. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2076115062"] = "Hier können Sie auswählen, welche Methoden zur Einbettung für diesen Abrufprozess verwendet werden. Einbettungen sind optional; wenn Ihr Abrufprozess ohne Einbettung funktioniert, können Sie diesen Abschnitt ignorieren. Sie können nur die Methoden zur Einbettung auswählen, die Sie zuvor definiert haben." + +-- The parameter description must not be empty. Please describe the parameter '{0}'. What data type is it? What is it used for? What are the possible values? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2139013415"] = "Die Parameterbeschreibung darf nicht leer sein. Bitte beschreiben Sie den Parameter „{0}“. Welchen Datentyp hat er? Wofür wird er verwendet? Welche Werte sind möglich?" + +-- A link to the retrieval process, e.g., the source code, the paper, it's Wikipedia page, etc. Make sense for common retrieval processes. Leave empty if not applicable. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2352603560"] = "Ein Link zum Abrufprozess, z. B. zum Quellcode, zur wissenschaftlichen Veröffentlichung, zur Wikipedia-Seite usw. Dies ist sinnvoll für gängige Abrufprozesse. Lassen Sie dieses Feld leer, falls dies nicht zutreffend ist." + +-- No embedding methods selected. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2508820480"] = "Keine Methoden zur Einbettung ausgewählt." + +-- Add a parameter first, then select it to edit. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2534894635"] = "Fügen Sie zuerst einen Parameter hinzu und wählen Sie ihn anschließend aus, um ihn zu bearbeiten." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2646845972"] = "Hinzufügen" + +-- You have selected {0} embedding methods. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2933579640"] = "Sie haben {0} Methoden zur Einbettung ausgewählt." + +-- Please provide some general information about your retrieval process first. This data may be displayed to the users. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3015844908"] = "Bitte geben Sie zunächst einige allgemeine Informationen über ihren Abrufprozess an. Diese Angaben können den Nutzern angezeigt werden." + +-- The name of your retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3207262684"] = "Der Name ihres Abrufprozesses." + +-- You may want to parameterize your retrieval process. However, this is optional. You can specify any parameters that can be set by the user or the system during the call. Nevertheless, you should use sensible default values in your code so that users are not forced to set the parameters manually. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3292152705"] = "Möglicherweise möchten Sie ihren Abrufprozess parameterisieren. Dies ist jedoch optional. Sie können beliebige Parameter angeben, die vom Benutzer oder vom System während des Aufrufs festgelegt werden können. Dennoch sollten Sie sinnvolle Standardwerte in ihrem Code verwenden, damit Benutzer die Parameter nicht manuell einstellen müssen." + +-- Select a parameter to show and edit it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3300669027"] = "Wählen Sie einen Parameter aus, um ihn anzuzeigen und zu bearbeiten." + +-- The parameter name '{0}' must be unique. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3378166475"] = "Der Parametername „{0}“ muss eindeutig sein. Bitte wählen Sie einen anderen Namen." + +-- The retrieval process name '{0}' must be unique. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3387731069"] = "Der Name des Abrufvorgangs „{0}“ muss eindeutig sein. Bitte wähle einen anderen Namen." + +-- Delete this parameter +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3464622501"] = "Diesen Parameter löschen" + +-- Retrieval Process Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3481092305"] = "Name des Abrufprozesses" + +-- A short description of the retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3524519535"] = "Eine kurze Beschreibung des Abrufprozesses." + +-- Currently, you have not defined any embedding methods. If your retrieval process does not require embedding, you can ignore this part. Otherwise, you can define one or more embedding methods in the previous view to assign them to your retrieval process here. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3821108204"] = "Derzeit haben Sie keine Methoden zur Einbettung definiert. Falls Ihr Abrufprozess keine Einbettungen benötigt, können Sie diesen Abschnitt ignorieren. Andernfalls können Sie im vorherigen Bereich eine oder mehrere Methoden zur Einbettung festlegen, die Sie hier ihrem Abrufprozess zuweisen können." + +-- Retrieval Process Parameters +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3894388618"] = "Parameter für den Abrufprozess" + +-- The description must not be empty. Please describe the retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T40530321"] = "Die Beschreibung darf nicht leer sein. Bitte beschreiben Sie den Abrufprozess." + +-- Embeddings methods +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T4119328701"] = "Methoden zur Einbettung" + +-- General Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T4286878385"] = "Allgemeine Informationen" + +-- Retrieval Process Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T546772364"] = "Beschreibung des Abrufprozesses" + +-- You have selected 1 embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T673052164"] = "Sie haben 1 Methode zur Einbettung ausgewählt." + +-- The retrieval process name must not be longer than 26 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T769031589"] = "Der Name des Abrufprozesses darf nicht länger als 26 Zeichen sein." + +-- Parameter Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T873729811"] = "Parametername" + +-- The parameter name must not be longer than 26 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T898422027"] = "Der Parametername darf nicht länger als 26 Zeichen sein." + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T900713019"] = "Abbrechen" + +-- Embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T951463987"] = "Einbettungen" + +-- There is no social event +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1222800281"] = "Es gibt keine gesellschaftliche Veranstaltung." + +-- Agenda options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1249372829"] = "Agendaoptionen sind vorausgewählt" + +-- Preselect a duration? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1404615656"] = "Eine Dauer vorauswählen?" + +-- Preselect the number of participants +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1444356399"] = "Anzahl der Teilnehmer vorauswählen" + +-- Meeting is virtual +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1446638309"] = "Das Meeting findet online statt" + +-- Preselect a name? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1471770981"] = "Einen Namen vorauswählen?" + +-- Preselect whether participants needs to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1648427207"] = "Legen Sie im Voraus fest, ob Teilnehmer anreisen und abreisen müssen" + +-- Preselect a start time? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1901151023"] = "Startzeit vorauswählen?" + +-- Preselect a location? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1908318849"] = "Standort vorauswählen?" + +-- How many participants should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1998244307"] = "Wie viele Teilnehmer sollen vorausgewählt werden?" + +-- Preselect whether the meeting is virtual +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2084951012"] = "Wählen Sie aus, ob das Meeting virtuell ist" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- When enabled, you can preselect most agenda options. This is might be useful when you need to create similar agendas often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2373110543"] = "Wenn diese Option aktiviert ist, können Sie die meisten Agendapunkte vorauswählen. Das kann hilfreich sein, wenn Sie häufig ähnliche Agenden erstellst." + +-- Preselect whether the participants should get to know each other +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2519703500"] = "Vorab festlegen, ob sich die Teilnehmenden kennenlernen sollen" + +-- Which agenda language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2801220321"] = "Welche Sprache soll für die Tagesordnung vorausgewählt sein?" + +-- Preselect another agenda language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2915422331"] = "Wählen Sie eine andere Agendasprache aus" + +-- Participants do not need to get to know each other +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2949002251"] = "Teilnehmer müssen sich nicht kennenlernen" + +-- There is a social event +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T296183299"] = "Es gibt eine gesellschaftliche Veranstaltung" + +-- Participants should be actively involved +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T298324727"] = "Teilnehmer sollten aktiv mitwirken" + +-- Meeting is in person +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3008159782"] = "Das Treffen findet persönlich statt." + +-- Participants do not need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3087504452"] = "Teilnehmer müssen nicht ankommen oder abreisen." + +-- Preselect whether there is a joint dinner +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3175009548"] = "Vorab auswählen, ob ein gemeinsames Abendessen stattfindet" + +-- Preselect an objective? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3439476935"] = "Ein Ziel vorauswählen?" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3448155331"] = "Schließen" + +-- Preselect a moderator? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3482798491"] = "Einen Moderator vorauswählen?" + +-- Participants need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3591032034"] = "Die Teilnehmer müssen ankommen und abreisen" + +-- Participants do not need to be actively involved +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3679899885"] = "Teilnehmende müssen nicht aktiv mitwirken" + +-- Preselect the approx. lunch time +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3709527588"] = "Wählen Sie die ungefähre Mittagszeit vorab aus" + +-- Preselect a topic? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3835166371"] = "Ein Thema vorauswählen?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4004501229"] = "Eines ihrer Profile vorauswählen?" + +-- Preselect the agenda language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4055846391"] = "Wählen Sie die Sprache der Agenda vorab aus" + +-- No agenda options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4094211586"] = "Keine Tagesordnungspunkte sind vorausgewählt" + +-- Participants should get to know each other +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T464127805"] = "Die Teilnehmer sollten sich kennenlernen" + +-- Assistant: Agenda Planner Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T677962779"] = "Assistent: Optionen für den Terminplaner" + +-- There is a joint dinner +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T707310400"] = "Es gibt ein gemeinsames Abendessen." + +-- Preselect the approx. break time +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T722113273"] = "Wählen Sie die ungefähre Pausenzeit vorab aus" + +-- There is no joint dinner +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T768936730"] = "Es gibt kein gemeinsames Abendessen." + +-- Preselect agenda options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T800921421"] = "Agendaoptionen vorauswählen?" + +-- Preselect whether there is a social event +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T816053055"] = "Wählen Sie im Voraus aus, ob eine gesellschaftliche Veranstaltung stattfindet" + +-- Preselect whether the participants should actively involved +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T817726429"] = "Wählen Sie aus, ob die Teilnehmenden aktiv beteiligt sein sollen." + +-- Restrict to one bias a day? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1608129203"] = "Auf einen Bias pro Tag beschränken?" + +-- Yes, you can only retrieve one bias per day +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1765683725"] = "Ja, Sie können nur einmal pro Tag eine Voreingenommenheit abrufen." + +-- Reset +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T180921696"] = "Zurücksetzen" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- No restriction. You can retrieve as many biases as you want per day. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2305356277"] = "Keine Einschränkung. Sie können beliebig viele Vorurteile pro Tag abrufen." + +-- Which language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2345162613"] = "Welche Sprache soll vorausgewählt werden?" + +-- Reset your bias-of-the-day statistics +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2350981714"] = "Setzen Sie ihre Statistik zum „Vorurteil des Tages“ zurück" + +-- Preselect another language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2382415529"] = "Eine andere Sprache vorauswählen" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2571465005"] = "Sprache vorauswählen" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3448155331"] = "Schließen" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T354528094"] = "Es sind keine Optionen vorausgewählt" + +-- Assistant: Bias of the Day +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T384887684"] = "Assistent: Vorurteil des Tages" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3875604319"] = "Optionen sind vorausgewählt" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T4004501229"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- Are you sure you want to reset your bias-of-the-day statistics? The system will no longer remember which biases you already know. As a result, biases you are already familiar with may be addressed again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T405627382"] = "Sind Sie sicher, dass Sie ihre „Vorurteil des Tages“-Statistiken zurücksetzen möchten? Das System merkt sich dann nicht mehr, welche Verzerrungen Sie bereits kennen. Dadurch kann es sein, dass Ihnen bereits bekannte Verzerrungen erneut angezeigt werden." + +-- Assistant: Bias of the Day Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T4235808594"] = "Assistent: Optionen für „Bias des Tages“" + +-- Preselect options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T42672465"] = "Optionen vorauswählen?" + +-- You have learned about {0} out of {1} biases. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T679061561"] = "Sie haben {0} von {1} Vorurteilen kennengelernt." + +-- When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T711745239"] = "Wenn diese Option aktiviert ist, können Sie Voreinstellungen vornehmen. Das kann nützlich sein, wenn Sie eine bestimmte Sprache oder ein bestimmtes LLM-Modell bevorzugen." + +-- Preselect one of your chat templates? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1402022556"] = "Eine ihrer Chat-Vorlagen vorab auswählen?" + +-- Control how the LLM provider for loaded chats is selected and when assistant results are sent to chat. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T172255919"] = "Legen Sie fest, wie der LLM-Anbieter für geladene Chats ausgewählt wird und wann Assistenten-Ergebnisse an den Chat gesendet werden." + +-- Chat Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1757092713"] = "Chat-Optionen" + +-- Shortcut to send input +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1773585398"] = "Tastenkombination zum Senden der Eingabe" + +-- Provider selection when creating new chats +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T189306836"] = "Anbieterauswahl beim Erstellen neuer Chats" + +-- Would you like to set one of your profiles as the default for chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1933521846"] = "Möchten Sie eines ihrer Profile als Standardprofil für Chats festlegen?" + +-- Apply default data source option when sending assistant results to chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2510376349"] = "Standarddatenquelle verwenden, wenn Assistentenergebnisse in den Chat gesendet werden" + +-- Control how the LLM provider for added chats is selected. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T263621180"] = "Steuern Sie, wie der LLM-Anbieter für hinzugefügte Chats ausgewählt wird." + +-- Provider selection when loading a chat and sending assistant results to chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2868379953"] = "Anbieterauswahl beim Laden eines Chats und beim Senden von Assistentenergebnissen in den Chat" + +-- Show the latest message after loading? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2913693228"] = "Die neueste Nachricht nach dem Laden anzeigen?" + +-- Do you want to use any shortcut to send your input? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2936560092"] = "Möchten Sie eine Tastenkombination verwenden, um ihre Eingabe zu senden?" + +-- Would you like to set one of your chat templates as the default for chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3234927721"] = "Möchten Sie eine ihrer Chat-Vorlagen als Standard für alle Chats festlegen?" + +-- No chat options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3383186996"] = "Keine Chat-Optionen sind vorausgewählt" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3448155331"] = "Schließen" + +-- First (oldest) message is shown, after loading a chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3507181366"] = "Die erste (älteste) Nachricht wird nach dem Laden eines Chats angezeigt." + +-- Preselect chat options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3728624759"] = "Chat-Optionen vorauswählen?" + +-- Chat options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3730599555"] = "Chat-Optionen sind vorausgewählt" + +-- Latest message is shown, after loading a chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3755993611"] = "Die neueste Nachricht wird nach dem Laden eines Chats angezeigt." + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T4004501229"] = "Eines ihrer Profile vorauswählen?" + +-- Do you want to apply the default data source options when sending assistant results to chat? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T4033153439"] = "Möchten Sie die Standardoptionen für Datenquellen verwenden, wenn die Ergebnisse des Assistenten an den Chat gesendet werden?" + +-- When enabled, you can preselect chat options. This is might be useful when you prefer a specific provider. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T477675197"] = "Wenn aktiviert, können Sie Chat-Optionen im Voraus auswählen. Das kann nützlich sein, wenn Sie einen bestimmten Anbieter bevorzugen." + +-- You can set default data sources and options for new chats. You can change these settings later for each individual chat. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T492357592"] = "Sie können Standarddatenquellen und -optionen für neue Chats festlegen. Diese Einstellungen lassen sich später für jeden einzelnen Chat anpassen." + +-- When enabled, the latest message is shown after loading a chat. When disabled, the first (oldest) message is shown. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T582516016"] = "Wenn diese Option aktiviert ist, wird nach dem Laden eines Chats die neueste Nachricht angezeigt. Wenn sie deaktiviert ist, wird die erste (älteste) Nachricht angezeigt." + +-- Customize your AI experience with chat templates. Whether you want to experiment with prompt engineering, simply use a custom system prompt in the standard chat interface, or create a specialized assistant, chat templates give you full control. Similar to common AI companies' playgrounds, you can define your own system prompts and leverage assistant prompts for providers that support them. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1172171653"] = "Passen Sie ihre KI-Erfahrung mit Chat-Vorlagen an. Egal, ob Sie mit Prompt-Engineering experimentieren, einfach einen eigenen System-Prompt im normalen Chat verwenden oder einen spezialisierten Assistenten erstellen möchten – mit Chat-Vorlagen haben Sie die volle Kontrolle. Ähnlich wie in den Playgrounds gängiger KI-Anbieter können Sie eigene System-Prompts festlegen und bei unterstützenden Anbietern auch Assistenten-Prompts nutzen." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1469573738"] = "Löschen" + +-- Add Chat Template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1548314416"] = "Chat-Vorlage hinzufügen" + +-- Note: This advanced feature is designed for users familiar with prompt engineering concepts. Furthermore, you have to make sure yourself that your chosen provider supports the use of assistant prompts. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1909110760"] = "Hinweis: Diese fortgeschrittene Funktion richtet sich an Nutzer, die mit den Grundlagen des Prompt Engineerings vertraut sind. Außerdem müssen Sie selbst sicherstellen, dass Ihr gewählter Anbieter die Verwendung von Assistenten-Prompts unterstützt." + +-- No chat templates configured yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T2319860307"] = "Noch keine Chat-Vorlagen konfiguriert." + +-- Chat Template Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T275026390"] = "Name der Chat-Vorlage" + +-- Are you sure you want to delete the chat template '{0}'? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3102555824"] = "Sind Sie sicher, dass Sie die Chat-Vorlage „{0}“ löschen möchten?" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3267849393"] = "Bearbeiten" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3448155331"] = "Schließen" + +-- Edit Chat Template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3596030597"] = "Chat-Vorlage bearbeiten" + +-- Your Chat Templates +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3824122683"] = "Ihre Chat-Vorlagen" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3865031940"] = "Aktionen" + +-- Delete Chat Template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T4025180906"] = "Chat-Vorlage löschen" + +-- Which programming language should be preselected for added contexts? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1073540083"] = "Welche Programmiersprache soll für hinzugefügte Kontexte vorausgewählt werden?" + +-- Compiler messages are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1110902070"] = "Compiler-Nachrichten sind vorausgewählt" + +-- Preselect a programming language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2181567002"] = "Programmiersprache vorauswählen" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- When enabled, you can preselect the coding options. This is might be useful when you prefer a specific programming language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2619641701"] = "Wenn aktiviert, können Sie die Code-Optionen im Voraus auswählen. Das kann nützlich sein, wenn Sie eine bestimmte Programmiersprache oder ein bestimmtes LLM-Modell bevorzugen." + +-- Preselect coding options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2790579667"] = "Codierungsoptionen vorauswählen?" + +-- Preselect compiler messages? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2970689954"] = "Kompilermeldungen vorauswählen?" + +-- No coding options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3015105896"] = "Es sind keine Programmieroptionen vorausgewählt" + +-- Coding options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3567850751"] = "Codierungsoptionen sind vorausgewählt" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4004501229"] = "Eines ihrer Profile vorauswählen?" + +-- Preselect another programming language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4230412334"] = "Eine andere Programmiersprache vorauswählen" + +-- Compiler messages are not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T516498299"] = "Compiler-Meldungen sind nicht vorausgewählt" + +-- Assistant: Coding Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T585868261"] = "Assistent: Programmieroptionen" + +-- You might configure different data sources. A data source can include one file, all files in a directory, or data from your company. Later, you can incorporate these data sources as needed when the AI requires this data to complete a certain task. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1084943026"] = "Sie können verschiedene Datenquellen konfigurieren. Eine Datenquelle kann eine einzelne Datei, alle Dateien in einem Ordner oder Daten aus ihrem Unternehmen enthalten. Später können Sie diese Datenquellen bei Bedarf einbinden, wenn die KI diese Daten zur Erledigung einer bestimmten Aufgabe benötigt." + +-- Are you sure you want to delete the data source '{0}' of type {1}? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1096979935"] = "Möchten Sie die Datenquelle „{0}“ vom Typ {1} wirklich löschen?" + +-- Edit Local Directory Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1215599168"] = "Lokale Ordner-Datenquelle bearbeiten" + +-- Add Local Directory as Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1454193397"] = "Lokalen Ordner als Datenquelle hinzufügen" + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1469573738"] = "Löschen" + +-- External (ERI) +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1652430727"] = "Extern (ERI)" + +-- Local File +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1687345358"] = "Lokale Datei" + +-- Delete Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1849107431"] = "Datenquelle löschen" + +-- Local Directory Data Source Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2146756020"] = "Informationen zur lokalen Ordner-Datenquelle" + +-- Edit ERI v1 Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T221059217"] = "ERI v1 Datenquelle bearbeiten" + +-- Edit Local File Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2453292893"] = "Lokale Datei-Datenquelle bearbeiten" + +-- ERI v1 Data Source Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T26243729"] = "ERI v1 Datenquellen-Informationen" + +-- Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T266367750"] = "Name" + +-- No valid embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2698203405"] = "Keine gültige Einbettung" + +-- Embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2838542994"] = "Einbettung" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3267849393"] = "Bearbeiten" + +-- Add Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3387511033"] = "Datenquelle hinzufügen" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3424652889"] = "Unbekannt" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3448155331"] = "Schließen" + +-- Add Local File as Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3500365052"] = "Lokale Datei als Datenquelle hinzufügen" + +-- Type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3512062061"] = "Typ" + +-- Local File Data Source Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3525663993"] = "Informationen zur lokalen Dateiquelle" + +-- No data sources configured yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3549650120"] = "Noch keine Datenquellen konfiguriert." + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3865031940"] = "Aktionen" + +-- Configured Data Sources +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T543942217"] = "Konfigurierte Datenquellen" + +-- Add ERI v1 Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T590005498"] = "ERI v1 Datenquelle hinzufügen" + +-- External Data (ERI-Server v1) +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T774473996"] = "Externe Daten (ERI-Server v1)" + +-- Local Directory +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T926703547"] = "Lokaler Ordner" + +-- When enabled, you can preselect some ERI server options. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1280666275"] = "Wenn aktiviert, können Sie einige ERI-Serveroptionen vorauswählen." + +-- Preselect ERI server options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1664055662"] = "ERI-Serveroptionen vorauswählen?" + +-- No ERI server options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1793785587"] = "Keine ERI-Serveroptionen sind vorausgewählt" + +-- Most ERI server options can be customized and saved directly in the ERI server assistant. For this, the ERI server assistant has an auto-save function. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2093534613"] = "Die meisten ERI-Serveroptionen können direkt im ERI-Server-Assistenten angepasst und gespeichert werden. Dazu verfügt der ERI-Server-Assistent über eine automatische Speicherfunktion." + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3448155331"] = "Schließen" + +-- Assistant: ERI Server Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3629372826"] = "Assistent: ERI-Server-Optionen" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T4004501229"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- ERI server options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T488190224"] = "ERI-Serveroptionen sind vorausgewählt" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T1417990312"] = "Zielsprache vorauswählen" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T1462295644"] = "Eine andere Zielsprache vorauswählen" + +-- Preselect grammar & spell checker options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T1672258211"] = "Optionen für die Grammatik- und Rechtschreibprüfung vorauswählen?" + +-- No grammar & spell checker options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T2041367384"] = "Keine Optionen für die Grammatik- und Rechtschreibprüfung sind vorausgewählt" + +-- When enabled, you can preselect the grammar & spell checker options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T2515603280"] = "Wenn aktiviert, können Sie die Einstellungen für Grammatik- und Rechtschreibprüfung im Voraus auswählen. Das kann nützlich sein, wenn Sie eine bestimmte Sprache oder ein bestimmtes LLM-Modell bevorzugen." + +-- Grammar & spell checker options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T2843193933"] = "Optionen für Grammatik- und Rechtschreibprüfung sind vorausgewählt" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T3448155331"] = "Schließen" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T3547337928"] = "Welche Zielsprache soll vorausgewählt werden?" + +-- Assistant: Grammar & Spelling Checker Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T886675455"] = "Assistent: Optionen für Grammatik- und Rechtschreibprüfung" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T1417990312"] = "Zielsprache vorauswählen" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T1462295644"] = "Wähle eine andere Zielsprache aus" + +-- Select the language plugin used for comparision. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T1523568309"] = "Wählen Sie das Sprach-Plugin für den Vergleich aus." + +-- Localization options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T2246008228"] = "Lokalisierungsoptionen sind vorausgewählt" + +-- Assistant: Localization +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T2573041664"] = "Assistent: Lokalisierung" + +-- Language plugin used for comparision +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T263317578"] = "Sprach-Plugin zum Vergleichen verwendet" + +-- Preselect localization options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3080941742"] = "Lokalisierungsoptionen vorauswählen?" + +-- No localization options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3287437171"] = "Es sind keine Spracheinstellungen vorausgewählt." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3448155331"] = "Schließen" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3547337928"] = "Welche Zielsprache soll vorausgewählt werden?" + +-- When enabled, you can preselect the localization options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T4022795859"] = "Wenn diese Option aktiviert ist, können Sie die Spracheinstellungen im Voraus auswählen. Das kann nützlich sein, wenn Sie eine bestimmte Sprache oder ein bestimmtes LLM-Modell bevorzugen." + +-- Preselect the icon source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1116652851"] = "Wählen Sie die Iconquelle aus" + +-- Assistant: Icon Finder Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1570765862"] = "Assistent: Icon Finder-Optionen" + +-- No icon options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1694910115"] = "Keine Iconoptionen sind vorausgewählt" + +-- Icon options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1792507476"] = "Iconoptionen sind vorausgewählt" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T3448155331"] = "Schließen" + +-- Preselect icon options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T725252382"] = "Iconoptionen vorauswählen?" + +-- No job posting options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1257718691"] = "Keine Joboptionen sind vorausgewählt" + +-- Preselect some mandatory information about the job posting? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1332068481"] = "Wählen Sie einige Pflichtangaben zur Stellenanzeige im Voraus aus." + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1462295644"] = "Wähle eine andere Zielsprache aus" + +-- Job posting options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1827578822"] = "Jobanzeigen-Optionen sind vorausgewählt" + +-- Preselect the work location? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1867962106"] = "Arbeitsort vorauswählen?" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2571465005"] = "Sprache vorauswählen" + +-- Preselect job posting options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2624983038"] = "Vorauswahl von Stellenanzeigenoptionen?" + +-- Preselect the company name? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2679442990"] = "Firmennamen vorauswählen?" + +-- When enabled, you can preselect some job posting options. This is might be useful when you prefer a specific LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2907036553"] = "Wenn diese Option aktiviert ist, können Sie einige Optionen für die Stellenausschreibung im Voraus auswählen. Das kann nützlich sein, wenn Sie ein bestimmtes LLM-Modell bevorzugen." + +-- Preselect the job qualifications? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3223375709"] = "Qualifikationen für die Stelle vorauswählen?" + +-- Assistant: Job Posting Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3307661496"] = "Assistent: Optionen für Stellenanzeigen" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3448155331"] = "Schließen" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3547337928"] = "Welche Zielsprache soll vorausgewählt werden?" + +-- Preselect the job responsibilities? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3788397013"] = "Die Aufgabenbereiche vorab auswählen?" + +-- Preselect the job description? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3825475093"] = "Die Stellenbeschreibung vorauswählen?" + +-- Content cleaner agent is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1013787967"] = "Der Content Cleaner-Agent ist vorausgewählt" + +-- Web content reader is shown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1030372436"] = "Web-Content-Reader wird angezeigt" + +-- When enabled, the web content reader is preselected. This is might be useful when you prefer to load legal content from the web very often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1507288278"] = "Wenn diese Option aktiviert ist, wird der Web-Content-Reader standardmäßig ausgewählt. Das kann nützlich sein, wenn Sie häufig juristische Inhalte aus dem Internet laden möchten." + +-- Preselect legal check options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1563865738"] = "Rechtliche Überprüfungsoptionen vorauswählen?" + +-- No legal check options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1591931823"] = "Keine rechtlichen Prüfoptionen sind vorausgewählt" + +-- When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1633101895"] = "Wenn diese Option aktiviert ist, wird der Web-Content-Reader ausgeblendet und kann nicht verwendet werden. Dadurch wird die Benutzeroberfläche etwas einfacher zu bedienen." + +-- Web content reader is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1701127912"] = "Tool zum Lesen von Webinhalten ist nicht vorausgewählt" + +-- Content cleaner agent is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1969816694"] = "Agent zur Inhaltsbereinigung ist nicht vorausgewählt" + +-- Hide the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2090693677"] = "Web-Content-Reader ausblenden?" + +-- When enabled, you can preselect some legal check options. This is might be useful when you prefer a specific LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2164667361"] = "Wenn aktiviert, können Sie einige rechtliche Prüfoptionen vorauswählen. Dies kann nützlich sein, wenn Sie ein bestimmtes LLM-Modell bevorzugen." + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- Legal check options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T252916114"] = "Rechtsprüfungsoptionen sind vorausgewählt" + +-- When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the legal content before translating it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2746583995"] = "Wenn aktiviert, ist der Content Cleaner Agent vorausgewählt. Das kann nützlich sein, wenn Sie den rechtlichen Inhalt bereinigen möchten, bevor Sie ihn übersetzen." + +-- Web content reader is hidden +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2799795311"] = "Tool zum Lesen von Webinhalten ist ausgeblendet" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3448155331"] = "Schließen" + +-- Web content reader is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3641773985"] = "Tool zum Lesen von Webinhalten ist vorausgewählt" + +-- Preselect the content cleaner agent? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3649428096"] = "Assistent zur Inhaltsbereinigungs vorauswählen?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4004501229"] = "Eines ihrer Profile vorauswählen?" + +-- Assistant: Legal Check Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4033382756"] = "Assistent: Optionen für rechtliche Prüfung" + +-- Preselect the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T629158142"] = "Tool zum Lesen von Webinhalten vorauswählen?" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- Which language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2345162613"] = "Welche Sprache soll vorausgewählt werden?" + +-- Preselect another language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2382415529"] = "Eine andere Sprache vorauswählen" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2571465005"] = "Sprache vorauswählen" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3448155331"] = "Schließen" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T354528094"] = "Keine Optionen sind vorausgewählt" + +-- Assistant: My Tasks Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3710380967"] = "Assistent: Meine Aufgabenoptionen" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3875604319"] = "Optionen sind vorausgewählt" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T4004501229"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- Preselect options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T42672465"] = "Optionen vorauswählen?" + +-- When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T711745239"] = "Wenn aktiviert, können Sie Optionen im Voraus auswählen. Das kann nützlich sein, wenn Sie eine bestimmte Sprache oder ein bestimmtes LLM-Modell bevorzugen." + +-- Edit Profile +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T1143111468"] = "Profil bearbeiten" + +-- No profiles configured yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T1433534732"] = "Noch keine Profile eingerichtet." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T1469573738"] = "Löschen" + +-- Your Profiles +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T2378610256"] = "Ihre Profile" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3267849393"] = "Bearbeiten" + +-- Profile Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3392578705"] = "Profilname" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3448155331"] = "Schließen" + +-- Delete Profile +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3804515427"] = "Profil löschen" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3865031940"] = "Aktionen" + +-- Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T4125557797"] = "Speichern Sie persönliche Daten über sich in verschiedenen Profilen, damit die KIs ihren persönlichen Kontext kennen. So müssen Sie den Kontext nicht jedes Mal erneut erklären, zum Beispiel in jedem Chat. Wenn Sie verschiedene Rollen haben, können Sie für jede Rolle ein eigenes Profil anlegen." + +-- Add Profile +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T4248067241"] = "Profil hinzufügen" + +-- Are you sure you want to delete the profile '{0}'? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T55364659"] = "Möchten Sie das Profil „{0}“ wirklich löschen?" + +-- Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T56359901"] = "Sind Sie Projektleiter in einer Forschungseinrichtung? Dann möchten Sie vielleicht ein Profil für ihre Projektmanagement-Aktivitäten anlegen, eines für ihre wissenschaftliche Arbeit und ein weiteres Profil, wenn Sie Programmcode schreiben müssen. In diesen Profilen können Sie festhalten, wie viel Erfahrung Sie haben oder welche Methoden Sie bevorzugen oder nicht gerne verwenden. Später können Sie dann auswählen, wann und wo Sie jedes Profil nutzen möchten." + +-- Which writing style should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1173034744"] = "Welcher Schreibstil soll standardmäßig ausgewählt werden?" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1417990312"] = "Zielsprache vorauswählen" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1462295644"] = "Eine andere Zielsprache vorauswählen" + +-- Preselect a sentence structure +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1621537655"] = "Satzstruktur vorauswählen" + +-- Assistant: Rewrite & Improve Text Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1995708818"] = "Assistent: Text umschreiben & verbessern" + +-- Which voice should be preselected for the sentence structure? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T2661599097"] = "Welche Stimme soll für die Satzstruktur vorausgewählt werden?" + +-- Preselect a writing style +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T28456020"] = "Wählen Sie einen Schreibstil aus" + +-- Rewrite & improve text options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3303192024"] = "Optionen für „Text umschreiben & verbessern“ sind bereits vorausgewählt." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3448155331"] = "Schließen" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3547337928"] = "Welche Zielsprache soll vorausgewählt werden?" + +-- When enabled, you can preselect the rewrite & improve text options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3657121735"] = "Wenn diese Option aktiviert ist, können Sie Optionen für „Text umschreiben & verbessern“ im Voraus auswählen. Das kann hilfreich sein, wenn Sie eine bestimmte Sprache oder ein bestimmtes LLM-Modell bevorzugen." + +-- Preselect rewrite & improve text options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3745021518"] = "Vorauswahl von Optionen für „Text umschreiben & verbessern“?" + +-- No rewrite & improve text options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T553954963"] = "Keine Optionen für „Text umschreiben & verbessern“ sind vorausgewählt" + +-- When enabled, you can preselect synonym options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T183953912"] = "Wenn diese Option aktiviert ist, können Sie Synonymoptionen im Voraus auswählen. Dies kann nützlich sein, wenn Sie eine bestimmte Sprache oder ein bestimmtes LLM-Modell bevorzugen." + +-- No synonym options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2183758387"] = "Es sind keine Synonymoptionen vorausgewählt" + +-- Which language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2345162613"] = "Welche Sprache soll vorausgewählt werden?" + +-- Preselect another language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2382415529"] = "Wähle eine andere Sprache aus" + +-- Synonym options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2390458990"] = "Synonymoptionen sind vorausgewählt" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2571465005"] = "Sprache vorauswählen" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T3448155331"] = "Schließen" + +-- Assistant: Synonyms Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T3889117881"] = "Assistent: Synonyme-Optionen" + +-- Preselect synonym options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T4170921846"] = "Synonymoptionen vorauswählen?" + +-- Content cleaner agent is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1013787967"] = "Agent zur Inhaltsbereinigung ist vorausgewählt" + +-- Web content reader is shown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1030372436"] = "Tool zum Lesen von Webinhalten wird angezeigt" + +-- Preselect the summarizer complexity +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T104409170"] = "Wähle die Sprachkomplexität der Zusammenfassungs aus" + +-- Preselect summarizer options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T108151178"] = "Zusammenfasser-Optionen vorauswählen?" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1417990312"] = "Zielsprache vorauswählen" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1462295644"] = "Wähle eine andere Zielsprache aus" + +-- When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1633101895"] = "Wenn aktiviert, wird der Web-Content-Reader ausgeblendet und kann nicht verwendet werden. Dadurch wird die Benutzeroberfläche etwas einfacher zu bedienen." + +-- Web content reader is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1701127912"] = "Das Tool zum Lesen von Webinhalten ist nicht vorab selektiert" + +-- Assistant: Text Summarizer Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1767527569"] = "Assistent: Optionen zur Textzusammenfassung" + +-- Content cleaner agent is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1969816694"] = "Agent zur Inhaltsbereinigung ist nicht vorausgewählt" + +-- Hide the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T2090693677"] = "Web-Content-Reader ausblenden?" + +-- Summarizer options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T2355441996"] = "Optionen für den Zusammenfasser sind vorausgewählt" + +-- Web content reader is hidden +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T2799795311"] = "Web-Content-Reader ist ausgeblendet" + +-- No summarizer options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3215334223"] = "Keine Zusammenfasser-Optionen sind vorausgewählt" + +-- When enabled, the web content reader is preselected. This is might be useful when you prefer to load content from the web very often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3216157681"] = "Wenn aktiviert, ist der Web-Content-Reader vorausgewählt. Das kann hilfreich sein, wenn Sie häufig Inhalte aus dem Internet laden möchten." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3448155331"] = "Schließen" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3547337928"] = "Welche Zielsprache soll vorausgewählt werden?" + +-- Web content reader is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3641773985"] = "Tool zum Lesen von Webinhalten ist vorausgewählt" + +-- Preselect the content cleaner agent? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3649428096"] = "Den Agenten zur Inhaltsbereinigungs vorauswählen?" + +-- When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the content before summarize it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3660434400"] = "Wenn diese Option aktiviert ist, wird der Content Cleaner-Agent automatisch vorausgewählt. Das kann nützlich sein, wenn Sie den Inhalt bereinigen möchten, bevor Sie ihn zusammenfassen." + +-- When enabled, you can preselect the text summarizer options. This is might be useful when you prefer a specific language, complexity, or LLM. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3820844575"] = "Wenn aktiviert, können Sie die Optionen für die Textzusammenfassung im Voraus auswählen. Das kann hilfreich sein, wenn Sie eine bestimmte Sprache, einen bestimmten Schwierigkeitsgrad oder ein bestimmtes LLM bevorzugen." + +-- Which summarizer complexity should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T408530182"] = "Welche Komplexität der Zusammenfassung soll vorausgewählt werden?" + +-- Preselect your expertise +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T51139714"] = "Wählen Sie Ihr Fachgebiet aus" + +-- Preselect the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T629158142"] = "Tool zum Lesen von Webinhalten vorauswählen?" + +-- Content cleaner agent is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1013787967"] = "Agent zur Inhaltsbereinigung ist vorausgewählt" + +-- Assistant: Translator Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1016384269"] = "Assistent: Übersetzer-Optionen" + +-- Web content reader is shown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1030372436"] = "Tool zum Lesen von Webinhalten wird angezeigt" + +-- When enabled, you can preselect the translator options. This is might be useful when you prefer a specific target language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1111006275"] = "Wenn diese Option aktiviert ist, können Sie die Übersetzungsoptionen im Voraus auswählen. Das ist nützlich, wenn Sie eine bestimmte Zielsprache oder ein bestimmtes LLM-Modell bevorzugen." + +-- milliseconds +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1275514075"] = "Millisekunden" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1417990312"] = "Zielsprache vorauswählen" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1462295644"] = "Wähle eine andere Zielsprache aus" + +-- When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1633101895"] = "Wenn aktiviert, wird der Web-Content-Reader ausgeblendet und kann nicht verwendet werden. Dadurch wird die Benutzeroberfläche etwas einfacher zu bedienen." + +-- Web content reader is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1701127912"] = "Tool zum Lesen von Webinhalten ist nicht vorausgewählt" + +-- Live translation is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1825690873"] = "Live-Übersetzung ist nicht vorausgewählt" + +-- Content cleaner agent is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1969816694"] = "Agent zur Inhaltsbereinigung ist nicht vorausgewählt" + +-- Preselect translator options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1989346399"] = "Übersetzeroptionen vorauswählen?" + +-- Hide the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2090693677"] = "Web-Content-Reader ausblenden?" + +-- Translator options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2234531191"] = "Übersetzeroptionen sind vorausgewählt" + +-- Live translation is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2435743076"] = "Live-Übersetzung ist vorausgewählt" + +-- Web content reader is hidden +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2799795311"] = "Tool zum Lesen von Webinhalten ist ausgeblendet" + +-- No translator options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2866358796"] = "Keine Übersetzungseinstellungen sind vorausgewählt" + +-- When enabled, the web content reader is preselected. This is might be useful when you prefer to load content from the web very often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3216157681"] = "Wenn aktiviert, ist der Web-Content-Reader standardmäßig ausgewählt. Das kann nützlich sein, wenn Sie häufig Inhalte aus dem Internet laden möchten." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3448155331"] = "Schließen" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3547337928"] = "Welche Zielsprache soll vorausgewählt werden?" + +-- Web content reader is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3641773985"] = "Tool zum Lesen von Webinhalten ist vorausgewählt" + +-- Preselect the content cleaner agent? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3649428096"] = "Agent zur Inhaltsbereinigung vorauswählen?" + +-- Preselect the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T629158142"] = "Tool zum Lesen von Webinhalten vorauswählen?" + +-- How fast should the live translation react? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T884246296"] = "Wie schnell soll die Live-Übersetzung reagieren?" + +-- When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the content before translating it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T894123480"] = "Wenn aktiviert, ist der Assistent zur Inhaltsbereinigung vorausgewählt. Das kann hilfreich sein, wenn Sie den Inhalt vor der Übersetzung bereinigen möchten." + +-- Preselect live translation? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T918172772"] = "Live-Übersetzung vorauswählen?" + +-- If and when should we delete your disappearing chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T1014418451"] = "Sollen ihre selbstlöschenden Chats gelöscht werden, und wenn ja, wann?" + +-- Workspace display behavior +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T2151409362"] = "Verhalten der Arbeitsbereichs-Anzeige" + +-- Workspace behavior +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T2562846516"] = "Arbeitsbereich-Verhalten" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T3448155331"] = "Schließen" + +-- How should we display your workspaces? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T3566924898"] = "Wie sollen wir ihre Arbeitsbereiche anzeigen?" + +-- Should we store your chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T3942969162"] = "Sollen wir ihre Chats speichern?" + +-- Your Workspaces Configuration +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T404802870"] = "Konfiguration ihrer Arbeitsbereiche" + +-- Workspace maintenance +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T49653413"] = "Arbeitsbereich-Wartung" + +-- Which writing style should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1173034744"] = "Welcher Schreibstil soll standardmäßig ausgewählt sein?" + +-- Preselect a greeting? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1254399201"] = "Begrüßung vorauswählen?" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1417990312"] = "Zielsprache vorauswählen" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1462295644"] = "Eine andere Zielsprache auswählen" + +-- Assistant: Writing E-Mails Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2021226503"] = "Assistent: Optionen zum Schreiben von E-Mails" + +-- When enabled, you can preselect the e-mail options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2116404483"] = "Wenn diese Option aktiviert ist, können Sie die E-Mail-Optionen im Voraus auswählen. Dies kann nützlich sein, wenn Sie eine bestimmte Sprache oder ein bestimmtes LLM-Modell bevorzugen." + +-- Preselect your name for the closing salutation? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T221974240"] = "Ihren Namen für die Grußformel vorauswählen?" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?" + +-- Preselect a writing style +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T28456020"] = "Wähle einen Schreibstil vor" + +-- E-Mail options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2985974420"] = "E-Mail-Optionen sind vorausgewählt" + +-- No e-mail options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3047605763"] = "Keine E-Mail-Optionen sind vorausgewählt" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3448155331"] = "Schließen" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3547337928"] = "Welche Zielsprache soll vorausgewählt werden?" + +-- Preselect e-mail options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3832719342"] = "E-Mail-Optionen vorauswählen?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T4004501229"] = "Eines ihrer Profile vorauswählen?" + +-- Chat name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T1746586282"] = "Chat-Name" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T900713019"] = "Abbrechen" + +-- Install now +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T2366359512"] = "Jetzt installieren" + +-- Update from v{0} to v{1} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T25417398"] = "Aktualisieren von v{0} auf v{1}" + +-- Install later +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T2936430090"] = "Später installieren" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T900713019"] = "Abbrechen" + +-- Settings +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1258653480"] = "Einstellungen" + +-- Home +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1391791790"] = "Startseite" + +-- About +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1491113694"] = "Über AI Studio" + +-- Are you sure you want to leave the chat page? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1563130494"] = "Sind Sie sicher, dass Sie die Chat-Seite verlassen möchten? Alle nicht gespeicherten Änderungen gehen verloren." + +-- Assistants +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1614176092"] = "Assistenten" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1847791252"] = "Aktualisieren" + +-- Leave Chat Page +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2124749705"] = "Chat-Seite verlassen" + +-- Plugins +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2222816203"] = "Plugins" + +-- An update to version {0} is available. +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2800137365"] = "Ein Update auf Version {0} ist verfügbar." + +-- Please wait for the update to complete... +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2864211629"] = "Bitte warten Sie, bis das Update abgeschlossen ist ..." + +-- Supporters +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2929332068"] = "Unterstützer" + +-- Writing +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2979224202"] = "Schreiben" + +-- Show details +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T3692372066"] = "Details anzeigen" + +-- Chat +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T578410699"] = "Chat" + +-- Startup log file +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1019424746"] = "Startprotokolldatei" + +-- About MindWork AI Studio +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1020427799"] = "Über MindWork AI Studio" + +-- Browse AI Studio's source code on GitHub — we welcome your contributions. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1107156991"] = "Sehen Sie sich den Quellcode von AI Studio auf GitHub an – wir freuen uns über ihre Beiträge." + +-- This library is used to read PDF files. This is necessary, e.g., for using PDFs as a data source for a chat. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1388816916"] = "Diese Bibliothek wird verwendet, um PDF-Dateien zu lesen. Das ist zum Beispiel notwendig, um PDFs als Datenquelle für einen Chat zu nutzen." + +-- This library is used to extend the MudBlazor library. It provides additional components that are not part of the MudBlazor library. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1421513382"] = "Diese Bibliothek wird verwendet, um die MudBlazor-Bibliothek zu erweitern. Sie stellt zusätzliche Komponenten bereit, die nicht Teil der MudBlazor-Bibliothek sind." + +-- We use Lua as the language for plugins. Lua-CSharp lets Lua scripts communicate with AI Studio and vice versa. Thank you, Yusuke Nakada, for this great library. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T162898512"] = "Wir verwenden Lua als Sprache für Plugins. Lua-CSharp ermöglicht die Kommunikation zwischen Lua-Skripten und AI Studio in beide Richtungen. Vielen Dank an Yusuke Nakada für diese großartige Bibliothek." + +-- Building on .NET, ASP.NET Core, and Blazor, MudBlazor is used as a library for designing and developing the user interface. It is a great project that significantly accelerates the development of advanced user interfaces with Blazor. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1629800076"] = "Basierend auf .NET, ASP.NET Core und Blazor wird MudBlazor als Bibliothek für das Design und die Entwicklung der Benutzeroberfläche verwendet. Es ist ein großartiges Projekt, das die Entwicklung fortschrittlicher Benutzeroberflächen mit Blazor erheblich beschleunigt." + +-- AI Studio creates a log file at startup, in which events during startup are recorded. After startup, another log file is created that records all events that occur during the use of the app. This includes any errors that may occur. Depending on when an error occurs (at startup or during use), the contents of these log files can be helpful for troubleshooting. Sensitive information such as passwords is not included in the log files. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1630237140"] = "AI Studio erstellt beim Start eine Protokolldatei, in der Ereignisse während des Starts aufgezeichnet werden. Nach dem Start wird eine weitere Protokolldatei erstellt, die alle Ereignisse während der Nutzung der App dokumentiert. Dazu gehören auch eventuell auftretende Fehler. Je nachdem, wann ein Fehler auftritt (beim Start oder während der Nutzung), können die Inhalte dieser Protokolldateien bei der Fehlerbehebung hilfreich sein. Sensible Informationen wie Passwörter werden nicht in den Protokolldateien gespeichert." + +-- This library is used to display the differences between two texts. This is necessary, e.g., for the grammar and spelling assistant. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1772678682"] = "Diese Bibliothek wird verwendet, um die Unterschiede zwischen zwei Texten anzuzeigen. Das ist zum Beispiel für den Grammatik- und Rechtschreibassistenten notwendig." + +-- By clicking on the respective path, the path is copied to the clipboard. You might open these files with a text editor to view their contents. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1806897624"] = "Wenn Sie auf den jeweiligen Pfad klicken, wird dieser in die Zwischenablage kopiert. Sie können diese Dateien mit einem Texteditor öffnen, um ihren Inhalt anzusehen." + +-- Check for updates +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1890416390"] = "Nach Updates suchen" + +-- Vision +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1892426825"] = "Vision" + +-- This library is used to convert HTML to Markdown. This is necessary, e.g., when you provide a URL as input for an assistant. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1924365263"] = "Diese Bibliothek wird verwendet, um HTML in Markdown umzuwandeln. Das ist zum Beispiel notwendig, wenn Sie eine URL als Eingabe für einen Assistenten angeben." + +-- We use Rocket to implement the runtime API. This is necessary because the runtime must be able to communicate with the user interface (IPC). Rocket is a great framework for implementing web APIs in Rust. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1943216839"] = "Wir verwenden Rocket zur Implementierung der Runtime-API. Dies ist notwendig, da die Runtime mit der Benutzeroberfläche (IPC) kommunizieren muss. Rocket ist ein ausgezeichnetes Framework zur Umsetzung von Web-APIs in Rust." + +-- This library is used to determine the file type of a file. This is necessary, e.g., when we want to stream a file. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2173617769"] = "Diese Bibliothek wird verwendet, um den Dateityp einer Datei zu bestimmen. Das ist zum Beispiel notwendig, wenn wir eine Datei streamen möchten." + +-- For the secure communication between the user interface and the runtime, we need to create certificates. This Rust library is great for this purpose. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2174764529"] = "Für die sichere Kommunikation zwischen der Benutzeroberfläche und der Laufzeit müssen wir Zertifikate erstellen. Diese Rust-Bibliothek eignet sich hervorragend dafür." + +-- We must generate random numbers, e.g., for securing the interprocess communication between the user interface and the runtime. The rand library is great for this purpose. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2273492381"] = "Wir müssen Zufallszahlen erzeugen, z. B. um die Kommunikation zwischen der Benutzeroberfläche und der Laufzeitumgebung abzusichern. Die rand-Bibliothek eignet sich dafür hervorragend." + +-- In order to use any LLM, each user must store their so-called token for each LLM provider. This token must be kept secure, similar to a password. The safest way to do this is offered by operating systems like macOS, Windows, and Linux: They have mechanisms to store such data, if available, on special security hardware. Since this is currently not possible in .NET, we use this Rust library. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T228561878"] = "Um ein beliebiges LLM nutzen zu können, muss jeder Benutzer seinen sogenannten Token für jeden LLM-Anbieter speichern. Dieser Token muss sicher aufbewahrt werden, ähnlich wie ein Passwort. Am sichersten gelingt dies mit den Betriebssystemen wie macOS, Windows und Linux: Sie verfügen über Mechanismen, solche Daten – sofern vorhanden – auf spezieller Sicherheits-Hardware zu speichern. Da dies in .NET derzeit nicht möglich ist, verwenden wir diese Rust-Bibliothek." + +-- The C# language is used for the implementation of the user interface and the backend. To implement the user interface with C#, the Blazor technology from ASP.NET Core is used. All these technologies are integrated into the .NET SDK. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2329884315"] = "Die Programmiersprache C# wird für die Umsetzung der Benutzeroberfläche und des Backends verwendet. Für die Entwicklung der Benutzeroberfläche mit C# kommt die Blazor-Technologie aus ASP.NET Core zum Einsatz. Alle diese Technologien sind im .NET SDK integriert." + +-- Used PDFium version +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2368247719"] = "Verwendete PDFium-Version" + +-- This library is used to determine the language of the operating system. This is necessary to set the language of the user interface. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2557014401"] = "Diese Bibliothek wird verwendet, um die Sprache des Betriebssystems zu erkennen. Dies ist notwendig, um die Sprache der Benutzeroberfläche einzustellen." + +-- Used Open Source Projects +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2557066213"] = "Verwendete Open-Source-Projekte" + +-- Build time +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T260228112"] = "Build-Zeit" + +-- To be able to use the responses of the LLM in other apps, we often use the clipboard of the respective operating system. Unfortunately, in .NET there is no solution that works with all operating systems. Therefore, I have opted for this library in Rust. This way, data transfer to other apps works on every system. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2644379659"] = "Um die Antworten des LLM in anderen Apps nutzen zu können, verwenden wir häufig die Zwischenablage des jeweiligen Betriebssystems. Leider gibt es in .NET keine Lösung, die auf allen Betriebssystemen funktioniert. Deshalb habe ich mich für diese Bibliothek in Rust entschieden. So funktioniert die Datenübertragung zu anderen Apps auf jedem System." + +-- Usage log file +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2689995864"] = "Nutzungsprotokolldatei" + +-- Logbook +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2706940196"] = "Protokolldateien" + +-- This component is used to render Markdown text. This is important because the LLM often responds with Markdown-formatted text, allowing us to present it in a way that is easier to read. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2726131107"] = "Diese Komponente wird verwendet, um Markdown-Text darzustellen. Das ist wichtig, weil das LLM häufig mit im Markdown-Format formatiertem Text antwortet. Dadurch können wir die Antworten besser lesbar anzeigen." + +-- Code in the Rust language can be specified as synchronous or asynchronous. Unlike .NET and the C# language, Rust cannot execute asynchronous code by itself. Rust requires support in the form of an executor for this. Tokio is one such executor. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2777988282"] = "Code in der Programmiersprache Rust kann als synchron oder asynchron spezifiziert werden. Im Gegensatz zu .NET und der Sprache C# kann Rust asynchronen Code jedoch nicht von selbst ausführen. Dafür benötigt Rust Unterstützung in Form eines Executors. Tokio ist ein solcher Executor." + +-- View our project roadmap and help shape AI Studio's future development. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2829971158"] = "Sehen Sie sich unsere Roadmap an und helfen Sie mit, die zukünftige Entwicklung von AI Studio mitzugestalten." + +-- Used .NET runtime +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2840227993"] = "Verwendete .NET-Laufzeit" + +-- Explanation +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2840582448"] = "Erklärung" + +-- The .NET backend cannot be started as a desktop app. Therefore, I use a second backend in Rust, which I call runtime. With Rust as the runtime, Tauri can be used to realize a typical desktop app. Thanks to Rust, this app can be offered for Windows, macOS, and Linux desktops. Rust is a great language for developing safe and high-performance software. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2868174483"] = "Das .NET-Backend kann nicht als Desktop-App gestartet werden. Deshalb verwende ich ein zweites Backend in Rust, das ich „Runtime“ nenne. Mit Rust als Runtime kann Tauri genutzt werden, um eine typische Desktop-App zu realisieren. Dank Rust kann diese App für Windows-, macOS- und Linux-Desktops angeboten werden. Rust ist eine großartige Sprache für die Entwicklung sicherer und leistungsstarker Software." + +-- Changelog +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3017574265"] = "Änderungsprotokoll" + +-- Connect AI Studio to your organization's data with our External Retrieval Interface (ERI). +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T313276297"] = "Verbinden Sie AI Studio mit den Daten ihrer Organisation über unsere Schnittstelle für externe Datenabfrage (ERI)." + +-- Have feature ideas? Submit suggestions for future AI Studio enhancements. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3178730036"] = "Haben Sie Ideen für neue Funktionen? Senden Sie uns Vorschläge für zukünftige Verbesserungen von AI Studio." + +-- Discover MindWork AI's mission and vision on our official homepage. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3294830584"] = "Entdecken Sie die Mission und Vision von MindWork AI auf unserer offiziellen Homepage." + +-- User-language provided by the OS +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3334355246"] = "Vom Betriebssystem bereitgestellte Sprache" + +-- The following list shows the versions of the MindWork AI Studio, the used compilers, build time, etc.: +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3405978777"] = "Die folgende Liste zeigt die Versionen von MindWork AI Studio und des verwendeten Compilers, den Build-Zeitpunkt und weitere Informationen:" + +-- Used Rust compiler +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3440211747"] = "Verwendeter Rust-Compiler" + +-- Tauri is used to host the Blazor user interface. It is a great project that allows the creation of desktop applications using web technologies. I love Tauri! +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3494984593"] = "Tauri wird verwendet, um die Blazor-Benutzeroberfläche bereitzustellen. Es ist ein großartiges Projekt, das die Erstellung von Desktop-Anwendungen mit Webtechnologien ermöglicht. Ich liebe Tauri!" + +-- Motivation +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3563271893"] = "Motivation" + +-- This library is used to read Excel and OpenDocument spreadsheet files. This is necessary, e.g., for using spreadsheets as a data source for a chat. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3722989559"] = "Diese Bibliothek wird verwendet, um Excel- und OpenDocument-Tabellendateien zu lesen. Dies ist zum Beispiel notwendig, wenn Tabellen als Datenquelle für einen Chat verwendet werden sollen." + +-- Now we have multiple systems, some developed in .NET and others in Rust. The data format JSON is responsible for translating data between both worlds (called data serialization and deserialization). Serde takes on this task in the Rust world. The counterpart in the .NET world is an integral part of .NET and is located in System.Text.Json. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3908558992"] = "Jetzt haben wir mehrere Systeme, einige entwickelt in .NET und andere in Rust. Das Datenformat JSON ist dafür zuständig, Daten zwischen beiden Welten zu übersetzen (dies nennt man Serialisierung und Deserialisierung von Daten). In der Rust-Welt übernimmt Serde diese Aufgabe. Das Pendant in der .NET-Welt ist ein fester Bestandteil von .NET und findet sich in System.Text.Json." + +-- Versions +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4010195468"] = "Versionen" + +-- This library is used to create asynchronous streams in Rust. It allows us to work with streams of data that can be produced asynchronously, making it easier to handle events or data that arrive over time. We use this, e.g., to stream arbitrary data from the file system to the embedding system. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4079152443"] = "Diese Bibliothek wird verwendet, um asynchrone Datenströme in Rust zu erstellen. Sie ermöglicht es uns, mit Datenströmen zu arbeiten, die asynchron bereitgestellt werden, wodurch sich Ereignisse oder Daten, die nach und nach eintreffen, leichter verarbeiten lassen. Wir nutzen dies zum Beispiel, um beliebige Daten aus dem Dateisystem an das Einbettungssystem zu übertragen." + +-- Community & Code +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4158546761"] = "Community & Code" + +-- We use the HtmlAgilityPack to extract content from the web. This is necessary, e.g., when you provide a URL as input for an assistant. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4184485147"] = "Wir verwenden das HtmlAgilityPack, um Inhalte aus dem Internet zu extrahieren. Das ist zum Beispiel notwendig, wenn Sie eine URL als Eingabe für einen Assistenten angeben." + +-- When transferring sensitive data between Rust runtime and .NET app, we encrypt the data. We use some libraries from the Rust Crypto project for this purpose: cipher, aes, cbc, pbkdf2, hmac, and sha2. We are thankful for the great work of the Rust Crypto project. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4229014037"] = "Beim Übertragen sensibler Daten zwischen der Rust-Laufzeitumgebung und der .NET-Anwendung verschlüsseln wir die Daten. Dafür verwenden wir einige Bibliotheken aus dem Rust Crypto-Projekt: cipher, aes, cbc, pbkdf2, hmac und sha2. Wir sind dankbar für die großartige Arbeit des Rust Crypto-Projekts." + +-- This is a library providing the foundations for asynchronous programming in Rust. It includes key trait definitions like Stream, as well as utilities like join!, select!, and various futures combinator methods which enable expressive asynchronous control flow. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T566998575"] = "Dies ist eine Bibliothek, die die Grundlagen für asynchrones Programmieren in Rust bereitstellt. Sie enthält zentrale Trait-Definitionen wie Stream sowie Hilfsfunktionen wie join!, select! und verschiedene Methoden zur Kombination von Futures, die einen ausdrucksstarken asynchronen Kontrollfluss ermöglichen." + +-- Used .NET SDK +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T585329785"] = "Verwendetes .NET SDK" + +-- Did you find a bug or are you experiencing issues? Report your concern here. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T639371534"] = "Haben Sie einen Fehler gefunden oder Probleme festgestellt? Melden Sie Ihr Anliegen hier." + +-- This Rust library is used to output the app's messages to the terminal. This is helpful during development and troubleshooting. This feature is initially invisible; when the app is started via the terminal, the messages become visible. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T64689067"] = "Diese Rust-Bibliothek wird verwendet, um die Nachrichten der App im Terminal auszugeben. Das ist während der Entwicklung und Fehlersuche hilfreich. Diese Funktion ist zunächst unsichtbar; werden App über das Terminal gestartet, werden die Nachrichten sichtbar." + +-- For some data transfers, we need to encode the data in base64. This Rust library is great for this purpose. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T870640199"] = "Für einige Datenübertragungen müssen wir die Daten in Base64 kodieren. Diese Rust-Bibliothek eignet sich dafür hervorragend." + +-- Get coding and debugging support from an LLM. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1243850917"] = "Erhalten Sie Unterstützung beim Programmieren und Debuggen durch ein KI-Modell." + +-- Business +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T131837803"] = "Business" + +-- Legal Check +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1348190638"] = "Rechtliche Prüfung" + +-- General +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1432485131"] = "Allgemein" + +-- Grammar & Spelling +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1514925962"] = "Grammatik & Rechtschreibung" + +-- Assistants +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1614176092"] = "Assistenten" + +-- Coding +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1617786407"] = "Programmieren" + +-- Analyze a text or an email for tasks you need to complete. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1728590051"] = "Analysieren Sie einen Text oder eine E-Mail nach Aufgaben, die Sie erledigen müssen." + +-- Text Summarizer +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1907192403"] = "Texte zusammenfassen" + +-- Check grammar and spelling of a given text. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1934717573"] = "Grammatik und Rechtschreibung eines gegebenen Textes überprüfen." + +-- Translate text into another language. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T209791153"] = "Text in eine andere Sprache übersetzen." + +-- Generate an e-mail for a given context. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2383649630"] = "Erstellen Sie eine E-Mail für einen bestimmten Kontext." + +-- Generate an agenda for a given meeting, seminar, etc. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2406168562"] = "Erstellen Sie eine Tagesordnung für eine bestimmte Besprechung, ein Seminar usw." + +-- Agenda Planner +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2435638853"] = "Agenda-Assistent" + +-- Synonyms +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2547582747"] = "Synonyme" + +-- Find synonyms for a given word or phrase. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2712131461"] = "Finde Synonyme für ein angegebenes Wort oder eine Phrase." + +-- AI Studio Development +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2830810750"] = "AI Studio Entwicklung" + +-- Generate a job posting for a given job description. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2831103254"] = "Erstellen Sie eine Stellenanzeige anhand einer vorgegebenen Stellenbeschreibung." + +-- My Tasks +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3011450657"] = "Meine Aufgaben" + +-- E-Mail +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3026443472"] = "E-Mail" + +-- Translate AI Studio text content into other languages +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3181803840"] = "AI Studio Textinhalte in andere Sprachen übersetzen." + +-- Software Engineering +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3260960011"] = "Software-Entwicklung" + +-- Rewrite & Improve +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3309133329"] = "Umformulieren & Verbessern" + +-- Icon Finder +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3693102312"] = "Icon Finder" + +-- Generate an ERI server to integrate business systems. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3756213118"] = "Erstellen Sie einen ERI-Server zur Integration von Geschäftssystemen." + +-- Use an LLM to find an icon for a given context. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3881504200"] = "Verwenden Sie ein LLM, um ein Icon für einen bestimmten Kontext zu finden." + +-- Job Posting +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3930052338"] = "Stellenanzeige" + +-- Ask a question about a legal document. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3970214537"] = "Stellen Sie Fragen zu einem juristischen Dokument." + +-- ERI Server +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T4204533420"] = "ERI-Server" + +-- Use an LLM to summarize a given text. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T502222021"] = "Verwenden Sie ein LLM, um einen gegebenen Text zusammenzufassen." + +-- Translation +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T613888204"] = "Übersetzung" + +-- Rewrite and improve a given text for a chosen style. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T722167136"] = "Einen gegebenen Text für einen gewählten Stil umformulieren und verbessern." + +-- Learning +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T755590027"] = "Lernen" + +-- Bias of the Day +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T782102948"] = "Vorurteil des Tages" + +-- Learn about one cognitive bias every day. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T878695986"] = "Lerne jeden Tag einen kognitiven Bias kennen." + +-- Localization +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T897888480"] = "Lokalisierung" + +-- Hide your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2351468526"] = "Arbeitsbereiche ausblenden" + +-- Open Chat Options +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2813205227"] = "Chat-Optionen öffnen" + +-- Disappearing Chat +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T3046519404"] = "Selbstlöschender Chat" + +-- Configure your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T3586092784"] = "Konfigurieren Sie ihre Arbeitsbereiche" + +-- Your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T3745240468"] = "Ihre Arbeitsbereiche" + +-- Open Workspaces Configuration +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T383344787"] = "Arbeitsbereiche-Konfiguration öffnen" + +-- Show the chat options +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T4132756393"] = "Chat-Optionen anzeigen" + +-- Chat in Workspace +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T582100343"] = "Chat im Arbeitsbereich" + +-- Show your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T733672375"] = "Arbeitsbereiche anzeigen" + +-- Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1009708591"] = "Im Gegensatz zu Diensten wie ChatGPT, die nach intensiver Nutzung Einschränkungen verhängen, bietet MindWork AI Studio unbegrenzte Nutzung über die API des Anbieters." + +-- Welcome to MindWork AI Studio! +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1024253064"] = "Willkommen bei MindWork AI Studio!" + +-- Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1146553980"] = "Vielen Dank, dass Sie MindWork AI Studio für ihre KI-Anwendungen in Betracht ziehen. Diese App wurde entwickelt, um Ihnen die Nutzung von leistungsstarken Sprachmodellen (LLMs) zu ermöglichen. Bitte beachten Sie, dass die App kein integriertes LLM enthält. Stattdessen benötigen Sie einen API-Schlüssel von einem passenden Anbieter." + +-- The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T144565305"] = "Die App benötigt nur wenig Speicherplatz für die Installation und verwendet wenig Arbeitsspeicher. Außerdem hat sie einen minimalen Einfluss auf die Systemressourcen, was sich positiv auf die Akkulaufzeit auswirkt." + +-- You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T149711988"] = "Sie zahlen nur für das, was Sie tatsächlich nutzen – das kann günstiger sein als monatliche Abos wie ChatGPT Plus, vor allem bei gelegentlicher Nutzung. Aber Vorsicht: Bei sehr intensiver Nutzung können die API-Kosten deutlich höher ausfallen. Leider bieten die Anbieter derzeit keine Möglichkeit, die aktuellen Kosten direkt in der App anzuzeigen. Prüfen Sie deshalb regelmäßig Ihr Konto beim jeweiligen Anbieter, um ihre Ausgaben im Blick zu behalten. Nutzen Sie, wenn möglich, Prepaid-Optionen und legen Sie ein Ausgabenlimit fest." + +-- Assistants +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1614176092"] = "Assistenten" + +-- Unrestricted usage +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1686815996"] = "Unbeschränkte Nutzung" + +-- Introduction +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1702902297"] = "Einführung" + +-- Vision +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1892426825"] = "Vision" + +-- You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT4o, o1, etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), Hugging Face, and self-hosted models using llama.cpp, ollama, LM Studio, Groq, or Fireworks. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2217921237"] = "Sie sind nicht an einen einzelnen Anbieter gebunden. Stattdessen können Sie den Anbieter wählen, der am besten zu ihren Bedürfnissen passt. Aktuell unterstützen wir OpenAI (GPT4o, o1 usw.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), Hugging Face sowie selbst gehostete Modelle mit llama.cpp, ollama, LM Studio, Groq oder Fireworks. Für Wissenschaftler und Beschäftigte von Forschungseinrichtungen unterstützen wir außerdem die KI-Dienste von Helmholtz und GWDG. Diese sind über föderierte Logins wie eduGAIN für alle 18 Helmholtz-Zentren, die Max-Planck-Gesellschaft, die meisten deutschen sowie viele internationale Universitäten verfügbar." + +-- Let's get started +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2331588413"] = "Los geht's" + +-- Last Changelog +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2348849647"] = "Letztes Änderungsprotokoll" + +-- Choose the provider and model best suited for your current task. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2588488920"] = "Wählen Sie den Anbieter und das Modell aus, die am besten zu ihrer aktuellen Aufgabe passen." + +-- Quick Start Guide +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3002014720"] = "Schnellstart-Anleitung" + +-- You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3228075421"] = "Sie möchten einfach schnell einen Text übersetzen? Für solche und andere Aufgaben gibt es in AI Studio sogenannte Assistenten. Beim Arbeiten mit diesen Assistenten sind keine Eingabeaufforderungen erforderlich." + +-- We hope you enjoy using MindWork AI Studio to bring your AI projects to life! +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3275341342"] = "Wir hoffen, dass Sie viel Freude daran haben, mit MindWork AI Studio ihre KI-Projekte zum Leben zu erwecken!" + +-- Cost-effective +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3341379752"] = "Kosteneffizient" + +-- Flexibility +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3723223888"] = "Flexibilität" + +-- Privacy +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3959064551"] = "Datenschutz" + +-- You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T457410099"] = "Sie können über die Einstellungen zur Anbietervertrauenswürdigkeit steuern, welche Anbieter ihre Daten erhalten. Zum Beispiel können Sie für das Schreiben von E-Mails einen anderen Schutzlevel festlegen als für allgemeine Chats usw. Außerdem garantieren die meisten Anbieter, dass ihre Daten nicht zum Trainieren neuer KI-Systeme verwendet werden." + +-- Free of charge +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T617579208"] = "Kostenlos" + +-- Independence +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T649448159"] = "Unabhängigkeit" + +-- No bloatware +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T858047957"] = "Keinen unnötigen Software-Balast" + +-- Here's what makes MindWork AI Studio stand out: +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T873851215"] = "Das zeichnet MindWork AI Studio aus:" + +-- The app is free to use, both for personal and commercial purposes. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T91074375"] = "Die App ist sowohl für private als auch für kommerzielle Zwecke kostenlos nutzbar." + +-- Disable plugin +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T1430375822"] = "Plugin deaktivieren" + +-- Internal Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T158493184"] = "Interne Plugins" + +-- Disabled Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T1724138133"] = "Deaktivierte Plugins" + +-- Enable plugin +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T2057806005"] = "Plugin aktivieren" + +-- Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T2222816203"] = "Plugins" + +-- Enabled Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T2738444034"] = "Aktivierte Plugins" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3865031940"] = "Aktionen" + +-- Settings +UI_TEXT_CONTENT["AISTUDIO::PAGES::SETTINGS::T1258653480"] = "Einstellungen" + +-- Thank you for being the first to contribute a one-time donation. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1470916504"] = "Vielen Dank, dass Sie als Erste:r eine einmalige Spende geleistet haben." + +-- Thank you, Peer, for your courage in being the second person to support the project financially. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1714878838"] = "Danke, Peer, für deinen Mut, als zweite Person das Projekt finanziell zu unterstützen." + +-- Individual Contributors +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1874835680"] = "Einzelspender" + +-- Thanks, Nils, for taking the time to learn Rust and build the foundation for local retrieval. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2355807535"] = "Danke, Nils, dass du dir die Zeit genommen hast, Rust zu lernen und die Grundlage für die lokale Suche zu schaffen." + +-- The first 10 supporters who make a one-time contribution: +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2410456125"] = "Die ersten 10 Spender, die einen einmaligen Beitrag geleistet haben:" + +-- We would like to thank the DLR for its courage in supporting MindWork AI Studio at an early stage. The DLR not only uses AI Studio in various projects but also supports its further development with personnel resources. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2438064678"] = "Wir bedanken uns beim DLR, dass es so mutig war, MindWork AI Studio in einem frühen Stadium zu unterstützen. Das DLR setzt AI Studio nicht nur im Rahmen verschiedener Projekte ein, sondern unterstützt die Weiterentwicklung mit Personalressourcen." + +-- Become one of our titans +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2640760894"] = "Werde einer unserer Titanen" + +-- Supporters +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2929332068"] = "Unterstützer" + +-- Content Contributors +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3060804484"] = "Inhaltliche Beiträge" + +-- Financial Support +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3061261435"] = "Finanzielle Unterstützung" + +-- German Aerospace Center (DLR) +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3264998714"] = "Deutsches Zentrum für Luft- und Raumfahrt (DLR)" + +-- The first 10 supporters who make a monthly contribution: +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3364384944"] = "Die ersten 10 Spender, die einen monatlichen Beitrag leisten:" + +-- Thank you, Richard, for being the first. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3660718138"] = "Danke, Richard, dass du der Erste warst." + +-- Thanks Dominic for being the third supporter. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3664780201"] = "Danke, Dominic, dass du als dritter Unterstützer dabei bist." + +-- Our Titans +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3805270964"] = "Unsere Titanen" + +-- Moderation, Design, Wiki, and Documentation +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3821668394"] = "Moderation, Design, Wiki und Dokumentation" + +-- Thank you, Peer, for familiarizing yourself with C#, providing excellent contributions like the Alibaba and Hugging Face providers, and revising the settings management. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4106820759"] = "Vielen Dank, Peer, dass du dich mit C# vertraut gemacht, großartige Beiträge wie die Alibaba- und Hugging-Face-Anbieter geleistet und die Verwaltung der Einstellungen überarbeitet hast." + +-- Code Contributions +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4135925647"] = "Code-Beiträge" + +-- Become a contributor +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T414604046"] = "Werden Sie Spender" + +-- In this section, we highlight the titan supporters of MindWork AI Studio. Titans are prestigious companies that provide significant support to our mission. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4270177642"] = "In diesem Abschnitt stellen wir die Titanen-Unterstützer von MindWork AI Studio vor. Titanen sind renommierte Unternehmen, die unsere Mission maßgeblich unterstützen." + +-- Thanks Luc for your build script contribution. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T432023389"] = "Danke, Luc, für deinen Beitrag zum Build-Skript." + +-- For companies, sponsoring MindWork AI Studio is not only a way to support innovation but also a valuable opportunity for public relations and marketing. Your company's name and logo will be featured prominently, showcasing your commitment to using cutting-edge AI tools and enhancing your reputation as an innovative enterprise. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T68519158"] = "Für Unternehmen ist das Sponsoring von MindWork AI Studio nicht nur eine Möglichkeit, Innovationen zu unterstützen, sondern auch eine wertvolle Chance für Öffentlichkeitsarbeit und Marketing. Der Name und das Logo ihres Unternehmens werden prominent präsentiert und zeigen Ihr Engagement für den Einsatz fortschrittlicher KI-Werkzeuge sowie ihren Ruf als innovatives Unternehmen." + +-- Thanks for your build script contribution. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T686206269"] = "Vielen Dank für deinen Beitrag zum Build-Skript." + +-- Business Contributors +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T838479287"] = "Spenden von Unternehmen" + +-- Thank you very much, Kerstin, for taking care of creating the Wiki. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T991294232"] = "Vielen herzlichen Dank, Kerstin, dass du dich um die Erstellung des Wikis gekümmert hast." + +-- Write your text +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T2220943334"] = "Schreiben Sie ihren Text" + +-- Writer +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T2979224202"] = "Autor" + +-- Suggestion +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T3948127789"] = "Vorschlag" + +-- Your stage directions +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T779923726"] = "Ihre Regieanweisungen" + +-- Tried to communicate with the LLM provider '{0}'. The API key might be invalid. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1073493061"] = "Es wurde versucht mit dem LLM-Anbieter '{0}' zu kommunizieren. Der API-Schlüssel könnte ungültig sein. Die Anbietermeldung lautet: '{1}'" + +-- Tried to stream the LLM provider '{0}' answer. There were some problems with the stream. The message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1487597412"] = "Beim Versuch, die Antwort des LLM-Anbieters '{0}' zu streamen, sind Probleme aufgetreten. Die Meldung lautet: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. The required message format might be changed. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1674355816"] = "Es wurde versucht, mit dem LLM-Anbieter '{0}' zu kommunizieren. Das erforderliche Nachrichtenformat könnte sich geändert haben. Die Mitteilung des Anbieters lautet: '{1}'" + +-- Tried to stream the LLM provider '{0}' answer. Was not able to read the stream. The message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1856278860"] = "Der Versuch, die Antwort des LLM-Anbieters '{0}' zu streamen, ist fehlgeschlagen. Der Stream konnte nicht gelesen werden. Die Meldung lautet: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. Even after {1} retries, there were some problems with the request. The provider message is: '{2}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T2249520705"] = "Es wurde versucht, mit dem LLM-Anbieter '{0}' zu kommunizieren. Auch nach {1} Versuchen gab es Probleme mit der Anfrage. Die Nachricht des Anbieters lautet: '{2}'" + +-- Tried to communicate with the LLM provider '{0}'. Something was not found. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T2780552614"] = "Es wurde versucht, mit dem LLM-Anbieter '{0}' zu kommunizieren. Etwas wurde nicht gefunden. Die Meldung des Anbieters lautet: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. There were some problems with the request. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T3573577433"] = "Es wurde versucht, mit dem LLM-Anbieter '{0}' zu kommunizieren. Dabei sind Probleme bei der Anfrage aufgetreten. Die Meldung des Anbieters lautet: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. The server might be down or having issues. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T3806716694"] = "Es wurde versucht, mit dem LLM-Anbieter '{0}' zu kommunizieren. Der Server ist möglicherweise nicht erreichbar oder hat Probleme. Die Anbietermeldung lautet: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. The provider is overloaded. The message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T4179546180"] = "Es wurde versucht, mit dem LLM-Anbieter '{0}' zu kommunizieren. Der Anbieter ist überlastet. Die Meldung lautet: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. You might not be able to use this provider from your location. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T862369179"] = "Es wurde versucht, mit dem LLM-Anbieter '{0}' zu kommunizieren. Möglicherweise können Sie diesen Anbieter von ihrem Standort aus nicht nutzen. Die Mitteilung des Anbieters lautet: '{1}'" + +-- The trust level of this provider **has not yet** been thoroughly **investigated and evaluated**. We do not know if your data is safe. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T1014558951"] = "Das Vertrauensniveau dieses Anbieters wurde **noch nicht** gründlich **untersucht und bewertet**. Wir wissen nicht, ob ihre Daten sicher sind." + +-- You or your organization operate the LLM locally or within your trusted network. In terms of data processing and security, this is the best possible way. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T2124364471"] = "Sie oder ihre Organisation betreiben das LLM lokal oder innerhalb ihres vertrauenswürdigen Netzwerks. In Bezug auf Datenverarbeitung und Sicherheit ist dies die bestmögliche Lösung." + +-- The provider is located in the EU and is subject to the **GDPR** (General Data Protection Regulation). Additionally, the provider states that **your data is not used for training**. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3010553924"] = "Der Anbieter hat seinen Sitz in der EU und unterliegt der **DSGVO** (Datenschutz-Grundverordnung). Außerdem gibt der Anbieter an, dass **ihre Daten nicht zum Training verwendet werden**." + +-- No provider selected. Please select a provider to get see its confidence level. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3368531176"] = "Kein Anbieter ausgewählt. Bitte wählen Sie einen Anbieter aus, um dessen Vertrauensniveau zu sehen." + +-- The provider operates its service from the USA and is subject to **US jurisdiction**. In case of suspicion, authorities in the USA can access your data. However, **your data is not used for training** purposes. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3528165925"] = "Der Anbieter betreibt seinen Dienst aus den USA und unterliegt der **US-amerikanischen Gerichtsbarkeit**. Bei Verdacht können US-Behörden auf ihre Daten zugreifen. **ihre Daten werden jedoch nicht für Trainingszwecke** verwendet." + +-- The provider operates its service from the USA and is subject to **U.S. jurisdiction**. In case of suspicion, authorities in the USA can access your data. Please inform yourself about the use of your data. We do not know if your data is safe. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3788466789"] = "Der Anbieter betreibt seinen Service in den USA und unterliegt der **US-amerikanischen Gerichtsbarkeit**. Im Verdachtsfall können US-Behörden auf ihre Daten zugreifen. Bitte informieren Sie sich über die Verwendung ihrer Daten. Wir wissen nicht, ob ihre Daten sicher sind." + +-- The provider operates its service from China. In case of suspicion, authorities in the respective countries of operation may access your data. However, **your data is not used for training** purposes. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T991875725"] = "Der Anbieter betreibt seinen Dienst von China aus. Im Verdachtsfall können Behörden in den jeweiligen Ländern auf ihre Daten zugreifen. **Ihre Daten werden jedoch nicht zum Trainieren** verwendet." + +-- Medium +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T163471254"] = "Mittel" + +-- Moderate +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T177463328"] = "Mäßig" + +-- Unknown confidence level +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T1811522309"] = "Unbekanntes Vertrauensniveau" + +-- No provider selected +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T2897045472"] = "Kein Anbieter ausgewählt" + +-- Low +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T2984088865"] = "Niedrig" + +-- Untrusted +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T3063224793"] = "Nicht vertrauenswürdig" + +-- High +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T3188327965"] = "Hoch" + +-- Very Low +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T786675843"] = "Sehr niedrig" + +-- Self-hosted +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::LLMPROVIDERSEXTENSIONS::T146444217"] = "Selbst gehostet" + +-- No provider selected +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::LLMPROVIDERSEXTENSIONS::T2897045472"] = "Kein Anbieter ausgewählt" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::LLMPROVIDERSEXTENSIONS::T3424652889"] = "Unbekannt" + +-- no model selected +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::MODEL::T2234274832"] = "Kein Modell ausgewählt" + +-- Use no chat template +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CHATTEMPLATE::T4258819635"] = "Keine Chat-Vorlage verwenden" + +-- Navigation never expands, but there are tooltips +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1095779033"] = "Die Navigationsleiste wird nie ausgeklappt, aber es gibt Tooltips" + +-- Check every day +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1112287590"] = "Täglich überprüfen" + +-- Toggle the overlay: the chat uses all the space, workspaces are temporarily shown +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1114668646"] = "Overlay umschalten: Der Chat nutzt den gesamten Platz, Arbeitsbereiche werden vorübergehend angezeigt" + +-- Sidebar is always visible: show the workspaces next to the chat all the time +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1149606444"] = "Seitenleiste ist immer sichtbar: Arbeitsbereiche werden stets neben dem Chat angezeigt" + +-- Always use the default chat provider when loading chats +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1188453609"] = "Beim Laden von Chats immer den Standard-Anbieter verwenden" + +-- Show also prototype features: these are works in progress; expect bugs and missing features +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1245257804"] = "Auch Prototyp-Funktionen anzeigen: Diese befinden sich noch in der Entwicklung; Fehler und fehlende Funktionen sind zu erwarten" + +-- No key is sending the input; you have to click the send button +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1311973034"] = "Keine Taste sendet die Eingabe; Sie müssen auf die Schaltfläche klicken, um zu senden" + +-- Navigation never expands, no tooltips; there are only icons +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1402851833"] = "Navigationsleiste wird nie erweitert, keine Tooltips; es werden nur Icons angezeigt" + +-- Store chats automatically +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1664293672"] = "Chats automatisch speichern" + +-- Once at startup +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T184455356"] = "Einmal beim Start" + +-- No automatic update checks +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1874928511"] = "Keine automatische Update-Prüfung" + +-- Always expand navigation +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1991359958"] = "Navigationsleiste immer ausklappen" + +-- Show also experimental features: these are experimental; expect bugs, missing features, many changes +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2091731959"] = "Zeige auch experimentelle Funktionen: Diese Funktionen sind experimentell; Fehler, fehlende Funktionen und viele Änderungen sind zu erwarten." + +-- Use the latest LLM provider, which was used before; use the default chat provider initially +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2128088682"] = "Den zuletzt verwendeten LLM-Anbieter verwenden; anfangs den Standard-Anbieter auswählen" + +-- Navigation expands on mouse hover +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2195945406"] = "Navigationsleiste erweitert sich, wenn sich die Maus darüber befindet" + +-- Also show features ready for release; these should be stable +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2301448762"] = "Auch Funktionen anzeigen, die bereit für die Veröffentlichung sind; diese sollten stabil sein." + +-- Check every week +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T238099712"] = "Jede Woche prüfen" + +-- Disappearing chats: delete chats older than 1 year +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2405705561"] = "Selbstlöschende Chats: lösche Chats die älter als 1 Jahr sind" + +-- Store chats manually +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2520325466"] = "Chats manuell speichern" + +-- Enter is sending the input +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2537778562"] = "Die Enter- bzw. Eingabetaste sendet die Eingabe" + +-- Not yet specified +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2566503670"] = "Noch nicht angegeben" + +-- No minimum confidence level chosen +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2828607242"] = "Kein Mindestvertrauensniveau ausgewählt" + +-- Do not specify the language +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2960082609"] = "Sprache nicht festlegen" + +-- Disappearing chats: delete chats older than 7 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2975140581"] = "Selbstlöschende Chats: lösche Chats die älter als 7 Tage sind" + +-- Always use the default chat provider for new chats +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2976921892"] = "Immer den Standard-Anbieter für neue Chats verwenden" + +-- Also show features in beta: these are almost ready for release; expect some bugs +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3061414822"] = "Auch Beta-Funktionen anzeigen: Diese sind fast fertig zur Veröffentlichung; es können jedoch noch Fehler auftreten." + +-- Check every hour +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3137986690"] = "Jede Stunde überprüfen" + +-- Disappearing chats: delete chats older than 180 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3491430707"] = "Selbstlöschende Chats: lösche Chats die älter als 180 Tage sind" + +-- Disable workspaces +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3612390107"] = "Arbeitsbereiche deaktivieren" + +-- Toggle the sidebar: show the workspaces on demand next to the chat +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3711207137"] = "Seitenleiste umschalten: Arbeitsbereiche bei Bedarf neben dem Chat anzeigen" + +-- Also show features in alpha: these are in development; expect bugs and missing features +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4146964761"] = "Zeige auch Funktionen im Alpha-Stadium an: Diese befinden sich in der Entwicklung; es werden Fehler und fehlende Funktionen auftreten." + +-- All preview features are hidden +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4289410063"] = "Alle Vorschaufunktionen sind ausgeblendet" + +-- When possible, use the LLM provider which was used for each chat in the first place +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T75376144"] = "Wenn möglich, verwende den LLM-Anbieter, der ursprünglich für jeden Chat verwendet wurde." + +-- Disappearing chats: no automatic maintenance; old chats will never be deleted +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T803751240"] = "Selbstlöschende Chats: keine automatische Wartung; alte Chats werden nie gelöscht" + +-- Disappearing chats: delete chats older than 90 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T869922627"] = "Selbstlöschende Chats: lösche Chats die älter als 90 Tage sind" + +-- Modifier key + enter is sending the input +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T870850829"] = "Mit gedrückter Modifikatortaste (z.B. Alt oder Strg) + Enter- bzw. Eingabe-Taste wird die Eingabe gesendet" + +-- Disappearing chats: delete chats older than 30 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T937754037"] = "Selbstlöschende Chats: lösche Chats die älter als 30 Tage sind" + +-- This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T1531417967"] = "Diese Datenquelle kann mit jedem LLM-Anbieter verwendet werden. Ihre Daten können an einen cloudbasierten Anbieter gesendet werden." + +-- This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T3187068849"] = "Diese Datenquelle kann nur mit einem selbst gehosteten LLM-Anbieter verwendet werden. Ihre Daten werden nicht an einen cloudbasierten Anbieter gesendet." + +-- Please select a security policy +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T3511915070"] = "Bitte wählen Sie eine Sicherheitsrichtlinie aus." + +-- The security of the data source is not specified yet. You cannot use this data source until you specify a security policy. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T4056804813"] = "Die Sicherheit der Datenquelle ist noch nicht festgelegt. Sie können diese Datenquelle erst verwenden, wenn Sie eine Sicherheitsrichtlinie angeben." + +-- Unknown security policy +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T4277536697"] = "Unbekannte Sicherheitsrichtlinie" + +-- Local File +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T1687345358"] = "Lokale Datei" + +-- External ERI Server (v1) +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T3020093889"] = "Externer ERI-Server (v1)" + +-- No data source +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T810547195"] = "Keine Datenquelle" + +-- Local Directory +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T926703547"] = "Lokaler Ordner" + +-- Unknown option +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::LANGBEHAVIOREXTENSIONS::T3964902774"] = "Unbekannte Option" + +-- Choose the language manually +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::LANGBEHAVIOREXTENSIONS::T3988034966"] = "Sprache manuell auswählen" + +-- Choose the language automatically, based on your system language +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::LANGBEHAVIOREXTENSIONS::T485389934"] = "Sprache automatisch anhand ihrer Systemsprache auswählen" + +-- Writer Mode: Experiments about how to write long texts using AI +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T158702544"] = "Schreibmodus: Experimente zum Verfassen langer Texte mit KI" + +-- Read PDF: Preview of our PDF reading system where you can read and extract text from PDF files +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T1847148141"] = "PDF-Dateien einlesen: Vorschau unseres PDF-Lesesystems, mit dem Sie Text aus PDF-Dateien einlesen können" + +-- Plugins: Preview of our plugin system where you can extend the functionality of the app +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T2056842933"] = "Plugins: Vorschau auf unser Pluginsystems, mit dem Sie die Funktionalität der App erweitern können" + +-- RAG: Preview of our RAG implementation where you can refer your files or integrate enterprise data within your company +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T2708939138"] = "RAG: Vorschau auf unsere RAG-Implementierung, mit der Sie auf ihre Dateien zugreifen oder Unternehmensdaten in ihrem Unternehmen integrieren können" + +-- Unknown preview feature +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T2722827307"] = "Unbekannte Vorschau-Funktion" + +-- Use no data sources, when sending an assistant result to a chat +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::SENDTOCHATDATASOURCEBEHAVIOREXTENSIONS::T1223925477"] = "Keine Datenquellen vorauswählen, wenn ein Ergebnis von einem Assistenten an einen neuen Chat gesendet wird" + +-- Unknown behavior +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::SENDTOCHATDATASOURCEBEHAVIOREXTENSIONS::T1394162669"] = "Unbekanntes Verhalten" + +-- Apply standard chat data source options, when sending an assistant result to a chat +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::SENDTOCHATDATASOURCEBEHAVIOREXTENSIONS::T2129722199"] = "Standard-Optionen für Datenquellen anwenden, wenn ein Ergebnis von einem Assistenten an einen neuen Chat gesendet wird" + +-- Always use dark theme +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T197192304"] = "Immer dunkles Design verwenden" + +-- Synchronized with the operating system settings +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T1987547483"] = "Mit den Einstellungen des Betriebssystems synchronisiert" + +-- Unknown setting +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T4107955313"] = "Unbekannte Einstellung" + +-- Always use light theme +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T534715610"] = "Immer das helle Design verwenden" + +-- Use no profile +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::PROFILE::T2205839602"] = "Kein Profil verwenden" + +-- SSO (Kerberos) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T268552140"] = "SSO (Kerberos)" + +-- Access Token +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T2891154022"] = "Zugangstoken" + +-- Unknown authentication method +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T3296465240"] = "Unbekannte Authentifizierungsmethode" + +-- No authentication +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T810547195"] = "Keine Authentifizierung" + +-- Username & Password +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T863358904"] = "Benutzername & Passwort" + +-- Spanish (Spain) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1269145091"] = "Spanisch (Spanien)" + +-- German (Germany) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T133055431"] = "Deutsch (Deutschland)" + +-- Other +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1849229205"] = "Andere" + +-- German (Switzerland) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1914931075"] = "Deutsch (Schweiz)" + +-- German (Austria) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1992157553"] = "Deutsch (Österreich)" + +-- Japanese (Japan) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2064802889"] = "Japanisch (Japan)" + +-- French (France) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2496010681"] = "Französisch (Frankreich)" + +-- Please select the target language +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2536245199"] = "Bitte wählen Sie die Zielsprache aus" + +-- Do not specify the language +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2960082609"] = "Sprache nicht angeben" + +-- Hindi (India) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3245596873"] = "Hindi (Indien)" + +-- Chinese (Simplified) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3441562249"] = "Chinesisch (vereinfacht)" + +-- English (US) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3729684486"] = "Englisch (US)" + +-- English (UK) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3730964414"] = "Englisch (UK)" + +-- Russian (Russia) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T4187368718"] = "Russisch (Russland)" + +-- Do not change the language +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T658789330"] = "Sprache nicht ändern" + +-- Coding Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1082499335"] = "Programmierassistent" + +-- E-Mail Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1185802704"] = "E-Mail-Assistent" + +-- My Tasks Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1546040625"] = "Meine Aufgaben-Assistent" + +-- Grammar & Spelling Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T166453786"] = "Grammatik- & Rechtschreibassistent" + +-- Legal Check Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1886447798"] = "Assistent für rechtliche Prüfungen" + +-- Job Posting Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2212811874"] = "Assistent für Stellenanzeigen" + +-- Icon Finder Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2457005512"] = "Icon Finder-Assistent" + +-- Text Summarizer Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2684676843"] = "Assistent zur Textzusammenfassung" + +-- Synonym Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2921123194"] = "Synonym-Assistent" + +-- Translation Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T3887962308"] = "Übersetzungsassistent" + +-- Agenda Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T4034795997"] = "Agenda-Assistent" + +-- ERI Server +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T4204533420"] = "ERI-Server" + +-- Rewrite Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T4262148639"] = "Assistent zum Umformulieren & Verbessern" + +-- Localization Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T446674624"] = "Lokalisierungs-Assistent" + +-- New Chat +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T826248509"] = "Neuer Chat" + +-- Trust LLM providers from the USA +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T1748300640"] = "LLM-Anbietern aus den USA vertrauen" + +-- Configure your own confidence scheme +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T2017415465"] = "Konfigurieren Sie Ihr eigenes Vertrauensschema" + +-- Trust LLM providers from the USA and Europe +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T2498514901"] = "LLM-Anbietern aus den USA und Europa vertrauen" + +-- Unknown confidence scheme +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T292756058"] = "Unbekanntes Vertrauensschema" + +-- Trust LLM providers from Asia +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T3016210842"] = "LLM-Anbietern aus Asien vertrauen" + +-- Trust LLM providers from Europe +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T357239630"] = "LLM-Anbietern aus Europa vertrauen" + +-- Trust only self-hosted providers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T3893997203"] = "Nur selbst gehosteten LLM-Anbietern vertrauen" + +-- Trust all LLM providers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T4107860491"] = "Allen LLM-Anbietern vertrauen" + +-- The related data is not allowed to be sent to any LLM provider. This means that this data source cannot be used at the moment. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T1555790630"] = "Die zugehörigen Daten dürfen an keinen LLM-Anbieter gesendet werden. Das bedeutet, dass diese Datenquelle momentan nicht verwendet werden kann." + +-- The related data can be sent to any provider, regardless of where it is hosted (cloud or self-hosted). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T2031831095"] = "Die zugehörigen Daten können an jeden Anbieter gesendet werden, unabhängig davon, ob dieser in der Cloud oder selbst gehostet wird." + +-- The related data can be sent to a provider that is hosted by the same organization, either on-premises or locally. Cloud-based providers are not allowed. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T2943101676"] = "Die entsprechenden Daten können an einen Anbieter gesendet werden, der von derselben Organisation betrieben wird – entweder auf ihrem Gerät oder im Unternehmens-Netzwerk. Cloud-basierte Anbieter sind nicht zulässig." + +-- Unknown configuration. This data source cannot be used at the moment. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T647911863"] = "Unbekannte Konfiguration. Diese Datenquelle kann derzeit nicht verwendet werden." + +-- Failed to execute the retrieval request: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1270753490"] = "Die Abrufanfrage konnte nicht ausgeführt werden: Die Anfrage wurde entweder vom Benutzer abgebrochen oder ist aufgrund eines Zeitlimits fehlgeschlagen." + +-- Failed to retrieve the embedding information: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1368217771"] = "Abrufen der Einbettungsinformationen fehlgeschlagen: Der ERI-Server hat keine gültige Antwort zurückgegeben." + +-- Failed to retrieve the password. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1460025425"] = "Das Passwort konnte nicht abgerufen werden." + +-- Failed to authenticate with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1741376192"] = "Authentifizierung beim ERI-Server fehlgeschlagen. Code: {0}, Grund: {1}" + +-- Failed to retrieve the security requirements: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1931074357"] = "Die Sicherheitsanforderungen konnten nicht abgerufen werden: Es gab ein Problem bei der Kommunikation mit dem ERI-Server. Code: {0}, Grund: {1}" + +-- Failed to execute the retrieval request due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1951868505"] = "Die Abrufanfrage konnte aufgrund eines Problems nicht ausgeführt werden: {0}" + +-- Failed to execute the retrieval request: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1978354870"] = "Die Abrufanfrage konnte nicht ausgeführt werden: Der ERI-Server hat keine gültige Antwort zurückgegeben." + +-- Failed to retrieve the security requirements: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T231684456"] = "Die Sicherheitsanforderungen konnten nicht abgerufen werden: Der ERI-Server hat keine gültige Antwort zurückgegeben." + +-- Failed to authenticate with the server: the response was invalid. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2332248448"] = "Authentifizierung mit dem Server fehlgeschlagen: Die Antwort war ungültig." + +-- Failed to retrieve the embedding information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2368384424"] = "Die Einbettungsinformationen konnten nicht abgerufen werden: Es gab ein Problem bei der Kommunikation mit dem ERI-Server. Code: {0}, Grund: {1}" + +-- Failed to retrieve the authentication methods: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2482165925"] = "Authentifizierungsmethoden konnten nicht abgerufen werden: Es gab ein Problem bei der Kommunikation mit dem ERI-Server. Code: {0}, Grund: {1}" + +-- The authentication method is not supported yet. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2536034936"] = "Die Authentifizierungsmethode wird noch nicht unterstützt." + +-- Failed to authenticate with the ERI server: the response was invalid. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2549452166"] = "Authentifizierung beim ERI-Server fehlgeschlagen: Die Antwort war ungültig." + +-- Failed to retrieve the retrieval information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2558778293"] = "Fehler beim Abrufen der Suchinformationen: Es gab ein Problem bei der Kommunikation mit dem ERI-Server. Code: {0}, Grund: {1}" + +-- Failed to authenticate with the ERI server: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2673501628"] = "Authentifizierung beim ERI-Server fehlgeschlagen: Die Anfrage wurde entweder vom Benutzer abgebrochen oder aufgrund eines Zeitlimits beendet." + +-- Failed to authenticate with the ERI server due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2858189239"] = "Authentifizierung beim ERI-Server aufgrund eines Problems fehlgeschlagen: {0}" + +-- Failed to retrieve the security requirements: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T286437836"] = "Die Sicherheitsanforderungen konnten nicht abgerufen werden: Die Anfrage wurde entweder vom Benutzer abgebrochen oder ist aufgrund eines Zeitüberschreitungsfehlers fehlgeschlagen." + +-- Failed to retrieve the security requirements due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3221004295"] = "Die Sicherheitsanforderungen konnten wegen eines Problems nicht abgerufen werden: {0}" + +-- Failed to retrieve the data source information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3290521480"] = "Abrufen der Datenquelleninformationen fehlgeschlagen: Es gab ein Problem bei der Kommunikation mit dem ERI-Server. Code: {0}, Grund: {1}" + +-- Failed to retrieve the data source information due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3354496288"] = "Abrufen der Datenquelleninformationen aufgrund eines Problems fehlgeschlagen: {0}" + +-- Failed to retrieve the authentication methods due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3366487415"] = "Abrufen der Authentifizierungsmethoden aufgrund eines Problems fehlgeschlagen: {0}" + +-- Failed to retrieve the authentication methods: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3654094460"] = "Abrufen der Authentifizierungsmethoden fehlgeschlagen: Die Anfrage wurde entweder vom Benutzer abgebrochen oder ist aufgrund eines Zeitlimits abgelaufen." + +-- Failed to retrieve the retrieval information: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3721797352"] = "Abrufen der Suchinformationen fehlgeschlagen: Der ERI-Server hat keine gültige Antwort zurückgegeben." + +-- Failed to retrieve the retrieval information: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3809548876"] = "Fehler beim Abrufen der Suchinformationen: Die Anfrage wurde entweder vom Benutzer abgebrochen oder ist wegen eines Zeitlimits fehlgeschlagen." + +-- Failed to retrieve the retrieval information due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3862033799"] = "Abrufen der Informationen ist aufgrund eines Problems fehlgeschlagen: {0}" + +-- Failed to retrieve the data source information: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T4006612619"] = "Fehler beim Abrufen der Datenquelleninformationen: Der ERI-Server hat keine gültige Antwort zurückgegeben." + +-- Failed to retrieve the embedding information: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T469891013"] = "Die Einbettungsinformationen konnten nicht abgerufen werden: Die Anfrage wurde entweder vom Nutzer abgebrochen oder ist wegen eines Zeitlimits fehlgeschlagen." + +-- Failed to execute the retrieval request: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T615338311"] = "Ausführen der Abrufanfrage fehlgeschlagen: Es gab ein Problem bei der Kommunikation mit dem ERI-Server. Code: {0}, Grund: {1}" + +-- Failed to retrieve the data source information: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T690733413"] = "Fehler beim Abrufen der Datenquelleninformationen: Die Anfrage wurde entweder vom Benutzer abgebrochen oder ist aufgrund eines Zeitlimits fehlgeschlagen." + +-- Failed to retrieve the embedding information due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T765050112"] = "Fehler beim Abrufen der Informationen über die Einbettung aufgrund einer Ausnahme: {0}" + +-- Failed to retrieve the access token. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T816853779"] = "Fehler beim Abrufen des Zugriffstokens." + +-- Failed to retrieve the authentication methods: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T984407320"] = "Fehler beim Abrufen der Authentifizierungsmethoden: Der ERI-Server hat keine gültige Antwort zurückgegeben." + +-- The table AUTHORS does not exist or is using an invalid syntax. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1068328139"] = "Die Tabelle AUTHORS existiert nicht oder verwendet eine ungültige Syntax." + +-- The field NAME does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1340447036"] = "Das Feld NAME existiert nicht oder ist keine gültige Zeichenkette." + +-- The field SOURCE_URL does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1421846488"] = "Das Feld SOURCE_URL existiert nicht oder ist keine gültige Zeichenkette." + +-- The field VERSION does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T148801541"] = "Das Feld VERSION existiert nicht oder ist keine gültige Zeichenkette." + +-- The table CATEGORIES does not exist or is using an invalid syntax. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1505723383"] = "Die Tabelle CATEGORIES existiert nicht oder verwendet eine ungültige Syntax." + +-- The table TARGET_GROUPS is empty or is not a valid table of strings. Valid target groups are: {0}. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1619769690"] = "Die Tabelle TARGET_GROUPS ist leer oder keine gültige Tabelle mit Zeichenfolgen. Gültige Zielgruppen sind: {0}." + +-- The field ID is empty. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1733171739"] = "Das Feld ID ist leer. Die ID muss im Format 8-4-4-4-12 angegeben werden (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)." + +-- The field VERSION is empty. The version number must be formatted as string in the major.minor.patch format (X.X.X). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2115845776"] = "Das Feld VERSION ist leer. Die Versionsnummer muss als Zeichenkette im Format Hauptversion.Nebenversion.Patch (X.X.X) angegeben werden." + +-- The field ID does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2203072274"] = "Das Feld ID existiert nicht oder ist keine gültige Zeichenkette." + +-- The field DESCRIPTION is empty. The description must be a non-empty string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2262604281"] = "Das Feld DESCRIPTION ist leer. Die Beschreibung muss ein nicht-leerer Text sein." + +-- The field DESCRIPTION does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T229488255"] = "Das Feld DESCRIPTION existiert nicht oder ist keine gültige Zeichenkette." + +-- The field SOURCE_URL is not a valid URL. The URL must start with 'http://' or 'https://'. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2320984047"] = "Das Feld SOURCE_URL ist keine gültige URL. Die URL muss mit 'http://' oder 'https://' beginnen." + +-- The field VERSION is not a valid version number. The version number must be formatted as string in the major.minor.patch format (X.X.X). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2538827536"] = "Das Feld VERSION ist keine gültige Versionsnummer. Die Versionsnummer muss als Zeichenkette im Format major.minor.patch (X.X.X) angegeben werden." + +-- The table AUTHORS is empty. At least one author must be specified. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2981832540"] = "Die Tabelle AUTHORS ist leer. Es muss mindestens ein Autor angegeben werden." + +-- The field SUPPORT_CONTACT is empty. The support contact must be a non-empty string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3524814526"] = "Das Feld SUPPORT_CONTACT ist leer. Der Support-Kontakt muss eine nicht-leere Zeichenkette sein." + +-- The UI_TEXT_CONTENT table does not exist or is not a valid table. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3667396132"] = "Die Tabelle UI_TEXT_CONTENT existiert nicht oder ist keine gültige Tabelle." + +-- The field NAME is empty. The name must be a non-empty string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3763759727"] = "Das Feld NAME ist leer. Der Name darf nicht leer sein." + +-- The field DEPRECATION_MESSAGE does not exist, is not a valid string. This message is optional: use an empty string to indicate that the plugin is not deprecated. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3890922974"] = "Das Feld DEPRECATION_MESSAGE existiert nicht und ist keine gültige Zeichenkette. Diese Nachricht ist optional: Verwenden Sie eine leere Zeichenkette, um anzugeben, dass das Plugin nicht veraltet ist." + +-- The field SUPPORT_CONTACT does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T4189964941"] = "Das Feld SUPPORT_CONTACT existiert nicht oder ist keine gültige Zeichenkette." + +-- The table TARGET_GROUPS does not exist or is using an invalid syntax. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T447530369"] = "Die Tabelle TARGET_GROUPS existiert nicht oder verwendet eine ungültige Syntax." + +-- The field ID is not a valid GUID / UUID. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T471697173"] = "Das Feld ID ist keine gültige GUID/UUID. Die ID muss im 8-4-4-4-12-Format geschrieben werden (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)." + +-- The table CATEGORIES is empty. At least one category is necessary. Valid categories are: {0}. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T529114360"] = "Die Tabelle CATEGORIES ist leer. Es wird mindestens eine Kategorie benötigt. Gültige Kategorien sind: {0}." + +-- The field IS_MAINTAINED does not exist or is not a valid boolean. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T773237915"] = "Das Feld IS_MAINTAINED existiert nicht oder ist kein gültiger boolescher Wert." + +-- Writing +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1011777007"] = "Schreiben" + +-- Software Development +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1025369409"] = "Softwareentwicklung" + +-- Business +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T131837803"] = "Business" + +-- Music +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1481252212"] = "Musik" + +-- Unknown plugin category +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1585885320"] = "Unbekannte Plugin-Kategorie" + +-- Weather +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1726658099"] = "Wetter" + +-- Industry +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T208409567"] = "Industrie" + +-- Art +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2449163306"] = "Kunst" + +-- Sports +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2465108186"] = "Sport" + +-- Technology +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2499534031"] = "Technologie" + +-- Health +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2556511663"] = "Gesundheit" + +-- Utility +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2587055103"] = "Dienstprogramm" + +-- Shopping +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2704337693"] = "Einkaufen" + +-- Fitness +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2892517655"] = "Fitness" + +-- Food +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3179069417"] = "Essen" + +-- Gaming +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3246118672"] = "Spiele" + +-- News +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3421767782"] = "Nachrichten" + +-- Entertainment +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3562575449"] = "Unterhaltung" + +-- Education +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T379048501"] = "Bildung" + +-- AI Studio Core +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T4005865962"] = "AI Studio Kern" + +-- Social +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T4177547506"] = "Soziales" + +-- Political +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T4245273692"] = "Politisch" + +-- Fiction +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T616807299"] = "Fiktion" + +-- Travel +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T745861401"] = "Reisen" + +-- None +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T810547195"] = "Keine" + +-- Party +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T850565431"] = "Party" + +-- Science +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T904504157"] = "Wissenschaft" + +-- Content Creation +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T914642375"] = "Inhalte erstellen" + +-- The field IETF_TAG does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T1796010240"] = "Das Feld IETF_TAG existiert nicht oder ist keine gültige Zeichenkette." + +-- The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T3376221777"] = "Das Feld IETF_TAG ist kein gültiges IETF-Tag. Verwenden Sie ein gültiges IETF-Tag wie 'en-US'. Der erste Teil steht für die Sprache, der zweite Teil ist der Ländercode." + +-- The field IETF_TAG is empty. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T3877047896"] = "Das Feld IETF_TAG ist leer. Verwenden Sie einen gültigen IETF-Tag wie 'de-DE'. Der erste Teil steht für die Sprache, der zweite Teil für den Ländercode." + +-- The field LANG_NAME is empty. Use a valid language name. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T4112586014"] = "Das Feld LANG_NAME ist leer. Bitte geben Sie einen gültigen Sprachennamen ein." + +-- The field LANG_NAME does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T4204700759"] = "Das Feld LANG_NAME existiert nicht oder ist keine gültige Zeichenkette." + +-- Artists +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T1142248183"] = "Künstler" + +-- Children +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T188567026"] = "Kinder" + +-- Industrial workers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T2520336817"] = "Industriearbeiter" + +-- Students +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T2905889225"] = "Studierende" + +-- Scientists +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T332785734"] = "Wissenschaftler" + +-- Adults +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3335941460"] = "Erwachsene" + +-- No target group +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3644477204"] = "Keine Zielgruppe" + +-- Business professionals +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3670621687"] = "Geschäftsleute" + +-- Teenagers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3696960735"] = "Teenager" + +-- Unknown target group +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T384321997"] = "Unbekannte Zielgruppe" + +-- Office workers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3873911022"] = "Büroangestellte" + +-- Teachers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T48460338"] = "Lehrkräfte" + +-- Everyone +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T622959000"] = "Jeder" + +-- Software developers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T831424531"] = "Softwareentwickler" + +-- Theme plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T1682350097"] = "Theme-Plugin" + +-- Unknown plugin type +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T2313808600"] = "Unbekannter Plugin-Typ" + +-- Assistant plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T2321563994"] = "Assistenten-Plugin" + +-- Language plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T2370593926"] = "Sprach-Plugin" + +-- Configuration plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T3353383632"] = "Konfigurations-Plugin" + +-- Standard augmentation process +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::AUGMENTATIONPROCESSES::AUGMENTATIONONE::T1072508429"] = "Standardmäßiger Erweiterungsprozess" + +-- This is the standard augmentation process, which uses all retrieval contexts to augment the chat thread. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::AUGMENTATIONPROCESSES::AUGMENTATIONONE::T3240406069"] = "Dies ist der Standard-Erweiterungsprozess, bei dem alle abgerufenen Kontexte verwendet werden, um den Chatverlauf zu ergänzen." + +-- Automatic AI data source selection with heuristik source reduction +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::DATASOURCESELECTIONPROCESSES::AGENTICSRCSELWITHDYNHEUR::T2339257645"] = "Automatische Auswahl der Datenquellen mittels KI und mit heuristischer Datenquellen-Reduktion" + +-- Automatically selects the appropriate data sources based on the last prompt. Applies a heuristic reduction at the end to reduce the number of data sources. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::DATASOURCESELECTIONPROCESSES::AGENTICSRCSELWITHDYNHEUR::T648937779"] = "Wählt automatisch die passenden Datenquellen basierend auf der letzten Eingabe aus. Wendet am Ende eine heuristische Reduzierung an, um die Anzahl der Datenquellen zu verringern." + +-- This RAG process filters data sources, automatically selects appropriate sources, optionally allows manual source selection, retrieves data, and automatically validates the retrieval context. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T3047786484"] = "Dieser RAG-Prozess filtert Datenquellen, wählt automatisch passende Quellen aus, ermöglicht optional die manuelle Auswahl von Quellen, ruft Daten ab und überprüft den Abrufkontext automatisch." + +-- AI-based data source selection with AI retrieval context validation +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T3775725978"] = "KI-basierte Datenquellen-Auswahl mit Validierung des Abrufkontexts" + +-- PDF Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T3108466742"] = "PDF-Dateien" + +-- All Image Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T4086723714"] = "Alle Bilddateien" + +-- Text Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T639143005"] = "Textdateien" + +-- All Office Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T709668067"] = "Alle Office-Dateien" + +-- Failed to delete the API key due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::APIKEYS::T3658273365"] = "Das API-Schlüssel konnte aufgrund eines API-Problems nicht gelöscht werden." + +-- Failed to get the API key due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::APIKEYS::T3875720022"] = "Der API-Schlüssel konnte aufgrund eines API-Problems nicht abgerufen werden." + +-- Successfully copied the text to your clipboard +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::CLIPBOARD::T3351807428"] = "Der Text wurde erfolgreich in die Zwischenablage kopiert." + +-- Failed to copy the text to your clipboard. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::CLIPBOARD::T3724548108"] = "Der Text konnte nicht in die Zwischenablage kopiert werden." + +-- Failed to delete the secret data due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::SECRETS::T2303057928"] = "Das Löschen der geheimen Daten ist aufgrund eines API-Problems fehlgeschlagen." + +-- Failed to get the secret data due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::SECRETS::T4007657575"] = "Abrufen der geheimen Daten aufgrund eines API-Problems fehlgeschlagen." + +-- No update found. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T1015418291"] = "Kein Update gefunden." + +-- The hostname is not a valid HTTP(S) URL. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1013354736"] = "Der Hostname ist keine gültige HTTP(S)-URL." + +-- The connection test failed. Please check the connection settings. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T132896331"] = "Der Verbindungstest ist fehlgeschlagen. Bitte überprüfe die Verbindungseinstellungen." + +-- Please select an embedding provider. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1461238528"] = "Bitte wählen Sie einen Anbieter für die Einbettung aus." + +-- The file does not exist. Please select a valid file. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T148464502"] = "Die Datei existiert nicht. Bitte wähle eine gültige Datei aus." + +-- Please select one retrieval process. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1515898234"] = "Bitte wählen Sie einen Abrufprozess aus." + +-- This data source can only be used with a self-hosted LLM provider. Please change the security policy. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1728967730"] = "Diese Datenquelle kann nur mit einem selbst gehosteten LLM-Anbieter verwendet werden. Bitte ändern Sie die Sicherheitsrichtlinie." + +-- The username must not be empty. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1829419906"] = "Der Benutzername darf nicht leer sein." + +-- The hostname must start with either http:// or https:// +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T193387467"] = "Der Hostname muss mit entweder http:// oder https:// beginnen." + +-- Please enter a hostname, e.g., http://localhost +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1990396672"] = "Bitte geben Sie einen Hostnamen ein, z. B. http://localhost" + +-- Please select one valid authentication method. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T2025964684"] = "Bitte wählen Sie eine gültige Authentifizierungsmethode aus." + +-- The name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T2160507967"] = "Der Name darf maximal 40 Zeichen lang sein." + +-- Please select your security policy. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T2250909198"] = "Bitte wählen Sie ihre Sicherheitsrichtlinie aus." + +-- Please test the connection before saving. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T285470497"] = "Bitte testen Sie die Verbindung, bevor Sie speichern." + +-- Please enter your secure access token. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3086932434"] = "Bitte geben Sie ihren sicheren Zugangstoken ein." + +-- The path does not exist. Please select a valid directory. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3146272446"] = "Der Pfad existiert nicht. Bitte wählen Sie einen gültigen Ordner aus." + +-- The path must not be empty. Please select a directory. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3202118305"] = "Der Pfad darf nicht leer sein. Bitte wählen Sie einen Ordner aus." + +-- The name must not be empty. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3243861903"] = "Der Name darf nicht leer sein." + +-- Please enter your password. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3888492477"] = "Bitte geben Sie Ihr Passwort ein." + +-- The port must be between 1 and 65535. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3965971107"] = "Der Port muss zwischen 1 und 65535 liegen." + +-- The name is already used by another data source. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T4001510395"] = "Der Name wird bereits von einer anderen Datenquelle verwendet. Bitte wählen Sie einen anderen Namen." + +-- Please acknowledge that you are aware of the cloud embedding implications. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T490875633"] = "Bitte bestätigen Sie, dass Ihnen die Auswirkungen der Cloud-Einbettung bewusst sind." + +-- The file path must not be empty. Please select a file. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T878007824"] = "Der Dateipfad darf nicht leer sein. Bitte wählen Sie eine Datei aus." + +-- Please enter the secret necessary for authentication. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T968385876"] = "Bitte geben Sie das für die Authentifizierung benötigte Geheimnis ein." + +-- The hostname is not a valid HTTP(S) URL. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1013354736"] = "Der Hostname ist keine gültige HTTP(S)-URL." + +-- The instance name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1117188308"] = "Der Instanzname darf nicht länger als 40 Zeichen sein." + +-- Please enter a hostname, e.g., http://localhost:1234 +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T125334762"] = "Bitte geben Sie einen Hostnamen ein, z. B. http://localhost:1234" + +-- The instance name must be unique; the chosen name is already in use. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1301966140"] = "Der Instanzname muss eindeutig sein; der gewählte Name wird bereits verwendet." + +-- Please select a provider. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1809312323"] = "Bitte wählen Sie einen Anbieter aus." + +-- The hostname must start with either http:// or https:// +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T193387467"] = "Der Hostname muss mit http:// oder https:// beginnen." + +-- Please select a host. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T2257097222"] = "Bitte wählen Sie einen Host aus." + +-- Please enter an API key. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T3550629491"] = "Bitte geben Sie einen API-Schlüssel ein." + +-- Please enter an instance name. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T3999823516"] = "Bitte geben Sie einen Instanznamen ein." + +-- Please select an Hugging Face inference provider. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T497939286"] = "Bitte wählen Sie einen Hugging Face-Inferenzanbieter aus." + +-- Please select a model. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T818893091"] = "Bitte wählen Sie ein Modell aus." + +-- Delete Chat +UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Chat löschen" diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/contentHome.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/contentHome.lua deleted file mode 100644 index d1805fd0..00000000 --- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/contentHome.lua +++ /dev/null @@ -1,3 +0,0 @@ -CONTENT_HOME = { - LetsGetStarted = "Let's get started", -} \ No newline at end of file diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua index 78f66474..7569c8bc 100644 --- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua @@ -1,4 +1,3 @@ -require("contentHome") require("icon") -- The ID for this plugin: @@ -44,6 +43,5338 @@ DEPRECATION_MESSAGE = "" -- code followed by the ISO 3166-1 country code: IETF_TAG = "en-US" -UI_TEXT_CONTENT = { - HOME = CONTENT_HOME, -} +-- The language name in the user's language: +LANG_NAME = "English (United States)" + +UI_TEXT_CONTENT = {} + +-- Objective +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1121586136"] = "Objective" + +-- Describe the topic of the meeting, seminar, etc. Is it about quantum computing, software engineering, or is it a general business meeting? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T12079368"] = "Describe the topic of the meeting, seminar, etc. Is it about quantum computing, software engineering, or is it a general business meeting?" + +-- Should there be a social activity? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1222794463"] = "Should there be a social activity?" + +-- Is this a virtual event, e.g., a call or webinar? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T123591568"] = "Is this a virtual event, e.g., a call or webinar?" + +-- Active participation, like world café, discussions, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1276489759"] = "Active participation, like world café, discussions, etc." + +-- Project meeting +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1307971935"] = "Project meeting" + +-- Who will moderate the meeting, seminar, etc.? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1328622016"] = "Who will moderate the meeting, seminar, etc.?" + +-- Passive participation, like presentations, lectures, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1331274154"] = "Passive participation, like presentations, lectures, etc." + +-- Please provide a moderator for the meeting or the seminar. Who will lead the discussion? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1345848634"] = "Please provide a moderator for the meeting or the seminar. Who will lead the discussion?" + +-- Please start each line of your content list with a dash (-) to create a bullet point list. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1384718254"] = "Please start each line of your content list with a dash (-) to create a bullet point list." + +-- Describe the objective(s) of the meeting, seminar, etc. What should be achieved? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T142537978"] = "Describe the objective(s) of the meeting, seminar, etc. What should be achieved?" + +-- Location +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1539345862"] = "Location" + +-- Meeting Name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1581597965"] = "Meeting Name" + +-- Topic +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1750080356"] = "Topic" + +-- Please provide a location for the meeting or the seminar. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1812212200"] = "Please provide a location for the meeting or the seminar." + +-- Content list +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1823782898"] = "Content list" + +-- Please provide a topic for the agenda. What is the meeting or the seminar about? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1862110661"] = "Please provide a topic for the agenda. What is the meeting or the seminar about?" + +-- Create Agenda +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T1974034983"] = "Create Agenda" + +-- Number of participants +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2155351093"] = "Number of participants" + +-- Please provide an objective for the meeting or the seminar. What do you want to achieve? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2162394691"] = "Please provide an objective for the meeting or the seminar. What do you want to achieve?" + +-- Discuss the current project status and plan the next steps. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2213481631"] = "Discuss the current project status and plan the next steps." + +-- Please provide a start time for the meeting or the seminar. When the meeting is a multi-day event, specify the start time for each day, e.g. '9:00 AM, 10:00 AM', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2231343846"] = "Please provide a start time for the meeting or the seminar. When the meeting is a multi-day event, specify the start time for each day, e.g. '9:00 AM, 10:00 AM', etc." + +-- Please provide some content for the agenda. What are the main points of the meeting or the seminar? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2263830489"] = "Please provide some content for the agenda. What are the main points of the meeting or the seminar?" + +-- Name the meeting, seminar, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2295548803"] = "Name the meeting, seminar, etc." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T237828418"] = "Target language" + +-- 9:00 AM +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2380198832"] = "9:00 AM" + +-- Agenda Planner +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2435638853"] = "Agenda Planner" + +-- When will the meeting, seminar, etc. start? E.g., '9:00 AM', or '9:00 AM (CET)', etc. When the meeting is a multi-day event, specify the start time for each day. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2446959989"] = "When will the meeting, seminar, etc. start? E.g., '9:00 AM', or '9:00 AM (CET)', etc. When the meeting is a multi-day event, specify the start time for each day." + +-- Do the participants need to get to know each other first? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2463643444"] = "Do the participants need to get to know each other first?" + +-- How long will the meeting, seminar, etc. last? E.g., '2 hours', or '2 days (first day 8 hours, then 4 hours)', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2545969476"] = "How long will the meeting, seminar, etc. last? E.g., '2 hours', or '2 days (first day 8 hours, then 4 hours)', etc." + +-- No, there should be no social activity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2563466975"] = "No, there should be no social activity" + +-- (Optional) What topics should only be briefly addressed? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2604490939"] = "(Optional) What topics should only be briefly addressed?" + +-- Weekly jour fixe +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2610771512"] = "Weekly jour fixe" + +-- Hamburg, Germany +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2771142216"] = "Hamburg, Germany" + +-- Please select the number of participants. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T279660796"] = "Please select the number of participants." + +-- Moderator +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T283265988"] = "Moderator" + +-- Bullet list the content of the meeting, seminar, etc. roughly. Use dashes (-) to separate the items. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2882624953"] = "Bullet list the content of the meeting, seminar, etc. roughly. Use dashes (-) to separate the items." + +-- No, this is a physical event +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2903581470"] = "No, this is a physical event" + +-- minutes +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T2914829806"] = "minutes" + +-- (Optional) List the persons who will present at the meeting, seminar, etc. Use dashes (-) to separate the items. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3037376304"] = "(Optional) List the persons who will present at the meeting, seminar, etc. Use dashes (-) to separate the items." + +-- (Optional) Who is presenting? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3063488920"] = "(Optional) Who is presenting?" + +-- Yes, introduce participants +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3277432669"] = "Yes, introduce participants" + +-- (Optional) What topics should be the focus? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3292480692"] = "(Optional) What topics should be the focus?" + +-- Approx. duration of the coffee or tea breaks +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3310841480"] = "Approx. duration of the coffee or tea breaks" + +-- Please provide a duration for the meeting or the seminar, e.g. '2 hours', or '2 days (8 hours and 4 hours)', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3535835316"] = "Please provide a duration for the meeting or the seminar, e.g. '2 hours', or '2 days (8 hours and 4 hours)', etc." + +-- Duration +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3569830189"] = "Duration" + +-- 2 hours +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3689752318"] = "2 hours" + +-- No, participants do not need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3704775613"] = "No, participants do not need to arrive and depart" + +-- Please provide a name for the meeting or the seminar. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3717566228"] = "Please provide a name for the meeting or the seminar." + +-- No, participants know each other +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3771122854"] = "No, participants know each other" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3848935911"] = "Custom target language" + +-- Yes, there should be a social activity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T3973813377"] = "Yes, there should be a social activity" + +-- Yes, there should be a joint dinner +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4001248011"] = "Yes, there should be a joint dinner" + +-- No, there should be no joint dinner +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4150931417"] = "No, there should be no joint dinner" + +-- Where will the meeting, seminar, etc. take place? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4155424204"] = "Where will the meeting, seminar, etc. take place?" + +-- Please select a target language for the agenda. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4163183653"] = "Please select a target language for the agenda." + +-- This agenda planner helps you create a structured agenda for your meeting or seminar. Just provide some basic information about the event, and the assistant will generate an agenda for you. You can also specify the duration, the start time, the location, the target language, and other details. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4178438053"] = "This agenda planner helps you create a structured agenda for your meeting or seminar. Just provide some basic information about the event, and the assistant will generate an agenda for you. You can also specify the duration, the start time, the location, the target language, and other details." + +-- Yes, participants need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T4266648123"] = "Yes, participants need to arrive and depart" + +-- Should there be a joint dinner? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T553265703"] = "Should there be a joint dinner?" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T656744944"] = "Please provide a custom language." + +-- Should the participants be involved passively or actively? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T749354834"] = "Should the participants be involved passively or actively?" + +-- Yes, this is a virtual event +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T829874736"] = "Yes, this is a virtual event" + +-- Approx. duration of the lunch break +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T92038124"] = "Approx. duration of the lunch break" + +-- Do participants need to arrive and depart? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::ASSISTANTAGENDA::T945792620"] = "Do participants need to arrive and depart?" + +-- 13 - 20 (multiple small groups) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1248612832"] = "13 - 20 (multiple small groups)" + +-- 101 - 200 (conference) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1576140451"] = "101 - 200 (conference)" + +-- Please select how many participants are expected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1761209658"] = "Please select how many participants are expected" + +-- 31 - 100 (symposium) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T1884554098"] = "31 - 100 (symposium)" + +-- 21 - 30 (multiple large groups) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T2544279674"] = "21 - 30 (multiple large groups)" + +-- 6 - 12 (large group) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T3462231762"] = "6 - 12 (large group)" + +-- 201 - 1,000 (congress) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T3871655179"] = "201 - 1,000 (congress)" + +-- 2 (peer to peer) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T4200229473"] = "2 (peer to peer)" + +-- 3 - 5 (small group) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T568372961"] = "3 - 5 (small group)" + +-- 1,000+ (large event) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::AGENDA::NUMBERPARTICIPANTSEXTENSIONS::T812476179"] = "1,000+ (large event)" + +-- Stop generation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T1317408357"] = "Stop generation" + +-- Reset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T180921696"] = "Reset" + +-- Please select a provider. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T1809312323"] = "Please select a provider." + +-- Assistant - {0} +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T3043922"] = "Assistant - {0}" + +-- Send to ... +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T4242312602"] = "Send to ..." + +-- Copy result +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ASSISTANTBASE::T83711157"] = "Copy result" + +-- Extended bias poster +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T1241605514"] = "Extended bias poster" + +-- Please select a target language for the bias. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T1380819730"] = "Please select a target language for the bias." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T237828418"] = "Target language" + +-- Blog post of Buster Benson: +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T2524573984"] = "Blog post of Buster Benson:" + +-- Wikipedia list of cognitive biases +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3097054642"] = "Wikipedia list of cognitive biases" + +-- Show me the bias of the day +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3489946962"] = "Show me the bias of the day" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3848935911"] = "Custom target language" + +-- Learn about a different cognitive bias every day. You can also ask the LLM your questions. The idea behind "Bias of the Day" is based on work by Buster Benson, John Manoogian III, and Brian Rene Morrissette. Buster Benson grouped the biases, and the original texts come from Wikipedia. Brian Rene Morrissette condensed them into a shorter version. Finally, John Manoogian III created the original poster based on Benson's work and Morrissette's texts. Thorsten Sommer compared all texts for integration into AI Studio with the current Wikipedia versions, updated them, and added source references. The idea of learning about one bias each day based on John's poster comes from Drew Nelson. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T3882885376"] = "Learn about a different cognitive bias every day. You can also ask the LLM your questions. The idea behind \"Bias of the Day\" is based on work by Buster Benson, John Manoogian III, and Brian Rene Morrissette. Buster Benson grouped the biases, and the original texts come from Wikipedia. Brian Rene Morrissette condensed them into a shorter version. Finally, John Manoogian III created the original poster based on Benson's work and Morrissette's texts. Thorsten Sommer compared all texts for integration into AI Studio with the current Wikipedia versions, updated them, and added source references. The idea of learning about one bias each day based on John's poster comes from Drew Nelson." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T656744944"] = "Please provide a custom language." + +-- Bias of the Day +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::BIASDAY::BIASOFTHEDAYASSISTANT::T782102948"] = "Bias of the Day" + +-- Coding Assistant +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T1082499335"] = "Coding Assistant" + +-- Yes, provide compiler messages +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T1267219550"] = "Yes, provide compiler messages" + +-- Compiler messages +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T2339992872"] = "Compiler messages" + +-- Do you want to provide compiler messages? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T2479378307"] = "Do you want to provide compiler messages?" + +-- Get Support +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T2694436440"] = "Get Support" + +-- Context {0} +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T3205224990"] = "Context {0}" + +-- Delete context +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T3491455017"] = "Delete context" + +-- Your question(s) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T3576319998"] = "Your question(s)" + +-- Please provide your questions. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T4120171174"] = "Please provide your questions." + +-- No, there are no compiler messages +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T412437274"] = "No, there are no compiler messages" + +-- Please provide the compiler messages. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T4225294332"] = "Please provide the compiler messages." + +-- This coding assistant supports you in writing code. Provide some coding context by pasting your code into the input fields. You might assign an ID to your code snippet to easily reference it later. When you have compiler messages, you can paste them into the input fields to get help with debugging as well. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T566604388"] = "This coding assistant supports you in writing code. Provide some coding context by pasting your code into the input fields. You might assign an ID to your code snippet to easily reference it later. When you have compiler messages, you can paste them into the input fields to get help with debugging as well." + +-- Add context +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::ASSISTANTCODING::T882607103"] = "Add context" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T2591284123"] = "Language" + +-- Your code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3144719651"] = "Your code" + +-- {0}: Please provide your input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3160504659"] = "{0}: Please provide your input." + +-- (Optional) Identifier +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3208138853"] = "(Optional) Identifier" + +-- Other language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3374524465"] = "Other language" + +-- Please specify the language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::CODINGCONTEXTITEM::T3406207295"] = "Please specify the language." + +-- Other +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::COMMONCODINGLANGUAGEEXTENSIONS::T1849229205"] = "Other" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::COMMONCODINGLANGUAGEEXTENSIONS::T3424652889"] = "Unknown" + +-- None +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::CODING::COMMONCODINGLANGUAGEEXTENSIONS::T810547195"] = "None" + +-- Provide a list of bullet points and some basic information for an e-mail. The assistant will generate an e-mail based on that input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T1143222914"] = "Provide a list of bullet points and some basic information for an e-mail. The assistant will generate an e-mail based on that input." + +-- Your name for the closing salutation of your e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T134060413"] = "Your name for the closing salutation of your e-mail." + +-- Please start each line of your content list with a dash (-) to create a bullet point list. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T1384718254"] = "Please start each line of your content list with a dash (-) to create a bullet point list." + +-- Create email +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T1686330485"] = "Create email" + +-- Previous conversation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2074063439"] = "Previous conversation" + +-- Select the writing style +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2241531659"] = "Select the writing style" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T237828418"] = "Target language" + +-- Please provide some content for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2381517938"] = "Please provide some content for the e-mail." + +-- Please provide some history for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2471325767"] = "Please provide some history for the e-mail." + +-- Your bullet points +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2582330385"] = "Your bullet points" + +-- Yes, I provide the previous conversation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2652980489"] = "Yes, I provide the previous conversation" + +-- Please select a writing style for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T2969942806"] = "Please select a writing style for the e-mail." + +-- E-Mail +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3026443472"] = "E-Mail" + +-- (Optional) The greeting phrase to use +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T306513209"] = "(Optional) The greeting phrase to use" + +-- Bullet list the content of the e-mail roughly. Use dashes (-) to separate the items. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3259604530"] = "Bullet list the content of the e-mail roughly. Use dashes (-) to separate the items." + +-- Is there a history, a previous conversation? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3438127996"] = "Is there a history, a previous conversation?" + +-- Provide the previous conversation, e.g., the last e-mail, the last chat, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3706154604"] = "Provide the previous conversation, e.g., the last e-mail, the last chat, etc." + +-- No, I don't provide a previous conversation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3823693145"] = "No, I don't provide a previous conversation" + +-- (Optional) Are any of your points particularly important? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3843104162"] = "(Optional) Are any of your points particularly important?" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T3848935911"] = "Custom target language" + +-- (Optional) Your name for the closing salutation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T453962275"] = "(Optional) Your name for the closing salutation" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T656744944"] = "Please provide a custom language." + +-- Dear Colleagues +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T759263763"] = "Dear Colleagues" + +-- Please select a target language for the e-mail. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::ASSISTANTEMAIL::T891073054"] = "Please select a target language for the e-mail." + +-- Personal +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T1851428013"] = "Personal" + +-- Academic +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T2055733914"] = "Academic" + +-- Business informal +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T4031465193"] = "Business informal" + +-- Business formal +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T477550214"] = "Business formal" + +-- Not specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::EMAIL::WRITINGSTYLESEXTENSIONS::T641241064"] = "Not specified" + +-- Self-hosted LLM providers are allowed: users cannot choose any cloud-based provider +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T1196461290"] = "Self-hosted LLM providers are allowed: users cannot choose any cloud-based provider" + +-- Please select what kind of LLM provider are allowed for this data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T1641796568"] = "Please select what kind of LLM provider are allowed for this data source" + +-- Any LLM provider is allowed: users might choose a cloud-based or a self-hosted provider +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T3264558650"] = "Any LLM provider is allowed: users might choose a cloud-based or a self-hosted provider" + +-- Unknown option was selected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ALLOWEDLLMPROVIDERSEXTENSIONS::T4096790096"] = "Unknown option was selected" + +-- Please describe at least one retrieval process. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1035068989"] = "Please describe at least one retrieval process." + +-- Please select which types of LLMs users are allowed to use with the data from this ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1047631678"] = "Please select which types of LLMs users are allowed to use with the data from this ERI server." + +-- No, I will enter everything again or configure it manually in the settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1051078592"] = "No, I will enter everything again or configure it manually in the settings" + +-- ERI server name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1104420863"] = "ERI server name" + +-- The embedding '{0}' is used in one or more retrieval processes. Are you sure you want to delete it? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1125425983"] = "The embedding '{0}' is used in one or more retrieval processes. Are you sure you want to delete it?" + +-- The port of the data source must be between 1 and 65535. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1201129536"] = "The port of the data source must be between 1 and 65535." + +-- AI Studio can save the generated code to the file system. You can select a base folder for this. AI Studio ensures that no files are created outside of this base folder. Furthermore, we recommend that you create a Git repository in this folder. This way, you can see what changes the AI has made in which files. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T121294173"] = "AI Studio can save the generated code to the file system. You can select a base folder for this. AI Studio ensures that no files are created outside of this base folder. Furthermore, we recommend that you create a Git repository in this folder. This way, you can see what changes the AI has made in which files." + +-- Here you have the option to save different configurations for various ERI servers and switch between them. This is useful if you are responsible for multiple ERI servers. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1244355152"] = "Here you have the option to save different configurations for various ERI servers and switch between them. This is useful if you are responsible for multiple ERI servers." + +-- Please provide a name for your ERI server. This name will be used to identify the server in AI Studio. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1261836894"] = "Please provide a name for your ERI server. This name will be used to identify the server in AI Studio." + +-- You have not yet added any ERI server presets. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1267931972"] = "You have not yet added any ERI server presets." + +-- Warning: Ports below 1024 are reserved for system services. Your ERI server need to run with elevated permissions (root user). +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1287629674"] = "Warning: Ports below 1024 are reserved for system services. Your ERI server need to run with elevated permissions (root user)." + +-- The task of writing the ERI server for you is very complex. Therefore, a very powerful LLM is needed to successfully accomplish this task. Small local models will probably not be sufficient. Instead, try using a large cloud-based or a large self-hosted model. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1302705248"] = "The task of writing the ERI server for you is very complex. Therefore, a very powerful LLM is needed to successfully accomplish this task. Small local models will probably not be sufficient. Instead, try using a large cloud-based or a large self-hosted model." + +-- Please give your ERI server a name that provides information about the data source and/or its intended purpose. The name will be displayed to users in AI Studio. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1312468048"] = "Please give your ERI server a name that provides information about the data source and/or its intended purpose. The name will be displayed to users in AI Studio." + +-- Please describe how the selected authentication methods should be used. Especially, explain for what data the NONE method (public access) is used. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1365243213"] = "Please describe how the selected authentication methods should be used. Especially, explain for what data the NONE method (public access) is used." + +-- No embedding methods configured yet. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1391635161"] = "No embedding methods configured yet." + +-- Edit Retrieval Process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1423501360"] = "Edit Retrieval Process" + +-- Please select the operating system on which the ERI server will run. This is necessary when using SSO with Kerberos. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1456749976"] = "Please select the operating system on which the ERI server will run. This is necessary when using SSO with Kerberos." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1469573738"] = "Delete" + +-- Related links: +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1565111217"] = "Related links:" + +-- Please select an ERI specification version for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1612890554"] = "Please select an ERI specification version for the ERI server." + +-- Write code to file system +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1717303021"] = "Write code to file system" + +-- Hint: to allow this assistant to automatically save your changes, you must enable the preselection of values in the settings. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1729922656"] = "Hint: to allow this assistant to automatically save your changes, you must enable the preselection of values in the settings." + +-- You have selected {0} authentication methods +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1755088321"] = "You have selected {0} authentication methods" + +-- Select the target directory for the ERI server +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T175742733"] = "Select the target directory for the ERI server" + +-- Data source: port +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T179799739"] = "Data source: port" + +-- Delete Retrieval Process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T180938091"] = "Delete Retrieval Process" + +-- Provider selection for generation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1840198821"] = "Provider selection for generation" + +-- Should we automatically save any input made? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1980659256"] = "Should we automatically save any input made?" + +-- Auto save +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T1997164591"] = "Auto save" + +-- An ERI server preset with this name already exists. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2031461801"] = "An ERI server preset with this name already exists. Please choose a different name." + +-- Data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2034620186"] = "Data source" + +-- Interactive documentation aka Swagger UI +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2064957876"] = "Interactive documentation aka Swagger UI" + +-- When you rebuild / re-generate the ERI server code, AI Studio proceeds as follows: All files generated last time will be deleted. All other files you have created remain. Then, the AI generates the new files. But beware: It may happen that the AI generates a file this time that you manually created last time. In this case, your manually created file will then be overwritten. Therefore, you should always create a Git repository and commit or revert all changes before using this assistant. With a diff visualization, you can immediately see where the AI has made changes. It is best to use an IDE suitable for your selected language for this purpose. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2155983785"] = "When you rebuild / re-generate the ERI server code, AI Studio proceeds as follows: All files generated last time will be deleted. All other files you have created remain. Then, the AI generates the new files. But beware: It may happen that the AI generates a file this time that you manually created last time. In this case, your manually created file will then be overwritten. Therefore, you should always create a Git repository and commit or revert all changes before using this assistant. With a diff visualization, you can immediately see where the AI has made changes. It is best to use an IDE suitable for your selected language for this purpose." + +-- Add Embedding Method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2176833082"] = "Add Embedding Method" + +-- For your ERI server, you need to retrieve data that matches a chat or prompt in some way. We call this the retrieval process. You must describe at least one such process. You may offer several retrieval processes from which users can choose. This allows you to test with beta users which process works better. Or you might generally want to give users the choice so they can select the process that best suits their circumstances. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T218617347"] = "For your ERI server, you need to retrieve data that matches a chat or prompt in some way. We call this the retrieval process. You must describe at least one such process. You may offer several retrieval processes from which users can choose. This allows you to test with beta users which process works better. Or you might generally want to give users the choice so they can select the process that best suits their circumstances." + +-- You can specify more than one embedding method. This can be useful when you want to use different embeddings for different queries or data types. For example, one embedding for texts, another for images, and a third for videos, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2202387805"] = "You can specify more than one embedding method. This can be useful when you want to use different embeddings for different queries or data types. For example, one embedding for texts, another for images, and a third for videos, etc." + +-- Operating system on which your ERI server will run +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2205711729"] = "Operating system on which your ERI server will run" + +-- You can integrate additional libraries. Perhaps you want to evaluate the prompts in advance using a machine learning method or analyze them with a text mining approach? Or maybe you want to preprocess images in the prompts? For such advanced scenarios, you can specify which libraries you want to use here. It's best to describe which library you want to integrate for which purpose. This way, the LLM that writes the ERI server for you can try to use these libraries effectively. This should result in less rework being necessary. If you don't know the necessary libraries, you can instead attempt to describe the intended use. The LLM can then attempt to choose suitable libraries. However, hallucinations can occur, and fictional libraries might be selected. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2241311898"] = "You can integrate additional libraries. Perhaps you want to evaluate the prompts in advance using a machine learning method or analyze them with a text mining approach? Or maybe you want to preprocess images in the prompts? For such advanced scenarios, you can specify which libraries you want to use here. It's best to describe which library you want to integrate for which purpose. This way, the LLM that writes the ERI server for you can try to use these libraries effectively. This should result in less rework being necessary. If you don't know the necessary libraries, you can instead attempt to describe the intended use. The LLM can then attempt to choose suitable libraries. However, hallucinations can occur, and fictional libraries might be selected." + +-- The ERI specification could not be loaded. Please try again later. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2265640084"] = "The ERI specification could not be loaded. Please try again later." + +-- You can imagine it like this: Hypothetically, when Wikipedia implemented the ERI, it would vectorize all pages using an embedding method. All of Wikipedia’s data would remain with Wikipedia, including the vector database (decentralized approach). Then, any AI Studio user could add Wikipedia as a data source to significantly reduce the hallucination of the LLM in knowledge questions. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2299793803"] = "You can imagine it like this: Hypothetically, when Wikipedia implemented the ERI, it would vectorize all pages using an embedding method. All of Wikipedia’s data would remain with Wikipedia, including the vector database (decentralized approach). Then, any AI Studio user could add Wikipedia as a data source to significantly reduce the hallucination of the LLM in knowledge questions." + +-- Are you sure you want to delete the ERI server preset '{0}'? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2417944396"] = "Are you sure you want to delete the ERI server preset '{0}'?" + +-- Data source settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2440619931"] = "Data source settings" + +-- Yes, please write or update all generated code to the file system +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T252707279"] = "Yes, please write or update all generated code to the file system" + +-- Describe how you planned the authentication process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2531113337"] = "Describe how you planned the authentication process" + +-- Please specify the custom programming language for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T257210674"] = "Please specify the custom programming language for the ERI server." + +-- Edit Embedding Method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T260789321"] = "Edit Embedding Method" + +-- Base directory where to write the code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2610795494"] = "Base directory where to write the code" + +-- Delete ERI server preset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2627399122"] = "Delete ERI server preset" + +-- Name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T266367750"] = "Name" + +-- Create the ERI server +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2903289059"] = "Create the ERI server" + +-- Data retrieval settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T295114338"] = "Data retrieval settings" + +-- Please provide a base directory for the ERI server to write files to. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2989655350"] = "Please provide a base directory for the ERI server to write files to." + +-- You have selected 1 authentication method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T2997584553"] = "You have selected 1 authentication method" + +-- ERI server presets +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3021250792"] = "ERI server presets" + +-- Authentication method(s) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3044928058"] = "Authentication method(s)" + +-- (Optional) Describe how you planned the authentication process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3052867096"] = "(Optional) Describe how you planned the authentication process" + +-- Do you want to include additional libraries? Then name them and briefly describe what you want to achieve with them. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3088814795"] = "Do you want to include additional libraries? Then name them and briefly describe what you want to achieve with them." + +-- Add ERI server preset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3090449320"] = "Add ERI server preset" + +-- Please specify the product name of the data source, e.g., 'MongoDB', 'Redis', 'PostgreSQL', 'Neo4j', or 'MinIO', etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3105554044"] = "Please specify the product name of the data source, e.g., 'MongoDB', 'Redis', 'PostgreSQL', 'Neo4j', or 'MinIO', etc." + +-- Embedding settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T315946275"] = "Embedding settings" + +-- Please select at least one authentication method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3178184134"] = "Please select at least one authentication method" + +-- The ERI specification will change over time. You probably want to keep your ERI server up to date. This means you might want to regenerate the code for your ERI server. To avoid having to make all inputs each time, all your inputs and decisions can be automatically saved. Would you like this? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3203532492"] = "The ERI specification will change over time. You probably want to keep your ERI server up to date. This means you might want to regenerate the code for your ERI server. To avoid having to make all inputs each time, all your inputs and decisions can be automatically saved. Would you like this?" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3267849393"] = "Edit" + +-- Programming language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3295594136"] = "Programming language" + +-- Data source: product name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3315518334"] = "Data source: product name" + +-- No, just show me the code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3316699247"] = "No, just show me the code" + +-- Other language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3374524465"] = "Other language" + +-- ERI Server {0} +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3443687246"] = "ERI Server {0}" + +-- You will likely use one or more embedding methods to encode the meaning of your data into a typically high-dimensional vector space. In this case, you will use a vector database to store and search these vectors (called embeddings). However, you don't have to use embedding methods. When your retrieval method works without any embedding, you can ignore this section. An example: You store files on a file server, and your retrieval method works exclusively with file names in the file system, so you don't need embeddings. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3446047228"] = "You will likely use one or more embedding methods to encode the meaning of your data into a typically high-dimensional vector space. In this case, you will use a vector database to store and search these vectors (called embeddings). However, you don't have to use embedding methods. When your retrieval method works without any embedding, you can ignore this section. An example: You store files on a file server, and your retrieval method works exclusively with file names in the file system, so you don't need embeddings." + +-- Important: The LLM may need to generate many files. This reaches the request limit of most providers. Typically, only a certain number of requests can be made per minute, and only a maximum number of tokens can be generated per minute. AI Studio automatically considers this. However, generating all the files takes a certain amount of time. Local or self-hosted models may work without these limitations and can generate responses faster. AI Studio dynamically adapts its behavior and always tries to achieve the fastest possible data processing. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3485079498"] = "Important: The LLM may need to generate many files. This reaches the request limit of most providers. Typically, only a certain number of requests can be made per minute, and only a maximum number of tokens can be generated per minute. AI Studio automatically considers this. However, generating all the files takes a certain amount of time. Local or self-hosted models may work without these limitations and can generate responses faster. AI Studio dynamically adapts its behavior and always tries to achieve the fastest possible data processing." + +-- Type +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3512062061"] = "Type" + +-- Please describe how the selected authentication methods should be used. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T356079033"] = "Please describe how the selected authentication methods should be used." + +-- Authentication settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3565127422"] = "Authentication settings" + +-- Add Retrieval Process +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3617128581"] = "Add Retrieval Process" + +-- Please provide a brief description of your ERI server. Describe or explain what your ERI server does and what data it uses for this purpose. This description will be shown to users in AI Studio. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3637826231"] = "Please provide a brief description of your ERI server. Describe or explain what your ERI server does and what data it uses for this purpose. This description will be shown to users in AI Studio." + +-- Please provide the port of the data source. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3641304143"] = "Please provide the port of the data source." + +-- Please provide the hostname of the data source. Use 'localhost' if the data source is on the same machine as the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3668870799"] = "Please provide the hostname of the data source. Use 'localhost' if the data source is on the same machine as the ERI server." + +-- Delete Embedding +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3691399003"] = "Delete Embedding" + +-- Yes, please save my inputs +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3709185824"] = "Yes, please save my inputs" + +-- Common ERI server settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T371718034"] = "Common ERI server settings" + +-- Download specification +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3770339156"] = "Download specification" + +-- Are you sure you want to delete the embedding '{0}'? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3792084967"] = "Are you sure you want to delete the embedding '{0}'?" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3865031940"] = "Actions" + +-- ERI specification version +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3897494556"] = "ERI specification version" + +-- Please provide a description for your ERI server. What data will the server retrieve? This description will be used to inform users about the purpose of your ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T3973182416"] = "Please provide a description for your ERI server. What data will the server retrieve? This description will be used to inform users about the purpose of your ERI server." + +-- Please select a data source for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4010020894"] = "Please select a data source for the ERI server." + +-- Please select at least one authentication method for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4027569219"] = "Please select at least one authentication method for the ERI server." + +-- Data protection settings +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4078115997"] = "Data protection settings" + +-- Please describe the data source of your ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4156384463"] = "Please describe the data source of your ERI server." + +-- ERI Server +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4204533420"] = "ERI Server" + +-- The name of your ERI server must be between 6 and 60 characters long. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4215418115"] = "The name of your ERI server must be between 6 and 60 characters long." + +-- Describe your data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T4272497758"] = "Describe your data source" + +-- The ERI is the External Retrieval Interface for AI Studio and other tools. The ERI acts as a contract between decentralized data sources and, e.g., AI Studio. The ERI is implemented by the data sources, allowing them to be integrated into AI Studio later. This means that the data sources assume the server role and AI Studio (or any other LLM tool) assumes the client role of the API. This approach serves to realize a Retrieval-Augmented Generation (RAG) process with external data. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T458158948"] = "The ERI is the External Retrieval Interface for AI Studio and other tools. The ERI acts as a contract between decentralized data sources and, e.g., AI Studio. The ERI is implemented by the data sources, allowing them to be integrated into AI Studio later. This means that the data sources assume the server role and AI Studio (or any other LLM tool) assumes the client role of the API. This approach serves to realize a Retrieval-Augmented Generation (RAG) process with external data." + +-- Allowed LLM providers for this data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T476513814"] = "Allowed LLM providers for this data source" + +-- The description of your ERI server must be between 32 and 512 characters long. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T528250165"] = "The description of your ERI server must be between 32 and 512 characters long." + +-- (Optional) Additional libraries +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T605643256"] = "(Optional) Additional libraries" + +-- Delete this server preset +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T662220520"] = "Delete this server preset" + +-- No retrieval process configured yet. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T701892387"] = "No retrieval process configured yet." + +-- Hint: to allow this assistant to manage multiple presets, you must enable the preselection of values in the settings. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T726548639"] = "Hint: to allow this assistant to manage multiple presets, you must enable the preselection of values in the settings." + +-- Should we write the generated code to the file system? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T732123150"] = "Should we write the generated code to the file system?" + +-- ERI server description +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T746826190"] = "ERI server description" + +-- Are you sure you want to delete the retrieval process '{0}'? +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T748762927"] = "Are you sure you want to delete the retrieval process '{0}'?" + +-- Data source: hostname +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T761552889"] = "Data source: hostname" + +-- Please select a programming language for the ERI server. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T884206922"] = "Please select a programming language for the ERI server." + +-- The hostname of the data source must not exceed 255 characters. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T891356210"] = "The hostname of the data source must not exceed 255 characters." + +-- ERI repository with example implementation in .NET and C# +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::ASSISTANTERI::T907948048"] = "ERI repository with example implementation in .NET and C#" + +-- Login by token: simple to implement and to operate, useful for few users; unusual for many users +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T1080772923"] = "Login by token: simple to implement and to operate, useful for few users; unusual for many users" + +-- Unknown login method +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T1650512217"] = "Unknown login method" + +-- Login by single-sign-on (SSO) using Kerberos: very complex to implement and to operate, useful for many users +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T2755085876"] = "Login by single-sign-on (SSO) using Kerberos: very complex to implement and to operate, useful for many users" + +-- Login by username and password: simple to implement and to operate, useful for few users; easy to use for users +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T2776614042"] = "Login by username and password: simple to implement and to operate, useful for few users; easy to use for users" + +-- No login necessary: useful for public data sources +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::AUTHEXTENSIONS::T80942322"] = "No login necessary: useful for public data sources" + +-- Custom description +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T1927732460"] = "Custom description" + +-- Object storage, like Amazon S3, MinIO, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T1950971562"] = "Object storage, like Amazon S3, MinIO, etc." + +-- Key-Value store, like Redis, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T206122953"] = "Key-Value store, like Redis, etc." + +-- No data source selected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T2241819332"] = "No data source selected" + +-- Graph database, like Neo4j, ArangoDB, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T2327735815"] = "Graph database, like Neo4j, ArangoDB, etc." + +-- File system (local or network share) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T2883797032"] = "File system (local or network share)" + +-- Document store, like MongoDB, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T3377619148"] = "Document store, like MongoDB, etc." + +-- Relational database, like MySQL, PostgreSQL, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T3394837922"] = "Relational database, like MySQL, PostgreSQL, etc." + +-- Unknown data source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::DATASOURCESEXTENSIONS::T752426884"] = "Unknown data source" + +-- Windows +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T104858250"] = "Windows" + +-- No operating system specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T1453731272"] = "No operating system specified" + +-- Linux +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T2498953917"] = "Linux" + +-- Unknown operating system +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::OPERATINGSYSTEMEXTENSIONS::T2961688575"] = "Unknown operating system" + +-- Other +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::PROGRAMMINGLANGUAGESEXTENSIONS::T1849229205"] = "Other" + +-- No programming language selected +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::PROGRAMMINGLANGUAGESEXTENSIONS::T2044057328"] = "No programming language selected" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ERI::PROGRAMMINGLANGUAGESEXTENSIONS::T3424652889"] = "Unknown" + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T137304886"] = "Please provide a text as input. You might copy the desired text from a document or a website." + +-- Proofread +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T2325568297"] = "Proofread" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T2591284123"] = "Language" + +-- Your input to check +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T2861221443"] = "Your input to check" + +-- Custom language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T3032662264"] = "Custom language" + +-- Grammar & Spelling Checker +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T3169549433"] = "Grammar & Spelling Checker" + +-- Check the grammar and spelling of a text. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T3184716499"] = "Check the grammar and spelling of a text." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::GRAMMARSPELLING::ASSISTANTGRAMMARSPELLING::T656744944"] = "Please provide a custom language." + +-- Text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1041509726"] = "Text" + +-- While loading the I18N data, an issue occurred: +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1115416642"] = "While loading the I18N data, an issue occurred:" + +-- Please select a target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1173859091"] = "Please select a target language." + +-- Removed Content ({0} entries) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1214535771"] = "Removed Content ({0} entries)" + +-- Added Content ({0} entries) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1258080997"] = "Added Content ({0} entries)" + +-- Localized Content ({0} entries of {1}) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1492071634"] = "Localized Content ({0} entries of {1})" + +-- Select the language plugin used for comparision. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1523568309"] = "Select the language plugin used for comparision." + +-- Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T1893011391"] = "Was not able to load the language plugin for comparison ({0}). Please select a valid, loaded & running language plugin." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T237828418"] = "Target language" + +-- Language plugin used for comparision +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T263317578"] = "Language plugin used for comparision" + +-- Localize AI Studio & generate the Lua code +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3055634395"] = "Localize AI Studio & generate the Lua code" + +-- Translate MindWork AI Studio text content into another language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3206202961"] = "Translate MindWork AI Studio text content into another language." + +-- Search +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3326517961"] = "Search" + +-- Key +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3441084684"] = "Key" + +-- Please select a language plugin for comparison. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3505664865"] = "Please select a language plugin for comparison." + +-- Was not able to load the I18N plugin. Please check the plugin code. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3687333329"] = "Was not able to load the I18N plugin. Please check the plugin code." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3848935911"] = "Custom target language" + +-- Copy Lua code to clipboard +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T3875738742"] = "Copy Lua code to clipboard" + +-- The data is being loaded, please wait... +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T453060723"] = "The data is being loaded, please wait..." + +-- The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T458999393"] = "The selected language plugin for comparison uses the IETF tag '{0}' which does not match the selected target language '{1}'. Please select a valid, loaded & running language plugin which matches the target language." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T656744944"] = "Please provide a custom language." + +-- Please note: neither is a translation needed nor performed for English (USA). Anyway, you might want to generate the related Lua code. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T851515643"] = "Please note: neither is a translation needed nor performed for English (USA). Anyway, you might want to generate the related Lua code." + +-- Localization +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::I18N::ASSISTANTI18N::T897888480"] = "Localization" + +-- Your icon source +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T1302165948"] = "Your icon source" + +-- Find Icon +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T1975161003"] = "Find Icon" + +-- Finding the right icon for a context, such as for a piece of text, is not easy. The first challenge: You need to extract a concept from your context, such as from a text. Let's take an example where your text contains statements about multiple departments. The sought-after concept could be "departments." The next challenge is that we need to anticipate the bias of the icon designers: under the search term "departments," there may be no relevant icons or only unsuitable ones. Depending on the icon source, it might be more effective to search for "buildings," for instance. LLMs assist you with both steps. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T347756684"] = "Finding the right icon for a context, such as for a piece of text, is not easy. The first challenge: You need to extract a concept from your context, such as from a text. Let's take an example where your text contains statements about multiple departments. The sought-after concept could be \"departments.\" The next challenge is that we need to anticipate the bias of the icon designers: under the search term \"departments,\" there may be no relevant icons or only unsuitable ones. Depending on the icon source, it might be more effective to search for \"buildings,\" for instance. LLMs assist you with both steps." + +-- Icon Finder +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T3693102312"] = "Icon Finder" + +-- Open website +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T4239378936"] = "Open website" + +-- Your context +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T596802185"] = "Your context" + +-- Please provide a context. This will help the AI to find the right icon. You might type just a keyword or copy a sentence from your text, e.g., from a slide where you want to use the icon. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::ICONFINDER::ASSISTANTICONFINDER::T653229070"] = "Please provide a context. This will help the AI to find the right icon. You might type just a keyword or copy a sentence from your text, e.g., from a slide where you want to use the icon." + +-- (Optional) The company name +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1134022609"] = "(Optional) The company name" + +-- (Optional) Provide mandatory information +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1206803170"] = "(Optional) Provide mandatory information" + +-- Please provide the country where the job is posted (legal framework). +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1257297967"] = "Please provide the country where the job is posted (legal framework)." + +-- (Optional) Provide necessary job qualifications +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1288034407"] = "(Optional) Provide necessary job qualifications" + +-- Describe the responsibilities the person should take on in the company. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1289043339"] = "Describe the responsibilities the person should take on in the company." + +-- Please provide a custom target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1330607941"] = "Please provide a custom target language." + +-- Create the job posting +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1348170275"] = "Create the job posting" + +-- This is important to consider the legal framework of the country. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1652348489"] = "This is important to consider the legal framework of the country." + +-- Mandatory information that your company requires for all job postings. This can include the company description, etc. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1860534017"] = "Mandatory information that your company requires for all job postings. This can include the company description, etc." + +-- (Optional) Provide the entry date +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1911333264"] = "(Optional) Provide the entry date" + +-- Describe what the person is supposed to do in the company. This might be just short bullet points. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T1965813611"] = "Describe what the person is supposed to do in the company. This might be just short bullet points." + +-- Describe what the person should bring to the table. This might be just short bullet points. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T2223185050"] = "Describe what the person should bring to the table. This might be just short bullet points." + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T237828418"] = "Target language" + +-- Please provide a job description. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3056799310"] = "Please provide a job description." + +-- Job description +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3063567486"] = "Job description" + +-- Provide the country, where the company is located +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3414839564"] = "Provide the country, where the company is located" + +-- (Optional) Provide the date until the job posting is valid +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3471426808"] = "(Optional) Provide the date until the job posting is valid" + +-- Provide some key points about the job you want to post. The AI will then formulate a suggestion that you can finalize. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3644893573"] = "Provide some key points about the job you want to post. The AI will then formulate a suggestion that you can finalize." + +-- (Optional) Provide job responsibilities +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3657997222"] = "(Optional) Provide job responsibilities" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3848935911"] = "Custom target language" + +-- Job Posting +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3930052338"] = "Job Posting" + +-- (Optional) Provide the work location +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::JOBPOSTING::ASSISTANTJOBPOSTINGS::T3972042680"] = "(Optional) Provide the work location" + +-- Please provide a legal document as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1160217683"] = "Please provide a legal document as input. You might copy the desired text from a document or a website." + +-- Legal Check +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1348190638"] = "Legal Check" + +-- Legal document +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1887742531"] = "Legal document" + +-- Your questions +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T1947954583"] = "Your questions" + +-- Provide a legal document and ask a question about it. This assistant does not replace legal advice. Consult a lawyer to get professional advice. Remember that LLMs can invent answers and facts. Please do not rely on this answers. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T4016275181"] = "Provide a legal document and ask a question about it. This assistant does not replace legal advice. Consult a lawyer to get professional advice. Remember that LLMs can invent answers and facts. Please do not rely on this answers." + +-- Please provide your questions as input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T4154383818"] = "Please provide your questions as input." + +-- Ask your questions +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::LEGALCHECK::ASSISTANTLEGALCHECK::T467099852"] = "Ask your questions" + +-- Please provide some text as input. For example, an email. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T1962809521"] = "Please provide some text as input. For example, an email." + +-- Analyze text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T2268303626"] = "Analyze text" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T237828418"] = "Target language" + +-- My Tasks +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3011450657"] = "My Tasks" + +-- You received a cryptic email that was sent to many recipients and you are now wondering if you need to do something? Copy the email into the input field. You also need to select a personal profile. In this profile, you should describe your role in the organization. The AI will then try to give you hints on what your tasks might be. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3646084045"] = "You received a cryptic email that was sent to many recipients and you are now wondering if you need to do something? Copy the email into the input field. You also need to select a personal profile. In this profile, you should describe your role in the organization. The AI will then try to give you hints on what your tasks might be." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3848935911"] = "Custom target language" + +-- Please select one of your profiles. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T465395981"] = "Please select one of your profiles." + +-- Text or email +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T534887559"] = "Text or email" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T656744944"] = "Please provide a custom language." + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T137304886"] = "Please provide a text as input. You might copy the desired text from a document or a website." + +-- Sentence structure +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T1714063121"] = "Sentence structure" + +-- Rewrite & Improve Text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T1994150308"] = "Rewrite & Improve Text" + +-- Improve your text +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T2163831433"] = "Improve your text" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T2591284123"] = "Language" + +-- Custom language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T3032662264"] = "Custom language" + +-- Your input to improve +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T3037449423"] = "Your input to improve" + +-- Writing style +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T3754048862"] = "Writing style" + +-- Rewrite and improve your text. Please note, that the capabilities of the different LLM providers will vary. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T480915300"] = "Rewrite and improve your text. Please note, that the capabilities of the different LLM providers will vary." + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T656744944"] = "Please provide a custom language." + +-- Passive voice +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::SENTENCESTRUCTUREEXTENSIONS::T132535068"] = "Passive voice" + +-- Active voice +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::SENTENCESTRUCTUREEXTENSIONS::T3548001825"] = "Active voice" + +-- Not Specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::SENTENCESTRUCTUREEXTENSIONS::T4281286216"] = "Not Specified" + +-- Scientific (scientific papers, research reports) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1488581017"] = "Scientific (scientific papers, research reports)" + +-- Technical (manuals, documentation) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1577933546"] = "Technical (manuals, documentation)" + +-- Changelog (release notes, version history) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1755311660"] = "Changelog (release notes, version history)" + +-- Literary (fiction, poetry) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T1823468337"] = "Literary (fiction, poetry)" + +-- Journalistic (magazines, newspapers, news) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T302304243"] = "Journalistic (magazines, newspapers, news)" + +-- Everyday (personal texts, social media) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T3607558508"] = "Everyday (personal texts, social media)" + +-- Business (business emails, reports, presentations) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T3674741297"] = "Business (business emails, reports, presentations)" + +-- Legal (legal texts, contracts) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T3749505397"] = "Legal (legal texts, contracts)" + +-- Academic (essays, seminar papers) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T4090727535"] = "Academic (essays, seminar papers)" + +-- Not specified +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T641241064"] = "Not specified" + +-- Marketing (advertisements, sales texts) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T945714286"] = "Marketing (advertisements, sales texts)" + +-- Your word or phrase +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T1847246020"] = "Your word or phrase" + +-- (Optional) The context for the given word or phrase +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2250963999"] = "(Optional) The context for the given word or phrase" + +-- Synonyms +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2547582747"] = "Synonyms" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2591284123"] = "Language" + +-- Find synonyms for words or phrases. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T2733641217"] = "Find synonyms for words or phrases." + +-- Find synonyms +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T3106607224"] = "Find synonyms" + +-- Please provide a word or phrase as input. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T3501110371"] = "Please provide a word or phrase as input." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T3848935911"] = "Custom target language" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T656744944"] = "Please provide a custom language." + +-- Your input +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T1249704194"] = "Your input" + +-- Target complexity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T1318882688"] = "Target complexity" + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T137304886"] = "Please provide a text as input. You might copy the desired text from a document or a website." + +-- Text Summarizer +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T1907192403"] = "Text Summarizer" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T237828418"] = "Target language" + +-- Summarize long text into a shorter version while retaining the main points. You might want to change the language of the summary to make it more readable. It is also possible to change the complexity of the summary to make it easy to understand. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T359929871"] = "Summarize long text into a shorter version while retaining the main points. You might want to change the language of the summary to make it more readable. It is also possible to change the complexity of the summary to make it easy to understand." + +-- Please provide your field of expertise. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T3610378685"] = "Please provide your field of expertise." + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T3848935911"] = "Custom target language" + +-- Summarize +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T502888730"] = "Summarize" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T656744944"] = "Please provide a custom language." + +-- Your expertise +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::ASSISTANTTEXTSUMMARIZER::T970222193"] = "Your expertise" + +-- No change in complexity +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T1001090711"] = "No change in complexity" + +-- Teen language, e.g., for teenagers +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T1177455058"] = "Teen language, e.g., for teenagers" + +-- Scientific language for experts in this field +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T2687197281"] = "Scientific language for experts in this field" + +-- Scientific language for experts from other fields (interdisciplinary) +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T2931193867"] = "Scientific language for experts from other fields (interdisciplinary)" + +-- Popular science language, e.g., for people interested in science +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T3161914110"] = "Popular science language, e.g., for people interested in science" + +-- Everyday language, e.g., for adults +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T3382050522"] = "Everyday language, e.g., for adults" + +-- Simple language, e.g., for children +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TEXTSUMMARIZER::COMPLEXITYEXTENSIONS::T530584375"] = "Simple language, e.g., for children" + +-- Please select a target language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T1173859091"] = "Please select a target language." + +-- Your input +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T1249704194"] = "Your input" + +-- Please provide a text as input. You might copy the desired text from a document or a website. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T137304886"] = "Please provide a text as input. You might copy the desired text from a document or a website." + +-- Translate +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T2028202101"] = "Translate" + +-- Target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T237828418"] = "Target language" + +-- Translate text from one language to another. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T3230457846"] = "Translate text from one language to another." + +-- No live translation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T3556243327"] = "No live translation" + +-- Custom target language +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T3848935911"] = "Custom target language" + +-- Live translation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T4279308324"] = "Live translation" + +-- Translation +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T613888204"] = "Translation" + +-- Please provide a custom language. +UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::TRANSLATION::ASSISTANTTRANSLATION::T656744944"] = "Please provide a custom language." + +-- System +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T2402387132"] = "System" + +-- You +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3049115964"] = "You" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3424652889"] = "Unknown" + +-- Assistant +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3662687431"] = "Assistant" + +-- User +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T3768991250"] = "User" + +-- AI +UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T601166687"] = "AI" + +-- Edit Message +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1183581066"] = "Edit Message" + +-- Copies the content to the clipboard +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T12948066"] = "Copies the content to the clipboard" + +-- Do you really want to remove this message? +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1347427447"] = "Do you really want to remove this message?" + +-- Yes, remove the AI response and edit it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1350385882"] = "Yes, remove the AI response and edit it" + +-- Yes, regenerate it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1603883875"] = "Yes, regenerate it" + +-- Yes, remove it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T1820166585"] = "Yes, remove it" + +-- Do you really want to edit this message? In order to edit this message, the AI response will be deleted. +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T2018431076"] = "Do you really want to edit this message? In order to edit this message, the AI response will be deleted." + +-- Removes this block +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T2093355991"] = "Removes this block" + +-- Regenerate Message +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T2308444540"] = "Regenerate Message" + +-- Cannot render content of type {0} yet. +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3175548294"] = "Cannot render content of type {0} yet." + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3267849393"] = "Edit" + +-- Regenerate +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3587744975"] = "Regenerate" + +-- Do you really want to regenerate this message? +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T3878878761"] = "Do you really want to regenerate this message?" + +-- Cannot copy this content type to clipboard! +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T4021525742"] = "Cannot copy this content type to clipboard!" + +-- Remove Message +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T4070211974"] = "Remove Message" + +-- No, keep it +UI_TEXT_CONTENT["AISTUDIO::CHAT::CONTENTBLOCKCOMPONENT::T4188329028"] = "No, keep it" + +-- Open Settings +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ASSISTANTBLOCK::T1172211894"] = "Open Settings" + +-- Changelog +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHANGELOG::T3017574265"] = "Changelog" + +-- Move chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1133040906"] = "Move chat" + +-- Are you sure you want to move this chat? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1142475422"] = "Are you sure you want to move this chat? All unsaved changes will be lost." + +-- Stop generation +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1317408357"] = "Stop generation" + +-- Save chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1516264254"] = "Save chat" + +-- Type your input here... +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1849313532"] = "Type your input here..." + +-- Your Prompt (use selected instance '{0}', provider '{1}') +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1967611328"] = "Your Prompt (use selected instance '{0}', provider '{1}')" + +-- Profile usage is disabled according to your chat template settings. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2670286472"] = "Profile usage is disabled according to your chat template settings." + +-- Delete this chat & start a new one. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2991985411"] = "Delete this chat & start a new one." + +-- Move Chat to Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3045856778"] = "Move Chat to Workspace" + +-- The selected provider is not allowed in this chat due to data security reasons. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3403290862"] = "The selected provider is not allowed in this chat due to data security reasons." + +-- Select a provider first +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3654197869"] = "Select a provider first" + +-- Start new chat in workspace "{0}" +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3928697643"] = "Start new chat in workspace \"{0}\"" + +-- New disappearing chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4113970938"] = "New disappearing chat" + +-- Please select the workspace where you want to move the chat to. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T474393241"] = "Please select the workspace where you want to move the chat to." + +-- Move the chat to a workspace, or to another if it is already in one. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T636393754"] = "Move the chat to a workspace, or to another if it is already in one." + +-- Show your workspaces +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T733672375"] = "Show your workspaces" + +-- Start a new chat with a chat template +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATTEMPLATESELECTION::T1333844707"] = "Start a new chat with a chat template" + +-- Open Chat Template Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATTEMPLATESELECTION::T1335399555"] = "Open Chat Template Options" + +-- Manage your templates +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATTEMPLATESELECTION::T3058934130"] = "Manage your templates" + +-- Region +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T1227782301"] = "Region" + +-- Source {0} +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T1700986546"] = "Source {0}" + +-- Description +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T1725856265"] = "Description" + +-- Confidence Level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T2492230131"] = "Confidence Level" + +-- Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T2730980305"] = "Sources" + +-- Confidence Card +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T2960002005"] = "Confidence Card" + +-- Confidence +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T3243388657"] = "Confidence" + +-- Shows and hides the confidence card with information about the selected LLM provider. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIDENCEINFO::T847071819"] = "Shows and hides the confidence card with information about the selected LLM provider." + +-- Choose the minimum confidence level that all LLM providers must meet. This way, you can ensure that only trustworthy providers are used. You cannot use any provider that falls below this level. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMINCONFIDENCESELECTION::T2526727283"] = "Choose the minimum confidence level that all LLM providers must meet. This way, you can ensure that only trustworthy providers are used. You cannot use any provider that falls below this level." + +-- Select a minimum confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMINCONFIDENCESELECTION::T2579793544"] = "Select a minimum confidence level" + +-- You have selected 1 preview feature. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMULTISELECT::T1384241824"] = "You have selected 1 preview feature." + +-- No preview features selected. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMULTISELECT::T2809641588"] = "No preview features selected." + +-- You have selected {0} preview features. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONMULTISELECT::T3513450626"] = "You have selected {0} preview features." + +-- Preselected provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONPROVIDERSELECTION::T1469984996"] = "Preselected provider" + +-- Select a provider that is preselected. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONPROVIDERSELECTION::T20906218"] = "Select a provider that is preselected." + +-- Use app default +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CONFIGURATIONPROVIDERSELECTION::T3672477670"] = "Use app default" + +-- Yes, let the AI decide which data sources are needed. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1031370894"] = "Yes, let the AI decide which data sources are needed." + +-- Yes, let the AI validate & filter the retrieved data. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1309929755"] = "Yes, let the AI validate & filter the retrieved data." + +-- Data Source Selection +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T15302104"] = "Data Source Selection" + +-- AI-Selected Data Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T168406579"] = "AI-Selected Data Sources" + +-- AI-based data validation +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1744745490"] = "AI-based data validation" + +-- Yes, I want to use data sources. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T1975014927"] = "Yes, I want to use data sources." + +-- You haven't configured any data sources. To grant the AI access to your data, you need to add such a source. However, if you wish to use data from your device, you first have to set up a so-called embedding. This embedding is necessary so the AI can effectively search your data, find and retrieve the correct information required for each task. In addition to local data, you can also incorporate your company's data. To do so, your company must provide the data through an ERI (External Retrieval Interface). +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T2113594442"] = "You haven't configured any data sources. To grant the AI access to your data, you need to add such a source. However, if you wish to use data from your device, you first have to set up a so-called embedding. This embedding is necessary so the AI can effectively search your data, find and retrieve the correct information required for each task. In addition to local data, you can also incorporate your company's data. To do so, your company must provide the data through an ERI (External Retrieval Interface)." + +-- Select the data you want to use here. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T21181525"] = "Select the data you want to use here." + +-- Manage your data sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T2149927097"] = "Manage your data sources" + +-- Select data +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T274155039"] = "Select data" + +-- Read more about ERI +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3095532189"] = "Read more about ERI" + +-- AI-based data source selection +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3100256862"] = "AI-based data source selection" + +-- No, I don't want to use data sources. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3135725655"] = "No, I don't want to use data sources." + +-- Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3215374102"] = "Your data sources cannot be used with the LLM provider you selected due to data privacy, or they are currently unavailable." + +-- No, I manually decide which data source to use. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3440789294"] = "No, I manually decide which data source to use." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3448155331"] = "Close" + +-- The AI evaluates each of your inputs to determine whether and which data sources are necessary. Currently, the AI has not selected any source. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3574254516"] = "The AI evaluates each of your inputs to determine whether and which data sources are necessary. Currently, the AI has not selected any source." + +-- No, use all data retrieved from the data sources. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T3751463241"] = "No, use all data retrieved from the data sources." + +-- Are data sources enabled? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T396683085"] = "Are data sources enabled?" + +-- Manage Data Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T700666808"] = "Manage Data Sources" + +-- Available Data Sources +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T86053874"] = "Available Data Sources" + +-- Issues +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ISSUES::T3229841001"] = "Issues" + +-- Given that my employer's workplace uses both Windows and Linux, I wanted a cross-platform solution that would work seamlessly across all major operating systems, including macOS. Additionally, I wanted to demonstrate that it is possible to create modern, efficient, cross-platform applications without resorting to Electron bloatware. The combination of .NET and Rust with Tauri proved to be an excellent technology stack for building such robust applications. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1057189794"] = "Given that my employer's workplace uses both Windows and Linux, I wanted a cross-platform solution that would work seamlessly across all major operating systems, including macOS. Additionally, I wanted to demonstrate that it is possible to create modern, efficient, cross-platform applications without resorting to Electron bloatware. The combination of .NET and Rust with Tauri proved to be an excellent technology stack for building such robust applications." + +-- Limitations of Existing Solutions +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1086130692"] = "Limitations of Existing Solutions" + +-- Personal Needs and Limitations of Web Services +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1839655973"] = "Personal Needs and Limitations of Web Services" + +-- While exploring available solutions, I found a desktop application called Anything LLM. Unfortunately, it fell short of meeting my specific requirements and lacked the user interface design I envisioned. For macOS, there were several apps similar to what I had in mind, but they were all commercial solutions shrouded in uncertainty. The developers' identities and the origins of these apps were unclear, raising significant security concerns. Reports from users about stolen API keys and unwanted charges only amplified my reservations. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3552777197"] = "While exploring available solutions, I found a desktop application called Anything LLM. Unfortunately, it fell short of meeting my specific requirements and lacked the user interface design I envisioned. For macOS, there were several apps similar to what I had in mind, but they were all commercial solutions shrouded in uncertainty. The developers' identities and the origins of these apps were unclear, raising significant security concerns. Reports from users about stolen API keys and unwanted charges only amplified my reservations." + +-- Hello, my name is Thorsten Sommer, and I am the initial creator of MindWork AI Studio. The motivation behind developing this app stems from several crucial needs and observations I made over time. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3569462457"] = "Hello, my name is Thorsten Sommer, and I am the initial creator of MindWork AI Studio. The motivation behind developing this app stems from several crucial needs and observations I made over time." + +-- Through MindWork AI Studio, I aim to provide a secure, flexible, and user-friendly tool that caters to a wider audience without compromising on functionality or design. This app is the culmination of my desire to meet personal requirements, address existing gaps in the market, and showcase innovative development practices. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3622193740"] = "Through MindWork AI Studio, I aim to provide a secure, flexible, and user-friendly tool that caters to a wider audience without compromising on functionality or design. This app is the culmination of my desire to meet personal requirements, address existing gaps in the market, and showcase innovative development practices." + +-- Relying on web services like ChatGPT was not a sustainable solution for me. I needed an AI that could also access files directly on my device, a functionality web services inherently lack due to security and privacy constraints. Although I could have scripted something in Python to meet my needs, this approach was too cumbersome for daily use. More importantly, I wanted to develop a solution that anyone could use without needing any programming knowledge. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T372007989"] = "Relying on web services like ChatGPT was not a sustainable solution for me. I needed an AI that could also access files directly on my device, a functionality web services inherently lack due to security and privacy constraints. Although I could have scripted something in Python to meet my needs, this approach was too cumbersome for daily use. More importantly, I wanted to develop a solution that anyone could use without needing any programming knowledge." + +-- Cross-Platform and Modern Development +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T843057510"] = "Cross-Platform and Modern Development" + +-- Alpha phase means that we are working on the last details before the beta phase. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWALPHA::T166807685"] = "Alpha phase means that we are working on the last details before the beta phase." + +-- This feature is currently in the alpha phase. Expect bugs and unfinished work. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWALPHA::T2635524607"] = "This feature is currently in the alpha phase. Expect bugs and unfinished work." + +-- Alpha +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWALPHA::T55079499"] = "Alpha" + +-- This feature is currently in the beta phase. It is still be possible that there are some bugs. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWBETA::T1045026949"] = "This feature is currently in the beta phase. It is still be possible that there are some bugs." + +-- Beta phase means that we are testing the feature. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWBETA::T3605158616"] = "Beta phase means that we are testing the feature." + +-- Beta +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWBETA::T375487463"] = "Beta" + +-- This feature is currently in the experimental phase. Expect bugs, unfinished work, changes in future versions, and more. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWEXPERIMENTAL::T1735169242"] = "This feature is currently in the experimental phase. Expect bugs, unfinished work, changes in future versions, and more." + +-- Experimental phase means that we have a vision for a feature but not a clear plan yet. We are still exploring the possibilities. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWEXPERIMENTAL::T3709099979"] = "Experimental phase means that we have a vision for a feature but not a clear plan yet. We are still exploring the possibilities." + +-- Experimental +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWEXPERIMENTAL::T3729365343"] = "Experimental" + +-- Prototype +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWPROTOTYPE::T1043365177"] = "Prototype" + +-- Prototype phase means that we have a plan but we are still working on it. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWPROTOTYPE::T2995187557"] = "Prototype phase means that we have a plan but we are still working on it." + +-- This feature is currently in the prototype phase. Expect bugs, unfinished work, changes in future versions, and more. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWPROTOTYPE::T4145334644"] = "This feature is currently in the prototype phase. Expect bugs, unfinished work, changes in future versions, and more." + +-- This feature is about to be released. We think it's ready for production. There should be no more bugs. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T2003588956"] = "This feature is about to be released. We think it's ready for production. There should be no more bugs." + +-- Release Candidate +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T3451939995"] = "Release Candidate" + +-- Release candidates are the final step before a feature is proven to be stable. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T696585888"] = "Release candidates are the final step before a feature is proven to be stable." + +-- Select one of your profiles +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILEFORMSELECTION::T2003449133"] = "Select one of your profiles" + +-- Open Profile Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILEFORMSELECTION::T3654011106"] = "Open Profile Options" + +-- Manage your profiles +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILESELECTION::T3609533889"] = "Manage your profiles" + +-- Open Profile Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILESELECTION::T3654011106"] = "Open Profile Options" + +-- You can switch between your profiles here +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILESELECTION::T918741365"] = "You can switch between your profiles here" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROVIDERSELECTION::T900237532"] = "Provider" + +-- Use PDF content as input +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READPDFCONTENT::T2849276709"] = "Use PDF content as input" + +-- Select PDF file +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READPDFCONTENT::T63272795"] = "Select PDF file" + +-- The content is cleaned using an LLM agent: the main content is extracted, advertisements and other irrelevant things are attempted to be removed; relative links are attempted to be converted into absolute links so that they can be used. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T1164201762"] = "The content is cleaned using an LLM agent: the main content is extracted, advertisements and other irrelevant things are attempted to be removed; relative links are attempted to be converted into absolute links so that they can be used." + +-- Fetch +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T1396322691"] = "Fetch" + +-- Please select a provider to use the cleanup agent. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2035652317"] = "Please select a provider to use the cleanup agent." + +-- Please provide a URL to load the content from. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2235427807"] = "Please provide a URL to load the content from." + +-- Loads the content from your URL. Does not work when the content is hidden behind a paywall. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2672192696"] = "Loads the content from your URL. Does not work when the content is hidden behind a paywall." + +-- URL from which to load the content +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2883163022"] = "URL from which to load the content" + +-- Read content from web? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2927391091"] = "Read content from web?" + +-- Cleanup content by using an LLM agent? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T2939928117"] = "Cleanup content by using an LLM agent?" + +-- Hide web content options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T3031774728"] = "Hide web content options" + +-- Please provide a valid HTTP or HTTPS URL. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T307442288"] = "Please provide a valid HTTP or HTTPS URL." + +-- No content cleaning +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T3588401674"] = "No content cleaning" + +-- Please provide a valid URL. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T3825586228"] = "Please provide a valid URL." + +-- Show web content options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::READWEBCONTENT::T4249712357"] = "Show web content options" + +-- Hide content +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SECRETINPUTFIELD::T1273315904"] = "Hide content" + +-- Show content +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SECRETINPUTFIELD::T2891011873"] = "Show content" + +-- Choose Directory +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SELECTDIRECTORY::T4256489763"] = "Choose Directory" + +-- Choose File +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SELECTFILE::T4285779702"] = "Choose File" + +-- When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T1297967572"] = "When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM." + +-- Use Case: this agent is used to clean up text content. It extracts the main content, removes advertisements and other irrelevant things, and attempts to convert relative links into absolute links so that they can be used. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T1299550589"] = "Use Case: this agent is used to clean up text content. It extracts the main content, removes advertisements and other irrelevant things, and attempts to convert relative links into absolute links so that they can be used." + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T354528094"] = "No options are preselected" + +-- Preselect text content cleaner options? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T3659087305"] = "Preselect text content cleaner options?" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTCONTENTCLEANER::T3875604319"] = "Options are preselected" + +-- When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T1297967572"] = "When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM." + +-- Use Case: this agent is used to select the appropriate data sources for the current prompt. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T2208143316"] = "Use Case: this agent is used to select the appropriate data sources for the current prompt." + +-- Agent: Data Source Selection Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T2258031949"] = "Agent: Data Source Selection Options" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T354528094"] = "No options are preselected" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T3875604319"] = "Options are preselected" + +-- Preselect data source selection options? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTDATASOURCESELECTION::T991598424"] = "Preselect data source selection options?" + +-- When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T1297967572"] = "When enabled, you can preselect some agent options. This is might be useful when you prefer an LLM." + +-- Use Case: this agent is used to validate any retrieval context of any retrieval process. Perhaps there are many of these retrieval contexts and you want to validate them all. Therefore, you might want to use a cheap and fast LLM for this job. When using a local or self-hosted LLM, look for a small (e.g. 3B) and fast model. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T1326813386"] = "Use Case: this agent is used to validate any retrieval context of any retrieval process. Perhaps there are many of these retrieval contexts and you want to validate them all. Therefore, you might want to use a cheap and fast LLM for this job. When using a local or self-hosted LLM, look for a small (e.g. 3B) and fast model." + +-- The validation agent is enabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2274149855"] = "The validation agent is enabled" + +-- Enable the retrieval context validation agent? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2663872937"] = "Enable the retrieval context validation agent?" + +-- Preselect retrieval context validation options? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2663938643"] = "Preselect retrieval context validation options?" + +-- agents +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T2669785679"] = "agents" + +-- When enabled, the retrieval context validation agent will check each retrieval context of any retrieval process, whether a context makes sense for the given prompt. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T298440039"] = "When enabled, the retrieval context validation agent will check each retrieval context of any retrieval process, whether a context makes sense for the given prompt." + +-- How many validation agents should work simultaneously? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T3431541788"] = "How many validation agents should work simultaneously?" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T354528094"] = "No options are preselected" + +-- More active agents also mean that a corresponding number of requests are made simultaneously. Some providers limit the number of requests per minute. When you are unsure, choose a low setting between 1 to 6 agents. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T3819544890"] = "More active agents also mean that a corresponding number of requests are made simultaneously. Some providers limit the number of requests per minute. When you are unsure, choose a low setting between 1 to 6 agents." + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T3875604319"] = "Options are preselected" + +-- Agent: Retrieval Context Validation Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T928989804"] = "Agent: Retrieval Context Validation Options" + +-- No validation is performed +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAGENTRETRIEVALCONTEXTVALIDATION::T95175095"] = "No validation is performed" + +-- Spellchecking is disabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1059411425"] = "Spellchecking is disabled" + +-- Do you want to show preview features in the app? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1118505044"] = "Do you want to show preview features in the app?" + +-- How often should we check for app updates? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1364944735"] = "How often should we check for app updates?" + +-- Select preview features +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1439783084"] = "Select preview features" + +-- Select the desired behavior for the navigation bar. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1555038969"] = "Select the desired behavior for the navigation bar." + +-- Color theme +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1599198973"] = "Color theme" + +-- Would you like to set one of your profiles as the default for the entire app? When you configure a different profile for an assistant, it will always take precedence. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1666052109"] = "Would you like to set one of your profiles as the default for the entire app? When you configure a different profile for an assistant, it will always take precedence." + +-- Select the language behavior for the app. The default is to use the system language. You might want to choose a language manually? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T186780842"] = "Select the language behavior for the app. The default is to use the system language. You might want to choose a language manually?" + +-- Check for updates +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1890416390"] = "Check for updates" + +-- Which preview features would you like to enable? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1898060643"] = "Which preview features would you like to enable?" + +-- Select the language for the app. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1907446663"] = "Select the language for the app." + +-- Language behavior +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2341504363"] = "Language behavior" + +-- Language +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591284123"] = "Language" + +-- Save energy? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3100928009"] = "Save energy?" + +-- Spellchecking is enabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3165555978"] = "Spellchecking is enabled" + +-- App Options +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3577148634"] = "App Options" + +-- When enabled, streamed content from the AI is updated once every third second. When disabled, streamed content will be updated as soon as it is available. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3652888444"] = "When enabled, streamed content from the AI is updated once every third second. When disabled, streamed content will be updated as soon as it is available." + +-- Enable spellchecking? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3914529369"] = "Enable spellchecking?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T4004501229"] = "Preselect one of your profiles?" + +-- When enabled, spellchecking will be active in all input fields. Depending on your operating system, errors may not be visually highlighted, but right-clicking may still offer possible corrections. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T4067492921"] = "When enabled, spellchecking will be active in all input fields. Depending on your operating system, errors may not be visually highlighted, but right-clicking may still offer possible corrections." + +-- Navigation bar behavior +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T602293588"] = "Navigation bar behavior" + +-- Choose the color theme that best suits for you. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T654667432"] = "Choose the color theme that best suits for you." + +-- Energy saving is enabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T71162186"] = "Energy saving is enabled" + +-- Energy saving is disabled +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T716338721"] = "Energy saving is disabled" + +-- Preview feature visibility +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T817101267"] = "Preview feature visibility" + +-- Would you like to set one provider as the default for the entire app? When you configure a different provider for an assistant, it will always take precedence. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T844514734"] = "Would you like to set one provider as the default for the entire app? When you configure a different provider for an assistant, it will always take precedence." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T1469573738"] = "Delete" + +-- Add Embedding +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T1738753945"] = "Add Embedding" + +-- Are you sure you want to delete the embedding provider '{0}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T1825371968"] = "Are you sure you want to delete the embedding provider '{0}'?" + +-- Add Embedding Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T190634634"] = "Add Embedding Provider" + +-- Model +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T2189814010"] = "Model" + +-- Embeddings are a way to represent words, sentences, entire documents, or even images and videos as digital fingerprints. Just like each person has a unique fingerprint, embedding models create unique digital patterns that capture the meaning and characteristics of the content they analyze. When two things are similar in meaning or content, their digital fingerprints will look very similar. For example, the fingerprints for 'happy' and 'joyful' would be more alike than those for 'happy' and 'sad'. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T2419962612"] = "Embeddings are a way to represent words, sentences, entire documents, or even images and videos as digital fingerprints. Just like each person has a unique fingerprint, embedding models create unique digital patterns that capture the meaning and characteristics of the content they analyze. When two things are similar in meaning or content, their digital fingerprints will look very similar. For example, the fingerprints for 'happy' and 'joyful' would be more alike than those for 'happy' and 'sad'." + +-- Name +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T266367750"] = "Name" + +-- This helps AI Studio understand and compare things in a way that's similar to how humans do. When you're working on something, AI Studio can automatically identify related documents and data by comparing their digital fingerprints. For instance, if you're writing about customer service, AI Studio can instantly find other documents in your data that discuss similar topics or experiences, even if they use different words. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3251217940"] = "This helps AI Studio understand and compare things in a way that's similar to how humans do. When you're working on something, AI Studio can automatically identify related documents and data by comparing their digital fingerprints. For instance, if you're writing about customer service, AI Studio can instantly find other documents in your data that discuss similar topics or experiences, even if they use different words." + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3267849393"] = "Edit" + +-- Configured Embeddings +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3526613453"] = "Configured Embeddings" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T3865031940"] = "Actions" + +-- No embeddings configured yet. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T4068015588"] = "No embeddings configured yet." + +-- Edit Embedding Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T4264602229"] = "Edit Embedding Provider" + +-- Delete Embedding Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T511304264"] = "Delete Embedding Provider" + +-- Open Dashboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T78223861"] = "Open Dashboard" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T900237532"] = "Provider" + +-- Configure Embeddings +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELEMBEDDINGS::T970042679"] = "Configure Embeddings" + +-- Show provider's confidence level? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1052533048"] = "Show provider's confidence level?" + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1469573738"] = "Delete" + +-- When enabled, we show you the confidence level for the selected provider in the app. This helps you assess where you are sending your data at any time. Example: are you currently working with sensitive data? Then choose a particularly trustworthy provider, etc. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1505516304"] = "When enabled, we show you the confidence level for the selected provider in the app. This helps you assess where you are sending your data at any time. Example: are you currently working with sensitive data? Then choose a particularly trustworthy provider, etc." + +-- No, please hide the confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1628475119"] = "No, please hide the confidence level" + +-- Description +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1725856265"] = "Description" + +-- Add Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1806589097"] = "Add Provider" + +-- Edit LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T1868766523"] = "Edit LLM Provider" + +-- Are you sure you want to delete the provider '{0}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2031310917"] = "Are you sure you want to delete the provider '{0}'?" + +-- Do you want to always be able to recognize how trustworthy your LLM providers are? This way, you keep control over which provider you send your data to. You have two options for this: Either you choose a common schema, or you configure the trust levels for each LLM provider yourself. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2082904277"] = "Do you want to always be able to recognize how trustworthy your LLM providers are? This way, you keep control over which provider you send your data to. You have two options for this: Either you choose a common schema, or you configure the trust levels for each LLM provider yourself." + +-- Model +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2189814010"] = "Model" + +-- Choose the scheme that best suits you and your life. Do you trust any western provider? Or only providers from the USA or exclusively European providers? Then choose the appropriate scheme. Alternatively, you can assign the confidence levels to each provider yourself. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2283885378"] = "Choose the scheme that best suits you and your life. Do you trust any western provider? Or only providers from the USA or exclusively European providers? Then choose the appropriate scheme. Alternatively, you can assign the confidence levels to each provider yourself." + +-- LLM Provider Confidence +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2349972795"] = "LLM Provider Confidence" + +-- What we call a provider is the combination of an LLM provider such as OpenAI and a model like GPT-4o. You can configure as many providers as you want. This way, you can use the appropriate model for each task. As an LLM provider, you can also choose local providers. However, to use this app, you must configure at least one provider. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2460361126"] = "What we call a provider is the combination of an LLM provider such as OpenAI and a model like GPT-4o. You can configure as many providers as you want. This way, you can use the appropriate model for each task. As an LLM provider, you can also choose local providers. However, to use this app, you must configure at least one provider." + +-- Confidence Level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2492230131"] = "Confidence Level" + +-- When enabled, you can enforce a minimum confidence level for all LLM providers. This way, you can ensure that only trustworthy providers are used. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T281063702"] = "When enabled, you can enforce a minimum confidence level for all LLM providers. This way, you can ensure that only trustworthy providers are used." + +-- Instance Name +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2842060373"] = "Instance Name" + +-- No providers configured yet. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T2911731076"] = "No providers configured yet." + +-- Configure Providers +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3027859089"] = "Configure Providers" + +-- as selected by provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3082210376"] = "as selected by provider" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3267849393"] = "Edit" + +-- Couldn't delete the provider '{0}'. The issue: {1}. We can ignore this issue and delete the provider anyway. Do you want to ignore it and delete this provider? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3313715309"] = "Couldn't delete the provider '{0}'. The issue: {1}. We can ignore this issue and delete the provider anyway. Do you want to ignore it and delete this provider?" + +-- Add LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3346433704"] = "Add LLM Provider" + +-- LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3612415205"] = "LLM Provider" + +-- No, do not enforce a minimum confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3642102079"] = "No, do not enforce a minimum confidence level" + +-- Configured Providers +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3850871263"] = "Configured Providers" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T3865031940"] = "Actions" + +-- Select a confidence scheme +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T4144206465"] = "Select a confidence scheme" + +-- Do you want to enforce an app-wide minimum confidence level? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T4258968041"] = "Do you want to enforce an app-wide minimum confidence level?" + +-- Delete LLM Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T4269256234"] = "Delete LLM Provider" + +-- Yes, enforce a minimum confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T458854917"] = "Yes, enforce a minimum confidence level" + +-- Not yet configured +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T48051324"] = "Not yet configured" + +-- Open Dashboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T78223861"] = "Open Dashboard" + +-- Yes, show me the confidence level +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T853225204"] = "Yes, show me the confidence level" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELPROVIDERS::T900237532"] = "Provider" + +-- Copy {0} to the clipboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::TEXTINFOLINE::T2206391442"] = "Copy {0} to the clipboard" + +-- Copy {0} to the clipboard +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::TEXTINFOLINES::T2206391442"] = "Copy {0} to the clipboard" + +-- Open the repository or website +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::THIRDPARTYCOMPONENT::T1392042694"] = "Open the repository or website" + +-- License: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::THIRDPARTYCOMPONENT::T1908172666"] = "License:" + +-- You'll interact with the AI systems using your voice. To achieve this, we want to integrate voice input (speech-to-text) and output (text-to-speech). However, later on, it should also have a natural conversation flow, i.e., seamless conversation. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1015366320"] = "You'll interact with the AI systems using your voice. To achieve this, we want to integrate voice input (speech-to-text) and output (text-to-speech). However, later on, it should also have a natural conversation flow, i.e., seamless conversation." + +-- We hope this vision excites you as much as it excites us. Together, let's build a powerful and flexible AI toolkit to support all your creative, professional, and everyday needs with MindWork AI Studio. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1061000046"] = "We hope this vision excites you as much as it excites us. Together, let's build a powerful and flexible AI toolkit to support all your creative, professional, and everyday needs with MindWork AI Studio." + +-- Integration of enterprise data +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1127694951"] = "Integration of enterprise data" + +-- Meet your needs +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T127032776"] = "Meet your needs" + +-- We're integrating a writing mode to help you create extensive works, like comprehensive project proposals, tenders, or your next fantasy novel. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1457213518"] = "We're integrating a writing mode to help you create extensive works, like comprehensive project proposals, tenders, or your next fantasy novel." + +-- Email monitoring +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1520989255"] = "Email monitoring" + +-- You'll be able to integrate your data into AI Studio, like your PDF or Office files, or your Markdown notes. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1648606751"] = "You'll be able to integrate your data into AI Studio, like your PDF or Office files, or your Markdown notes." + +-- It will soon be possible to integrate data from the corporate network using a specified interface (External Retrieval Interface, ERI for short). This will likely require development work by the organization in question. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1926587044"] = "It will soon be possible to integrate data from the corporate network using a specified interface (External Retrieval Interface, ERI for short). This will likely require development work by the organization in question." + +-- Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2144737937"] = "Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer." + +-- You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2289234741"] = "You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats." + +-- Browser usage +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2345974992"] = "Browser usage" + +-- Integrating your data +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2416595938"] = "Integrating your data" + +-- Curious about the vision for MindWork AI Studio and what the future holds? We're here to address just that. Remember, this is a free, open-source project, meaning we can't guarantee when or if this vision will be fully realized. Our aim is to share our vision with you to help you decide whether this app is right for you. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2491403346"] = "Curious about the vision for MindWork AI Studio and what the future holds? We're here to address just that. Remember, this is a free, open-source project, meaning we can't guarantee when or if this vision will be fully realized. Our aim is to share our vision with you to help you decide whether this app is right for you." + +-- Voice control +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2827242540"] = "Voice control" + +-- Specific requirements +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2868740431"] = "Specific requirements" + +-- We'll develop more assistants for everyday tasks. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2899555955"] = "We'll develop more assistants for everyday tasks." + +-- We're working on offering AI Studio features in your browser via a plugin, allowing, e.g., for spell-checking or text rewriting directly in the browser. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T308543246"] = "We're working on offering AI Studio features in your browser via a plugin, allowing, e.g., for spell-checking or text rewriting directly in the browser." + +-- There will be an interface for AI Studio to create content in other apps. You could, for example, create blog posts directly on the target platform or add entries to an internal knowledge management tool. This requires development work by the tool developers. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T3290746961"] = "There will be an interface for AI Studio to create content in other apps. You could, for example, create blog posts directly on the target platform or add entries to an internal knowledge management tool. This requires development work by the tool developers." + +-- Want an assistant that suits your specific needs? We aim to offer a plugin architecture so organizations and enthusiasts can implement such ideas. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T3440464089"] = "Want an assistant that suits your specific needs? We aim to offer a plugin architecture so organizations and enthusiasts can implement such ideas." + +-- Writing mode +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T3640675146"] = "Writing mode" + +-- So, where are we headed, and how could the app evolve in the coming months and years? The following list outlines our ideas, though not in order of priority: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T4106960135"] = "So, where are we headed, and how could the app evolve in the coming months and years? The following list outlines our ideas, though not in order of priority:" + +-- Content creation +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T428040679"] = "Content creation" + +-- Useful assistants +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T586430036"] = "Useful assistants" + +-- Are you sure you want to delete the chat '{0}' in the workspace '{1}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1016188706"] = "Are you sure you want to delete the chat '{0}' in the workspace '{1}'?" + +-- Move chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1133040906"] = "Move chat" + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1469573738"] = "Delete" + +-- Rename Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1474303418"] = "Rename Workspace" + +-- Rename Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T156144855"] = "Rename Chat" + +-- Add workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1586005241"] = "Add workspace" + +-- Add chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1874060138"] = "Add chat" + +-- Create Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1939006681"] = "Create Chat" + +-- Please name your workspace: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T201482774"] = "Please name your workspace:" + +-- Are you sure you want to load another chat? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2133593288"] = "Are you sure you want to load another chat? All unsaved changes will be lost." + +-- Are you sure you want to delete the workspace '{0}'? This will also delete {1} chat(s) in this workspace. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2151341762"] = "Are you sure you want to delete the workspace '{0}'? This will also delete {1} chat(s) in this workspace." + +-- Are you sure you want to create a another chat? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2237618267"] = "Are you sure you want to create a another chat? All unsaved changes will be lost." + +-- Delete Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2244038752"] = "Delete Chat" + +-- Move to workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T2509305748"] = "Move to workspace" + +-- Are you sure you want to delete the chat '{0}'? +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3043761007"] = "Are you sure you want to delete the chat '{0}'?" + +-- Move Chat to Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3045856778"] = "Move Chat to Workspace" + +-- Please enter a new or edit the name for your workspace '{0}': +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T323280982"] = "Please enter a new or edit the name for your workspace '{0}':" + +-- Rename +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3355849203"] = "Rename" + +-- Please enter a new or edit the name for your chat '{0}': +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3419791373"] = "Please enter a new or edit the name for your chat '{0}':" + +-- Load Chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3555709365"] = "Load Chat" + +-- Add Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3672981145"] = "Add Workspace" + +-- Empty chat +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T4019509364"] = "Empty chat" + +-- Workspaces +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T4048389951"] = "Workspaces" + +-- Disappearing Chats +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T4201703117"] = "Disappearing Chats" + +-- Please select the workspace where you want to move the chat to. +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T474393241"] = "Please select the workspace where you want to move the chat to." + +-- Delete Workspace +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T701874671"] = "Delete Workspace" + +-- Only text content is supported in the editing mode yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1352914344"] = "Only text content is supported in the editing mode yet." + +-- Please enter a message for the example conversation. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1362948628"] = "Please enter a message for the example conversation." + +-- The chat template name must be unique; the chosen name is already in use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1396308587"] = "The chat template name must be unique; the chosen name is already in use." + +-- Please enter a name for the chat template. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1548747185"] = "Please enter a name for the chat template." + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T1847791252"] = "Update" + +-- The chat template name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T204496403"] = "The chat template name must not exceed 40 characters." + +-- Add messages of an example conversation (user prompt followed by assistant prompt) to demonstrate the desired interaction pattern. These examples help the AI understand your expectations by showing it the correct format, style, and content of responses before it receives actual user inputs. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2292424657"] = "Add messages of an example conversation (user prompt followed by assistant prompt) to demonstrate the desired interaction pattern. These examples help the AI understand your expectations by showing it the correct format, style, and content of responses before it receives actual user inputs." + +-- Role +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2418769465"] = "Role" + +-- Tell the AI your system prompt. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2552381261"] = "Tell the AI your system prompt." + +-- No, prohibit profile use for this template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2579080722"] = "No, prohibit profile use for this template" + +-- Entry +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2629823795"] = "Entry" + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2646845972"] = "Add" + +-- The message +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2719480499"] = "The message" + +-- Chat Template Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T275026390"] = "Chat Template Name" + +-- Commit Changes +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T2996302517"] = "Commit Changes" + +-- The name of the chat template is mandatory. Each chat template must have a unique name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3016903701"] = "The name of the chat template is mandatory. Each chat template must have a unique name." + +-- Image content +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3094908719"] = "Image content" + +-- Are you unsure which system prompt to use? You might start with the default system prompt that AI Studio uses for all chats. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3127437308"] = "Are you unsure which system prompt to use? You might start with the default system prompt that AI Studio uses for all chats." + +-- Using some chat templates in tandem with profiles might cause issues. Therefore, you might prohibit the usage of profiles here. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3227981830"] = "Using some chat templates in tandem with profiles might cause issues. Therefore, you might prohibit the usage of profiles here." + +-- Add a message +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3372872324"] = "Add a message" + +-- Unsupported content type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3570316759"] = "Unsupported content type" + +-- What system prompt do you want to use? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3652587353"] = "What system prompt do you want to use?" + +-- Yes, allow profiles when using this template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3675108201"] = "Yes, allow profiles when using this template" + +-- Add a new message below +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3757779731"] = "Add a new message below" + +-- Example Conversation +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T380891852"] = "Example Conversation" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3865031940"] = "Actions" + +-- Messages per page +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3893704289"] = "Messages per page" + +-- Use the default system prompt +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T4051106111"] = "Use the default system prompt" + +-- Create your custom chat template to tailor the LLM's behavior for specific tasks or domains. Define a custom system prompt and provide an example conversation to design an AI experience perfectly suited to your requirements. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T4199560726"] = "Create your custom chat template to tailor the LLM's behavior for specific tasks or domains. Define a custom system prompt and provide an example conversation to design an AI experience perfectly suited to your requirements." + +-- Enter a message +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T446374405"] = "Enter a message" + +-- System Prompt +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T628396066"] = "System Prompt" + +-- Allow the use of profiles together with this chat template? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T823785464"] = "Allow the use of profiles together with this chat template?" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T900713019"] = "Cancel" + +-- No +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CONFIRMDIALOG::T1642511898"] = "No" + +-- Yes +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CONFIRMDIALOG::T3013883440"] = "Yes" + +-- How many matches do you want at most per query? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T1827669611"] = "How many matches do you want at most per query?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T1847791252"] = "Update" + +-- Failed to connect to the ERI v1 server. The message was: {0} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2150703468"] = "Failed to connect to the ERI v1 server. The message was: {0}" + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2646845972"] = "Add" + +-- Failed to store the auth. secret in the operating system. The message was: {0}. Please try again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2772567701"] = "Failed to store the auth. secret in the operating system. The message was: {0}. Please try again." + +-- Connection successful. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T279774933"] = "Connection successful." + +-- Access Token +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2891154022"] = "Access Token" + +-- Secret +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2895110961"] = "Secret" + +-- Select one retrieval process +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T2916077548"] = "Select one retrieval process" + +-- Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T299279954"] = "Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption." + +-- ERI v1 Server Hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T3494933602"] = "ERI v1 Server Hostname" + +-- Port +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T3804576966"] = "Port" + +-- Connection failed. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T3820825672"] = "Connection failed." + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T4081226330"] = "Your security policy" + +-- Not tested yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T417002657"] = "Not tested yet." + +-- Failed to connect to the ERI v1 server. The server is not supported. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T449168182"] = "Failed to connect to the ERI v1 server. The server is not supported." + +-- Username +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T470340825"] = "Username" + +-- Password +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T750979128"] = "Password" + +-- Data Source Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T813773421"] = "Data Source Name" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T900713019"] = "Cancel" + +-- Test connection & read available metadata +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1DIALOG::T988671749"] = "Test connection & read available metadata" + +-- the ERI server port +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T103013936"] = "the ERI server port" + +-- Unnamed retrieval process +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1038776502"] = "Unnamed retrieval process" + +-- the retrieval parameters +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1497074068"] = "the retrieval parameters" + +-- [{0}] Unnamed retrieval process +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1501892586"] = "[{0}] Unnamed retrieval process" + +-- the embedding type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T16293243"] = "the embedding type" + +-- the embedding description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1657824119"] = "the embedding description" + +-- Data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T171124909"] = "Data source name" + +-- Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1725856265"] = "Description" + +-- the retrieval description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1752127658"] = "the retrieval description" + +-- Security requirements of the data provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1891090932"] = "Security requirements of the data provider" + +-- Parameter: +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1917353274"] = "Parameter:" + +-- the server description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T1966565081"] = "the server description" + +-- Failed to connect to the ERI v1 server. The message was: {0} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2150703468"] = "Failed to connect to the ERI v1 server. The message was: {0}" + +-- ERI server hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T215899701"] = "ERI server hostname" + +-- the maximum number of matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2479753122"] = "the maximum number of matches per query" + +-- Server description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2562330120"] = "Server description" + +-- the data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2717738728"] = "the data source name" + +-- the ERI server hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2753279450"] = "the ERI server hostname" + +-- This retrieval process has no parameters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2863339893"] = "This retrieval process has no parameters." + +-- your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2879113658"] = "your security policy" + +-- Maximum matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2889706179"] = "Maximum matches per query" + +-- Open web link, show more information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2968752071"] = "Open web link, show more information" + +-- the username +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T2991677780"] = "the username" + +-- Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T299279954"] = "Please note: the connection to the ERI v1 server is not encrypted. This means that all data sent to the server is transmitted in plain text. Please ask the ERI server administrator to enable encryption." + +-- The data source does not provide any retrieval information. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T306340560"] = "The data source does not provide any retrieval information." + +-- Common data source information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3206517471"] = "Common data source information" + +-- when is the embedding used +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3259327370"] = "when is the embedding used" + +-- The data source does not provide any embedding information. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3425007227"] = "The data source does not provide any embedding information." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3448155331"] = "Close" + +-- ERI server port +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T3843835535"] = "ERI server port" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T4081226330"] = "Your security policy" + +-- Reload +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T440640172"] = "Reload" + +-- Failed to connect to the ERI v1 server. The server is not supported. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T449168182"] = "Failed to connect to the ERI v1 server. The server is not supported." + +-- Username +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T470340825"] = "Username" + +-- the security requirements of the data provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T503852885"] = "the security requirements of the data provider" + +-- When to use +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T629595477"] = "When to use" + +-- Retrieval information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T742006305"] = "Retrieval information" + +-- Embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCEERI_V1INFODIALOG::T951463987"] = "Embeddings" + +-- Select a root directory for this data source. All data in this directory and all its subdirectories will be processed for this data source. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1265737624"] = "Select a root directory for this data source. All data in this directory and all its subdirectories will be processed for this data source." + +-- Selected base directory for this data source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1312296210"] = "Selected base directory for this data source" + +-- How many matches do you want at most per query? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1827669611"] = "How many matches do you want at most per query?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1847791252"] = "Update" + +-- Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1922618794"] = "Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this." + +-- In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T1948697886"] = "In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method." + +-- Please note: the embedding you selected runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2403121734"] = "Please note: the embedding you selected runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud. Please confirm that you have read and understood this." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2646845972"] = "Add" + +-- The embedding you selected runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2814869210"] = "The embedding you selected runs locally or in your organization. Your data is not sent to the cloud." + +-- Embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T2838542994"] = "Embedding" + +-- Yes, please send my data to the cloud +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T3572613009"] = "Yes, please send my data to the cloud" + +-- I confirm that I have read and understood the above +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T3683380716"] = "I confirm that I have read and understood the above" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T4081226330"] = "Your security policy" + +-- No, I will chose another embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T4253147533"] = "No, I will chose another embedding" + +-- Select the base directory +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T562479068"] = "Select the base directory" + +-- Data Source Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T813773421"] = "Data Source Name" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYDIALOG::T900713019"] = "Cancel" + +-- the total directory size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1082241458"] = "the total directory size" + +-- Total directory size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1101400963"] = "Total directory size" + +-- Data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T171124909"] = "Data source name" + +-- the number of files in the directory +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1795263412"] = "the number of files in the directory" + +-- The embedding runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T1950544032"] = "The embedding runs locally or in your organization. Your data is not sent to the cloud." + +-- the files list +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2072700997"] = "the files list" + +-- the maximum number of matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2479753122"] = "the maximum number of matches per query" + +-- the data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2717738728"] = "the data source name" + +-- The directory chosen for the data source does not exist anymore. Please edit the data source and correct the path. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2875614207"] = "The directory chosen for the data source does not exist anymore. Please edit the data source and correct the path." + +-- your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2879113658"] = "your security policy" + +-- Maximum matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2889706179"] = "Maximum matches per query" + +-- the embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2937209992"] = "the embedding name" + +-- this path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T2944855252"] = "this path" + +-- Embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3153201045"] = "Embedding name" + +-- Files list +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3238813368"] = "Files list" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3448155331"] = "Close" + +-- For performance reasons, only the first 100 files are shown. The directory contains {0} files in total. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T360238400"] = "For performance reasons, only the first 100 files are shown. The directory contains {0} files in total." + +-- Path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T3949388886"] = "Path" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T4081226330"] = "Your security policy" + +-- Number of files +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T417749210"] = "Number of files" + +-- The embedding runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T443873444"] = "The embedding runs in the cloud. All your data from the folder '{0}' and all its subdirectories will be sent to the cloud." + +-- The directory chosen for the data source exists. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALDIRECTORYINFODIALOG::T445858624"] = "The directory chosen for the data source exists." + +-- Select a file for this data source. The content of this file will be processed for the data source. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1190880267"] = "Select a file for this data source. The content of this file will be processed for the data source." + +-- How many matches do you want at most per query? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1827669611"] = "How many matches do you want at most per query?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1847791252"] = "Update" + +-- Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1922618794"] = "Please note: the embedding you selected runs in the cloud. All your data will be sent to the cloud. Please confirm that you have read and understood this." + +-- In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T1948697886"] = "In order for the AI to be able to determine the appropriate data at any time, you must choose an embedding method." + +-- Please note: the embedding you selected runs in the cloud. All your data within the file '{0}' will be sent to the cloud. Please confirm that you have read and understood this. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2090178026"] = "Please note: the embedding you selected runs in the cloud. All your data within the file '{0}' will be sent to the cloud. Please confirm that you have read and understood this." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2646845972"] = "Add" + +-- The embedding you selected runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2814869210"] = "The embedding you selected runs locally or in your organization. Your data is not sent to the cloud." + +-- Embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T2838542994"] = "Embedding" + +-- Yes, please send my data to the cloud +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T3572613009"] = "Yes, please send my data to the cloud" + +-- I confirm that I have read and understood the above +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T3683380716"] = "I confirm that I have read and understood the above" + +-- Select the file +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T3740148848"] = "Select the file" + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T4081226330"] = "Your security policy" + +-- No, I will chose another embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T4253147533"] = "No, I will chose another embedding" + +-- Data Source Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T813773421"] = "Data Source Name" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T900713019"] = "Cancel" + +-- Selected file path for this data source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEDIALOG::T939749563"] = "Selected file path for this data source" + +-- The file chosen for the data source exists. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T1294177559"] = "The file chosen for the data source exists." + +-- Data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T171124909"] = "Data source name" + +-- The embedding runs locally or in your organization. Your data is not sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T1950544032"] = "The embedding runs locally or in your organization. Your data is not sent to the cloud." + +-- The file chosen for the data source does not exist anymore. Please edit the data source and choose another file or correct the path. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2235729121"] = "The file chosen for the data source does not exist anymore. Please edit the data source and choose another file or correct the path." + +-- the maximum number of matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2479753122"] = "the maximum number of matches per query" + +-- the data source name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2717738728"] = "the data source name" + +-- the file size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2837935239"] = "the file size" + +-- your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2879113658"] = "your security policy" + +-- File path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2879895266"] = "File path" + +-- Maximum matches per query +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2889706179"] = "Maximum matches per query" + +-- the embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2937209992"] = "the embedding name" + +-- this path +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T2944855252"] = "this path" + +-- Embedding name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3153201045"] = "Embedding name" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3448155331"] = "Close" + +-- File size +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3650018664"] = "File size" + +-- The embedding runs in the cloud. All your data within the file '{0}' will be sent to the cloud. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T3688254408"] = "The embedding runs in the cloud. All your data within the file '{0}' will be sent to the cloud." + +-- Your security policy +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::DATASOURCELOCALFILEINFODIALOG::T4081226330"] = "Your security policy" + +-- Embedding Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T1427271797"] = "Embedding Name" + +-- Embedding Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T1625164424"] = "Embedding Description" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T1847791252"] = "Update" + +-- Please describe when the embedding is used. Might be anytime or when certain keywords are present, etc. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T2346653528"] = "Please describe when the embedding is used. Might be anytime or when certain keywords are present, etc." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T2646845972"] = "Add" + +-- Embedding Type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T2764429350"] = "Embedding Type" + +-- Embedding Link +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T290945550"] = "Embedding Link" + +-- Used when +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3229398952"] = "Used when" + +-- The embedding type must not be longer than 56 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T32602319"] = "The embedding type must not be longer than 56 characters." + +-- The name of the embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3415350123"] = "The name of the embedding method." + +-- A short description of the embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3588690510"] = "A short description of the embedding method." + +-- The embedding name must not be longer than 26 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T359150945"] = "The embedding name must not be longer than 26 characters." + +-- The embedding method name '{0}' is already used. Please choose a unique name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3601888052"] = "The embedding method name '{0}' is already used. Please choose a unique name." + +-- When is this embedding used? When you define multiple embeddings, it is helpful to know when to use which one. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3779802582"] = "When is this embedding used? When you define multiple embeddings, it is helpful to know when to use which one." + +-- See Wikipedia for more information about word embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3806477732"] = "See Wikipedia for more information about word embeddings" + +-- The embedding type must not be empty. Please specify the embedding type. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3902812924"] = "The embedding type must not be empty. Please specify the embedding type." + +-- See Wikipedia for more information about knowledge graph embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T3928412408"] = "See Wikipedia for more information about knowledge graph embeddings" + +-- The embedding name must not be empty. Please name the embedding. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T4242514061"] = "The embedding name must not be empty. Please name the embedding." + +-- What kind of embedding is used. For example, Transformer Embedding, Contextual Word Embedding, Graph Embedding, etc. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T4263395074"] = "What kind of embedding is used. For example, Transformer Embedding, Contextual Word Embedding, Graph Embedding, etc." + +-- The description must not be empty. Please describe the embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T4268946588"] = "The description must not be empty. Please describe the embedding method." + +-- A link to the embedding, e.g., to the model, the source code, the paper, it's Wikipedia page, etc. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T662524223"] = "A link to the embedding, e.g., to the model, the source code, the paper, it's Wikipedia page, etc." + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGMETHODDIALOG::T900713019"] = "Cancel" + +-- Failed to store the API key in the operating system. The message was: {0}. Please try again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1122745046"] = "Failed to store the API key in the operating system. The message was: {0}. Please try again." + +-- API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1324664716"] = "API Key" + +-- Create account +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1356621346"] = "Create account" + +-- Please enter an embedding model name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1661085403"] = "Please enter an embedding model name." + +-- Hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1727440780"] = "Hostname" + +-- Load +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1756340745"] = "Load" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1847791252"] = "Update" + +-- Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T1870831108"] = "Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again." + +-- Model +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2189814010"] = "Model" + +-- (Optional) API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2331453405"] = "(Optional) API Key" + +-- Currently, we cannot query the embedding models of self-hosted systems. Therefore, enter the model name manually. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2615586687"] = "Currently, we cannot query the embedding models of self-hosted systems. Therefore, enter the model name manually." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2646845972"] = "Add" + +-- No models loaded or available. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2810182573"] = "No models loaded or available." + +-- Instance Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2842060373"] = "Instance Name" + +-- Model selection +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T416738168"] = "Model selection" + +-- Host +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T808120719"] = "Host" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T900237532"] = "Provider" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T900713019"] = "Cancel" + +-- Tell the AI what you want it to do for you. What are your goals or are you trying to achieve? Like having the AI address you informally. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T1458195391"] = "Tell the AI what you want it to do for you. What are your goals or are you trying to achieve? Like having the AI address you informally." + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T1847791252"] = "Update" + +-- Tell the AI something about yourself. What is your profession? How experienced are you in this profession? Which technologies do you like? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2119274961"] = "Tell the AI something about yourself. What is your profession? How experienced are you in this profession? Which technologies do you like?" + +-- What should the AI do for you? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2261456575"] = "What should the AI do for you?" + +-- Please enter a profile name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2386844536"] = "Please enter a profile name." + +-- The text must not exceed 256 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2560188276"] = "The text must not exceed 256 characters." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T2646845972"] = "Add" + +-- The profile name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3243902394"] = "The profile name must not exceed 40 characters." + +-- The text must not exceed 444 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3253349421"] = "The text must not exceed 444 characters." + +-- Profile Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3392578705"] = "Profile Name" + +-- Please enter what the LLM should know about you and/or what actions it should take. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T3708405102"] = "Please enter what the LLM should know about you and/or what actions it should take." + +-- The name of the profile is mandatory. Each profile must have a unique name. Whether you provide information about yourself or only fill out the actions is up to you. Only one of these pieces is required. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T4061896123"] = "The name of the profile is mandatory. Each profile must have a unique name. Whether you provide information about yourself or only fill out the actions is up to you. Only one of these pieces is required." + +-- Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T4125557797"] = "Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role." + +-- What should the AI know about you? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T4227846635"] = "What should the AI know about you?" + +-- Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T56359901"] = "Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile." + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T900713019"] = "Cancel" + +-- The profile name must be unique; the chosen name is already in use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROFILEDIALOG::T911748898"] = "The profile name must be unique; the chosen name is already in use." + +-- Hugging Face Inference Provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1085481431"] = "Hugging Face Inference Provider" + +-- Failed to store the API key in the operating system. The message was: {0}. Please try again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1122745046"] = "Failed to store the API key in the operating system. The message was: {0}. Please try again." + +-- API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1324664716"] = "API Key" + +-- Create account +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1356621346"] = "Create account" + +-- Load models +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T15352225"] = "Load models" + +-- Hostname +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1727440780"] = "Hostname" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1847791252"] = "Update" + +-- Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1870831108"] = "Failed to load the API key from the operating system. The message was: {0}. You might ignore this message and provide the API key again." + +-- Please enter a model name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1936099896"] = "Please enter a model name." + +-- Model +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2189814010"] = "Model" + +-- (Optional) API Key +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2331453405"] = "(Optional) API Key" + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2646845972"] = "Add" + +-- No models loaded or available. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2810182573"] = "No models loaded or available." + +-- Instance Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2842060373"] = "Instance Name" + +-- Show available models +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3763891899"] = "Show available models" + +-- Model selection +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T416738168"] = "Model selection" + +-- Host +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T808120719"] = "Host" + +-- Provider +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T900237532"] = "Provider" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T900713019"] = "Cancel" + +-- The parameter name. It must be unique within the retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T100726215"] = "The parameter name. It must be unique within the retrieval process." + +-- New Parameter {0} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1064532992"] = "New Parameter {0}" + +-- Add Parameter +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1082847843"] = "Add Parameter" + +-- Parameter Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1093935834"] = "Parameter Description" + +-- The retrieval process name must not be empty. Please name your retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1133451355"] = "The retrieval process name must not be empty. Please name your retrieval process." + +-- The parameter name must not be empty. Please name the parameter. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1359500913"] = "The parameter name must not be empty. Please name the parameter." + +-- A short description of the parameter. What data type is it? What is it used for? What are the possible values? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1519220950"] = "A short description of the parameter. What data type is it? What is it used for? What are the possible values?" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1847791252"] = "Update" + +-- Optional. Select the embedding methods that are used for this retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1869391009"] = "Optional. Select the embedding methods that are used for this retrieval process." + +-- Retrieval Process Link +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T1936369410"] = "Retrieval Process Link" + +-- Here you can select which embedding methods are used for this retrieval process. Embeddings are optional; if your retrieval process works without embedding, you can ignore this part. You can only choose the embedding methods you have previously defined. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2076115062"] = "Here you can select which embedding methods are used for this retrieval process. Embeddings are optional; if your retrieval process works without embedding, you can ignore this part. You can only choose the embedding methods you have previously defined." + +-- The parameter description must not be empty. Please describe the parameter '{0}'. What data type is it? What is it used for? What are the possible values? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2139013415"] = "The parameter description must not be empty. Please describe the parameter '{0}'. What data type is it? What is it used for? What are the possible values?" + +-- A link to the retrieval process, e.g., the source code, the paper, it's Wikipedia page, etc. Make sense for common retrieval processes. Leave empty if not applicable. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2352603560"] = "A link to the retrieval process, e.g., the source code, the paper, it's Wikipedia page, etc. Make sense for common retrieval processes. Leave empty if not applicable." + +-- No embedding methods selected. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2508820480"] = "No embedding methods selected." + +-- Add a parameter first, then select it to edit. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2534894635"] = "Add a parameter first, then select it to edit." + +-- Add +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2646845972"] = "Add" + +-- You have selected {0} embedding methods. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T2933579640"] = "You have selected {0} embedding methods." + +-- Please provide some general information about your retrieval process first. This data may be displayed to the users. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3015844908"] = "Please provide some general information about your retrieval process first. This data may be displayed to the users." + +-- The name of your retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3207262684"] = "The name of your retrieval process." + +-- You may want to parameterize your retrieval process. However, this is optional. You can specify any parameters that can be set by the user or the system during the call. Nevertheless, you should use sensible default values in your code so that users are not forced to set the parameters manually. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3292152705"] = "You may want to parameterize your retrieval process. However, this is optional. You can specify any parameters that can be set by the user or the system during the call. Nevertheless, you should use sensible default values in your code so that users are not forced to set the parameters manually." + +-- Select a parameter to show and edit it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3300669027"] = "Select a parameter to show and edit it." + +-- The parameter name '{0}' must be unique. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3378166475"] = "The parameter name '{0}' must be unique. Please choose a different name." + +-- The retrieval process name '{0}' must be unique. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3387731069"] = "The retrieval process name '{0}' must be unique. Please choose a different name." + +-- Delete this parameter +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3464622501"] = "Delete this parameter" + +-- Retrieval Process Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3481092305"] = "Retrieval Process Name" + +-- A short description of the retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3524519535"] = "A short description of the retrieval process." + +-- Currently, you have not defined any embedding methods. If your retrieval process does not require embedding, you can ignore this part. Otherwise, you can define one or more embedding methods in the previous view to assign them to your retrieval process here. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3821108204"] = "Currently, you have not defined any embedding methods. If your retrieval process does not require embedding, you can ignore this part. Otherwise, you can define one or more embedding methods in the previous view to assign them to your retrieval process here." + +-- Retrieval Process Parameters +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T3894388618"] = "Retrieval Process Parameters" + +-- The description must not be empty. Please describe the retrieval process. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T40530321"] = "The description must not be empty. Please describe the retrieval process." + +-- Embeddings methods +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T4119328701"] = "Embeddings methods" + +-- General Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T4286878385"] = "General Information" + +-- Retrieval Process Description +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T546772364"] = "Retrieval Process Description" + +-- You have selected 1 embedding method. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T673052164"] = "You have selected 1 embedding method." + +-- The retrieval process name must not be longer than 26 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T769031589"] = "The retrieval process name must not be longer than 26 characters." + +-- Parameter Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T873729811"] = "Parameter Name" + +-- The parameter name must not be longer than 26 characters. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T898422027"] = "The parameter name must not be longer than 26 characters." + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T900713019"] = "Cancel" + +-- Embeddings +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::RETRIEVALPROCESSDIALOG::T951463987"] = "Embeddings" + +-- There is no social event +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1222800281"] = "There is no social event" + +-- Agenda options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1249372829"] = "Agenda options are preselected" + +-- Preselect a duration? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1404615656"] = "Preselect a duration?" + +-- Preselect the number of participants +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1444356399"] = "Preselect the number of participants" + +-- Meeting is virtual +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1446638309"] = "Meeting is virtual" + +-- Preselect a name? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1471770981"] = "Preselect a name?" + +-- Preselect whether participants needs to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1648427207"] = "Preselect whether participants needs to arrive and depart" + +-- Preselect a start time? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1901151023"] = "Preselect a start time?" + +-- Preselect a location? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1908318849"] = "Preselect a location?" + +-- How many participants should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1998244307"] = "How many participants should be preselected?" + +-- Preselect whether the meeting is virtual +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2084951012"] = "Preselect whether the meeting is virtual" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- When enabled, you can preselect most agenda options. This is might be useful when you need to create similar agendas often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2373110543"] = "When enabled, you can preselect most agenda options. This is might be useful when you need to create similar agendas often." + +-- Preselect whether the participants should get to know each other +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2519703500"] = "Preselect whether the participants should get to know each other" + +-- Which agenda language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2801220321"] = "Which agenda language should be preselected?" + +-- Preselect another agenda language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2915422331"] = "Preselect another agenda language" + +-- Participants do not need to get to know each other +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2949002251"] = "Participants do not need to get to know each other" + +-- There is a social event +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T296183299"] = "There is a social event" + +-- Participants should be actively involved +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T298324727"] = "Participants should be actively involved" + +-- Meeting is in person +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3008159782"] = "Meeting is in person" + +-- Participants do not need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3087504452"] = "Participants do not need to arrive and depart" + +-- Preselect whether there is a joint dinner +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3175009548"] = "Preselect whether there is a joint dinner" + +-- Preselect an objective? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3439476935"] = "Preselect an objective?" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3448155331"] = "Close" + +-- Preselect a moderator? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3482798491"] = "Preselect a moderator?" + +-- Participants need to arrive and depart +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3591032034"] = "Participants need to arrive and depart" + +-- Participants do not need to be actively involved +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3679899885"] = "Participants do not need to be actively involved" + +-- Preselect the approx. lunch time +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3709527588"] = "Preselect the approx. lunch time" + +-- Preselect a topic? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3835166371"] = "Preselect a topic?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4004501229"] = "Preselect one of your profiles?" + +-- Preselect the agenda language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4055846391"] = "Preselect the agenda language" + +-- No agenda options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4094211586"] = "No agenda options are preselected" + +-- Participants should get to know each other +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T464127805"] = "Participants should get to know each other" + +-- Assistant: Agenda Planner Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T677962779"] = "Assistant: Agenda Planner Options" + +-- There is a joint dinner +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T707310400"] = "There is a joint dinner" + +-- Preselect the approx. break time +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T722113273"] = "Preselect the approx. break time" + +-- There is no joint dinner +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T768936730"] = "There is no joint dinner" + +-- Preselect agenda options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T800921421"] = "Preselect agenda options?" + +-- Preselect whether there is a social event +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T816053055"] = "Preselect whether there is a social event" + +-- Preselect whether the participants should actively involved +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T817726429"] = "Preselect whether the participants should actively involved" + +-- Restrict to one bias a day? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1608129203"] = "Restrict to one bias a day?" + +-- Yes, you can only retrieve one bias per day +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1765683725"] = "Yes, you can only retrieve one bias per day" + +-- Reset +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T180921696"] = "Reset" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- No restriction. You can retrieve as many biases as you want per day. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2305356277"] = "No restriction. You can retrieve as many biases as you want per day." + +-- Which language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2345162613"] = "Which language should be preselected?" + +-- Reset your bias-of-the-day statistics +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2350981714"] = "Reset your bias-of-the-day statistics" + +-- Preselect another language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2382415529"] = "Preselect another language" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2571465005"] = "Preselect the language" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3448155331"] = "Close" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T354528094"] = "No options are preselected" + +-- Assistant: Bias of the Day +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T384887684"] = "Assistant: Bias of the Day" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3875604319"] = "Options are preselected" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T4004501229"] = "Preselect one of your profiles?" + +-- Are you sure you want to reset your bias-of-the-day statistics? The system will no longer remember which biases you already know. As a result, biases you are already familiar with may be addressed again. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T405627382"] = "Are you sure you want to reset your bias-of-the-day statistics? The system will no longer remember which biases you already know. As a result, biases you are already familiar with may be addressed again." + +-- Assistant: Bias of the Day Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T4235808594"] = "Assistant: Bias of the Day Options" + +-- Preselect options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T42672465"] = "Preselect options?" + +-- You have learned about {0} out of {1} biases. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T679061561"] = "You have learned about {0} out of {1} biases." + +-- When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T711745239"] = "When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model." + +-- Preselect one of your chat templates? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1402022556"] = "Preselect one of your chat templates?" + +-- Control how the LLM provider for loaded chats is selected and when assistant results are sent to chat. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T172255919"] = "Control how the LLM provider for loaded chats is selected and when assistant results are sent to chat." + +-- Chat Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1757092713"] = "Chat Options" + +-- Shortcut to send input +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1773585398"] = "Shortcut to send input" + +-- Provider selection when creating new chats +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T189306836"] = "Provider selection when creating new chats" + +-- Would you like to set one of your profiles as the default for chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1933521846"] = "Would you like to set one of your profiles as the default for chats?" + +-- Apply default data source option when sending assistant results to chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2510376349"] = "Apply default data source option when sending assistant results to chat" + +-- Control how the LLM provider for added chats is selected. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T263621180"] = "Control how the LLM provider for added chats is selected." + +-- Provider selection when loading a chat and sending assistant results to chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2868379953"] = "Provider selection when loading a chat and sending assistant results to chat" + +-- Show the latest message after loading? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2913693228"] = "Show the latest message after loading?" + +-- Do you want to use any shortcut to send your input? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2936560092"] = "Do you want to use any shortcut to send your input?" + +-- Would you like to set one of your chat templates as the default for chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3234927721"] = "Would you like to set one of your chat templates as the default for chats?" + +-- No chat options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3383186996"] = "No chat options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3448155331"] = "Close" + +-- First (oldest) message is shown, after loading a chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3507181366"] = "First (oldest) message is shown, after loading a chat" + +-- Preselect chat options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3728624759"] = "Preselect chat options?" + +-- Chat options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3730599555"] = "Chat options are preselected" + +-- Latest message is shown, after loading a chat +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3755993611"] = "Latest message is shown, after loading a chat" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T4004501229"] = "Preselect one of your profiles?" + +-- Do you want to apply the default data source options when sending assistant results to chat? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T4033153439"] = "Do you want to apply the default data source options when sending assistant results to chat?" + +-- When enabled, you can preselect chat options. This is might be useful when you prefer a specific provider. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T477675197"] = "When enabled, you can preselect chat options. This is might be useful when you prefer a specific provider." + +-- You can set default data sources and options for new chats. You can change these settings later for each individual chat. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T492357592"] = "You can set default data sources and options for new chats. You can change these settings later for each individual chat." + +-- When enabled, the latest message is shown after loading a chat. When disabled, the first (oldest) message is shown. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T582516016"] = "When enabled, the latest message is shown after loading a chat. When disabled, the first (oldest) message is shown." + +-- Customize your AI experience with chat templates. Whether you want to experiment with prompt engineering, simply use a custom system prompt in the standard chat interface, or create a specialized assistant, chat templates give you full control. Similar to common AI companies' playgrounds, you can define your own system prompts and leverage assistant prompts for providers that support them. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1172171653"] = "Customize your AI experience with chat templates. Whether you want to experiment with prompt engineering, simply use a custom system prompt in the standard chat interface, or create a specialized assistant, chat templates give you full control. Similar to common AI companies' playgrounds, you can define your own system prompts and leverage assistant prompts for providers that support them." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1469573738"] = "Delete" + +-- Add Chat Template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1548314416"] = "Add Chat Template" + +-- Note: This advanced feature is designed for users familiar with prompt engineering concepts. Furthermore, you have to make sure yourself that your chosen provider supports the use of assistant prompts. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T1909110760"] = "Note: This advanced feature is designed for users familiar with prompt engineering concepts. Furthermore, you have to make sure yourself that your chosen provider supports the use of assistant prompts." + +-- No chat templates configured yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T2319860307"] = "No chat templates configured yet." + +-- Chat Template Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T275026390"] = "Chat Template Name" + +-- Are you sure you want to delete the chat template '{0}'? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3102555824"] = "Are you sure you want to delete the chat template '{0}'?" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3267849393"] = "Edit" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3448155331"] = "Close" + +-- Edit Chat Template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3596030597"] = "Edit Chat Template" + +-- Your Chat Templates +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3824122683"] = "Your Chat Templates" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T3865031940"] = "Actions" + +-- Delete Chat Template +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHATTEMPLATE::T4025180906"] = "Delete Chat Template" + +-- Which programming language should be preselected for added contexts? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1073540083"] = "Which programming language should be preselected for added contexts?" + +-- Compiler messages are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1110902070"] = "Compiler messages are preselected" + +-- Preselect a programming language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2181567002"] = "Preselect a programming language" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- When enabled, you can preselect the coding options. This is might be useful when you prefer a specific programming language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2619641701"] = "When enabled, you can preselect the coding options. This is might be useful when you prefer a specific programming language or LLM model." + +-- Preselect coding options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2790579667"] = "Preselect coding options?" + +-- Preselect compiler messages? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2970689954"] = "Preselect compiler messages?" + +-- No coding options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3015105896"] = "No coding options are preselected" + +-- Coding options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3567850751"] = "Coding options are preselected" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4004501229"] = "Preselect one of your profiles?" + +-- Preselect another programming language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4230412334"] = "Preselect another programming language" + +-- Compiler messages are not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T516498299"] = "Compiler messages are not preselected" + +-- Assistant: Coding Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T585868261"] = "Assistant: Coding Options" + +-- You might configure different data sources. A data source can include one file, all files in a directory, or data from your company. Later, you can incorporate these data sources as needed when the AI requires this data to complete a certain task. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1084943026"] = "You might configure different data sources. A data source can include one file, all files in a directory, or data from your company. Later, you can incorporate these data sources as needed when the AI requires this data to complete a certain task." + +-- Are you sure you want to delete the data source '{0}' of type {1}? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1096979935"] = "Are you sure you want to delete the data source '{0}' of type {1}?" + +-- Edit Local Directory Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1215599168"] = "Edit Local Directory Data Source" + +-- Add Local Directory as Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1454193397"] = "Add Local Directory as Data Source" + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1469573738"] = "Delete" + +-- External (ERI) +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1652430727"] = "External (ERI)" + +-- Local File +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1687345358"] = "Local File" + +-- Delete Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T1849107431"] = "Delete Data Source" + +-- Local Directory Data Source Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2146756020"] = "Local Directory Data Source Information" + +-- Edit ERI v1 Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T221059217"] = "Edit ERI v1 Data Source" + +-- Edit Local File Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2453292893"] = "Edit Local File Data Source" + +-- ERI v1 Data Source Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T26243729"] = "ERI v1 Data Source Information" + +-- Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T266367750"] = "Name" + +-- No valid embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2698203405"] = "No valid embedding" + +-- Embedding +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2838542994"] = "Embedding" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3267849393"] = "Edit" + +-- Add Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3387511033"] = "Add Data Source" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3424652889"] = "Unknown" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3448155331"] = "Close" + +-- Add Local File as Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3500365052"] = "Add Local File as Data Source" + +-- Type +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3512062061"] = "Type" + +-- Local File Data Source Information +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3525663993"] = "Local File Data Source Information" + +-- No data sources configured yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3549650120"] = "No data sources configured yet." + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3865031940"] = "Actions" + +-- Configured Data Sources +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T543942217"] = "Configured Data Sources" + +-- Add ERI v1 Data Source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T590005498"] = "Add ERI v1 Data Source" + +-- External Data (ERI-Server v1) +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T774473996"] = "External Data (ERI-Server v1)" + +-- Local Directory +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T926703547"] = "Local Directory" + +-- When enabled, you can preselect some ERI server options. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1280666275"] = "When enabled, you can preselect some ERI server options." + +-- Preselect ERI server options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1664055662"] = "Preselect ERI server options?" + +-- No ERI server options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1793785587"] = "No ERI server options are preselected" + +-- Most ERI server options can be customized and saved directly in the ERI server assistant. For this, the ERI server assistant has an auto-save function. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2093534613"] = "Most ERI server options can be customized and saved directly in the ERI server assistant. For this, the ERI server assistant has an auto-save function." + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3448155331"] = "Close" + +-- Assistant: ERI Server Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3629372826"] = "Assistant: ERI Server Options" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T4004501229"] = "Preselect one of your profiles?" + +-- ERI server options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T488190224"] = "ERI server options are preselected" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T1462295644"] = "Preselect another target language" + +-- Preselect grammar & spell checker options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T1672258211"] = "Preselect grammar & spell checker options?" + +-- No grammar & spell checker options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T2041367384"] = "No grammar & spell checker options are preselected" + +-- When enabled, you can preselect the grammar & spell checker options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T2515603280"] = "When enabled, you can preselect the grammar & spell checker options. This is might be useful when you prefer a specific language or LLM model." + +-- Grammar & spell checker options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T2843193933"] = "Grammar & spell checker options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T3547337928"] = "Which target language should be preselected?" + +-- Assistant: Grammar & Spelling Checker Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGGRAMMARSPELLING::T886675455"] = "Assistant: Grammar & Spelling Checker Options" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T1462295644"] = "Preselect another target language" + +-- Select the language plugin used for comparision. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T1523568309"] = "Select the language plugin used for comparision." + +-- Localization options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T2246008228"] = "Localization options are preselected" + +-- Assistant: Localization +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T2573041664"] = "Assistant: Localization" + +-- Language plugin used for comparision +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T263317578"] = "Language plugin used for comparision" + +-- Preselect localization options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3080941742"] = "Preselect localization options?" + +-- No localization options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3287437171"] = "No localization options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T3547337928"] = "Which target language should be preselected?" + +-- When enabled, you can preselect the localization options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGI18N::T4022795859"] = "When enabled, you can preselect the localization options. This is might be useful when you prefer a specific language or LLM model." + +-- Preselect the icon source +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1116652851"] = "Preselect the icon source" + +-- Assistant: Icon Finder Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1570765862"] = "Assistant: Icon Finder Options" + +-- No icon options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1694910115"] = "No icon options are preselected" + +-- Icon options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T1792507476"] = "Icon options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T3448155331"] = "Close" + +-- Preselect icon options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGICONFINDER::T725252382"] = "Preselect icon options?" + +-- No job posting options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1257718691"] = "No job posting options are preselected" + +-- Preselect some mandatory information about the job posting? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1332068481"] = "Preselect some mandatory information about the job posting?" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1462295644"] = "Preselect another target language" + +-- Job posting options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1827578822"] = "Job posting options are preselected" + +-- Preselect the work location? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T1867962106"] = "Preselect the work location?" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2571465005"] = "Preselect the language" + +-- Preselect job posting options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2624983038"] = "Preselect job posting options?" + +-- Preselect the company name? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2679442990"] = "Preselect the company name?" + +-- When enabled, you can preselect some job posting options. This is might be useful when you prefer a specific LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T2907036553"] = "When enabled, you can preselect some job posting options. This is might be useful when you prefer a specific LLM model." + +-- Preselect the job qualifications? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3223375709"] = "Preselect the job qualifications?" + +-- Assistant: Job Posting Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3307661496"] = "Assistant: Job Posting Options" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3547337928"] = "Which target language should be preselected?" + +-- Preselect the job responsibilities? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3788397013"] = "Preselect the job responsibilities?" + +-- Preselect the job description? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGJOBPOSTINGS::T3825475093"] = "Preselect the job description?" + +-- Content cleaner agent is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1013787967"] = "Content cleaner agent is preselected" + +-- Web content reader is shown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1030372436"] = "Web content reader is shown" + +-- When enabled, the web content reader is preselected. This is might be useful when you prefer to load legal content from the web very often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1507288278"] = "When enabled, the web content reader is preselected. This is might be useful when you prefer to load legal content from the web very often." + +-- Preselect legal check options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1563865738"] = "Preselect legal check options?" + +-- No legal check options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1591931823"] = "No legal check options are preselected" + +-- When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1633101895"] = "When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use." + +-- Web content reader is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1701127912"] = "Web content reader is not preselected" + +-- Content cleaner agent is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1969816694"] = "Content cleaner agent is not preselected" + +-- Hide the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2090693677"] = "Hide the web content reader?" + +-- When enabled, you can preselect some legal check options. This is might be useful when you prefer a specific LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2164667361"] = "When enabled, you can preselect some legal check options. This is might be useful when you prefer a specific LLM model." + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- Legal check options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T252916114"] = "Legal check options are preselected" + +-- When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the legal content before translating it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2746583995"] = "When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the legal content before translating it." + +-- Web content reader is hidden +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2799795311"] = "Web content reader is hidden" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3448155331"] = "Close" + +-- Web content reader is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3641773985"] = "Web content reader is preselected" + +-- Preselect the content cleaner agent? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3649428096"] = "Preselect the content cleaner agent?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4004501229"] = "Preselect one of your profiles?" + +-- Assistant: Legal Check Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4033382756"] = "Assistant: Legal Check Options" + +-- Preselect the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T629158142"] = "Preselect the web content reader?" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- Which language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2345162613"] = "Which language should be preselected?" + +-- Preselect another language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2382415529"] = "Preselect another language" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2571465005"] = "Preselect the language" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3448155331"] = "Close" + +-- No options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T354528094"] = "No options are preselected" + +-- Assistant: My Tasks Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3710380967"] = "Assistant: My Tasks Options" + +-- Options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3875604319"] = "Options are preselected" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T4004501229"] = "Preselect one of your profiles?" + +-- Preselect options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T42672465"] = "Preselect options?" + +-- When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T711745239"] = "When enabled, you can preselect options. This is might be useful when you prefer a specific language or LLM model." + +-- Edit Profile +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T1143111468"] = "Edit Profile" + +-- No profiles configured yet. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T1433534732"] = "No profiles configured yet." + +-- Delete +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T1469573738"] = "Delete" + +-- Your Profiles +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T2378610256"] = "Your Profiles" + +-- Edit +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3267849393"] = "Edit" + +-- Profile Name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3392578705"] = "Profile Name" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3448155331"] = "Close" + +-- Delete Profile +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3804515427"] = "Delete Profile" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T3865031940"] = "Actions" + +-- Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T4125557797"] = "Store personal data about yourself in various profiles so that the AIs know your personal context. This saves you from having to explain your context each time, for example, in every chat. When you have different roles, you can create a profile for each role." + +-- Add Profile +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T4248067241"] = "Add Profile" + +-- Are you sure you want to delete the profile '{0}'? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T55364659"] = "Are you sure you want to delete the profile '{0}'?" + +-- Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGPROFILES::T56359901"] = "Are you a project manager in a research facility? You might want to create a profile for your project management activities, one for your scientific work, and a profile for when you need to write program code. In these profiles, you can record how much experience you have or which methods you like or dislike using. Later, you can choose when and where you want to use each profile." + +-- Which writing style should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1173034744"] = "Which writing style should be preselected?" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1462295644"] = "Preselect another target language" + +-- Preselect a sentence structure +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1621537655"] = "Preselect a sentence structure" + +-- Assistant: Rewrite & Improve Text Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1995708818"] = "Assistant: Rewrite & Improve Text Options" + +-- Which voice should be preselected for the sentence structure? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T2661599097"] = "Which voice should be preselected for the sentence structure?" + +-- Preselect a writing style +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T28456020"] = "Preselect a writing style" + +-- Rewrite & improve text options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3303192024"] = "Rewrite & improve text options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3547337928"] = "Which target language should be preselected?" + +-- When enabled, you can preselect the rewrite & improve text options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3657121735"] = "When enabled, you can preselect the rewrite & improve text options. This is might be useful when you prefer a specific language or LLM model." + +-- Preselect rewrite & improve text options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3745021518"] = "Preselect rewrite & improve text options?" + +-- No rewrite & improve text options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T553954963"] = "No rewrite & improve text options are preselected" + +-- When enabled, you can preselect synonym options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T183953912"] = "When enabled, you can preselect synonym options. This is might be useful when you prefer a specific language or LLM model." + +-- No synonym options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2183758387"] = "No synonym options are preselected" + +-- Which language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2345162613"] = "Which language should be preselected?" + +-- Preselect another language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2382415529"] = "Preselect another language" + +-- Synonym options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2390458990"] = "Synonym options are preselected" + +-- Preselect the language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T2571465005"] = "Preselect the language" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T3448155331"] = "Close" + +-- Assistant: Synonyms Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T3889117881"] = "Assistant: Synonyms Options" + +-- Preselect synonym options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSYNONYMS::T4170921846"] = "Preselect synonym options?" + +-- Content cleaner agent is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1013787967"] = "Content cleaner agent is preselected" + +-- Web content reader is shown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1030372436"] = "Web content reader is shown" + +-- Preselect the summarizer complexity +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T104409170"] = "Preselect the summarizer complexity" + +-- Preselect summarizer options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T108151178"] = "Preselect summarizer options?" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1462295644"] = "Preselect another target language" + +-- When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1633101895"] = "When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use." + +-- Web content reader is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1701127912"] = "Web content reader is not preselected" + +-- Assistant: Text Summarizer Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1767527569"] = "Assistant: Text Summarizer Options" + +-- Content cleaner agent is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T1969816694"] = "Content cleaner agent is not preselected" + +-- Hide the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T2090693677"] = "Hide the web content reader?" + +-- Summarizer options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T2355441996"] = "Summarizer options are preselected" + +-- Web content reader is hidden +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T2799795311"] = "Web content reader is hidden" + +-- No summarizer options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3215334223"] = "No summarizer options are preselected" + +-- When enabled, the web content reader is preselected. This is might be useful when you prefer to load content from the web very often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3216157681"] = "When enabled, the web content reader is preselected. This is might be useful when you prefer to load content from the web very often." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3547337928"] = "Which target language should be preselected?" + +-- Web content reader is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3641773985"] = "Web content reader is preselected" + +-- Preselect the content cleaner agent? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3649428096"] = "Preselect the content cleaner agent?" + +-- When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the content before summarize it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3660434400"] = "When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the content before summarize it." + +-- When enabled, you can preselect the text summarizer options. This is might be useful when you prefer a specific language, complexity, or LLM. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T3820844575"] = "When enabled, you can preselect the text summarizer options. This is might be useful when you prefer a specific language, complexity, or LLM." + +-- Which summarizer complexity should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T408530182"] = "Which summarizer complexity should be preselected?" + +-- Preselect your expertise +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T51139714"] = "Preselect your expertise" + +-- Preselect the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTEXTSUMMARIZER::T629158142"] = "Preselect the web content reader?" + +-- Content cleaner agent is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1013787967"] = "Content cleaner agent is preselected" + +-- Assistant: Translator Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1016384269"] = "Assistant: Translator Options" + +-- Web content reader is shown +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1030372436"] = "Web content reader is shown" + +-- When enabled, you can preselect the translator options. This is might be useful when you prefer a specific target language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1111006275"] = "When enabled, you can preselect the translator options. This is might be useful when you prefer a specific target language or LLM model." + +-- milliseconds +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1275514075"] = "milliseconds" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1462295644"] = "Preselect another target language" + +-- When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1633101895"] = "When activated, the web content reader is hidden and cannot be used. As a result, the user interface becomes a bit easier to use." + +-- Web content reader is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1701127912"] = "Web content reader is not preselected" + +-- Live translation is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1825690873"] = "Live translation is not preselected" + +-- Content cleaner agent is not preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1969816694"] = "Content cleaner agent is not preselected" + +-- Preselect translator options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T1989346399"] = "Preselect translator options?" + +-- Hide the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2090693677"] = "Hide the web content reader?" + +-- Translator options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2234531191"] = "Translator options are preselected" + +-- Live translation is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2435743076"] = "Live translation is preselected" + +-- Web content reader is hidden +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2799795311"] = "Web content reader is hidden" + +-- No translator options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T2866358796"] = "No translator options are preselected" + +-- When enabled, the web content reader is preselected. This is might be useful when you prefer to load content from the web very often. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3216157681"] = "When enabled, the web content reader is preselected. This is might be useful when you prefer to load content from the web very often." + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3547337928"] = "Which target language should be preselected?" + +-- Web content reader is preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3641773985"] = "Web content reader is preselected" + +-- Preselect the content cleaner agent? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T3649428096"] = "Preselect the content cleaner agent?" + +-- Preselect the web content reader? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T629158142"] = "Preselect the web content reader?" + +-- How fast should the live translation react? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T884246296"] = "How fast should the live translation react?" + +-- When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the content before translating it. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T894123480"] = "When enabled, the content cleaner agent is preselected. This is might be useful when you prefer to clean up the content before translating it." + +-- Preselect live translation? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGTRANSLATION::T918172772"] = "Preselect live translation?" + +-- If and when should we delete your disappearing chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T1014418451"] = "If and when should we delete your disappearing chats?" + +-- Workspace display behavior +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T2151409362"] = "Workspace display behavior" + +-- Workspace behavior +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T2562846516"] = "Workspace behavior" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T3448155331"] = "Close" + +-- How should we display your workspaces? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T3566924898"] = "How should we display your workspaces?" + +-- Should we store your chats? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T3942969162"] = "Should we store your chats?" + +-- Your Workspaces Configuration +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T404802870"] = "Your Workspaces Configuration" + +-- Workspace maintenance +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWORKSPACES::T49653413"] = "Workspace maintenance" + +-- Which writing style should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1173034744"] = "Which writing style should be preselected?" + +-- Preselect a greeting? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1254399201"] = "Preselect a greeting?" + +-- Preselect the target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1417990312"] = "Preselect the target language" + +-- Preselect another target language +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1462295644"] = "Preselect another target language" + +-- Assistant: Writing E-Mails Options +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2021226503"] = "Assistant: Writing E-Mails Options" + +-- When enabled, you can preselect the e-mail options. This is might be useful when you prefer a specific language or LLM model. +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2116404483"] = "When enabled, you can preselect the e-mail options. This is might be useful when you prefer a specific language or LLM model." + +-- Preselect your name for the closing salutation? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T221974240"] = "Preselect your name for the closing salutation?" + +-- Would you like to preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2221665527"] = "Would you like to preselect one of your profiles?" + +-- Preselect a writing style +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T28456020"] = "Preselect a writing style" + +-- E-Mail options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2985974420"] = "E-Mail options are preselected" + +-- No e-mail options are preselected +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3047605763"] = "No e-mail options are preselected" + +-- Close +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3448155331"] = "Close" + +-- Which target language should be preselected? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3547337928"] = "Which target language should be preselected?" + +-- Preselect e-mail options? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3832719342"] = "Preselect e-mail options?" + +-- Preselect one of your profiles? +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T4004501229"] = "Preselect one of your profiles?" + +-- Chat name +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T1746586282"] = "Chat name" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SINGLEINPUTDIALOG::T900713019"] = "Cancel" + +-- Install now +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T2366359512"] = "Install now" + +-- Update from v{0} to v{1} +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T25417398"] = "Update from v{0} to v{1}" + +-- Install later +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::UPDATEDIALOG::T2936430090"] = "Install later" + +-- Cancel +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::WORKSPACESELECTIONDIALOG::T900713019"] = "Cancel" + +-- Settings +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1258653480"] = "Settings" + +-- Home +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1391791790"] = "Home" + +-- About +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1491113694"] = "About" + +-- Are you sure you want to leave the chat page? All unsaved changes will be lost. +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1563130494"] = "Are you sure you want to leave the chat page? All unsaved changes will be lost." + +-- Assistants +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1614176092"] = "Assistants" + +-- Update +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T1847791252"] = "Update" + +-- Leave Chat Page +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2124749705"] = "Leave Chat Page" + +-- Plugins +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2222816203"] = "Plugins" + +-- An update to version {0} is available. +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2800137365"] = "An update to version {0} is available." + +-- Please wait for the update to complete... +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2864211629"] = "Please wait for the update to complete..." + +-- Supporters +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2929332068"] = "Supporters" + +-- Writing +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T2979224202"] = "Writing" + +-- Show details +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T3692372066"] = "Show details" + +-- Chat +UI_TEXT_CONTENT["AISTUDIO::LAYOUT::MAINLAYOUT::T578410699"] = "Chat" + +-- Startup log file +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1019424746"] = "Startup log file" + +-- About MindWork AI Studio +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1020427799"] = "About MindWork AI Studio" + +-- Browse AI Studio's source code on GitHub — we welcome your contributions. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1107156991"] = "Browse AI Studio's source code on GitHub — we welcome your contributions." + +-- This library is used to read PDF files. This is necessary, e.g., for using PDFs as a data source for a chat. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1388816916"] = "This library is used to read PDF files. This is necessary, e.g., for using PDFs as a data source for a chat." + +-- This library is used to extend the MudBlazor library. It provides additional components that are not part of the MudBlazor library. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1421513382"] = "This library is used to extend the MudBlazor library. It provides additional components that are not part of the MudBlazor library." + +-- We use Lua as the language for plugins. Lua-CSharp lets Lua scripts communicate with AI Studio and vice versa. Thank you, Yusuke Nakada, for this great library. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T162898512"] = "We use Lua as the language for plugins. Lua-CSharp lets Lua scripts communicate with AI Studio and vice versa. Thank you, Yusuke Nakada, for this great library." + +-- Building on .NET, ASP.NET Core, and Blazor, MudBlazor is used as a library for designing and developing the user interface. It is a great project that significantly accelerates the development of advanced user interfaces with Blazor. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1629800076"] = "Building on .NET, ASP.NET Core, and Blazor, MudBlazor is used as a library for designing and developing the user interface. It is a great project that significantly accelerates the development of advanced user interfaces with Blazor." + +-- AI Studio creates a log file at startup, in which events during startup are recorded. After startup, another log file is created that records all events that occur during the use of the app. This includes any errors that may occur. Depending on when an error occurs (at startup or during use), the contents of these log files can be helpful for troubleshooting. Sensitive information such as passwords is not included in the log files. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1630237140"] = "AI Studio creates a log file at startup, in which events during startup are recorded. After startup, another log file is created that records all events that occur during the use of the app. This includes any errors that may occur. Depending on when an error occurs (at startup or during use), the contents of these log files can be helpful for troubleshooting. Sensitive information such as passwords is not included in the log files." + +-- This library is used to display the differences between two texts. This is necessary, e.g., for the grammar and spelling assistant. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1772678682"] = "This library is used to display the differences between two texts. This is necessary, e.g., for the grammar and spelling assistant." + +-- By clicking on the respective path, the path is copied to the clipboard. You might open these files with a text editor to view their contents. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1806897624"] = "By clicking on the respective path, the path is copied to the clipboard. You might open these files with a text editor to view their contents." + +-- Check for updates +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1890416390"] = "Check for updates" + +-- Vision +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1892426825"] = "Vision" + +-- This library is used to convert HTML to Markdown. This is necessary, e.g., when you provide a URL as input for an assistant. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1924365263"] = "This library is used to convert HTML to Markdown. This is necessary, e.g., when you provide a URL as input for an assistant." + +-- We use Rocket to implement the runtime API. This is necessary because the runtime must be able to communicate with the user interface (IPC). Rocket is a great framework for implementing web APIs in Rust. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T1943216839"] = "We use Rocket to implement the runtime API. This is necessary because the runtime must be able to communicate with the user interface (IPC). Rocket is a great framework for implementing web APIs in Rust." + +-- This library is used to determine the file type of a file. This is necessary, e.g., when we want to stream a file. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2173617769"] = "This library is used to determine the file type of a file. This is necessary, e.g., when we want to stream a file." + +-- For the secure communication between the user interface and the runtime, we need to create certificates. This Rust library is great for this purpose. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2174764529"] = "For the secure communication between the user interface and the runtime, we need to create certificates. This Rust library is great for this purpose." + +-- We must generate random numbers, e.g., for securing the interprocess communication between the user interface and the runtime. The rand library is great for this purpose. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2273492381"] = "We must generate random numbers, e.g., for securing the interprocess communication between the user interface and the runtime. The rand library is great for this purpose." + +-- In order to use any LLM, each user must store their so-called token for each LLM provider. This token must be kept secure, similar to a password. The safest way to do this is offered by operating systems like macOS, Windows, and Linux: They have mechanisms to store such data, if available, on special security hardware. Since this is currently not possible in .NET, we use this Rust library. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T228561878"] = "In order to use any LLM, each user must store their so-called token for each LLM provider. This token must be kept secure, similar to a password. The safest way to do this is offered by operating systems like macOS, Windows, and Linux: They have mechanisms to store such data, if available, on special security hardware. Since this is currently not possible in .NET, we use this Rust library." + +-- The C# language is used for the implementation of the user interface and the backend. To implement the user interface with C#, the Blazor technology from ASP.NET Core is used. All these technologies are integrated into the .NET SDK. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2329884315"] = "The C# language is used for the implementation of the user interface and the backend. To implement the user interface with C#, the Blazor technology from ASP.NET Core is used. All these technologies are integrated into the .NET SDK." + +-- Used PDFium version +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2368247719"] = "Used PDFium version" + +-- This library is used to determine the language of the operating system. This is necessary to set the language of the user interface. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2557014401"] = "This library is used to determine the language of the operating system. This is necessary to set the language of the user interface." + +-- Used Open Source Projects +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2557066213"] = "Used Open Source Projects" + +-- Build time +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T260228112"] = "Build time" + +-- To be able to use the responses of the LLM in other apps, we often use the clipboard of the respective operating system. Unfortunately, in .NET there is no solution that works with all operating systems. Therefore, I have opted for this library in Rust. This way, data transfer to other apps works on every system. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2644379659"] = "To be able to use the responses of the LLM in other apps, we often use the clipboard of the respective operating system. Unfortunately, in .NET there is no solution that works with all operating systems. Therefore, I have opted for this library in Rust. This way, data transfer to other apps works on every system." + +-- Usage log file +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2689995864"] = "Usage log file" + +-- Logbook +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2706940196"] = "Logbook" + +-- This component is used to render Markdown text. This is important because the LLM often responds with Markdown-formatted text, allowing us to present it in a way that is easier to read. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2726131107"] = "This component is used to render Markdown text. This is important because the LLM often responds with Markdown-formatted text, allowing us to present it in a way that is easier to read." + +-- Code in the Rust language can be specified as synchronous or asynchronous. Unlike .NET and the C# language, Rust cannot execute asynchronous code by itself. Rust requires support in the form of an executor for this. Tokio is one such executor. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2777988282"] = "Code in the Rust language can be specified as synchronous or asynchronous. Unlike .NET and the C# language, Rust cannot execute asynchronous code by itself. Rust requires support in the form of an executor for this. Tokio is one such executor." + +-- View our project roadmap and help shape AI Studio's future development. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2829971158"] = "View our project roadmap and help shape AI Studio's future development." + +-- Used .NET runtime +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2840227993"] = "Used .NET runtime" + +-- Explanation +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2840582448"] = "Explanation" + +-- The .NET backend cannot be started as a desktop app. Therefore, I use a second backend in Rust, which I call runtime. With Rust as the runtime, Tauri can be used to realize a typical desktop app. Thanks to Rust, this app can be offered for Windows, macOS, and Linux desktops. Rust is a great language for developing safe and high-performance software. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T2868174483"] = "The .NET backend cannot be started as a desktop app. Therefore, I use a second backend in Rust, which I call runtime. With Rust as the runtime, Tauri can be used to realize a typical desktop app. Thanks to Rust, this app can be offered for Windows, macOS, and Linux desktops. Rust is a great language for developing safe and high-performance software." + +-- Changelog +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3017574265"] = "Changelog" + +-- Connect AI Studio to your organization's data with our External Retrieval Interface (ERI). +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T313276297"] = "Connect AI Studio to your organization's data with our External Retrieval Interface (ERI)." + +-- Have feature ideas? Submit suggestions for future AI Studio enhancements. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3178730036"] = "Have feature ideas? Submit suggestions for future AI Studio enhancements." + +-- Discover MindWork AI's mission and vision on our official homepage. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3294830584"] = "Discover MindWork AI's mission and vision on our official homepage." + +-- User-language provided by the OS +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3334355246"] = "User-language provided by the OS" + +-- The following list shows the versions of the MindWork AI Studio, the used compilers, build time, etc.: +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3405978777"] = "The following list shows the versions of the MindWork AI Studio, the used compilers, build time, etc.:" + +-- Used Rust compiler +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3440211747"] = "Used Rust compiler" + +-- Tauri is used to host the Blazor user interface. It is a great project that allows the creation of desktop applications using web technologies. I love Tauri! +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3494984593"] = "Tauri is used to host the Blazor user interface. It is a great project that allows the creation of desktop applications using web technologies. I love Tauri!" + +-- Motivation +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3563271893"] = "Motivation" + +-- This library is used to read Excel and OpenDocument spreadsheet files. This is necessary, e.g., for using spreadsheets as a data source for a chat. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3722989559"] = "This library is used to read Excel and OpenDocument spreadsheet files. This is necessary, e.g., for using spreadsheets as a data source for a chat." + +-- Now we have multiple systems, some developed in .NET and others in Rust. The data format JSON is responsible for translating data between both worlds (called data serialization and deserialization). Serde takes on this task in the Rust world. The counterpart in the .NET world is an integral part of .NET and is located in System.Text.Json. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T3908558992"] = "Now we have multiple systems, some developed in .NET and others in Rust. The data format JSON is responsible for translating data between both worlds (called data serialization and deserialization). Serde takes on this task in the Rust world. The counterpart in the .NET world is an integral part of .NET and is located in System.Text.Json." + +-- Versions +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4010195468"] = "Versions" + +-- This library is used to create asynchronous streams in Rust. It allows us to work with streams of data that can be produced asynchronously, making it easier to handle events or data that arrive over time. We use this, e.g., to stream arbitrary data from the file system to the embedding system. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4079152443"] = "This library is used to create asynchronous streams in Rust. It allows us to work with streams of data that can be produced asynchronously, making it easier to handle events or data that arrive over time. We use this, e.g., to stream arbitrary data from the file system to the embedding system." + +-- Community & Code +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4158546761"] = "Community & Code" + +-- We use the HtmlAgilityPack to extract content from the web. This is necessary, e.g., when you provide a URL as input for an assistant. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4184485147"] = "We use the HtmlAgilityPack to extract content from the web. This is necessary, e.g., when you provide a URL as input for an assistant." + +-- When transferring sensitive data between Rust runtime and .NET app, we encrypt the data. We use some libraries from the Rust Crypto project for this purpose: cipher, aes, cbc, pbkdf2, hmac, and sha2. We are thankful for the great work of the Rust Crypto project. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T4229014037"] = "When transferring sensitive data between Rust runtime and .NET app, we encrypt the data. We use some libraries from the Rust Crypto project for this purpose: cipher, aes, cbc, pbkdf2, hmac, and sha2. We are thankful for the great work of the Rust Crypto project." + +-- This is a library providing the foundations for asynchronous programming in Rust. It includes key trait definitions like Stream, as well as utilities like join!, select!, and various futures combinator methods which enable expressive asynchronous control flow. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T566998575"] = "This is a library providing the foundations for asynchronous programming in Rust. It includes key trait definitions like Stream, as well as utilities like join!, select!, and various futures combinator methods which enable expressive asynchronous control flow." + +-- Used .NET SDK +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T585329785"] = "Used .NET SDK" + +-- Did you find a bug or are you experiencing issues? Report your concern here. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T639371534"] = "Did you find a bug or are you experiencing issues? Report your concern here." + +-- This Rust library is used to output the app's messages to the terminal. This is helpful during development and troubleshooting. This feature is initially invisible; when the app is started via the terminal, the messages become visible. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T64689067"] = "This Rust library is used to output the app's messages to the terminal. This is helpful during development and troubleshooting. This feature is initially invisible; when the app is started via the terminal, the messages become visible." + +-- For some data transfers, we need to encode the data in base64. This Rust library is great for this purpose. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ABOUT::T870640199"] = "For some data transfers, we need to encode the data in base64. This Rust library is great for this purpose." + +-- Get coding and debugging support from an LLM. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1243850917"] = "Get coding and debugging support from an LLM." + +-- Business +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T131837803"] = "Business" + +-- Legal Check +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1348190638"] = "Legal Check" + +-- General +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1432485131"] = "General" + +-- Grammar & Spelling +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1514925962"] = "Grammar & Spelling" + +-- Assistants +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1614176092"] = "Assistants" + +-- Coding +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1617786407"] = "Coding" + +-- Analyze a text or an email for tasks you need to complete. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1728590051"] = "Analyze a text or an email for tasks you need to complete." + +-- Text Summarizer +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1907192403"] = "Text Summarizer" + +-- Check grammar and spelling of a given text. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1934717573"] = "Check grammar and spelling of a given text." + +-- Translate text into another language. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T209791153"] = "Translate text into another language." + +-- Generate an e-mail for a given context. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2383649630"] = "Generate an e-mail for a given context." + +-- Generate an agenda for a given meeting, seminar, etc. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2406168562"] = "Generate an agenda for a given meeting, seminar, etc." + +-- Agenda Planner +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2435638853"] = "Agenda Planner" + +-- Synonyms +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2547582747"] = "Synonyms" + +-- Find synonyms for a given word or phrase. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2712131461"] = "Find synonyms for a given word or phrase." + +-- AI Studio Development +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2830810750"] = "AI Studio Development" + +-- Generate a job posting for a given job description. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T2831103254"] = "Generate a job posting for a given job description." + +-- My Tasks +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3011450657"] = "My Tasks" + +-- E-Mail +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3026443472"] = "E-Mail" + +-- Translate AI Studio text content into other languages +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3181803840"] = "Translate AI Studio text content into other languages" + +-- Software Engineering +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3260960011"] = "Software Engineering" + +-- Rewrite & Improve +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3309133329"] = "Rewrite & Improve" + +-- Icon Finder +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3693102312"] = "Icon Finder" + +-- Generate an ERI server to integrate business systems. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3756213118"] = "Generate an ERI server to integrate business systems." + +-- Use an LLM to find an icon for a given context. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3881504200"] = "Use an LLM to find an icon for a given context." + +-- Job Posting +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3930052338"] = "Job Posting" + +-- Ask a question about a legal document. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3970214537"] = "Ask a question about a legal document." + +-- ERI Server +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T4204533420"] = "ERI Server" + +-- Use an LLM to summarize a given text. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T502222021"] = "Use an LLM to summarize a given text." + +-- Translation +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T613888204"] = "Translation" + +-- Rewrite and improve a given text for a chosen style. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T722167136"] = "Rewrite and improve a given text for a chosen style." + +-- Learning +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T755590027"] = "Learning" + +-- Bias of the Day +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T782102948"] = "Bias of the Day" + +-- Learn about one cognitive bias every day. +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T878695986"] = "Learn about one cognitive bias every day." + +-- Localization +UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T897888480"] = "Localization" + +-- Hide your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2351468526"] = "Hide your workspaces" + +-- Open Chat Options +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2813205227"] = "Open Chat Options" + +-- Disappearing Chat +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T3046519404"] = "Disappearing Chat" + +-- Configure your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T3586092784"] = "Configure your workspaces" + +-- Your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T3745240468"] = "Your workspaces" + +-- Open Workspaces Configuration +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T383344787"] = "Open Workspaces Configuration" + +-- Show the chat options +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T4132756393"] = "Show the chat options" + +-- Chat in Workspace +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T582100343"] = "Chat in Workspace" + +-- Show your workspaces +UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T733672375"] = "Show your workspaces" + +-- Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1009708591"] = "Unlike services like ChatGPT, which impose limits after intensive use, MindWork AI Studio offers unlimited usage through the providers API." + +-- Welcome to MindWork AI Studio! +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1024253064"] = "Welcome to MindWork AI Studio!" + +-- Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1146553980"] = "Thank you for considering MindWork AI Studio for your AI needs. This app is designed to help you harness the power of Large Language Models (LLMs). Please note that this app doesn't come with an integrated LLM. Instead, you will need to bring an API key from a suitable provider." + +-- The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T144565305"] = "The app requires minimal storage for installation and operates with low memory usage. Additionally, it has a minimal impact on system resources, which is beneficial for battery life." + +-- You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T149711988"] = "You only pay for what you use, which can be cheaper than monthly subscription services like ChatGPT Plus, especially if used infrequently. But beware, here be dragons: For extremely intensive usage, the API costs can be significantly higher. Unfortunately, providers currently do not offer a way to display current costs in the app. Therefore, check your account with the respective provider to see how your costs are developing. When available, use prepaid and set a cost limit." + +-- Assistants +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1614176092"] = "Assistants" + +-- Unrestricted usage +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1686815996"] = "Unrestricted usage" + +-- Introduction +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1702902297"] = "Introduction" + +-- Vision +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1892426825"] = "Vision" + +-- You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT4o, o1, etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), Hugging Face, and self-hosted models using llama.cpp, ollama, LM Studio, Groq, or Fireworks. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2217921237"] = "You are not tied to any single provider. Instead, you might choose the provider that best suits your needs. Right now, we support OpenAI (GPT4o, o1, etc.), Mistral, Anthropic (Claude), Google Gemini, xAI (Grok), DeepSeek, Alibaba Cloud (Qwen), Hugging Face, and self-hosted models using llama.cpp, ollama, LM Studio, Groq, or Fireworks. For scientists and employees of research institutions, we also support Helmholtz and GWDG AI services. These are available through federated logins like eduGAIN to all 18 Helmholtz Centers, the Max Planck Society, most German, and many international universities." + +-- Let's get started +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2331588413"] = "Let's get started" + +-- Last Changelog +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2348849647"] = "Last Changelog" + +-- Choose the provider and model best suited for your current task. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T2588488920"] = "Choose the provider and model best suited for your current task." + +-- Quick Start Guide +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3002014720"] = "Quick Start Guide" + +-- You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3228075421"] = "You just want to quickly translate a text? AI Studio has so-called assistants for such and other tasks. No prompting is necessary when working with these assistants." + +-- We hope you enjoy using MindWork AI Studio to bring your AI projects to life! +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3275341342"] = "We hope you enjoy using MindWork AI Studio to bring your AI projects to life!" + +-- Cost-effective +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3341379752"] = "Cost-effective" + +-- Flexibility +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3723223888"] = "Flexibility" + +-- Privacy +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T3959064551"] = "Privacy" + +-- You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T457410099"] = "You can control which providers receive your data using the provider confidence settings. For example, you can set different protection levels for writing emails compared to general chats, etc. Additionally, most providers guarantee that they won't use your data to train new AI systems." + +-- Free of charge +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T617579208"] = "Free of charge" + +-- Independence +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T649448159"] = "Independence" + +-- No bloatware +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T858047957"] = "No bloatware" + +-- Here's what makes MindWork AI Studio stand out: +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T873851215"] = "Here's what makes MindWork AI Studio stand out:" + +-- The app is free to use, both for personal and commercial purposes. +UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T91074375"] = "The app is free to use, both for personal and commercial purposes." + +-- Disable plugin +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T1430375822"] = "Disable plugin" + +-- Internal Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T158493184"] = "Internal Plugins" + +-- Disabled Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T1724138133"] = "Disabled Plugins" + +-- Enable plugin +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T2057806005"] = "Enable plugin" + +-- Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T2222816203"] = "Plugins" + +-- Enabled Plugins +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T2738444034"] = "Enabled Plugins" + +-- Actions +UI_TEXT_CONTENT["AISTUDIO::PAGES::PLUGINS::T3865031940"] = "Actions" + +-- Settings +UI_TEXT_CONTENT["AISTUDIO::PAGES::SETTINGS::T1258653480"] = "Settings" + +-- Thank you for being the first to contribute a one-time donation. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1470916504"] = "Thank you for being the first to contribute a one-time donation." + +-- Thank you, Peer, for your courage in being the second person to support the project financially. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1714878838"] = "Thank you, Peer, for your courage in being the second person to support the project financially." + +-- Individual Contributors +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T1874835680"] = "Individual Contributors" + +-- Thanks, Nils, for taking the time to learn Rust and build the foundation for local retrieval. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2355807535"] = "Thanks, Nils, for taking the time to learn Rust and build the foundation for local retrieval." + +-- The first 10 supporters who make a one-time contribution: +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2410456125"] = "The first 10 supporters who make a one-time contribution:" + +-- We would like to thank the DLR for its courage in supporting MindWork AI Studio at an early stage. The DLR not only uses AI Studio in various projects but also supports its further development with personnel resources. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2438064678"] = "We would like to thank the DLR for its courage in supporting MindWork AI Studio at an early stage. The DLR not only uses AI Studio in various projects but also supports its further development with personnel resources." + +-- Become one of our titans +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2640760894"] = "Become one of our titans" + +-- Supporters +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T2929332068"] = "Supporters" + +-- Content Contributors +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3060804484"] = "Content Contributors" + +-- Financial Support +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3061261435"] = "Financial Support" + +-- German Aerospace Center (DLR) +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3264998714"] = "German Aerospace Center (DLR)" + +-- The first 10 supporters who make a monthly contribution: +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3364384944"] = "The first 10 supporters who make a monthly contribution:" + +-- Thank you, Richard, for being the first. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3660718138"] = "Thank you, Richard, for being the first." + +-- Thanks Dominic for being the third supporter. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3664780201"] = "Thanks Dominic for being the third supporter." + +-- Our Titans +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3805270964"] = "Our Titans" + +-- Moderation, Design, Wiki, and Documentation +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T3821668394"] = "Moderation, Design, Wiki, and Documentation" + +-- Thank you, Peer, for familiarizing yourself with C#, providing excellent contributions like the Alibaba and Hugging Face providers, and revising the settings management. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4106820759"] = "Thank you, Peer, for familiarizing yourself with C#, providing excellent contributions like the Alibaba and Hugging Face providers, and revising the settings management." + +-- Code Contributions +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4135925647"] = "Code Contributions" + +-- Become a contributor +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T414604046"] = "Become a contributor" + +-- In this section, we highlight the titan supporters of MindWork AI Studio. Titans are prestigious companies that provide significant support to our mission. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T4270177642"] = "In this section, we highlight the titan supporters of MindWork AI Studio. Titans are prestigious companies that provide significant support to our mission." + +-- Thanks Luc for your build script contribution. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T432023389"] = "Thanks Luc for your build script contribution." + +-- For companies, sponsoring MindWork AI Studio is not only a way to support innovation but also a valuable opportunity for public relations and marketing. Your company's name and logo will be featured prominently, showcasing your commitment to using cutting-edge AI tools and enhancing your reputation as an innovative enterprise. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T68519158"] = "For companies, sponsoring MindWork AI Studio is not only a way to support innovation but also a valuable opportunity for public relations and marketing. Your company's name and logo will be featured prominently, showcasing your commitment to using cutting-edge AI tools and enhancing your reputation as an innovative enterprise." + +-- Thanks for your build script contribution. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T686206269"] = "Thanks for your build script contribution." + +-- Business Contributors +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T838479287"] = "Business Contributors" + +-- Thank you very much, Kerstin, for taking care of creating the Wiki. +UI_TEXT_CONTENT["AISTUDIO::PAGES::SUPPORTERS::T991294232"] = "Thank you very much, Kerstin, for taking care of creating the Wiki." + +-- Write your text +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T2220943334"] = "Write your text" + +-- Writer +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T2979224202"] = "Writer" + +-- Suggestion +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T3948127789"] = "Suggestion" + +-- Your stage directions +UI_TEXT_CONTENT["AISTUDIO::PAGES::WRITER::T779923726"] = "Your stage directions" + +-- Tried to communicate with the LLM provider '{0}'. The API key might be invalid. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1073493061"] = "Tried to communicate with the LLM provider '{0}'. The API key might be invalid. The provider message is: '{1}'" + +-- Tried to stream the LLM provider '{0}' answer. There were some problems with the stream. The message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1487597412"] = "Tried to stream the LLM provider '{0}' answer. There were some problems with the stream. The message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. The required message format might be changed. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1674355816"] = "Tried to communicate with the LLM provider '{0}'. The required message format might be changed. The provider message is: '{1}'" + +-- Tried to stream the LLM provider '{0}' answer. Was not able to read the stream. The message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T1856278860"] = "Tried to stream the LLM provider '{0}' answer. Was not able to read the stream. The message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. Even after {1} retries, there were some problems with the request. The provider message is: '{2}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T2249520705"] = "Tried to communicate with the LLM provider '{0}'. Even after {1} retries, there were some problems with the request. The provider message is: '{2}'" + +-- Tried to communicate with the LLM provider '{0}'. Something was not found. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T2780552614"] = "Tried to communicate with the LLM provider '{0}'. Something was not found. The provider message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. There were some problems with the request. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T3573577433"] = "Tried to communicate with the LLM provider '{0}'. There were some problems with the request. The provider message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. The server might be down or having issues. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T3806716694"] = "Tried to communicate with the LLM provider '{0}'. The server might be down or having issues. The provider message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. The provider is overloaded. The message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T4179546180"] = "Tried to communicate with the LLM provider '{0}'. The provider is overloaded. The message is: '{1}'" + +-- Tried to communicate with the LLM provider '{0}'. You might not be able to use this provider from your location. The provider message is: '{1}' +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::BASEPROVIDER::T862369179"] = "Tried to communicate with the LLM provider '{0}'. You might not be able to use this provider from your location. The provider message is: '{1}'" + +-- The trust level of this provider **has not yet** been thoroughly **investigated and evaluated**. We do not know if your data is safe. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T1014558951"] = "The trust level of this provider **has not yet** been thoroughly **investigated and evaluated**. We do not know if your data is safe." + +-- You or your organization operate the LLM locally or within your trusted network. In terms of data processing and security, this is the best possible way. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T2124364471"] = "You or your organization operate the LLM locally or within your trusted network. In terms of data processing and security, this is the best possible way." + +-- The provider is located in the EU and is subject to the **GDPR** (General Data Protection Regulation). Additionally, the provider states that **your data is not used for training**. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3010553924"] = "The provider is located in the EU and is subject to the **GDPR** (General Data Protection Regulation). Additionally, the provider states that **your data is not used for training**." + +-- No provider selected. Please select a provider to get see its confidence level. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3368531176"] = "No provider selected. Please select a provider to get see its confidence level." + +-- The provider operates its service from the USA and is subject to **US jurisdiction**. In case of suspicion, authorities in the USA can access your data. However, **your data is not used for training** purposes. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3528165925"] = "The provider operates its service from the USA and is subject to **US jurisdiction**. In case of suspicion, authorities in the USA can access your data. However, **your data is not used for training** purposes." + +-- The provider operates its service from the USA and is subject to **U.S. jurisdiction**. In case of suspicion, authorities in the USA can access your data. Please inform yourself about the use of your data. We do not know if your data is safe. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T3788466789"] = "The provider operates its service from the USA and is subject to **U.S. jurisdiction**. In case of suspicion, authorities in the USA can access your data. Please inform yourself about the use of your data. We do not know if your data is safe." + +-- The provider operates its service from China. In case of suspicion, authorities in the respective countries of operation may access your data. However, **your data is not used for training** purposes. +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCE::T991875725"] = "The provider operates its service from China. In case of suspicion, authorities in the respective countries of operation may access your data. However, **your data is not used for training** purposes." + +-- Medium +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T163471254"] = "Medium" + +-- Moderate +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T177463328"] = "Moderate" + +-- Unknown confidence level +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T1811522309"] = "Unknown confidence level" + +-- No provider selected +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T2897045472"] = "No provider selected" + +-- Low +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T2984088865"] = "Low" + +-- Untrusted +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T3063224793"] = "Untrusted" + +-- High +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T3188327965"] = "High" + +-- Very Low +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::CONFIDENCELEVELEXTENSIONS::T786675843"] = "Very Low" + +-- Self-hosted +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::LLMPROVIDERSEXTENSIONS::T146444217"] = "Self-hosted" + +-- No provider selected +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::LLMPROVIDERSEXTENSIONS::T2897045472"] = "No provider selected" + +-- Unknown +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::LLMPROVIDERSEXTENSIONS::T3424652889"] = "Unknown" + +-- no model selected +UI_TEXT_CONTENT["AISTUDIO::PROVIDER::MODEL::T2234274832"] = "no model selected" + +-- Use no chat template +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CHATTEMPLATE::T4258819635"] = "Use no chat template" + +-- Navigation never expands, but there are tooltips +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1095779033"] = "Navigation never expands, but there are tooltips" + +-- Check every day +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1112287590"] = "Check every day" + +-- Toggle the overlay: the chat uses all the space, workspaces are temporarily shown +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1114668646"] = "Toggle the overlay: the chat uses all the space, workspaces are temporarily shown" + +-- Sidebar is always visible: show the workspaces next to the chat all the time +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1149606444"] = "Sidebar is always visible: show the workspaces next to the chat all the time" + +-- Always use the default chat provider when loading chats +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1188453609"] = "Always use the default chat provider when loading chats" + +-- Show also prototype features: these are works in progress; expect bugs and missing features +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1245257804"] = "Show also prototype features: these are works in progress; expect bugs and missing features" + +-- No key is sending the input; you have to click the send button +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1311973034"] = "No key is sending the input; you have to click the send button" + +-- Navigation never expands, no tooltips; there are only icons +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1402851833"] = "Navigation never expands, no tooltips; there are only icons" + +-- Store chats automatically +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1664293672"] = "Store chats automatically" + +-- Once at startup +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T184455356"] = "Once at startup" + +-- No automatic update checks +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1874928511"] = "No automatic update checks" + +-- Always expand navigation +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1991359958"] = "Always expand navigation" + +-- Show also experimental features: these are experimental; expect bugs, missing features, many changes +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2091731959"] = "Show also experimental features: these are experimental; expect bugs, missing features, many changes" + +-- Use the latest LLM provider, which was used before; use the default chat provider initially +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2128088682"] = "Use the latest LLM provider, which was used before; use the default chat provider initially" + +-- Navigation expands on mouse hover +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2195945406"] = "Navigation expands on mouse hover" + +-- Also show features ready for release; these should be stable +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2301448762"] = "Also show features ready for release; these should be stable" + +-- Check every week +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T238099712"] = "Check every week" + +-- Disappearing chats: delete chats older than 1 year +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2405705561"] = "Disappearing chats: delete chats older than 1 year" + +-- Store chats manually +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2520325466"] = "Store chats manually" + +-- Enter is sending the input +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2537778562"] = "Enter is sending the input" + +-- Not yet specified +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2566503670"] = "Not yet specified" + +-- No minimum confidence level chosen +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2828607242"] = "No minimum confidence level chosen" + +-- Do not specify the language +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2960082609"] = "Do not specify the language" + +-- Disappearing chats: delete chats older than 7 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2975140581"] = "Disappearing chats: delete chats older than 7 days" + +-- Always use the default chat provider for new chats +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2976921892"] = "Always use the default chat provider for new chats" + +-- Also show features in beta: these are almost ready for release; expect some bugs +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3061414822"] = "Also show features in beta: these are almost ready for release; expect some bugs" + +-- Check every hour +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3137986690"] = "Check every hour" + +-- Disappearing chats: delete chats older than 180 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3491430707"] = "Disappearing chats: delete chats older than 180 days" + +-- Disable workspaces +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3612390107"] = "Disable workspaces" + +-- Toggle the sidebar: show the workspaces on demand next to the chat +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3711207137"] = "Toggle the sidebar: show the workspaces on demand next to the chat" + +-- Also show features in alpha: these are in development; expect bugs and missing features +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4146964761"] = "Also show features in alpha: these are in development; expect bugs and missing features" + +-- All preview features are hidden +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4289410063"] = "All preview features are hidden" + +-- When possible, use the LLM provider which was used for each chat in the first place +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T75376144"] = "When possible, use the LLM provider which was used for each chat in the first place" + +-- Disappearing chats: no automatic maintenance; old chats will never be deleted +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T803751240"] = "Disappearing chats: no automatic maintenance; old chats will never be deleted" + +-- Disappearing chats: delete chats older than 90 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T869922627"] = "Disappearing chats: delete chats older than 90 days" + +-- Modifier key + enter is sending the input +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T870850829"] = "Modifier key + enter is sending the input" + +-- Disappearing chats: delete chats older than 30 days +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T937754037"] = "Disappearing chats: delete chats older than 30 days" + +-- This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T1531417967"] = "This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider." + +-- This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T3187068849"] = "This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider." + +-- Please select a security policy +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T3511915070"] = "Please select a security policy" + +-- The security of the data source is not specified yet. You cannot use this data source until you specify a security policy. +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T4056804813"] = "The security of the data source is not specified yet. You cannot use this data source until you specify a security policy." + +-- Unknown security policy +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCESECURITYEXTENSIONS::T4277536697"] = "Unknown security policy" + +-- Local File +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T1687345358"] = "Local File" + +-- External ERI Server (v1) +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T3020093889"] = "External ERI Server (v1)" + +-- No data source +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T810547195"] = "No data source" + +-- Local Directory +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::DATASOURCETYPEEXTENSION::T926703547"] = "Local Directory" + +-- Unknown option +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::LANGBEHAVIOREXTENSIONS::T3964902774"] = "Unknown option" + +-- Choose the language manually +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::LANGBEHAVIOREXTENSIONS::T3988034966"] = "Choose the language manually" + +-- Choose the language automatically, based on your system language +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::LANGBEHAVIOREXTENSIONS::T485389934"] = "Choose the language automatically, based on your system language" + +-- Writer Mode: Experiments about how to write long texts using AI +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T158702544"] = "Writer Mode: Experiments about how to write long texts using AI" + +-- Read PDF: Preview of our PDF reading system where you can read and extract text from PDF files +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T1847148141"] = "Read PDF: Preview of our PDF reading system where you can read and extract text from PDF files" + +-- Plugins: Preview of our plugin system where you can extend the functionality of the app +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T2056842933"] = "Plugins: Preview of our plugin system where you can extend the functionality of the app" + +-- RAG: Preview of our RAG implementation where you can refer your files or integrate enterprise data within your company +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T2708939138"] = "RAG: Preview of our RAG implementation where you can refer your files or integrate enterprise data within your company" + +-- Unknown preview feature +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::PREVIEWFEATURESEXTENSIONS::T2722827307"] = "Unknown preview feature" + +-- Use no data sources, when sending an assistant result to a chat +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::SENDTOCHATDATASOURCEBEHAVIOREXTENSIONS::T1223925477"] = "Use no data sources, when sending an assistant result to a chat" + +-- Unknown behavior +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::SENDTOCHATDATASOURCEBEHAVIOREXTENSIONS::T1394162669"] = "Unknown behavior" + +-- Apply standard chat data source options, when sending an assistant result to a chat +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::SENDTOCHATDATASOURCEBEHAVIOREXTENSIONS::T2129722199"] = "Apply standard chat data source options, when sending an assistant result to a chat" + +-- Always use dark theme +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T197192304"] = "Always use dark theme" + +-- Synchronized with the operating system settings +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T1987547483"] = "Synchronized with the operating system settings" + +-- Unknown setting +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T4107955313"] = "Unknown setting" + +-- Always use light theme +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::DATAMODEL::THEMESEXTENSIONS::T534715610"] = "Always use light theme" + +-- Use no profile +UI_TEXT_CONTENT["AISTUDIO::SETTINGS::PROFILE::T2205839602"] = "Use no profile" + +-- SSO (Kerberos) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T268552140"] = "SSO (Kerberos)" + +-- Access Token +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T2891154022"] = "Access Token" + +-- Unknown authentication method +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T3296465240"] = "Unknown authentication method" + +-- No authentication +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T810547195"] = "No authentication" + +-- Username & Password +UI_TEXT_CONTENT["AISTUDIO::TOOLS::AUTHMETHODSV1EXTENSIONS::T863358904"] = "Username & Password" + +-- Spanish (Spain) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1269145091"] = "Spanish (Spain)" + +-- German (Germany) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T133055431"] = "German (Germany)" + +-- Other +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1849229205"] = "Other" + +-- German (Switzerland) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1914931075"] = "German (Switzerland)" + +-- German (Austria) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T1992157553"] = "German (Austria)" + +-- Japanese (Japan) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2064802889"] = "Japanese (Japan)" + +-- French (France) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2496010681"] = "French (France)" + +-- Please select the target language +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2536245199"] = "Please select the target language" + +-- Do not specify the language +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T2960082609"] = "Do not specify the language" + +-- Hindi (India) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3245596873"] = "Hindi (India)" + +-- Chinese (Simplified) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3441562249"] = "Chinese (Simplified)" + +-- English (US) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3729684486"] = "English (US)" + +-- English (UK) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T3730964414"] = "English (UK)" + +-- Russian (Russia) +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T4187368718"] = "Russian (Russia)" + +-- Do not change the language +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMMONLANGUAGEEXTENSIONS::T658789330"] = "Do not change the language" + +-- Coding Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1082499335"] = "Coding Assistant" + +-- E-Mail Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1185802704"] = "E-Mail Assistant" + +-- My Tasks Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1546040625"] = "My Tasks Assistant" + +-- Grammar & Spelling Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T166453786"] = "Grammar & Spelling Assistant" + +-- Legal Check Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1886447798"] = "Legal Check Assistant" + +-- Job Posting Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2212811874"] = "Job Posting Assistant" + +-- Icon Finder Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2457005512"] = "Icon Finder Assistant" + +-- Text Summarizer Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2684676843"] = "Text Summarizer Assistant" + +-- Synonym Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T2921123194"] = "Synonym Assistant" + +-- Translation Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T3887962308"] = "Translation Assistant" + +-- Agenda Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T4034795997"] = "Agenda Assistant" + +-- ERI Server +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T4204533420"] = "ERI Server" + +-- Rewrite Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T4262148639"] = "Rewrite Assistant" + +-- Localization Assistant +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T446674624"] = "Localization Assistant" + +-- New Chat +UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T826248509"] = "New Chat" + +-- Trust LLM providers from the USA +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T1748300640"] = "Trust LLM providers from the USA" + +-- Configure your own confidence scheme +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T2017415465"] = "Configure your own confidence scheme" + +-- Trust LLM providers from the USA and Europe +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T2498514901"] = "Trust LLM providers from the USA and Europe" + +-- Unknown confidence scheme +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T292756058"] = "Unknown confidence scheme" + +-- Trust LLM providers from Asia +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T3016210842"] = "Trust LLM providers from Asia" + +-- Trust LLM providers from Europe +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T357239630"] = "Trust LLM providers from Europe" + +-- Trust only self-hosted providers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T3893997203"] = "Trust only self-hosted providers" + +-- Trust all LLM providers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T4107860491"] = "Trust all LLM providers" + +-- The related data is not allowed to be sent to any LLM provider. This means that this data source cannot be used at the moment. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T1555790630"] = "The related data is not allowed to be sent to any LLM provider. This means that this data source cannot be used at the moment." + +-- The related data can be sent to any provider, regardless of where it is hosted (cloud or self-hosted). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T2031831095"] = "The related data can be sent to any provider, regardless of where it is hosted (cloud or self-hosted)." + +-- The related data can be sent to a provider that is hosted by the same organization, either on-premises or locally. Cloud-based providers are not allowed. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T2943101676"] = "The related data can be sent to a provider that is hosted by the same organization, either on-premises or locally. Cloud-based providers are not allowed." + +-- Unknown configuration. This data source cannot be used at the moment. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::DATAMODEL::PROVIDERTYPEEXTENSIONS::T647911863"] = "Unknown configuration. This data source cannot be used at the moment." + +-- Failed to execute the retrieval request: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1270753490"] = "Failed to execute the retrieval request: the request was canceled either by the user or due to a timeout." + +-- Failed to retrieve the embedding information: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1368217771"] = "Failed to retrieve the embedding information: the ERI server did not return a valid response." + +-- Failed to retrieve the password. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1460025425"] = "Failed to retrieve the password." + +-- Failed to authenticate with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1741376192"] = "Failed to authenticate with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to retrieve the security requirements: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1931074357"] = "Failed to retrieve the security requirements: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to execute the retrieval request due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1951868505"] = "Failed to execute the retrieval request due to an exception: {0}" + +-- Failed to execute the retrieval request: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T1978354870"] = "Failed to execute the retrieval request: the ERI server did not return a valid response." + +-- Failed to retrieve the security requirements: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T231684456"] = "Failed to retrieve the security requirements: the ERI server did not return a valid response." + +-- Failed to authenticate with the server: the response was invalid. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2332248448"] = "Failed to authenticate with the server: the response was invalid." + +-- Failed to retrieve the embedding information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2368384424"] = "Failed to retrieve the embedding information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to retrieve the authentication methods: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2482165925"] = "Failed to retrieve the authentication methods: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- The authentication method is not supported yet. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2536034936"] = "The authentication method is not supported yet." + +-- Failed to authenticate with the ERI server: the response was invalid. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2549452166"] = "Failed to authenticate with the ERI server: the response was invalid." + +-- Failed to retrieve the retrieval information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2558778293"] = "Failed to retrieve the retrieval information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to authenticate with the ERI server: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2673501628"] = "Failed to authenticate with the ERI server: the request was canceled either by the user or due to a timeout." + +-- Failed to authenticate with the ERI server due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T2858189239"] = "Failed to authenticate with the ERI server due to an exception: {0}" + +-- Failed to retrieve the security requirements: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T286437836"] = "Failed to retrieve the security requirements: the request was canceled either by the user or due to a timeout." + +-- Failed to retrieve the security requirements due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3221004295"] = "Failed to retrieve the security requirements due to an exception: {0}" + +-- Failed to retrieve the data source information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3290521480"] = "Failed to retrieve the data source information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to retrieve the data source information due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3354496288"] = "Failed to retrieve the data source information due to an exception: {0}" + +-- Failed to retrieve the authentication methods due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3366487415"] = "Failed to retrieve the authentication methods due to an exception: {0}" + +-- Failed to retrieve the authentication methods: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3654094460"] = "Failed to retrieve the authentication methods: the request was canceled either by the user or due to a timeout." + +-- Failed to retrieve the retrieval information: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3721797352"] = "Failed to retrieve the retrieval information: the ERI server did not return a valid response." + +-- Failed to retrieve the retrieval information: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3809548876"] = "Failed to retrieve the retrieval information: the request was canceled either by the user or due to a timeout." + +-- Failed to retrieve the retrieval information due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T3862033799"] = "Failed to retrieve the retrieval information due to an exception: {0}" + +-- Failed to retrieve the data source information: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T4006612619"] = "Failed to retrieve the data source information: the ERI server did not return a valid response." + +-- Failed to retrieve the embedding information: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T469891013"] = "Failed to retrieve the embedding information: the request was canceled either by the user or due to a timeout." + +-- Failed to execute the retrieval request: there was an issue communicating with the ERI server. Code: {0}, Reason: {1} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T615338311"] = "Failed to execute the retrieval request: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}" + +-- Failed to retrieve the data source information: the request was canceled either by the user or due to a timeout. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T690733413"] = "Failed to retrieve the data source information: the request was canceled either by the user or due to a timeout." + +-- Failed to retrieve the embedding information due to an exception: {0} +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T765050112"] = "Failed to retrieve the embedding information due to an exception: {0}" + +-- Failed to retrieve the access token. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T816853779"] = "Failed to retrieve the access token." + +-- Failed to retrieve the authentication methods: the ERI server did not return a valid response. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::ERICLIENT::ERICLIENTV1::T984407320"] = "Failed to retrieve the authentication methods: the ERI server did not return a valid response." + +-- The table AUTHORS does not exist or is using an invalid syntax. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1068328139"] = "The table AUTHORS does not exist or is using an invalid syntax." + +-- The field NAME does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1340447036"] = "The field NAME does not exist or is not a valid string." + +-- The field SOURCE_URL does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1421846488"] = "The field SOURCE_URL does not exist or is not a valid string." + +-- The field VERSION does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T148801541"] = "The field VERSION does not exist or is not a valid string." + +-- The table CATEGORIES does not exist or is using an invalid syntax. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1505723383"] = "The table CATEGORIES does not exist or is using an invalid syntax." + +-- The table TARGET_GROUPS is empty or is not a valid table of strings. Valid target groups are: {0}. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1619769690"] = "The table TARGET_GROUPS is empty or is not a valid table of strings. Valid target groups are: {0}." + +-- The field ID is empty. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T1733171739"] = "The field ID is empty. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)." + +-- The field VERSION is empty. The version number must be formatted as string in the major.minor.patch format (X.X.X). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2115845776"] = "The field VERSION is empty. The version number must be formatted as string in the major.minor.patch format (X.X.X)." + +-- The field ID does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2203072274"] = "The field ID does not exist or is not a valid string." + +-- The field DESCRIPTION is empty. The description must be a non-empty string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2262604281"] = "The field DESCRIPTION is empty. The description must be a non-empty string." + +-- The field DESCRIPTION does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T229488255"] = "The field DESCRIPTION does not exist or is not a valid string." + +-- The field SOURCE_URL is not a valid URL. The URL must start with 'http://' or 'https://'. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2320984047"] = "The field SOURCE_URL is not a valid URL. The URL must start with 'http://' or 'https://'." + +-- The field VERSION is not a valid version number. The version number must be formatted as string in the major.minor.patch format (X.X.X). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2538827536"] = "The field VERSION is not a valid version number. The version number must be formatted as string in the major.minor.patch format (X.X.X)." + +-- The table AUTHORS is empty. At least one author must be specified. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T2981832540"] = "The table AUTHORS is empty. At least one author must be specified." + +-- The field SUPPORT_CONTACT is empty. The support contact must be a non-empty string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3524814526"] = "The field SUPPORT_CONTACT is empty. The support contact must be a non-empty string." + +-- The UI_TEXT_CONTENT table does not exist or is not a valid table. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3667396132"] = "The UI_TEXT_CONTENT table does not exist or is not a valid table." + +-- The field NAME is empty. The name must be a non-empty string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3763759727"] = "The field NAME is empty. The name must be a non-empty string." + +-- The field DEPRECATION_MESSAGE does not exist, is not a valid string. This message is optional: use an empty string to indicate that the plugin is not deprecated. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T3890922974"] = "The field DEPRECATION_MESSAGE does not exist, is not a valid string. This message is optional: use an empty string to indicate that the plugin is not deprecated." + +-- The field SUPPORT_CONTACT does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T4189964941"] = "The field SUPPORT_CONTACT does not exist or is not a valid string." + +-- The table TARGET_GROUPS does not exist or is using an invalid syntax. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T447530369"] = "The table TARGET_GROUPS does not exist or is using an invalid syntax." + +-- The field ID is not a valid GUID / UUID. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX). +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T471697173"] = "The field ID is not a valid GUID / UUID. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)." + +-- The table CATEGORIES is empty. At least one category is necessary. Valid categories are: {0}. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T529114360"] = "The table CATEGORIES is empty. At least one category is necessary. Valid categories are: {0}." + +-- The field IS_MAINTAINED does not exist or is not a valid boolean. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINBASE::T773237915"] = "The field IS_MAINTAINED does not exist or is not a valid boolean." + +-- Writing +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1011777007"] = "Writing" + +-- Software Development +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1025369409"] = "Software Development" + +-- Business +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T131837803"] = "Business" + +-- Music +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1481252212"] = "Music" + +-- Unknown plugin category +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1585885320"] = "Unknown plugin category" + +-- Weather +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T1726658099"] = "Weather" + +-- Industry +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T208409567"] = "Industry" + +-- Art +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2449163306"] = "Art" + +-- Sports +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2465108186"] = "Sports" + +-- Technology +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2499534031"] = "Technology" + +-- Health +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2556511663"] = "Health" + +-- Utility +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2587055103"] = "Utility" + +-- Shopping +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2704337693"] = "Shopping" + +-- Fitness +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T2892517655"] = "Fitness" + +-- Food +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3179069417"] = "Food" + +-- Gaming +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3246118672"] = "Gaming" + +-- News +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3421767782"] = "News" + +-- Entertainment +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T3562575449"] = "Entertainment" + +-- Education +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T379048501"] = "Education" + +-- AI Studio Core +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T4005865962"] = "AI Studio Core" + +-- Social +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T4177547506"] = "Social" + +-- Political +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T4245273692"] = "Political" + +-- Fiction +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T616807299"] = "Fiction" + +-- Travel +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T745861401"] = "Travel" + +-- None +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T810547195"] = "None" + +-- Party +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T850565431"] = "Party" + +-- Science +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T904504157"] = "Science" + +-- Content Creation +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINCATEGORYEXTENSIONS::T914642375"] = "Content Creation" + +-- The field IETF_TAG does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T1796010240"] = "The field IETF_TAG does not exist or is not a valid string." + +-- The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T3376221777"] = "The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code." + +-- The field IETF_TAG is empty. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T3877047896"] = "The field IETF_TAG is empty. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code." + +-- The field LANG_NAME is empty. Use a valid language name. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T4112586014"] = "The field LANG_NAME is empty. Use a valid language name." + +-- The field LANG_NAME does not exist or is not a valid string. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINLANGUAGE::T4204700759"] = "The field LANG_NAME does not exist or is not a valid string." + +-- Artists +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T1142248183"] = "Artists" + +-- Children +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T188567026"] = "Children" + +-- Industrial workers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T2520336817"] = "Industrial workers" + +-- Students +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T2905889225"] = "Students" + +-- Scientists +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T332785734"] = "Scientists" + +-- Adults +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3335941460"] = "Adults" + +-- No target group +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3644477204"] = "No target group" + +-- Business professionals +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3670621687"] = "Business professionals" + +-- Teenagers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3696960735"] = "Teenagers" + +-- Unknown target group +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T384321997"] = "Unknown target group" + +-- Office workers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T3873911022"] = "Office workers" + +-- Teachers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T48460338"] = "Teachers" + +-- Everyone +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T622959000"] = "Everyone" + +-- Software developers +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTARGETGROUPEXTENSIONS::T831424531"] = "Software developers" + +-- Theme plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T1682350097"] = "Theme plugin" + +-- Unknown plugin type +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T2313808600"] = "Unknown plugin type" + +-- Assistant plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T2321563994"] = "Assistant plugin" + +-- Language plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T2370593926"] = "Language plugin" + +-- Configuration plugin +UI_TEXT_CONTENT["AISTUDIO::TOOLS::PLUGINSYSTEM::PLUGINTYPEEXTENSIONS::T3353383632"] = "Configuration plugin" + +-- Standard augmentation process +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::AUGMENTATIONPROCESSES::AUGMENTATIONONE::T1072508429"] = "Standard augmentation process" + +-- This is the standard augmentation process, which uses all retrieval contexts to augment the chat thread. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::AUGMENTATIONPROCESSES::AUGMENTATIONONE::T3240406069"] = "This is the standard augmentation process, which uses all retrieval contexts to augment the chat thread." + +-- Automatic AI data source selection with heuristik source reduction +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::DATASOURCESELECTIONPROCESSES::AGENTICSRCSELWITHDYNHEUR::T2339257645"] = "Automatic AI data source selection with heuristik source reduction" + +-- Automatically selects the appropriate data sources based on the last prompt. Applies a heuristic reduction at the end to reduce the number of data sources. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::DATASOURCESELECTIONPROCESSES::AGENTICSRCSELWITHDYNHEUR::T648937779"] = "Automatically selects the appropriate data sources based on the last prompt. Applies a heuristic reduction at the end to reduce the number of data sources." + +-- This RAG process filters data sources, automatically selects appropriate sources, optionally allows manual source selection, retrieves data, and automatically validates the retrieval context. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T3047786484"] = "This RAG process filters data sources, automatically selects appropriate sources, optionally allows manual source selection, retrieves data, and automatically validates the retrieval context." + +-- AI-based data source selection with AI retrieval context validation +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T3775725978"] = "AI-based data source selection with AI retrieval context validation" + +-- PDF Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T3108466742"] = "PDF Files" + +-- All Image Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T4086723714"] = "All Image Files" + +-- Text Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T639143005"] = "Text Files" + +-- All Office Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T709668067"] = "All Office Files" + +-- Failed to delete the API key due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::APIKEYS::T3658273365"] = "Failed to delete the API key due to an API issue." + +-- Failed to get the API key due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::APIKEYS::T3875720022"] = "Failed to get the API key due to an API issue." + +-- Successfully copied the text to your clipboard +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::CLIPBOARD::T3351807428"] = "Successfully copied the text to your clipboard" + +-- Failed to copy the text to your clipboard. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::CLIPBOARD::T3724548108"] = "Failed to copy the text to your clipboard." + +-- Failed to delete the secret data due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::SECRETS::T2303057928"] = "Failed to delete the secret data due to an API issue." + +-- Failed to get the secret data due to an API issue. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::RUSTSERVICE::SECRETS::T4007657575"] = "Failed to get the secret data due to an API issue." + +-- No update found. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::UPDATESERVICE::T1015418291"] = "No update found." + +-- The hostname is not a valid HTTP(S) URL. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1013354736"] = "The hostname is not a valid HTTP(S) URL." + +-- The connection test failed. Please check the connection settings. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T132896331"] = "The connection test failed. Please check the connection settings." + +-- Please select an embedding provider. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1461238528"] = "Please select an embedding provider." + +-- The file does not exist. Please select a valid file. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T148464502"] = "The file does not exist. Please select a valid file." + +-- Please select one retrieval process. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1515898234"] = "Please select one retrieval process." + +-- This data source can only be used with a self-hosted LLM provider. Please change the security policy. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1728967730"] = "This data source can only be used with a self-hosted LLM provider. Please change the security policy." + +-- The username must not be empty. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1829419906"] = "The username must not be empty." + +-- The hostname must start with either http:// or https:// +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T193387467"] = "The hostname must start with either http:// or https://" + +-- Please enter a hostname, e.g., http://localhost +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T1990396672"] = "Please enter a hostname, e.g., http://localhost" + +-- Please select one valid authentication method. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T2025964684"] = "Please select one valid authentication method." + +-- The name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T2160507967"] = "The name must not exceed 40 characters." + +-- Please select your security policy. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T2250909198"] = "Please select your security policy." + +-- Please test the connection before saving. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T285470497"] = "Please test the connection before saving." + +-- Please enter your secure access token. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3086932434"] = "Please enter your secure access token." + +-- The path does not exist. Please select a valid directory. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3146272446"] = "The path does not exist. Please select a valid directory." + +-- The path must not be empty. Please select a directory. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3202118305"] = "The path must not be empty. Please select a directory." + +-- The name must not be empty. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3243861903"] = "The name must not be empty." + +-- Please enter your password. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3888492477"] = "Please enter your password." + +-- The port must be between 1 and 65535. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T3965971107"] = "The port must be between 1 and 65535." + +-- The name is already used by another data source. Please choose a different name. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T4001510395"] = "The name is already used by another data source. Please choose a different name." + +-- Please acknowledge that you are aware of the cloud embedding implications. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T490875633"] = "Please acknowledge that you are aware of the cloud embedding implications." + +-- The file path must not be empty. Please select a file. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T878007824"] = "The file path must not be empty. Please select a file." + +-- Please enter the secret necessary for authentication. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::DATASOURCEVALIDATION::T968385876"] = "Please enter the secret necessary for authentication." + +-- The hostname is not a valid HTTP(S) URL. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1013354736"] = "The hostname is not a valid HTTP(S) URL." + +-- The instance name must not exceed 40 characters. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1117188308"] = "The instance name must not exceed 40 characters." + +-- Please enter a hostname, e.g., http://localhost:1234 +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T125334762"] = "Please enter a hostname, e.g., http://localhost:1234" + +-- The instance name must be unique; the chosen name is already in use. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1301966140"] = "The instance name must be unique; the chosen name is already in use." + +-- Please select a provider. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T1809312323"] = "Please select a provider." + +-- The hostname must start with either http:// or https:// +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T193387467"] = "The hostname must start with either http:// or https://" + +-- Please select a host. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T2257097222"] = "Please select a host." + +-- Please enter an API key. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T3550629491"] = "Please enter an API key." + +-- Please enter an instance name. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T3999823516"] = "Please enter an instance name." + +-- Please select an Hugging Face inference provider. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T497939286"] = "Please select an Hugging Face inference provider." + +-- Please select a model. +UI_TEXT_CONTENT["AISTUDIO::TOOLS::VALIDATION::PROVIDERVALIDATION::T818893091"] = "Please select a model." + +-- Delete Chat +UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Delete Chat" diff --git a/app/MindWork AI Studio/Program.cs b/app/MindWork AI Studio/Program.cs index 8283a481..1630a7a7 100644 --- a/app/MindWork AI Studio/Program.cs +++ b/app/MindWork AI Studio/Program.cs @@ -25,14 +25,14 @@ internal sealed class Program public static IServiceProvider SERVICE_PROVIDER = null!; public static ILoggerFactory LOGGER_FACTORY = null!; - public static async Task Main(string[] args) + public static async Task Main() { - if(args.Length == 0) - { - Console.WriteLine("Error: Please provide the port of the runtime API."); - return; - } - + #if DEBUG + // Read the environment variables from the .env file: + var envFilePath = Path.Combine("..", "..", "startup.env"); + await EnvFile.Apply(envFilePath); + #endif + // Read the secret key for the IPC from the AI_STUDIO_SECRET_KEY environment variable: var secretPasswordEncoded = Environment.GetEnvironmentVariable("AI_STUDIO_SECRET_PASSWORD"); if(string.IsNullOrWhiteSpace(secretPasswordEncoded)) @@ -58,6 +58,13 @@ internal sealed class Program return; } + var rustApiPort = Environment.GetEnvironmentVariable("AI_STUDIO_API_PORT"); + if(string.IsNullOrWhiteSpace(rustApiPort)) + { + Console.WriteLine("Error: The AI_STUDIO_API_PORT environment variable is not set."); + return; + } + var apiToken = Environment.GetEnvironmentVariable("AI_STUDIO_API_TOKEN"); if(string.IsNullOrWhiteSpace(apiToken)) { @@ -67,7 +74,6 @@ internal sealed class Program API_TOKEN = apiToken; - var rustApiPort = args[0]; using var rust = new RustService(rustApiPort, certificateFingerprint); var appPort = await rust.GetAppPort(); if(appPort == 0) @@ -111,6 +117,7 @@ internal sealed class Program config.SnackbarConfiguration.SnackbarVariant = Variant.Outlined; }); + builder.Services.AddMemoryCache(); // Needed for the Markdown library builder.Services.AddMudMarkdownServices(); builder.Services.AddSingleton(new MudTheme()); builder.Services.AddSingleton(MessageBus.INSTANCE); @@ -130,7 +137,7 @@ internal sealed class Program .AddHubOptions(options => { options.MaximumReceiveMessageSize = null; - options.ClientTimeoutInterval = TimeSpan.FromSeconds(1_200); + options.ClientTimeoutInterval = TimeSpan.FromDays(14); options.HandshakeTimeout = TimeSpan.FromSeconds(30); }); diff --git a/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs b/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs new file mode 100644 index 00000000..fb38cc4f --- /dev/null +++ b/app/MindWork AI Studio/Provider/AlibabaCloud/ProviderAlibabaCloud.cs @@ -0,0 +1,242 @@ +using System.Net.Http.Headers; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.Json; + +using AIStudio.Chat; +using AIStudio.Provider.OpenAI; +using AIStudio.Settings; + +namespace AIStudio.Provider.AlibabaCloud; + +public sealed class ProviderAlibabaCloud(ILogger logger) : BaseProvider("https://dashscope-intl.aliyuncs.com/compatible-mode/v1/", logger) +{ + + #region Implementation of IProvider + + /// + public override string Id => LLMProviders.ALIBABA_CLOUD.ToName(); + + /// + public override string InstanceName { get; set; } = "AlibabaCloud"; + + /// + public override async IAsyncEnumerable StreamChatCompletion(Model chatModel, ChatThread chatThread, SettingsManager settingsManager, [EnumeratorCancellation] CancellationToken token = default) + { + // Get the API key: + var requestedSecret = await RUST_SERVICE.GetAPIKey(this); + if(!requestedSecret.Success) + yield break; + + // Prepare the system prompt: + var systemPrompt = new Message + { + Role = "system", + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + }; + + // Prepare the AlibabaCloud HTTP chat request: + var alibabaCloudChatRequest = JsonSerializer.Serialize(new ChatRequest + { + Model = chatModel.Id, + + // Build the messages: + // - First of all the system prompt + // - Then none-empty user and AI messages + Messages = [systemPrompt, ..chatThread.Blocks.Where(n => n.ContentType is ContentType.TEXT && !string.IsNullOrWhiteSpace((n.Content as ContentText)?.Text)).Select(n => new Message + { + Role = n.Role switch + { + ChatRole.USER => "user", + ChatRole.AI => "assistant", + ChatRole.AGENT => "assistant", + ChatRole.SYSTEM => "system", + + _ => "user", + }, + + Content = n.Content switch + { + ContentText text => text.Text, + _ => string.Empty, + } + }).ToList()], + Stream = true, + }, JSON_SERIALIZER_OPTIONS); + + async Task RequestBuilder() + { + // Build the HTTP post request: + var request = new HttpRequestMessage(HttpMethod.Post, "chat/completions"); + + // Set the authorization header: + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await requestedSecret.Secret.Decrypt(ENCRYPTION)); + + // Set the content: + request.Content = new StringContent(alibabaCloudChatRequest, Encoding.UTF8, "application/json"); + return request; + } + + await foreach (var content in this.StreamChatCompletionInternal("AlibabaCloud", RequestBuilder, token)) + yield return content; + } + + #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + /// + public override async IAsyncEnumerable StreamImageCompletion(Model imageModel, string promptPositive, string promptNegative = FilterOperator.String.Empty, ImageURL referenceImageURL = default, [EnumeratorCancellation] CancellationToken token = default) + { + yield break; + } + #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + + /// + public override Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + var additionalModels = new[] + { + new Model("qwq-plus", "QwQ plus"), // reasoning model + new Model("qwen-max-latest", "Qwen-Max (Latest)"), + new Model("qwen-plus-latest", "Qwen-Plus (Latest)"), + new Model("qwen-turbo-latest", "Qwen-Turbo (Latest)"), + new Model("qvq-max", "QVQ Max"), // visual reasoning model + new Model("qvq-max-latest", "QVQ Max (Latest)"), // visual reasoning model + new Model("qwen-vl-max", "Qwen-VL Max"), // text generation model that can understand and process images + new Model("qwen-vl-plus", "Qwen-VL Plus"), // text generation model that can understand and process images + new Model("qwen-mt-plus", "Qwen-MT Plus"), // machine translation + new Model("qwen-mt-turbo", "Qwen-MT Turbo"), // machine translation + + //Open source + new Model("qwen2.5-14b-instruct-1m", "Qwen2.5 14b 1m context"), + new Model("qwen2.5-7b-instruct-1m", "Qwen2.5 7b 1m context"), + new Model("qwen2.5-72b-instruct", "Qwen2.5 72b"), + new Model("qwen2.5-32b-instruct", "Qwen2.5 32b"), + new Model("qwen2.5-14b-instruct", "Qwen2.5 14b"), + new Model("qwen2.5-7b-instruct", "Qwen2.5 7b"), + new Model("qwen2.5-omni-7b", "Qwen2.5-Omni 7b"), // omni-modal understanding and generation model + new Model("qwen2.5-vl-72b-instruct", "Qwen2.5-VL 72b"), + new Model("qwen2.5-vl-32b-instruct", "Qwen2.5-VL 32b"), + new Model("qwen2.5-vl-7b-instruct", "Qwen2.5-VL 7b"), + new Model("qwen2.5-vl-3b-instruct", "Qwen2.5-VL 3b"), + }; + + return this.LoadModels(["q"],token, apiKeyProvisional).ContinueWith(t => t.Result.Concat(additionalModels).OrderBy(x => x.Id).AsEnumerable(), token); + } + + /// + public override Task> GetImageModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + return Task.FromResult(Enumerable.Empty()); + } + + /// + public override Task> GetEmbeddingModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + + var additionalModels = new[] + { + new Model("text-embedding-v3", "text-embedding-v3"), + }; + + return this.LoadModels(["text-embedding-"], token, apiKeyProvisional).ContinueWith(t => t.Result.Concat(additionalModels).OrderBy(x => x.Id).AsEnumerable(), token); + } + + /// + public override IReadOnlyCollection GetModelCapabilities(Model model) + { + var modelName = model.Id.ToLowerInvariant().AsSpan(); + + // Qwen models: + if (modelName.StartsWith("qwen")) + { + // Check for omni models: + if (modelName.IndexOf("omni") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.AUDIO_INPUT, Capability.SPEECH_INPUT, + Capability.VIDEO_INPUT, + + Capability.TEXT_OUTPUT, Capability.SPEECH_OUTPUT + ]; + + // Check for Qwen 3: + if(modelName.StartsWith("qwen3")) + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + + Capability.OPTIONAL_REASONING, Capability.FUNCTION_CALLING + ]; + + if(modelName.IndexOf("-vl-") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + ]; + } + + // QwQ models: + if (modelName.StartsWith("qwq")) + { + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + + Capability.ALWAYS_REASONING, Capability.FUNCTION_CALLING + ]; + } + + // QVQ models: + if (modelName.StartsWith("qvq")) + { + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.ALWAYS_REASONING + ]; + } + + // Default to text input and output: + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING + ]; + } + + #endregion + + private async Task> LoadModels(string[] prefixes, CancellationToken token, string? apiKeyProvisional = null) + { + var secretKey = apiKeyProvisional switch + { + not null => apiKeyProvisional, + _ => await RUST_SERVICE.GetAPIKey(this) switch + { + { Success: true } result => await result.Secret.Decrypt(ENCRYPTION), + _ => null, + } + }; + + if (secretKey is null) + return []; + + using var request = new HttpRequestMessage(HttpMethod.Get, "models"); + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secretKey); + + using var response = await this.httpClient.SendAsync(request, token); + if(!response.IsSuccessStatusCode) + return []; + + var modelResponse = await response.Content.ReadFromJsonAsync(token); + return modelResponse.Data.Where(model => prefixes.Any(prefix => model.Id.StartsWith(prefix, StringComparison.InvariantCulture))); + } + +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs b/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs index 7693d21f..7ff631fd 100644 --- a/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs +++ b/app/MindWork AI Studio/Provider/Anthropic/ProviderAnthropic.cs @@ -89,6 +89,8 @@ public sealed class ProviderAnthropic(ILogger logger) : BaseProvider("https://ap { var additionalModels = new[] { + new Model("claude-opus-4-0", "Claude Opus 4.0 (Latest)"), + new Model("claude-sonnet-4-0", "Claude Sonnet 4.0 (Latest)"), new Model("claude-3-7-sonnet-latest", "Claude 3.7 Sonnet (Latest)"), new Model("claude-3-5-sonnet-latest", "Claude 3.5 Sonnet (Latest)"), new Model("claude-3-5-haiku-latest", "Claude 3.5 Haiku (Latest)"), @@ -110,6 +112,41 @@ public sealed class ProviderAnthropic(ILogger logger) : BaseProvider("https://ap return Task.FromResult(Enumerable.Empty()); } + public override IReadOnlyCollection GetModelCapabilities(Model model) + { + var modelName = model.Id.ToLowerInvariant().AsSpan(); + + // Claude 4.x models: + if(modelName.StartsWith("claude-opus-4") || modelName.StartsWith("claude-sonnet-4")) + return [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.OPTIONAL_REASONING, Capability.FUNCTION_CALLING]; + + // Claude 3.7 is able to do reasoning: + if(modelName.StartsWith("claude-3-7")) + return [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.OPTIONAL_REASONING, Capability.FUNCTION_CALLING]; + + // All other 3.x models are able to process text and images as input: + if(modelName.StartsWith("claude-3-")) + return [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING]; + + // Any other model is able to process text only: + return [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + Capability.FUNCTION_CALLING]; + } + #endregion private async Task> LoadModels(CancellationToken token, string? apiKeyProvisional = null) diff --git a/app/MindWork AI Studio/Provider/BaseProvider.cs b/app/MindWork AI Studio/Provider/BaseProvider.cs index 7b24c8bf..32c0e621 100644 --- a/app/MindWork AI Studio/Provider/BaseProvider.cs +++ b/app/MindWork AI Studio/Provider/BaseProvider.cs @@ -4,6 +4,7 @@ using System.Text.Json; using AIStudio.Chat; using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; using AIStudio.Tools.Services; namespace AIStudio.Provider; @@ -13,6 +14,8 @@ namespace AIStudio.Provider; ///
public abstract class BaseProvider : IProvider, ISecretId { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(BaseProvider).Namespace, nameof(BaseProvider)); + /// /// The HTTP client to use it for all requests. /// @@ -73,6 +76,9 @@ public abstract class BaseProvider : IProvider, ISecretId /// public abstract Task> GetEmbeddingModels(string? apiKeyProvisional = null, CancellationToken token = default); + + /// + public abstract IReadOnlyCollection GetModelCapabilities(Model model); #endregion @@ -119,7 +125,7 @@ public abstract class BaseProvider : IProvider, ISecretId if (nextResponse.StatusCode is HttpStatusCode.Forbidden) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Block, $"Tried to communicate with the LLM provider '{this.InstanceName}'. You might not be able to use this provider from your location. The provider message is: '{nextResponse.ReasonPhrase}'")); + await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Block, string.Format(TB("Tried to communicate with the LLM provider '{0}'. You might not be able to use this provider from your location. The provider message is: '{1}'"), this.InstanceName, nextResponse.ReasonPhrase))); this.logger.LogError($"Failed request with status code {nextResponse.StatusCode} (message = '{nextResponse.ReasonPhrase}')."); errorMessage = nextResponse.ReasonPhrase; break; @@ -127,7 +133,7 @@ public abstract class BaseProvider : IProvider, ISecretId if(nextResponse.StatusCode is HttpStatusCode.BadRequest) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, $"Tried to communicate with the LLM provider '{this.InstanceName}'. The required message format might be changed. The provider message is: '{nextResponse.ReasonPhrase}'")); + await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, string.Format(TB("Tried to communicate with the LLM provider '{0}'. The required message format might be changed. The provider message is: '{1}'"), this.InstanceName, nextResponse.ReasonPhrase))); this.logger.LogError($"Failed request with status code {nextResponse.StatusCode} (message = '{nextResponse.ReasonPhrase}')."); errorMessage = nextResponse.ReasonPhrase; break; @@ -135,7 +141,7 @@ public abstract class BaseProvider : IProvider, ISecretId if(nextResponse.StatusCode is HttpStatusCode.NotFound) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, $"Tried to communicate with the LLM provider '{this.InstanceName}'. Something was not found. The provider message is: '{nextResponse.ReasonPhrase}'")); + await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, string.Format(TB("Tried to communicate with the LLM provider '{0}'. Something was not found. The provider message is: '{1}'"), this.InstanceName, nextResponse.ReasonPhrase))); this.logger.LogError($"Failed request with status code {nextResponse.StatusCode} (message = '{nextResponse.ReasonPhrase}')."); errorMessage = nextResponse.ReasonPhrase; break; @@ -143,7 +149,7 @@ public abstract class BaseProvider : IProvider, ISecretId if(nextResponse.StatusCode is HttpStatusCode.Unauthorized) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Key, $"Tried to communicate with the LLM provider '{this.InstanceName}'. The API key might be invalid. The provider message is: '{nextResponse.ReasonPhrase}'")); + await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Key, string.Format(TB("Tried to communicate with the LLM provider '{0}'. The API key might be invalid. The provider message is: '{1}'"), this.InstanceName, nextResponse.ReasonPhrase))); this.logger.LogError($"Failed request with status code {nextResponse.StatusCode} (message = '{nextResponse.ReasonPhrase}')."); errorMessage = nextResponse.ReasonPhrase; break; @@ -151,7 +157,7 @@ public abstract class BaseProvider : IProvider, ISecretId if(nextResponse.StatusCode is HttpStatusCode.InternalServerError) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, $"Tried to communicate with the LLM provider '{this.InstanceName}'. The server might be down or having issues. The provider message is: '{nextResponse.ReasonPhrase}'")); + await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, string.Format(TB("Tried to communicate with the LLM provider '{0}'. The server might be down or having issues. The provider message is: '{1}'"), this.InstanceName, nextResponse.ReasonPhrase))); this.logger.LogError($"Failed request with status code {nextResponse.StatusCode} (message = '{nextResponse.ReasonPhrase}')."); errorMessage = nextResponse.ReasonPhrase; break; @@ -159,7 +165,7 @@ public abstract class BaseProvider : IProvider, ISecretId if(nextResponse.StatusCode is HttpStatusCode.ServiceUnavailable) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, $"Tried to communicate with the LLM provider '{this.InstanceName}'. The provider is overloaded. The message is: '{nextResponse.ReasonPhrase}'")); + await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, string.Format(TB("Tried to communicate with the LLM provider '{0}'. The provider is overloaded. The message is: '{1}'"), this.InstanceName, nextResponse.ReasonPhrase))); this.logger.LogError($"Failed request with status code {nextResponse.StatusCode} (message = '{nextResponse.ReasonPhrase}')."); errorMessage = nextResponse.ReasonPhrase; break; @@ -176,7 +182,7 @@ public abstract class BaseProvider : IProvider, ISecretId if(retry >= MAX_RETRIES || !string.IsNullOrWhiteSpace(errorMessage)) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, $"Tried to communicate with the LLM provider '{this.InstanceName}'. Even after {MAX_RETRIES} retries, there were some problems with the request. The provider message is: '{errorMessage}'")); + await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.CloudOff, string.Format(TB("Tried to communicate with the LLM provider '{0}'. Even after {1} retries, there were some problems with the request. The provider message is: '{2}'"), this.InstanceName, MAX_RETRIES, errorMessage))); return new HttpRateLimitedStreamResult(false, true, errorMessage ?? $"Failed after {MAX_RETRIES} retries; no provider message available", response); } @@ -204,7 +210,7 @@ public abstract class BaseProvider : IProvider, ISecretId } catch(Exception e) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Stream, $"Tried to communicate with the LLM provider '{this.InstanceName}'. There were some problems with the request. The provider message is: '{e.Message}'")); + await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Stream, string.Format(TB("Tried to communicate with the LLM provider '{0}'. There were some problems with the request. The provider message is: '{1}'"), this.InstanceName, e.Message))); this.logger.LogError($"Failed to stream chat completion from {providerName} '{this.InstanceName}': {e.Message}"); } @@ -221,7 +227,7 @@ public abstract class BaseProvider : IProvider, ISecretId } catch (Exception e) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Stream, $"Tried to stream the LLM provider '{this.InstanceName}' answer. There were some problems with the stream. The message is: '{e.Message}'")); + await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Stream, string.Format(TB("Tried to stream the LLM provider '{0}' answer. There were some problems with the stream. The message is: '{1}'"), this.InstanceName, e.Message))); this.logger.LogWarning($"Failed to read the end-of-stream state from {providerName} '{this.InstanceName}': {e.Message}"); break; } @@ -242,7 +248,7 @@ public abstract class BaseProvider : IProvider, ISecretId } catch (Exception e) { - await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Stream, $"Tried to stream the LLM provider '{this.InstanceName}' answer. Was not able to read the stream. The message is: '{e.Message}'")); + await MessageBus.INSTANCE.SendError(new(Icons.Material.Filled.Stream, string.Format(TB("Tried to stream the LLM provider '{0}' answer. Was not able to read the stream. The message is: '{1}'"), this.InstanceName, e.Message))); this.logger.LogError($"Failed to read the stream from {providerName} '{this.InstanceName}': {e.Message}"); break; } diff --git a/app/MindWork AI Studio/Provider/CapabilitiesOpenSource.cs b/app/MindWork AI Studio/Provider/CapabilitiesOpenSource.cs new file mode 100644 index 00000000..806b1d5b --- /dev/null +++ b/app/MindWork AI Studio/Provider/CapabilitiesOpenSource.cs @@ -0,0 +1,150 @@ +namespace AIStudio.Provider; + +public static class CapabilitiesOpenSource +{ + public static IReadOnlyCollection GetCapabilities(Model model) + { + var modelName = model.Id.ToLowerInvariant().AsSpan(); + + // + // Checking for names in the case of open source models is a hard task. + // Let's assume we want to check for the llama 3.1 405b model. + // + // Here is a not complete list of how providers name this model: + // - Fireworks: accounts/fireworks/models/llama-v3p1-405b-instruct + // - Hugging Face -> Nebius AI Studio: meta-llama/Meta-Llama-3.1-405B-Instruct + // - Groq: llama-3.1-405b-instruct + // - LM Studio: llama-3.1-405b-instruct + // - Helmholtz Blablador: 1 - Llama3 405 the best general model + // - GWDG: Llama 3.1 405B Instruct + // + + // + // Meta llama models: + // + if (modelName.IndexOf("llama") is not -1) + { + if (modelName.IndexOf("llama4") is not -1 || + modelName.IndexOf("llama 4") is not -1 || + modelName.IndexOf("llama-4") is not -1 || + modelName.IndexOf("llama-v4") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING, + ]; + + // The old vision models cannot do function calling: + if (modelName.IndexOf("vision") is not -1) + return [Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, Capability.TEXT_OUTPUT]; + + // + // All models >= 3.1 are able to do function calling: + // + if (modelName.IndexOf("llama3.") is not -1 || + modelName.IndexOf("llama 3.") is not -1 || + modelName.IndexOf("llama-3.") is not -1 || + modelName.IndexOf("llama-v3p") is not -1) + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING, + ]; + + // All other llama models can only do text input and output: + return [Capability.TEXT_INPUT, Capability.TEXT_OUTPUT]; + } + + // + // DeepSeek models: + // + if (modelName.IndexOf("deepseek") is not -1) + { + if(modelName.IndexOf("deepseek-r1") is not -1 || + modelName.IndexOf("deepseek r1") is not -1) + return [Capability.TEXT_INPUT, Capability.TEXT_OUTPUT, Capability.ALWAYS_REASONING]; + + return [Capability.TEXT_INPUT, Capability.TEXT_OUTPUT]; + } + + // + // Qwen models: + // + if (modelName.IndexOf("qwen") is not -1 || modelName.IndexOf("qwq") is not -1) + { + if (modelName.IndexOf("qwq") is not -1) + return [Capability.TEXT_INPUT, Capability.TEXT_OUTPUT, Capability.ALWAYS_REASONING]; + + return [Capability.TEXT_INPUT, Capability.TEXT_OUTPUT]; + } + + // + // Mistral models: + // + if (modelName.IndexOf("mistral") is not -1 || + modelName.IndexOf("pixtral") is not -1) + { + if(modelName.IndexOf("pixtral") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + Capability.FUNCTION_CALLING + ]; + + if (modelName.IndexOf("3.1") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + Capability.FUNCTION_CALLING + ]; + + // Default: + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + Capability.FUNCTION_CALLING + ]; + } + + // + // Grok models: + // + if (modelName.IndexOf("grok") is not -1) + { + if(modelName.IndexOf("-vision-") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + ]; + + if(modelName.StartsWith("grok-3-mini")) + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + + Capability.ALWAYS_REASONING, Capability.FUNCTION_CALLING, + ]; + + if(modelName.StartsWith("grok-3")) + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING, + ]; + } + + // Default: + return [Capability.TEXT_INPUT, Capability.TEXT_OUTPUT]; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/Capability.cs b/app/MindWork AI Studio/Provider/Capability.cs new file mode 100644 index 00000000..047ec67b --- /dev/null +++ b/app/MindWork AI Studio/Provider/Capability.cs @@ -0,0 +1,97 @@ +namespace AIStudio.Provider; + +/// +/// Represents the capabilities of an AI model. +/// +public enum Capability +{ + /// + /// No capabilities specified. + /// + NONE, + + /// + /// We don't know what the AI model can do. + /// + UNKNOWN, + + /// + /// The AI model can perform text input. + /// + TEXT_INPUT, + + /// + /// The AI model can perform audio input, such as music or sound. + /// + AUDIO_INPUT, + + /// + /// The AI model can perform one image input, such as one photo or drawing. + /// + SINGLE_IMAGE_INPUT, + + /// + /// The AI model can perform multiple images as input, such as multiple photos or drawings. + /// + MULTIPLE_IMAGE_INPUT, + + /// + /// The AI model can perform speech input. + /// + SPEECH_INPUT, + + /// + /// The AI model can perform video input, such as video files or streams. + /// + VIDEO_INPUT, + + /// + /// The AI model can generate text output. + /// + TEXT_OUTPUT, + + /// + /// The AI model can generate audio output, such as music or sound. + /// + AUDIO_OUTPUT, + + /// + /// The AI model can generate image output, such as photos or drawings. + /// + IMAGE_OUTPUT, + + /// + /// The AI model can generate speech output. + /// + SPEECH_OUTPUT, + + /// + /// The AI model can generate video output. + /// + VIDEO_OUTPUT, + + /// + /// The AI model can perform reasoning tasks. + /// + OPTIONAL_REASONING, + + /// + /// The AI model always performs reasoning. + /// + ALWAYS_REASONING, + + /// + /// The AI model can embed information or data. + /// + EMBEDDING, + + /// + /// The AI model can perform in real-time. + /// + REALTIME, + + /// + /// The AI model can perform function calling, such as invoking APIs or executing functions. + /// + FUNCTION_CALLING, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/Confidence.cs b/app/MindWork AI Studio/Provider/Confidence.cs index 087ac4e0..a15fd9ed 100644 --- a/app/MindWork AI Studio/Provider/Confidence.cs +++ b/app/MindWork AI Studio/Provider/Confidence.cs @@ -1,9 +1,12 @@ using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; namespace AIStudio.Provider; public sealed record Confidence { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(Confidence).Namespace, nameof(Confidence)); + public ConfidenceLevel Level { get; private init; } = ConfidenceLevel.UNKNOWN; public string Region { get; private init; } = string.Empty; @@ -29,45 +32,42 @@ public sealed record Confidence public static readonly Confidence NONE = new() { Level = ConfidenceLevel.NONE, - Description = - """ - No provider selected. Please select a provider to get see its confidence level. - """, + Description = TB("No provider selected. Please select a provider to get see its confidence level."), }; - public static readonly Confidence USA_NOT_TRUSTED = new() + public static readonly Confidence USA_HUB = new() { - Level = ConfidenceLevel.UNTRUSTED, - Description = "The provider operates its service from the USA and is subject to **U.S. jurisdiction**. In case of suspicion, authorities in the USA can access your data. The provider's terms of service state that **all your data can be used by the provider at will.**", + Level = ConfidenceLevel.UNKNOWN, + Description = TB("The provider operates its service from the USA and is subject to **U.S. jurisdiction**. In case of suspicion, authorities in the USA can access your data. Please inform yourself about the use of your data. We do not know if your data is safe."), }; public static readonly Confidence UNKNOWN = new() { Level = ConfidenceLevel.UNKNOWN, - Description = "The trust level of this provider **has not yet** been thoroughly **investigated and evaluated**. We do not know if your data is safe.", + Description = TB("The trust level of this provider **has not yet** been thoroughly **investigated and evaluated**. We do not know if your data is safe."), }; public static readonly Confidence USA_NO_TRAINING = new() { Level = ConfidenceLevel.MODERATE, - Description = "The provider operates its service from the USA and is subject to **US jurisdiction**. In case of suspicion, authorities in the USA can access your data. However, **your data is not used for training** purposes.", + Description = TB("The provider operates its service from the USA and is subject to **US jurisdiction**. In case of suspicion, authorities in the USA can access your data. However, **your data is not used for training** purposes."), }; public static readonly Confidence CHINA_NO_TRAINING = new() { Level = ConfidenceLevel.MODERATE, - Description = "The provider operates its service from China. In case of suspicion, authorities in the respective countries of operation may access your data. However, **your data is not used for training** purposes.", + Description = TB("The provider operates its service from China. In case of suspicion, authorities in the respective countries of operation may access your data. However, **your data is not used for training** purposes."), }; public static readonly Confidence GDPR_NO_TRAINING = new() { Level = ConfidenceLevel.MEDIUM, - Description = "The provider is located in the EU and is subject to the **GDPR** (General Data Protection Regulation). Additionally, the provider states that **your data is not used for training**.", + Description = TB("The provider is located in the EU and is subject to the **GDPR** (General Data Protection Regulation). Additionally, the provider states that **your data is not used for training**."), }; public static readonly Confidence SELF_HOSTED = new() { Level = ConfidenceLevel.HIGH, - Description = "You or your organization operate the LLM locally or within your trusted network. In terms of data processing and security, this is the best possible way.", + Description = TB("You or your organization operate the LLM locally or within your trusted network. In terms of data processing and security, this is the best possible way."), }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs b/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs index 116238fe..915b37cf 100644 --- a/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs +++ b/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs @@ -1,21 +1,24 @@ using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; namespace AIStudio.Provider; public static class ConfidenceLevelExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ConfidenceLevelExtensions).Namespace, nameof(ConfidenceLevelExtensions)); + public static string GetName(this ConfidenceLevel level) => level switch { - ConfidenceLevel.NONE => "No provider selected", + ConfidenceLevel.NONE => TB("No provider selected"), - ConfidenceLevel.UNTRUSTED => "Untrusted", - ConfidenceLevel.VERY_LOW => "Very Low", - ConfidenceLevel.LOW => "Low", - ConfidenceLevel.MODERATE => "Moderate", - ConfidenceLevel.MEDIUM => "Medium", - ConfidenceLevel.HIGH => "High", + ConfidenceLevel.UNTRUSTED => TB("Untrusted"), + ConfidenceLevel.VERY_LOW => TB("Very Low"), + ConfidenceLevel.LOW => TB("Low"), + ConfidenceLevel.MODERATE => TB("Moderate"), + ConfidenceLevel.MEDIUM => TB("Medium"), + ConfidenceLevel.HIGH => TB("High"), - _ => "Unknown confidence level", + _ => TB("Unknown confidence level"), }; public static string GetColor(this ConfidenceLevel level, SettingsManager settingsManager) => (level, settingsManager.IsDarkMode) switch diff --git a/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs b/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs index b4ce57a0..57f74f4c 100644 --- a/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs +++ b/app/MindWork AI Studio/Provider/DeepSeek/ProviderDeepSeek.cs @@ -76,7 +76,7 @@ public sealed class ProviderDeepSeek(ILogger logger) : BaseProvider("https://api return request; } - await foreach (var content in this.StreamChatCompletionInternal("Helmholtz", RequestBuilder, token)) + await foreach (var content in this.StreamChatCompletionInternal("DeepSeek", RequestBuilder, token)) yield return content; } @@ -105,6 +105,27 @@ public sealed class ProviderDeepSeek(ILogger logger) : BaseProvider("https://api { return Task.FromResult(Enumerable.Empty()); } + + public override IReadOnlyCollection GetModelCapabilities(Model model) + { + var modelName = model.Id.ToLowerInvariant().AsSpan(); + + if(modelName.IndexOf("reasoner") is not -1) + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + + Capability.ALWAYS_REASONING, + ]; + + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + ]; + } + #endregion diff --git a/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs b/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs index 66817fc2..22164e18 100644 --- a/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs +++ b/app/MindWork AI Studio/Provider/Fireworks/ProviderFireworks.cs @@ -106,6 +106,8 @@ public class ProviderFireworks(ILogger logger) : BaseProvider("https://api.firew { return Task.FromResult(Enumerable.Empty()); } + + public override IReadOnlyCollection GetModelCapabilities(Model model) => CapabilitiesOpenSource.GetCapabilities(model); #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs b/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs index c0562a69..ad41804d 100644 --- a/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs +++ b/app/MindWork AI Studio/Provider/GWDG/ProviderGWDG.cs @@ -107,6 +107,8 @@ public sealed class ProviderGWDG(ILogger logger) : BaseProvider("https://chat-ai var models = await this.LoadModels(token, apiKeyProvisional); return models.Where(model => model.Id.StartsWith("e5-", StringComparison.InvariantCultureIgnoreCase)); } + + public override IReadOnlyCollection GetModelCapabilities(Model model) => CapabilitiesOpenSource.GetCapabilities(model); #endregion diff --git a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs index 942cb245..de1df964 100644 --- a/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs +++ b/app/MindWork AI Studio/Provider/Google/ProviderGoogle.cs @@ -98,7 +98,7 @@ public class ProviderGoogle(ILogger logger) : BaseProvider("https://generativela return []; return modelResponse.Models.Where(model => - model.Name.StartsWith("models/gemini-", StringComparison.InvariantCultureIgnoreCase)) + model.Name.StartsWith("models/gemini-", StringComparison.OrdinalIgnoreCase) && !model.Name.Contains("embed")) .Select(n => new Provider.Model(n.Name.Replace("models/", string.Empty), n.DisplayName)); } @@ -115,10 +115,93 @@ public class ProviderGoogle(ILogger logger) : BaseProvider("https://generativela return []; return modelResponse.Models.Where(model => - model.Name.StartsWith("models/text-embedding-", StringComparison.InvariantCultureIgnoreCase)) + model.Name.StartsWith("models/text-embedding-", StringComparison.OrdinalIgnoreCase) || + model.Name.StartsWith("models/gemini-embed", StringComparison.OrdinalIgnoreCase)) .Select(n => new Provider.Model(n.Name.Replace("models/", string.Empty), n.DisplayName)); } + + public override IReadOnlyCollection GetModelCapabilities(Provider.Model model) + { + var modelName = model.Id.ToLowerInvariant().AsSpan(); + if (modelName.IndexOf("gemini-") is not -1) + { + // Reasoning models: + if (modelName.IndexOf("gemini-2.5") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, Capability.AUDIO_INPUT, + Capability.SPEECH_INPUT, Capability.VIDEO_INPUT, + + Capability.TEXT_OUTPUT, + + Capability.ALWAYS_REASONING, Capability.FUNCTION_CALLING, + ]; + + // Image generation: + if(modelName.IndexOf("-2.0-flash-preview-image-") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, Capability.AUDIO_INPUT, + Capability.SPEECH_INPUT, Capability.VIDEO_INPUT, + + Capability.TEXT_OUTPUT, Capability.IMAGE_OUTPUT, + ]; + + // Realtime model: + if(modelName.IndexOf("-2.0-flash-live-") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.AUDIO_INPUT, Capability.SPEECH_INPUT, + Capability.VIDEO_INPUT, + + Capability.TEXT_OUTPUT, Capability.SPEECH_OUTPUT, + + Capability.FUNCTION_CALLING, + ]; + + // The 2.0 flash models cannot call functions: + if(modelName.IndexOf("-2.0-flash-") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, Capability.AUDIO_INPUT, + Capability.SPEECH_INPUT, Capability.VIDEO_INPUT, + + Capability.TEXT_OUTPUT, + ]; + + // The old 1.0 pro vision model: + if(modelName.IndexOf("pro-vision") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + + Capability.TEXT_OUTPUT, + ]; + + // Default to all other Gemini models: + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, Capability.AUDIO_INPUT, + Capability.SPEECH_INPUT, Capability.VIDEO_INPUT, + + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING, + ]; + } + + // Default for all other models: + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING, + ]; + } + #endregion private async Task LoadModels(CancellationToken token, string? apiKeyProvisional = null) diff --git a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs index f32a31b5..30d81ed0 100644 --- a/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs +++ b/app/MindWork AI Studio/Provider/Groq/ProviderGroq.cs @@ -109,6 +109,8 @@ public class ProviderGroq(ILogger logger) : BaseProvider("https://api.groq.com/o { return Task.FromResult(Enumerable.Empty()); } + + public override IReadOnlyCollection GetModelCapabilities(Model model) => CapabilitiesOpenSource.GetCapabilities(model); #endregion @@ -136,7 +138,8 @@ public class ProviderGroq(ILogger logger) : BaseProvider("https://api.groq.com/o var modelResponse = await response.Content.ReadFromJsonAsync(token); return modelResponse.Data.Where(n => - !n.Id.StartsWith("whisper-", StringComparison.InvariantCultureIgnoreCase) && - !n.Id.StartsWith("distil-", StringComparison.InvariantCultureIgnoreCase)); + !n.Id.StartsWith("whisper-", StringComparison.OrdinalIgnoreCase) && + !n.Id.StartsWith("distil-", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("-tts", StringComparison.OrdinalIgnoreCase)); } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs b/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs index b8450503..09a95387 100644 --- a/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs +++ b/app/MindWork AI Studio/Provider/Helmholtz/ProviderHelmholtz.cs @@ -111,6 +111,8 @@ public sealed class ProviderHelmholtz(ILogger logger) : BaseProvider("https://ap model.Id.StartsWith("text-", StringComparison.InvariantCultureIgnoreCase) || model.Id.Contains("gritlm", StringComparison.InvariantCultureIgnoreCase)); } + + public override IReadOnlyCollection GetModelCapabilities(Model model) => CapabilitiesOpenSource.GetCapabilities(model); #endregion diff --git a/app/MindWork AI Studio/Provider/HuggingFace/HFInferenceProvider.cs b/app/MindWork AI Studio/Provider/HuggingFace/HFInferenceProvider.cs new file mode 100644 index 00000000..01b722eb --- /dev/null +++ b/app/MindWork AI Studio/Provider/HuggingFace/HFInferenceProvider.cs @@ -0,0 +1,18 @@ +namespace AIStudio.Provider.HuggingFace; + +/// +/// Enum for inference providers that Hugging Face supports. +/// +public enum HFInferenceProvider +{ + NONE, + + CEREBRAS, + NEBIUS_AI_STUDIO, + SAMBANOVA, + NOVITA, + HYPERBOLIC, + TOGETHER_AI, + FIREWORKS, + HF_INFERENCE_API, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/HuggingFace/HFInferenceProviderExtensions.cs b/app/MindWork AI Studio/Provider/HuggingFace/HFInferenceProviderExtensions.cs new file mode 100644 index 00000000..0e103938 --- /dev/null +++ b/app/MindWork AI Studio/Provider/HuggingFace/HFInferenceProviderExtensions.cs @@ -0,0 +1,43 @@ +namespace AIStudio.Provider.HuggingFace; + +public static class HFInferenceProviderExtensions +{ + public static string Endpoints(this HFInferenceProvider provider, Model model) => provider switch + { + HFInferenceProvider.CEREBRAS => "cerebras/v1/", + HFInferenceProvider.NEBIUS_AI_STUDIO => "nebius/v1/", + HFInferenceProvider.SAMBANOVA => "sambanova/v1/", + HFInferenceProvider.NOVITA => "novita/v3/openai/", + HFInferenceProvider.HYPERBOLIC => "hyperbolic/v1/", + HFInferenceProvider.TOGETHER_AI => "together/v1/", + HFInferenceProvider.FIREWORKS => "fireworks-ai/inference/v1/", + HFInferenceProvider.HF_INFERENCE_API => $"hf-inference/models/{model.ToString()}/v1/", + _ => string.Empty, + }; + + public static string EndpointsId(this HFInferenceProvider provider) => provider switch + { + HFInferenceProvider.CEREBRAS => "cerebras", + HFInferenceProvider.NEBIUS_AI_STUDIO => "nebius", + HFInferenceProvider.SAMBANOVA => "sambanova", + HFInferenceProvider.NOVITA => "novita", + HFInferenceProvider.HYPERBOLIC => "hyperbolic", + HFInferenceProvider.TOGETHER_AI => "together", + HFInferenceProvider.FIREWORKS => "fireworks", + HFInferenceProvider.HF_INFERENCE_API => "hf-inference", + _ => string.Empty, + }; + + public static string ToName(this HFInferenceProvider provider) => provider switch + { + HFInferenceProvider.CEREBRAS => "Cerebras", + HFInferenceProvider.NEBIUS_AI_STUDIO => "Nebius AI Studio", + HFInferenceProvider.SAMBANOVA => "Sambanova", + HFInferenceProvider.NOVITA => "Novita", + HFInferenceProvider.HYPERBOLIC => "Hyperbolic", + HFInferenceProvider.TOGETHER_AI => "Together AI", + HFInferenceProvider.FIREWORKS => "Fireworks AI", + HFInferenceProvider.HF_INFERENCE_API => "Hugging Face Inference API", + _ => string.Empty, + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs b/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs new file mode 100644 index 00000000..659a8ca9 --- /dev/null +++ b/app/MindWork AI Studio/Provider/HuggingFace/ProviderHuggingFace.cs @@ -0,0 +1,117 @@ +using System.Net.Http.Headers; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.Json; + +using AIStudio.Chat; +using AIStudio.Provider.OpenAI; +using AIStudio.Settings; + +namespace AIStudio.Provider.HuggingFace; + +public sealed class ProviderHuggingFace : BaseProvider +{ + public ProviderHuggingFace(ILogger logger, HFInferenceProvider hfProvider, Model model) : base($"https://router.huggingface.co/{hfProvider.Endpoints(model)}", logger) + { + logger.LogInformation($"We use the inferende provider '{hfProvider}'. Thus we use the base URL 'https://router.huggingface.co/{hfProvider.Endpoints(model)}'."); + } + + #region Implementation of IProvider + + /// + public override string Id => LLMProviders.HUGGINGFACE.ToName(); + + /// + public override string InstanceName { get; set; } = "HuggingFace"; + + /// + public override async IAsyncEnumerable StreamChatCompletion(Model chatModel, ChatThread chatThread, SettingsManager settingsManager, [EnumeratorCancellation] CancellationToken token = default) + { + // Get the API key: + var requestedSecret = await RUST_SERVICE.GetAPIKey(this); + if(!requestedSecret.Success) + yield break; + + // Prepare the system prompt: + var systemPrompt = new Message + { + Role = "system", + Content = chatThread.PrepareSystemPrompt(settingsManager, chatThread, this.logger), + }; + + // Prepare the HuggingFace HTTP chat request: + var huggingfaceChatRequest = JsonSerializer.Serialize(new ChatRequest + { + Model = chatModel.Id, + + // Build the messages: + // - First of all the system prompt + // - Then none-empty user and AI messages + Messages = [systemPrompt, ..chatThread.Blocks.Where(n => n.ContentType is ContentType.TEXT && !string.IsNullOrWhiteSpace((n.Content as ContentText)?.Text)).Select(n => new Message + { + Role = n.Role switch + { + ChatRole.USER => "user", + ChatRole.AI => "assistant", + ChatRole.AGENT => "assistant", + ChatRole.SYSTEM => "system", + + _ => "user", + }, + + Content = n.Content switch + { + ContentText text => text.Text, + _ => string.Empty, + } + }).ToList()], + Stream = true, + }, JSON_SERIALIZER_OPTIONS); + + async Task RequestBuilder() + { + // Build the HTTP post request: + var request = new HttpRequestMessage(HttpMethod.Post, "chat/completions"); + + // Set the authorization header: + request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await requestedSecret.Secret.Decrypt(ENCRYPTION)); + + // Set the content: + request.Content = new StringContent(huggingfaceChatRequest, Encoding.UTF8, "application/json"); + return request; + } + + await foreach (var content in this.StreamChatCompletionInternal("HuggingFace", RequestBuilder, token)) + yield return content; + } + + #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + /// + public override async IAsyncEnumerable StreamImageCompletion(Model imageModel, string promptPositive, string promptNegative = FilterOperator.String.Empty, ImageURL referenceImageURL = default, [EnumeratorCancellation] CancellationToken token = default) + { + yield break; + } + #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + + /// + public override Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + return Task.FromResult(Enumerable.Empty()); + } + + /// + public override Task> GetImageModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + return Task.FromResult(Enumerable.Empty()); + } + + /// + public override Task> GetEmbeddingModels(string? apiKeyProvisional = null, CancellationToken token = default) + { + return Task.FromResult(Enumerable.Empty()); + } + + public override IReadOnlyCollection GetModelCapabilities(Model model) => CapabilitiesOpenSource.GetCapabilities(model); + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/IProvider.cs b/app/MindWork AI Studio/Provider/IProvider.cs index 2256dff5..86a60913 100644 --- a/app/MindWork AI Studio/Provider/IProvider.cs +++ b/app/MindWork AI Studio/Provider/IProvider.cs @@ -63,4 +63,11 @@ public interface IProvider /// The cancellation token. /// The list of embedding models. public Task> GetEmbeddingModels(string? apiKeyProvisional = null, CancellationToken token = default); + + /// + /// Get the capabilities of a model. + /// + /// The model to get the capabilities for. + /// The capabilities of the model. + public IReadOnlyCollection GetModelCapabilities(Model model); } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/LLMProviders.cs b/app/MindWork AI Studio/Provider/LLMProviders.cs index 92c0873b..118d68aa 100644 --- a/app/MindWork AI Studio/Provider/LLMProviders.cs +++ b/app/MindWork AI Studio/Provider/LLMProviders.cs @@ -13,9 +13,11 @@ public enum LLMProviders GOOGLE = 7, X = 8, DEEP_SEEK = 11, + ALIBABA_CLOUD = 12, FIREWORKS = 5, GROQ = 6, + HUGGINGFACE = 13, SELF_HOSTED = 4, diff --git a/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs b/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs index 7fb80e7f..1c820baa 100644 --- a/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs +++ b/app/MindWork AI Studio/Provider/LLMProvidersExtensions.cs @@ -1,3 +1,4 @@ +using AIStudio.Provider.AlibabaCloud; using AIStudio.Provider.Anthropic; using AIStudio.Provider.DeepSeek; using AIStudio.Provider.Fireworks; @@ -5,11 +6,13 @@ using AIStudio.Provider.Google; using AIStudio.Provider.Groq; using AIStudio.Provider.GWDG; using AIStudio.Provider.Helmholtz; +using AIStudio.Provider.HuggingFace; using AIStudio.Provider.Mistral; using AIStudio.Provider.OpenAI; using AIStudio.Provider.SelfHosted; using AIStudio.Provider.X; using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; using Host = AIStudio.Provider.SelfHosted.Host; @@ -17,6 +20,8 @@ namespace AIStudio.Provider; public static class LLMProvidersExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(LLMProvidersExtensions).Namespace, nameof(LLMProvidersExtensions)); + /// /// Returns the human-readable name of the provider. /// @@ -24,7 +29,7 @@ public static class LLMProvidersExtensions /// The human-readable name of the provider. public static string ToName(this LLMProviders llmProvider) => llmProvider switch { - LLMProviders.NONE => "No provider selected", + LLMProviders.NONE => TB("No provider selected"), LLMProviders.OPEN_AI => "OpenAI", LLMProviders.ANTHROPIC => "Anthropic", @@ -32,16 +37,18 @@ public static class LLMProvidersExtensions LLMProviders.GOOGLE => "Google", LLMProviders.X => "xAI", LLMProviders.DEEP_SEEK => "DeepSeek", + LLMProviders.ALIBABA_CLOUD => "Alibaba Cloud", LLMProviders.GROQ => "Groq", LLMProviders.FIREWORKS => "Fireworks.ai", + LLMProviders.HUGGINGFACE => "Hugging Face", - LLMProviders.SELF_HOSTED => "Self-hosted", + LLMProviders.SELF_HOSTED => TB("Self-hosted"), LLMProviders.HELMHOLTZ => "Helmholtz Blablador", LLMProviders.GWDG => "GWDG SAIA", - _ => "Unknown", + _ => TB("Unknown"), }; /// @@ -54,7 +61,10 @@ public static class LLMProvidersExtensions { LLMProviders.NONE => Confidence.NONE, - LLMProviders.FIREWORKS => Confidence.USA_NOT_TRUSTED.WithRegion("America, U.S.").WithSources("https://fireworks.ai/terms-of-service").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), + LLMProviders.FIREWORKS => Confidence.USA_HUB.WithRegion("America, U.S.").WithSources("https://fireworks.ai/terms-of-service").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), + + // Not trusted, because huggingface only routes you to a third-party-provider and we can't make sure they do not use your data + LLMProviders.HUGGINGFACE => Confidence.USA_HUB.WithRegion("America, U.S.").WithSources("https://huggingface.co/terms-of-service").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), LLMProviders.OPEN_AI => Confidence.USA_NO_TRAINING.WithRegion("America, U.S.").WithSources( "https://platform.openai.com/docs/models/default-usage-policies-by-endpoint", @@ -75,6 +85,8 @@ public static class LLMProvidersExtensions LLMProviders.DEEP_SEEK => Confidence.CHINA_NO_TRAINING.WithRegion("Asia").WithSources("https://cdn.deepseek.com/policies/en-US/deepseek-open-platform-terms-of-service.html").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), + LLMProviders.ALIBABA_CLOUD => Confidence.CHINA_NO_TRAINING.WithRegion("Asia").WithSources("https://www.alibabacloud.com/help/en/model-studio/support/faq-about-alibaba-cloud-model-studio").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), + LLMProviders.SELF_HOSTED => Confidence.SELF_HOSTED.WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), LLMProviders.HELMHOLTZ => Confidence.GDPR_NO_TRAINING.WithRegion("Europe, Germany").WithSources("https://helmholtz.cloud/services/?serviceID=d7d5c597-a2f6-4bd1-b71e-4d6499d98570").WithLevel(settingsManager.GetConfiguredConfidenceLevel(llmProvider)), @@ -97,6 +109,7 @@ public static class LLMProvidersExtensions LLMProviders.MISTRAL => true, LLMProviders.GOOGLE => true, LLMProviders.HELMHOLTZ => true, + LLMProviders.ALIBABA_CLOUD => true, // // Providers that do not support embeddings: @@ -107,6 +120,7 @@ public static class LLMProvidersExtensions LLMProviders.X => false, LLMProviders.GWDG => false, LLMProviders.DEEP_SEEK => false, + LLMProviders.HUGGINGFACE => false, // // Self-hosted providers are treated as a special case anyway. @@ -124,7 +138,7 @@ public static class LLMProvidersExtensions /// The provider instance. public static IProvider CreateProvider(this AIStudio.Settings.Provider providerSettings, ILogger logger) { - return providerSettings.UsedLLMProvider.CreateProvider(providerSettings.InstanceName, providerSettings.Host, providerSettings.Hostname, logger); + return providerSettings.UsedLLMProvider.CreateProvider(providerSettings.InstanceName, providerSettings.Host, providerSettings.Hostname, providerSettings.Model, providerSettings.HFInferenceProvider ,logger); } /// @@ -135,10 +149,10 @@ public static class LLMProvidersExtensions /// The provider instance. public static IProvider CreateProvider(this EmbeddingProvider embeddingProviderSettings, ILogger logger) { - return embeddingProviderSettings.UsedLLMProvider.CreateProvider(embeddingProviderSettings.Name, embeddingProviderSettings.Host, embeddingProviderSettings.Hostname, logger); + return embeddingProviderSettings.UsedLLMProvider.CreateProvider(embeddingProviderSettings.Name, embeddingProviderSettings.Host, embeddingProviderSettings.Hostname, embeddingProviderSettings.Model, HFInferenceProvider.NONE,logger); } - private static IProvider CreateProvider(this LLMProviders provider, string instanceName, Host host, string hostname, ILogger logger) + private static IProvider CreateProvider(this LLMProviders provider, string instanceName, Host host, string hostname, Model model, HFInferenceProvider inferenceProvider , ILogger logger) { try { @@ -150,9 +164,11 @@ public static class LLMProvidersExtensions LLMProviders.GOOGLE => new ProviderGoogle(logger) { InstanceName = instanceName }, LLMProviders.X => new ProviderX(logger) { InstanceName = instanceName }, LLMProviders.DEEP_SEEK => new ProviderDeepSeek(logger) { InstanceName = instanceName }, + LLMProviders.ALIBABA_CLOUD => new ProviderAlibabaCloud(logger) { InstanceName = instanceName }, LLMProviders.GROQ => new ProviderGroq(logger) { InstanceName = instanceName }, LLMProviders.FIREWORKS => new ProviderFireworks(logger) { InstanceName = instanceName }, + LLMProviders.HUGGINGFACE => new ProviderHuggingFace(logger, inferenceProvider, model) { InstanceName = instanceName }, LLMProviders.SELF_HOSTED => new ProviderSelfHosted(logger, host, hostname) { InstanceName = instanceName }, @@ -177,9 +193,11 @@ public static class LLMProvidersExtensions LLMProviders.GOOGLE => "https://console.cloud.google.com/", LLMProviders.X => "https://accounts.x.ai/sign-up", LLMProviders.DEEP_SEEK => "https://platform.deepseek.com/sign_up", + LLMProviders.ALIBABA_CLOUD => "https://account.alibabacloud.com/register/intl_register.htm", LLMProviders.GROQ => "https://console.groq.com/", LLMProviders.FIREWORKS => "https://fireworks.ai/login", + LLMProviders.HUGGINGFACE => "https://huggingface.co/login", LLMProviders.HELMHOLTZ => "https://sdlaml.pages.jsc.fz-juelich.de/ai/guides/blablador_api_access/#step-1-register-on-gitlab", LLMProviders.GWDG => "https://docs.hpc.gwdg.de/services/saia/index.html#api-request", @@ -197,6 +215,8 @@ public static class LLMProvidersExtensions LLMProviders.GOOGLE => "https://console.cloud.google.com/billing", LLMProviders.FIREWORKS => "https://fireworks.ai/account/billing", LLMProviders.DEEP_SEEK => "https://platform.deepseek.com/usage", + LLMProviders.ALIBABA_CLOUD => "https://usercenter2-intl.aliyun.com/billing", + LLMProviders.HUGGINGFACE => "https://huggingface.co/settings/billing", _ => string.Empty, }; @@ -211,19 +231,23 @@ public static class LLMProvidersExtensions LLMProviders.FIREWORKS => true, LLMProviders.GOOGLE => true, LLMProviders.DEEP_SEEK => true, + LLMProviders.ALIBABA_CLOUD => true, + LLMProviders.HUGGINGFACE => true, _ => false, }; - public static string GetModelsOverviewURL(this LLMProviders provider) => provider switch + public static string GetModelsOverviewURL(this LLMProviders provider, HFInferenceProvider inferenceProvider) => provider switch { LLMProviders.FIREWORKS => "https://fireworks.ai/models?show=Serverless", + LLMProviders.HUGGINGFACE => $"https://huggingface.co/models?inference_provider={inferenceProvider.EndpointsId()}", _ => string.Empty, }; public static bool IsLLMModelProvidedManually(this LLMProviders provider) => provider switch { LLMProviders.FIREWORKS => true, + LLMProviders.HUGGINGFACE => true, _ => false, }; @@ -253,11 +277,13 @@ public static class LLMProvidersExtensions LLMProviders.GOOGLE => true, LLMProviders.X => true, LLMProviders.DEEP_SEEK => true, + LLMProviders.ALIBABA_CLOUD => true, LLMProviders.GROQ => true, LLMProviders.FIREWORKS => true, LLMProviders.HELMHOLTZ => true, LLMProviders.GWDG => true, + LLMProviders.HUGGINGFACE => true, LLMProviders.SELF_HOSTED => host is Host.OLLAMA, @@ -272,11 +298,13 @@ public static class LLMProvidersExtensions LLMProviders.GOOGLE => true, LLMProviders.X => true, LLMProviders.DEEP_SEEK => true, + LLMProviders.ALIBABA_CLOUD => true, LLMProviders.GROQ => true, LLMProviders.FIREWORKS => true, LLMProviders.HELMHOLTZ => true, LLMProviders.GWDG => true, + LLMProviders.HUGGINGFACE => true, _ => false, }; @@ -306,4 +334,10 @@ public static class LLMProvidersExtensions return true; } + + public static bool IsHFInstanceProviderNeeded(this LLMProviders provider) => provider switch + { + LLMProviders.HUGGINGFACE => true, + _ => false, + }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs b/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs index 024f60d3..ed87d12f 100644 --- a/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs +++ b/app/MindWork AI Studio/Provider/Mistral/ProviderMistral.cs @@ -99,8 +99,9 @@ public sealed class ProviderMistral(ILogger logger) : BaseProvider("https://api. return []; return modelResponse.Data.Where(n => - !n.Id.StartsWith("code", StringComparison.InvariantCulture) && - !n.Id.Contains("embed", StringComparison.InvariantCulture)) + !n.Id.StartsWith("code", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("embed", StringComparison.OrdinalIgnoreCase) && + !n.Id.Contains("moderation", StringComparison.OrdinalIgnoreCase)) .Select(n => new Provider.Model(n.Id, null)); } @@ -120,7 +121,53 @@ public sealed class ProviderMistral(ILogger logger) : BaseProvider("https://api. { return Task.FromResult(Enumerable.Empty()); } - + + public override IReadOnlyCollection GetModelCapabilities(Provider.Model model) + { + var modelName = model.Id.ToLowerInvariant().AsSpan(); + + // Pixtral models are able to do process images: + if (modelName.IndexOf("pixtral") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING, + ]; + + // Mistral medium: + if (modelName.IndexOf("mistral-medium-") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING, + ]; + + // Mistral small: + if (modelName.IndexOf("mistral-small-") is not -1) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING, + ]; + + // Mistral saba: + if (modelName.IndexOf("mistral-saba-") is not -1) + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + ]; + + // Default: + return CapabilitiesOpenSource.GetCapabilities(model); + } + #endregion private async Task LoadModelList(string? apiKeyProvisional, CancellationToken token) diff --git a/app/MindWork AI Studio/Provider/Model.cs b/app/MindWork AI Studio/Provider/Model.cs index ff66933a..4e582f97 100644 --- a/app/MindWork AI Studio/Provider/Model.cs +++ b/app/MindWork AI Studio/Provider/Model.cs @@ -1,3 +1,5 @@ +using AIStudio.Tools.PluginSystem; + namespace AIStudio.Provider; /// @@ -7,6 +9,8 @@ namespace AIStudio.Provider; /// The model's display name. public readonly record struct Model(string Id, string? DisplayName) { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(Model).Namespace, nameof(Model)); + #region Overrides of ValueType public override string ToString() @@ -17,7 +21,7 @@ public readonly record struct Model(string Id, string? DisplayName) if(!string.IsNullOrWhiteSpace(this.Id)) return this.Id; - return "no model selected"; + return TB("no model selected"); } #endregion diff --git a/app/MindWork AI Studio/Provider/NoProvider.cs b/app/MindWork AI Studio/Provider/NoProvider.cs index ce3fe31f..983ab875 100644 --- a/app/MindWork AI Studio/Provider/NoProvider.cs +++ b/app/MindWork AI Studio/Provider/NoProvider.cs @@ -31,5 +31,7 @@ public class NoProvider : IProvider yield break; } + public IReadOnlyCollection GetModelCapabilities(Model model) => [ Capability.NONE ]; + #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs index ed092174..b5f8f818 100644 --- a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs +++ b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs @@ -120,15 +120,21 @@ public sealed class ProviderOpenAI(ILogger logger) : BaseProvider("https://api.o #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously /// - public override Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) + public override async Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) { - return this.LoadModels(["gpt-", "o1-"], token, apiKeyProvisional); + var models = await this.LoadModels(["gpt-", "o1-", "o3-", "o4-"], token, apiKeyProvisional); + return models.Where(model => !model.Id.Contains("image", StringComparison.OrdinalIgnoreCase) && + !model.Id.Contains("realtime", StringComparison.OrdinalIgnoreCase) && + !model.Id.Contains("audio", StringComparison.OrdinalIgnoreCase) && + !model.Id.Contains("tts", StringComparison.OrdinalIgnoreCase) && + !model.Id.Contains("transcribe", StringComparison.OrdinalIgnoreCase) && + !model.Id.Contains("o1-pro", StringComparison.OrdinalIgnoreCase)); } /// public override Task> GetImageModels(string? apiKeyProvisional = null, CancellationToken token = default) { - return this.LoadModels(["dall-e-"], token, apiKeyProvisional); + return this.LoadModels(["dall-e-", "gpt-image"], token, apiKeyProvisional); } /// @@ -136,7 +142,70 @@ public sealed class ProviderOpenAI(ILogger logger) : BaseProvider("https://api.o { return this.LoadModels(["text-embedding-"], token, apiKeyProvisional); } - + + public override IReadOnlyCollection GetModelCapabilities(Model model) + { + var modelName = model.Id.ToLowerInvariant().AsSpan(); + + if (modelName.StartsWith("o1-mini")) + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + + Capability.ALWAYS_REASONING, + ]; + + if (modelName.StartsWith("o3-mini")) + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + + Capability.ALWAYS_REASONING, Capability.FUNCTION_CALLING + ]; + + if (modelName.StartsWith("o4-mini") || modelName.StartsWith("o1") || modelName.StartsWith("o3")) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.ALWAYS_REASONING, Capability.FUNCTION_CALLING + ]; + + if(modelName.StartsWith("gpt-3.5")) + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + ]; + + if(modelName.StartsWith("gpt-4-turbo")) + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING + ]; + + if(modelName is "gpt-4" || modelName.StartsWith("gpt-4-")) + return + [ + Capability.TEXT_INPUT, + Capability.TEXT_OUTPUT, + ]; + + return + [ + Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT, + Capability.TEXT_OUTPUT, + + Capability.FUNCTION_CALLING, + ]; + } + #endregion private async Task> LoadModels(string[] prefixes, CancellationToken token, string? apiKeyProvisional = null) diff --git a/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs b/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs index 4ba45c6b..a2e997f9 100644 --- a/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs +++ b/app/MindWork AI Studio/Provider/SelfHosted/ProviderSelfHosted.cs @@ -87,8 +87,7 @@ public sealed class ProviderSelfHosted(ILogger logger, Host host, string hostnam yield break; } #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously - - + public override async Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) { try @@ -139,7 +138,9 @@ public sealed class ProviderSelfHosted(ILogger logger, Host host, string hostnam return []; } } - + + public override IReadOnlyCollection GetModelCapabilities(Provider.Model model) => CapabilitiesOpenSource.GetCapabilities(model); + #endregion private async Task> LoadModels(string[] ignorePhrases, string[] filterPhrases, CancellationToken token, string? apiKeyProvisional = null) diff --git a/app/MindWork AI Studio/Provider/X/ProviderX.cs b/app/MindWork AI Studio/Provider/X/ProviderX.cs index a8334c8d..884c1007 100644 --- a/app/MindWork AI Studio/Provider/X/ProviderX.cs +++ b/app/MindWork AI Studio/Provider/X/ProviderX.cs @@ -93,9 +93,10 @@ public sealed class ProviderX(ILogger logger) : BaseProvider("https://api.x.ai/v #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously /// - public override Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) + public override async Task> GetTextModels(string? apiKeyProvisional = null, CancellationToken token = default) { - return this.LoadModels(["grok-"], token, apiKeyProvisional); + var models = await this.LoadModels(["grok-"], token, apiKeyProvisional); + return models.Where(n => !n.Id.Contains("-image", StringComparison.OrdinalIgnoreCase)); } /// @@ -109,6 +110,8 @@ public sealed class ProviderX(ILogger logger) : BaseProvider("https://api.x.ai/v { return Task.FromResult>([]); } + + public override IReadOnlyCollection GetModelCapabilities(Model model) => CapabilitiesOpenSource.GetCapabilities(model); #endregion diff --git a/app/MindWork AI Studio/Routes.razor.cs b/app/MindWork AI Studio/Routes.razor.cs index b6318820..d59bffac 100644 --- a/app/MindWork AI Studio/Routes.razor.cs +++ b/app/MindWork AI Studio/Routes.razor.cs @@ -26,5 +26,6 @@ public sealed partial class Routes public const string ASSISTANT_JOB_POSTING = "/assistant/job-posting"; public const string ASSISTANT_BIAS = "/assistant/bias-of-the-day"; public const string ASSISTANT_ERI = "/assistant/eri"; + public const string ASSISTANT_AI_STUDIO_I18N = "/assistant/ai-studio/i18n"; // ReSharper restore InconsistentNaming } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/ChatTemplate.cs b/app/MindWork AI Studio/Settings/ChatTemplate.cs new file mode 100644 index 00000000..0c52568a --- /dev/null +++ b/app/MindWork AI Studio/Settings/ChatTemplate.cs @@ -0,0 +1,37 @@ +using AIStudio.Chat; +using AIStudio.Tools.PluginSystem; + +namespace AIStudio.Settings; + +public readonly record struct ChatTemplate(uint Num, string Id, string Name, string SystemPrompt, List ExampleConversation, bool AllowProfileUsage) +{ + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ChatTemplate).Namespace, nameof(ChatTemplate)); + + public static readonly ChatTemplate NO_CHAT_TEMPLATE = new() + { + Name = TB("Use no chat template"), + SystemPrompt = string.Empty, + Id = Guid.Empty.ToString(), + Num = uint.MaxValue, + ExampleConversation = [], + AllowProfileUsage = true, + }; + + #region Overrides of ValueType + + /// + /// Returns a string that represents the profile in a human-readable format. + /// + /// A string that represents the profile in a human-readable format. + public override string ToString() => this.Name; + + #endregion + + public string ToSystemPrompt() + { + if(this.Num == uint.MaxValue) + return string.Empty; + + return this.SystemPrompt; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/ConfigurationSelectData.cs b/app/MindWork AI Studio/Settings/ConfigurationSelectDataFactory.cs similarity index 54% rename from app/MindWork AI Studio/Settings/ConfigurationSelectData.cs rename to app/MindWork AI Studio/Settings/ConfigurationSelectDataFactory.cs index 5a2b8f11..d14868fc 100644 --- a/app/MindWork AI Studio/Settings/ConfigurationSelectData.cs +++ b/app/MindWork AI Studio/Settings/ConfigurationSelectDataFactory.cs @@ -6,6 +6,7 @@ using AIStudio.Assistants.TextSummarizer; using AIStudio.Assistants.EMail; using AIStudio.Provider; using AIStudio.Settings.DataModel; +using AIStudio.Tools.PluginSystem; using WritingStylesRewrite = AIStudio.Assistants.RewriteImprove.WritingStyles; using WritingStylesEMail = AIStudio.Assistants.EMail.WritingStyles; @@ -25,72 +26,89 @@ public readonly record struct ConfigurationSelectData(string Name, T Value); /// public static class ConfigurationSelectDataFactory { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ConfigurationSelectDataFactory).Namespace, nameof(ConfigurationSelectDataFactory)); + + public static IEnumerable> GetLangBehaviorData() + { + foreach (var behavior in Enum.GetValues()) + yield return new(behavior.Name(), behavior); + } + + public static IEnumerable> GetLanguagesData() + { + foreach (var runningPlugin in PluginFactory.RunningPlugins) + { + if(runningPlugin is ILanguagePlugin languagePlugin) + yield return new(languagePlugin.LangName, runningPlugin.Id); + } + } + public static IEnumerable> GetLoadingChatProviderBehavior() { - yield return new("When possible, use the LLM provider which was used for each chat in the first place", LoadingChatProviderBehavior.USE_CHAT_PROVIDER_IF_AVAILABLE); - yield return new("Use the latest LLM provider, which was used before; use the default chat provider initially", LoadingChatProviderBehavior.ALWAYS_USE_LATEST_CHAT_PROVIDER); - yield return new("Always use the default chat provider when loading chats", LoadingChatProviderBehavior.ALWAYS_USE_DEFAULT_CHAT_PROVIDER); + yield return new(TB("When possible, use the LLM provider which was used for each chat in the first place"), LoadingChatProviderBehavior.USE_CHAT_PROVIDER_IF_AVAILABLE); + yield return new(TB("Use the latest LLM provider, which was used before; use the default chat provider initially"), LoadingChatProviderBehavior.ALWAYS_USE_LATEST_CHAT_PROVIDER); + yield return new(TB("Always use the default chat provider when loading chats"), LoadingChatProviderBehavior.ALWAYS_USE_DEFAULT_CHAT_PROVIDER); } public static IEnumerable> GetAddChatProviderBehavior() { - yield return new("Use the latest LLM provider, which was used before; use the default chat provider initially", AddChatProviderBehavior.ADDED_CHATS_USE_LATEST_PROVIDER); - yield return new("Always use the default chat provider for new chats", AddChatProviderBehavior.ADDED_CHATS_USE_DEFAULT_PROVIDER); + yield return new(TB("Use the latest LLM provider, which was used before; use the default chat provider initially"), AddChatProviderBehavior.ADDED_CHATS_USE_LATEST_PROVIDER); + yield return new(TB("Always use the default chat provider for new chats"), AddChatProviderBehavior.ADDED_CHATS_USE_DEFAULT_PROVIDER); } public static IEnumerable> GetSendBehaviorData() { - yield return new("No key is sending the input", SendBehavior.NO_KEY_IS_SENDING); - yield return new("Modifier key + enter is sending the input", SendBehavior.MODIFER_ENTER_IS_SENDING); - yield return new("Enter is sending the input", SendBehavior.ENTER_IS_SENDING); + yield return new(TB("No key is sending the input"), SendBehavior.NO_KEY_IS_SENDING); + yield return new(TB("Modifier key + enter is sending the input"), SendBehavior.MODIFER_ENTER_IS_SENDING); + yield return new(TB("Enter is sending the input"), SendBehavior.ENTER_IS_SENDING); } public static IEnumerable> GetUpdateBehaviorData() { - yield return new("No automatic update checks", UpdateBehavior.NO_CHECK); - yield return new("Once at startup", UpdateBehavior.ONCE_STARTUP); - yield return new("Check every hour", UpdateBehavior.HOURLY); - yield return new("Check every day", UpdateBehavior.DAILY); - yield return new ("Check every week", UpdateBehavior.WEEKLY); + yield return new(TB("No automatic update checks"), UpdateBehavior.NO_CHECK); + yield return new(TB("Once at startup"), UpdateBehavior.ONCE_STARTUP); + yield return new(TB("Check every hour"), UpdateBehavior.HOURLY); + yield return new(TB("Check every day"), UpdateBehavior.DAILY); + yield return new (TB("Check every week"), UpdateBehavior.WEEKLY); } public static IEnumerable> GetWorkspaceStorageBehaviorData() { - yield return new("Disable workspaces", WorkspaceStorageBehavior.DISABLE_WORKSPACES); - yield return new("Store chats automatically", WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY); - yield return new("Store chats manually", WorkspaceStorageBehavior.STORE_CHATS_MANUALLY); + yield return new(TB("Disable workspaces"), WorkspaceStorageBehavior.DISABLE_WORKSPACES); + yield return new(TB("Store chats automatically"), WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY); + yield return new(TB("Store chats manually"), WorkspaceStorageBehavior.STORE_CHATS_MANUALLY); } public static IEnumerable> GetWorkspaceStorageTemporaryMaintenancePolicyData() { - yield return new("No automatic maintenance for temporary chats", WorkspaceStorageTemporaryMaintenancePolicy.NO_AUTOMATIC_MAINTENANCE); - yield return new("Delete temporary chats older than 7 days", WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_7_DAYS); - yield return new("Delete temporary chats older than 30 days", WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_30_DAYS); - yield return new("Delete temporary chats older than 90 days", WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_90_DAYS); - yield return new("Delete temporary chats older than 180 days", WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_180_DAYS); - yield return new("Delete temporary chats older than 1 year", WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_365_DAYS); + yield return new(TB("No automatic maintenance for disappearing chats; old chats will never be deleted"), WorkspaceStorageTemporaryMaintenancePolicy.NO_AUTOMATIC_MAINTENANCE); + yield return new(TB("Delete disappearing chats older than 7 days"), WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_7_DAYS); + yield return new(TB("Delete disappearing chats older than 30 days"), WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_30_DAYS); + yield return new(TB("Delete disappearing chats older than 90 days"), WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_90_DAYS); + yield return new(TB("Delete disappearing chats older than 180 days"), WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_180_DAYS); + yield return new(TB("Delete disappearing chats older than 1 year"), WorkspaceStorageTemporaryMaintenancePolicy.DELETE_OLDER_THAN_365_DAYS); } public static IEnumerable> GetWorkspaceDisplayBehaviorData() { - yield return new("Toggle the overlay: the chat uses all the space, workspaces are temporarily shown", WorkspaceDisplayBehavior.TOGGLE_OVERLAY); - yield return new("Toggle the sidebar: show the workspaces next to the chat when desired", WorkspaceDisplayBehavior.TOGGLE_SIDEBAR); - yield return new("Sidebar is always visible: show the workspaces next to the chat all the time", WorkspaceDisplayBehavior.SIDEBAR_ALWAYS_VISIBLE); + yield return new(TB("Toggle the overlay: the chat uses all the space, workspaces are temporarily shown"), WorkspaceDisplayBehavior.TOGGLE_OVERLAY); + yield return new(TB("Toggle the sidebar: show the workspaces next to the chat when desired"), WorkspaceDisplayBehavior.TOGGLE_SIDEBAR); + yield return new(TB("Sidebar is always visible: show the workspaces next to the chat all the time"), WorkspaceDisplayBehavior.SIDEBAR_ALWAYS_VISIBLE); } public static IEnumerable> GetPreviewVisibility() { - yield return new("All preview features are hidden", PreviewVisibility.NONE); - yield return new("Also show features ready for release; these should be stable", PreviewVisibility.RELEASE_CANDIDATE); - yield return new("Also show features in beta: these are almost ready for release; expect some bugs", PreviewVisibility.BETA); - yield return new("Also show features in alpha: these are in development; expect bugs and missing features", PreviewVisibility.ALPHA); - yield return new("Show also prototype features: these are works in progress; expect bugs and missing features", PreviewVisibility.PROTOTYPE); - yield return new("Show also experimental features: these are experimental; expect bugs, missing features, many changes", PreviewVisibility.EXPERIMENTAL); + yield return new(TB("All preview features are hidden"), PreviewVisibility.NONE); + yield return new(TB("Also show features ready for release; these should be stable"), PreviewVisibility.RELEASE_CANDIDATE); + yield return new(TB("Also show features in beta: these are almost ready for release; expect some bugs"), PreviewVisibility.BETA); + yield return new(TB("Also show features in alpha: these are in development; expect bugs and missing features"), PreviewVisibility.ALPHA); + yield return new(TB("Show also prototype features: these are works in progress; expect bugs and missing features"), PreviewVisibility.PROTOTYPE); + yield return new(TB("Show also experimental features: these are experimental; expect bugs, missing features, many changes"), PreviewVisibility.EXPERIMENTAL); } public static IEnumerable> GetPreviewFeaturesData(SettingsManager settingsManager) { - foreach (var source in settingsManager.ConfigurationData.App.PreviewVisibility.GetPreviewFeatures()) + foreach (var source in settingsManager.ConfigurationData.App.PreviewVisibility.GetPreviewFeatures().Where(x => !x.IsReleased())) yield return new(source.GetPreviewDescription(), source); } @@ -102,10 +120,10 @@ public static class ConfigurationSelectDataFactory public static IEnumerable> GetNavBehaviorData() { - yield return new("Navigation expands on mouse hover", NavBehavior.EXPAND_ON_HOVER); - yield return new("Navigation never expands, but there are tooltips", NavBehavior.NEVER_EXPAND_USE_TOOLTIPS); - yield return new("Navigation never expands, no tooltips", NavBehavior.NEVER_EXPAND_NO_TOOLTIPS); - yield return new("Always expand navigation", NavBehavior.ALWAYS_EXPAND); + yield return new(TB("Navigation expands on mouse hover"), NavBehavior.EXPAND_ON_HOVER); + yield return new(TB("Navigation never expands, but there are tooltips"), NavBehavior.NEVER_EXPAND_USE_TOOLTIPS); + yield return new(TB("Navigation never expands, no tooltips"), NavBehavior.NEVER_EXPAND_NO_TOOLTIPS); + yield return new(TB("Always expand navigation"), NavBehavior.ALWAYS_EXPAND); } public static IEnumerable> GetIconSourcesData() @@ -124,7 +142,7 @@ public static class ConfigurationSelectDataFactory { foreach (var language in Enum.GetValues()) if(language is CommonLanguages.AS_IS) - yield return new("Not yet specified", language); + yield return new(TB("Not yet specified"), language); else yield return new(language.Name(), language); } @@ -133,7 +151,7 @@ public static class ConfigurationSelectDataFactory { foreach (var language in Enum.GetValues()) if(language is CommonLanguages.AS_IS) - yield return new("Do not specify the language", language); + yield return new(TB("Do not specify the language"), language); else yield return new(language.Name(), language); } @@ -180,6 +198,12 @@ public static class ConfigurationSelectDataFactory yield return new(profile.Name, profile.Id); } + public static IEnumerable> GetChatTemplatesData(IEnumerable chatTemplates) + { + foreach (var chatTemplate in chatTemplates.GetAllChatTemplates()) + yield return new(chatTemplate.Name, chatTemplate.Id); + } + public static IEnumerable> GetConfidenceSchemesData() { foreach (var scheme in Enum.GetValues()) @@ -195,7 +219,7 @@ public static class ConfigurationSelectDataFactory foreach (var level in Enum.GetValues()) { if(level is ConfidenceLevel.NONE) - yield return new("No minimum confidence level chosen", level); + yield return new(TB("No minimum confidence level chosen"), level); if(level < minimumLevel) continue; diff --git a/app/MindWork AI Studio/Settings/DataModel/Data.cs b/app/MindWork AI Studio/Settings/DataModel/Data.cs index b47eba49..695d2ad8 100644 --- a/app/MindWork AI Studio/Settings/DataModel/Data.cs +++ b/app/MindWork AI Studio/Settings/DataModel/Data.cs @@ -35,6 +35,11 @@ public sealed class Data /// List of configured profiles. /// public List Profiles { get; init; } = []; + + /// + /// List of configured chat templates. + /// + public List ChatTemplates { get; init; } = []; /// /// List of enabled plugins. @@ -60,6 +65,11 @@ public sealed class Data /// The next profile number to use. /// public uint NextProfileNum { get; set; } = 1; + + /// + /// The next chat template number to use. + /// + public uint NextChatTemplateNum { get; set; } = 1; public DataApp App { get; init; } = new(); @@ -100,4 +110,6 @@ public sealed class Data public DataJobPostings JobPostings { get; init; } = new(); public DataBiasOfTheDay BiasOfTheDay { get; init; } = new(); + + public DataI18N I18N { get; init; } = new(); } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataApp.cs b/app/MindWork AI Studio/Settings/DataModel/DataApp.cs index 7e89404a..e189cbbd 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataApp.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataApp.cs @@ -2,6 +2,16 @@ namespace AIStudio.Settings.DataModel; public sealed class DataApp { + /// + /// The language behavior. + /// + public LangBehavior LanguageBehavior { get; set; } = LangBehavior.AUTO; + + /// + /// The language plugin ID to use. + /// + public Guid LanguagePluginId { get; set; } = Guid.Empty; + /// /// The preferred theme to use. /// @@ -47,4 +57,10 @@ public sealed class DataApp /// Should we preselect a profile for the entire app? /// public string PreselectedProfile { get; set; } = string.Empty; + + + /// + /// Should we preselect a chat template for the entire app? + /// + public string PreselectedChatTemplate { get; set; } = string.Empty; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataChat.cs b/app/MindWork AI Studio/Settings/DataModel/DataChat.cs index baf995fd..147bb7ac 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataChat.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataChat.cs @@ -37,6 +37,11 @@ public sealed class DataChat ///
public string PreselectedProfile { get; set; } = string.Empty; + /// + /// Preselect a chat template? + /// + public string PreselectedChatTemplate { get; set; } = string.Empty; + /// /// Should we preselect data sources options for a created chat? /// diff --git a/app/MindWork AI Studio/Settings/DataModel/DataI18N.cs b/app/MindWork AI Studio/Settings/DataModel/DataI18N.cs new file mode 100644 index 00000000..7f8ddb19 --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/DataI18N.cs @@ -0,0 +1,29 @@ +namespace AIStudio.Settings.DataModel; + +public class DataI18N +{ + /// + /// Preselect any I18N options? + /// + public bool PreselectOptions { get; set; } + + /// + /// Preselect a language plugin to where the new content should compare to? + /// + public Guid PreselectedLanguagePluginId { get; set; } + + /// + /// Preselect the target language? + /// + public CommonLanguages PreselectedTargetLanguage { get; set; } = CommonLanguages.EN_GB; + + /// + /// Preselect any other language? + /// + public string PreselectOtherLanguage { get; set; } = string.Empty; + + /// + /// Which LLM provider should be preselected? + /// + public string PreselectedProvider { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs index cc43a3eb..618ad7b1 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceERI_V1.cs @@ -53,6 +53,9 @@ public readonly record struct DataSourceERI_V1 : IERIDataSource /// public string SelectedRetrievalId { get; init; } = string.Empty; + + /// + public ushort MaxMatches { get; init; } = 10; /// public async Task> RetrieveDataAsync(IContent lastPrompt, ChatThread thread, CancellationToken token = default) @@ -76,7 +79,7 @@ public readonly record struct DataSourceERI_V1 : IERIDataSource }, Thread = await thread.ToERIChatThread(token), - MaxMatches = 10, + MaxMatches = this.MaxMatches, RetrievalProcessId = string.IsNullOrWhiteSpace(this.SelectedRetrievalId) ? null : this.SelectedRetrievalId, Parameters = null, // The ERI server selects useful default parameters }; diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs index d81e30db..a72793d6 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalDirectory.cs @@ -30,6 +30,9 @@ public readonly record struct DataSourceLocalDirectory : IInternalDataSource /// public DataSourceSecurity SecurityPolicy { get; init; } = DataSourceSecurity.NOT_SPECIFIED; + /// + public ushort MaxMatches { get; init; } = 10; + /// public Task> RetrieveDataAsync(IContent lastPrompt, ChatThread thread, CancellationToken token = default) { diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs index 5788a2a6..5e8c0a79 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceLocalFile.cs @@ -30,6 +30,9 @@ public readonly record struct DataSourceLocalFile : IInternalDataSource /// public DataSourceSecurity SecurityPolicy { get; init; } = DataSourceSecurity.NOT_SPECIFIED; + /// + public ushort MaxMatches { get; init; } = 10; + /// public Task> RetrieveDataAsync(IContent lastPrompt, ChatThread thread, CancellationToken token = default) { diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceSecurityExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceSecurityExtensions.cs index 6e52d0fd..b87a0e56 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataSourceSecurityExtensions.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceSecurityExtensions.cs @@ -1,25 +1,29 @@ +using AIStudio.Tools.PluginSystem; + namespace AIStudio.Settings.DataModel; public static class DataSourceSecurityExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(DataSourceSecurityExtensions).Namespace, nameof(DataSourceSecurityExtensions)); + public static string ToSelectionText(this DataSourceSecurity security) => security switch { - DataSourceSecurity.NOT_SPECIFIED => "Please select a security policy", + DataSourceSecurity.NOT_SPECIFIED => TB("Please select a security policy"), - DataSourceSecurity.ALLOW_ANY => "This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider.", - DataSourceSecurity.SELF_HOSTED => "This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider.", + DataSourceSecurity.ALLOW_ANY => TB("This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider."), + DataSourceSecurity.SELF_HOSTED => TB("This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider."), - _ => "Unknown security policy" + _ => TB("Unknown security policy") }; public static string ToInfoText(this DataSourceSecurity security) => security switch { - DataSourceSecurity.NOT_SPECIFIED => "The security of the data source is not specified yet. You cannot use this data source until you specify a security policy.", + DataSourceSecurity.NOT_SPECIFIED => TB("The security of the data source is not specified yet. You cannot use this data source until you specify a security policy."), - DataSourceSecurity.ALLOW_ANY => "This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider.", - DataSourceSecurity.SELF_HOSTED => "This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider.", + DataSourceSecurity.ALLOW_ANY => TB("This data source can be used with any LLM provider. Your data may be sent to a cloud-based provider."), + DataSourceSecurity.SELF_HOSTED => TB("This data source can only be used with a self-hosted LLM provider. Your data will not be sent to any cloud-based provider."), - _ => "Unknown security policy" + _ => TB("Unknown security policy") }; public static TextColor GetColor(this DataSourceSecurity security) => security switch diff --git a/app/MindWork AI Studio/Settings/DataModel/DataSourceTypeExtension.cs b/app/MindWork AI Studio/Settings/DataModel/DataSourceTypeExtension.cs index 196eac78..3678f439 100644 --- a/app/MindWork AI Studio/Settings/DataModel/DataSourceTypeExtension.cs +++ b/app/MindWork AI Studio/Settings/DataModel/DataSourceTypeExtension.cs @@ -1,3 +1,5 @@ +using AIStudio.Tools.PluginSystem; + namespace AIStudio.Settings.DataModel; /// @@ -5,6 +7,8 @@ namespace AIStudio.Settings.DataModel; /// public static class DataSourceTypeExtension { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(DataSourceTypeExtension).Namespace, nameof(DataSourceTypeExtension)); + /// /// Get the display name of the data source type. /// @@ -12,10 +16,10 @@ public static class DataSourceTypeExtension /// The display name of the data source type. public static string GetDisplayName(this DataSourceType type) => type switch { - DataSourceType.LOCAL_FILE => "Local File", - DataSourceType.LOCAL_DIRECTORY => "Local Directory", - DataSourceType.ERI_V1 => "External ERI Server (v1)", + DataSourceType.LOCAL_FILE => TB("Local File"), + DataSourceType.LOCAL_DIRECTORY => TB("Local Directory"), + DataSourceType.ERI_V1 => TB("External ERI Server (v1)"), - _ => "None", + _ => TB("None"), }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/LangBehavior.cs b/app/MindWork AI Studio/Settings/DataModel/LangBehavior.cs new file mode 100644 index 00000000..492d6bca --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/LangBehavior.cs @@ -0,0 +1,7 @@ +namespace AIStudio.Settings.DataModel; + +public enum LangBehavior +{ + AUTO, + MANUAL, +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/LangBehaviorExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/LangBehaviorExtensions.cs new file mode 100644 index 00000000..a480ef36 --- /dev/null +++ b/app/MindWork AI Studio/Settings/DataModel/LangBehaviorExtensions.cs @@ -0,0 +1,16 @@ +using AIStudio.Tools.PluginSystem; + +namespace AIStudio.Settings.DataModel; + +public static class LangBehaviorExtensions +{ + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(LangBehaviorExtensions).Namespace, nameof(LangBehaviorExtensions)); + + public static string Name(this LangBehavior langBehavior) => langBehavior switch + { + LangBehavior.AUTO => TB("Choose the language automatically, based on your system language."), + LangBehavior.MANUAL => TB("Choose the language manually."), + + _ => TB("Unknown option") + }; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs b/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs index ff642a0a..85acedec 100644 --- a/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs +++ b/app/MindWork AI Studio/Settings/DataModel/PreviewFeatures.cs @@ -10,4 +10,5 @@ public enum PreviewFeatures PRE_RAG_2024, PRE_PLUGINS_2025, + PRE_READ_PDF_2025, } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviewFeaturesExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/PreviewFeaturesExtensions.cs index 2eb25587..e99fef96 100644 --- a/app/MindWork AI Studio/Settings/DataModel/PreviewFeaturesExtensions.cs +++ b/app/MindWork AI Studio/Settings/DataModel/PreviewFeaturesExtensions.cs @@ -1,15 +1,42 @@ +using AIStudio.Tools.PluginSystem; + namespace AIStudio.Settings.DataModel; public static class PreviewFeaturesExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(PreviewFeaturesExtensions).Namespace, nameof(PreviewFeaturesExtensions)); + public static string GetPreviewDescription(this PreviewFeatures feature) => feature switch { - PreviewFeatures.PRE_WRITER_MODE_2024 => "Writer Mode: Experiments about how to write long texts using AI", - PreviewFeatures.PRE_RAG_2024 => "RAG: Preview of our RAG implementation where you can refer your files or integrate enterprise data within your company", - PreviewFeatures.PRE_PLUGINS_2025 => "Plugins: Preview of our plugin system where you can extend the functionality of the app", + PreviewFeatures.PRE_WRITER_MODE_2024 => TB("Writer Mode: Experiments about how to write long texts using AI"), + PreviewFeatures.PRE_RAG_2024 => TB("RAG: Preview of our RAG implementation where you can refer your files or integrate enterprise data within your company"), - _ => "Unknown preview feature" + PreviewFeatures.PRE_PLUGINS_2025 => TB("Plugins: Preview of our plugin system where you can extend the functionality of the app"), + PreviewFeatures.PRE_READ_PDF_2025 => TB("Read PDF: Preview of our PDF reading system where you can read and extract text from PDF files"), + + _ => TB("Unknown preview feature") }; - public static bool IsEnabled(this PreviewFeatures feature, SettingsManager settingsManager) => settingsManager.ConfigurationData.App.EnabledPreviewFeatures.Contains(feature); + /// + /// Check if the preview feature is released or not. + /// + /// + /// This metadata is necessary because we cannot remove the enum values from the list. + /// Otherwise, we could not deserialize old settings files that may contain these values. + /// + /// The preview feature to check. + /// True when the preview feature is released, false otherwise. + public static bool IsReleased(this PreviewFeatures feature) => feature switch + { + PreviewFeatures.PRE_READ_PDF_2025 => true, + _ => false + }; + + public static bool IsEnabled(this PreviewFeatures feature, SettingsManager settingsManager) + { + if(feature.IsReleased()) + return true; + + return settingsManager.ConfigurationData.App.EnabledPreviewFeatures.Contains(feature); + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs index b0f07716..6905fc0f 100644 --- a/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs +++ b/app/MindWork AI Studio/Settings/DataModel/PreviewVisibilityExtensions.cs @@ -19,6 +19,7 @@ public static class PreviewVisibilityExtensions if (visibility >= PreviewVisibility.PROTOTYPE) { + features.Add(PreviewFeatures.PRE_READ_PDF_2025); features.Add(PreviewFeatures.PRE_RAG_2024); } diff --git a/app/MindWork AI Studio/Settings/DataModel/SendToChatDataSourceBehaviorExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/SendToChatDataSourceBehaviorExtensions.cs index 3894ba2b..9c8e4ebc 100644 --- a/app/MindWork AI Studio/Settings/DataModel/SendToChatDataSourceBehaviorExtensions.cs +++ b/app/MindWork AI Studio/Settings/DataModel/SendToChatDataSourceBehaviorExtensions.cs @@ -1,12 +1,16 @@ +using AIStudio.Tools.PluginSystem; + namespace AIStudio.Settings.DataModel; public static class SendToChatDataSourceBehaviorExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(SendToChatDataSourceBehaviorExtensions).Namespace, nameof(SendToChatDataSourceBehaviorExtensions)); + public static string Description(this SendToChatDataSourceBehavior behavior) => behavior switch { - SendToChatDataSourceBehavior.NO_DATA_SOURCES => "Use no data sources, when sending an assistant result to a chat", - SendToChatDataSourceBehavior.APPLY_STANDARD_CHAT_DATA_SOURCE_OPTIONS => "Apply standard chat data source options, when sending an assistant result to a chat", + SendToChatDataSourceBehavior.NO_DATA_SOURCES => TB("Use no data sources, when sending an assistant result to a chat"), + SendToChatDataSourceBehavior.APPLY_STANDARD_CHAT_DATA_SOURCE_OPTIONS => TB("Apply standard chat data source options, when sending an assistant result to a chat"), - _ => "Unknown behavior", + _ => TB("Unknown behavior"), }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/DataModel/ThemesExtensions.cs b/app/MindWork AI Studio/Settings/DataModel/ThemesExtensions.cs index 5d36a1bc..128e8d4d 100644 --- a/app/MindWork AI Studio/Settings/DataModel/ThemesExtensions.cs +++ b/app/MindWork AI Studio/Settings/DataModel/ThemesExtensions.cs @@ -1,13 +1,17 @@ +using AIStudio.Tools.PluginSystem; + namespace AIStudio.Settings.DataModel; public static class ThemesExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ThemesExtensions).Namespace, nameof(ThemesExtensions)); + public static string GetName(this Themes theme) => theme switch { - Themes.SYSTEM => "Synchronized with the operating system settings", - Themes.LIGHT => "Always use light theme", - Themes.DARK => "Always use dark theme", + Themes.SYSTEM => TB("Synchronized with the operating system settings"), + Themes.LIGHT => TB("Always use light theme"), + Themes.DARK => TB("Always use dark theme"), - _ => "Unknown setting", + _ => TB("Unknown setting"), }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Settings/IDataSource.cs b/app/MindWork AI Studio/Settings/IDataSource.cs index 7ee47e1c..136a6800 100644 --- a/app/MindWork AI Studio/Settings/IDataSource.cs +++ b/app/MindWork AI Studio/Settings/IDataSource.cs @@ -40,6 +40,11 @@ public interface IDataSource /// public DataSourceSecurity SecurityPolicy { get; init; } + /// + /// The maximum number of matches to return when retrieving data from the ERI server. + /// + public ushort MaxMatches { get; init; } + /// /// Perform the data retrieval process. /// diff --git a/app/MindWork AI Studio/Settings/Profile.cs b/app/MindWork AI Studio/Settings/Profile.cs index b7a7da6e..5e0977f4 100644 --- a/app/MindWork AI Studio/Settings/Profile.cs +++ b/app/MindWork AI Studio/Settings/Profile.cs @@ -1,10 +1,14 @@ +using AIStudio.Tools.PluginSystem; + namespace AIStudio.Settings; public readonly record struct Profile(uint Num, string Id, string Name, string NeedToKnow, string Actions) { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(Profile).Namespace, nameof(Profile)); + public static readonly Profile NO_PROFILE = new() { - Name = "Use no profile", + Name = TB("Use no profile"), NeedToKnow = string.Empty, Actions = string.Empty, Id = Guid.Empty.ToString(), diff --git a/app/MindWork AI Studio/Settings/Provider.cs b/app/MindWork AI Studio/Settings/Provider.cs index b349016d..33d39d3d 100644 --- a/app/MindWork AI Studio/Settings/Provider.cs +++ b/app/MindWork AI Studio/Settings/Provider.cs @@ -1,7 +1,7 @@ using System.Text.Json.Serialization; using AIStudio.Provider; - +using AIStudio.Provider.HuggingFace; using Host = AIStudio.Provider.SelfHosted.Host; namespace AIStudio.Settings; @@ -24,7 +24,8 @@ public readonly record struct Provider( Model Model, bool IsSelfHosted = false, string Hostname = "http://localhost:1234", - Host Host = Host.NONE) : ISecretId + Host Host = Host.NONE, + HFInferenceProvider HFInferenceProvider = HFInferenceProvider.NONE) : ISecretId { #region Overrides of ValueType diff --git a/app/MindWork AI Studio/Settings/SettingsManager.cs b/app/MindWork AI Studio/Settings/SettingsManager.cs index ec74cab8..19423a6e 100644 --- a/app/MindWork AI Studio/Settings/SettingsManager.cs +++ b/app/MindWork AI Studio/Settings/SettingsManager.cs @@ -1,10 +1,10 @@ using System.Diagnostics.CodeAnalysis; using System.Text.Json; -using System.Text.Json.Serialization; using AIStudio.Provider; using AIStudio.Settings.DataModel; using AIStudio.Tools.PluginSystem; +using AIStudio.Tools.Services; // ReSharper disable NotAccessedPositionalProperty.Local @@ -13,18 +13,29 @@ namespace AIStudio.Settings; /// /// The settings manager. /// -public sealed class SettingsManager(ILogger logger) +public sealed class SettingsManager { private const string SETTINGS_FILENAME = "settings.json"; private static readonly JsonSerializerOptions JSON_OPTIONS = new() { WriteIndented = true, - Converters = { new JsonStringEnumConverter() }, + Converters = { new TolerantEnumConverter() }, }; - private readonly ILogger logger = logger; - + private readonly ILogger logger; + private readonly RustService rustService; + + /// + /// The settings manager. + /// + public SettingsManager(ILogger logger, RustService rustService) + { + this.logger = logger; + this.rustService = rustService; + this.logger.LogInformation("Settings manager created."); + } + /// /// The directory where the configuration files are stored. /// @@ -143,8 +154,56 @@ public sealed class SettingsManager(ILogger logger) return minimumLevel; } + /// + /// Checks if the given plugin is enabled. + /// + /// The plugin to check. + /// True, when the plugin is enabled, false otherwise. public bool IsPluginEnabled(IPluginMetadata plugin) => this.ConfigurationData.EnabledPlugins.Contains(plugin.Id); + /// + /// Returns the active language plugin. + /// + /// The active language plugin. + public async Task GetActiveLanguagePlugin() + { + switch (this.ConfigurationData.App.LanguageBehavior) + { + case LangBehavior.AUTO: + var languageCode = await this.rustService.ReadUserLanguage(); + var languagePlugin = PluginFactory.RunningPlugins.FirstOrDefault(x => x is ILanguagePlugin langPlug && langPlug.IETFTag == languageCode); + if (languagePlugin is null) + { + this.logger.LogWarning($"The language plugin for the language '{languageCode}' is not available."); + return PluginFactory.BaseLanguage; + } + + if (languagePlugin is ILanguagePlugin langPlugin) + return langPlugin; + + this.logger.LogError("The language plugin is not a language plugin."); + return PluginFactory.BaseLanguage; + + case LangBehavior.MANUAL: + var pluginId = this.ConfigurationData.App.LanguagePluginId; + var plugin = PluginFactory.RunningPlugins.FirstOrDefault(x => x.Id == pluginId); + if (plugin is null) + { + this.logger.LogWarning($"The chosen language plugin (id='{pluginId}') is not available."); + return PluginFactory.BaseLanguage; + } + + if (plugin is ILanguagePlugin chosenLangPlugin) + return chosenLangPlugin; + + this.logger.LogError("The chosen language plugin is not a language plugin."); + return PluginFactory.BaseLanguage; + } + + this.logger.LogError("The language behavior is unknown."); + return PluginFactory.BaseLanguage; + } + [SuppressMessage("Usage", "MWAIS0001:Direct access to `Providers` is not allowed")] public Provider GetPreselectedProvider(Tools.Components component, string? currentProviderId = null, bool usePreselectionBeforeCurrentProvider = false) { @@ -206,6 +265,16 @@ public sealed class SettingsManager(ILogger logger) preselection = this.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == this.ConfigurationData.App.PreselectedProfile); return preselection != default ? preselection : Profile.NO_PROFILE; } + + public ChatTemplate GetPreselectedChatTemplate(Tools.Components component) + { + var preselection = component.PreselectedChatTemplate(this); + if (preselection != default) + return preselection; + + preselection = this.ConfigurationData.ChatTemplates.FirstOrDefault(x => x.Id == this.ConfigurationData.App.PreselectedChatTemplate); + return preselection != default ? preselection : ChatTemplate.NO_CHAT_TEMPLATE; + } public ConfidenceLevel GetConfiguredConfidenceLevel(LLMProviders llmProvider) { diff --git a/app/MindWork AI Studio/Settings/TolerantEnumConverter.cs b/app/MindWork AI Studio/Settings/TolerantEnumConverter.cs new file mode 100644 index 00000000..c3f8fcd0 --- /dev/null +++ b/app/MindWork AI Studio/Settings/TolerantEnumConverter.cs @@ -0,0 +1,54 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace AIStudio.Settings; + +/// +/// Tries to convert a JSON string to an enum value. +/// +/// +/// When the target enum value does not exist, the value will be the default value. +/// This converter handles enum values as property names and values. +/// +public sealed class TolerantEnumConverter : JsonConverter +{ + private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger(); + + public override bool CanConvert(Type typeToConvert) => typeToConvert.IsEnum; + + public override object? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + // Is this token a string? + if (reader.TokenType == JsonTokenType.String) + // Try to use that string as the name of the enum value: + if (Enum.TryParse(typeToConvert, reader.GetString(), out var result)) + return result; + + // In any other case, we will return the default enum value: + LOG.LogWarning($"Cannot read '{reader.GetString()}' as '{typeToConvert.Name}' enum; token type: {reader.TokenType}"); + return Activator.CreateInstance(typeToConvert); + } + + public override object ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + // Is this token a property name? + if (reader.TokenType == JsonTokenType.PropertyName) + // Try to use that property name as the name of the enum value: + if (Enum.TryParse(typeToConvert, reader.GetString(), out var result)) + return result; + + // In any other case, we will return the default enum value: + LOG.LogWarning($"Cannot read '{reader.GetString()}' as '{typeToConvert.Name}' enum; token type: {reader.TokenType}"); + return Activator.CreateInstance(typeToConvert)!; + } + + public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString()); + } + + public override void WriteAsPropertyName(Utf8JsonWriter writer, object value, JsonSerializerOptions options) + { + writer.WritePropertyName(value.ToString()!); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/AuthMethodsV1Extensions.cs b/app/MindWork AI Studio/Tools/AuthMethodsV1Extensions.cs index 4d11017a..af93103f 100644 --- a/app/MindWork AI Studio/Tools/AuthMethodsV1Extensions.cs +++ b/app/MindWork AI Studio/Tools/AuthMethodsV1Extensions.cs @@ -1,16 +1,19 @@ using AIStudio.Tools.ERIClient.DataModel; +using AIStudio.Tools.PluginSystem; namespace AIStudio.Tools; public static class AuthMethodsV1Extensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(AuthMethodsV1Extensions).Namespace, nameof(AuthMethodsV1Extensions)); + public static string DisplayName(this AuthMethod authMethod) => authMethod switch { - AuthMethod.NONE => "None", - AuthMethod.USERNAME_PASSWORD => "Username & Password", - AuthMethod.KERBEROS => "SSO (Kerberos)", - AuthMethod.TOKEN => "Access Token", + AuthMethod.NONE => TB("None"), + AuthMethod.USERNAME_PASSWORD => TB("Username & Password"), + AuthMethod.KERBEROS => TB("SSO (Kerberos)"), + AuthMethod.TOKEN => TB("Access Token"), - _ => "Unknown authentication method", + _ => TB("Unknown authentication method"), }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ButtonData.cs b/app/MindWork AI Studio/Tools/ButtonData.cs index 3d05dee8..da0c69c3 100644 --- a/app/MindWork AI Studio/Tools/ButtonData.cs +++ b/app/MindWork AI Studio/Tools/ButtonData.cs @@ -1,6 +1,21 @@ namespace AIStudio.Tools; -public readonly record struct ButtonData(string Text, string Icon, Color Color, string Tooltip, Func AsyncAction) : IButtonData +public readonly record struct ButtonData(string Text, string Icon, Color Color, string Tooltip, Func AsyncAction, Func? DisabledActionParam) : IButtonData { public ButtonTypes Type => ButtonTypes.BUTTON; + + public Func DisabledAction + { + get + { + var data = this; + return () => + { + if (data.DisabledActionParam is null) + return false; + + return data.DisabledActionParam(); + }; + } + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ChatTemplateExtensions.cs b/app/MindWork AI Studio/Tools/ChatTemplateExtensions.cs new file mode 100644 index 00000000..28b5f4e7 --- /dev/null +++ b/app/MindWork AI Studio/Tools/ChatTemplateExtensions.cs @@ -0,0 +1,13 @@ +using AIStudio.Settings; + +namespace AIStudio.Tools; + +public static class ChatTemplateExtensions +{ + public static IEnumerable GetAllChatTemplates(this IEnumerable chatTemplates) + { + yield return ChatTemplate.NO_CHAT_TEMPLATE; + foreach (var chatTemplate in chatTemplates) + yield return chatTemplate; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/CommonLanguageExtensions.cs b/app/MindWork AI Studio/Tools/CommonLanguageExtensions.cs index 96dfafe0..d50a478c 100644 --- a/app/MindWork AI Studio/Tools/CommonLanguageExtensions.cs +++ b/app/MindWork AI Studio/Tools/CommonLanguageExtensions.cs @@ -1,23 +1,47 @@ +using AIStudio.Tools.PluginSystem; + namespace AIStudio.Tools; public static class CommonLanguageExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(CommonLanguageExtensions).Namespace, nameof(CommonLanguageExtensions)); + public static string Name(this CommonLanguages language) => language switch { - CommonLanguages.AS_IS => "Do not change the language", + CommonLanguages.AS_IS => TB("Do not change the language"), - CommonLanguages.EN_US => "English (US)", - CommonLanguages.EN_GB => "English (UK)", - CommonLanguages.ZH_CN => "Chinese (Simplified)", - CommonLanguages.HI_IN => "Hindi (India)", - CommonLanguages.ES_ES => "Spanish (Spain)", - CommonLanguages.FR_FR => "French (France)", - CommonLanguages.DE_DE => "German (Germany)", - CommonLanguages.DE_AT => "German (Austria)", - CommonLanguages.DE_CH => "German (Switzerland)", - CommonLanguages.JA_JP => "Japanese (Japan)", + CommonLanguages.EN_US => TB("English (US)"), + CommonLanguages.EN_GB => TB("English (UK)"), + CommonLanguages.ZH_CN => TB("Chinese (Simplified)"), + CommonLanguages.HI_IN => TB("Hindi (India)"), + CommonLanguages.ES_ES => TB("Spanish (Spain)"), + CommonLanguages.FR_FR => TB("French (France)"), + CommonLanguages.DE_DE => TB("German (Germany)"), + CommonLanguages.DE_AT => TB("German (Austria)"), + CommonLanguages.DE_CH => TB("German (Switzerland)"), + CommonLanguages.JA_JP => TB("Japanese (Japan)"), + CommonLanguages.RU_RU => TB("Russian (Russia)"), - _ => "Other", + _ => TB("Other"), + }; + + public static string ToIETFTag(this CommonLanguages language) => language switch + { + CommonLanguages.AS_IS => string.Empty, + + CommonLanguages.EN_US => "en-US", + CommonLanguages.EN_GB => "en-GB", + CommonLanguages.ZH_CN => "zh-CN", + CommonLanguages.HI_IN => "hi-IN", + CommonLanguages.ES_ES => "es-ES", + CommonLanguages.FR_FR => "fr-FR", + CommonLanguages.DE_DE => "de-DE", + CommonLanguages.DE_AT => "de-AT", + CommonLanguages.DE_CH => "de-CH", + CommonLanguages.JA_JP => "ja-JP", + CommonLanguages.RU_RU => "ru-RU", + + _ => string.Empty, }; public static string PromptSummarizing(this CommonLanguages language, string customLanguage) => language switch @@ -38,7 +62,7 @@ public static class CommonLanguageExtensions public static string NameSelecting(this CommonLanguages language) { if(language is CommonLanguages.AS_IS) - return "Please select the target language"; + return TB("Please select the target language"); return language.Name(); } @@ -46,7 +70,7 @@ public static class CommonLanguageExtensions public static string NameSelectingOptional(this CommonLanguages language) { if(language is CommonLanguages.AS_IS) - return "Do not specify the language"; + return TB("Do not specify the language"); return language.Name(); } diff --git a/app/MindWork AI Studio/Tools/CommonLanguages.cs b/app/MindWork AI Studio/Tools/CommonLanguages.cs index afa83f6a..7fa261f9 100644 --- a/app/MindWork AI Studio/Tools/CommonLanguages.cs +++ b/app/MindWork AI Studio/Tools/CommonLanguages.cs @@ -14,6 +14,7 @@ public enum CommonLanguages DE_CH, DE_AT, JA_JP, + RU_RU, OTHER, } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Components.cs b/app/MindWork AI Studio/Tools/Components.cs index d65a5c5d..94148d5e 100644 --- a/app/MindWork AI Studio/Tools/Components.cs +++ b/app/MindWork AI Studio/Tools/Components.cs @@ -19,6 +19,10 @@ public enum Components BIAS_DAY_ASSISTANT, ERI_ASSISTANT, + // ReSharper disable InconsistentNaming + I18N_ASSISTANT, + // ReSharper restore InconsistentNaming + CHAT, APP_SETTINGS, diff --git a/app/MindWork AI Studio/Tools/ComponentsExtensions.cs b/app/MindWork AI Studio/Tools/ComponentsExtensions.cs index 6112debb..e4bd317c 100644 --- a/app/MindWork AI Studio/Tools/ComponentsExtensions.cs +++ b/app/MindWork AI Studio/Tools/ComponentsExtensions.cs @@ -1,17 +1,22 @@ using System.Diagnostics.CodeAnalysis; - using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; namespace AIStudio.Tools; public static class ComponentsExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ComponentsExtensions).Namespace, nameof(ComponentsExtensions)); + public static bool AllowSendTo(this Components component) => component switch { Components.NONE => false, + Components.ERI_ASSISTANT => false, Components.BIAS_DAY_ASSISTANT => false, + Components.I18N_ASSISTANT => false, + Components.APP_SETTINGS => false, Components.AGENT_TEXT_CONTENT_CLEANER => false, @@ -23,21 +28,22 @@ public static class ComponentsExtensions public static string Name(this Components component) => component switch { - Components.GRAMMAR_SPELLING_ASSISTANT => "Grammar & Spelling Assistant", - Components.TEXT_SUMMARIZER_ASSISTANT => "Text Summarizer Assistant", - Components.ICON_FINDER_ASSISTANT => "Icon Finder Assistant", - Components.TRANSLATION_ASSISTANT => "Translation Assistant", - Components.REWRITE_ASSISTANT => "Rewrite Assistant", - Components.AGENDA_ASSISTANT => "Agenda Assistant", - Components.CODING_ASSISTANT => "Coding Assistant", - Components.EMAIL_ASSISTANT => "E-Mail Assistant", - Components.LEGAL_CHECK_ASSISTANT => "Legal Check Assistant", - Components.SYNONYMS_ASSISTANT => "Synonym Assistant", - Components.MY_TASKS_ASSISTANT => "My Tasks Assistant", - Components.JOB_POSTING_ASSISTANT => "Job Posting Assistant", - Components.ERI_ASSISTANT => "ERI Server", + Components.GRAMMAR_SPELLING_ASSISTANT => TB("Grammar & Spelling Assistant"), + Components.TEXT_SUMMARIZER_ASSISTANT => TB("Text Summarizer Assistant"), + Components.ICON_FINDER_ASSISTANT => TB("Icon Finder Assistant"), + Components.TRANSLATION_ASSISTANT => TB("Translation Assistant"), + Components.REWRITE_ASSISTANT => TB("Rewrite Assistant"), + Components.AGENDA_ASSISTANT => TB("Agenda Assistant"), + Components.CODING_ASSISTANT => TB("Coding Assistant"), + Components.EMAIL_ASSISTANT => TB("E-Mail Assistant"), + Components.LEGAL_CHECK_ASSISTANT => TB("Legal Check Assistant"), + Components.SYNONYMS_ASSISTANT => TB("Synonym Assistant"), + Components.MY_TASKS_ASSISTANT => TB("My Tasks Assistant"), + Components.JOB_POSTING_ASSISTANT => TB("Job Posting Assistant"), + Components.ERI_ASSISTANT => TB("ERI Server"), + Components.I18N_ASSISTANT => TB("Localization Assistant"), - Components.CHAT => "New Chat", + Components.CHAT => TB("New Chat"), _ => Enum.GetName(typeof(Components), component)!, }; @@ -99,6 +105,7 @@ public static class ComponentsExtensions Components.JOB_POSTING_ASSISTANT => settingsManager.ConfigurationData.JobPostings.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.JobPostings.PreselectedProvider) : default, Components.BIAS_DAY_ASSISTANT => settingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.BiasOfTheDay.PreselectedProvider) : default, Components.ERI_ASSISTANT => settingsManager.ConfigurationData.ERI.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.ERI.PreselectedProvider) : default, + Components.I18N_ASSISTANT => settingsManager.ConfigurationData.I18N.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.I18N.PreselectedProvider) : default, Components.CHAT => settingsManager.ConfigurationData.Chat.PreselectOptions ? settingsManager.ConfigurationData.Providers.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Chat.PreselectedProvider) : default, @@ -123,4 +130,11 @@ public static class ComponentsExtensions _ => default, }; + + public static ChatTemplate PreselectedChatTemplate(this Components component, SettingsManager settingsManager) => component switch + { + Components.CHAT => settingsManager.ConfigurationData.Chat.PreselectOptions ? settingsManager.ConfigurationData.ChatTemplates.FirstOrDefault(x => x.Id == settingsManager.ConfigurationData.Chat.PreselectedChatTemplate) : default, + + _ => default, + }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ConfidenceSchemesExtensions.cs b/app/MindWork AI Studio/Tools/ConfidenceSchemesExtensions.cs index 035be948..52ea512b 100644 --- a/app/MindWork AI Studio/Tools/ConfidenceSchemesExtensions.cs +++ b/app/MindWork AI Studio/Tools/ConfidenceSchemesExtensions.cs @@ -1,18 +1,22 @@ +using AIStudio.Tools.PluginSystem; + namespace AIStudio.Tools; public static class ConfidenceSchemesExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ConfidenceSchemesExtensions).Namespace, nameof(ConfidenceSchemesExtensions)); + public static string GetListDescription(this ConfidenceSchemes scheme) => scheme switch { - ConfidenceSchemes.TRUST_ALL => "Trust all LLM providers", - ConfidenceSchemes.TRUST_USA_EUROPE => "Trust LLM providers from the USA and Europe", - ConfidenceSchemes.TRUST_USA => "Trust LLM providers from the USA", - ConfidenceSchemes.TRUST_EUROPE => "Trust LLM providers from Europe", - ConfidenceSchemes.TRUST_ASIA => "Trust LLM providers from Asia", - ConfidenceSchemes.LOCAL_TRUST_ONLY => "Trust only local LLM providers", + ConfidenceSchemes.TRUST_ALL => TB("Trust all LLM providers"), + ConfidenceSchemes.TRUST_USA_EUROPE => TB("Trust LLM providers from the USA and Europe"), + ConfidenceSchemes.TRUST_USA => TB("Trust LLM providers from the USA"), + ConfidenceSchemes.TRUST_EUROPE => TB("Trust LLM providers from Europe"), + ConfidenceSchemes.TRUST_ASIA => TB("Trust LLM providers from Asia"), + ConfidenceSchemes.LOCAL_TRUST_ONLY => TB("Trust only local LLM providers"), - ConfidenceSchemes.CUSTOM => "Configure your own confidence scheme", + ConfidenceSchemes.CUSTOM => TB("Configure your own confidence scheme"), - _ => "Unknown confidence scheme" + _ => TB("Unknown confidence scheme"), }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/DataModel/ProviderTypeExtensions.cs b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ProviderTypeExtensions.cs index ecdbcc19..643d48b5 100644 --- a/app/MindWork AI Studio/Tools/ERIClient/DataModel/ProviderTypeExtensions.cs +++ b/app/MindWork AI Studio/Tools/ERIClient/DataModel/ProviderTypeExtensions.cs @@ -1,13 +1,17 @@ +using AIStudio.Tools.PluginSystem; + namespace AIStudio.Tools.ERIClient.DataModel; public static class ProviderTypeExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ProviderTypeExtensions).Namespace, nameof(ProviderTypeExtensions)); + public static string Explain(this ProviderType providerType) => providerType switch { - ProviderType.NONE => "The related data is not allowed to be sent to any LLM provider. This means that this data source cannot be used at the moment.", - ProviderType.ANY => "The related data can be sent to any provider, regardless of where it is hosted (cloud or self-hosted).", - ProviderType.SELF_HOSTED => "The related data can be sent to a provider that is hosted by the same organization, either on-premises or locally. Cloud-based providers are not allowed.", + ProviderType.NONE => TB("The related data is not allowed to be sent to any LLM provider. This means that this data source cannot be used at the moment."), + ProviderType.ANY => TB("The related data can be sent to any provider, regardless of where it is hosted (cloud or self-hosted)."), + ProviderType.SELF_HOSTED => TB("The related data can be sent to a provider that is hosted by the same organization, either on-premises or locally. Cloud-based providers are not allowed."), - _ => "Unknown configuration. This data source cannot be used at the moment.", + _ => TB("Unknown configuration. This data source cannot be used at the moment."), }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/ERIClient/ERIClientV1.cs b/app/MindWork AI Studio/Tools/ERIClient/ERIClientV1.cs index 178849dd..3769fcbf 100644 --- a/app/MindWork AI Studio/Tools/ERIClient/ERIClientV1.cs +++ b/app/MindWork AI Studio/Tools/ERIClient/ERIClientV1.cs @@ -3,12 +3,15 @@ using System.Text.Json; using AIStudio.Settings; using AIStudio.Tools.ERIClient.DataModel; +using AIStudio.Tools.PluginSystem; using AIStudio.Tools.Services; namespace AIStudio.Tools.ERIClient; public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), IERIClient { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ERIClientV1).Namespace, nameof(ERIClientV1)); + #region Implementation of IERIClient public async Task>> GetAuthMethodsAsync(CancellationToken cancellationToken = default) @@ -21,7 +24,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to retrieve the authentication methods: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + Message = string.Format(TB("Failed to retrieve the authentication methods: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}"), response.StatusCode, response.ReasonPhrase) }; } @@ -31,7 +34,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the authentication methods: the ERI server did not return a valid response." + Message = TB("Failed to retrieve the authentication methods: the ERI server did not return a valid response.") }; } @@ -46,7 +49,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the authentication methods: the request was canceled either by the user or due to a timeout." + Message = TB("Failed to retrieve the authentication methods: the request was canceled either by the user or due to a timeout.") }; } catch (Exception e) @@ -54,7 +57,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to retrieve the authentication methods due to an exception: {e.Message}" + Message = string.Format(TB("Failed to retrieve the authentication methods due to an exception: {0}"), e.Message) }; } } @@ -76,7 +79,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to authenticate with the ERI server. Code: {noneAuthResponse.StatusCode}, Reason: {noneAuthResponse.ReasonPhrase}" + Message = string.Format(TB("Failed to authenticate with the ERI server. Code: {0}, Reason: {1}"), noneAuthResponse.StatusCode, noneAuthResponse.ReasonPhrase) }; } @@ -86,7 +89,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to authenticate with the ERI server: the response was invalid." + Message = TB("Failed to authenticate with the ERI server: the response was invalid.") }; } @@ -108,7 +111,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the password." + Message = TB("Failed to retrieve the password.") }; } @@ -130,7 +133,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to authenticate with the ERI server. Code: {usernamePasswordAuthResponse.StatusCode}, Reason: {usernamePasswordAuthResponse.ReasonPhrase}" + Message = string.Format(TB("Failed to authenticate with the ERI server. Code: {0}, Reason: {1}"), usernamePasswordAuthResponse.StatusCode, usernamePasswordAuthResponse.ReasonPhrase) }; } @@ -140,7 +143,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to authenticate with the server: the response was invalid." + Message = TB("Failed to authenticate with the server: the response was invalid.") }; } @@ -162,7 +165,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the access token." + Message = TB("Failed to retrieve the access token.") }; } @@ -181,7 +184,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to authenticate with the ERI server. Code: {tokenAuthResponse.StatusCode}, Reason: {tokenAuthResponse.ReasonPhrase}" + Message = string.Format(TB("Failed to authenticate with the ERI server. Code: {0}, Reason: {1}"), tokenAuthResponse.StatusCode, tokenAuthResponse.ReasonPhrase) }; } @@ -191,7 +194,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to authenticate with the ERI server: the response was invalid." + Message = TB("Failed to authenticate with the ERI server: the response was invalid.") }; } @@ -208,7 +211,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "The authentication method is not supported yet." + Message = TB("The authentication method is not supported yet.") }; } } @@ -217,7 +220,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to authenticate with the ERI server: the request was canceled either by the user or due to a timeout." + Message = TB("Failed to authenticate with the ERI server: the request was canceled either by the user or due to a timeout.") }; } catch (Exception e) @@ -225,7 +228,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to authenticate with the ERI server due to an exception: {e.Message}" + Message = string.Format(TB("Failed to authenticate with the ERI server due to an exception: {0}"), e.Message) }; } } @@ -243,7 +246,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to retrieve the data source information: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + Message = string.Format(TB("Failed to retrieve the data source information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}"), response.StatusCode, response.ReasonPhrase) }; } @@ -253,7 +256,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the data source information: the ERI server did not return a valid response." + Message = TB("Failed to retrieve the data source information: the ERI server did not return a valid response.") }; } @@ -268,7 +271,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the data source information: the request was canceled either by the user or due to a timeout." + Message = TB("Failed to retrieve the data source information: the request was canceled either by the user or due to a timeout.") }; } catch (Exception e) @@ -276,7 +279,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to retrieve the data source information due to an exception: {e.Message}" + Message = string.Format(TB("Failed to retrieve the data source information due to an exception: {0}"), e.Message) }; } } @@ -294,7 +297,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to retrieve the embedding information: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + Message = string.Format(TB("Failed to retrieve the embedding information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}"), response.StatusCode, response.ReasonPhrase) }; } @@ -304,7 +307,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the embedding information: the ERI server did not return a valid response." + Message = TB("Failed to retrieve the embedding information: the ERI server did not return a valid response.") }; } @@ -319,7 +322,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the embedding information: the request was canceled either by the user or due to a timeout." + Message = TB("Failed to retrieve the embedding information: the request was canceled either by the user or due to a timeout.") }; } catch (Exception e) @@ -327,7 +330,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to retrieve the embedding information due to an exception: {e.Message}" + Message = string.Format(TB("Failed to retrieve the embedding information due to an exception: {0}"), e.Message) }; } } @@ -345,7 +348,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to retrieve the retrieval information: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + Message = string.Format(TB("Failed to retrieve the retrieval information: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}"), response.StatusCode, response.ReasonPhrase) }; } @@ -355,7 +358,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the retrieval information: the ERI server did not return a valid response." + Message = TB("Failed to retrieve the retrieval information: the ERI server did not return a valid response.") }; } @@ -370,7 +373,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the retrieval information: the request was canceled either by the user or due to a timeout." + Message = TB("Failed to retrieve the retrieval information: the request was canceled either by the user or due to a timeout.") }; } catch (Exception e) @@ -378,7 +381,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to retrieve the retrieval information due to an exception: {e.Message}" + Message = string.Format(TB("Failed to retrieve the retrieval information due to an exception: {0}"), e.Message) }; } } @@ -399,7 +402,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to execute the retrieval request: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + Message = string.Format(TB("Failed to execute the retrieval request: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}"), response.StatusCode, response.ReasonPhrase) }; } @@ -409,7 +412,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to execute the retrieval request: the ERI server did not return a valid response." + Message = TB("Failed to execute the retrieval request: the ERI server did not return a valid response.") }; } @@ -424,7 +427,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to execute the retrieval request: the request was canceled either by the user or due to a timeout." + Message = TB("Failed to execute the retrieval request: the request was canceled either by the user or due to a timeout.") }; } catch (Exception e) @@ -432,7 +435,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to execute the retrieval request due to an exception: {e.Message}" + Message = string.Format(TB("Failed to execute the retrieval request due to an exception: {0}"), e.Message) }; } } @@ -450,7 +453,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to retrieve the security requirements: there was an issue communicating with the ERI server. Code: {response.StatusCode}, Reason: {response.ReasonPhrase}" + Message = string.Format(TB("Failed to retrieve the security requirements: there was an issue communicating with the ERI server. Code: {0}, Reason: {1}"), response.StatusCode, response.ReasonPhrase) }; } @@ -460,7 +463,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the security requirements: the ERI server did not return a valid response." + Message = TB("Failed to retrieve the security requirements: the ERI server did not return a valid response.") }; } @@ -475,7 +478,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = "Failed to retrieve the security requirements: the request was canceled either by the user or due to a timeout." + Message = TB("Failed to retrieve the security requirements: the request was canceled either by the user or due to a timeout.") }; } catch (Exception e) @@ -483,7 +486,7 @@ public class ERIClientV1(IERIDataSource dataSource) : ERIClientBase(dataSource), return new() { Successful = false, - Message = $"Failed to retrieve the security requirements due to an exception: {e.Message}" + Message = string.Format(TB("Failed to retrieve the security requirements due to an exception: {0}"), e.Message) }; } } diff --git a/app/MindWork AI Studio/Tools/EnvFile.cs b/app/MindWork AI Studio/Tools/EnvFile.cs new file mode 100644 index 00000000..ad71cf47 --- /dev/null +++ b/app/MindWork AI Studio/Tools/EnvFile.cs @@ -0,0 +1,41 @@ +#if DEBUG +using System.Text; + +namespace AIStudio.Tools; + +/// +/// Read environment variables for the application from an .env file. +/// +/// +/// We consider this feature a security issue. Therefore, it is only +/// available in DEBUG mode. To ensure this, we remove the code +/// from any release build. +/// +public static class EnvFile +{ + public static async Task Apply(string filePath) + { + if(!File.Exists(filePath)) + { + Console.WriteLine($"Error: The .env file '{filePath}' does not exist."); + return; + } + + var lines = await File.ReadAllLinesAsync(filePath, Encoding.UTF8); + foreach (var line in lines) + { + if (string.IsNullOrWhiteSpace(line) || line.Trim().StartsWith('#')) + continue; + + var parts = line.Split(['='], 2); + if (parts.Length != 2) + continue; + + var key = parts[0].Trim(); + var value = parts[1].Trim(); + + Environment.SetEnvironmentVariable(key, value); + } + } +} +#endif \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Event.cs b/app/MindWork AI Studio/Tools/Event.cs index ab6fb318..9741868d 100644 --- a/app/MindWork AI Studio/Tools/Event.cs +++ b/app/MindWork AI Studio/Tools/Event.cs @@ -8,6 +8,7 @@ public enum Event STATE_HAS_CHANGED, CONFIGURATION_CHANGED, COLOR_THEME_CHANGED, + STARTUP_PLUGIN_SYSTEM, PLUGINS_RELOADED, SHOW_ERROR, SHOW_WARNING, diff --git a/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs b/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs index 044e425b..019ce115 100644 --- a/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs +++ b/app/MindWork AI Studio/Tools/IMessageBusReceiver.cs @@ -4,8 +4,6 @@ namespace AIStudio.Tools; public interface IMessageBusReceiver { - public string ComponentName { get; } - public Task ProcessMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data); public Task ProcessMessageWithResult(ComponentBase? sendingComponent, Event triggeredEvent, TPayload? data); diff --git a/app/MindWork AI Studio/Tools/MessageBus.cs b/app/MindWork AI Studio/Tools/MessageBus.cs index 7ed7cf72..e37e54fc 100644 --- a/app/MindWork AI Studio/Tools/MessageBus.cs +++ b/app/MindWork AI Studio/Tools/MessageBus.cs @@ -19,9 +19,15 @@ public sealed class MessageBus { } - public void ApplyFilters(IMessageBusReceiver receiver, ComponentBase[] components, Event[] events) + /// + /// Define for which components and events you want to receive messages. + /// + /// That's you, the receiver. + /// A list of components for which you want to receive messages. Use an empty list to receive messages from all components. + /// A list of events for which you want to receive messages. + public void ApplyFilters(IMessageBusReceiver receiver, ComponentBase[] filterComponents, Event[] events) { - this.componentFilters[receiver] = components; + this.componentFilters[receiver] = filterComponents; this.componentEvents[receiver] = events; } diff --git a/app/MindWork AI Studio/Tools/Metadata/MetaDataArchitecture.cs b/app/MindWork AI Studio/Tools/Metadata/MetaDataArchitecture.cs new file mode 100644 index 00000000..e37675d9 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Metadata/MetaDataArchitecture.cs @@ -0,0 +1,8 @@ +// ReSharper disable ClassNeverInstantiated.Global +namespace AIStudio.Tools.Metadata; + +[AttributeUsage(AttributeTargets.Assembly)] +public class MetaDataArchitectureAttribute(string architecture) : Attribute +{ + public string Architecture => architecture; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Metadata/MetaDataAttribute.cs b/app/MindWork AI Studio/Tools/Metadata/MetaDataAttribute.cs new file mode 100644 index 00000000..36668829 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Metadata/MetaDataAttribute.cs @@ -0,0 +1,34 @@ +// ReSharper disable ClassNeverInstantiated.Global +namespace AIStudio.Tools.Metadata; + +[AttributeUsage(AttributeTargets.Assembly)] +public class MetaDataAttribute( + string version, + string buildTime, + uint buildNum, + string dotnetSdkVersion, + string dotnetVersion, + string rustVersion, + string mudBlazorVersion, + string tauriVersion, + string appCommitHash + ) : Attribute +{ + public string BuildTime => buildTime; + + public string Version => version; + + public uint BuildNum => buildNum; + + public string DotnetVersion => dotnetVersion; + + public string DotnetSdkVersion => dotnetSdkVersion; + + public string RustVersion => rustVersion; + + public string MudBlazorVersion => mudBlazorVersion; + + public string TauriVersion => tauriVersion; + + public string AppCommitHash => appCommitHash; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Metadata/MetaDataLibrariesAttribute.cs b/app/MindWork AI Studio/Tools/Metadata/MetaDataLibrariesAttribute.cs new file mode 100644 index 00000000..d8e70240 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Metadata/MetaDataLibrariesAttribute.cs @@ -0,0 +1,6 @@ +namespace AIStudio.Tools.Metadata; + +public class MetaDataLibrariesAttribute(string pdfiumVersion) : Attribute +{ + public string PdfiumVersion => pdfiumVersion; +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/I18N.cs b/app/MindWork AI Studio/Tools/PluginSystem/I18N.cs new file mode 100644 index 00000000..869f01ca --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/I18N.cs @@ -0,0 +1,36 @@ +namespace AIStudio.Tools.PluginSystem; + +public class I18N : ILang +{ + public static readonly I18N I = new(); + private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger(); + + private ILanguagePlugin? language = PluginFactory.BaseLanguage; + + private I18N() + { + } + + public static void Init(ILanguagePlugin language) => I.language = language; + + #region Implementation of ILang + + public string T(string fallbackEN) + { + LOG.LogWarning("Using I18N.I.T without namespace and type is probably wrong, because the I18N key collection process of the build system will not find those keys."); + if(this.language is not null) + return this.GetText(this.language, fallbackEN); + + return fallbackEN; + } + + public string T(string fallbackEN, string? typeNamespace, string? typeName) + { + if(this.language is not null) + return this.GetText(this.language, fallbackEN, typeNamespace, typeName); + + return fallbackEN; + } + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/IAvailablePlugin.cs b/app/MindWork AI Studio/Tools/PluginSystem/IAvailablePlugin.cs new file mode 100644 index 00000000..a992d303 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/IAvailablePlugin.cs @@ -0,0 +1,6 @@ +namespace AIStudio.Tools.PluginSystem; + +public interface IAvailablePlugin : IPluginMetadata +{ + public string LocalPath { get; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/ILang.cs b/app/MindWork AI Studio/Tools/PluginSystem/ILang.cs new file mode 100644 index 00000000..ee6ca554 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/ILang.cs @@ -0,0 +1,41 @@ +namespace AIStudio.Tools.PluginSystem; + +/// +/// Represents a contract to access text from a language plugin. +/// +public interface ILang +{ + /// + /// Tries to get a text from the language plugin. + /// + /// + /// The given fallback text is used to determine the key for + /// the language plugin. Base for the key is the namespace of + /// the using component and the fallback text in English (US). + /// The given text getting hashed. When the key does not exist, + /// the fallback text will be returned. + /// + /// The fallback text in English (US). + /// The text from the language plugin or the fallback text. + public string T(string fallbackEN); + + /// + /// Tries to get a text from the language plugin. + /// + /// + /// The given fallback text is used to determine the key for + /// the language plugin. Base for the key is the namespace of + /// the using component and the fallback text in English (US). + /// The given text is hashed. When the key does not exist, + /// the fallback text will be returned.
+ ///
+ /// You might predefine the namespace and type. This is needed + /// when your abstract base class component wants to localize + /// text as well. + ///
+ /// The fallback text in English (US). + /// The namespace of the type requesting the text, used as part of the key. + /// The name of the type requesting the text, used as part of the key. + /// The text from the language plugin or the fallback text. + public string T(string fallbackEN, string? typeNamespace, string? typeName); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/ILangExtensions.cs b/app/MindWork AI Studio/Tools/PluginSystem/ILangExtensions.cs new file mode 100644 index 00000000..61abbf42 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/ILangExtensions.cs @@ -0,0 +1,36 @@ +using SharedTools; + +namespace AIStudio.Tools.PluginSystem; + +public static class ILangExtensions +{ + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + + public static string GetText(this ILang lang, ILanguagePlugin plugin, string fallbackEN, string? typeNamespace = null, string? typeName = null) + { + var type = lang.GetType(); + typeName ??= type.Name; + typeNamespace ??= type.Namespace!; + + // When the type's name ends with `1 or `2, etc. (i.e., generic classes), remove it: + if(typeName.Contains('`')) + typeName = typeName[..typeName.IndexOf('`')]; + + var ns = $"{typeNamespace}::{typeName}".ToUpperInvariant().Replace(".", "::"); + var key = $"root::{ns}::T{fallbackEN.ToFNV32()}"; + + if(plugin is NoPluginLanguage) + return fallbackEN; + + if(plugin.TryGetText(key, out var text, logWarning: false)) + { + if(string.IsNullOrWhiteSpace(text)) + return fallbackEN; + + return text; + } + + LOGGER.LogDebug($"Missing translation key '{key}' for content '{fallbackEN}'."); + return fallbackEN; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/ILanguagePlugin.cs b/app/MindWork AI Studio/Tools/PluginSystem/ILanguagePlugin.cs index a33bf3f5..869331da 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/ILanguagePlugin.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/ILanguagePlugin.cs @@ -16,6 +16,22 @@ public interface ILanguagePlugin /// /// The key to use to get the text. /// The desired text. + /// When true, a warning will be logged if the key does not exist. /// True if the key exists, false otherwise. - public bool TryGetText(string key, out string value); + public bool TryGetText(string key, out string value, bool logWarning = false); + + /// + /// Gets the IETF tag of the language plugin. + /// + public string IETFTag { get; } + + /// + /// Gets the name of the language. + /// + public string LangName { get; } + + /// + /// Get all keys and texts from the language plugin. + /// + public IReadOnlyDictionary Content { get; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/NoPluginLanguage.cs b/app/MindWork AI Studio/Tools/PluginSystem/NoPluginLanguage.cs new file mode 100644 index 00000000..bb8ec4fc --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/NoPluginLanguage.cs @@ -0,0 +1,28 @@ +using Lua; + +namespace AIStudio.Tools.PluginSystem; + +public sealed class NoPluginLanguage : PluginBase, ILanguagePlugin +{ + public static readonly NoPluginLanguage INSTANCE = new(); + + private NoPluginLanguage() : base(true, LuaState.Create(), PluginType.LANGUAGE, string.Empty) + { + } + + #region Implementation of ILanguagePlugin + + public bool TryGetText(string key, out string value, bool logWarning = false) + { + value = string.Empty; + return true; + } + + public string IETFTag => string.Empty; + + public string LangName => string.Empty; + + public IReadOnlyDictionary Content => new Dictionary(); + + #endregion +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginBase.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginBase.cs index 2674d4db..e6e8707a 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginBase.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginBase.cs @@ -8,6 +8,8 @@ namespace AIStudio.Tools.PluginSystem; /// public abstract partial class PluginBase : IPluginMetadata { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(PluginBase).Namespace, nameof(PluginBase)); + private readonly IReadOnlyCollection baseIssues; protected readonly LuaState state; @@ -155,21 +157,21 @@ public abstract partial class PluginBase : IPluginMetadata { if (!this.state.Environment["ID"].TryRead(out var idText)) { - message = "The field ID does not exist or is not a valid string."; + message = TB("The field ID does not exist or is not a valid string."); id = Guid.Empty; return false; } if (!Guid.TryParse(idText, out id)) { - message = "The field ID is not a valid GUID / UUID. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)."; + message = TB("The field ID is not a valid GUID / UUID. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)."); id = Guid.Empty; return false; } if(id == Guid.Empty) { - message = "The field ID is empty. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)."; + message = TB("The field ID is empty. The ID must be formatted in the 8-4-4-4-12 format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)."); return false; } @@ -187,14 +189,14 @@ public abstract partial class PluginBase : IPluginMetadata { if (!this.state.Environment["NAME"].TryRead(out name)) { - message = "The field NAME does not exist or is not a valid string."; + message = TB("The field NAME does not exist or is not a valid string."); name = string.Empty; return false; } if(string.IsNullOrWhiteSpace(name)) { - message = "The field NAME is empty. The name must be a non-empty string."; + message = TB("The field NAME is empty. The name must be a non-empty string."); return false; } @@ -212,14 +214,14 @@ public abstract partial class PluginBase : IPluginMetadata { if (!this.state.Environment["DESCRIPTION"].TryRead(out description)) { - message = "The field DESCRIPTION does not exist or is not a valid string."; + message = TB("The field DESCRIPTION does not exist or is not a valid string."); description = string.Empty; return false; } if(string.IsNullOrWhiteSpace(description)) { - message = "The field DESCRIPTION is empty. The description must be a non-empty string."; + message = TB("The field DESCRIPTION is empty. The description must be a non-empty string."); return false; } @@ -237,21 +239,21 @@ public abstract partial class PluginBase : IPluginMetadata { if (!this.state.Environment["VERSION"].TryRead(out var versionText)) { - message = "The field VERSION does not exist or is not a valid string."; + message = TB("The field VERSION does not exist or is not a valid string."); version = PluginVersion.NONE; return false; } if (!PluginVersion.TryParse(versionText, out version)) { - message = "The field VERSION is not a valid version number. The version number must be formatted as string in the major.minor.patch format (X.X.X)."; + message = TB("The field VERSION is not a valid version number. The version number must be formatted as string in the major.minor.patch format (X.X.X)."); version = PluginVersion.NONE; return false; } if(version == PluginVersion.NONE) { - message = "The field VERSION is empty. The version number must be formatted as string in the major.minor.patch format (X.X.X)."; + message = TB("The field VERSION is empty. The version number must be formatted as string in the major.minor.patch format (X.X.X)."); return false; } @@ -270,7 +272,7 @@ public abstract partial class PluginBase : IPluginMetadata if (!this.state.Environment["AUTHORS"].TryRead(out var authorsTable)) { authors = []; - message = "The table AUTHORS does not exist or is using an invalid syntax."; + message = TB("The table AUTHORS does not exist or is using an invalid syntax."); return false; } @@ -282,7 +284,7 @@ public abstract partial class PluginBase : IPluginMetadata authors = authorList.ToArray(); if(authorList.Count == 0) { - message = "The table AUTHORS is empty. At least one author must be specified."; + message = TB("The table AUTHORS is empty. At least one author must be specified."); return false; } @@ -301,13 +303,13 @@ public abstract partial class PluginBase : IPluginMetadata if (!this.state.Environment["SUPPORT_CONTACT"].TryRead(out contact)) { contact = string.Empty; - message = "The field SUPPORT_CONTACT does not exist or is not a valid string."; + message = TB("The field SUPPORT_CONTACT does not exist or is not a valid string."); return false; } if(string.IsNullOrWhiteSpace(contact)) { - message = "The field SUPPORT_CONTACT is empty. The support contact must be a non-empty string."; + message = TB("The field SUPPORT_CONTACT is empty. The support contact must be a non-empty string."); return false; } @@ -326,14 +328,14 @@ public abstract partial class PluginBase : IPluginMetadata if (!this.state.Environment["SOURCE_URL"].TryRead(out url)) { url = string.Empty; - message = "The field SOURCE_URL does not exist or is not a valid string."; + message = TB("The field SOURCE_URL does not exist or is not a valid string."); return false; } if (!url.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase) && !url.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase)) { url = string.Empty; - message = "The field SOURCE_URL is not a valid URL. The URL must start with 'http://' or 'https://'."; + message = TB("The field SOURCE_URL is not a valid URL. The URL must start with 'http://' or 'https://'."); return false; } @@ -352,7 +354,7 @@ public abstract partial class PluginBase : IPluginMetadata if (!this.state.Environment["CATEGORIES"].TryRead(out var categoriesTable)) { categories = []; - message = "The table CATEGORIES does not exist or is using an invalid syntax."; + message = TB("The table CATEGORIES does not exist or is using an invalid syntax."); return false; } @@ -365,7 +367,7 @@ public abstract partial class PluginBase : IPluginMetadata categories = categoryList.ToArray(); if(categoryList.Count == 0) { - message = $"The table CATEGORIES is empty. At least one category is necessary. Valid categories are: {CommonTools.GetAllEnumValues(PluginCategory.NONE)}."; + message = string.Format(TB("The table CATEGORIES is empty. At least one category is necessary. Valid categories are: {0}."), CommonTools.GetAllEnumValues(PluginCategory.NONE)); return false; } @@ -384,7 +386,7 @@ public abstract partial class PluginBase : IPluginMetadata if (!this.state.Environment["TARGET_GROUPS"].TryRead(out var targetGroupsTable)) { targetGroups = []; - message = "The table TARGET_GROUPS does not exist or is using an invalid syntax."; + message = TB("The table TARGET_GROUPS does not exist or is using an invalid syntax."); return false; } @@ -397,7 +399,7 @@ public abstract partial class PluginBase : IPluginMetadata targetGroups = targetGroupList.ToArray(); if(targetGroups.Length == 0) { - message = "The table TARGET_GROUPS is empty or is not a valid table of strings. Valid target groups are: {CommonTools.GetAllEnumValues(PluginTargetGroup.NONE)}."; + message = string.Format(TB("The table TARGET_GROUPS is empty or is not a valid table of strings. Valid target groups are: {0}."), CommonTools.GetAllEnumValues(PluginTargetGroup.NONE)); return false; } @@ -416,7 +418,7 @@ public abstract partial class PluginBase : IPluginMetadata if (!this.state.Environment["IS_MAINTAINED"].TryRead(out isMaintained)) { isMaintained = false; - message = "The field IS_MAINTAINED does not exist or is not a valid boolean."; + message = TB("The field IS_MAINTAINED does not exist or is not a valid boolean."); return false; } @@ -435,7 +437,7 @@ public abstract partial class PluginBase : IPluginMetadata if (!this.state.Environment["DEPRECATION_MESSAGE"].TryRead(out deprecationMessage)) { deprecationMessage = string.Empty; - message = "The field DEPRECATION_MESSAGE does not exist, is not a valid string. This message is optional: use an empty string to indicate that the plugin is not deprecated."; + message = TB("The field DEPRECATION_MESSAGE does not exist, is not a valid string. This message is optional: use an empty string to indicate that the plugin is not deprecated."); return false; } @@ -453,7 +455,7 @@ public abstract partial class PluginBase : IPluginMetadata { if (!this.state.Environment["UI_TEXT_CONTENT"].TryRead(out var textTable)) { - message = "The UI_TEXT_CONTENT table does not exist or is not a valid table."; + message = TB("The UI_TEXT_CONTENT table does not exist or is not a valid table."); pluginContent = []; return false; } diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginCategoryExtensions.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginCategoryExtensions.cs index 35303c06..ef8dd37d 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginCategoryExtensions.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginCategoryExtensions.cs @@ -2,37 +2,39 @@ namespace AIStudio.Tools.PluginSystem; public static class PluginCategoryExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(PluginCategoryExtensions).Namespace, nameof(PluginCategoryExtensions)); + public static string GetName(this PluginCategory type) => type switch { - PluginCategory.NONE => "None", - PluginCategory.CORE => "AI Studio Core", + PluginCategory.NONE => TB("None"), + PluginCategory.CORE => TB("AI Studio Core"), - PluginCategory.BUSINESS => "Business", - PluginCategory.INDUSTRY => "Industry", - PluginCategory.UTILITY => "Utility", - PluginCategory.SOFTWARE_DEVELOPMENT => "Software Development", - PluginCategory.GAMING => "Gaming", - PluginCategory.EDUCATION => "Education", - PluginCategory.ENTERTAINMENT => "Entertainment", - PluginCategory.SOCIAL => "Social", - PluginCategory.SHOPPING => "Shopping", - PluginCategory.TRAVEL => "Travel", - PluginCategory.HEALTH => "Health", - PluginCategory.FITNESS => "Fitness", - PluginCategory.FOOD => "Food", - PluginCategory.PARTY => "Party", - PluginCategory.SPORTS => "Sports", - PluginCategory.NEWS => "News", - PluginCategory.WEATHER => "Weather", - PluginCategory.MUSIC => "Music", - PluginCategory.POLITICAL => "Political", - PluginCategory.SCIENCE => "Science", - PluginCategory.TECHNOLOGY => "Technology", - PluginCategory.ART => "Art", - PluginCategory.FICTION => "Fiction", - PluginCategory.WRITING => "Writing", - PluginCategory.CONTENT_CREATION => "Content Creation", + PluginCategory.BUSINESS => TB("Business"), + PluginCategory.INDUSTRY => TB("Industry"), + PluginCategory.UTILITY => TB("Utility"), + PluginCategory.SOFTWARE_DEVELOPMENT => TB("Software Development"), + PluginCategory.GAMING => TB("Gaming"), + PluginCategory.EDUCATION => TB("Education"), + PluginCategory.ENTERTAINMENT => TB("Entertainment"), + PluginCategory.SOCIAL => TB("Social"), + PluginCategory.SHOPPING => TB("Shopping"), + PluginCategory.TRAVEL => TB("Travel"), + PluginCategory.HEALTH => TB("Health"), + PluginCategory.FITNESS => TB("Fitness"), + PluginCategory.FOOD => TB("Food"), + PluginCategory.PARTY => TB("Party"), + PluginCategory.SPORTS => TB("Sports"), + PluginCategory.NEWS => TB("News"), + PluginCategory.WEATHER => TB("Weather"), + PluginCategory.MUSIC => TB("Music"), + PluginCategory.POLITICAL => TB("Political"), + PluginCategory.SCIENCE => TB("Science"), + PluginCategory.TECHNOLOGY => TB("Technology"), + PluginCategory.ART => TB("Art"), + PluginCategory.FICTION => TB("Fiction"), + PluginCategory.WRITING => TB("Writing"), + PluginCategory.CONTENT_CREATION => TB("Content Creation"), - _ => "Unknown plugin category", + _ => TB("Unknown plugin category"), }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.HotReload.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.HotReload.cs index c2d75bf3..4eb3b0c3 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.HotReload.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.HotReload.cs @@ -2,8 +2,16 @@ namespace AIStudio.Tools.PluginSystem; public static partial class PluginFactory { + private static readonly SemaphoreSlim HOT_RELOAD_SEMAPHORE = new(1, 1); + public static void SetUpHotReloading() { + if (!IS_INITIALIZED) + { + LOG.LogError("PluginFactory is not initialized. Please call Setup() before using it."); + return; + } + LOG.LogInformation($"Start hot reloading plugins for path '{HOT_RELOAD_WATCHER.Path}'."); try { @@ -14,9 +22,23 @@ public static partial class PluginFactory HOT_RELOAD_WATCHER.Filter = "*.lua"; HOT_RELOAD_WATCHER.Changed += async (_, args) => { - LOG.LogInformation($"File changed: {args.FullPath}"); - await LoadAll(); - await messageBus.SendMessage(null, Event.PLUGINS_RELOADED); + var changeType = args.ChangeType.ToString().ToLowerInvariant(); + if (!await HOT_RELOAD_SEMAPHORE.WaitAsync(0)) + { + LOG.LogInformation($"File changed ({changeType}): {args.FullPath}. Already processing another change."); + return; + } + + try + { + LOG.LogInformation($"File changed ({changeType}): {args.FullPath}. Reloading plugins..."); + await LoadAll(); + await messageBus.SendMessage(null, Event.PLUGINS_RELOADED); + } + finally + { + HOT_RELOAD_SEMAPHORE.Release(); + } }; HOT_RELOAD_WATCHER.EnableRaisingEvents = true; diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs index 2c14adb6..42165bfb 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Internal.cs @@ -10,7 +10,33 @@ public static partial class PluginFactory { public static async Task EnsureInternalPlugins() { + if (!IS_INITIALIZED) + { + LOG.LogError("PluginFactory is not initialized. Please call Setup() before using it."); + return; + } + + // A plugin update might remove some resources. Even worse, a plugin + // might have changed its name, etc. Thus, we delete the internal + // plugin directories before copying the new resources: + LOG.LogInformation("Try to delete the internal plugins directory for maintenance."); + if (Directory.Exists(INTERNAL_PLUGINS_ROOT)) + { + try + { + Directory.Delete(INTERNAL_PLUGINS_ROOT, true); + LOG.LogInformation("Successfully deleted the internal plugins directory for maintenance."); + } + catch (Exception e) + { + LOG.LogError($"Could not delete the internal plugins directory for maintenance: {INTERNAL_PLUGINS_ROOT}. Error: {e}"); + } + } + LOG.LogInformation("Start ensuring internal plugins."); + if(!Directory.Exists(INTERNAL_PLUGINS_ROOT)) + Directory.CreateDirectory(INTERNAL_PLUGINS_ROOT); + foreach (var plugin in Enum.GetValues()) { LOG.LogInformation($"Ensure plugin: {plugin}"); @@ -40,15 +66,15 @@ public static partial class PluginFactory } // Ensure that the additional resources exist: - foreach (var content in resourceFileProvider.GetDirectoryContents(metaData.ResourcePath)) + foreach (var contentFilePath in resourceFileProvider.GetDirectoryContents(metaData.ResourcePath)) { - if(content.IsDirectory) + if(contentFilePath.IsDirectory) { LOG.LogError("The plugin contains a directory. This is not allowed."); continue; } - await CopyInternalPluginFile(content, metaData); + await CopyInternalPluginFile(contentFilePath, metaData); } } catch @@ -57,9 +83,9 @@ public static partial class PluginFactory } } - private static async Task CopyInternalPluginFile(IFileInfo resourceInfo, InternalPluginData metaData) + private static async Task CopyInternalPluginFile(IFileInfo resourceFilePath, InternalPluginData metaData) { - await using var inputStream = resourceInfo.CreateReadStream(); + await using var inputStream = resourceFilePath.CreateReadStream(); var pluginTypeBasePath = Path.Join(INTERNAL_PLUGINS_ROOT, metaData.Type.GetDirectory()); @@ -73,7 +99,7 @@ public static partial class PluginFactory if (!Directory.Exists(pluginPath)) Directory.CreateDirectory(pluginPath); - var pluginFilePath = Path.Join(pluginPath, resourceInfo.Name); + var pluginFilePath = Path.Join(pluginPath, resourceFilePath.Name); await using var outputStream = File.Create(pluginFilePath); await inputStream.CopyToAsync(outputStream); diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Loading.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Loading.cs new file mode 100644 index 00000000..288bb9fc --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Loading.cs @@ -0,0 +1,168 @@ +using System.Text; + +using Lua; +using Lua.Standard; + +namespace AIStudio.Tools.PluginSystem; + +public static partial class PluginFactory +{ + private static readonly List AVAILABLE_PLUGINS = []; + private static readonly SemaphoreSlim PLUGIN_LOAD_SEMAPHORE = new(1, 1); + + /// + /// A list of all available plugins. + /// + public static IReadOnlyCollection AvailablePlugins => AVAILABLE_PLUGINS; + + /// + /// Try to load all plugins from the plugins directory. + /// + /// + /// Loading plugins means:
+ /// - Parsing and checking the plugin code
+ /// - Check for forbidden plugins
+ /// - Creating a new instance of the allowed plugin
+ /// - Read the plugin metadata
+ /// - Start the plugin
+ ///
+ public static async Task LoadAll(CancellationToken cancellationToken = default) + { + if (!IS_INITIALIZED) + { + LOG.LogError("PluginFactory is not initialized. Please call Setup() before using it."); + return; + } + + if (!await PLUGIN_LOAD_SEMAPHORE.WaitAsync(0, cancellationToken)) + return; + + try + { + LOG.LogInformation("Start loading plugins."); + if (!Directory.Exists(PLUGINS_ROOT)) + { + LOG.LogInformation("No plugins found."); + return; + } + + AVAILABLE_PLUGINS.Clear(); + + // + // The easiest way to load all plugins is to find all `plugin.lua` files and load them. + // By convention, each plugin is enforced to have a `plugin.lua` file. + // + var pluginMainFiles = Directory.EnumerateFiles(PLUGINS_ROOT, "plugin.lua", SearchOption.AllDirectories); + foreach (var pluginMainFile in pluginMainFiles) + { + try + { + if (cancellationToken.IsCancellationRequested) + break; + + LOG.LogInformation($"Try to load plugin: {pluginMainFile}"); + var fileInfo = new FileInfo(pluginMainFile); + string code; + await using(var fileStream = fileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + { + using var reader = new StreamReader(fileStream, Encoding.UTF8); + code = await reader.ReadToEndAsync(cancellationToken); + } + + var pluginPath = Path.GetDirectoryName(pluginMainFile)!; + var plugin = await Load(pluginPath, code, cancellationToken); + + switch (plugin) + { + case NoPlugin noPlugin when noPlugin.Issues.Any(): + LOG.LogError($"Was not able to load plugin: '{pluginMainFile}'. Reason: {noPlugin.Issues.First()}"); + continue; + + case NoPlugin: + LOG.LogError($"Was not able to load plugin: '{pluginMainFile}'. Reason: Unknown."); + continue; + + case { IsValid: false }: + LOG.LogError($"Was not able to load plugin '{pluginMainFile}', because the Lua code is not a valid AI Studio plugin. There are {plugin.Issues.Count()} issues to fix. First issue is: {plugin.Issues.FirstOrDefault()}"); + #if DEBUG + foreach (var pluginIssue in plugin.Issues) + LOG.LogError($"Plugin issue: {pluginIssue}"); + #endif + continue; + + case { IsMaintained: false }: + LOG.LogWarning($"The plugin '{pluginMainFile}' is not maintained anymore. Please consider to disable it."); + break; + } + + LOG.LogInformation($"Successfully loaded plugin: '{pluginMainFile}' (Id='{plugin.Id}', Type='{plugin.Type}', Name='{plugin.Name}', Version='{plugin.Version}', Authors='{string.Join(", ", plugin.Authors)}')"); + AVAILABLE_PLUGINS.Add(new PluginMetadata(plugin, pluginPath)); + } + catch (Exception e) + { + LOG.LogError($"Was not able to load plugin '{pluginMainFile}'. Issue: {e.Message}"); + LOG.LogDebug(e.StackTrace); + } + } + + // Start or restart all plugins: + await RestartAllPlugins(cancellationToken); + } + finally + { + PLUGIN_LOAD_SEMAPHORE.Release(); + LOG.LogInformation("Finished loading plugins."); + } + } + + public static async Task Load(string? pluginPath, string code, CancellationToken cancellationToken = default) + { + if(ForbiddenPlugins.Check(code) is { IsForbidden: true } forbiddenState) + return new NoPlugin($"This plugin is forbidden: {forbiddenState.Message}"); + + var state = LuaState.Create(); + if (!string.IsNullOrWhiteSpace(pluginPath)) + { + // Add the module loader so that the plugin can load other Lua modules: + state.ModuleLoader = new PluginLoader(pluginPath); + } + + // Add some useful libraries: + state.OpenModuleLibrary(); + state.OpenStringLibrary(); + state.OpenTableLibrary(); + state.OpenMathLibrary(); + state.OpenBitwiseLibrary(); + state.OpenCoroutineLibrary(); + + try + { + await state.DoStringAsync(code, cancellationToken: cancellationToken); + } + catch (LuaParseException e) + { + return new NoPlugin($"Was not able to parse the plugin: {e.Message}"); + } + catch (LuaRuntimeException e) + { + return new NoPlugin($"Was not able to run the plugin: {e.Message}"); + } + + if (!state.Environment["TYPE"].TryRead(out var typeText)) + return new NoPlugin("TYPE does not exist or is not a valid string."); + + if (!Enum.TryParse(typeText, out var type)) + return new NoPlugin($"TYPE is not a valid plugin type. Valid types are: {CommonTools.GetAllEnumValues()}"); + + if(type is PluginType.NONE) + return new NoPlugin($"TYPE is not a valid plugin type. Valid types are: {CommonTools.GetAllEnumValues()}"); + + var isInternal = !string.IsNullOrWhiteSpace(pluginPath) && pluginPath.StartsWith(INTERNAL_PLUGINS_ROOT, StringComparison.OrdinalIgnoreCase); + return type switch + { + PluginType.LANGUAGE => new PluginLanguage(isInternal, state, type), + + _ => new NoPlugin("This plugin type is not supported yet. Please try again with a future version of AI Studio.") + }; + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Starting.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Starting.cs new file mode 100644 index 00000000..8fe1b9d8 --- /dev/null +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.Starting.cs @@ -0,0 +1,101 @@ +using System.Text; + +namespace AIStudio.Tools.PluginSystem; + +public static partial class PluginFactory +{ + private static readonly List RUNNING_PLUGINS = []; + + /// + /// A list of all running plugins. + /// + public static IReadOnlyCollection RunningPlugins => RUNNING_PLUGINS; + + private static async Task RestartAllPlugins(CancellationToken cancellationToken = default) + { + LOG.LogInformation("Try to start or restart all plugins."); + RUNNING_PLUGINS.Clear(); + + // + // Get the base language plugin. This is the plugin that will be used to fill in missing keys. + // + var baseLanguagePluginId = InternalPlugin.LANGUAGE_EN_US.MetaData().Id; + var baseLanguagePluginMetaData = AVAILABLE_PLUGINS.FirstOrDefault(p => p.Id == baseLanguagePluginId); + if (baseLanguagePluginMetaData is null) + { + LOG.LogError($"Was not able to find the base language plugin: Id='{baseLanguagePluginId}'. Please check your installation."); + return; + } + + var startedBasePlugin = await Start(baseLanguagePluginMetaData, cancellationToken); + if (startedBasePlugin is NoPlugin noPlugin) + { + LOG.LogError($"Was not able to start the base language plugin: Id='{baseLanguagePluginId}'. Reason: {noPlugin.Issues.First()}"); + return; + } + + if (startedBasePlugin is PluginLanguage languagePlugin) + { + BASE_LANGUAGE_PLUGIN = languagePlugin; + RUNNING_PLUGINS.Add(languagePlugin); + LOG.LogInformation($"Successfully started the base language plugin: Id='{languagePlugin.Id}', Type='{languagePlugin.Type}', Name='{languagePlugin.Name}', Version='{languagePlugin.Version}'"); + } + else + { + LOG.LogError($"Was not able to start the base language plugin: Id='{baseLanguagePluginId}'. Reason: {string.Join("; ", startedBasePlugin.Issues)}"); + return; + } + + // + // Iterate over all available plugins and try to start them. + // + foreach (var availablePlugin in AVAILABLE_PLUGINS) + { + if(cancellationToken.IsCancellationRequested) + break; + + if (availablePlugin.Id == baseLanguagePluginId) + continue; + + if (availablePlugin.IsInternal || SETTINGS_MANAGER.IsPluginEnabled(availablePlugin)) + if(await Start(availablePlugin, cancellationToken) is { IsValid: true } plugin) + RUNNING_PLUGINS.Add(plugin); + + // Inform all components that the plugins have been reloaded or started: + await MessageBus.INSTANCE.SendMessage(null, Event.PLUGINS_RELOADED); + } + } + + private static async Task Start(IAvailablePlugin meta, CancellationToken cancellationToken = default) + { + var pluginMainFile = Path.Join(meta.LocalPath, "plugin.lua"); + if(!File.Exists(pluginMainFile)) + { + LOG.LogError($"Was not able to start plugin: Id='{meta.Id}', Type='{meta.Type}', Name='{meta.Name}', Version='{meta.Version}'. Reason: The plugin file does not exist."); + return new NoPlugin($"The plugin file does not exist: {pluginMainFile}"); + } + + var code = await File.ReadAllTextAsync(pluginMainFile, Encoding.UTF8, cancellationToken); + var plugin = await Load(meta.LocalPath, code, cancellationToken); + if (plugin is NoPlugin noPlugin) + { + LOG.LogError($"Was not able to start plugin: Id='{meta.Id}', Type='{meta.Type}', Name='{meta.Name}', Version='{meta.Version}'. Reason: {noPlugin.Issues.First()}"); + return noPlugin; + } + + if (plugin.IsValid) + { + // + // When this is a language plugin, we need to set the base language plugin. + // + if (plugin is PluginLanguage languagePlugin && BASE_LANGUAGE_PLUGIN != NoPluginLanguage.INSTANCE) + languagePlugin.SetBaseLanguage(BASE_LANGUAGE_PLUGIN); + + LOG.LogInformation($"Successfully started plugin: Id='{plugin.Id}', Type='{plugin.Type}', Name='{plugin.Name}', Version='{plugin.Version}'"); + return plugin; + } + + LOG.LogError($"Was not able to start plugin: Id='{meta.Id}', Type='{meta.Type}', Name='{meta.Name}', Version='{meta.Version}'. Reasons: {string.Join("; ", plugin.Issues)}"); + return new NoPlugin($"Was not able to start plugin: Id='{meta.Id}', Type='{meta.Type}', Name='{meta.Name}', Version='{meta.Version}'. Reasons: {string.Join("; ", plugin.Issues)}"); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs index 0cb87178..8dc83966 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginFactory.cs @@ -1,148 +1,48 @@ -using System.Text; - using AIStudio.Settings; -using Lua; -using Lua.Standard; - namespace AIStudio.Tools.PluginSystem; public static partial class PluginFactory { - private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger("PluginFactory"); + private static readonly ILogger LOG = Program.LOGGER_FACTORY.CreateLogger(nameof(PluginFactory)); + private static readonly SettingsManager SETTINGS_MANAGER = Program.SERVICE_PROVIDER.GetRequiredService(); - private static readonly string DATA_DIR = SettingsManager.DataDirectory!; - - private static readonly string PLUGINS_ROOT = Path.Join(DATA_DIR, "plugins"); - - private static readonly string INTERNAL_PLUGINS_ROOT = Path.Join(PLUGINS_ROOT, ".internal"); - - private static readonly FileSystemWatcher HOT_RELOAD_WATCHER = new(PLUGINS_ROOT); + private static bool IS_INITIALIZED; + private static string DATA_DIR = string.Empty; + private static string PLUGINS_ROOT = string.Empty; + private static string INTERNAL_PLUGINS_ROOT = string.Empty; + private static FileSystemWatcher HOT_RELOAD_WATCHER = null!; + private static ILanguagePlugin BASE_LANGUAGE_PLUGIN = NoPluginLanguage.INSTANCE; + + public static ILanguagePlugin BaseLanguage => BASE_LANGUAGE_PLUGIN; - private static readonly List AVAILABLE_PLUGINS = []; - /// - /// A list of all available plugins. + /// Set up the plugin factory. We will read the data directory from the settings manager. + /// Afterward, we will create the plugins directory and the internal plugin directory. /// - public static IReadOnlyCollection AvailablePlugins => AVAILABLE_PLUGINS; - - /// - /// Try to load all plugins from the plugins directory. - /// - /// - /// Loading plugins means:
- /// - Parsing and checking the plugin code
- /// - Check for forbidden plugins
- /// - Creating a new instance of the allowed plugin
- /// - Read the plugin metadata
- ///
- /// Loading a plugin does not mean to start the plugin, though. - ///
- public static async Task LoadAll(CancellationToken cancellationToken = default) + public static bool Setup() { - LOG.LogInformation("Start loading plugins."); + if(IS_INITIALIZED) + return false; + + DATA_DIR = SettingsManager.DataDirectory!; + PLUGINS_ROOT = Path.Join(DATA_DIR, "plugins"); + INTERNAL_PLUGINS_ROOT = Path.Join(PLUGINS_ROOT, ".internal"); + if (!Directory.Exists(PLUGINS_ROOT)) - { - LOG.LogInformation("No plugins found."); - return; - } + Directory.CreateDirectory(PLUGINS_ROOT); - AVAILABLE_PLUGINS.Clear(); + HOT_RELOAD_WATCHER = new(PLUGINS_ROOT); + IS_INITIALIZED = true; - // - // The easiest way to load all plugins is to find all `plugin.lua` files and load them. - // By convention, each plugin is enforced to have a `plugin.lua` file. - // - var pluginMainFiles = Directory.EnumerateFiles(PLUGINS_ROOT, "plugin.lua", SearchOption.AllDirectories); - foreach (var pluginMainFile in pluginMainFiles) - { - if (cancellationToken.IsCancellationRequested) - break; - - LOG.LogInformation($"Try to load plugin: {pluginMainFile}"); - var code = await File.ReadAllTextAsync(pluginMainFile, Encoding.UTF8, cancellationToken); - var pluginPath = Path.GetDirectoryName(pluginMainFile)!; - var plugin = await Load(pluginPath, code, cancellationToken); - - switch (plugin) - { - case NoPlugin noPlugin when noPlugin.Issues.Any(): - LOG.LogError($"Was not able to load plugin: '{pluginMainFile}'. Reason: {noPlugin.Issues.First()}"); - continue; - - case NoPlugin: - LOG.LogError($"Was not able to load plugin: '{pluginMainFile}'. Reason: Unknown."); - continue; - - case { IsValid: false }: - LOG.LogError($"Was not able to load plugin '{pluginMainFile}', because the Lua code is not a valid AI Studio plugin. There are {plugin.Issues.Count()} issues to fix."); - #if DEBUG - foreach (var pluginIssue in plugin.Issues) - LOG.LogError($"Plugin issue: {pluginIssue}"); - #endif - continue; - - case { IsMaintained: false }: - LOG.LogWarning($"The plugin '{pluginMainFile}' is not maintained anymore. Please consider to disable it."); - break; - } - - LOG.LogInformation($"Successfully loaded plugin: '{pluginMainFile}' (Id='{plugin.Id}', Type='{plugin.Type}', Name='{plugin.Name}', Version='{plugin.Version}', Authors='{string.Join(", ", plugin.Authors)}')"); - AVAILABLE_PLUGINS.Add(new PluginMetadata(plugin)); - } - } - - private static async Task Load(string pluginPath, string code, CancellationToken cancellationToken = default) - { - if(ForbiddenPlugins.Check(code) is { IsForbidden: true } forbiddenState) - return new NoPlugin($"This plugin is forbidden: {forbiddenState.Message}"); - - var state = LuaState.Create(); - - // Add the module loader so that the plugin can load other Lua modules: - state.ModuleLoader = new PluginLoader(pluginPath); - - // Add some useful libraries: - state.OpenModuleLibrary(); - state.OpenStringLibrary(); - state.OpenTableLibrary(); - state.OpenMathLibrary(); - state.OpenBitwiseLibrary(); - state.OpenCoroutineLibrary(); - - try - { - await state.DoStringAsync(code, cancellationToken: cancellationToken); - } - catch (LuaParseException e) - { - return new NoPlugin($"Was not able to parse the plugin: {e.Message}"); - } - catch (LuaRuntimeException e) - { - return new NoPlugin($"Was not able to run the plugin: {e.Message}"); - } - - if (!state.Environment["TYPE"].TryRead(out var typeText)) - return new NoPlugin("TYPE does not exist or is not a valid string."); - - if (!Enum.TryParse(typeText, out var type)) - return new NoPlugin($"TYPE is not a valid plugin type. Valid types are: {CommonTools.GetAllEnumValues()}"); - - if(type is PluginType.NONE) - return new NoPlugin($"TYPE is not a valid plugin type. Valid types are: {CommonTools.GetAllEnumValues()}"); - - var isInternal = pluginPath.StartsWith(INTERNAL_PLUGINS_ROOT, StringComparison.OrdinalIgnoreCase); - return type switch - { - PluginType.LANGUAGE => new PluginLanguage(isInternal, state, type), - - _ => new NoPlugin("This plugin type is not supported yet. Please try again with a future version of AI Studio.") - }; + return true; } public static void Dispose() { + if(!IS_INITIALIZED) + return; + HOT_RELOAD_WATCHER.Dispose(); } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginLanguage.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginLanguage.cs index 384d81eb..d3dcb8de 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginLanguage.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginLanguage.cs @@ -4,9 +4,13 @@ namespace AIStudio.Tools.PluginSystem; public sealed class PluginLanguage : PluginBase, ILanguagePlugin { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(PluginLanguage).Namespace, nameof(PluginLanguage)); + private static readonly ILogger LOGGER = Program.LOGGER_FACTORY.CreateLogger(); + private readonly Dictionary content = []; private readonly List otherLanguagePlugins = []; private readonly string langCultureTag; + private readonly string langName; private ILanguagePlugin? baseLanguage; @@ -15,6 +19,9 @@ public sealed class PluginLanguage : PluginBase, ILanguagePlugin if(!this.TryInitIETFTag(out var issue, out this.langCultureTag)) this.pluginIssues.Add(issue); + if(!this.TryInitLangName(out issue, out this.langName)) + this.pluginIssues.Add(issue); + if (this.TryInitUITextContent(out issue, out var readContent)) this.content = readContent; else @@ -36,6 +43,86 @@ public sealed class PluginLanguage : PluginBase, ILanguagePlugin /// /// The language plugin to add. public void AddOtherLanguagePlugin(ILanguagePlugin languagePlugin) => this.otherLanguagePlugins.Add(languagePlugin); + + /// + /// Tries to initialize the IETF tag. + /// + /// The error message, when the IETF tag could not be read. + /// The read IETF tag. + /// True, when the IETF tag could be read, false otherwise. + private bool TryInitIETFTag(out string message, out string readLangCultureTag) + { + if (!this.state.Environment["IETF_TAG"].TryRead(out readLangCultureTag)) + { + message = TB("The field IETF_TAG does not exist or is not a valid string."); + readLangCultureTag = string.Empty; + return false; + } + + if (string.IsNullOrWhiteSpace(readLangCultureTag)) + { + message = TB("The field IETF_TAG is empty. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code."); + readLangCultureTag = string.Empty; + return false; + } + + if (readLangCultureTag.Length != 5) + { + message = TB("The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code."); + readLangCultureTag = string.Empty; + return false; + } + + if (readLangCultureTag[2] != '-') + { + message = TB("The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code."); + readLangCultureTag = string.Empty; + return false; + } + + // Check the first part consists of only lower case letters: + for (var i = 0; i < 2; i++) + if (!char.IsLower(readLangCultureTag[i])) + { + message = TB("The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code."); + readLangCultureTag = string.Empty; + return false; + } + + // Check the second part consists of only upper case letters: + for (var i = 3; i < 5; i++) + if (!char.IsUpper(readLangCultureTag[i])) + { + message = TB("The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code."); + readLangCultureTag = string.Empty; + return false; + } + + message = string.Empty; + return true; + } + + private bool TryInitLangName(out string message, out string readLangName) + { + if (!this.state.Environment["LANG_NAME"].TryRead(out readLangName)) + { + message = TB("The field LANG_NAME does not exist or is not a valid string."); + readLangName = string.Empty; + return false; + } + + if (string.IsNullOrWhiteSpace(readLangName)) + { + message = TB("The field LANG_NAME is empty. Use a valid language name."); + readLangName = string.Empty; + return false; + } + + message = string.Empty; + return true; + } + + #region Implementation of ILanguagePlugin /// /// Tries to get a text from the language plugin. @@ -48,8 +135,9 @@ public sealed class PluginLanguage : PluginBase, ILanguagePlugin /// /// The key to use to get the text. /// The desired text. + /// When true, a warning will be logged if the key does not exist. /// True if the key exists, false otherwise. - public bool TryGetText(string key, out string value) + public bool TryGetText(string key, out string value, bool logWarning = false) { // First, we check if the key is part of the main language pack: if (this.content.TryGetValue(key, out value!)) @@ -66,65 +154,21 @@ public sealed class PluginLanguage : PluginBase, ILanguagePlugin if(this.baseLanguage is not null && this.baseLanguage.TryGetText(key, out value)) return true; + if(logWarning) + LOGGER.LogWarning($"Missing translation key '{key}'."); + value = string.Empty; return false; } + + /// + public string IETFTag => this.langCultureTag; - /// - /// Tries to initialize the IETF tag. - /// - /// The error message, when the IETF tag could not be read. - /// The read IETF tag. - /// True, when the IETF tag could be read, false otherwise. - private bool TryInitIETFTag(out string message, out string readLangCultureTag) - { - if (!this.state.Environment["IETF_TAG"].TryRead(out readLangCultureTag)) - { - message = "The field IETF_TAG does not exist or is not a valid string."; - readLangCultureTag = string.Empty; - return false; - } - - if (string.IsNullOrWhiteSpace(readLangCultureTag)) - { - message = "The field IETF_TAG is empty. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code."; - readLangCultureTag = string.Empty; - return false; - } - - if (readLangCultureTag.Length != 5) - { - message = "The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code."; - readLangCultureTag = string.Empty; - return false; - } - - if (readLangCultureTag[2] != '-') - { - message = "The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code."; - readLangCultureTag = string.Empty; - return false; - } - - // Check the first part consists of only lower case letters: - for (var i = 0; i < 2; i++) - if (!char.IsLower(readLangCultureTag[i])) - { - message = "The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code."; - readLangCultureTag = string.Empty; - return false; - } - - // Check the second part consists of only upper case letters: - for (var i = 3; i < 5; i++) - if (!char.IsUpper(readLangCultureTag[i])) - { - message = "The field IETF_TAG is not a valid IETF tag. Use a valid IETF tag like 'en-US'. The first part is the language, the second part is the country code."; - readLangCultureTag = string.Empty; - return false; - } - - message = string.Empty; - return true; - } + /// + public string LangName => this.langName; + + /// + public IReadOnlyDictionary Content => this.content.AsReadOnly(); + + #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginMetadata.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginMetadata.cs index 2bfdab1e..e98644cb 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginMetadata.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginMetadata.cs @@ -1,6 +1,6 @@ namespace AIStudio.Tools.PluginSystem; -public sealed class PluginMetadata(PluginBase plugin) : IPluginMetadata +public sealed class PluginMetadata(PluginBase plugin, string localPath) : IAvailablePlugin { #region Implementation of IPluginMetadata @@ -47,4 +47,10 @@ public sealed class PluginMetadata(PluginBase plugin) : IPluginMetadata public bool IsInternal { get; } = plugin.IsInternal; #endregion + + #region Implementation of IAvailablePlugin + + public string LocalPath { get; } = localPath; + + #endregion } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginTargetGroupExtensions.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginTargetGroupExtensions.cs index 7a14123f..7e47a130 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginTargetGroupExtensions.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginTargetGroupExtensions.cs @@ -2,24 +2,26 @@ namespace AIStudio.Tools.PluginSystem; public static class PluginTargetGroupExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(PluginTargetGroupExtensions).Namespace, nameof(PluginTargetGroupExtensions)); + public static string Name(this PluginTargetGroup group) => group switch { - PluginTargetGroup.NONE => "No target group", + PluginTargetGroup.NONE => TB("No target group"), - PluginTargetGroup.EVERYONE => "Everyone", - PluginTargetGroup.CHILDREN => "Children", - PluginTargetGroup.TEENAGERS => "Teenagers", - PluginTargetGroup.STUDENTS => "Students", - PluginTargetGroup.ADULTS => "Adults", + PluginTargetGroup.EVERYONE => TB("Everyone"), + PluginTargetGroup.CHILDREN => TB("Children"), + PluginTargetGroup.TEENAGERS => TB("Teenagers"), + PluginTargetGroup.STUDENTS => TB("Students"), + PluginTargetGroup.ADULTS => TB("Adults"), - PluginTargetGroup.INDUSTRIAL_WORKERS => "Industrial workers", - PluginTargetGroup.OFFICE_WORKERS => "Office workers", - PluginTargetGroup.BUSINESS_PROFESSIONALS => "Business professionals", - PluginTargetGroup.SOFTWARE_DEVELOPERS => "Software developers", - PluginTargetGroup.SCIENTISTS => "Scientists", - PluginTargetGroup.TEACHERS => "Teachers", - PluginTargetGroup.ARTISTS => "Artists", + PluginTargetGroup.INDUSTRIAL_WORKERS => TB("Industrial workers"), + PluginTargetGroup.OFFICE_WORKERS => TB("Office workers"), + PluginTargetGroup.BUSINESS_PROFESSIONALS => TB("Business professionals"), + PluginTargetGroup.SOFTWARE_DEVELOPERS => TB("Software developers"), + PluginTargetGroup.SCIENTISTS => TB("Scientists"), + PluginTargetGroup.TEACHERS => TB("Teachers"), + PluginTargetGroup.ARTISTS => TB("Artists"), - _ => "Unknown target group", + _ => TB("Unknown target group"), }; } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/PluginSystem/PluginTypeExtensions.cs b/app/MindWork AI Studio/Tools/PluginSystem/PluginTypeExtensions.cs index b65eb502..b855a144 100644 --- a/app/MindWork AI Studio/Tools/PluginSystem/PluginTypeExtensions.cs +++ b/app/MindWork AI Studio/Tools/PluginSystem/PluginTypeExtensions.cs @@ -2,14 +2,16 @@ namespace AIStudio.Tools.PluginSystem; public static class PluginTypeExtensions { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(PluginTypeExtensions).Namespace, nameof(PluginTypeExtensions)); + public static string GetName(this PluginType type) => type switch { - PluginType.LANGUAGE => "Language plugin", - PluginType.ASSISTANT => "Assistant plugin", - PluginType.CONFIGURATION => "Configuration plugin", - PluginType.THEME => "Theme plugin", + PluginType.LANGUAGE => TB("Language plugin"), + PluginType.ASSISTANT => TB("Assistant plugin"), + PluginType.CONFIGURATION => TB("Configuration plugin"), + PluginType.THEME => TB("Theme plugin"), - _ => "Unknown plugin type", + _ => TB("Unknown plugin type"), }; public static string GetDirectory(this PluginType type) => type switch diff --git a/app/MindWork AI Studio/Tools/RAG/AugmentationProcesses/AugmentationOne.cs b/app/MindWork AI Studio/Tools/RAG/AugmentationProcesses/AugmentationOne.cs index fff91251..11a850d4 100644 --- a/app/MindWork AI Studio/Tools/RAG/AugmentationProcesses/AugmentationOne.cs +++ b/app/MindWork AI Studio/Tools/RAG/AugmentationProcesses/AugmentationOne.cs @@ -4,21 +4,24 @@ using AIStudio.Agents; using AIStudio.Chat; using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; namespace AIStudio.Tools.RAG.AugmentationProcesses; public sealed class AugmentationOne : IAugmentationProcess { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(AugmentationOne).Namespace, nameof(AugmentationOne)); + #region Implementation of IAugmentationProcess /// public string TechnicalName => "AugmentationOne"; /// - public string UIName => "Standard augmentation process"; + public string UIName => TB("Standard augmentation process"); /// - public string Description => "This is the standard augmentation process, which uses all retrieval contexts to augment the chat thread."; + public string Description => TB("This is the standard augmentation process, which uses all retrieval contexts to augment the chat thread."); /// public async Task ProcessAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, IReadOnlyList retrievalContexts, CancellationToken token = default) diff --git a/app/MindWork AI Studio/Tools/RAG/DataSourceSelectionProcesses/AgenticSrcSelWithDynHeur.cs b/app/MindWork AI Studio/Tools/RAG/DataSourceSelectionProcesses/AgenticSrcSelWithDynHeur.cs index 76f27892..6d2d4e4e 100644 --- a/app/MindWork AI Studio/Tools/RAG/DataSourceSelectionProcesses/AgenticSrcSelWithDynHeur.cs +++ b/app/MindWork AI Studio/Tools/RAG/DataSourceSelectionProcesses/AgenticSrcSelWithDynHeur.cs @@ -3,21 +3,24 @@ using AIStudio.Chat; using AIStudio.Components; using AIStudio.Provider; using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; namespace AIStudio.Tools.RAG.DataSourceSelectionProcesses; public class AgenticSrcSelWithDynHeur : IDataSourceSelectionProcess { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(AgenticSrcSelWithDynHeur).Namespace, nameof(AgenticSrcSelWithDynHeur)); + #region Implementation of IDataSourceSelectionProcess /// public string TechnicalName => "AgenticSrcSelWithDynHeur"; /// - public string UIName => "Automatic AI data source selection with heuristik source reduction"; + public string UIName => TB("Automatic AI data source selection with heuristik source reduction"); /// - public string Description => "Automatically selects the appropriate data sources based on the last prompt. Applies a heuristic reduction at the end to reduce the number of data sources."; + public string Description => TB("Automatically selects the appropriate data sources based on the last prompt. Applies a heuristic reduction at the end to reduce the number of data sources."); /// public async Task SelectDataSourcesAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, AllowedSelectedDataSources dataSources, CancellationToken token = default) diff --git a/app/MindWork AI Studio/Tools/RAG/RAGProcesses/AISrcSelWithRetCtxVal.cs b/app/MindWork AI Studio/Tools/RAG/RAGProcesses/AISrcSelWithRetCtxVal.cs index 2736f7b0..fa7cd5f2 100644 --- a/app/MindWork AI Studio/Tools/RAG/RAGProcesses/AISrcSelWithRetCtxVal.cs +++ b/app/MindWork AI Studio/Tools/RAG/RAGProcesses/AISrcSelWithRetCtxVal.cs @@ -2,6 +2,7 @@ using AIStudio.Chat; using AIStudio.Provider; using AIStudio.Settings; using AIStudio.Settings.DataModel; +using AIStudio.Tools.PluginSystem; using AIStudio.Tools.RAG.AugmentationProcesses; using AIStudio.Tools.RAG.DataSourceSelectionProcesses; using AIStudio.Tools.Services; @@ -10,16 +11,18 @@ namespace AIStudio.Tools.RAG.RAGProcesses; public sealed class AISrcSelWithRetCtxVal : IRagProcess { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(AISrcSelWithRetCtxVal).Namespace, nameof(AISrcSelWithRetCtxVal)); + #region Implementation of IRagProcess /// public string TechnicalName => "AISrcSelWithRetCtxVal"; /// - public string UIName => "AI source selection with AI retrieval context validation"; + public string UIName => TB("AI source selection with AI retrieval context validation"); /// - public string Description => "This RAG process filters data sources, automatically selects appropriate sources, optionally allows manual source selection, retrieves data, and automatically validates the retrieval context."; + public string Description => TB("This RAG process filters data sources, automatically selects appropriate sources, optionally allows manual source selection, retrieves data, and automatically validates the retrieval context."); /// public async Task ProcessAsync(IProvider provider, IContent lastPrompt, ChatThread chatThread, CancellationToken token = default) diff --git a/app/MindWork AI Studio/Tools/Rust/FileTypeFilter.cs b/app/MindWork AI Studio/Tools/Rust/FileTypeFilter.cs new file mode 100644 index 00000000..e542cec6 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/FileTypeFilter.cs @@ -0,0 +1,23 @@ +// ReSharper disable NotAccessedPositionalProperty.Global + +using AIStudio.Tools.PluginSystem; + +namespace AIStudio.Tools.Rust; + +/// +/// Represents a file type filter for file selection dialogs. +/// +/// The name of the filter. +/// The file extensions associated with the filter. +public readonly record struct FileTypeFilter(string FilterName, string[] FilterExtensions) +{ + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(FileTypeFilter).Namespace, nameof(FileTypeFilter)); + + public static FileTypeFilter PDF => new(TB("PDF Files"), ["pdf"]); + + public static FileTypeFilter Text => new(TB("Text Files"), ["txt", "md"]); + + public static FileTypeFilter AllOffice => new(TB("All Office Files"), ["docx", "xlsx", "pptx", "doc", "xls", "ppt", "pdf"]); + + public static FileTypeFilter AllImages => new(TB("All Image Files"), ["jpg", "jpeg", "png", "gif", "bmp", "tiff"]); +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs b/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs new file mode 100644 index 00000000..28d16809 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs @@ -0,0 +1,10 @@ +namespace AIStudio.Tools.Rust; + +public sealed class SelectFileOptions +{ + public required string Title { get; init; } + + public PreviousFile? PreviousFile { get; init; } + + public FileTypeFilter? Filter { get; init; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.APIKeys.cs b/app/MindWork AI Studio/Tools/Services/RustService.APIKeys.cs index 7b89fe9a..256d29fc 100644 --- a/app/MindWork AI Studio/Tools/Services/RustService.APIKeys.cs +++ b/app/MindWork AI Studio/Tools/Services/RustService.APIKeys.cs @@ -1,9 +1,12 @@ +using AIStudio.Tools.PluginSystem; using AIStudio.Tools.Rust; namespace AIStudio.Tools.Services; public sealed partial class RustService { + private static string TB_APIKeys(string fallbackEN) => I18N.I.T(fallbackEN, typeof(RustService).Namespace, $"{nameof(RustService)}.APIKeys"); + /// /// Try to get the API key for the given secret ID. /// @@ -12,13 +15,15 @@ public sealed partial class RustService /// The requested secret. public async Task GetAPIKey(ISecretId secretId, bool isTrying = false) { + static string TB(string fallbackEN) => TB_APIKeys(fallbackEN); + var secretRequest = new SelectSecretRequest($"provider::{secretId.SecretId}::{secretId.SecretName}::api_key", Environment.UserName, isTrying); var result = await this.http.PostAsJsonAsync("/secrets/get", secretRequest, this.jsonRustSerializerOptions); if (!result.IsSuccessStatusCode) { if(!isTrying) this.logger!.LogError($"Failed to get the API key for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); - return new RequestedSecret(false, new EncryptedText(string.Empty), "Failed to get the API key due to an API issue."); + return new RequestedSecret(false, new EncryptedText(string.Empty), TB("Failed to get the API key due to an API issue.")); } var secret = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); @@ -36,13 +41,15 @@ public sealed partial class RustService /// The store secret response. public async Task SetAPIKey(ISecretId secretId, string key) { + static string TB(string fallbackEN) => TB_APIKeys(fallbackEN); + var encryptedKey = await this.encryptor!.Encrypt(key); var request = new StoreSecretRequest($"provider::{secretId.SecretId}::{secretId.SecretName}::api_key", Environment.UserName, encryptedKey); var result = await this.http.PostAsJsonAsync("/secrets/store", request, this.jsonRustSerializerOptions); if (!result.IsSuccessStatusCode) { this.logger!.LogError($"Failed to store the API key for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); - return new StoreSecretResponse(false, "Failed to get the API key due to an API issue."); + return new StoreSecretResponse(false, TB("Failed to get the API key due to an API issue.")); } var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); @@ -59,12 +66,14 @@ public sealed partial class RustService /// The delete secret response. public async Task DeleteAPIKey(ISecretId secretId) { + static string TB(string fallbackEN) => TB_APIKeys(fallbackEN); + var request = new SelectSecretRequest($"provider::{secretId.SecretId}::{secretId.SecretName}::api_key", Environment.UserName, false); var result = await this.http.PostAsJsonAsync("/secrets/delete", request, this.jsonRustSerializerOptions); if (!result.IsSuccessStatusCode) { this.logger!.LogError($"Failed to delete the API key for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); - return new DeleteSecretResponse{Success = false, WasEntryFound = false, Issue = "Failed to delete the API key due to an API issue."}; + return new DeleteSecretResponse{Success = false, WasEntryFound = false, Issue = TB("Failed to delete the API key due to an API issue.")}; } var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); diff --git a/app/MindWork AI Studio/Tools/Services/RustService.Clipboard.cs b/app/MindWork AI Studio/Tools/Services/RustService.Clipboard.cs index 9a1b6017..09fad915 100644 --- a/app/MindWork AI Studio/Tools/Services/RustService.Clipboard.cs +++ b/app/MindWork AI Studio/Tools/Services/RustService.Clipboard.cs @@ -1,9 +1,12 @@ +using AIStudio.Tools.PluginSystem; using AIStudio.Tools.Rust; namespace AIStudio.Tools.Services; public sealed partial class RustService { + private static string TB_Clipboard(string fallbackEN) => I18N.I.T(fallbackEN, typeof(RustService).Namespace, $"{nameof(RustService)}.Clipboard"); + /// /// Tries to copy the given text to the clipboard. /// @@ -11,7 +14,9 @@ public sealed partial class RustService /// The text to copy to the clipboard. public async Task CopyText2Clipboard(ISnackbar snackbar, string text) { - var message = "Successfully copied the text to your clipboard"; + static string TB(string fallbackEN) => TB_Clipboard(fallbackEN); + + var message = TB("Successfully copied the text to your clipboard"); var iconColor = Color.Error; var severity = Severity.Error; try @@ -21,7 +26,7 @@ public sealed partial class RustService if (!response.IsSuccessStatusCode) { this.logger!.LogError($"Failed to copy the text to the clipboard due to an network error: '{response.StatusCode}'"); - message = "Failed to copy the text to your clipboard."; + message = TB("Failed to copy the text to your clipboard."); return; } @@ -29,7 +34,7 @@ public sealed partial class RustService if (!state.Success) { this.logger!.LogError("Failed to copy the text to the clipboard."); - message = "Failed to copy the text to your clipboard."; + message = TB("Failed to copy the text to your clipboard."); return; } diff --git a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs index 411400f1..fc3e73bd 100644 --- a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs +++ b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs @@ -17,10 +17,16 @@ public sealed partial class RustService return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); } - public async Task SelectFile(string title, string? initialFile = null) + public async Task SelectFile(string title, FileTypeFilter? filter = null, string? initialFile = null) { - PreviousFile? previousFile = initialFile is null ? null : new (initialFile); - var result = await this.http.PostAsJsonAsync($"/select/file?title={title}", previousFile, this.jsonRustSerializerOptions); + var payload = new SelectFileOptions + { + Title = title, + PreviousFile = initialFile is null ? null : new (initialFile), + Filter = filter + }; + + var result = await this.http.PostAsJsonAsync("/select/file", payload, this.jsonRustSerializerOptions); if (!result.IsSuccessStatusCode) { this.logger!.LogError($"Failed to select a file: '{result.StatusCode}'"); diff --git a/app/MindWork AI Studio/Tools/Services/RustService.Retrieval.cs b/app/MindWork AI Studio/Tools/Services/RustService.Retrieval.cs new file mode 100644 index 00000000..4a201564 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/RustService.Retrieval.cs @@ -0,0 +1,16 @@ +namespace AIStudio.Tools.Services; + +public sealed partial class RustService +{ + public async Task GetPDFText(string filePath) + { + var response = await this.http.GetAsync($"/retrieval/fs/read/pdf?file_path={filePath}"); + if (!response.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to read the PDF file due to an network error: '{response.StatusCode}'"); + return string.Empty; + } + + return await response.Content.ReadAsStringAsync(); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs b/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs index b41806e1..da9db35f 100644 --- a/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs +++ b/app/MindWork AI Studio/Tools/Services/RustService.Secrets.cs @@ -1,9 +1,12 @@ +using AIStudio.Tools.PluginSystem; using AIStudio.Tools.Rust; namespace AIStudio.Tools.Services; public sealed partial class RustService { + private static string TB_Secrets(string fallbackEN) => I18N.I.T(fallbackEN, typeof(RustService).Namespace, $"{nameof(RustService)}.Secrets"); + /// /// Try to get the secret data for the given secret ID. /// @@ -12,13 +15,15 @@ public sealed partial class RustService /// The requested secret. public async Task GetSecret(ISecretId secretId, bool isTrying = false) { + static string TB(string fallbackEN) => TB_Secrets(fallbackEN); + var secretRequest = new SelectSecretRequest($"secret::{secretId.SecretId}::{secretId.SecretName}", Environment.UserName, isTrying); var result = await this.http.PostAsJsonAsync("/secrets/get", secretRequest, this.jsonRustSerializerOptions); if (!result.IsSuccessStatusCode) { if(!isTrying) this.logger!.LogError($"Failed to get the secret data for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); - return new RequestedSecret(false, new EncryptedText(string.Empty), "Failed to get the secret data due to an API issue."); + return new RequestedSecret(false, new EncryptedText(string.Empty), TB("Failed to get the secret data due to an API issue.")); } var secret = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); @@ -36,13 +41,15 @@ public sealed partial class RustService /// The store secret response. public async Task SetSecret(ISecretId secretId, string secretData) { + static string TB(string fallbackEN) => TB_Secrets(fallbackEN); + var encryptedSecret = await this.encryptor!.Encrypt(secretData); var request = new StoreSecretRequest($"secret::{secretId.SecretId}::{secretId.SecretName}", Environment.UserName, encryptedSecret); var result = await this.http.PostAsJsonAsync("/secrets/store", request, this.jsonRustSerializerOptions); if (!result.IsSuccessStatusCode) { this.logger!.LogError($"Failed to store the secret data for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); - return new StoreSecretResponse(false, "Failed to get the secret data due to an API issue."); + return new StoreSecretResponse(false, TB("Failed to get the secret data due to an API issue.")); } var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); @@ -59,12 +66,14 @@ public sealed partial class RustService /// The delete secret response. public async Task DeleteSecret(ISecretId secretId) { + static string TB(string fallbackEN) => TB_Secrets(fallbackEN); + var request = new SelectSecretRequest($"secret::{secretId.SecretId}::{secretId.SecretName}", Environment.UserName, false); var result = await this.http.PostAsJsonAsync("/secrets/delete", request, this.jsonRustSerializerOptions); if (!result.IsSuccessStatusCode) { this.logger!.LogError($"Failed to delete the secret data for secret ID '{secretId.SecretId}' due to an API issue: '{result.StatusCode}'"); - return new DeleteSecretResponse{Success = false, WasEntryFound = false, Issue = "Failed to delete the secret data due to an API issue."}; + return new DeleteSecretResponse{Success = false, WasEntryFound = false, Issue = TB("Failed to delete the secret data due to an API issue.")}; } var state = await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); diff --git a/app/MindWork AI Studio/Tools/Services/UpdateService.cs b/app/MindWork AI Studio/Tools/Services/UpdateService.cs index ecabbd7e..7cda6443 100644 --- a/app/MindWork AI Studio/Tools/Services/UpdateService.cs +++ b/app/MindWork AI Studio/Tools/Services/UpdateService.cs @@ -1,5 +1,6 @@ using AIStudio.Settings; using AIStudio.Settings.DataModel; +using AIStudio.Tools.PluginSystem; using Microsoft.AspNetCore.Components; @@ -7,6 +8,8 @@ namespace AIStudio.Tools.Services; public sealed class UpdateService : BackgroundService, IMessageBusReceiver { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(UpdateService).Namespace, nameof(UpdateService)); + private static bool IS_INITIALIZED; private static ISnackbar? SNACKBAR; @@ -118,7 +121,7 @@ public sealed class UpdateService : BackgroundService, IMessageBusReceiver { if (notifyUserWhenNoUpdate) { - SNACKBAR!.Add("No update found.", Severity.Normal, config => + SNACKBAR!.Add(TB("No update found."), Severity.Normal, config => { config.Icon = Icons.Material.Filled.Update; config.IconSize = Size.Large; diff --git a/app/MindWork AI Studio/Tools/Validation/DataSourceValidation.cs b/app/MindWork AI Studio/Tools/Validation/DataSourceValidation.cs index d97edb31..a761ed08 100644 --- a/app/MindWork AI Studio/Tools/Validation/DataSourceValidation.cs +++ b/app/MindWork AI Studio/Tools/Validation/DataSourceValidation.cs @@ -1,10 +1,13 @@ using AIStudio.Settings.DataModel; using AIStudio.Tools.ERIClient.DataModel; +using AIStudio.Tools.PluginSystem; namespace AIStudio.Tools.Validation; public sealed class DataSourceValidation { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(DataSourceValidation).Namespace, nameof(DataSourceValidation)); + public Func GetSecretStorageIssue { get; init; } = () => string.Empty; public Func GetPreviousDataSourceName { get; init; } = () => string.Empty; @@ -26,13 +29,13 @@ public sealed class DataSourceValidation public string? ValidatingHostname(string hostname) { if(string.IsNullOrWhiteSpace(hostname)) - return "Please enter a hostname, e.g., http://localhost"; + return TB("Please enter a hostname, e.g., http://localhost"); if(!hostname.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase) && !hostname.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase)) - return "The hostname must start with either http:// or https://"; + return TB("The hostname must start with either http:// or https://"); if(!Uri.TryCreate(hostname, UriKind.Absolute, out _)) - return "The hostname is not a valid HTTP(S) URL."; + return TB("The hostname is not a valid HTTP(S) URL."); return null; } @@ -40,7 +43,7 @@ public sealed class DataSourceValidation public string? ValidatePort(int port) { if(port is < 1 or > 65535) - return "The port must be between 1 and 65535."; + return TB("The port must be between 1 and 65535."); return null; } @@ -48,14 +51,14 @@ public sealed class DataSourceValidation public string? ValidateSecurityPolicy(DataSourceSecurity securityPolicy) { if(securityPolicy is DataSourceSecurity.NOT_SPECIFIED) - return "Please select your security policy."; + return TB("Please select your security policy."); var dataSourceSecurity = this.GetSecurityRequirements(); if (dataSourceSecurity is null) return null; if(dataSourceSecurity.Value.AllowedProviderType is ProviderType.SELF_HOSTED && securityPolicy is not DataSourceSecurity.SELF_HOSTED) - return "This data source can only be used with a self-hosted LLM provider. Please change the security policy."; + return TB("This data source can only be used with a self-hosted LLM provider. Please change the security policy."); return null; } @@ -66,7 +69,7 @@ public sealed class DataSourceValidation return null; if(string.IsNullOrWhiteSpace(username)) - return "The username must not be empty."; + return TB("The username must not be empty."); return null; } @@ -84,10 +87,10 @@ public sealed class DataSourceValidation if (string.IsNullOrWhiteSpace(secret)) return authMethod switch { - AuthMethod.TOKEN => "Please enter your secure access token.", - AuthMethod.USERNAME_PASSWORD => "Please enter your password.", + AuthMethod.TOKEN => TB("Please enter your secure access token."), + AuthMethod.USERNAME_PASSWORD => TB("Please enter your password."), - _ => "Please enter the secret necessary for authentication." + _ => TB("Please enter the secret necessary for authentication.") }; return null; @@ -96,7 +99,7 @@ public sealed class DataSourceValidation public string? ValidateRetrievalProcess(RetrievalInfo retrievalInfo) { if(retrievalInfo == default) - return "Please select one retrieval process."; + return TB("Please select one retrieval process."); return null; } @@ -104,14 +107,14 @@ public sealed class DataSourceValidation public string? ValidatingName(string dataSourceName) { if(string.IsNullOrWhiteSpace(dataSourceName)) - return "The name must not be empty."; + return TB("The name must not be empty."); if (dataSourceName.Length > 40) - return "The name must not exceed 40 characters."; + return TB("The name must not exceed 40 characters."); var lowerName = dataSourceName.ToLowerInvariant(); if(lowerName != this.GetPreviousDataSourceName() && this.GetUsedDataSourceNames().Contains(lowerName)) - return "The name is already used by another data source. Please choose a different name."; + return TB("The name is already used by another data source. Please choose a different name."); return null; } @@ -119,10 +122,10 @@ public sealed class DataSourceValidation public string? ValidatePath(string path) { if(string.IsNullOrWhiteSpace(path)) - return "The path must not be empty. Please select a directory."; + return TB("The path must not be empty. Please select a directory."); if(!Directory.Exists(path)) - return "The path does not exist. Please select a valid directory."; + return TB("The path does not exist. Please select a valid directory."); return null; } @@ -130,10 +133,10 @@ public sealed class DataSourceValidation public string? ValidateFilePath(string filePath) { if(string.IsNullOrWhiteSpace(filePath)) - return "The file path must not be empty. Please select a file."; + return TB("The file path must not be empty. Please select a file."); if(!File.Exists(filePath)) - return "The file does not exist. Please select a valid file."; + return TB("The file does not exist. Please select a valid file."); return null; } @@ -141,7 +144,7 @@ public sealed class DataSourceValidation public string? ValidateEmbeddingId(string embeddingId) { if(string.IsNullOrWhiteSpace(embeddingId)) - return "Please select an embedding provider."; + return TB("Please select an embedding provider."); return null; } @@ -149,7 +152,7 @@ public sealed class DataSourceValidation public string? ValidateUserAcknowledgedCloudEmbedding(bool value) { if(this.GetSelectedCloudEmbedding() && !value) - return "Please acknowledge that you are aware of the cloud embedding implications."; + return TB("Please acknowledge that you are aware of the cloud embedding implications."); return null; } @@ -157,10 +160,10 @@ public sealed class DataSourceValidation public string? ValidateTestedConnection() { if(!this.GetTestedConnection()) - return "Please test the connection before saving."; + return TB("Please test the connection before saving."); if(!this.GetTestedConnectionResult()) - return "The connection test failed. Please check the connection settings."; + return TB("The connection test failed. Please check the connection settings."); return null; } @@ -168,7 +171,7 @@ public sealed class DataSourceValidation public string? ValidateAuthMethod(AuthMethod authMethod) { if(!this.GetAvailableAuthMethods().Contains(authMethod)) - return "Please select one valid authentication method."; + return TB("Please select one valid authentication method."); return null; } diff --git a/app/MindWork AI Studio/Tools/Validation/ProviderValidation.cs b/app/MindWork AI Studio/Tools/Validation/ProviderValidation.cs index be7b16be..aa6217b0 100644 --- a/app/MindWork AI Studio/Tools/Validation/ProviderValidation.cs +++ b/app/MindWork AI Studio/Tools/Validation/ProviderValidation.cs @@ -1,4 +1,6 @@ using AIStudio.Provider; +using AIStudio.Provider.HuggingFace; +using AIStudio.Tools.PluginSystem; using Host = AIStudio.Provider.SelfHosted.Host; @@ -6,6 +8,8 @@ namespace AIStudio.Tools.Validation; public sealed class ProviderValidation { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(ProviderValidation).Namespace, nameof(ProviderValidation)); + public Func GetProvider { get; init; } = () => LLMProviders.NONE; public Func GetAPIKeyStorageIssue { get; init; } = () => string.Empty; @@ -22,13 +26,13 @@ public sealed class ProviderValidation return null; if(string.IsNullOrWhiteSpace(hostname)) - return "Please enter a hostname, e.g., http://localhost:1234"; + return TB("Please enter a hostname, e.g., http://localhost:1234"); if(!hostname.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase) && !hostname.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase)) - return "The hostname must start with either http:// or https://"; + return TB("The hostname must start with either http:// or https://"); if(!Uri.TryCreate(hostname, UriKind.Absolute, out _)) - return "The hostname is not a valid HTTP(S) URL."; + return TB("The hostname is not a valid HTTP(S) URL."); return null; } @@ -43,7 +47,7 @@ public sealed class ProviderValidation return apiKeyStorageIssue; if(string.IsNullOrWhiteSpace(apiKey)) - return "Please enter an API key."; + return TB("Please enter an API key."); return null; } @@ -51,15 +55,15 @@ public sealed class ProviderValidation public string? ValidatingInstanceName(string instanceName) { if (string.IsNullOrWhiteSpace(instanceName)) - return "Please enter an instance name."; + return TB("Please enter an instance name."); if (instanceName.Length > 40) - return "The instance name must not exceed 40 characters."; + return TB("The instance name must not exceed 40 characters."); // The instance name must be unique: var lowerInstanceName = instanceName.ToLowerInvariant(); if (lowerInstanceName != this.GetPreviousInstanceName() && this.GetUsedInstanceNames().Contains(lowerInstanceName)) - return "The instance name must be unique; the chosen name is already in use."; + return TB("The instance name must be unique; the chosen name is already in use."); return null; } @@ -70,7 +74,7 @@ public sealed class ProviderValidation return null; if (model == default) - return "Please select a model."; + return TB("Please select a model."); return null; } @@ -78,7 +82,7 @@ public sealed class ProviderValidation public string? ValidatingProvider(LLMProviders llmProvider) { if (llmProvider == LLMProviders.NONE) - return "Please select a provider."; + return TB("Please select a provider."); return null; } @@ -89,7 +93,18 @@ public sealed class ProviderValidation return null; if (host == Host.NONE) - return "Please select a host."; + return TB("Please select a host."); + + return null; + } + + public string? ValidatingHFInstanceProvider(HFInferenceProvider inferenceProvider) + { + if(this.GetProvider() is not LLMProviders.HUGGINGFACE) + return null; + + if (inferenceProvider is HFInferenceProvider.NONE) + return TB("Please select an Hugging Face inference provider."); return null; } diff --git a/app/MindWork AI Studio/Tools/WorkspaceBehaviour.cs b/app/MindWork AI Studio/Tools/WorkspaceBehaviour.cs index a054232f..00a6d68f 100644 --- a/app/MindWork AI Studio/Tools/WorkspaceBehaviour.cs +++ b/app/MindWork AI Studio/Tools/WorkspaceBehaviour.cs @@ -5,11 +5,14 @@ using System.Text.Json.Serialization; using AIStudio.Chat; using AIStudio.Dialogs; using AIStudio.Settings; +using AIStudio.Tools.PluginSystem; namespace AIStudio.Tools; public static class WorkspaceBehaviour { + private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(WorkspaceBehaviour).Namespace, nameof(WorkspaceBehaviour)); + public static readonly JsonSerializerOptions JSON_OPTIONS = new() { WriteIndented = true, @@ -97,13 +100,13 @@ public static class WorkspaceBehaviour { "Message", (chat.WorkspaceId == Guid.Empty) switch { - true => $"Are you sure you want to delete the temporary chat '{chat.Name}'?", - false => $"Are you sure you want to delete the chat '{chat.Name}' in the workspace '{workspaceName}'?", + true => TB($"Are you sure you want to delete the temporary chat '{chat.Name}'?"), + false => TB($"Are you sure you want to delete the chat '{chat.Name}' in the workspace '{workspaceName}'?"), } }, }; - var dialogReference = await dialogService.ShowAsync("Delete Chat", dialogParameters, Dialogs.DialogOptions.FULLSCREEN); + var dialogReference = await dialogService.ShowAsync(TB("Delete Chat"), dialogParameters, Dialogs.DialogOptions.FULLSCREEN); var dialogResult = await dialogReference.Result; if (dialogResult is null || dialogResult.Canceled) return; diff --git a/app/MindWork AI Studio/build.nu b/app/MindWork AI Studio/build.nu deleted file mode 100755 index 3c9c2e4e..00000000 --- a/app/MindWork AI Studio/build.nu +++ /dev/null @@ -1,388 +0,0 @@ -#!/usr/bin/env nu - -def main [] {} - -def are_assets_exist [rid: string] { - $"bin/release/net9.0/($rid)/publish/wwwroot/_content/MudBlazor/MudBlazor.min.css" | path exists -} - -def "main help" [] { - print "Usage: nu build.nu [action]" - print "" - print "Optional Actions:" - print "-----------------" - print " fix_web_assets Prepare the web assets; run this once for each release on one platform; changes will be committed." - print "" - print " metadata Update the metadata file; run this on every platform right before the release; changes will be" - print " committed once; there should be no differences between the platforms." - print "" - print "Actions:" - print "---------" - print " prepare [action] Prepare the project for a release; increases the version & build numbers, updates the build time," - print " and runs fix_web_assets; run this once for each release on one platform; changes will be committed." - print " The action can be 'major', 'minor', or 'patch'. The version will be updated accordingly." - print "" - print " publish Publish the project for all supported RIDs; run this on every platform." - print "" -} - -def "main prepare" [action: string] { - if (update_app_version $action) { - main fix_web_assets - inc_build_number - update_build_time - update_changelog - main metadata - } -} - -def "main metadata" [] { - update_dotnet_version - update_rust_version - update_mudblazor_version - update_tauri_version - update_project_commit_hash - update_license_year "../../LICENSE.md" - update_license_year "Pages/About.razor.cs" -} - -def "main fix_web_assets" [] { - - # Get the matching RIDs for the current OS: - let rids = get_rids - - # We chose the first RID to copy the assets from: - let rid = $rids.0 - - if (are_assets_exist $rid) == false { - print $"Web assets do not exist for ($rid). Please build the project first." - return - } - - # Ensure, that the dist directory exists: - mkdir wwwroot/system - - # Copy the web assets from the first RID to the source project: - let source_paths = glob --depth 99 bin/release/net9.0/($rid)/publish/wwwroot/_content/* - - for source_path in $source_paths { - cp --recursive --force --update $source_path wwwroot/system/ - } -} - -def "main publish" [] { - - main metadata - - # Ensure, that the dist directory exists: - mkdir bin/dist - - # Get the matching RIDs for the current OS: - let rids = get_rids - - if ($rids | length) == 0 { - print "No RIDs to build for." - return - } - - let current_os = get_os - let published_filename_dotnet = match $current_os { - "windows" => "mindworkAIStudio.exe", - _ => "mindworkAIStudio" - } - - # Build for each RID: - for rid in $rids { - print "==============================" - print $"Start building for ($rid)..." - - ^dotnet publish --configuration release --runtime $rid --disable-build-servers --force - - let final_filename = match $rid { - "win-x64" => "mindworkAIStudioServer-x86_64-pc-windows-msvc.exe", - "win-arm64" => "mindworkAIStudioServer-aarch64-pc-windows-msvc.exe", - "linux-x64" => "mindworkAIStudioServer-x86_64-unknown-linux-gnu", - "linux-arm64" => "mindworkAIStudioServer-aarch64-unknown-linux-gnu", - "osx-arm64" => "mindworkAIStudioServer-aarch64-apple-darwin", - "osx-x64" => "mindworkAIStudioServer-x86_64-apple-darwin", - - _ => { - print $"Unsupported RID for final filename: ($rid)" - return - } - } - - let published_path = $"bin/release/net9.0/($rid)/publish/($published_filename_dotnet)" - let final_path = $"bin/dist/($final_filename)" - - if ($published_path | path exists) { - print $"Published file ($published_path) exists." - } else { - print $"Published file ($published_path) does not exist. Compiling might failed?" - return - } - - print $"Moving ($published_path) to ($final_path)..." - mv --force $published_path $final_path - } - - print "==============================" - print "Start building runtime..." - - cd ../../runtime - try { - cargo tauri build --bundles none - }; - - cd "../app/MindWork AI Studio" - print "==============================" - print "Building done." -} - -def get_rids [] { - # Define the list of RIDs to build for, cf. https://learn.microsoft.com/en-us/dotnet/core/rid-catalog: - let rids = ["win-x64", "win-arm64", "linux-x64", "linux-arm64", "osx-arm64", "osx-x64"] - - # Get the current OS: - let current_os = get_os - let current_os_dotnet = match $current_os { - "windows" => "win-", - "linux" => "linux-", - "darwin" => "osx-", - - _ => { - print $"Unsupported OS: ($current_os)" - return - } - } - - # Filter the RIDs to build for the current OS: - let rids = $rids | where $it =~ $current_os_dotnet - - # Return the list of RIDs to build for: - $rids -} - -def get_os [] { - let os = (sys host).name | str downcase - if $os =~ "linux" { - return "linux" - } - $os -} - -def update_build_time [] { - mut meta_lines = open --raw ../../metadata.txt | lines - mut build_time = $meta_lines.1 - - let updated_build_time = (date now | date to-timezone UTC | format date "%Y-%m-%d %H:%M:%S") - print $"Updated build time from ($build_time) to ($updated_build_time) UTC." - - $build_time = $"($updated_build_time) UTC" - $meta_lines.1 = $build_time - $meta_lines | save --raw --force ../../metadata.txt -} - -def inc_build_number [] { - mut meta_lines = open --raw ../../metadata.txt | lines - mut build_number = $meta_lines.2 | into int - - let updated_build_number = ([$build_number, 1] | math sum) - print $"Incremented build number from ($build_number) to ($updated_build_number)." - - $build_number = $updated_build_number - $meta_lines.2 = ($build_number | into string) - $meta_lines | save --raw --force ../../metadata.txt -} - -def update_dotnet_version [] { - mut meta_lines = open --raw ../../metadata.txt | lines - mut dotnet_sdk_version = $meta_lines.3 - mut dotnet_version = $meta_lines.4 - - let dotnet_data = (^dotnet --info) | collect | parse --regex '(?ms).?(NET\s+SDK|SDK\s+\.NET)\s*:\s+Version:\s+(?P[0-9.]+).+Commit:\s+(?P[a-zA-Z0-9]+).+Host:\s+Version:\s+(?P[0-9.]+).+Commit:\s+(?P[a-zA-Z0-9]+)' - let sdk_version = $dotnet_data.sdkVersion.0 - let host_version = $dotnet_data.hostVersion.0 - let sdkCommit = $dotnet_data.sdkCommit.0 - let hostCommit = $dotnet_data.hostCommit.0 - - print $"Updated .NET SDK version from ($dotnet_sdk_version) to ($sdk_version) \(commit ($sdkCommit)\)." - $meta_lines.3 = $"($sdk_version) \(commit ($sdkCommit)\)" - - print $"Updated .NET version from ($dotnet_version) to ($host_version) \(commit ($hostCommit)\)." - $meta_lines.4 = $"($host_version) \(commit ($hostCommit)\)" - - $meta_lines | save --raw --force ../../metadata.txt -} - -def update_rust_version [] { - mut meta_lines = open --raw ../../metadata.txt | lines - mut rust_version = $meta_lines.5 - - let rust_data = (^rustc -Vv) | parse --regex 'rustc (?[0-9.]+)(?:-nightly)? \((?[a-zA-Z0-9]+)' - let version = $rust_data.version.0 - let commit = $rust_data.commit.0 - - print $"Updated Rust version from ($rust_version) to ($version) \(commit ($commit)\)." - $meta_lines.5 = $"($version) \(commit ($commit)\)" - - $meta_lines | save --raw --force ../../metadata.txt -} - -def update_mudblazor_version [] { - mut meta_lines = open --raw ../../metadata.txt | lines - mut mudblazor_version = $meta_lines.6 - - let mudblazor_data = (^dotnet list package) | parse --regex 'MudBlazor\s+(?[0-9.]+)' - let version = $mudblazor_data.version.0 - - print $"Updated MudBlazor version from ($mudblazor_version) to ($version)." - $meta_lines.6 = $version - - $meta_lines | save --raw --force ../../metadata.txt -} - -def update_tauri_version [] { - mut meta_lines = open --raw ../../metadata.txt | lines - mut tauri_version = $meta_lines.7 - - cd ../../runtime - let tauri_data = (^cargo tree --depth 1) | parse --regex 'tauri\s+v(?[0-9.]+)' - let version = $tauri_data.version.0 - cd "../app/MindWork AI Studio" - - print $"Updated Tauri version from ($tauri_version) to ($version)." - $meta_lines.7 = $version - - $meta_lines | save --raw --force ../../metadata.txt -} - -def update_license_year [licence_file: string] { - let current_year = (date now | date to-timezone UTC | format date "%Y") - let license_text = open --raw $licence_file | lines - print $"Updating the license's year in ($licence_file) to ($current_year)." - - # Target line looks like `Copyright 2024 Thorsten Sommer`. - # Perhaps, there are whitespaces at the beginning. Using - # a regex to match the year. - let updated_license_text = $license_text | each { |it| - if $it =~ '^\s*Copyright\s+[0-9]{4}' { - $it | str replace --regex '([0-9]{4})' $"($current_year)" - } else { - $it - } - } - - $updated_license_text | save --raw --force $licence_file -} - -def update_app_version [action: string] { - mut meta_lines = open --raw ../../metadata.txt | lines - mut app_version = $meta_lines.0 - - let version_data = $app_version | parse --regex '(?P[0-9]+)\.(?P[0-9]+)\.(?P[0-9]+)' - - if $action == "major" { - - mut major = $version_data.major | into int - $major = ([$major.0, 1] | math sum) - - let updated_version = [$major, 0, 0] | str join "." - print $"Updated app version from ($app_version) to ($updated_version)." - $meta_lines.0 = $updated_version - - } else if $action == "minor" { - - let major = $version_data.major | into int - mut minor = $version_data.minor | into int - $minor = ([$minor.0, 1] | math sum) - - let updated_version = [$major.0, $minor, 0] | str join "." - print $"Updated app version from ($app_version) to ($updated_version)." - $meta_lines.0 = $updated_version - - } else if $action == "patch" { - - let major = $version_data.major | into int - let minor = $version_data.minor | into int - mut patch = $version_data.patch | into int - $patch = ([$patch.0, 1] | math sum) - - let updated_version = [$major.0, $minor.0, $patch] | str join "." - print $"Updated app version from ($app_version) to ($updated_version)." - $meta_lines.0 = $updated_version - - } else { - print $"Invalid action '($action)'. Please use 'major', 'minor', or 'patch'." - return false - } - - $meta_lines | save --raw --force ../../metadata.txt - return true -} - -def update_project_commit_hash [] { - mut meta_lines = open --raw ../../metadata.txt | lines - mut commit_hash = $meta_lines.8 - - # Check, if the work directory is clean. We allow, that the metadata file is dirty: - let git_status = (^git status --porcelain) | lines - let dirty_files = $git_status | length - let first_is_metadata = ($dirty_files > 0 and $git_status.0 =~ '^\sM\s+metadata.txt$') - let git_tag_response = ^git describe --tags --exact-match | complete - let state = { - num_dirty: $dirty_files, - first_is_metadata: $first_is_metadata, - git_tag_present: ($git_tag_response.exit_code == 0), - git_tag: $git_tag_response.stdout - } - - let commit_postfix = match $state { - { num_dirty: $num_dirty, first_is_metadata: _, git_tag_present: _, git_tag: _ } if $num_dirty > 1 => ", dev debug", - { num_dirty: $num_dirty, first_is_metadata: false, git_tag_present: _, git_tag: _ } if $num_dirty == 1 => ", dev debug", - { num_dirty: $num_dirty, first_is_metadata: true, git_tag_present: false, git_tag: _ } if $num_dirty == 1 => ", dev testing", - { num_dirty: $num_dirty, first_is_metadata: false, git_tag_present: false, git_tag: _ } if $num_dirty == 0 => ", dev testing", - { num_dirty: $num_dirty, first_is_metadata: true, git_tag_present: true, git_tag: $tag } if $num_dirty == 1 => $", release $tag", - { num_dirty: $num_dirty, first_is_metadata: false, git_tag_present: true, git_tag: $tag } if $num_dirty == 0 => $", release $tag", - - _ => "-dev unknown" - } - - # Use the first ten characters of the commit hash: - let updated_commit_hash = (^git rev-parse HEAD) | str substring 0..10 | append $commit_postfix | str join - print $"Updated commit hash from ($commit_hash) to ($updated_commit_hash)." - - $meta_lines.8 = $updated_commit_hash - $meta_lines | save --raw --force ../../metadata.txt -} - -def update_changelog [] { - # Get all changelog files: - let all_changelog_files = glob wwwroot/changelog/*.md - - # Create a table with the build numbers and the corresponding file names: - let table = $all_changelog_files | reduce --fold [] { |it, acc| - let header_line = open --raw $it | lines | first - let file_name = $it | path basename - let header_data = $header_line | parse --regex '#\s+(?P
(?Pv[0-9.]+)[,\s]+build\s+(?P[0-9]+)[,\s]+\((?P[0-9-?\s:UTC]+)\))' - $acc ++ [[build_num, file_name, header]; [$header_data.build_num.0, $file_name, $header_data.header.0]] - } | sort-by build_num --natural --reverse - - # Now, we build the necessary C# code: - const tab = " "; # using 4 spaces as one tab - let code_rows = $table | reduce --fold "" { |it, acc| - $acc ++ $"($tab)($tab)new \(($it.build_num), \"($it.header)\", \"($it.file_name)\"\),\n" - } - - let code = ($"LOGS = \n($tab)[\n($code_rows)\n($tab)];") - - # Next, update the Changelog.Logs.cs file: - let changelog_logs_source_file = open --raw "Components/Changelog.Logs.cs" - let result = $changelog_logs_source_file | str replace --regex '(?ms)LOGS =\s+\[[\w\s".,-:()?]+\];' $code - - # Save the updated file: - $result | save --raw --force "Components/Changelog.Logs.cs" - - let number_change_logs = $table | length - print $"Updated Changelog.Logs.cs with ($number_change_logs) change logs." -} \ No newline at end of file diff --git a/app/MindWork AI Studio/packages.lock.json b/app/MindWork AI Studio/packages.lock.json index 7c4e67da..397b60db 100644 --- a/app/MindWork AI Studio/packages.lock.json +++ b/app/MindWork AI Studio/packages.lock.json @@ -4,23 +4,23 @@ "net9.0": { "CodeBeam.MudBlazor.Extensions": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "MNxReFDmME1OLhHsD7lrfQZ9cMu5X60PIvidyFueq0ddDKHlagHS6CuYBZRQ62rHqmocdHWOLyJ73t2Im0NnWw==", + "requested": "[8.2.1, )", + "resolved": "8.2.1", + "contentHash": "qPCjpk6vSsjJUt3Kc0J0RLC3aZDYgaE+wDEfvDdWQHh4CtatWF8wr/jfG6q3EwP0V91nr03cW+KCCKZ5JMEnTg==", "dependencies": { "BuildBundlerMinifier": "3.2.449", "CsvHelper": "33.0.1", - "Microsoft.AspNetCore.Components": "9.0.1", - "Microsoft.AspNetCore.Components.Web": "9.0.1", + "Microsoft.AspNetCore.Components": "9.0.5", + "Microsoft.AspNetCore.Components.Web": "9.0.5", "MudBlazor": "8.0.0", "ZXing.Net": "0.16.9" } }, "HtmlAgilityPack": { "type": "Direct", - "requested": "[1.12.0, )", - "resolved": "1.12.0", - "contentHash": "VHtVZmfoYhQyA/POvZRLuTpCz1zhzIDrdYRJIRV73e9wKAzjW71biYNOHOWx8MxEX3TE4TWVfx1QDRoZcj2AWw==" + "requested": "[1.12.1, )", + "resolved": "1.12.1", + "contentHash": "SP6/2Y26CXtxjXn0Wwsom9Ek35SNWKHEu/IWhNEFejBSSVWWXPRSlpqpBSYWv1SQhYFnwMO01xVbEdK3iRR4hg==" }, "LuaCSharp": { "type": "Direct", @@ -30,24 +30,24 @@ }, "Microsoft.Extensions.FileProviders.Embedded": { "type": "Direct", - "requested": "[9.0.3, )", - "resolved": "9.0.3", - "contentHash": "UKfKGlZ7jKfe6v4rLsjnH/mGbD3e4YD9EK+Uobu+KIxwfhZuLLCtXm4CWTOf2s1t+ItmMs0QqbSJAXaMXCxLOw==", + "requested": "[9.0.5, )", + "resolved": "9.0.5", + "contentHash": "tgYXJtPa72hYrQuw+pqJvvhUOOQtZuk5jhRZINxIgR0cXwe4bLCQhCGffN+Ad4+AIQOlz4YyOc+GX+unsHc9Kg==", "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.3" + "Microsoft.Extensions.FileProviders.Abstractions": "9.0.5" } }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[9.0.3, )", - "resolved": "9.0.3", - "contentHash": "1rqGTfubVg0qj2PsK6esyq3PIxtYJYrN3LsYUV9RrvH3anmt3fT3ozYdAZZH4U8JU/pt5pPIUk8NBSu26wtekA==" + "requested": "[9.0.5, )", + "resolved": "9.0.5", + "contentHash": "4L7wbb3Y4BJgIeSnmAf/C6S/qCs9rT1b0dX72uj3qo0qvUH7D0U1tU5ZlC7A3Wb8E/dXK4caOi4JkdLTVJaXhw==" }, "MudBlazor": { "type": "Direct", - "requested": "[8.5.1, )", - "resolved": "8.5.1", - "contentHash": "xzGhtY60e1fvvyI7rJSYYV0UEkvY8niKuTaqby19cb8rELd29EpPU439RVL8KjVSMy473BEcpgYWBRAoDPGl8A==", + "requested": "[8.6.0, )", + "resolved": "8.6.0", + "contentHash": "vJROmWdTjiBmyiZBSbD8RcYVFfLbNMEQpKoCOMfY2628KbOLGVcnH1RBziHGyJH9pqc99UoCQS81XLm8X+49ug==", "dependencies": { "Microsoft.AspNetCore.Components": "9.0.1", "Microsoft.AspNetCore.Components.Web": "9.0.1", @@ -56,12 +56,13 @@ }, "MudBlazor.Markdown": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "0DcXQFEIgKJsaMCDva0Ck3gempoctyc7s8GLK5VagozlZdXql6W4SKX/imM/NfyfV7SxLrUTRJyLJX0Te+02sQ==", + "requested": "[8.6.0, )", + "resolved": "8.6.0", + "contentHash": "TIrR6QqXXBmHRx/L66Jxl9UlVtom8jK46iVpPkTi8C7TjsUUylI5zBzmKPiVYp8bKDhgLzOcQH0o01xuHlKJEw==", "dependencies": { - "Markdig": "0.40.0", - "MudBlazor": "8.0.0" + "Markdig": "0.41.1", + "Microsoft.Extensions.Caching.Memory": "9.0.4", + "MudBlazor": "8.6.0" } }, "ReverseMarkdown": { @@ -85,77 +86,97 @@ }, "Markdig": { "type": "Transitive", - "resolved": "0.40.0", - "contentHash": "4ve14zs+gt1irldTQE3y5FLAHuzmhW7T99lAAvVipe/q2LWT/nUCO0iICb9TXGvMX6n7Z1OZroFXkdSy91rO8w==" + "resolved": "0.41.1", + "contentHash": "e9QXUg2agxd9iWV3hO5fA4Qp2avMuXFiElatzD8hp69yIEgESrdhKvDFf9y9NOlPe9jO7AA6W1JAnntLmqwRwA==" }, "Microsoft.AspNetCore.Authorization": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "WgLlLBlMczb2+QLNG6sM95OUZ0EBztz60k/N75tjIgpyu0SdpIfYytAmX/7JJAjRTZF0c/CrWaQV+SH9FuGsrA==", + "resolved": "9.0.5", + "contentHash": "HPd+7PG+nMZSP13bTJuM5+q0vdzoBtjoBUMP9iuUGwG/kFHkeBOZ9QrZuSHHGmz/IgYdLbqbdJGEykSI5biIPw==", "dependencies": { - "Microsoft.AspNetCore.Metadata": "9.0.1", - "Microsoft.Extensions.Logging.Abstractions": "9.0.1", - "Microsoft.Extensions.Options": "9.0.1" + "Microsoft.AspNetCore.Metadata": "9.0.5", + "Microsoft.Extensions.Logging.Abstractions": "9.0.5", + "Microsoft.Extensions.Options": "9.0.5" } }, "Microsoft.AspNetCore.Components": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "6pwfbQKNtvPkbF4tCGiAKGyt6BVpu58xAXz7u2YXcUKTNmNxrymbG1mEyMc0EPzVdnquDDqTyfXM3mC1EJycxQ==", + "resolved": "9.0.5", + "contentHash": "qwA9bx7nWayh1ogWe1H13vyGL64pNjHrukHmnZ9WZbQPtHeY9QTuXkvF/Uue0tzGbxChBf9v2LH5+KeVaRJIqw==", "dependencies": { - "Microsoft.AspNetCore.Authorization": "9.0.1", - "Microsoft.AspNetCore.Components.Analyzers": "9.0.1" + "Microsoft.AspNetCore.Authorization": "9.0.5", + "Microsoft.AspNetCore.Components.Analyzers": "9.0.5" } }, "Microsoft.AspNetCore.Components.Analyzers": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "I8Rs4LXT5UQxM5Nin2+Oj8aSY2heszSZ3EyTLgt3mxmfiRPrVO7D8NNSsf1voI2Gb0qFJceof/J5c9E+nfNuHw==" + "resolved": "9.0.5", + "contentHash": "u9dQP0/bjkTVHFHVBV+8TYpBVerjbFfvD3nwwOfaoJ8VmyCHoBFbD8m4nxV+rfu+jVLe2FQF4skjHZLIjjFbyQ==" }, "Microsoft.AspNetCore.Components.Forms": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "KyULVU32bLz74LWDwPEwNUEllTehzWJuM7YAsz80rMKEzvR0K8cRjRzO0fnN/nfydMeLRRlbI0xj8wnEAymLVw==", + "resolved": "9.0.5", + "contentHash": "KsAPGDQIa3SpP9yaIDrlETHpqprtmbbotdbGfGJ9aVvn/vi72cCTUVzpWOXIXgstVCb0ZQ940o/wfHKxBZEQMg==", "dependencies": { - "Microsoft.AspNetCore.Components": "9.0.1" + "Microsoft.AspNetCore.Components": "9.0.5" } }, "Microsoft.AspNetCore.Components.Web": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "LI0vjYEd9MaDZPDQxPCn4gGYDkEC5U9rp1nWZo7rPozJxgTG2zU3WERujxTi2LeAC2ZzdXlOVCrUyPQ55LZV2A==", + "resolved": "9.0.5", + "contentHash": "llh2dh9rR9JcnAMqvbijc9BzEnVhloQwKF8Kvfw73N2tJMnUJoxF3C9Ln1sao+nkZo3IpUuUu3k2czLOpS3NRQ==", "dependencies": { - "Microsoft.AspNetCore.Components": "9.0.1", - "Microsoft.AspNetCore.Components.Forms": "9.0.1", - "Microsoft.Extensions.DependencyInjection": "9.0.1", - "Microsoft.Extensions.Primitives": "9.0.1", - "Microsoft.JSInterop": "9.0.1" + "Microsoft.AspNetCore.Components": "9.0.5", + "Microsoft.AspNetCore.Components.Forms": "9.0.5", + "Microsoft.Extensions.DependencyInjection": "9.0.5", + "Microsoft.Extensions.Primitives": "9.0.5", + "Microsoft.JSInterop": "9.0.5" } }, "Microsoft.AspNetCore.Metadata": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "EZnHifamF7IFEIyjAKMtJM3I/94OIe72i3P09v5oL0twmsmfQwal6Ni3m8lbB5mge3jWFhMozeW+rUdRSqnXRQ==" + "resolved": "9.0.5", + "contentHash": "E4lbYlraZfZLvWgliUEtrqKt42++Yh9mpGKLyGHPGo1FpbZrXF/x+fOg5dbe22bnuosgWn3cj30566XKdwiodw==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "imcZ5BGhBw5mNsWLepBbqqumWaFe0GtvyCvne2/2wsDIBRa2+Lhx4cU/pKt/4BwOizzUEOls2k1eOJQXHGMalg==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.4" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.4", + "contentHash": "G5rEq1Qez5VJDTEyRsRUnewAspKjaY57VGsdZ8g8Ja6sXXzoiI3PpTd1t43HjHqNWD5A06MQveb2lscn+2CU+w==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.4", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.4", + "Microsoft.Extensions.Logging.Abstractions": "9.0.4", + "Microsoft.Extensions.Options": "9.0.4", + "Microsoft.Extensions.Primitives": "9.0.4" + } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "qZI42ASAe3hr2zMSA6UjM92pO1LeDq5DcwkgSowXXPY8I56M76pEKrnmsKKbxagAf39AJxkH2DY4sb72ixyOrg==", + "resolved": "9.0.5", + "contentHash": "N1Mn0T/tUBPoLL+Fzsp+VCEtneUhhxc1//Dx3BeuQ8AX+XrMlYCfnp2zgpEXnTCB7053CLdiqVWPZ7mEX6MPjg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "Tr74eP0oQ3AyC24ch17N8PuEkrPbD0JqIfENCYqmgKYNOmL8wQKzLJu3ObxTUDrjnn4rHoR1qKa37/eQyHmCDA==" + "resolved": "9.0.5", + "contentHash": "cjnRtsEAzU73aN6W7vkWy8Phj5t3Xm78HSqgrbh/O4Q9SK/yN73wZVa21QQY6amSLQRQ/M8N+koGnY6PuvKQsw==" }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "9.0.3", - "contentHash": "umczZ3+QPpzlrW/lkvy+IB0p52+qZ5w++aqx2lTCMOaPKzwcbVdrJgiQ3ajw5QWBp7gChLUiCYkSlWUpfjv24g==", + "resolved": "9.0.5", + "contentHash": "LLm+e8lvD+jOI+blHRSxPqywPaohOTNcVzQv548R1UpkEiNB2D+zf3RrqxBdB1LDPicRMTnfiaKJovxF8oX1bQ==", "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.3" + "Microsoft.Extensions.Primitives": "9.0.5" } }, "Microsoft.Extensions.Localization": { @@ -176,35 +197,38 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "w2gUqXN/jNIuvqYwX3lbXagsizVNXYyt6LlF57+tMve4JYCEgCMMAjRce6uKcDASJgpMbErRT1PfHy2OhbkqEA==", + "resolved": "9.0.5", + "contentHash": "pP1PADCrIxMYJXxFmTVbAgEU7GVpjK5i0/tyfU9DiE0oXQy3JWQaOVgCkrCiePLgS8b5sghM3Fau3EeHiVWbCg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5" } }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "nggoNKnWcsBIAaOWHA+53XZWrslC7aGeok+aR+epDPRy7HI7GwMnGZE8yEsL2Onw7kMOHVHwKcsDls1INkNUJQ==", + "resolved": "9.0.5", + "contentHash": "vPdJQU8YLOUSSK8NL0RmwcXJr2E0w8xH559PGQl4JYsglgilZr9LZnqV2zdgk+XR05+kuvhBEZKoDVd46o7NqA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.1", - "Microsoft.Extensions.Primitives": "9.0.1" + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.5", + "Microsoft.Extensions.Primitives": "9.0.5" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "9.0.3", - "contentHash": "yCCJHvBcRyqapMSNzP+kTc57Eaavq2cr5Tmuil6/XVnipQf5xmskxakSQ1enU6S4+fNg3sJ27WcInV64q24JsA==" + "resolved": "9.0.5", + "contentHash": "b4OAv1qE1C9aM+ShWJu3rlo/WjDwa/I30aIPXqDWSKXTtKl1Wwh6BZn+glH5HndGVVn3C6ZAPQj5nv7/7HJNBQ==" }, "Microsoft.JSInterop": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "/xBwIfb0YoC2Muv6EsHjxpqZw2aKv94+i0g0FWZvqvGv3DeAy+8wipAuECVvKYEs2EIclRD41bjajHLoD6mTtw==" + "resolved": "9.0.5", + "contentHash": "ji4fQKbUUZiq3lmzVBMvp15VgBtEyfR51NrmEjo6qnD97Jf1R6C6QkSMjwUO8bw5NZIDRtmPCYurypB3W5AMEg==" }, "ZXing.Net": { "type": "Transitive", "resolved": "0.16.9", "contentHash": "7WaVMHklpT3Ye2ragqRIwlFRsb6kOk63BOGADV0fan3ulVfGLUYkDi5yNUsZS/7FVNkWbtHAlDLmu4WnHGfqvQ==" + }, + "sharedtools": { + "type": "Project" } }, "net9.0/osx-arm64": {} diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.39.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.39.md index 4582c534..c6ed55d4 100644 --- a/app/MindWork AI Studio/wwwroot/changelog/v0.9.39.md +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.39.md @@ -1,4 +1,4 @@ -# v0.9.39, build 214 (2025-04-06 10:18 UTC) +# v0.9.39, build 214 (2025-04-07 17:39 UTC) - Added UI for error handling to display any LLM provider issues. - Added a feature flag for the plugin system. This flag is disabled by default and can be enabled inside the app settings. Please note that this feature is still in development; there are no plugins available yet. - Added the Lua library we use for the plugin system to the about page. diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.40.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.40.md new file mode 100644 index 00000000..adb67535 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.40.md @@ -0,0 +1,11 @@ +# v0.9.40, build 215 (2025-04-20 13:30 UTC) +- Added support for the announced OpenAI `o4` models. +- Added Alibaba Cloud as a new provider. Thanks Peer `peerschuett` for the contribution. +- Added the Hugging Face inference provider as an LLM provider to AI Studio. Thanks Peer `peerschuett` for the contribution. +- Added the current CPU architecture to the about page. This information helps us identify issues. +- Improved the LLM & embedding provider dialogs by hiding not relevant options. +- Improved the provider selection by showing the name of the provider in the provider selection instead of its identifier. +- Improved the developer experience by adding a tolerant enum converter for better configuration handling. +- Fixed an issue where OpenAI `o3` models were not shown in the model selection. +- Upgraded to .NET 9.0.4. +- Upgraded .NET & Rust dependencies. diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.41.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.41.md new file mode 100644 index 00000000..529ec7b6 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.41.md @@ -0,0 +1,10 @@ +# v0.9.41, build 216 (2025-04-27 14:18 UTC) +- Added the user-language, as provided by the OS, to the about page. This helps in identifying user-specific issues related to language settings. +- Added the localization assistant as a preview feature behind the plugin preview flag. This helps AI Studio developers to translate AI Studio to different languages. +- Added German language support as a preview feature behind the plugin preview flag. This allows users to test the German language support in AI Studio. +- Changed the terminology from "temporary chats" to "disappearing chats" in the UI. This makes it clearer to understand the purpose of these chats. +- Improved the hot reloading of the plugin system to prevent overlapping reloads. +- Improved the app behavior when the user system was waked up from sleep mode. +- Improved the provider dialog with better input handling for API keys and an optimized model selection. +- Improved provider's model selection by filtering added non-text outputting models, which are not supported yet. +- Fixed the color for the update notification button to match the color theme. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.42.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.42.md new file mode 100644 index 00000000..7d8ea6fd --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.42.md @@ -0,0 +1,12 @@ +# v0.9.42, build 217 (2025-05-04 13:03 UTC) +- Added the writing style "Changelog" to the rewrite & improve text assistant. This helps to create changelogs for your projects. +- Added an option to load PDF files directly into the translation, text summarization, and legal check assistants as a preview prototype for testing before release. +- Added more text content to the localization system. +- Improved the model selection for OpenAI by removing all `o1-pro` models. These models cannot be used right now, since OpenAI introduced a new API, which is not yet supported by MindWork AI Studio. +- Improved the internal plugin maintenance so that removed resources are now removed from the file system. +- Improved the app settings to apply the chosen language immediately. +- Improved chat name generation to prevent the inclusion of line breaks, tabs, and other special characters. +- Fixed an issue where empty lines in source code were being ignored by the Markdown renderer. Thanks My Nihongo for fixing this bug in the `MudBlazor.Markdown` repository. +- Fixed the localization assistant not being able to load the localization file when used in the release app. +- Fixed the localization of the navigation component. +- Upgraded Rust & .NET dependencies. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.43.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.43.md new file mode 100644 index 00000000..5aa7438c --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.43.md @@ -0,0 +1,8 @@ +# v0.9.43, build 218 (2025-05-11 17:22 UTC) +- Added our first titan: the German Aerospace Center (DLR) uses AI Studio in several projects and supports further development with personnel resources. +- Added the ability to select the new Google Gemini embeddings in the embedding configuration. +- Added localization for embedding configuration, bias of the day, and the agenda assistant. +- Improved the automatic German translation; thanks Peer (`peerschuett`) for contributing. +- Improved Google Gemini LLM model selection by filtering out the new embedding models. +- Improved the dialog for configuring embeddings: the API key is applied immediately, and provider formatting was enhanced. +- Upgraded .NET dependencies. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.44.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.44.md new file mode 100644 index 00000000..cff2cb4c --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.44.md @@ -0,0 +1,12 @@ +# v0.9.44, build 219 (2025-05-18 19:33 UTC) +- Added PDF import feature: we have completed the work on the PDF import feature. Importing PDF files has been successfully tested on macOS, Linux, and Windows. The feature is now enabled for everyone. +- Added more text content to the localization and added the German translation for it. +- Improved compatibility with certain Ubuntu linux versions regarding desktop integration. +- Improved the table views for providers, embeddings, and profiles by displaying actions as icons with tooltips. +- Improved localization code & German translation. +- Fixed a bug with text fields when their content was read live. This issue caused the user interface to refresh too frequently, resulting in increased energy consumption. +- Fixed an issue that caused live translation to stop working. +- Fixed a rare bug that could, under some circumstances, prevent the currently open chat from being renamed. +- Upgraded to .NET 9.0.5 +- Upgraded to Rust 1.87.0 +- Upgraded dependencies \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.45.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.45.md new file mode 100644 index 00000000..82c793c5 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.45.md @@ -0,0 +1,10 @@ +# v0.9.45, build 220 (2025-05-25 13:56 UTC) +- Added chat templates. They are similar to common AI companies' playgrounds, where you can define your own system prompts and leverage assistant prompts for providers that support them. We thank Peer `peerschuett` for the work on this feature. +- Added Russian as a language option for various assistants (e.g., translations, text summarization). +- Improved the password and API key input fields: they now optionally display their content to allow users to verify manual input. +- Improved the Anthropic provider by adding aliase and capabilities for the new Claude 4 models. +- Improved the German translation. +- Changed the design of the data source settings to match the new design. +- Moved the chat options: you can access them directly from the chat interface. +- Moved the profile settings to the profile selection: this allows you to manage your profiles directly from where you use them. +- Moved the workspace settings directly to the workspaces so you can configure them directly there. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/changelog/v0.9.46.md b/app/MindWork AI Studio/wwwroot/changelog/v0.9.46.md new file mode 100644 index 00000000..2c4b5e56 --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/changelog/v0.9.46.md @@ -0,0 +1,3 @@ +# v0.9.46, build 221 (2025-06-xx xx:xx UTC) +- Added the ability to configure the maximum number of results returned per request for all data sources. Please note that this feature remains in preview and is not visible to all users. +- Added more text content to the I18N system & added the German translation for it. \ No newline at end of file diff --git a/app/MindWork AI Studio/wwwroot/svg/titans/DLR.svg b/app/MindWork AI Studio/wwwroot/svg/titans/DLR.svg new file mode 100644 index 00000000..49b9086c --- /dev/null +++ b/app/MindWork AI Studio/wwwroot/svg/titans/DLR.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/SharedTools/FNVHash.cs b/app/SharedTools/FNVHash.cs new file mode 100644 index 00000000..a60beeff --- /dev/null +++ b/app/SharedTools/FNVHash.cs @@ -0,0 +1,62 @@ +// ReSharper disable MemberCanBePrivate.Global +namespace SharedTools; + +/// +/// Implements the Fowler–Noll–Vo hash function for 32-bit and 64-bit hashes. +/// +public static class FNVHash +{ + private const uint FNV_OFFSET_BASIS_32_BIT = 2_166_136_261; + private const ulong FNV_OFFSET_BASIS_64_BIT = 14_695_981_039_346_656_037; + + private const uint FNV_PRIME_32_BIT = 16_777_619; + private const ulong FNV_PRIME_64_BIT = 1_099_511_628_211; + + /// + /// Computes the 32bit FNV-1a hash of a string. + /// + /// The string to hash. + /// The 32bit FNV-1a hash of the string. + public static uint ToFNV32(this string text) => ToFNV32(text.AsSpan()); + + /// + /// Computes the 32bit FNV-1a hash of a string. + /// + /// The string to hash. + /// The 32bit FNV-1a hash of the string. + public static uint ToFNV32(this ReadOnlySpan text) + { + var hash = FNV_OFFSET_BASIS_32_BIT; + foreach (var c in text) + { + hash ^= c; + hash *= FNV_PRIME_32_BIT; + } + + return hash; + } + + /// + /// Computes the 64bit FNV-1a hash of a string. + /// + /// The string to hash. + /// The 64bit FNV-1a hash of the string. + public static ulong ToFNV64(this string text) => ToFNV64(text.AsSpan()); + + /// + /// Computes the 64bit FNV-1a hash of a string. + /// + /// The string to hash. + /// The 64bit FNV-1a hash of the string. + public static ulong ToFNV64(this ReadOnlySpan text) + { + var hash = FNV_OFFSET_BASIS_64_BIT; + foreach (var c in text) + { + hash ^= c; + hash *= FNV_PRIME_64_BIT; + } + + return hash; + } +} \ No newline at end of file diff --git a/app/SharedTools/LuaTable.cs b/app/SharedTools/LuaTable.cs new file mode 100644 index 00000000..e03eea55 --- /dev/null +++ b/app/SharedTools/LuaTable.cs @@ -0,0 +1,41 @@ +using System.Text; + +namespace SharedTools; + +public static class LuaTable +{ + public static string Create(ref StringBuilder sb, string tableVariableName, IReadOnlyDictionary keyValuePairs, IReadOnlyDictionary? commentContent = null, CancellationToken cancellationToken = default) + { + // + // Add the UI_TEXT_CONTENT table: + // + sb.AppendLine($$"""{{tableVariableName}} = {}"""); + foreach (var kvp in keyValuePairs.OrderBy(x => x.Key)) + { + if (cancellationToken.IsCancellationRequested) + return sb.ToString(); + + var key = kvp.Key; + var value = kvp.Value.Replace("\n", " ").Trim(); + var commentValue = commentContent is null ? value : commentContent.GetValueOrDefault(key, value); + + // Remove the "UI_TEXT_CONTENT." prefix from the key: + const string UI_TEXT_CONTENT = "UI_TEXT_CONTENT."; + var keyWithoutPrefix = key.StartsWith(UI_TEXT_CONTENT, StringComparison.OrdinalIgnoreCase) ? key[UI_TEXT_CONTENT.Length..] : key; + + // Replace all dots in the key with colons: + keyWithoutPrefix = keyWithoutPrefix.Replace(".", "::"); + + // Add a comment with the original text content: + sb.AppendLine(); + sb.AppendLine($"-- {commentValue}"); + + // Add the assignment to the UI_TEXT_CONTENT table: + sb.AppendLine($""" + UI_TEXT_CONTENT["{keyWithoutPrefix}"] = "{LuaTools.EscapeLuaString(value)}" + """); + } + + return sb.ToString(); + } +} \ No newline at end of file diff --git a/app/SharedTools/LuaTools.cs b/app/SharedTools/LuaTools.cs new file mode 100644 index 00000000..53bd07c6 --- /dev/null +++ b/app/SharedTools/LuaTools.cs @@ -0,0 +1,10 @@ +namespace SharedTools; + +public static class LuaTools +{ + public static string EscapeLuaString(string value) + { + // Replace backslashes with double backslashes and escape double quotes: + return value.Replace("\\", @"\\").Replace("\"", "\\\""); + } +} \ No newline at end of file diff --git a/app/SharedTools/RID.cs b/app/SharedTools/RID.cs new file mode 100644 index 00000000..95733713 --- /dev/null +++ b/app/SharedTools/RID.cs @@ -0,0 +1,15 @@ +namespace SharedTools; + +public enum RID +{ + NONE, + + WIN_X64, + WIN_ARM64, + + LINUX_X64, + LINUX_ARM64, + + OSX_X64, + OSX_ARM64, +} \ No newline at end of file diff --git a/app/SharedTools/RIDExtensions.cs b/app/SharedTools/RIDExtensions.cs new file mode 100644 index 00000000..015357f9 --- /dev/null +++ b/app/SharedTools/RIDExtensions.cs @@ -0,0 +1,46 @@ +namespace SharedTools; + +public static class RIDExtensions +{ + public static string AsMicrosoftRid(this RID rid) => rid switch + { + RID.WIN_X64 => "win-x64", + RID.WIN_ARM64 => "win-arm64", + + RID.LINUX_X64 => "linux-x64", + RID.LINUX_ARM64 => "linux-arm64", + + RID.OSX_X64 => "osx-x64", + RID.OSX_ARM64 => "osx-arm64", + + _ => string.Empty, + }; + + public static string ToUserFriendlyName(this RID rid) => rid switch + { + RID.WIN_X64 => "Windows x64", + RID.WIN_ARM64 => "Windows ARM64", + + RID.LINUX_X64 => "Linux x64", + RID.LINUX_ARM64 => "Linux ARM64", + + RID.OSX_X64 => "macOS x64", + RID.OSX_ARM64 => "macOS ARM64", + + _ => "unknown", + }; + + public static RID ToRID(this string rid) => rid switch + { + "win-x64" => RID.WIN_X64, + "win-arm64" => RID.WIN_ARM64, + + "linux-x64" => RID.LINUX_X64, + "linux-arm64" => RID.LINUX_ARM64, + + "osx-x64" => RID.OSX_X64, + "osx-arm64" => RID.OSX_ARM64, + + _ => RID.NONE, + }; +} \ No newline at end of file diff --git a/app/SharedTools/SharedTools.csproj b/app/SharedTools/SharedTools.csproj new file mode 100644 index 00000000..e0439ac8 --- /dev/null +++ b/app/SharedTools/SharedTools.csproj @@ -0,0 +1,10 @@ + + + + net9.0 + latest + enable + enable + + + diff --git a/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs index f48c374b..1e601a6f 100644 --- a/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs +++ b/app/SourceCodeRules/SourceCodeRules/UsageAnalyzers/ThisUsageAnalyzer.cs @@ -36,7 +36,7 @@ public sealed class ThisUsageAnalyzer : DiagnosticAnalyzer { var genericNameSyntax = (GenericNameSyntax)context.Node; - // Skip if already part of a 'this' expression + // Skip if already part of a 'this' expression: if (IsAccessedThroughThis(genericNameSyntax)) return; @@ -46,7 +46,11 @@ public sealed class ThisUsageAnalyzer : DiagnosticAnalyzer if (IsPartOfMemberAccess(genericNameSyntax)) return; - // Get symbol info for the generic name + // Skip if it's the 'T' translation method + if (IsTranslationMethod(genericNameSyntax)) + return; + + // Get symbol info for the generic name: var symbolInfo = context.SemanticModel.GetSymbolInfo(genericNameSyntax); var symbol = symbolInfo.Symbol; @@ -83,15 +87,24 @@ public sealed class ThisUsageAnalyzer : DiagnosticAnalyzer } } + private static bool IsTranslationMethod(SyntaxNode node) + { + // Check if this is a method called 'T' (translation method) + if (node is IdentifierNameSyntax { Identifier.Text: "T" }) + return true; + + return false; + } + private void AnalyzeIdentifier(SyntaxNodeAnalysisContext context) { var identifierNameSyntax = (IdentifierNameSyntax)context.Node; - // Skip if this identifier is part of a generic name - we'll handle that separately + // Skip if this identifier is part of a generic name - we'll handle that separately: if (identifierNameSyntax.Parent is GenericNameSyntax) return; - // Skip if already part of a 'this' expression + // Skip if already part of a 'this' expression: if (IsAccessedThroughThis(identifierNameSyntax)) return; @@ -101,55 +114,59 @@ public sealed class ThisUsageAnalyzer : DiagnosticAnalyzer if (IsPartOfMemberAccess(identifierNameSyntax)) return; - // Also skip if it's part of static import statements + // Also skip if it's part of static import statements: if (IsPartOfUsingStaticDirective(identifierNameSyntax)) return; - // Skip if it's part of a namespace or type name + // Skip if it's part of a namespace or type name: if (IsPartOfNamespaceOrTypeName(identifierNameSyntax)) return; - // Get symbol info + // Skip if it's the 'T' translation method: + if (IsTranslationMethod(identifierNameSyntax)) + return; + + // Get symbol info: var symbolInfo = context.SemanticModel.GetSymbolInfo(identifierNameSyntax); var symbol = symbolInfo.Symbol; if (symbol == null) return; - // Skip local variables, parameters, and range variables + // Skip local variables, parameters, and range variables: if (symbol.Kind is SymbolKind.Local or SymbolKind.Parameter or SymbolKind.RangeVariable or SymbolKind.TypeParameter) return; - // Skip types and namespaces + // Skip types and namespaces: if (symbol.Kind is SymbolKind.NamedType or SymbolKind.Namespace) return; - // Explicitly check if this is a local function + // Explicitly check if this is a local function: if (symbol is IMethodSymbol methodSymbol && IsLocalFunction(methodSymbol)) return; - // Get the containing type of the current context + // Get the containing type of the current context: var containingSymbol = context.ContainingSymbol; var currentType = containingSymbol?.ContainingType; - // If we're in a static context, allow accessing members without this + // If we're in a static context, allow accessing members without this: if (IsInStaticContext(containingSymbol)) return; - // Now check if the symbol is an instance member of the current class + // Now check if the symbol is an instance member of the current class: if (symbol is IFieldSymbol or IPropertySymbol or IMethodSymbol or IEventSymbol) { - // Skip static members + // Skip static members: if (symbol.IsStatic) return; - // Skip constants + // Skip constants: if (symbol is IFieldSymbol { IsConst: true }) return; var containingType = symbol.ContainingType; - // If the symbol is a member of the current type or a base type, then require this + // If the symbol is a member of the current type or a base type, then require this: if (currentType != null && (SymbolEqualityComparer.Default.Equals(containingType, currentType) || IsBaseTypeOf(containingType, currentType))) { diff --git a/documentation/Build.md b/documentation/Build.md index b25a27ef..21063eef 100644 --- a/documentation/Build.md +++ b/documentation/Build.md @@ -1,47 +1,61 @@ # Building You just want to use the app? Then simply [download the appropriate setup for your operating system](Setup.md). This chapter is intended for developers who want to modify and customize the code. +## Prefaces regarding Linux development systems +Unfortunately, we have to provide a note regarding development on Linux systems. MindWork AI Studio consists of a Rust and a .NET part. Compiling the .NET code works smoothly on all operating systems. However, this is not the case for our Rust part. More specifically, it is not the Rust code itself that is problematic, but rather the Tauri framework on which we base our work. Tauri has certain dependencies that depend on the operating system. The specific dependencies vary between different Linux distributions and between versions of distributions. + +Therefore, we cannot provide a static list here that is valid for all Linux systems. Unfortunately, the situation is even more complex: Tauri requires dependencies that are not available in current Linux distributions because they already include newer versions. **For these reasons, we currently advise against developing AI Studio on Linux.** In case you still want to try, you will need a lot of patience and willingness to experiment. We ask for your understanding. Thank you very much. + ## Prerequisites 1. Install the [.NET 9 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/9.0). -2. [Install the Rust compiler](https://www.rust-lang.org/tools/install) in the latest version. +2. [Install the Rust compiler](https://www.rust-lang.org/tools/install) in the latest stable version. 3. Met the prerequisites for building [Tauri](https://tauri.app/v1/guides/getting-started/prerequisites/). Node.js is **not** required, though. -4. Install the Tauri CLI by running `cargo install --version 1.6.2 tauri-cli`. -5. [Install NuShell](https://www.nushell.sh/). NuShell works on all operating systems and is required because the build script is written in NuShell. -6. Clone the repository. +4. The core team uses [JetBrains](https://www.jetbrains.com/) [Rider](https://www.jetbrains.com/rider/) and [RustRover](https://www.jetbrains.com/rust/) for development. Both IDEs are free to use for open-source projects for non-commercial use. They are available for macOS, Linux, and Windows systems. Profiles are provided for these IDEs, so you can get started right away. However, you can also use a different IDE. +4. Clone the repository. ## One-time mandatory steps Regardless of whether you want to build the app locally for yourself (not trusting the pre-built binaries) or test your changes before creating a PR, you have to run the following commands at least once: -1. Open a terminal using NuShell. -2. Navigate to the `/app/MindWork AI Studio` directory within the repository. -3. Run `dotnet restore` to bring up the .NET dependencies. -4. Run `nu build.nu publish` to build the entire app. +1. Open a terminal. +2. Install the Tauri CLI by running `cargo install --version 1.6.2 tauri-cli`. +3. Navigate to the `/app/Build` directory within the repository. +4. Run `dotnet run build` to build the entire app. This is necessary because the build script and the Tauri framework assume that the .NET app is available as a so-called "sidecar." Although the sidecar is only necessary for the final release and shipping, Tauri requires it to be present during development as well. ## Build AI Studio from source In order to build MindWork AI Studio from source instead of using the pre-built binaries, follow these steps: 1. Ensure you have met all the prerequisites. -2. Open a terminal with NuShell. -3. Navigate to the `/app/MindWork AI Studio` directory within the repository. -4. To build the current version, run `nu build.nu publish` to build the entire app. - - This will build the app for the current operating system, for both x64 (Intel, AMD) and ARM64 (e.g., Apple Silicon, Raspberry Pi). - - The final setup program will be located in `runtime/target/release/bundle` afterward. -5. In order to create a new release: - 1. Before finishing the PR, make sure to create a changelog file in the `/app/MindWork AI Studio/wwwroot/changelog` directory. The file should be named `vX.Y.Z.md` and contain the changes made in the release (your changes and any other changes that are part of the release). - 2. To prepare a new release, run `nu build.nu prepare `, where `` is either `patch`, `minor`, or `major`. - 3. The actual release will be built by our GitHub Workflow. For this to work, you need to create a PR with your changes. - 4. Your proposed changes will be reviewed and merged. - 5. Once the PR is merged, a member of the maintainers team will create & push an appropriate git tag in the format `vX.Y.Z`. - 6. The GitHub Workflow will then build the release and upload it to the [release page](https://github.com/MindWorkAI/AI-Studio/releases/latest). - 7. Building the release including virus scanning takes some time. Please be patient. +2. Open a terminal. +3. Navigate to the `/app/Build` directory within the repository. +4. To build the current version, run `dotnet run build` to build the entire app. + - This will build the app for the current operating system and CPU architecture (x64, or ARM64). + - The final setup program will be located in `runtime/target/release` afterward. ## Run the app locally with all your changes Do you want to test your changes before creating a PR? Follow these steps: 1. Ensure you have met all the prerequisites. -2. At least once, you have to run the `nu build.nu publish` command (see above, "Build instructions"). This is necessary because the Tauri framework checks whether the .NET app as so-called "sidecar" is available. Although the sidecar is only necessary for the final release and shipping, Tauri requires it to be present during development. -3. Open a terminal (in this case, it doesn't have to be NuShell). +2. At least once, you have to run the `dotnet run build` command (see above, "One-time mandatory steps"). This is necessary because the Tauri framework checks whether the .NET app as so-called "sidecar" is available. Although the sidecar is only necessary for the final release and shipping, Tauri requires it to be present during development. +3. Open a terminal. 4. Navigate to the `runtime` directory within the repository, e.g. `cd repos/mindwork-ai-studio/runtime`. 5. Run `cargo tauri dev --no-watch`. +6. Now you have to wait until the Rust code is compiled. Afterward, the Tauri runtime will be started and the app window will appear. This may take a while, especially the first time you run it. +7. Open another terminal or tab. +8. Navigate to the `app/MindWork AI Studio` directory within the repository. +9. Execute the command `dotnet run`. +10. After compiling the .NET code, the app will finally start inside the Tauri runtime window. -Cargo will compile the Rust code and start the runtime. The runtime will then start the .NET compiler. When the .NET source code is compiled, the app will start. You can now test your changes. \ No newline at end of file +You can now test your changes. + +## Create a release +In order to create a release: +1. To create a new release, you need to be a maintainer of the repository—see step 8. +2. Make sure there's a changelog file for the version you want to create in the `/app/MindWork AI Studio/wwwroot/changelog` directory. Name the file `vX.Y.Z.md` and include all release changes—your updates and any others included in this version. +3. After you have created the changelog file, you must commit the changes to the repository. +4. To prepare a new release, open a terminal, go to `/app/Build` and run `dotnet run release --action `, where `` is either `patch` (creating a patch version), `minor` (creating a minor version), or `major` (creating a major version). +5. Now wait until all process steps have been completed. Among other things, the version number will be incremented, the new changelog registered, and the version numbers of central dependencies updated, etc. +6. The actual release will be built by our GitHub Workflow. For this to work, you need to create a PR with your changes. +7. Your proposed changes will be reviewed and merged. +8. Once the PR is merged, a member of the maintainers team will create & push an appropriate git tag in the format `vX.Y.Z`. +9. The GitHub Workflow will then build the release and upload it to the [release page](https://github.com/MindWorkAI/AI-Studio/releases/latest). +10. Building the release including virus scanning takes some time. Please be patient. \ No newline at end of file diff --git a/documentation/Setup.md b/documentation/Setup.md index b06b6cbc..c6e4bfd8 100644 --- a/documentation/Setup.md +++ b/documentation/Setup.md @@ -14,7 +14,7 @@ AI Studio is only available for modern 64-bit Windows systems. When you have an - **Intel/AMD:** In almost all other cases, you have an Intel/AMD system. [Download the x64 version](https://github.com/MindWorkAI/AI-Studio/releases/latest/download/MindWork.AI.Studio_x64-setup.exe) of AI Studio. -When you try to install the app, you get a message regarding protection of your PC (see screenshots below). For Windows to trust our app, we need to purchase a certificate that costs around $1000 per year. Would you like to help us with this? [Please consider supporting us](https://github.com/sponsors/MindWorkAI). You might want to [visit our release page](https://github.com/MindWorkAI/AI-Studio/releases/latest). There, we provide VirusTotal scan results for each release. If you are unsure about the safety of the app, you can check the results there. Ensure that the majority of scanners have a green checkmark. +When you try to install the app, you get a message regarding protection of your PC (see screenshots below). For Windows to trust our app, we need to purchase a certificate that [costs around $1000 per year](https://github.com/MindWorkAI/Planning/issues/56). Would you like to help us with this? [Please consider supporting us](https://github.com/sponsors/MindWorkAI). You might want to [visit our release page](https://github.com/MindWorkAI/AI-Studio/releases/latest). There, we provide VirusTotal scan results for each release. If you are unsure about the safety of the app, you can check the results there. Ensure that the majority of scanners have a green checkmark. When you are confident in the app's safety, click on "More info" and then "Run anyway" to proceed with the installation: @@ -43,7 +43,7 @@ When you try to open the app, you get a message that the app is damaged: ![macOS Installation 2](macOS%20Damage.png) -This is because we don't have an Apple Developer account, which costs around $100 per year. Would you like to help us with this? [Please consider supporting us](https://github.com/sponsors/MindWorkAI). You might want to [visit our release page](https://github.com/MindWorkAI/AI-Studio/releases/latest). There, we provide VirusTotal scan results for each release. If you are unsure about the safety of the app, you can check the results there. Ensure that the majority of scanners have a green checkmark. +This is because we don't have an Apple Developer account, [which costs around $100 per year](https://github.com/MindWorkAI/Planning/issues/56). Would you like to help us with this? [Please consider supporting us](https://github.com/sponsors/MindWorkAI). You might want to [visit our release page](https://github.com/MindWorkAI/AI-Studio/releases/latest). There, we provide VirusTotal scan results for each release. If you are unsure about the safety of the app, you can check the results there. Ensure that the majority of scanners have a green checkmark. When you are confident in the app's safety, follow these steps: @@ -58,47 +58,13 @@ When you are confident in the app's safety, follow these steps: The AI Studio app should now open without any issues. Once the app is installed, it will check for updates automatically. If a new version is available, you will be prompted to install it. ## Linux -AI Studio is available for modern 64-bit Linux systems. The app is provided as an AppImage and a DEB package. We test our app using Ubuntu 22.04, but it should work on other distributions as well. +MindWork AI Studio is available for modern 64-bit Linux systems. The app is provided as an `AppImage`. We test our app using Ubuntu 22.04 and Raspberry Pi OS 12 (64-bit), but it should work on other distributions as well. -1. **Choosing between the AppImage and DEB package:** - - **AppImage:** This is a single file that you can run without installation. It is a bit larger than the DEB package. Main advantage is that automatic updates are supported. When a new version is available, the app will prompt you to download and install it. Unfortunately, the AppImage version is not yet supported for ARM systems. +We have to figure out if you have an Intel/AMD or a modern ARM system on your Linux machine. Open a terminal and run the command `uname -m`. When the output is `x86_64`, you have an Intel/AMD system. When the output is `aarch64`, you have an ARM system. - - **DEB package:** This is a traditional Debian package that you can install using your package manager. It is smaller than the AppImage. The main disadvantage is that you have to check for updates manually. Unfortunately, we don't have a Debian repository for automatic updates yet. That means: - - You won't get a notification when a new version is available. - - You have to download any updated DEB package from our [release page](https://github.com/MindWorkAI/AI-Studio/releases/latest) and install it manually again. +- **Intel/AMD:** [Download the Intel/AMD AppImage](https://github.com/MindWorkAI/AI-Studio/releases/latest/download/mind-work-ai-studio_amd64.AppImage) of AI Studio. - Another issue is that the DEB package is only compatible with Debian-based distributions. For other distributions, you have to use the AppImage version. - -2. **Choosing CPU architecture:** - Next, we have to figure out if you have an Intel/AMD or a modern ARM system on your Linux machine. Open a terminal and run the command `uname -m`. When the output is `x86_64`, you have an Intel/AMD system. If the output is `aarch64`, you have an ARM system. - - - **Intel/AMD:** [Download the AppImage](https://github.com/MindWorkAI/AI-Studio/releases/latest/download/mind-work-ai-studio_amd64.AppImage) (recommended) or [DEB package](https://github.com/MindWorkAI/AI-Studio/releases/latest/download/mind-work-ai-studio_amd64.deb) of AI Studio. - - - **ARM:** Unfortunately, the AppImage version is not yet supported for ARM systems. [Download the DEB package](https://github.com/MindWorkAI/AI-Studio/releases/latest/download/mind-work-ai-studio_arm64.deb) of AI Studio instead. - -### DEB Package Installation - -**Install the app using the desktop environment:** -1. Download the DEB package from the link above. -2. Open your file manager and navigate to the Downloads folder. -3. Right-click on the DEB package and select "Open with other application": - ![Linux Installation 1](Ubuntu%20DEB%20Open.png) -4. Choose your package manager, e.g., "Software Install": - ![Linux Installation 2](Ubuntu%20DEB%20Install%201.png) -5. Click on "Install": - ![Linux Installation 3](Ubuntu%20DEB%20Install%202.png) -6. Enter your password and click on "Authenticate." -7. Wait for the installation to finish. -8. Close the package manager. -9. You can now find the app in your application menu. - -**Install the app using the terminal:** -1. Download the DEB package from the link above. -2. Open a terminal and navigate to the Downloads folder: `cd Downloads`. -3. Install the DEB package: `sudo apt install ./mind-work-ai-studio_amd64.deb`. -4. Enter your password and press Enter. -5. Wait for the installation to finish. -6. You can now find the app in your application menu. +- **ARM:** [Download the ARM AppImage](https://github.com/MindWorkAI/AI-Studio/releases/latest/download/mind-work-ai-studio_aarch64.AppImage) of AI Studio. ### AppImage Installation diff --git a/metadata.txt b/metadata.txt index 29068a95..c4acb557 100644 --- a/metadata.txt +++ b/metadata.txt @@ -1,9 +1,11 @@ -0.9.39 -2025-04-06 10:18:02 UTC -214 -9.0.104 (commit 2750432faa) -9.0.3 (commit 831d23e561) -1.86.0 (commit 05f9846f8) -8.5.1 +0.9.45 +2025-05-25 13:56:04 UTC +220 +9.0.106 (commit 8cdf6f0897) +9.0.5 (commit e36e4d1a8f) +1.87.0 (commit 17067e9ac) +8.6.0 1.8.1 -a3ec2bbe7b7, release +05544eca15a, release +osx-arm64 +137.0.7123.0 \ No newline at end of file diff --git a/runtime/Cargo.lock b/runtime/Cargo.lock index 0f05dcd1..e6db9da3 100644 --- a/runtime/Cargo.lock +++ b/runtime/Cargo.lock @@ -188,6 +188,12 @@ dependencies = [ "system-deps 6.2.2", ] +[[package]] +name = "atoi_simd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4790f9e8961209112beb783d85449b508673cf4a6a419c8449b210743ac4dbe9" + [[package]] name = "atomic" version = "0.5.3" @@ -430,15 +436,17 @@ dependencies = [ [[package]] name = "calamine" -version = "0.26.1" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138646b9af2c5d7f1804ea4bf93afc597737d2bd4f7341d67c48b03316976eb1" +checksum = "6d80f81ba5c68206b9027e62346d49dc26fb32ffc4fe6ef7022a8ae21d348ccb" dependencies = [ + "atoi_simd", "byteorder", "codepage", "encoding_rs", + "fast-float2", "log", - "quick-xml 0.31.0", + "quick-xml 0.37.5", "serde", "zip 2.5.0", ] @@ -711,9 +719,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -1064,6 +1072,12 @@ dependencies = [ "zune-inflate", ] +[[package]] +name = "fast-float2" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" + [[package]] name = "fastrand" version = "2.1.0" @@ -1105,9 +1119,9 @@ dependencies = [ [[package]] name = "file-format" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ef3d5e8ae27277c8285ac43ed153158178ef0f79567f32024ca8140a0c7cd8" +checksum = "0ff8badf6e72ff15e42c9ade15d01375837173b17d10c228ab41d821082619db" [[package]] name = "filetime" @@ -2610,7 +2624,7 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mindwork-ai-studio" -version = "0.9.39" +version = "0.9.45" dependencies = [ "aes", "arboard", @@ -2619,6 +2633,7 @@ dependencies = [ "calamine", "cbc", "cipher", + "crossbeam-channel", "file-format", "flexi_logger", "futures", @@ -2629,7 +2644,7 @@ dependencies = [ "openssl", "pbkdf2", "pdfium-render", - "rand 0.9.0", + "rand 0.9.1", "rand_chacha 0.9.0", "rcgen", "reqwest 0.12.15", @@ -3199,9 +3214,9 @@ dependencies = [ [[package]] name = "pdfium-render" -version = "0.8.29" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5cbb29c282cfbd0a8142ccd3bb0ce8da53e59141ce02a023b980bc72b6c0eec" +checksum = "a473e1f4c2630f7240b127eb9efebd1d9e55053015b624bfe9dbeae0299947e1" dependencies = [ "bitflags 2.6.0", "bytemuck", @@ -3562,20 +3577,20 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" dependencies = [ - "encoding_rs", "memchr", ] [[package]] name = "quick-xml" -version = "0.32.0" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ + "encoding_rs", "memchr", ] @@ -3615,13 +3630,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.0", - "zerocopy", ] [[package]] diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 6d5e8e05..1687f162 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mindwork-ai-studio" -version = "0.9.39" +version = "0.9.45" edition = "2021" description = "MindWork AI Studio" authors = ["Thorsten Sommer"] @@ -23,7 +23,7 @@ flexi_logger = "0.30.1" log = { version = "0.4.27", features = ["kv"] } once_cell = "1.21.3" rocket = { version = "0.5.1", features = ["json", "tls"] } -rand = "0.9" +rand = "0.9.1" rand_chacha = "0.9" base64 = "0.22.1" cipher = { version = "0.4.4", features = ["std"] } @@ -33,14 +33,15 @@ pbkdf2 = "0.12.2" hmac = "0.12.1" sha2 = "0.10.8" rcgen = { version = "0.13.2", features = ["pem"] } -file-format = "0.26.0" -calamine = "0.26.1" -pdfium-render = "0.8.29" +file-format = "0.27.0" +calamine = "0.27.0" +pdfium-render = "0.8.31" sys-locale = "0.3.2" # Fixes security vulnerability downstream, where the upstream is not fixed yet: url = "2.5" ring = "0.17.14" +crossbeam-channel = "0.5.15" [target.'cfg(target_os = "linux")'.dependencies] # See issue https://github.com/tauri-apps/tauri/issues/4470 diff --git a/runtime/build.rs b/runtime/build.rs index bdd09222..93871d1a 100644 --- a/runtime/build.rs +++ b/runtime/build.rs @@ -2,17 +2,48 @@ use std::path::PathBuf; fn main() { tauri_build::build(); - - // Tells Cargo to re-run this script only, when the version.txt file was changed: - println!("cargo:rerun-if-changed=../metadata.txt"); - + let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap()); println!("cargo:rustc-env=OUT_DIR={}", out_dir.to_str().unwrap()); + // + // When we are in debug mode, we want to set the current RID + // to the current architecture. This is necessary, so that + // the developers get the right behavior. + // + // We read the current OS and architecture and overwrite the + // current RID in the metadata file (line #10). + // + // We have to take care of different naming conventions. The + // following RIDs are supported: win-x64, win-arm64, linux-x64, + // linux-arm64, osx-x64, osx-arm64. + // + let current_os = std::env::consts::OS; + let current_arch = std::env::consts::ARCH; + let rid = match (current_os, current_arch) { + ("windows", "x86_64") => "win-x64", + ("windows", "aarch64") => "win-arm64", + + ("linux", "x86_64") => "linux-x64", + ("linux", "aarch64") => "linux-arm64", + + ("macos", "x86_64") => "osx-x64", + ("macos", "aarch64") => "osx-arm64", + + _ => panic!("Unsupported OS or architecture: {current_os} {current_arch}"), + }; + let metadata = include_str!("../metadata.txt"); - let mut metadata_lines = metadata.lines(); - let version = metadata_lines.next().unwrap(); - + let mut metadata_lines = metadata.lines().collect::>(); + metadata_lines[9] = rid; + let new_metadata = metadata_lines.join("\n"); + std::fs::write("../metadata.txt", new_metadata).unwrap(); + + // + // Read the current version and update the + // Rust and Tauri configuration files: + // + let version = metadata_lines[0]; update_cargo_toml("Cargo.toml", version); update_tauri_conf("tauri.conf.json", version); } diff --git a/runtime/src/app_window.rs b/runtime/src/app_window.rs index a3b41510..6d584961 100644 --- a/runtime/src/app_window.rs +++ b/runtime/src/app_window.rs @@ -7,13 +7,14 @@ use rocket::serde::json::Json; use rocket::serde::Serialize; use serde::Deserialize; use tauri::updater::UpdateResponse; -use tauri::{Manager, Window}; +use tauri::{Manager, PathResolver, Window}; use tauri::api::dialog::blocking::FileDialogBuilder; use tokio::time; use crate::api_token::APIToken; use crate::dotnet::stop_dotnet_server; use crate::environment::{is_prod, CONFIG_DIRECTORY, DATA_DIRECTORY}; use crate::log::switch_to_file_logging; +use crate::pdfium::PDFIUM_LIB_PATH; /// The Tauri main window. static MAIN_WINDOW: Lazy>> = Lazy::new(|| Mutex::new(None)); @@ -38,7 +39,7 @@ pub fn start_tauri() { info!(Source = "Bootloader Tauri"; "Reconfigure the file logger to use the app data directory {data_path:?}"); switch_to_file_logging(data_path).map_err(|e| error!("Failed to switch logging to file: {e}")).unwrap(); - + set_pdfium_path(app.path_resolver()); Ok(()) }) .plugin(tauri_plugin_window_state::Builder::default().build()) @@ -266,6 +267,19 @@ pub struct PreviousDirectory { path: String, } +#[derive(Clone, Deserialize)] +pub struct FileTypeFilter { + filter_name: String, + filter_extensions: Vec, +} + +#[derive(Clone, Deserialize)] +pub struct SelectFileOptions { + title: String, + previous_file: Option, + filter: Option, +} + #[derive(Serialize)] pub struct DirectorySelectionResponse { user_cancelled: bool, @@ -273,24 +287,36 @@ pub struct DirectorySelectionResponse { } /// Let the user select a file. -#[post("/select/file?", data = "<previous_file>")] -pub fn select_file(_token: APIToken, title: &str, previous_file: Option<Json<PreviousFile>>) -> Json<FileSelectionResponse> { - let file_path = match previous_file { - Some(previous) => { - let previous_path = previous.file_path.as_str(); - FileDialogBuilder::new() - .set_title(title) - .set_directory(previous_path) - .pick_file() +#[post("/select/file", data = "<payload>")] +pub fn select_file(_token: APIToken, payload: Json<SelectFileOptions>) -> Json<FileSelectionResponse> { + + // Create a new file dialog builder: + let file_dialog = FileDialogBuilder::new(); + + // Set the title of the file dialog: + let file_dialog = file_dialog.set_title(&payload.title); + + // Set the file type filter if provided: + let file_dialog = match &payload.filter { + Some(filter) => { + file_dialog.add_filter(&filter.filter_name, &filter.filter_extensions.iter().map(|s| s.as_str()).collect::<Vec<&str>>()) }, - None => { - FileDialogBuilder::new() - .set_title(title) - .pick_file() - }, + None => file_dialog, }; + // Set the previous file path if provided: + let file_dialog = match &payload.previous_file { + Some(previous) => { + let previous_path = previous.file_path.as_str(); + file_dialog.set_directory(previous_path) + }, + + None => file_dialog, + }; + + // Show the file dialog and get the selected file path: + let file_path = file_dialog.pick_file(); match file_path { Some(path) => { info!("User selected file: {path:?}"); @@ -319,4 +345,17 @@ pub struct PreviousFile { pub struct FileSelectionResponse { user_cancelled: bool, selected_file_path: String, +} + +fn set_pdfium_path(path_resolver: PathResolver) { + let pdfium_relative_source_path = String::from("resources/libraries/"); + let pdfium_source_path = path_resolver.resolve_resource(pdfium_relative_source_path); + if pdfium_source_path.is_none() { + error!(Source = "Bootloader Tauri"; "Failed to set the PDFium library path."); + return; + } + + let pdfium_source_path = pdfium_source_path.unwrap(); + let pdfium_source_path = pdfium_source_path.to_str().unwrap().to_string(); + *PDFIUM_LIB_PATH.lock().unwrap() = Some(pdfium_source_path.clone()); } \ No newline at end of file diff --git a/runtime/src/dotnet.rs b/runtime/src/dotnet.rs index b0c577bc..26b793f5 100644 --- a/runtime/src/dotnet.rs +++ b/runtime/src/dotnet.rs @@ -34,54 +34,65 @@ pub fn dotnet_port(_token: APIToken) -> String { format!("{dotnet_server_port}") } +/// Creates the startup environment file for the .NET server in the development +/// environment. The file is created in the root directory of the repository. +/// Creating that env file on a production environment would be a security +/// issue, since it contains the secret password and salt in plain text. +/// Anyone could read that file and decrypt the secret communication +/// between the .NET server and the Tauri app. +/// +/// Therefore, we not only create the file in the development environment +/// but also remove that code from any production build. +#[cfg(debug_assertions)] +pub fn create_startup_env_file() { + + // Get the secret password & salt and convert it to a base64 string: + let secret_password = BASE64_STANDARD.encode(ENCRYPTION.secret_password); + let secret_key_salt = BASE64_STANDARD.encode(ENCRYPTION.secret_key_salt); + let api_port = *API_SERVER_PORT; + + warn!(Source = "Bootloader .NET"; "Development environment detected; create the startup env file at '../startup.env'."); + let env_file_path = std::path::PathBuf::from("..").join("startup.env"); + let mut env_file = std::fs::File::create(env_file_path).unwrap(); + let env_file_content = format!( + "AI_STUDIO_SECRET_PASSWORD={secret_password}\n\ + AI_STUDIO_SECRET_KEY_SALT={secret_key_salt}\n\ + AI_STUDIO_CERTIFICATE_FINGERPRINT={cert_fingerprint}\n\ + AI_STUDIO_API_PORT={api_port}\n\ + AI_STUDIO_API_TOKEN={api_token}", + + cert_fingerprint = CERTIFICATE_FINGERPRINT.get().unwrap(), + api_token = API_TOKEN.to_hex_text() + ); + + std::io::Write::write_all(&mut env_file, env_file_content.as_bytes()).unwrap(); + info!(Source = "Bootloader .NET"; "The startup env file was created successfully."); +} + /// Starts the .NET server in a separate process. pub fn start_dotnet_server() { // Get the secret password & salt and convert it to a base64 string: let secret_password = BASE64_STANDARD.encode(ENCRYPTION.secret_password); let secret_key_salt = BASE64_STANDARD.encode(ENCRYPTION.secret_key_salt); + let api_port = *API_SERVER_PORT; let dotnet_server_environment = HashMap::from_iter([ (String::from("AI_STUDIO_SECRET_PASSWORD"), secret_password), (String::from("AI_STUDIO_SECRET_KEY_SALT"), secret_key_salt), (String::from("AI_STUDIO_CERTIFICATE_FINGERPRINT"), CERTIFICATE_FINGERPRINT.get().unwrap().to_string()), + (String::from("AI_STUDIO_API_PORT"), format!("{api_port}")), (String::from("AI_STUDIO_API_TOKEN"), API_TOKEN.to_hex_text().to_string()), ]); info!("Try to start the .NET server..."); let server_spawn_clone = DOTNET_SERVER.clone(); tauri::async_runtime::spawn(async move { - let api_port = *API_SERVER_PORT; - let (mut rx, child) = match is_dev() { - true => { - // We are in the development environment, so we try to start a process - // with `dotnet run` in the `../app/MindWork AI Studio` directory. But - // we cannot issue a sidecar because we cannot use any command for the - // sidecar (see Tauri configuration). Thus, we use a standard Rust process: - warn!(Source = "Bootloader .NET"; "Development environment detected; start .NET server using 'dotnet run'."); - Command::new("dotnet") - - // Start the .NET server in the `../app/MindWork AI Studio` directory. - // We provide the runtime API server port to the .NET server: - .args(["run", "--project", "../app/MindWork AI Studio", "--", format!("{api_port}").as_str()]) - - .envs(dotnet_server_environment) - .spawn() - .expect("Failed to spawn .NET server process.") - } - - false => { - Command::new_sidecar("mindworkAIStudioServer") - .expect("Failed to create sidecar") - - // Provide the runtime API server port to the .NET server: - .args([format!("{api_port}").as_str()]) - - .envs(dotnet_server_environment) - .spawn() - .expect("Failed to spawn .NET server process.") - } - }; + let (mut rx, child) = Command::new_sidecar("mindworkAIStudioServer") + .expect("Failed to create sidecar") + .envs(dotnet_server_environment) + .spawn() + .expect("Failed to spawn .NET server process."); let server_pid = child.pid(); info!(Source = "Bootloader .NET"; "The .NET server process started with PID={server_pid}."); @@ -140,7 +151,7 @@ pub async fn dotnet_ready(_token: APIToken) { // held. { let mut initialized = DOTNET_INITIALIZED.lock().unwrap(); - if *initialized { + if !is_dev() && *initialized { error!("Anyone tried to initialize the runtime twice. This is not intended."); return; } diff --git a/runtime/src/file_data.rs b/runtime/src/file_data.rs index 29bc477a..b1e5ff54 100644 --- a/runtime/src/file_data.rs +++ b/runtime/src/file_data.rs @@ -15,6 +15,8 @@ use rocket::response::stream::{EventStream, Event}; use rocket::tokio::select; use rocket::serde::Serialize; use rocket::get; +use crate::api_token::APIToken; +use crate::pdfium::PdfiumInit; #[derive(Debug, Serialize)] pub struct Chunk { @@ -39,7 +41,7 @@ type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync> type ChunkStream = Pin<Box<dyn Stream<Item = Result<Chunk>> + Send>>; #[get("/retrieval/fs/extract?<path>")] -pub async fn extract_data(path: String, mut end: Shutdown) -> EventStream![] { +pub async fn extract_data(_token: APIToken, path: String, mut end: Shutdown) -> EventStream![] { EventStream! { let stream_result = stream_data(&path).await; match stream_result { @@ -78,7 +80,7 @@ async fn stream_data(file_path: &str) -> Result<ChunkStream> { FileFormat::from_file(&file_path_clone) }).await??; - let ext = file_path.split('.').last().unwrap_or(""); + let ext = file_path.split('.').next_back().unwrap_or(""); let stream = match ext { DOCX | ODT => { let from = if ext == DOCX { "docx" } else { "odt" }; @@ -91,7 +93,7 @@ async fn stream_data(file_path: &str) -> Result<ChunkStream> { _ => match fmt.kind() { Kind::Document => match fmt { - FileFormat::PortableDocumentFormat => read_pdf(file_path).await?, + FileFormat::PortableDocumentFormat => stream_pdf(file_path).await?, FileFormat::MicrosoftWordDocument => { convert_with_pandoc(file_path, "docx", TO_MARKDOWN).await? } @@ -133,7 +135,7 @@ async fn stream_text_file(file_path: &str) -> Result<ChunkStream> { let mut line_number = 0; let stream = stream! { - while let Ok(Some(line)) = lines.next_line().await { // Korrektur hier + while let Ok(Some(line)) = lines.next_line().await { line_number += 1; yield Ok(Chunk { content: line, @@ -145,23 +147,47 @@ async fn stream_text_file(file_path: &str) -> Result<ChunkStream> { Ok(Box::pin(stream)) } -async fn read_pdf(file_path: &str) -> Result<ChunkStream> { +#[get("/retrieval/fs/read/pdf?<file_path>")] +pub fn read_pdf(_token: APIToken, file_path: String) -> String { + let pdfium = Pdfium::ai_studio_init(); + let doc = match pdfium.load_pdf_from_file(&file_path, None) { + Ok(document) => document, + Err(e) => return e.to_string(), + }; + + let mut pdf_content = String::new(); + for page in doc.pages().iter() { + let content = match page.text().map(|text_content| text_content.all()) { + Ok(content) => content, + Err(_) => { + continue + } + }; + + pdf_content.push_str(&content); + pdf_content.push_str("\n\n"); + } + + pdf_content +} + +async fn stream_pdf(file_path: &str) -> Result<ChunkStream> { let path = file_path.to_owned(); let (tx, rx) = mpsc::channel(10); tokio::task::spawn_blocking(move || { - let pdfium = Pdfium::default(); + let pdfium = Pdfium::ai_studio_init(); let doc = match pdfium.load_pdf_from_file(&path, None) { - Ok(d) => d, + Ok(document) => document, Err(e) => { let _ = tx.blocking_send(Err(e.into())); return; } }; - for (i, page) in doc.pages().iter().enumerate() { + for (num_page, page) in doc.pages().iter().enumerate() { let content = match page.text().map(|t| t.all()) { - Ok(c) => c, + Ok(text_content) => text_content, Err(e) => { let _ = tx.blocking_send(Err(e.into())); continue; @@ -170,7 +196,7 @@ async fn read_pdf(file_path: &str) -> Result<ChunkStream> { if tx.blocking_send(Ok(Chunk { content, - metadata: Metadata::Pdf { page_number: i + 1 }, + metadata: Metadata::Pdf { page_number: num_page + 1 }, })).is_err() { break; } diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index a97347d3..cb79a81c 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -9,4 +9,6 @@ pub mod secret; pub mod clipboard; pub mod runtime_api; pub mod certificate; -pub mod file_data; \ No newline at end of file +pub mod file_data; +pub mod metadata; +pub mod pdfium; \ No newline at end of file diff --git a/runtime/src/main.rs b/runtime/src/main.rs index 3b0026d4..a66ee287 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -10,22 +10,15 @@ use mindwork_ai_studio::certificate::{generate_certificate}; use mindwork_ai_studio::dotnet::start_dotnet_server; use mindwork_ai_studio::environment::is_dev; use mindwork_ai_studio::log::init_logging; +use mindwork_ai_studio::metadata::MetaData; use mindwork_ai_studio::runtime_api::start_runtime_api; +#[cfg(debug_assertions)] +use mindwork_ai_studio::dotnet::create_startup_env_file; + #[tokio::main] async fn main() { - - let metadata = include_str!("../../metadata.txt"); - let mut metadata_lines = metadata.lines(); - let app_version = metadata_lines.next().unwrap(); - let build_time = metadata_lines.next().unwrap(); - let build_number = metadata_lines.next().unwrap(); - let dotnet_sdk_version = metadata_lines.next().unwrap(); - let dotnet_version = metadata_lines.next().unwrap(); - let rust_version = metadata_lines.next().unwrap(); - let mud_blazor_version = metadata_lines.next().unwrap(); - let tauri_version = metadata_lines.next().unwrap(); - let app_commit_hash = metadata_lines.next().unwrap(); + let metadata = MetaData::init_from_string(include_str!("../../metadata.txt")); init_logging(); info!("Starting MindWork AI Studio:"); @@ -33,13 +26,18 @@ async fn main() { let working_directory = std::env::current_dir().unwrap(); info!(".. The working directory is: '{working_directory:?}'"); - info!(".. Version: v{app_version} (commit {app_commit_hash}, build {build_number})"); - info!(".. Build time: {build_time}"); - info!(".. .NET SDK: v{dotnet_sdk_version}"); - info!(".. .NET: v{dotnet_version}"); - info!(".. Rust: v{rust_version}"); - info!(".. MudBlazor: v{mud_blazor_version}"); - info!(".. Tauri: v{tauri_version}"); + info!(".. Version: v{app_version} (commit {hash}, build {build_num}, {architecture})", + app_version = metadata.app_version, + hash = metadata.app_commit_hash, + build_num = metadata.build_number, + architecture = metadata.architecture); + info!(".. Build time: {build_time}", build_time = metadata.build_time); + info!(".. .NET SDK: v{sdk_version}", sdk_version = metadata.dotnet_sdk_version); + info!(".. .NET: v{dotnet_version}", dotnet_version = metadata.dotnet_version); + info!(".. Rust: v{rust_version}", rust_version = metadata.rust_version); + info!(".. MudBlazor: v{mud_blazor_version}", mud_blazor_version = metadata.mud_blazor_version); + info!(".. Tauri: v{tauri_version}", tauri_version = metadata.tauri_version); + info!(".. PDFium: v{pdfium_version}", pdfium_version = metadata.pdfium_version); if is_dev() { warn!("Running in development mode."); @@ -49,6 +47,13 @@ async fn main() { generate_certificate(); start_runtime_api(); - start_dotnet_server(); + + if is_dev() { + #[cfg(debug_assertions)] + create_startup_env_file(); + } else { + start_dotnet_server(); + } + start_tauri(); } \ No newline at end of file diff --git a/runtime/src/metadata.rs b/runtime/src/metadata.rs new file mode 100644 index 00000000..426e2b66 --- /dev/null +++ b/runtime/src/metadata.rs @@ -0,0 +1,60 @@ +use once_cell::sync::Lazy; +use std::sync::Mutex; + +pub static META_DATA: Lazy<Mutex<Option<MetaData>>> = Lazy::new(|| Mutex::new(None)); + +#[derive(Clone)] +pub struct MetaData { + pub app_version: String, + pub build_time: String, + pub build_number: String, + pub dotnet_sdk_version: String, + pub dotnet_version: String, + pub rust_version: String, + pub mud_blazor_version: String, + pub tauri_version: String, + pub app_commit_hash: String, + pub architecture: String, + pub pdfium_version: String, +} + +impl MetaData { + /// Creates a new instance of `MetaData` from the given metadata string. + pub fn init_from_string(metadata: &str) -> Self { + + // When the metadata is already initialized, return the existing instance: + if let Some(metadata) = META_DATA.lock().unwrap().as_ref() { + return metadata.clone(); + } + + let mut metadata_lines = metadata.lines(); + let app_version = metadata_lines.next().unwrap(); + let build_time = metadata_lines.next().unwrap(); + let build_number = metadata_lines.next().unwrap(); + let dotnet_sdk_version = metadata_lines.next().unwrap(); + let dotnet_version = metadata_lines.next().unwrap(); + let rust_version = metadata_lines.next().unwrap(); + let mud_blazor_version = metadata_lines.next().unwrap(); + let tauri_version = metadata_lines.next().unwrap(); + let app_commit_hash = metadata_lines.next().unwrap(); + let architecture = metadata_lines.next().unwrap(); + let pdfium_version = metadata_lines.next().unwrap(); + + let metadata = MetaData { + architecture: architecture.to_string(), + app_commit_hash: app_commit_hash.to_string(), + app_version: app_version.to_string(), + build_number: build_number.to_string(), + build_time: build_time.to_string(), + dotnet_sdk_version: dotnet_sdk_version.to_string(), + dotnet_version: dotnet_version.to_string(), + mud_blazor_version: mud_blazor_version.to_string(), + rust_version: rust_version.to_string(), + tauri_version: tauri_version.to_string(), + pdfium_version: pdfium_version.to_string(), + }; + + *META_DATA.lock().unwrap() = Some(metadata.clone()); + metadata + } +} \ No newline at end of file diff --git a/runtime/src/pdfium.rs b/runtime/src/pdfium.rs new file mode 100644 index 00000000..e4ce1231 --- /dev/null +++ b/runtime/src/pdfium.rs @@ -0,0 +1,26 @@ +use std::sync::Mutex; +use once_cell::sync::Lazy; +use pdfium_render::prelude::Pdfium; + +pub static PDFIUM_LIB_PATH: Lazy<Mutex<Option<String>>> = Lazy::new(|| Mutex::new(None)); + +pub trait PdfiumInit { + fn ai_studio_init() -> Pdfium; +} + +impl PdfiumInit for Pdfium { + + /// Initializes the PDFium library for AI Studio. + fn ai_studio_init() -> Pdfium { + let lib_path = PDFIUM_LIB_PATH.lock().unwrap(); + if let Some(path) = lib_path.as_ref() { + return Pdfium::new( + Pdfium::bind_to_library(Pdfium::pdfium_platform_library_name_at_path(path)) + .or_else(|_| Pdfium::bind_to_system_library()) + .unwrap(), + ); + } + + Pdfium::new(Pdfium::bind_to_system_library().unwrap()) + } +} \ No newline at end of file diff --git a/runtime/src/runtime_api.rs b/runtime/src/runtime_api.rs index bf3fa249..459fc936 100644 --- a/runtime/src/runtime_api.rs +++ b/runtime/src/runtime_api.rs @@ -79,6 +79,7 @@ pub fn start_runtime_api() { crate::environment::get_config_directory, crate::environment::read_user_language, crate::file_data::extract_data, + crate::file_data::read_pdf, crate::log::get_log_paths, ]) .ignite().await.unwrap() diff --git a/runtime/tauri.conf.json b/runtime/tauri.conf.json index 91fb4b09..ee43f1e6 100644 --- a/runtime/tauri.conf.json +++ b/runtime/tauri.conf.json @@ -6,7 +6,7 @@ }, "package": { "productName": "MindWork AI Studio", - "version": "0.9.39" + "version": "0.9.45" }, "tauri": { "allowlist": { @@ -29,6 +29,9 @@ "scope": [ "http://localhost" ] + }, + "fs": { + "scope": ["$RESOURCE/resources/*"] } }, "windows": [ @@ -57,6 +60,9 @@ "externalBin": [ "../app/MindWork AI Studio/bin/dist/mindworkAIStudioServer" ], + "resources": [ + "resources/*" + ], "macOS": { "exceptionDomain": "localhost" },