mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2026-03-29 13:51:37 +00:00
Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
658a8aa125 | ||
|
|
37d026ea6f | ||
|
|
e416552467 | ||
|
|
90d65bb7d6 | ||
|
|
309d36897e | ||
|
|
cf6226546e | ||
|
|
a2bd67eda3 | ||
|
|
df50fdb8b8 | ||
|
|
fb1a45074e | ||
|
|
86e2f1baac | ||
|
|
070375c964 | ||
|
|
424006962b | ||
|
|
dac0b74145 | ||
|
|
56da27372c | ||
|
|
03c4d72ab1 | ||
|
|
4a8348b9df | ||
|
|
24e72de9a2 | ||
|
|
2f5a300e74 | ||
|
|
078d48ca6f | ||
|
|
5e4d9fd501 | ||
|
|
e15f1ce54e | ||
|
|
65ec82cdcb | ||
|
|
c120502215 | ||
|
|
3ea3f20c5b | ||
|
|
8e2f6f6b6e | ||
|
|
1c52d6f199 | ||
|
|
0c702c579b | ||
|
|
7e5e078cdb | ||
|
|
906d9ba058 | ||
|
|
721d5c9070 | ||
|
|
685f95245b |
200
.github/workflows/build-and-release.yml
vendored
200
.github/workflows/build-and-release.yml
vendored
@ -5,15 +5,142 @@ on:
|
|||||||
- main
|
- main
|
||||||
tags:
|
tags:
|
||||||
- "v*.*.*"
|
- "v*.*.*"
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- labeled
|
||||||
|
- synchronize
|
||||||
|
- reopened
|
||||||
|
|
||||||
env:
|
env:
|
||||||
RETENTION_INTERMEDIATE_ASSETS: 1
|
RETENTION_INTERMEDIATE_ASSETS: 1
|
||||||
RETENTION_RELEASE_ASSETS: 30
|
RETENTION_RELEASE_ASSETS: 30
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
determine_run_mode:
|
||||||
|
name: Determine run mode
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
outputs:
|
||||||
|
is_release: ${{ steps.determine.outputs.is_release }}
|
||||||
|
is_main_push: ${{ steps.determine.outputs.is_main_push }}
|
||||||
|
is_labeled_pr: ${{ steps.determine.outputs.is_labeled_pr }}
|
||||||
|
is_pr_build: ${{ steps.determine.outputs.is_pr_build }}
|
||||||
|
is_internal_pr: ${{ steps.determine.outputs.is_internal_pr }}
|
||||||
|
build_enabled: ${{ steps.determine.outputs.build_enabled }}
|
||||||
|
artifact_retention_days: ${{ steps.determine.outputs.artifact_retention_days }}
|
||||||
|
skip_reason: ${{ steps.determine.outputs.skip_reason }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Determine run mode
|
||||||
|
id: determine
|
||||||
|
env:
|
||||||
|
EVENT_NAME: ${{ github.event_name }}
|
||||||
|
REF: ${{ github.ref }}
|
||||||
|
PR_LABELS: ${{ join(github.event.pull_request.labels.*.name, ' ') }}
|
||||||
|
PR_HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
|
REPOSITORY: ${{ github.repository }}
|
||||||
|
run: |
|
||||||
|
is_release=false
|
||||||
|
is_main_push=false
|
||||||
|
is_labeled_pr=false
|
||||||
|
is_pr_build=false
|
||||||
|
is_internal_pr=false
|
||||||
|
build_enabled=false
|
||||||
|
artifact_retention_days=0
|
||||||
|
skip_reason="Build disabled: event did not match main push, release tag, or labeled internal PR."
|
||||||
|
|
||||||
|
if [[ "$EVENT_NAME" == "pull_request" && "$PR_HEAD_REPO" == "$REPOSITORY" ]]; then
|
||||||
|
is_internal_pr=true
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$REF" == refs/tags/v* ]]; then
|
||||||
|
is_release=true
|
||||||
|
build_enabled=true
|
||||||
|
artifact_retention_days=${{ env.RETENTION_INTERMEDIATE_ASSETS }}
|
||||||
|
skip_reason=""
|
||||||
|
elif [[ "$EVENT_NAME" == "push" && "$REF" == "refs/heads/main" ]]; then
|
||||||
|
is_main_push=true
|
||||||
|
build_enabled=true
|
||||||
|
artifact_retention_days=7
|
||||||
|
skip_reason=""
|
||||||
|
elif [[ "$EVENT_NAME" == "pull_request" && " $PR_LABELS " == *" run-pipeline "* ]]; then
|
||||||
|
is_labeled_pr=true
|
||||||
|
is_pr_build=true
|
||||||
|
build_enabled=true
|
||||||
|
artifact_retention_days=3
|
||||||
|
skip_reason=""
|
||||||
|
elif [[ "$EVENT_NAME" == "pull_request" && " $PR_LABELS " != *" run-pipeline "* ]]; then
|
||||||
|
skip_reason="Build disabled: PR does not have the required 'run-pipeline' label."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "is_release=${is_release}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "is_main_push=${is_main_push}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "is_labeled_pr=${is_labeled_pr}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "is_pr_build=${is_pr_build}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "is_internal_pr=${is_internal_pr}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "build_enabled=${build_enabled}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "artifact_retention_days=${artifact_retention_days}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "skip_reason=${skip_reason}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Log run mode
|
||||||
|
env:
|
||||||
|
EVENT_NAME: ${{ github.event_name }}
|
||||||
|
REF: ${{ github.ref }}
|
||||||
|
PR_LABELS: ${{ join(github.event.pull_request.labels.*.name, ', ') }}
|
||||||
|
PR_HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
|
REPOSITORY: ${{ github.repository }}
|
||||||
|
IS_RELEASE: ${{ steps.determine.outputs.is_release }}
|
||||||
|
IS_MAIN_PUSH: ${{ steps.determine.outputs.is_main_push }}
|
||||||
|
IS_LABELED_PR: ${{ steps.determine.outputs.is_labeled_pr }}
|
||||||
|
IS_PR_BUILD: ${{ steps.determine.outputs.is_pr_build }}
|
||||||
|
IS_INTERNAL_PR: ${{ steps.determine.outputs.is_internal_pr }}
|
||||||
|
BUILD_ENABLED: ${{ steps.determine.outputs.build_enabled }}
|
||||||
|
ARTIFACT_RETENTION_DAYS: ${{ steps.determine.outputs.artifact_retention_days }}
|
||||||
|
SKIP_REASON: ${{ steps.determine.outputs.skip_reason }}
|
||||||
|
run: |
|
||||||
|
echo "event_name: ${EVENT_NAME}"
|
||||||
|
echo "ref: ${REF}"
|
||||||
|
echo "repository: ${REPOSITORY}"
|
||||||
|
echo "pr_head_repo: ${PR_HEAD_REPO}"
|
||||||
|
echo "pr_labels: ${PR_LABELS}"
|
||||||
|
echo "is_release: ${IS_RELEASE}"
|
||||||
|
echo "is_main_push: ${IS_MAIN_PUSH}"
|
||||||
|
echo "is_labeled_pr: ${IS_LABELED_PR}"
|
||||||
|
echo "is_pr_build: ${IS_PR_BUILD}"
|
||||||
|
echo "is_internal_pr: ${IS_INTERNAL_PR}"
|
||||||
|
echo "build_enabled: ${BUILD_ENABLED}"
|
||||||
|
echo "artifact_retention_days: ${ARTIFACT_RETENTION_DAYS}"
|
||||||
|
echo "skip_reason: ${SKIP_REASON}"
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "### Run Mode"
|
||||||
|
echo ""
|
||||||
|
echo "| Key | Value |"
|
||||||
|
echo "| --- | --- |"
|
||||||
|
echo "| event_name | ${EVENT_NAME} |"
|
||||||
|
echo "| ref | ${REF} |"
|
||||||
|
echo "| repository | ${REPOSITORY} |"
|
||||||
|
echo "| pr_head_repo | ${PR_HEAD_REPO} |"
|
||||||
|
echo "| pr_labels | ${PR_LABELS} |"
|
||||||
|
echo "| is_release | ${IS_RELEASE} |"
|
||||||
|
echo "| is_main_push | ${IS_MAIN_PUSH} |"
|
||||||
|
echo "| is_labeled_pr | ${IS_LABELED_PR} |"
|
||||||
|
echo "| is_pr_build | ${IS_PR_BUILD} |"
|
||||||
|
echo "| is_internal_pr | ${IS_INTERNAL_PR} |"
|
||||||
|
echo "| build_enabled | ${BUILD_ENABLED} |"
|
||||||
|
echo "| artifact_retention_days | ${ARTIFACT_RETENTION_DAYS} |"
|
||||||
|
echo "| skip_reason | ${SKIP_REASON} |"
|
||||||
|
} >> "$GITHUB_STEP_SUMMARY"
|
||||||
|
|
||||||
read_metadata:
|
read_metadata:
|
||||||
name: Read metadata
|
name: Read metadata
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
needs: determine_run_mode
|
||||||
|
if: needs.determine_run_mode.outputs.build_enabled == 'true'
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
outputs:
|
outputs:
|
||||||
formatted_version: ${{ steps.format_metadata.outputs.formatted_version }}
|
formatted_version: ${{ steps.format_metadata.outputs.formatted_version }}
|
||||||
formatted_build_time: ${{ steps.format_metadata.outputs.formatted_build_time }}
|
formatted_build_time: ${{ steps.format_metadata.outputs.formatted_build_time }}
|
||||||
@ -60,6 +187,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Read changelog
|
- name: Read changelog
|
||||||
id: read_changelog
|
id: read_changelog
|
||||||
|
if: needs.determine_run_mode.outputs.is_release == 'true'
|
||||||
run: |
|
run: |
|
||||||
# Ensure, that the matching changelog file for the current version exists:
|
# Ensure, that the matching changelog file for the current version exists:
|
||||||
if [ ! -f "app/MindWork AI Studio/wwwroot/changelog/${FORMATTED_VERSION}.md" ]; then
|
if [ ! -f "app/MindWork AI Studio/wwwroot/changelog/${FORMATTED_VERSION}.md" ]; then
|
||||||
@ -79,7 +207,10 @@ jobs:
|
|||||||
|
|
||||||
build_main:
|
build_main:
|
||||||
name: Build app (${{ matrix.dotnet_runtime }})
|
name: Build app (${{ matrix.dotnet_runtime }})
|
||||||
needs: read_metadata
|
needs: [determine_run_mode, read_metadata]
|
||||||
|
if: needs.determine_run_mode.outputs.build_enabled == 'true'
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
@ -89,37 +220,43 @@ jobs:
|
|||||||
rust_target: 'aarch64-apple-darwin'
|
rust_target: 'aarch64-apple-darwin'
|
||||||
dotnet_runtime: 'osx-arm64'
|
dotnet_runtime: 'osx-arm64'
|
||||||
dotnet_name_postfix: '-aarch64-apple-darwin'
|
dotnet_name_postfix: '-aarch64-apple-darwin'
|
||||||
tauri_bundle: 'dmg updater'
|
tauri_bundle: 'dmg,updater'
|
||||||
|
tauri_bundle_pr: 'dmg'
|
||||||
|
|
||||||
- platform: 'macos-latest' # for Intel-based macOS
|
- platform: 'macos-latest' # for Intel-based macOS
|
||||||
rust_target: 'x86_64-apple-darwin'
|
rust_target: 'x86_64-apple-darwin'
|
||||||
dotnet_runtime: 'osx-x64'
|
dotnet_runtime: 'osx-x64'
|
||||||
dotnet_name_postfix: '-x86_64-apple-darwin'
|
dotnet_name_postfix: '-x86_64-apple-darwin'
|
||||||
tauri_bundle: 'dmg updater'
|
tauri_bundle: 'dmg,updater'
|
||||||
|
tauri_bundle_pr: 'dmg'
|
||||||
|
|
||||||
- platform: 'ubuntu-22.04' # for x86-based Linux
|
- platform: 'ubuntu-22.04' # for x86-based Linux
|
||||||
rust_target: 'x86_64-unknown-linux-gnu'
|
rust_target: 'x86_64-unknown-linux-gnu'
|
||||||
dotnet_runtime: 'linux-x64'
|
dotnet_runtime: 'linux-x64'
|
||||||
dotnet_name_postfix: '-x86_64-unknown-linux-gnu'
|
dotnet_name_postfix: '-x86_64-unknown-linux-gnu'
|
||||||
tauri_bundle: 'appimage deb updater'
|
tauri_bundle: 'appimage,deb,updater'
|
||||||
|
tauri_bundle_pr: 'appimage,deb'
|
||||||
|
|
||||||
- platform: 'ubuntu-22.04-arm' # for ARM-based Linux
|
- platform: 'ubuntu-22.04-arm' # for ARM-based Linux
|
||||||
rust_target: 'aarch64-unknown-linux-gnu'
|
rust_target: 'aarch64-unknown-linux-gnu'
|
||||||
dotnet_runtime: 'linux-arm64'
|
dotnet_runtime: 'linux-arm64'
|
||||||
dotnet_name_postfix: '-aarch64-unknown-linux-gnu'
|
dotnet_name_postfix: '-aarch64-unknown-linux-gnu'
|
||||||
tauri_bundle: 'appimage deb updater'
|
tauri_bundle: 'appimage,deb,updater'
|
||||||
|
tauri_bundle_pr: 'appimage,deb'
|
||||||
|
|
||||||
- platform: 'windows-latest' # for x86-based Windows
|
- platform: 'windows-latest' # for x86-based Windows
|
||||||
rust_target: 'x86_64-pc-windows-msvc'
|
rust_target: 'x86_64-pc-windows-msvc'
|
||||||
dotnet_runtime: 'win-x64'
|
dotnet_runtime: 'win-x64'
|
||||||
dotnet_name_postfix: '-x86_64-pc-windows-msvc.exe'
|
dotnet_name_postfix: '-x86_64-pc-windows-msvc.exe'
|
||||||
tauri_bundle: 'nsis updater'
|
tauri_bundle: 'nsis,updater'
|
||||||
|
tauri_bundle_pr: 'nsis'
|
||||||
|
|
||||||
- platform: 'windows-latest' # for ARM-based Windows
|
- platform: 'windows-latest' # for ARM-based Windows
|
||||||
rust_target: 'aarch64-pc-windows-msvc'
|
rust_target: 'aarch64-pc-windows-msvc'
|
||||||
dotnet_runtime: 'win-arm64'
|
dotnet_runtime: 'win-arm64'
|
||||||
dotnet_name_postfix: '-aarch64-pc-windows-msvc.exe'
|
dotnet_name_postfix: '-aarch64-pc-windows-msvc.exe'
|
||||||
tauri_bundle: 'nsis updater'
|
tauri_bundle: 'nsis,updater'
|
||||||
|
tauri_bundle_pr: 'nsis'
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
steps:
|
steps:
|
||||||
@ -628,10 +765,18 @@ jobs:
|
|||||||
PRIVATE_PUBLISH_KEY: ${{ secrets.PRIVATE_PUBLISH_KEY }}
|
PRIVATE_PUBLISH_KEY: ${{ secrets.PRIVATE_PUBLISH_KEY }}
|
||||||
PRIVATE_PUBLISH_KEY_PASSWORD: ${{ secrets.PRIVATE_PUBLISH_KEY_PASSWORD }}
|
PRIVATE_PUBLISH_KEY_PASSWORD: ${{ secrets.PRIVATE_PUBLISH_KEY_PASSWORD }}
|
||||||
run: |
|
run: |
|
||||||
|
bundles="${{ matrix.tauri_bundle }}"
|
||||||
|
|
||||||
|
if [ "${{ needs.determine_run_mode.outputs.is_pr_build }}" = "true" ]; then
|
||||||
|
echo "Running PR test build without updater bundle signing"
|
||||||
|
bundles="${{ matrix.tauri_bundle_pr }}"
|
||||||
|
else
|
||||||
|
export TAURI_PRIVATE_KEY="$PRIVATE_PUBLISH_KEY"
|
||||||
|
export TAURI_KEY_PASSWORD="$PRIVATE_PUBLISH_KEY_PASSWORD"
|
||||||
|
fi
|
||||||
|
|
||||||
cd runtime
|
cd runtime
|
||||||
export TAURI_PRIVATE_KEY="$PRIVATE_PUBLISH_KEY"
|
cargo tauri build --target ${{ matrix.rust_target }} --bundles "$bundles"
|
||||||
export TAURI_KEY_PASSWORD="$PRIVATE_PUBLISH_KEY_PASSWORD"
|
|
||||||
cargo tauri build --target ${{ matrix.rust_target }} --bundles ${{ matrix.tauri_bundle }}
|
|
||||||
|
|
||||||
- name: Build Tauri project (Windows)
|
- name: Build Tauri project (Windows)
|
||||||
if: matrix.platform == 'windows-latest'
|
if: matrix.platform == 'windows-latest'
|
||||||
@ -639,13 +784,21 @@ jobs:
|
|||||||
PRIVATE_PUBLISH_KEY: ${{ secrets.PRIVATE_PUBLISH_KEY }}
|
PRIVATE_PUBLISH_KEY: ${{ secrets.PRIVATE_PUBLISH_KEY }}
|
||||||
PRIVATE_PUBLISH_KEY_PASSWORD: ${{ secrets.PRIVATE_PUBLISH_KEY_PASSWORD }}
|
PRIVATE_PUBLISH_KEY_PASSWORD: ${{ secrets.PRIVATE_PUBLISH_KEY_PASSWORD }}
|
||||||
run: |
|
run: |
|
||||||
|
$bundles = "${{ matrix.tauri_bundle }}"
|
||||||
|
|
||||||
|
if ("${{ needs.determine_run_mode.outputs.is_pr_build }}" -eq "true") {
|
||||||
|
Write-Output "Running PR test build without updater bundle signing"
|
||||||
|
$bundles = "${{ matrix.tauri_bundle_pr }}"
|
||||||
|
} else {
|
||||||
|
$env:TAURI_PRIVATE_KEY="$env:PRIVATE_PUBLISH_KEY"
|
||||||
|
$env:TAURI_KEY_PASSWORD="$env:PRIVATE_PUBLISH_KEY_PASSWORD"
|
||||||
|
}
|
||||||
|
|
||||||
cd runtime
|
cd runtime
|
||||||
$env:TAURI_PRIVATE_KEY="$env:PRIVATE_PUBLISH_KEY"
|
cargo tauri build --target ${{ matrix.rust_target }} --bundles $bundles
|
||||||
$env:TAURI_KEY_PASSWORD="$env:PRIVATE_PUBLISH_KEY_PASSWORD"
|
|
||||||
cargo tauri build --target ${{ matrix.rust_target }} --bundles ${{ matrix.tauri_bundle }}
|
|
||||||
|
|
||||||
- name: Upload artifact (macOS)
|
- name: Upload artifact (macOS)
|
||||||
if: startsWith(matrix.platform, 'macos') && startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(matrix.platform, 'macos')
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: MindWork AI Studio (macOS ${{ matrix.dotnet_runtime }})
|
name: MindWork AI Studio (macOS ${{ matrix.dotnet_runtime }})
|
||||||
@ -653,10 +806,10 @@ jobs:
|
|||||||
runtime/target/${{ matrix.rust_target }}/release/bundle/dmg/MindWork AI Studio_*.dmg
|
runtime/target/${{ matrix.rust_target }}/release/bundle/dmg/MindWork AI Studio_*.dmg
|
||||||
runtime/target/${{ matrix.rust_target }}/release/bundle/macos/MindWork AI Studio.app.tar.gz*
|
runtime/target/${{ matrix.rust_target }}/release/bundle/macos/MindWork AI Studio.app.tar.gz*
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }}
|
retention-days: ${{ fromJSON(needs.determine_run_mode.outputs.artifact_retention_days) }}
|
||||||
|
|
||||||
- name: Upload artifact (Windows - MSI)
|
- name: Upload artifact (Windows - MSI)
|
||||||
if: startsWith(matrix.platform, 'windows') && contains(matrix.tauri_bundle, 'msi') && startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(matrix.platform, 'windows') && contains(matrix.tauri_bundle, 'msi')
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: MindWork AI Studio (Windows - MSI ${{ matrix.dotnet_runtime }})
|
name: MindWork AI Studio (Windows - MSI ${{ matrix.dotnet_runtime }})
|
||||||
@ -664,10 +817,10 @@ jobs:
|
|||||||
runtime/target/${{ matrix.rust_target }}/release/bundle/msi/MindWork AI Studio_*.msi
|
runtime/target/${{ matrix.rust_target }}/release/bundle/msi/MindWork AI Studio_*.msi
|
||||||
runtime/target/${{ matrix.rust_target }}/release/bundle/msi/MindWork AI Studio*msi.zip*
|
runtime/target/${{ matrix.rust_target }}/release/bundle/msi/MindWork AI Studio*msi.zip*
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }}
|
retention-days: ${{ fromJSON(needs.determine_run_mode.outputs.artifact_retention_days) }}
|
||||||
|
|
||||||
- name: Upload artifact (Windows - NSIS)
|
- name: Upload artifact (Windows - NSIS)
|
||||||
if: startsWith(matrix.platform, 'windows') && contains(matrix.tauri_bundle, 'nsis') && startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(matrix.platform, 'windows') && contains(matrix.tauri_bundle, 'nsis')
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: MindWork AI Studio (Windows - NSIS ${{ matrix.dotnet_runtime }})
|
name: MindWork AI Studio (Windows - NSIS ${{ matrix.dotnet_runtime }})
|
||||||
@ -675,20 +828,20 @@ jobs:
|
|||||||
runtime/target/${{ matrix.rust_target }}/release/bundle/nsis/MindWork AI Studio_*.exe
|
runtime/target/${{ matrix.rust_target }}/release/bundle/nsis/MindWork AI Studio_*.exe
|
||||||
runtime/target/${{ matrix.rust_target }}/release/bundle/nsis/MindWork AI Studio*nsis.zip*
|
runtime/target/${{ matrix.rust_target }}/release/bundle/nsis/MindWork AI Studio*nsis.zip*
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }}
|
retention-days: ${{ fromJSON(needs.determine_run_mode.outputs.artifact_retention_days) }}
|
||||||
|
|
||||||
- name: Upload artifact (Linux - Debian Package)
|
- name: Upload artifact (Linux - Debian Package)
|
||||||
if: startsWith(matrix.platform, 'ubuntu') && contains(matrix.tauri_bundle, 'deb') && startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(matrix.platform, 'ubuntu') && contains(matrix.tauri_bundle, 'deb')
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: MindWork AI Studio (Linux - deb ${{ matrix.dotnet_runtime }})
|
name: MindWork AI Studio (Linux - deb ${{ matrix.dotnet_runtime }})
|
||||||
path: |
|
path: |
|
||||||
runtime/target/${{ matrix.rust_target }}/release/bundle/deb/mind-work-ai-studio_*.deb
|
runtime/target/${{ matrix.rust_target }}/release/bundle/deb/mind-work-ai-studio_*.deb
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }}
|
retention-days: ${{ fromJSON(needs.determine_run_mode.outputs.artifact_retention_days) }}
|
||||||
|
|
||||||
- name: Upload artifact (Linux - AppImage)
|
- name: Upload artifact (Linux - AppImage)
|
||||||
if: startsWith(matrix.platform, 'ubuntu') && contains(matrix.tauri_bundle, 'appimage') && startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(matrix.platform, 'ubuntu') && contains(matrix.tauri_bundle, 'appimage')
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: MindWork AI Studio (Linux - AppImage ${{ matrix.dotnet_runtime }})
|
name: MindWork AI Studio (Linux - AppImage ${{ matrix.dotnet_runtime }})
|
||||||
@ -696,13 +849,14 @@ jobs:
|
|||||||
runtime/target/${{ matrix.rust_target }}/release/bundle/appimage/mind-work-ai-studio_*.AppImage
|
runtime/target/${{ matrix.rust_target }}/release/bundle/appimage/mind-work-ai-studio_*.AppImage
|
||||||
runtime/target/${{ matrix.rust_target }}/release/bundle/appimage/mind-work-ai-studio*AppImage.tar.gz*
|
runtime/target/${{ matrix.rust_target }}/release/bundle/appimage/mind-work-ai-studio*AppImage.tar.gz*
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: ${{ env.RETENTION_INTERMEDIATE_ASSETS }}
|
retention-days: ${{ fromJSON(needs.determine_run_mode.outputs.artifact_retention_days) }}
|
||||||
|
|
||||||
create_release:
|
create_release:
|
||||||
name: Prepare & create release
|
name: Prepare & create release
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [build_main, read_metadata]
|
needs: [build_main, read_metadata]
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
if: startsWith(github.ref, 'refs/tags/v')
|
||||||
|
permissions: {}
|
||||||
steps:
|
steps:
|
||||||
- name: Create artifact directory
|
- name: Create artifact directory
|
||||||
run: mkdir -p $GITHUB_WORKSPACE/artifacts
|
run: mkdir -p $GITHUB_WORKSPACE/artifacts
|
||||||
|
|||||||
38
AGENTS.md
38
AGENTS.md
@ -29,6 +29,14 @@ dotnet run build
|
|||||||
```
|
```
|
||||||
This builds the .NET app as a Tauri "sidecar" binary, which is required even for development.
|
This builds the .NET app as a Tauri "sidecar" binary, which is required even for development.
|
||||||
|
|
||||||
|
### Running .NET builds from an agent
|
||||||
|
- Do not run `.NET` builds such as `dotnet run build`, `dotnet build`, or similar build commands from an agent. Codex agents can hit a known sandbox issue during `.NET` builds, typically surfacing as `CSSM_ModuleLoad()` or other sandbox-related failures.
|
||||||
|
- Instead, ask the user to run the `.NET` build locally in their IDE and report the result back.
|
||||||
|
- Recommend the canonical repo build flow for the user: open an IDE terminal in the repository and run `cd app/Build && dotnet run build`.
|
||||||
|
- If the context fits better, it is also acceptable to ask the user to start the build using their IDE's built-in build action, as long as it is clear the build must be run locally by the user.
|
||||||
|
- After asking for the build, wait for the user's feedback before diagnosing issues, making follow-up changes, or suggesting the next step.
|
||||||
|
- Treat the user's build output, error messages, or success confirmation as the source of truth for further troubleshooting.
|
||||||
|
- For reference: https://github.com/openai/codex/issues/4915
|
||||||
|
|
||||||
### Running Tests
|
### Running Tests
|
||||||
Currently, no automated test suite exists in the repository.
|
Currently, no automated test suite exists in the repository.
|
||||||
@ -144,7 +152,7 @@ Multi-level confidence scheme allows users to control which providers see which
|
|||||||
|
|
||||||
**Rust:**
|
**Rust:**
|
||||||
- Tauri 1.8 - Desktop application framework
|
- Tauri 1.8 - Desktop application framework
|
||||||
- Rocket 0.5 - HTTPS API server
|
- Rocket - HTTPS API server
|
||||||
- tokio - Async runtime
|
- tokio - Async runtime
|
||||||
- keyring - OS keyring integration
|
- keyring - OS keyring integration
|
||||||
- pdfium-render - PDF text extraction
|
- pdfium-render - PDF text extraction
|
||||||
@ -152,7 +160,7 @@ Multi-level confidence scheme allows users to control which providers see which
|
|||||||
|
|
||||||
**.NET:**
|
**.NET:**
|
||||||
- Blazor Server - UI framework
|
- Blazor Server - UI framework
|
||||||
- MudBlazor 8.12 - Component library
|
- MudBlazor - Component library
|
||||||
- LuaCSharp - Lua scripting engine
|
- LuaCSharp - Lua scripting engine
|
||||||
- HtmlAgilityPack - HTML parsing
|
- HtmlAgilityPack - HTML parsing
|
||||||
- ReverseMarkdown - HTML to Markdown conversion
|
- ReverseMarkdown - HTML to Markdown conversion
|
||||||
@ -168,7 +176,7 @@ Multi-level confidence scheme allows users to control which providers see which
|
|||||||
|
|
||||||
1. Create changelog file: `app/MindWork AI Studio/wwwroot/changelog/vX.Y.Z.md`
|
1. Create changelog file: `app/MindWork AI Studio/wwwroot/changelog/vX.Y.Z.md`
|
||||||
2. Commit changelog
|
2. Commit changelog
|
||||||
3. Run from `app/Build`: `dotnet run release --action <patch|minor|major>`
|
3. Run from `app/Build`: `dotnet run release --action <build|month|year>`
|
||||||
4. Create PR with version bump and changes
|
4. Create PR with version bump and changes
|
||||||
5. After PR merge, maintainer creates git tag: `vX.Y.Z`
|
5. After PR merge, maintainer creates git tag: `vX.Y.Z`
|
||||||
6. GitHub Actions builds release binaries for all platforms
|
6. GitHub Actions builds release binaries for all platforms
|
||||||
@ -177,9 +185,33 @@ Multi-level confidence scheme allows users to control which providers see which
|
|||||||
## Important Development Notes
|
## Important Development Notes
|
||||||
|
|
||||||
- **File changes require Write/Edit tools** - Never use bash commands like `cat <<EOF` or `echo >`
|
- **File changes require Write/Edit tools** - Never use bash commands like `cat <<EOF` or `echo >`
|
||||||
|
- **End of file formatting** - Do not append an extra empty line at the end of files.
|
||||||
- **Spaces in paths** - Always quote paths with spaces in bash commands
|
- **Spaces in paths** - Always quote paths with spaces in bash commands
|
||||||
|
- **Agent-run .NET builds** - Do not run `.NET` builds from an agent. Ask the user to run the build locally in their IDE, preferably via `cd app/Build && dotnet run build` in an IDE terminal, then wait for their feedback before continuing.
|
||||||
- **Debug environment** - Reads `startup.env` file with IPC credentials
|
- **Debug environment** - Reads `startup.env` file with IPC credentials
|
||||||
- **Production environment** - Runtime launches .NET sidecar with environment variables
|
- **Production environment** - Runtime launches .NET sidecar with environment variables
|
||||||
- **MudBlazor** - Component library requires DI setup in Program.cs
|
- **MudBlazor** - Component library requires DI setup in Program.cs
|
||||||
- **Encryption** - Initialized before Rust service is marked ready
|
- **Encryption** - Initialized before Rust service is marked ready
|
||||||
- **Message Bus** - Singleton event bus for cross-component communication inside the .NET app
|
- **Message Bus** - Singleton event bus for cross-component communication inside the .NET app
|
||||||
|
- **Naming conventions** - Constants, enum members, and `static readonly` fields use `UPPER_SNAKE_CASE` such as `MY_CONSTANT`.
|
||||||
|
- **Empty lines** - Avoid adding extra empty lines at the end of files.
|
||||||
|
|
||||||
|
## Changelogs
|
||||||
|
Changelogs are located in `app/MindWork AI Studio/wwwroot/changelog/` with filenames `vX.Y.Z.md`. These changelogs are meant to be for normal end-users
|
||||||
|
and should be written in a non-technical way, focusing on user-facing changes and improvements. Additionally, changes made regarding the plugin system
|
||||||
|
should be included in the changelog, especially if they affect how users can configure the app or if they introduce new capabilities for plugins. Plugin
|
||||||
|
developers should also be informed about these changes, as they might need to update their plugins accordingly. When adding entries to the changelog,
|
||||||
|
please ensure they are clear and concise, avoiding technical jargon where possible. Each entry starts with a dash and a space (`- `) and one of the
|
||||||
|
following words:
|
||||||
|
|
||||||
|
- Added
|
||||||
|
- Released
|
||||||
|
- Improved
|
||||||
|
- Changed
|
||||||
|
- Fixed
|
||||||
|
- Updated
|
||||||
|
- Removed
|
||||||
|
- Downgraded
|
||||||
|
- Upgraded
|
||||||
|
|
||||||
|
The entire changelog is sorted by these categories in the order shown above. The language used for the changelog is US English.
|
||||||
@ -30,7 +30,7 @@ Since November 2024: Work on RAG (integration of your data and files) has begun.
|
|||||||
- [x] ~~Runtime: Extract data from txt / md / pdf / docx / xlsx files (PR [#374](https://github.com/MindWorkAI/AI-Studio/pull/374))~~
|
- [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)
|
- [ ] (*Optional*) Runtime: Implement internal embedding provider through [fastembed-rs](https://github.com/Anush008/fastembed-rs)
|
||||||
- [x] ~~App: Implement dialog for checking & handling [pandoc](https://pandoc.org/) installation ([PR #393](https://github.com/MindWorkAI/AI-Studio/pull/393), [PR #487](https://github.com/MindWorkAI/AI-Studio/pull/487))~~
|
- [x] ~~App: Implement dialog for checking & handling [pandoc](https://pandoc.org/) installation ([PR #393](https://github.com/MindWorkAI/AI-Studio/pull/393), [PR #487](https://github.com/MindWorkAI/AI-Studio/pull/487))~~
|
||||||
- [ ] App: Implement external embedding providers
|
- [x] ~~App: Implement external embedding providers ([PR #654](https://github.com/MindWorkAI/AI-Studio/pull/654))~~
|
||||||
- [ ] App: Implement the process to vectorize one local file using embeddings
|
- [ ] App: Implement the process to vectorize one local file using embeddings
|
||||||
- [x] ~~Runtime: Integration of the vector database [Qdrant](https://github.com/qdrant/qdrant) ([PR #580](https://github.com/MindWorkAI/AI-Studio/pull/580))~~
|
- [x] ~~Runtime: Integration of the vector database [Qdrant](https://github.com/qdrant/qdrant) ([PR #580](https://github.com/MindWorkAI/AI-Studio/pull/580))~~
|
||||||
- [ ] App: Implement the continuous process of vectorizing data
|
- [ ] App: Implement the continuous process of vectorizing data
|
||||||
@ -67,7 +67,7 @@ Since March 2025: We have started developing the plugin system. There will be la
|
|||||||
- [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))~~
|
- [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))~~
|
||||||
- [x] ~~Add configuration plugins, which allow pre-defining some LLM providers in organizations ([PR #491](https://github.com/MindWorkAI/AI-Studio/pull/491), [PR #493](https://github.com/MindWorkAI/AI-Studio/pull/493), [PR #494](https://github.com/MindWorkAI/AI-Studio/pull/494), [PR #497](https://github.com/MindWorkAI/AI-Studio/pull/497))~~
|
- [x] ~~Add configuration plugins, which allow pre-defining some LLM providers in organizations ([PR #491](https://github.com/MindWorkAI/AI-Studio/pull/491), [PR #493](https://github.com/MindWorkAI/AI-Studio/pull/493), [PR #494](https://github.com/MindWorkAI/AI-Studio/pull/494), [PR #497](https://github.com/MindWorkAI/AI-Studio/pull/497))~~
|
||||||
- [ ] 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 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
|
- [ ] Add assistant plugins ([PR #659](https://github.com/MindWorkAI/AI-Studio/pull/659))
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
</details>
|
</details>
|
||||||
@ -79,6 +79,7 @@ Since March 2025: We have started developing the plugin system. There will be la
|
|||||||
</h3>
|
</h3>
|
||||||
</summary>
|
</summary>
|
||||||
|
|
||||||
|
- v26.2.2: Added Qdrant as a building block for our local RAG preview, added an embedding test option to validate embedding providers, and improved enterprise and configuration plugins with preselected providers, additive preview features, support for multiple configurations, and more reliable synchronization.
|
||||||
- v26.1.1: Added the option to attach files, including images, to chat templates; added support for source code file attachments in chats and document analysis; added a preview feature for recording your own voice for transcription; fixed various bugs in provider dialogs and profile selection.
|
- v26.1.1: Added the option to attach files, including images, to chat templates; added support for source code file attachments in chats and document analysis; added a preview feature for recording your own voice for transcription; fixed various bugs in provider dialogs and profile selection.
|
||||||
- v0.10.0: Added support for newer models like Mistral 3 & GPT 5.2, OpenRouter as LLM and embedding provider, the possibility to use file attachments in chats, and support for images as input.
|
- v0.10.0: Added support for newer models like Mistral 3 & GPT 5.2, OpenRouter as LLM and embedding provider, the possibility to use file attachments in chats, and support for images as input.
|
||||||
- v0.9.51: Added support for [Perplexity](https://www.perplexity.ai/); citations added so that LLMs can provide source references (e.g., some OpenAI models, Perplexity); added support for OpenAI's Responses API so that all text LLMs from OpenAI now work in MindWork AI Studio, including Deep Research models; web searches are now possible (some OpenAI models, Perplexity).
|
- v0.9.51: Added support for [Perplexity](https://www.perplexity.ai/); citations added so that LLMs can provide source references (e.g., some OpenAI models, Perplexity); added support for OpenAI's Responses API so that all text LLMs from OpenAI now work in MindWork AI Studio, including Deep Research models; web searches are now possible (some OpenAI models, Perplexity).
|
||||||
@ -90,7 +91,6 @@ Since March 2025: We have started developing the plugin system. There will be la
|
|||||||
- v0.9.39: Added the plugin system as a preview feature.
|
- 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.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.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.
|
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|||||||
@ -27,6 +27,7 @@
|
|||||||
<script src="system/MudBlazor.Markdown/MudBlazor.Markdown.min.js"></script>
|
<script src="system/MudBlazor.Markdown/MudBlazor.Markdown.min.js"></script>
|
||||||
<script src="system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js"></script>
|
<script src="system/CodeBeam.MudBlazor.Extensions/MudExtensions.min.js"></script>
|
||||||
<script src="app.js"></script>
|
<script src="app.js"></script>
|
||||||
|
<script src="chat-math.js"></script>
|
||||||
<script src="audio.js"></script>
|
<script src="audio.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
|||||||
@ -80,10 +80,10 @@
|
|||||||
|
|
||||||
@if (!this.FooterButtons.Any(x => x.Type is ButtonTypes.SEND_TO))
|
@if (!this.FooterButtons.Any(x => x.Type is ButtonTypes.SEND_TO))
|
||||||
{
|
{
|
||||||
@if (this.ShowSendTo)
|
@if (this.ShowSendTo && this.VisibleSendToAssistants.Count > 0)
|
||||||
{
|
{
|
||||||
<MudMenu AnchorOrigin="Origin.TopLeft" TransformOrigin="Origin.BottomLeft" StartIcon="@Icons.Material.Filled.Apps" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" Label="@TB("Send to ...")" Variant="Variant.Filled" Style="@this.GetSendToColor()" Class="rounded">
|
<MudMenu AnchorOrigin="Origin.TopLeft" TransformOrigin="Origin.BottomLeft" StartIcon="@Icons.Material.Filled.Apps" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" Label="@TB("Send to ...")" Variant="Variant.Filled" Style="@this.GetSendToColor()" Class="rounded">
|
||||||
@foreach (var assistant in Enum.GetValues<Components>().Where(n => n.AllowSendTo()).OrderBy(n => n.Name().Length))
|
@foreach (var assistant in this.VisibleSendToAssistants)
|
||||||
{
|
{
|
||||||
<MudMenuItem OnClick="@(async () => await this.SendToAssistant(assistant, new()))">
|
<MudMenuItem OnClick="@(async () => await this.SendToAssistant(assistant, new()))">
|
||||||
@assistant.Name()
|
@assistant.Name()
|
||||||
@ -112,14 +112,17 @@
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SendToButton sendToButton:
|
case SendToButton sendToButton:
|
||||||
<MudMenu AnchorOrigin="Origin.TopLeft" TransformOrigin="Origin.BottomLeft" StartIcon="@Icons.Material.Filled.Apps" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" Label="@TB("Send to ...")" Variant="Variant.Filled" Style="@this.GetSendToColor()" Class="rounded">
|
@if (this.VisibleSendToAssistants.Count > 0)
|
||||||
@foreach (var assistant in Enum.GetValues<Components>().Where(n => n.AllowSendTo()).OrderBy(n => n.Name().Length))
|
{
|
||||||
{
|
<MudMenu AnchorOrigin="Origin.TopLeft" TransformOrigin="Origin.BottomLeft" StartIcon="@Icons.Material.Filled.Apps" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" Label="@TB("Send to ...")" Variant="Variant.Filled" Style="@this.GetSendToColor()" Class="rounded">
|
||||||
<MudMenuItem OnClick="@(async () => await this.SendToAssistant(assistant, sendToButton))">
|
@foreach (var assistant in this.VisibleSendToAssistants)
|
||||||
@assistant.Name()
|
{
|
||||||
</MudMenuItem>
|
<MudMenuItem OnClick="@(async () => await this.SendToAssistant(assistant, sendToButton))">
|
||||||
}
|
@assistant.Name()
|
||||||
</MudMenu>
|
</MudMenuItem>
|
||||||
|
}
|
||||||
|
</MudMenu>
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -147,6 +150,9 @@
|
|||||||
{
|
{
|
||||||
<ProfileSelection MarginLeft="" @bind-CurrentProfile="@this.currentProfile"/>
|
<ProfileSelection MarginLeft="" @bind-CurrentProfile="@this.currentProfile"/>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<MudSpacer />
|
||||||
|
<HalluzinationReminder ContainerClass="my-0 ml-2"/>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
</FooterContent>
|
</FooterContent>
|
||||||
</InnerScrolling>
|
</InnerScrolling>
|
||||||
|
|||||||
@ -105,6 +105,13 @@ public abstract partial class AssistantBase<TSettings> : AssistantLowerBase wher
|
|||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
|
|
||||||
|
if (!this.SettingsManager.IsAssistantVisible(this.Component, assistantName: this.Title))
|
||||||
|
{
|
||||||
|
this.Logger.LogInformation("Assistant '{AssistantTitle}' is hidden. Redirecting to the assistants overview.", this.Title);
|
||||||
|
this.NavigationManager.NavigateTo(Routes.ASSISTANTS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.formChangeTimer.AutoReset = false;
|
this.formChangeTimer.AutoReset = false;
|
||||||
this.formChangeTimer.Elapsed += async (_, _) =>
|
this.formChangeTimer.Elapsed += async (_, _) =>
|
||||||
@ -142,6 +149,11 @@ public abstract partial class AssistantBase<TSettings> : AssistantLowerBase wher
|
|||||||
private string TB(string fallbackEN) => this.T(fallbackEN, typeof(AssistantBase<TSettings>).Namespace, nameof(AssistantBase<TSettings>));
|
private string TB(string fallbackEN) => this.T(fallbackEN, typeof(AssistantBase<TSettings>).Namespace, nameof(AssistantBase<TSettings>));
|
||||||
|
|
||||||
private string SubmitButtonStyle => this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence ? this.providerSettings.UsedLLMProvider.GetConfidence(this.SettingsManager).StyleBorder(this.SettingsManager) : string.Empty;
|
private string SubmitButtonStyle => this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence ? this.providerSettings.UsedLLMProvider.GetConfidence(this.SettingsManager).StyleBorder(this.SettingsManager) : string.Empty;
|
||||||
|
|
||||||
|
private IReadOnlyList<Tools.Components> VisibleSendToAssistants => Enum.GetValues<AIStudio.Tools.Components>()
|
||||||
|
.Where(this.CanSendToAssistant)
|
||||||
|
.OrderBy(component => component.Name().Length)
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
protected string? ValidatingProvider(AIStudio.Settings.Provider provider)
|
protected string? ValidatingProvider(AIStudio.Settings.Provider provider)
|
||||||
{
|
{
|
||||||
@ -339,7 +351,7 @@ public abstract partial class AssistantBase<TSettings> : AssistantLowerBase wher
|
|||||||
|
|
||||||
protected Task SendToAssistant(Tools.Components destination, SendToButton sendToButton)
|
protected Task SendToAssistant(Tools.Components destination, SendToButton sendToButton)
|
||||||
{
|
{
|
||||||
if (!destination.AllowSendTo())
|
if (!this.CanSendToAssistant(destination))
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
||||||
var contentToSend = sendToButton == default ? string.Empty : sendToButton.UseResultingContentBlockData switch
|
var contentToSend = sendToButton == default ? string.Empty : sendToButton.UseResultingContentBlockData switch
|
||||||
@ -369,6 +381,14 @@ public abstract partial class AssistantBase<TSettings> : AssistantLowerBase wher
|
|||||||
this.NavigationManager.NavigateTo(sendToData.Route);
|
this.NavigationManager.NavigateTo(sendToData.Route);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool CanSendToAssistant(Tools.Components component)
|
||||||
|
{
|
||||||
|
if (!component.AllowSendTo())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return this.SettingsManager.IsAssistantVisible(component, withLogging: false);
|
||||||
|
}
|
||||||
|
|
||||||
private async Task InnerResetForm()
|
private async Task InnerResetForm()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
@attribute [Route(Routes.ASSISTANT_DOCUMENT_ANALYSIS)]
|
@attribute [Route(Routes.ASSISTANT_DOCUMENT_ANALYSIS)]
|
||||||
@inherits AssistantBaseCore<AIStudio.Dialogs.Settings.NoSettingsPanel>
|
@inherits AssistantBaseCore<AIStudio.Dialogs.Settings.NoSettingsPanel>
|
||||||
|
@using AIStudio.Settings
|
||||||
@using AIStudio.Settings.DataModel
|
@using AIStudio.Settings.DataModel
|
||||||
|
|
||||||
<PreviewBeta ApplyInnerScrollingFix="true"/>
|
|
||||||
<div class="mb-6"></div>
|
<div class="mb-6"></div>
|
||||||
|
|
||||||
<MudText Typo="Typo.h4" Class="mb-3">
|
<MudText Typo="Typo.h4" Class="mb-3">
|
||||||
@ -108,7 +108,7 @@ else
|
|||||||
|
|
||||||
<ConfigurationProviderSelection Component="Components.DOCUMENT_ANALYSIS_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => this.IsNoPolicySelectedOrProtected)" SelectedValue="@(() => this.policyPreselectedProviderId)" SelectionUpdate="@(providerId => this.PolicyPreselectedProviderWasChanged(providerId))" ExplicitMinimumConfidence="@this.GetPolicyMinimumConfidenceLevel()"/>
|
<ConfigurationProviderSelection Component="Components.DOCUMENT_ANALYSIS_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => this.IsNoPolicySelectedOrProtected)" SelectedValue="@(() => this.policyPreselectedProviderId)" SelectionUpdate="@(providerId => this.PolicyPreselectedProviderWasChanged(providerId))" ExplicitMinimumConfidence="@this.GetPolicyMinimumConfidenceLevel()"/>
|
||||||
|
|
||||||
<ProfileFormSelection Disabled="@this.IsNoPolicySelected" Profile="@this.currentProfile" ProfileChanged="@this.PolicyPreselectedProfileWasChangedAsync" />
|
<ConfigurationSelect OptionDescription="@T("Preselect a profile")" Disabled="@(() => this.IsNoPolicySelected)" SelectedValue="@(() => this.policyPreselectedProfile)" Data="@ConfigurationSelectDataFactory.GetComponentProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdateAsync="@(async selection => await this.PolicyPreselectedProfileWasChangedAsync(selection))" OptionHelp="@T("Choose whether the policy should use the app default profile, no profile, or a specific profile.")"/>
|
||||||
|
|
||||||
<MudTextSwitch Disabled="@(this.IsNoPolicySelected || (this.selectedPolicy?.IsEnterpriseConfiguration ?? true))" Label="@T("Would you like to protect this policy so that you cannot accidentally edit or delete it?")" Value="@this.policyIsProtected" ValueChanged="async state => await this.PolicyProtectionWasChanged(state)" LabelOn="@T("Yes, protect this policy")" LabelOff="@T("No, the policy can be edited")" />
|
<MudTextSwitch Disabled="@(this.IsNoPolicySelected || (this.selectedPolicy?.IsEnterpriseConfiguration ?? true))" Label="@T("Would you like to protect this policy so that you cannot accidentally edit or delete it?")" Value="@this.policyIsProtected" ValueChanged="async state => await this.PolicyProtectionWasChanged(state)" LabelOn="@T("Yes, protect this policy")" LabelOff="@T("No, the policy can be edited")" />
|
||||||
|
|
||||||
|
|||||||
@ -176,7 +176,7 @@ public partial class DocumentAnalysisAssistant : AssistantBaseCore<NoSettingsPan
|
|||||||
this.policyOutputRules = string.Empty;
|
this.policyOutputRules = string.Empty;
|
||||||
this.policyMinimumProviderConfidence = ConfidenceLevel.NONE;
|
this.policyMinimumProviderConfidence = ConfidenceLevel.NONE;
|
||||||
this.policyPreselectedProviderId = string.Empty;
|
this.policyPreselectedProviderId = string.Empty;
|
||||||
this.policyPreselectedProfileId = Profile.NO_PROFILE.Id;
|
this.policyPreselectedProfile = ProfilePreselection.NoProfile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,7 +203,7 @@ public partial class DocumentAnalysisAssistant : AssistantBaseCore<NoSettingsPan
|
|||||||
this.policyOutputRules = this.selectedPolicy.OutputRules;
|
this.policyOutputRules = this.selectedPolicy.OutputRules;
|
||||||
this.policyMinimumProviderConfidence = this.selectedPolicy.MinimumProviderConfidence;
|
this.policyMinimumProviderConfidence = this.selectedPolicy.MinimumProviderConfidence;
|
||||||
this.policyPreselectedProviderId = this.selectedPolicy.PreselectedProvider;
|
this.policyPreselectedProviderId = this.selectedPolicy.PreselectedProvider;
|
||||||
this.policyPreselectedProfileId = string.IsNullOrWhiteSpace(this.selectedPolicy.PreselectedProfile) ? Profile.NO_PROFILE.Id : this.selectedPolicy.PreselectedProfile;
|
this.policyPreselectedProfile = ProfilePreselection.FromStoredValue(this.selectedPolicy.PreselectedProfile);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -242,7 +242,7 @@ public partial class DocumentAnalysisAssistant : AssistantBaseCore<NoSettingsPan
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// The preselected profile is always user-adjustable, even for protected policies and enterprise configurations:
|
// The preselected profile is always user-adjustable, even for protected policies and enterprise configurations:
|
||||||
this.selectedPolicy.PreselectedProfile = this.policyPreselectedProfileId;
|
this.selectedPolicy.PreselectedProfile = this.policyPreselectedProfile;
|
||||||
|
|
||||||
// Enterprise configurations cannot be modified at all:
|
// Enterprise configurations cannot be modified at all:
|
||||||
if(this.selectedPolicy.IsEnterpriseConfiguration)
|
if(this.selectedPolicy.IsEnterpriseConfiguration)
|
||||||
@ -274,7 +274,7 @@ public partial class DocumentAnalysisAssistant : AssistantBaseCore<NoSettingsPan
|
|||||||
private string policyOutputRules = string.Empty;
|
private string policyOutputRules = string.Empty;
|
||||||
private ConfidenceLevel policyMinimumProviderConfidence = ConfidenceLevel.NONE;
|
private ConfidenceLevel policyMinimumProviderConfidence = ConfidenceLevel.NONE;
|
||||||
private string policyPreselectedProviderId = string.Empty;
|
private string policyPreselectedProviderId = string.Empty;
|
||||||
private string policyPreselectedProfileId = Profile.NO_PROFILE.Id;
|
private ProfilePreselection policyPreselectedProfile = ProfilePreselection.NoProfile;
|
||||||
private HashSet<FileAttachment> loadedDocumentPaths = [];
|
private HashSet<FileAttachment> loadedDocumentPaths = [];
|
||||||
private readonly List<ConfigurationSelectData<string>> availableLLMProviders = new();
|
private readonly List<ConfigurationSelectData<string>> availableLLMProviders = new();
|
||||||
|
|
||||||
@ -450,14 +450,21 @@ public partial class DocumentAnalysisAssistant : AssistantBaseCore<NoSettingsPan
|
|||||||
|
|
||||||
private Profile ResolveProfileSelection()
|
private Profile ResolveProfileSelection()
|
||||||
{
|
{
|
||||||
if (this.selectedPolicy is not null && !string.IsNullOrWhiteSpace(this.selectedPolicy.PreselectedProfile))
|
if (this.selectedPolicy is null)
|
||||||
|
return this.SettingsManager.GetPreselectedProfile(this.Component);
|
||||||
|
|
||||||
|
var policyProfilePreselection = ProfilePreselection.FromStoredValue(this.selectedPolicy.PreselectedProfile);
|
||||||
|
if (policyProfilePreselection.DoNotPreselectProfile)
|
||||||
|
return Profile.NO_PROFILE;
|
||||||
|
|
||||||
|
if (policyProfilePreselection.UseSpecificProfile)
|
||||||
{
|
{
|
||||||
var policyProfile = this.SettingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == this.selectedPolicy.PreselectedProfile);
|
var policyProfile = this.SettingsManager.ConfigurationData.Profiles.FirstOrDefault(x => x.Id == policyProfilePreselection.SpecificProfileId);
|
||||||
if (policyProfile is not null)
|
if (policyProfile is not null)
|
||||||
return policyProfile;
|
return policyProfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.SettingsManager.GetPreselectedProfile(this.Component);
|
return this.SettingsManager.GetAppPreselectedProfile();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task PolicyMinimumConfidenceWasChangedAsync(ConfidenceLevel level)
|
private async Task PolicyMinimumConfidenceWasChangedAsync(ConfidenceLevel level)
|
||||||
@ -479,11 +486,11 @@ public partial class DocumentAnalysisAssistant : AssistantBaseCore<NoSettingsPan
|
|||||||
this.ApplyPolicyPreselection();
|
this.ApplyPolicyPreselection();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task PolicyPreselectedProfileWasChangedAsync(Profile profile)
|
private async Task PolicyPreselectedProfileWasChangedAsync(ProfilePreselection selection)
|
||||||
{
|
{
|
||||||
this.policyPreselectedProfileId = profile.Id;
|
this.policyPreselectedProfile = selection;
|
||||||
if (this.selectedPolicy is not null)
|
if (this.selectedPolicy is not null)
|
||||||
this.selectedPolicy.PreselectedProfile = this.policyPreselectedProfileId;
|
this.selectedPolicy.PreselectedProfile = this.policyPreselectedProfile;
|
||||||
|
|
||||||
this.currentProfile = this.ResolveProfileSelection();
|
this.currentProfile = this.ResolveProfileSelection();
|
||||||
await this.AutoSave();
|
await this.AutoSave();
|
||||||
@ -734,7 +741,7 @@ public partial class DocumentAnalysisAssistant : AssistantBaseCore<NoSettingsPan
|
|||||||
return string.Empty;
|
return string.Empty;
|
||||||
|
|
||||||
var preselectedProvider = string.IsNullOrWhiteSpace(this.selectedPolicy.PreselectedProvider) ? string.Empty : this.selectedPolicy.PreselectedProvider;
|
var preselectedProvider = string.IsNullOrWhiteSpace(this.selectedPolicy.PreselectedProvider) ? string.Empty : this.selectedPolicy.PreselectedProvider;
|
||||||
var preselectedProfile = string.IsNullOrWhiteSpace(this.selectedPolicy.PreselectedProfile) ? Profile.NO_PROFILE.Id : this.selectedPolicy.PreselectedProfile;
|
var preselectedProfile = string.IsNullOrWhiteSpace(this.selectedPolicy.PreselectedProfile) ? string.Empty : this.selectedPolicy.PreselectedProfile;
|
||||||
var id = string.IsNullOrWhiteSpace(this.selectedPolicy.Id) ? Guid.NewGuid().ToString() : this.selectedPolicy.Id;
|
var id = string.IsNullOrWhiteSpace(this.selectedPolicy.Id) ? Guid.NewGuid().ToString() : this.selectedPolicy.Id;
|
||||||
|
|
||||||
return $$"""
|
return $$"""
|
||||||
|
|||||||
@ -430,6 +430,12 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTA
|
|||||||
-- Load output rules from document
|
-- Load output rules from document
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2168201568"] = "Load output rules from document"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2168201568"] = "Load output rules from document"
|
||||||
|
|
||||||
|
-- Choose whether the policy should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2214900121"] = "Choose whether the policy should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- The analysis rules specify what the AI should pay particular attention to while reviewing the documents you provide, and which aspects it should highlight or save. For example, if you want to extract the potential of green hydrogen for agriculture from a variety of general publications, you can explicitly define this in the analysis rules.
|
-- The analysis rules specify what the AI should pay particular attention to while reviewing the documents you provide, and which aspects it should highlight or save. For example, if you want to extract the potential of green hydrogen for agriculture from a variety of general publications, you can explicitly define this in the analysis rules.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T238145218"] = "The analysis rules specify what the AI should pay particular attention to while reviewing the documents you provide, and which aspects it should highlight or save. For example, if you want to extract the potential of green hydrogen for agriculture from a variety of general publications, you can explicitly define this in the analysis rules."
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T238145218"] = "The analysis rules specify what the AI should pay particular attention to while reviewing the documents you provide, and which aspects it should highlight or save. For example, if you want to extract the potential of green hydrogen for agriculture from a variety of general publications, you can explicitly define this in the analysis rules."
|
||||||
|
|
||||||
@ -1354,6 +1360,189 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::
|
|||||||
-- Marketing (advertisements, sales texts)
|
-- Marketing (advertisements, sales texts)
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T945714286"] = "Marketing (advertisements, sales texts)"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T945714286"] = "Marketing (advertisements, sales texts)"
|
||||||
|
|
||||||
|
-- Children
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T188567026"] = "Children"
|
||||||
|
|
||||||
|
-- Unspecified age group
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T300604284"] = "Unspecified age group"
|
||||||
|
|
||||||
|
-- Adults
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T3335941460"] = "Adults"
|
||||||
|
|
||||||
|
-- Teenagers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T3696960735"] = "Teenagers"
|
||||||
|
|
||||||
|
-- No expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T1612807521"] = "No expertise"
|
||||||
|
|
||||||
|
-- Intermediate expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T2131860427"] = "Intermediate expertise"
|
||||||
|
|
||||||
|
-- Unspecified expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T2879202483"] = "Unspecified expertise"
|
||||||
|
|
||||||
|
-- Basic expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T2909686714"] = "Basic expertise"
|
||||||
|
|
||||||
|
-- Experts
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T3130182982"] = "Experts"
|
||||||
|
|
||||||
|
-- Individual contributors
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T1893672448"] = "Individual contributors"
|
||||||
|
|
||||||
|
-- Team leads
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2112906979"] = "Team leads"
|
||||||
|
|
||||||
|
-- Board members
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2483400884"] = "Board members"
|
||||||
|
|
||||||
|
-- Unspecified organizational level
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2633679224"] = "Unspecified organizational level"
|
||||||
|
|
||||||
|
-- Trainees
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2678344512"] = "Trainees"
|
||||||
|
|
||||||
|
-- Managers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T3187355853"] = "Managers"
|
||||||
|
|
||||||
|
-- Executives
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T3317335174"] = "Executives"
|
||||||
|
|
||||||
|
-- Journalists
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1589799277"] = "Journalists"
|
||||||
|
|
||||||
|
-- Healthcare professionals
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1652521346"] = "Healthcare professionals"
|
||||||
|
|
||||||
|
-- Unspecified audience profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1845793571"] = "Unspecified audience profile"
|
||||||
|
|
||||||
|
-- Lawyers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1959098902"] = "Lawyers"
|
||||||
|
|
||||||
|
-- Investors
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T2516036290"] = "Investors"
|
||||||
|
|
||||||
|
-- Students
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T2905889225"] = "Students"
|
||||||
|
|
||||||
|
-- Scientists
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T332785734"] = "Scientists"
|
||||||
|
|
||||||
|
-- Business professionals
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T3670621687"] = "Business professionals"
|
||||||
|
|
||||||
|
-- Engineers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T3904961809"] = "Engineers"
|
||||||
|
|
||||||
|
-- Public officials
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T439009390"] = "Public officials"
|
||||||
|
|
||||||
|
-- Software developers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T831424531"] = "Software developers"
|
||||||
|
|
||||||
|
-- Important Aspects
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1379883528"] = "Important Aspects"
|
||||||
|
|
||||||
|
-- Extent of the planned presentation
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1408740929"] = "Extent of the planned presentation"
|
||||||
|
|
||||||
|
-- You might want to specify important aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1672597841"] = "You might want to specify important aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted."
|
||||||
|
|
||||||
|
-- Details about the desired presentation
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1793579367"] = "Details about the desired presentation"
|
||||||
|
|
||||||
|
-- Text content
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1820253043"] = "Text content"
|
||||||
|
|
||||||
|
-- Slide Assistant
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1883918574"] = "Slide Assistant"
|
||||||
|
|
||||||
|
-- Please provide a text or at least one valid document or image.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2013746884"] = "Please provide a text or at least one valid document or image."
|
||||||
|
|
||||||
|
-- Content to derive slide from
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2086228265"] = "Content to derive slide from"
|
||||||
|
|
||||||
|
-- Target language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T237828418"] = "Target language"
|
||||||
|
|
||||||
|
-- (Optional) Important Aspects
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T24391765"] = "(Optional) Important Aspects"
|
||||||
|
|
||||||
|
-- Audience age group
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2496533563"] = "Audience age group"
|
||||||
|
|
||||||
|
-- You can enter text, use one or more documents or images, or use both. At least one of these options is required.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2542045947"] = "You can enter text, use one or more documents or images, or use both. At least one of these options is required."
|
||||||
|
|
||||||
|
-- Language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2591284123"] = "Language"
|
||||||
|
|
||||||
|
-- Audience organizational level
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2599228833"] = "Audience organizational level"
|
||||||
|
|
||||||
|
-- Number of slides
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2823798965"] = "Number of slides"
|
||||||
|
|
||||||
|
-- This assistant helps you create clear, structured slides from long texts or documents. Enter a presentation title and provide the content either as text or with one or more documents. Important aspects allow you to add instructions to the LLM regarding output or formatting. Set the number of slides either directly or based on your desired presentation duration. You can also specify the number of bullet points. If the default value of 0 is not changed, the LLM will independently determine how many slides or bullet points to generate. The output can be flexibly generated in various languages and tailored to a specific audience.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2910177051"] = "This assistant helps you create clear, structured slides from long texts or documents. Enter a presentation title and provide the content either as text or with one or more documents. Important aspects allow you to add instructions to the LLM regarding output or formatting. Set the number of slides either directly or based on your desired presentation duration. You can also specify the number of bullet points. If the default value of 0 is not changed, the LLM will independently determine how many slides or bullet points to generate. The output can be flexibly generated in various languages and tailored to a specific audience."
|
||||||
|
|
||||||
|
-- The result of your previous slide builder session.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3000286990"] = "The result of your previous slide builder session."
|
||||||
|
|
||||||
|
-- Please enter a title for the presentation. This will help the LLM to select more relevant content.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3013824309"] = "Please enter a title for the presentation. This will help the LLM to select more relevant content."
|
||||||
|
|
||||||
|
-- Please provide a title
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3049299559"] = "Please provide a title"
|
||||||
|
|
||||||
|
-- Create Slides
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3079776593"] = "Create Slides"
|
||||||
|
|
||||||
|
-- Please specify the audience for the planned presentation. This will help the LLM to create a presentation that fits your needs. You can specify the audience profile, the age group, organizational level, and the expertise. You don't have to specify all of these parameters, for example you might only want to specify the audience profile and leave the other parameters at their default values.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3465256803"] = "Please specify the audience for the planned presentation. This will help the LLM to create a presentation that fits your needs. You can specify the audience profile, the age group, organizational level, and the expertise. You don't have to specify all of these parameters, for example you might only want to specify the audience profile and leave the other parameters at their default values."
|
||||||
|
|
||||||
|
-- (Optional) Specify aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3476149293"] = "(Optional) Specify aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted."
|
||||||
|
|
||||||
|
-- Audience
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3506118019"] = "Audience"
|
||||||
|
|
||||||
|
-- Time specification (minutes)
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3539067305"] = "Time specification (minutes)"
|
||||||
|
|
||||||
|
-- Audience profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3649769130"] = "Audience profile"
|
||||||
|
|
||||||
|
-- Attach documents
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3666048746"] = "Attach documents"
|
||||||
|
|
||||||
|
-- Number of bullet points
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3796347042"] = "Number of bullet points"
|
||||||
|
|
||||||
|
-- Custom target language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3848935911"] = "Custom target language"
|
||||||
|
|
||||||
|
-- Presentation title
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3893271035"] = "Presentation title"
|
||||||
|
|
||||||
|
-- {0} - Slide Builder Session
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3922788056"] = "{0} - Slide Builder Session"
|
||||||
|
|
||||||
|
-- Please specify the extent of the planned presentation. This can be the number of slides, the number of bullet points per slide, or the time specification for the presentation. This will help the LLM to create a presentation that fits your needs. Leave the default values if you don't have specific requirements regarding the extent of the presentation. You might only want to specify one of these parameters, for example the time specification, and leave the others at their default values.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T4131419342"] = "Please specify the extent of the planned presentation. This can be the number of slides, the number of bullet points per slide, or the time specification for the presentation. This will help the LLM to create a presentation that fits your needs. Leave the default values if you don't have specific requirements regarding the extent of the presentation. You might only want to specify one of these parameters, for example the time specification, and leave the others at their default values."
|
||||||
|
|
||||||
|
-- Audience expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T4279519256"] = "Audience expertise"
|
||||||
|
|
||||||
|
-- Title
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T617902505"] = "Title"
|
||||||
|
|
||||||
|
-- Please provide a custom language.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T656744944"] = "Please provide a custom language."
|
||||||
|
|
||||||
-- Your word or phrase
|
-- Your word or phrase
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T1847246020"] = "Your word or phrase"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T1847246020"] = "Your word or phrase"
|
||||||
|
|
||||||
@ -1591,6 +1780,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1133040906"] = "Move chat
|
|||||||
-- Are you sure you want to move this chat? All unsaved changes will be lost.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1142475422"] = "Are you sure you want to move this chat? All unsaved changes will be lost."
|
||||||
|
|
||||||
|
-- Bold
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1165397398"] = "Bold"
|
||||||
|
|
||||||
-- Stop generation
|
-- Stop generation
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1317408357"] = "Stop generation"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1317408357"] = "Stop generation"
|
||||||
|
|
||||||
@ -1603,9 +1795,18 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1849313532"] = "Type your
|
|||||||
-- Your Prompt (use selected instance '{0}', provider '{1}')
|
-- Your Prompt (use selected instance '{0}', provider '{1}')
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1967611328"] = "Your Prompt (use selected instance '{0}', provider '{1}')"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1967611328"] = "Your Prompt (use selected instance '{0}', provider '{1}')"
|
||||||
|
|
||||||
|
-- Code
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2036185364"] = "Code"
|
||||||
|
|
||||||
|
-- Italic
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2377171085"] = "Italic"
|
||||||
|
|
||||||
-- Profile usage is disabled according to your chat template settings.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2670286472"] = "Profile usage is disabled according to your chat template settings."
|
||||||
|
|
||||||
|
-- Bulleted List
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2957125464"] = "Bulleted List"
|
||||||
|
|
||||||
-- Delete this chat & start a new one.
|
-- Delete this chat & start a new one.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2991985411"] = "Delete this chat & start a new one."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2991985411"] = "Delete this chat & start a new one."
|
||||||
|
|
||||||
@ -1624,6 +1825,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3928697643"] = "Start new
|
|||||||
-- Start temporary chat
|
-- Start temporary chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4113970938"] = "Start temporary chat"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4113970938"] = "Start temporary chat"
|
||||||
|
|
||||||
|
-- Heading
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4231005109"] = "Heading"
|
||||||
|
|
||||||
-- Please select the workspace where you want to move the chat to.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T474393241"] = "Please select the workspace where you want to move the chat to."
|
||||||
|
|
||||||
@ -1768,6 +1972,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T700666808"] = "Mana
|
|||||||
-- Available Data Sources
|
-- Available Data Sources
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T86053874"] = "Available Data Sources"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T86053874"] = "Available Data Sources"
|
||||||
|
|
||||||
|
-- LLMs can make mistakes. Check important information.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::HALLUZINATIONREMINDER::T3528806904"] = "LLMs can make mistakes. Check important information."
|
||||||
|
|
||||||
-- Issues
|
-- Issues
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ISSUES::T3229841001"] = "Issues"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ISSUES::T3229841001"] = "Issues"
|
||||||
|
|
||||||
@ -2062,6 +2269,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1364944735"]
|
|||||||
-- Select preview features
|
-- Select preview features
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1439783084"] = "Select preview features"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1439783084"] = "Select preview features"
|
||||||
|
|
||||||
|
-- Your organization provided a default start page, but you can still change it.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1454730224"] = "Your organization provided a default start page, but you can still change it."
|
||||||
|
|
||||||
-- Select the desired behavior for the navigation bar.
|
-- Select the desired behavior for the navigation bar.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1555038969"] = "Select the desired behavior for the navigation bar."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1555038969"] = "Select the desired behavior for the navigation bar."
|
||||||
|
|
||||||
@ -2110,6 +2320,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591284123"]
|
|||||||
-- Administration settings are visible
|
-- Administration settings are visible
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591866808"] = "Administration settings are visible"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591866808"] = "Administration settings are visible"
|
||||||
|
|
||||||
|
-- Choose which page AI Studio should open first when you start the app. Changes take effect the next time you launch AI Studio.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2655930524"] = "Choose which page AI Studio should open first when you start the app. Changes take effect the next time you launch AI Studio."
|
||||||
|
|
||||||
-- Save energy?
|
-- Save energy?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3100928009"] = "Save energy?"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3100928009"] = "Save energy?"
|
||||||
|
|
||||||
@ -2158,6 +2371,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T71162186"] =
|
|||||||
-- Energy saving is disabled
|
-- Energy saving is disabled
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T716338721"] = "Energy saving is disabled"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T716338721"] = "Energy saving is disabled"
|
||||||
|
|
||||||
|
-- Start page
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T78084670"] = "Start page"
|
||||||
|
|
||||||
-- Preview feature visibility
|
-- Preview feature visibility
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T817101267"] = "Preview feature visibility"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T817101267"] = "Preview feature visibility"
|
||||||
|
|
||||||
@ -2518,6 +2734,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T428040679"] = "Content creation"
|
|||||||
-- Useful assistants
|
-- Useful assistants
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T586430036"] = "Useful assistants"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T586430036"] = "Useful assistants"
|
||||||
|
|
||||||
|
-- Voice recording has been disabled for this session because audio playback could not be initialized on the client.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T1123032432"] = "Voice recording has been disabled for this session because audio playback could not be initialized on the client."
|
||||||
|
|
||||||
-- Failed to create the transcription provider.
|
-- Failed to create the transcription provider.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T1689988905"] = "Failed to create the transcription provider."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T1689988905"] = "Failed to create the transcription provider."
|
||||||
|
|
||||||
@ -2527,6 +2746,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2144994226"] = "Failed to
|
|||||||
-- Stop recording and start transcription
|
-- Stop recording and start transcription
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T224155287"] = "Stop recording and start transcription"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T224155287"] = "Stop recording and start transcription"
|
||||||
|
|
||||||
|
-- Voice recording is unavailable because the client could not initialize audio playback.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2260302339"] = "Voice recording is unavailable because the client could not initialize audio playback."
|
||||||
|
|
||||||
-- Start recording your voice for a transcription
|
-- Start recording your voice for a transcription
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2372624045"] = "Start recording your voice for a transcription"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2372624045"] = "Start recording your voice for a transcription"
|
||||||
|
|
||||||
@ -2557,8 +2779,8 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1016188706"] = "Are you sure
|
|||||||
-- Move chat
|
-- Move chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1133040906"] = "Move chat"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1133040906"] = "Move chat"
|
||||||
|
|
||||||
-- Unnamed workspace
|
-- Loading chats...
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1307384014"] = "Unnamed workspace"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1364857726"] = "Loading chats..."
|
||||||
|
|
||||||
-- Delete
|
-- Delete
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1469573738"] = "Delete"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1469573738"] = "Delete"
|
||||||
@ -2614,9 +2836,6 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T323280982"] = "Please enter
|
|||||||
-- Please enter a workspace name.
|
-- Please enter a workspace name.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3288132732"] = "Please enter a workspace name."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3288132732"] = "Please enter a workspace name."
|
||||||
|
|
||||||
-- Unnamed chat
|
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3310482275"] = "Unnamed chat"
|
|
||||||
|
|
||||||
-- Rename
|
-- Rename
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3355849203"] = "Rename"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3355849203"] = "Rename"
|
||||||
|
|
||||||
@ -2743,6 +2962,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T380891852"] = "Example
|
|||||||
-- Actions
|
-- Actions
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3865031940"] = "Actions"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3865031940"] = "Actions"
|
||||||
|
|
||||||
|
-- Load system prompt from file
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3883091650"] = "Load system prompt from file"
|
||||||
|
|
||||||
-- Messages per page
|
-- Messages per page
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3893704289"] = "Messages per page"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3893704289"] = "Messages per page"
|
||||||
|
|
||||||
@ -3535,6 +3757,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1870831108"] = "Failed to l
|
|||||||
-- Please enter a model name.
|
-- Please enter a model name.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1936099896"] = "Please enter a model name."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1936099896"] = "Please enter a model name."
|
||||||
|
|
||||||
|
-- Additional API parameters must form a JSON object.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2051143391"] = "Additional API parameters must form a JSON object."
|
||||||
|
|
||||||
-- Model
|
-- Model
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2189814010"] = "Model"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2189814010"] = "Model"
|
||||||
|
|
||||||
@ -3556,12 +3781,18 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2842060373"] = "Instance Na
|
|||||||
-- Show Expert Settings
|
-- Show Expert Settings
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3361153305"] = "Show Expert Settings"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3361153305"] = "Show Expert Settings"
|
||||||
|
|
||||||
|
-- Invalid JSON: Add the parameters in proper JSON formatting, e.g., \"temperature\": 0.5. Remove trailing commas. The usual surrounding curly brackets {} must not be used, though.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3502745319"] = "Invalid JSON: Add the parameters in proper JSON formatting, e.g., \\\"temperature\\\": 0.5. Remove trailing commas. The usual surrounding curly brackets {} must not be used, though."
|
||||||
|
|
||||||
-- Show available models
|
-- Show available models
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3763891899"] = "Show available models"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3763891899"] = "Show available models"
|
||||||
|
|
||||||
-- This host uses the model configured at the provider level. No model selection is available.
|
-- This host uses the model configured at the provider level. No model selection is available.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3783329915"] = "This host uses the model configured at the provider level. No model selection is available."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3783329915"] = "This host uses the model configured at the provider level. No model selection is available."
|
||||||
|
|
||||||
|
-- Duplicate key '{0}' found.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3804472591"] = "Duplicate key '{0}' found."
|
||||||
|
|
||||||
-- Currently, we cannot query the models for the selected provider and/or host. Therefore, please enter the model name manually.
|
-- Currently, we cannot query the models for the selected provider and/or host. Therefore, please enter the model name manually.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T4116737656"] = "Currently, we cannot query the models for the selected provider and/or host. Therefore, please enter the model name manually."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T4116737656"] = "Currently, we cannot query the models for the selected provider and/or host. Therefore, please enter the model name manually."
|
||||||
|
|
||||||
@ -3742,6 +3973,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1471770981"
|
|||||||
-- Preselect whether participants needs to arrive and depart
|
-- Preselect whether participants needs to arrive and depart
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1648427207"] = "Preselect whether participants needs to arrive and depart"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1648427207"] = "Preselect whether participants needs to arrive and depart"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- Preselect a start time?
|
-- Preselect a start time?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1901151023"] = "Preselect a start time?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1901151023"] = "Preselect a start time?"
|
||||||
|
|
||||||
@ -3754,8 +3988,8 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1998244307"
|
|||||||
-- Preselect whether the meeting is virtual
|
-- Preselect whether the meeting is virtual
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2084951012"] = "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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- When enabled, you can preselect most agenda options. This is might be useful when you need to create similar agendas often.
|
-- 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."
|
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."
|
||||||
@ -3808,9 +4042,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3709527588"
|
|||||||
-- Preselect a topic?
|
-- Preselect a topic?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3835166371"] = "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
|
-- Preselect the agenda language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4055846391"] = "Preselect the agenda language"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4055846391"] = "Preselect the agenda language"
|
||||||
|
|
||||||
@ -3847,15 +4078,18 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1608
|
|||||||
-- Yes, you can only retrieve one bias per 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"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1765683725"] = "Yes, you can only retrieve one bias per day"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- Reset
|
-- Reset
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T180921696"] = "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.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2305356277"] = "No restriction. You can retrieve as many biases as you want per day."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Which language should be preselected?
|
-- Which language should be preselected?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2345162613"] = "Which language should be preselected?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2345162613"] = "Which language should be preselected?"
|
||||||
|
|
||||||
@ -3880,9 +4114,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3848
|
|||||||
-- Options are preselected
|
-- Options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3875604319"] = "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.
|
-- 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."
|
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."
|
||||||
|
|
||||||
@ -3913,8 +4144,11 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1773585398"]
|
|||||||
-- Provider selection when creating new chats
|
-- Provider selection when creating new chats
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T189306836"] = "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?
|
-- Choose whether chats should use the app default profile, no profile, or a specific profile.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1933521846"] = "Would you like to set one of your profiles as the default for chats?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1915793195"] = "Choose whether chats should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Apply default data source option when sending assistant results to chat
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2510376349"] = "Apply default data source option when sending assistant results to chat"
|
||||||
@ -3952,9 +4186,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3730599555"]
|
|||||||
-- Latest message is shown, after loading a chat
|
-- Latest message is shown, after loading a chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3755993611"] = "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?
|
-- 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?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T4033153439"] = "Do you want to apply the default data source options when sending assistant results to chat?"
|
||||||
|
|
||||||
@ -4015,11 +4246,14 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1073540083"
|
|||||||
-- Compiler messages are preselected
|
-- Compiler messages are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1110902070"] = "Compiler messages are preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1110902070"] = "Compiler messages are preselected"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- Preselect a programming language
|
-- Preselect a programming language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2181567002"] = "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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- When enabled, you can preselect the coding options. This is might be useful when you prefer a specific programming language or LLM model.
|
-- 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."
|
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."
|
||||||
@ -4036,9 +4270,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3015105896"
|
|||||||
-- Coding options are preselected
|
-- Coding options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3567850751"] = "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
|
-- Preselect another programming language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4230412334"] = "Preselect another programming language"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4230412334"] = "Preselect another programming language"
|
||||||
|
|
||||||
@ -4138,14 +4369,17 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T12806662
|
|||||||
-- Preselect ERI server options?
|
-- Preselect ERI server options?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1664055662"] = "Preselect ERI server options?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1664055662"] = "Preselect ERI server options?"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- No ERI server options are preselected
|
-- No ERI server options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1793785587"] = "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.
|
-- 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."
|
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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Close
|
-- Close
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3448155331"] = "Close"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3448155331"] = "Close"
|
||||||
@ -4153,9 +4387,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T34481553
|
|||||||
-- Assistant: ERI Server Options
|
-- Assistant: ERI Server Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3629372826"] = "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
|
-- ERI server options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T488190224"] = "ERI server options are preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T488190224"] = "ERI server options are preselected"
|
||||||
|
|
||||||
@ -4303,6 +4534,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1633101
|
|||||||
-- Web content reader is not preselected
|
-- Web content reader is not preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1701127912"] = "Web content reader is not preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1701127912"] = "Web content reader is not preselected"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- Content cleaner agent is not preselected
|
-- Content cleaner agent is not preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1969816694"] = "Content cleaner agent is not preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1969816694"] = "Content cleaner agent is not preselected"
|
||||||
|
|
||||||
@ -4312,8 +4546,8 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2090693
|
|||||||
-- When enabled, you can preselect some legal check options. This is might be useful when you prefer a specific LLM model.
|
-- 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."
|
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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Legal check options are preselected
|
-- Legal check options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T252916114"] = "Legal check options are preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T252916114"] = "Legal check options are preselected"
|
||||||
@ -4333,17 +4567,17 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3641773
|
|||||||
-- Preselect the content cleaner agent?
|
-- Preselect the content cleaner agent?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3649428096"] = "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
|
-- Assistant: Legal Check Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4033382756"] = "Assistant: Legal Check Options"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4033382756"] = "Assistant: Legal Check Options"
|
||||||
|
|
||||||
-- Preselect the web content reader?
|
-- Preselect the web content reader?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T629158142"] = "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?
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Which language should be preselected?
|
-- Which language should be preselected?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2345162613"] = "Which language should be preselected?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2345162613"] = "Which language should be preselected?"
|
||||||
@ -4366,9 +4600,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3710380967
|
|||||||
-- Options are preselected
|
-- Options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3875604319"] = "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?
|
-- Preselect options?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T42672465"] = "Preselect options?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T42672465"] = "Preselect options?"
|
||||||
|
|
||||||
@ -4456,6 +4687,69 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3745021518
|
|||||||
-- No rewrite & improve text options are preselected
|
-- No rewrite & improve text options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T553954963"] = "No rewrite & improve text options are preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T553954963"] = "No rewrite & improve text options are preselected"
|
||||||
|
|
||||||
|
-- Preselect the audience expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1017131030"] = "Preselect the audience expertise"
|
||||||
|
|
||||||
|
-- When enabled, you can preselect slide builder options. This is might be useful when you prefer a specific language or LLM model.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1393378753"] = "When enabled, you can preselect slide builder options. This is might be useful when you prefer a specific language or LLM model."
|
||||||
|
|
||||||
|
-- Preselect aspects for the LLM to focus on when generating slides, such as bullet points or specific topics to emphasize.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1528169602"] = "Preselect aspects for the LLM to focus on when generating slides, such as bullet points or specific topics to emphasize."
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
|
-- Preselect the audience organizational level
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2014662371"] = "Preselect the audience organizational level"
|
||||||
|
|
||||||
|
-- Which audience organizational level should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T216511105"] = "Which audience organizational level should be preselected?"
|
||||||
|
|
||||||
|
-- Preselect Slide Assistant options?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T227645894"] = "Preselect Slide Assistant options?"
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
|
-- Which language should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2345162613"] = "Which language should be preselected?"
|
||||||
|
|
||||||
|
-- Preselect another language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2382415529"] = "Preselect another language"
|
||||||
|
|
||||||
|
-- Preselect the language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2571465005"] = "Preselect the language"
|
||||||
|
|
||||||
|
-- Preselect the audience age group
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2645589441"] = "Preselect the audience age group"
|
||||||
|
|
||||||
|
-- Assistant: Slide Assistant Options
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3215549988"] = "Assistant: Slide Assistant Options"
|
||||||
|
|
||||||
|
-- Which audience expertise should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3228597992"] = "Which audience expertise should be preselected?"
|
||||||
|
|
||||||
|
-- Close
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3448155331"] = "Close"
|
||||||
|
|
||||||
|
-- Preselect important aspects
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3705987833"] = "Preselect important aspects"
|
||||||
|
|
||||||
|
-- No Slide Assistant options are preselected
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T4214398691"] = "No Slide Assistant options are preselected"
|
||||||
|
|
||||||
|
-- Preselect the audience profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T861397972"] = "Preselect the audience profile"
|
||||||
|
|
||||||
|
-- Slide Assistant options are preselected
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T93124146"] = "Slide Assistant options are preselected"
|
||||||
|
|
||||||
|
-- Which audience age group should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T956845877"] = "Which audience age group should be preselected?"
|
||||||
|
|
||||||
|
-- Which audience profile should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T973572510"] = "Which audience profile should be preselected?"
|
||||||
|
|
||||||
-- When enabled, you can preselect synonym options. This is might be useful when you prefer a specific language or LLM model.
|
-- 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."
|
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."
|
||||||
|
|
||||||
@ -4675,6 +4969,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1417
|
|||||||
-- Preselect another target language
|
-- Preselect another target language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1462295644"] = "Preselect another target language"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1462295644"] = "Preselect another target language"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- Assistant: Writing E-Mails Options
|
-- Assistant: Writing E-Mails Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2021226503"] = "Assistant: Writing E-Mails Options"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2021226503"] = "Assistant: Writing E-Mails Options"
|
||||||
|
|
||||||
@ -4684,8 +4981,8 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2116
|
|||||||
-- Preselect your name for the closing salutation?
|
-- Preselect your name for the closing salutation?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T221974240"] = "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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Preselect a writing style
|
-- Preselect a writing style
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T28456020"] = "Preselect a writing style"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T28456020"] = "Preselect a writing style"
|
||||||
@ -4705,9 +5002,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3547
|
|||||||
-- Preselect e-mail options?
|
-- Preselect e-mail options?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3832719342"] = "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?"
|
|
||||||
|
|
||||||
-- Save
|
-- Save
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SHORTCUTDIALOG::T1294818664"] = "Save"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SHORTCUTDIALOG::T1294818664"] = "Save"
|
||||||
|
|
||||||
@ -4894,6 +5188,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1617786407"] = "Coding"
|
|||||||
-- Analyze a text or an email for tasks you need to complete.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1728590051"] = "Analyze a text or an email for tasks you need to complete."
|
||||||
|
|
||||||
|
-- Slide Assistant
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1883918574"] = "Slide Assistant"
|
||||||
|
|
||||||
-- Text Summarizer
|
-- Text Summarizer
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1907192403"] = "Text Summarizer"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1907192403"] = "Text Summarizer"
|
||||||
|
|
||||||
@ -4933,6 +5230,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3011450657"] = "My Tasks"
|
|||||||
-- E-Mail
|
-- E-Mail
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3026443472"] = "E-Mail"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3026443472"] = "E-Mail"
|
||||||
|
|
||||||
|
-- Develop slide content based on a given topic and content.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T311912219"] = "Develop slide content based on a given topic and content."
|
||||||
|
|
||||||
-- Translate AI Studio text content into other languages
|
-- Translate AI Studio text content into other languages
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3181803840"] = "Translate AI Studio text content into other languages"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3181803840"] = "Translate AI Studio text content into other languages"
|
||||||
|
|
||||||
@ -4981,6 +5281,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T878695986"] = "Learn about one co
|
|||||||
-- Localization
|
-- Localization
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T897888480"] = "Localization"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T897888480"] = "Localization"
|
||||||
|
|
||||||
|
-- Reload your workspaces
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T194629703"] = "Reload your workspaces"
|
||||||
|
|
||||||
-- Hide your workspaces
|
-- Hide your workspaces
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2351468526"] = "Hide your workspaces"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2351468526"] = "Hide your workspaces"
|
||||||
|
|
||||||
@ -5290,6 +5593,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3494984593"] = "Tauri is used to
|
|||||||
-- Motivation
|
-- Motivation
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3563271893"] = "Motivation"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3563271893"] = "Motivation"
|
||||||
|
|
||||||
|
-- not available
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3574465749"] = "not available"
|
||||||
|
|
||||||
-- 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.
|
-- 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::INFORMATION::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."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::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."
|
||||||
|
|
||||||
@ -5311,6 +5617,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3986423270"] = "Check Pandoc Ins
|
|||||||
-- Versions
|
-- Versions
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T4010195468"] = "Versions"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T4010195468"] = "Versions"
|
||||||
|
|
||||||
|
-- Database
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T4036243672"] = "Database"
|
||||||
|
|
||||||
-- 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.
|
-- 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::INFORMATION::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."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::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."
|
||||||
|
|
||||||
@ -5584,12 +5893,21 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1188453609
|
|||||||
-- Show also prototype features: these are works in progress; expect bugs and missing features
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1245257804"] = "Show also prototype features: these are works in progress; expect bugs and missing features"
|
||||||
|
|
||||||
|
-- Settings
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1258653480"] = "Settings"
|
||||||
|
|
||||||
-- No key is sending the input
|
-- No key is sending the input
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1311973034"] = "No key is sending the input"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1311973034"] = "No key is sending the input"
|
||||||
|
|
||||||
-- Navigation never expands, no tooltips
|
-- Navigation never expands, no tooltips
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1402851833"] = "Navigation never expands, no tooltips"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1402851833"] = "Navigation never expands, no tooltips"
|
||||||
|
|
||||||
|
-- Welcome
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1485461907"] = "Welcome"
|
||||||
|
|
||||||
|
-- Assistants
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1614176092"] = "Assistants"
|
||||||
|
|
||||||
-- Store chats automatically
|
-- Store chats automatically
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1664293672"] = "Store chats automatically"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1664293672"] = "Store chats automatically"
|
||||||
|
|
||||||
@ -5614,6 +5932,9 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2195945406
|
|||||||
-- Install updates manually
|
-- Install updates manually
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T220653235"] = "Install updates manually"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T220653235"] = "Install updates manually"
|
||||||
|
|
||||||
|
-- Plugins
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2222816203"] = "Plugins"
|
||||||
|
|
||||||
-- Also show features ready for release; these should be stable
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2301448762"] = "Also show features ready for release; these should be stable"
|
||||||
|
|
||||||
@ -5635,6 +5956,9 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2566503670
|
|||||||
-- No minimum confidence level chosen
|
-- No minimum confidence level chosen
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2828607242"] = "No minimum confidence level chosen"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2828607242"] = "No minimum confidence level chosen"
|
||||||
|
|
||||||
|
-- Supporters
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2929332068"] = "Supporters"
|
||||||
|
|
||||||
-- Do not specify the language
|
-- Do not specify the language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2960082609"] = "Do not specify the language"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2960082609"] = "Do not specify the language"
|
||||||
|
|
||||||
@ -5656,6 +5980,9 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3491430707
|
|||||||
-- Install updates automatically
|
-- Install updates automatically
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3569059463"] = "Install updates automatically"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3569059463"] = "Install updates automatically"
|
||||||
|
|
||||||
|
-- Use app default profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3587225583"] = "Use app default profile"
|
||||||
|
|
||||||
-- Disable workspaces
|
-- Disable workspaces
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3612390107"] = "Disable workspaces"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3612390107"] = "Disable workspaces"
|
||||||
|
|
||||||
@ -5665,9 +5992,15 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3711207137
|
|||||||
-- Also show features in alpha: these are in development; expect bugs and missing features
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4146964761"] = "Also show features in alpha: these are in development; expect bugs and missing features"
|
||||||
|
|
||||||
|
-- Information
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4256323669"] = "Information"
|
||||||
|
|
||||||
-- All preview features are hidden
|
-- All preview features are hidden
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4289410063"] = "All preview features are hidden"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4289410063"] = "All preview features are hidden"
|
||||||
|
|
||||||
|
-- Chat
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T578410699"] = "Chat"
|
||||||
|
|
||||||
-- When possible, use the LLM provider which was used for each chat in the first place
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T75376144"] = "When possible, use the LLM provider which was used for each chat in the first place"
|
||||||
|
|
||||||
@ -5836,6 +6169,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1546040625"] = "My Task
|
|||||||
-- Grammar & Spelling Assistant
|
-- Grammar & Spelling Assistant
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T166453786"] = "Grammar & Spelling Assistant"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T166453786"] = "Grammar & Spelling Assistant"
|
||||||
|
|
||||||
|
-- Slide Assistant
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1883918574"] = "Slide Assistant"
|
||||||
|
|
||||||
-- Legal Check Assistant
|
-- Legal Check Assistant
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1886447798"] = "Legal Check Assistant"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1886447798"] = "Legal Check Assistant"
|
||||||
|
|
||||||
@ -5896,6 +6232,15 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T3893997203"] = "
|
|||||||
-- Trust all LLM providers
|
-- Trust all LLM providers
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T4107860491"] = "Trust all LLM providers"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T4107860491"] = "Trust all LLM providers"
|
||||||
|
|
||||||
|
-- Reason
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::NODATABASECLIENT::T1093747001"] = "Reason"
|
||||||
|
|
||||||
|
-- Unavailable
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::NODATABASECLIENT::T3662391977"] = "Unavailable"
|
||||||
|
|
||||||
|
-- Status
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::NODATABASECLIENT::T6222351"] = "Status"
|
||||||
|
|
||||||
-- Storage size
|
-- Storage size
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::QDRANT::QDRANTCLIENTIMPLEMENTATION::T1230141403"] = "Storage size"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::QDRANT::QDRANTCLIENTIMPLEMENTATION::T1230141403"] = "Storage size"
|
||||||
|
|
||||||
@ -6519,3 +6864,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T1307384014"] = "Unnamed w
|
|||||||
|
|
||||||
-- Delete Chat
|
-- Delete Chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Delete Chat"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Delete Chat"
|
||||||
|
|
||||||
|
-- Unnamed chat
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T3310482275"] = "Unnamed chat"
|
||||||
|
|||||||
@ -0,0 +1,10 @@
|
|||||||
|
namespace AIStudio.Assistants.SlideBuilder;
|
||||||
|
|
||||||
|
public enum AudienceAgeGroup
|
||||||
|
{
|
||||||
|
UNSPECIFIED = 0,
|
||||||
|
|
||||||
|
CHILDREN,
|
||||||
|
TEENAGERS,
|
||||||
|
ADULTS,
|
||||||
|
}
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
namespace AIStudio.Assistants.SlideBuilder;
|
||||||
|
|
||||||
|
public static class AudienceAgeGroupExtensions
|
||||||
|
{
|
||||||
|
private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(AudienceAgeGroupExtensions).Namespace, nameof(AudienceAgeGroupExtensions));
|
||||||
|
|
||||||
|
public static string Name(this AudienceAgeGroup ageGroup) => ageGroup switch
|
||||||
|
{
|
||||||
|
AudienceAgeGroup.UNSPECIFIED => TB("Unspecified age group"),
|
||||||
|
AudienceAgeGroup.CHILDREN => TB("Children"),
|
||||||
|
AudienceAgeGroup.TEENAGERS => TB("Teenagers"),
|
||||||
|
AudienceAgeGroup.ADULTS => TB("Adults"),
|
||||||
|
|
||||||
|
_ => TB("Unspecified age group"),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static string Prompt(this AudienceAgeGroup ageGroup) => ageGroup switch
|
||||||
|
{
|
||||||
|
AudienceAgeGroup.UNSPECIFIED => "Do not tailor the text to a specific age group.",
|
||||||
|
AudienceAgeGroup.CHILDREN => "Use simple, concrete language with short sentences and minimal jargon.",
|
||||||
|
AudienceAgeGroup.TEENAGERS => "Use clear, approachable language with relatable examples and limited jargon.",
|
||||||
|
AudienceAgeGroup.ADULTS => "Use adult-appropriate language with clear structure and direct explanations.",
|
||||||
|
|
||||||
|
_ => "Do not tailor the text to a specific age group.",
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
namespace AIStudio.Assistants.SlideBuilder;
|
||||||
|
|
||||||
|
public enum AudienceExpertise
|
||||||
|
{
|
||||||
|
UNSPECIFIED = 0,
|
||||||
|
|
||||||
|
NON_EXPERTS,
|
||||||
|
BASIC,
|
||||||
|
INTERMEDIATE,
|
||||||
|
EXPERTS,
|
||||||
|
}
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
namespace AIStudio.Assistants.SlideBuilder;
|
||||||
|
|
||||||
|
public static class AudienceExpertiseExtensions
|
||||||
|
{
|
||||||
|
private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(AudienceExpertiseExtensions).Namespace, nameof(AudienceExpertiseExtensions));
|
||||||
|
|
||||||
|
public static string Name(this AudienceExpertise expertise) => expertise switch
|
||||||
|
{
|
||||||
|
AudienceExpertise.UNSPECIFIED => TB("Unspecified expertise"),
|
||||||
|
AudienceExpertise.NON_EXPERTS => TB("No expertise"),
|
||||||
|
AudienceExpertise.BASIC => TB("Basic expertise"),
|
||||||
|
AudienceExpertise.INTERMEDIATE => TB("Intermediate expertise"),
|
||||||
|
AudienceExpertise.EXPERTS => TB("Experts"),
|
||||||
|
|
||||||
|
_ => TB("Unspecified expertise"),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static string Prompt(this AudienceExpertise expertise) => expertise switch
|
||||||
|
{
|
||||||
|
AudienceExpertise.UNSPECIFIED => "Do not tailor the text to a specific expertise level.",
|
||||||
|
AudienceExpertise.NON_EXPERTS => "Avoid jargon and explain specialized concepts plainly.",
|
||||||
|
AudienceExpertise.BASIC => "Use simple terminology and briefly explain important technical terms.",
|
||||||
|
AudienceExpertise.INTERMEDIATE => "Assume some familiarity with the topic, but still explain important details clearly.",
|
||||||
|
AudienceExpertise.EXPERTS => "Assume deep familiarity with the topic and use precise domain-specific terminology.",
|
||||||
|
|
||||||
|
_ => "Do not tailor the text to a specific expertise level.",
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
namespace AIStudio.Assistants.SlideBuilder;
|
||||||
|
|
||||||
|
public enum AudienceOrganizationalLevel
|
||||||
|
{
|
||||||
|
UNSPECIFIED = 0,
|
||||||
|
|
||||||
|
TRAINEES,
|
||||||
|
INDIVIDUAL_CONTRIBUTORS,
|
||||||
|
TEAM_LEADS,
|
||||||
|
MANAGERS,
|
||||||
|
EXECUTIVES,
|
||||||
|
BOARD_MEMBERS,
|
||||||
|
}
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
namespace AIStudio.Assistants.SlideBuilder;
|
||||||
|
|
||||||
|
public static class AudienceOrganizationalLevelExtensions
|
||||||
|
{
|
||||||
|
private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(AudienceOrganizationalLevelExtensions).Namespace, nameof(AudienceOrganizationalLevelExtensions));
|
||||||
|
|
||||||
|
public static string Name(this AudienceOrganizationalLevel level) => level switch
|
||||||
|
{
|
||||||
|
AudienceOrganizationalLevel.UNSPECIFIED => TB("Unspecified organizational level"),
|
||||||
|
AudienceOrganizationalLevel.TRAINEES => TB("Trainees"),
|
||||||
|
AudienceOrganizationalLevel.INDIVIDUAL_CONTRIBUTORS => TB("Individual contributors"),
|
||||||
|
AudienceOrganizationalLevel.TEAM_LEADS => TB("Team leads"),
|
||||||
|
AudienceOrganizationalLevel.MANAGERS => TB("Managers"),
|
||||||
|
AudienceOrganizationalLevel.EXECUTIVES => TB("Executives"),
|
||||||
|
AudienceOrganizationalLevel.BOARD_MEMBERS => TB("Board members"),
|
||||||
|
|
||||||
|
_ => TB("Unspecified organizational level"),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static string Prompt(this AudienceOrganizationalLevel level) => level switch
|
||||||
|
{
|
||||||
|
AudienceOrganizationalLevel.UNSPECIFIED => "Do not tailor the text to a specific organizational level.",
|
||||||
|
AudienceOrganizationalLevel.TRAINEES => "Keep the content supportive and introductory. Explain context and avoid assuming prior organizational knowledge.",
|
||||||
|
AudienceOrganizationalLevel.INDIVIDUAL_CONTRIBUTORS => "Focus on execution, clarity, responsibilities, and practical next steps.",
|
||||||
|
AudienceOrganizationalLevel.TEAM_LEADS => "Focus on coordination, tradeoffs, risks, and concrete actions for a small team.",
|
||||||
|
AudienceOrganizationalLevel.MANAGERS => "Focus on planning, priorities, outcomes, risks, and resource implications.",
|
||||||
|
AudienceOrganizationalLevel.EXECUTIVES => "Focus on strategy, business impact, risks, and the decisions required.",
|
||||||
|
AudienceOrganizationalLevel.BOARD_MEMBERS => "Provide a concise executive-level summary with governance, strategy, risk, and decision relevance.",
|
||||||
|
|
||||||
|
_ => "Do not tailor the text to a specific organizational level.",
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
namespace AIStudio.Assistants.SlideBuilder;
|
||||||
|
|
||||||
|
public enum AudienceProfile
|
||||||
|
{
|
||||||
|
UNSPECIFIED = 0,
|
||||||
|
|
||||||
|
STUDENTS,
|
||||||
|
SCIENTISTS,
|
||||||
|
LAWYERS,
|
||||||
|
INVESTORS,
|
||||||
|
ENGINEERS,
|
||||||
|
SOFTWARE_DEVELOPERS,
|
||||||
|
JOURNALISTS,
|
||||||
|
HEALTHCARE_PROFESSIONALS,
|
||||||
|
PUBLIC_OFFICIALS,
|
||||||
|
BUSINESS_PROFESSIONALS,
|
||||||
|
}
|
||||||
@ -0,0 +1,40 @@
|
|||||||
|
namespace AIStudio.Assistants.SlideBuilder;
|
||||||
|
|
||||||
|
public static class AudienceProfileExtensions
|
||||||
|
{
|
||||||
|
private static string TB(string fallbackEN) => Tools.PluginSystem.I18N.I.T(fallbackEN, typeof(AudienceProfileExtensions).Namespace, nameof(AudienceProfileExtensions));
|
||||||
|
|
||||||
|
public static string Name(this AudienceProfile profile) => profile switch
|
||||||
|
{
|
||||||
|
AudienceProfile.UNSPECIFIED => TB("Unspecified audience profile"),
|
||||||
|
AudienceProfile.STUDENTS => TB("Students"),
|
||||||
|
AudienceProfile.SCIENTISTS => TB("Scientists"),
|
||||||
|
AudienceProfile.LAWYERS => TB("Lawyers"),
|
||||||
|
AudienceProfile.INVESTORS => TB("Investors"),
|
||||||
|
AudienceProfile.ENGINEERS => TB("Engineers"),
|
||||||
|
AudienceProfile.SOFTWARE_DEVELOPERS => TB("Software developers"),
|
||||||
|
AudienceProfile.JOURNALISTS => TB("Journalists"),
|
||||||
|
AudienceProfile.HEALTHCARE_PROFESSIONALS => TB("Healthcare professionals"),
|
||||||
|
AudienceProfile.PUBLIC_OFFICIALS => TB("Public officials"),
|
||||||
|
AudienceProfile.BUSINESS_PROFESSIONALS => TB("Business professionals"),
|
||||||
|
|
||||||
|
_ => TB("Unspecified audience profile"),
|
||||||
|
};
|
||||||
|
|
||||||
|
public static string Prompt(this AudienceProfile profile) => profile switch
|
||||||
|
{
|
||||||
|
AudienceProfile.UNSPECIFIED => "Do not tailor the text to a specific audience profile.",
|
||||||
|
AudienceProfile.STUDENTS => "Write for students. Keep it structured, easy to study, and focused on key takeaways.",
|
||||||
|
AudienceProfile.SCIENTISTS => "Use precise, technical language. Structure the content logically and focus on methods, evidence, and results.",
|
||||||
|
AudienceProfile.LAWYERS => "Write with precise wording. Emphasize definitions, implications, compliance, and risks.",
|
||||||
|
AudienceProfile.INVESTORS => "Focus on market potential, business model, differentiation, traction, risks, and financial upside.",
|
||||||
|
AudienceProfile.ENGINEERS => "Be technically precise and practical. Focus on systems, constraints, implementation, and tradeoffs.",
|
||||||
|
AudienceProfile.SOFTWARE_DEVELOPERS => "Use concise technical language. Focus on architecture, implementation details, tradeoffs, and maintainability.",
|
||||||
|
AudienceProfile.JOURNALISTS => "Be clear, factual, and concise. Highlight the most newsworthy points and explain relevance plainly.",
|
||||||
|
AudienceProfile.HEALTHCARE_PROFESSIONALS => "Use accurate professional language. Emphasize outcomes, safety, evidence, and practical implications.",
|
||||||
|
AudienceProfile.PUBLIC_OFFICIALS => "Focus on public impact, feasibility, budget, compliance, risks, and implementation in a neutral institutional tone.",
|
||||||
|
AudienceProfile.BUSINESS_PROFESSIONALS => "Be clear, practical, and concise. Focus on business relevance, decisions, and next steps.",
|
||||||
|
|
||||||
|
_ => "Do not tailor the text to a specific audience profile.",
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
@attribute [Route(Routes.ASSISTANT_SLIDE_BUILDER)]
|
||||||
|
@inherits AssistantBaseCore<AIStudio.Dialogs.Settings.SettingsDialogSlideBuilder>
|
||||||
|
|
||||||
|
<MudText Typo="Typo.h5" Class="mb-1 mt-3"> @T("Content to derive slide from")</MudText>
|
||||||
|
<MudJustifiedText Typo="Typo.body1" Class="mb-2">
|
||||||
|
@T("You can enter text, use one or more documents or images, or use both. At least one of these options is required.")
|
||||||
|
</MudJustifiedText>
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputContent" Validation="@this.ValidatingContext" Adornment="Adornment.Start" Lines="6" MaxLines="12" AutoGrow="@false" Label="@T("Text content")" Variant="Variant.Outlined" Class="mb-3" UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
||||||
|
|
||||||
|
<MudText Typo="Typo.h6" Class="mb-1 mt-1"> @T("Attach documents")</MudText>
|
||||||
|
<AttachDocuments Name="Documents for input" Layer="@DropLayers.ASSISTANTS" @bind-DocumentPaths="@this.loadedDocumentPaths" OnChange="@this.OnDocumentsChanged" CatchAllDocuments="true" UseSmallForm="false" Provider="@this.providerSettings"/>
|
||||||
|
|
||||||
|
<MudText Typo="Typo.h5" Class="mb-3 mt-6"> @T("Details about the desired presentation")</MudText>
|
||||||
|
|
||||||
|
<MudText Typo="Typo.h6" Class="mb-1"> @T("Title")</MudText>
|
||||||
|
<MudJustifiedText Typo="Typo.body1" Class="mb-2">
|
||||||
|
@T("Please enter a title for the presentation. This will help the LLM to select more relevant content.")
|
||||||
|
</MudJustifiedText>
|
||||||
|
<MudTextField T="string" @bind-Text="@this.inputTitle" Validation="@this.ValidatingTitle" Adornment="Adornment.Start" Label="@T("Presentation title")" Variant="Variant.Outlined" Class="mb-1" UserAttributes="@USER_INPUT_ATTRIBUTES"/>
|
||||||
|
|
||||||
|
<MudText Typo="Typo.h6" Class="mb-1 mt-3"> @T("Important Aspects")</MudText>
|
||||||
|
<MudJustifiedText Typo="Typo.body1" Class="mb-2">
|
||||||
|
@T("You might want to specify important aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted.")
|
||||||
|
</MudJustifiedText>
|
||||||
|
<MudTextField T="string" AutoGrow="true" Lines="3" @bind-Text="@this.importantAspects" class="mb-1" Label="@T("(Optional) Important Aspects")" HelperText="@T("(Optional) Specify aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted.")" ShrinkLabel="true" Variant="Variant.Outlined" AdornmentIcon="@Icons.Material.Filled.List" Adornment="Adornment.Start"/>
|
||||||
|
|
||||||
|
<MudText Typo="Typo.h6" Class="mb-1 mt-3"> @T("Extent of the planned presentation")</MudText>
|
||||||
|
<MudJustifiedText Typo="Typo.body1" Class="mb-2">
|
||||||
|
@T("Please specify the extent of the planned presentation. This can be the number of slides, the number of bullet points per slide, or the time specification for the presentation. This will help the LLM to create a presentation that fits your needs. Leave the default values if you don't have specific requirements regarding the extent of the presentation. You might only want to specify one of these parameters, for example the time specification, and leave the others at their default values.")
|
||||||
|
</MudJustifiedText>
|
||||||
|
<MudGrid>
|
||||||
|
<MudItem xs="4">
|
||||||
|
<MudNumericField @bind-Value="@this.numberOfSheets"
|
||||||
|
Label="@T("Number of slides")"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
Class="mb-3"
|
||||||
|
Min="0" />
|
||||||
|
</MudItem>
|
||||||
|
|
||||||
|
<MudItem xs="4">
|
||||||
|
<MudNumericField @bind-Value="@this.numberOfBulletPoints"
|
||||||
|
Label="@T("Number of bullet points")"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
Min="0"
|
||||||
|
Max="7"
|
||||||
|
Class="mb-3" />
|
||||||
|
</MudItem>
|
||||||
|
|
||||||
|
<MudItem xs="4">
|
||||||
|
<MudNumericField @bind-Value="@this.timeSpecification"
|
||||||
|
Label="@T("Time specification (minutes)")"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
Class="mb-3"
|
||||||
|
Min="0" />
|
||||||
|
</MudItem>
|
||||||
|
</MudGrid>
|
||||||
|
|
||||||
|
<MudText Typo="Typo.h6" Class="mb-1 mt-3"> @T("Language")</MudText>
|
||||||
|
<EnumSelection T="CommonLanguages" NameFunc="@(language => language.Name())" @bind-Value="@this.selectedTargetLanguage" Icon="@Icons.Material.Filled.Translate" Label="@T("Target language")" AllowOther="@true" @bind-OtherInput="@this.customTargetLanguage" OtherValue="CommonLanguages.OTHER" LabelOther="@T("Custom target language")" ValidateOther="@this.ValidateCustomLanguage" />
|
||||||
|
|
||||||
|
<MudText Typo="Typo.h6" Class="mb-1 mt-3"> @T("Audience")</MudText>
|
||||||
|
<MudJustifiedText Typo="Typo.body1" Class="mb-2">
|
||||||
|
@T("Please specify the audience for the planned presentation. This will help the LLM to create a presentation that fits your needs. You can specify the audience profile, the age group, organizational level, and the expertise. You don't have to specify all of these parameters, for example you might only want to specify the audience profile and leave the other parameters at their default values.")
|
||||||
|
</MudJustifiedText>
|
||||||
|
<EnumSelection T="AudienceProfile" NameFunc="@(profile => profile.Name())" @bind-Value="@this.selectedAudienceProfile" Icon="@Icons.Material.Filled.Groups" Label="@T("Audience profile")" />
|
||||||
|
<EnumSelection T="AudienceAgeGroup" NameFunc="@(ageGroup => ageGroup.Name())" @bind-Value="@this.selectedAudienceAgeGroup" Icon="@Icons.Material.Filled.Cake" Label="@T("Audience age group")" />
|
||||||
|
<EnumSelection T="AudienceOrganizationalLevel" NameFunc="@(level => level.Name())" @bind-Value="@this.selectedAudienceOrganizationalLevel" Icon="@Icons.Material.Filled.AccountTree" Label="@T("Audience organizational level")" />
|
||||||
|
<EnumSelection T="AudienceExpertise" NameFunc="@(expertise => expertise.Name())" @bind-Value="@this.selectedAudienceExpertise" Icon="@Icons.Material.Filled.School" Label="@T("Audience expertise")" />
|
||||||
|
<ProviderSelection @bind-ProviderSettings="@this.providerSettings" ValidateProvider="@this.ValidatingProvider"/>
|
||||||
@ -0,0 +1,408 @@
|
|||||||
|
using System.Text;
|
||||||
|
using AIStudio.Chat;
|
||||||
|
using AIStudio.Dialogs.Settings;
|
||||||
|
|
||||||
|
namespace AIStudio.Assistants.SlideBuilder;
|
||||||
|
|
||||||
|
public partial class SlideAssistant : AssistantBaseCore<SettingsDialogSlideBuilder>
|
||||||
|
{
|
||||||
|
protected override Tools.Components Component => Tools.Components.SLIDE_BUILDER_ASSISTANT;
|
||||||
|
|
||||||
|
protected override string Title => T("Slide Assistant");
|
||||||
|
|
||||||
|
protected override string Description => T("This assistant helps you create clear, structured slides from long texts or documents. Enter a presentation title and provide the content either as text or with one or more documents. Important aspects allow you to add instructions to the LLM regarding output or formatting. Set the number of slides either directly or based on your desired presentation duration. You can also specify the number of bullet points. If the default value of 0 is not changed, the LLM will independently determine how many slides or bullet points to generate. The output can be flexibly generated in various languages and tailored to a specific audience.");
|
||||||
|
|
||||||
|
protected override string SystemPrompt =>
|
||||||
|
$$$"""
|
||||||
|
You are a professional presentation editor and writer.
|
||||||
|
Create a clear, single-slide outline from the user's inputs.
|
||||||
|
|
||||||
|
# Presentation title:
|
||||||
|
- IGNORE the language of the PRESENTATION_TITLE.
|
||||||
|
- Translate PRESENTATION_TITLE in: {{{this.selectedTargetLanguage.PromptGeneralPurpose(this.customTargetLanguage)}}}
|
||||||
|
|
||||||
|
# Content
|
||||||
|
- You get the following inputs: PRESENTATION_TITLE, PRESENTATION_CONTENT, and any attached documents that may provide additional context or source material (DOCUMENTS).
|
||||||
|
|
||||||
|
{{{this.GetDocumentTaskDescription()}}}
|
||||||
|
{{{this.PromptImportantAspects()}}}
|
||||||
|
|
||||||
|
# Subheadings
|
||||||
|
- Rule for creating the individual subheadings:
|
||||||
|
- If {{{this.numberOfSheets}}} is NOT 0
|
||||||
|
- Generate exactly {{{this.numberOfSheets}}} precise subheadings, each heading represents one slide in a presentation.
|
||||||
|
- If {{{this.timeSpecification}}} is NOT 0
|
||||||
|
- Generate exactly {{{this.calculatedNumberOfSlides}}} precise subheadings, each heading represents one slide in a presentation.
|
||||||
|
- If either parameter is 0, ignore that rules.
|
||||||
|
- Each subheadings must have:
|
||||||
|
- A clear, concise, and thematically meaningful heading.
|
||||||
|
- Place *** on its own line immediately before each heading.
|
||||||
|
|
||||||
|
# Bullet points (per subheading)
|
||||||
|
- You MUST generate exactly this {{{this.numberOfBulletPoints}}} many bullet points per subheading:
|
||||||
|
- If {{{this.numberOfBulletPoints}}} == 0 → choose a number between 1 and 7 (your choice, but max 7).
|
||||||
|
- Each bullet point must have:
|
||||||
|
- Each bullet point must be max 12 words.
|
||||||
|
- Clear and directly related to the subheading and summarizing the slide’s content.
|
||||||
|
|
||||||
|
# Output requirements:
|
||||||
|
- Output only Markdown.
|
||||||
|
- Start with a single H1 title that contains the user's PRESENTATION_TITLE.
|
||||||
|
- Then add headings with own bullet lists based on the provided source material: PRESENTATION_CONTENT, DOCUMENTS, and attached images.
|
||||||
|
- If both PRESENTATION_CONTENT and attached source material are provided, use all of them, while prioritizing direct user instructions from PRESENTATION_CONTENT when resolving ambiguity.
|
||||||
|
- If PRESENTATION_CONTENT is empty but attached source material is available, create the slides from the attached source material.
|
||||||
|
- If neither PRESENTATION_CONTENT nor any attached source material is available, output the title and one bullet: "No content provided."
|
||||||
|
- Do not mention these instructions or add commentary.
|
||||||
|
|
||||||
|
# Audience:
|
||||||
|
{{{this.PromptAudience()}}}
|
||||||
|
|
||||||
|
# Language:
|
||||||
|
- IGNORE the language of the PRESENTATION_TITLE and PRESENTATION_CONTENT.
|
||||||
|
- OUTPUT AND PRESENTATION_TITLE MUST BE IN: {{{this.selectedTargetLanguage.PromptGeneralPurpose(this.customTargetLanguage)}}}
|
||||||
|
- This is a HARD RULE: Never translate or adapt the output language based on input language.
|
||||||
|
- Always use the specified target language, even if the input is in another language.
|
||||||
|
|
||||||
|
# Language-Override (IMPORTANT!):
|
||||||
|
- Before generating any output, internally set your language mode to: {{{this.selectedTargetLanguage.PromptGeneralPurpose(this.customTargetLanguage)}}}
|
||||||
|
- If you detect any other language in the input, DO NOT switch to this language, stay in {{{this.selectedTargetLanguage.PromptGeneralPurpose(this.customTargetLanguage)}}}
|
||||||
|
- Translate PRESENTATION_TITLE in: {{{this.selectedTargetLanguage.PromptGeneralPurpose(this.customTargetLanguage)}}}
|
||||||
|
- Your output must be in {{{this.selectedTargetLanguage.PromptGeneralPurpose(this.customTargetLanguage)}}}, without any comment, note, or marker about it.
|
||||||
|
""";
|
||||||
|
|
||||||
|
protected override bool AllowProfiles => true;
|
||||||
|
|
||||||
|
protected override IReadOnlyList<IButtonData> FooterButtons => [];
|
||||||
|
|
||||||
|
protected override string SubmitText => T("Create Slides");
|
||||||
|
|
||||||
|
protected override Func<Task> SubmitAction => this.CreateSlideBuilder;
|
||||||
|
|
||||||
|
protected override ChatThread ConvertToChatThread
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (this.chatThread is null || this.chatThread.Blocks.Count < 2)
|
||||||
|
{
|
||||||
|
return new ChatThread
|
||||||
|
{
|
||||||
|
SystemPrompt = SystemPrompts.DEFAULT
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ChatThread
|
||||||
|
{
|
||||||
|
ChatId = Guid.NewGuid(),
|
||||||
|
Name = string.Format(T("{0} - Slide Builder Session"), this.inputTitle),
|
||||||
|
SystemPrompt = SystemPrompts.DEFAULT,
|
||||||
|
Blocks =
|
||||||
|
[
|
||||||
|
// Visible user block:
|
||||||
|
new ContentBlock
|
||||||
|
{
|
||||||
|
Time = this.chatThread.Blocks.First().Time,
|
||||||
|
Role = ChatRole.USER,
|
||||||
|
HideFromUser = false,
|
||||||
|
ContentType = ContentType.TEXT,
|
||||||
|
Content = new ContentText
|
||||||
|
{
|
||||||
|
Text = this.T("The result of your previous slide builder session."),
|
||||||
|
FileAttachments = this.loadedDocumentPaths.ToList(),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Hidden user block with inputContent data:
|
||||||
|
new ContentBlock
|
||||||
|
{
|
||||||
|
Time = this.chatThread.Blocks.First().Time,
|
||||||
|
Role = ChatRole.USER,
|
||||||
|
HideFromUser = true,
|
||||||
|
ContentType = ContentType.TEXT,
|
||||||
|
Content = new ContentText
|
||||||
|
{
|
||||||
|
Text = string.IsNullOrWhiteSpace(this.inputContent)
|
||||||
|
? $"""
|
||||||
|
# PRESENTATION_TITLE
|
||||||
|
```
|
||||||
|
{this.inputTitle}
|
||||||
|
```
|
||||||
|
"""
|
||||||
|
|
||||||
|
: $"""
|
||||||
|
# PRESENTATION_TITLE
|
||||||
|
```
|
||||||
|
{this.inputTitle}
|
||||||
|
```
|
||||||
|
|
||||||
|
# PRESENTATION_CONTENT
|
||||||
|
```
|
||||||
|
{this.inputContent}
|
||||||
|
```
|
||||||
|
""",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// Then, append the last block of the current chat thread
|
||||||
|
// (which is expected to be the AI response):
|
||||||
|
this.chatThread.Blocks.Last(),
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void ResetForm()
|
||||||
|
{
|
||||||
|
this.inputTitle = string.Empty;
|
||||||
|
this.inputContent = string.Empty;
|
||||||
|
this.loadedDocumentPaths.Clear();
|
||||||
|
this.selectedAudienceProfile = AudienceProfile.UNSPECIFIED;
|
||||||
|
this.selectedAudienceAgeGroup = AudienceAgeGroup.UNSPECIFIED;
|
||||||
|
this.selectedAudienceOrganizationalLevel = AudienceOrganizationalLevel.UNSPECIFIED;
|
||||||
|
this.selectedAudienceExpertise = AudienceExpertise.UNSPECIFIED;
|
||||||
|
if (!this.MightPreselectValues())
|
||||||
|
{
|
||||||
|
this.selectedTargetLanguage = CommonLanguages.AS_IS;
|
||||||
|
this.customTargetLanguage = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool MightPreselectValues()
|
||||||
|
{
|
||||||
|
if (this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)
|
||||||
|
{
|
||||||
|
this.selectedTargetLanguage = this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedTargetLanguage;
|
||||||
|
this.customTargetLanguage = this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedOtherLanguage;
|
||||||
|
this.selectedAudienceProfile = this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceProfile;
|
||||||
|
this.selectedAudienceAgeGroup = this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceAgeGroup;
|
||||||
|
this.selectedAudienceOrganizationalLevel = this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceOrganizationalLevel;
|
||||||
|
this.selectedAudienceExpertise = this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceExpertise;
|
||||||
|
this.importantAspects = this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedImportantAspects;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string inputTitle = string.Empty;
|
||||||
|
private string inputContent = string.Empty;
|
||||||
|
private string customTargetLanguage = string.Empty;
|
||||||
|
private AudienceProfile selectedAudienceProfile;
|
||||||
|
private AudienceAgeGroup selectedAudienceAgeGroup;
|
||||||
|
private AudienceOrganizationalLevel selectedAudienceOrganizationalLevel;
|
||||||
|
private AudienceExpertise selectedAudienceExpertise;
|
||||||
|
private CommonLanguages selectedTargetLanguage;
|
||||||
|
private int numberOfSheets;
|
||||||
|
private int numberOfBulletPoints;
|
||||||
|
private int timeSpecification;
|
||||||
|
private int calculatedNumberOfSlides;
|
||||||
|
private string importantAspects = string.Empty;
|
||||||
|
private HashSet<FileAttachment> loadedDocumentPaths = [];
|
||||||
|
|
||||||
|
#region Overrides of ComponentBase
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
var deferredContent = MessageBus.INSTANCE.CheckDeferredMessages<string>(Event.SEND_TO_SLIDE_BUILDER_ASSISTANT).FirstOrDefault();
|
||||||
|
if (deferredContent is not null)
|
||||||
|
this.inputContent = deferredContent;
|
||||||
|
|
||||||
|
await base.OnInitializedAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private string? ValidatingTitle(string text)
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(text))
|
||||||
|
return T("Please provide a title");
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
private string? ValidatingContext(string text)
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(text) && !this.HasValidInputDocuments())
|
||||||
|
return T("Please provide a text or at least one valid document or image.");
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool HasValidInputDocuments() => this.loadedDocumentPaths.Any(n => n is { Exists: true });
|
||||||
|
|
||||||
|
private async Task OnDocumentsChanged(HashSet<FileAttachment> _)
|
||||||
|
{
|
||||||
|
if(this.form is not null)
|
||||||
|
await this.form.Validate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private string? ValidateCustomLanguage(string language)
|
||||||
|
{
|
||||||
|
if(this.selectedTargetLanguage == CommonLanguages.OTHER && string.IsNullOrWhiteSpace(language))
|
||||||
|
return T("Please provide a custom language.");
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int CalculateNumberOfSlides()
|
||||||
|
{
|
||||||
|
return this.calculatedNumberOfSlides = (int)Math.Round(this.timeSpecification / 1.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string PromptImportantAspects()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(this.importantAspects))
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
return $"""
|
||||||
|
|
||||||
|
# Important aspects
|
||||||
|
Emphasize the following aspects in your presentation:
|
||||||
|
{this.importantAspects}
|
||||||
|
""";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string PromptAudience()
|
||||||
|
{
|
||||||
|
var prompts = new List<string>();
|
||||||
|
|
||||||
|
if (this.selectedAudienceProfile is not AudienceProfile.UNSPECIFIED)
|
||||||
|
prompts.Add(this.selectedAudienceProfile.Prompt());
|
||||||
|
|
||||||
|
if (this.selectedAudienceAgeGroup is not AudienceAgeGroup.UNSPECIFIED)
|
||||||
|
prompts.Add(this.selectedAudienceAgeGroup.Prompt());
|
||||||
|
|
||||||
|
if (this.selectedAudienceOrganizationalLevel is not AudienceOrganizationalLevel.UNSPECIFIED)
|
||||||
|
prompts.Add(this.selectedAudienceOrganizationalLevel.Prompt());
|
||||||
|
|
||||||
|
if (this.selectedAudienceExpertise is not AudienceExpertise.UNSPECIFIED)
|
||||||
|
prompts.Add(this.selectedAudienceExpertise.Prompt());
|
||||||
|
|
||||||
|
if (prompts.Count == 0)
|
||||||
|
return " - Do not tailor the text to a specific audience.";
|
||||||
|
|
||||||
|
return string.Join(Environment.NewLine, prompts.Select(prompt => $" - {prompt}"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetDocumentTaskDescription()
|
||||||
|
{
|
||||||
|
var numDocuments = this.loadedDocumentPaths.Count(x => x is { Exists: true, IsImage: false });
|
||||||
|
var numImages = this.loadedDocumentPaths.Count(x => x is { Exists: true, IsImage: true });
|
||||||
|
|
||||||
|
return (numDocuments, numImages) switch
|
||||||
|
{
|
||||||
|
(0, 1) => "Your task is to analyze a single image file attached as a document.",
|
||||||
|
(0, > 1) => $"Your task is to analyze {numImages} image file(s) attached as documents.",
|
||||||
|
|
||||||
|
(1, 0) => "Your task is to analyze a single DOCUMENT.",
|
||||||
|
(1, 1) => "Your task is to analyze a single DOCUMENT and 1 image file attached as a document.",
|
||||||
|
(1, > 1) => $"Your task is to analyze a single DOCUMENT and {numImages} image file(s) attached as documents.",
|
||||||
|
|
||||||
|
(> 0, 0) => $"Your task is to analyze {numDocuments} DOCUMENTS. Different DOCUMENTS are divided by a horizontal rule in markdown formatting followed by the name of the document.",
|
||||||
|
(> 0, 1) => $"Your task is to analyze {numDocuments} DOCUMENTS and 1 image file attached as a document. Different DOCUMENTS are divided by a horizontal rule in Markdown formatting followed by the name of the document.",
|
||||||
|
(> 0, > 0) => $"Your task is to analyze {numDocuments} DOCUMENTS and {numImages} image file(s) attached as documents. Different DOCUMENTS are divided by a horizontal rule in Markdown formatting followed by the name of the document.",
|
||||||
|
|
||||||
|
_ => "Your task is to analyze a single DOCUMENT."
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<string> PromptLoadDocumentsContent()
|
||||||
|
{
|
||||||
|
if (this.loadedDocumentPaths.Count == 0)
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
var documents = this.loadedDocumentPaths.Where(n => n is { Exists: true, IsImage: false }).ToList();
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
|
||||||
|
if (documents.Count > 0)
|
||||||
|
{
|
||||||
|
sb.AppendLine("""
|
||||||
|
# DOCUMENTS:
|
||||||
|
|
||||||
|
""");
|
||||||
|
}
|
||||||
|
|
||||||
|
var numDocuments = 1;
|
||||||
|
foreach (var document in documents)
|
||||||
|
{
|
||||||
|
if (document.IsForbidden)
|
||||||
|
{
|
||||||
|
this.Logger.LogWarning($"Skipping forbidden file: '{document.FilePath}'.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var fileContent = await this.RustService.ReadArbitraryFileData(document.FilePath, int.MaxValue);
|
||||||
|
sb.AppendLine($"""
|
||||||
|
|
||||||
|
## DOCUMENT {numDocuments}:
|
||||||
|
File path: {document.FilePath}
|
||||||
|
Content:
|
||||||
|
```
|
||||||
|
{fileContent}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
""");
|
||||||
|
numDocuments++;
|
||||||
|
}
|
||||||
|
|
||||||
|
var numImages = this.loadedDocumentPaths.Count(x => x is { IsImage: true, Exists: true });
|
||||||
|
if (numImages > 0)
|
||||||
|
{
|
||||||
|
if (documents.Count == 0)
|
||||||
|
{
|
||||||
|
sb.AppendLine($"""
|
||||||
|
|
||||||
|
There are {numImages} image file(s) attached as documents.
|
||||||
|
Please consider them as documents as well and use them to
|
||||||
|
answer accordingly.
|
||||||
|
|
||||||
|
""");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb.AppendLine($"""
|
||||||
|
|
||||||
|
Additionally, there are {numImages} image file(s) attached.
|
||||||
|
Please consider them as documents as well and use them to
|
||||||
|
answer accordingly.
|
||||||
|
|
||||||
|
""");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task CreateSlideBuilder()
|
||||||
|
{
|
||||||
|
await this.form!.Validate();
|
||||||
|
if (!this.inputIsValid)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.calculatedNumberOfSlides = this.timeSpecification > 0 ? this.CalculateNumberOfSlides() : 0;
|
||||||
|
|
||||||
|
this.CreateChatThread();
|
||||||
|
var documentContent = await this.PromptLoadDocumentsContent();
|
||||||
|
var imageAttachments = this.loadedDocumentPaths.Where(n => n is { Exists: true, IsImage: true }).ToList();
|
||||||
|
|
||||||
|
var time = this.AddUserRequest(
|
||||||
|
$"""
|
||||||
|
# PRESENTATION_TITLE
|
||||||
|
```
|
||||||
|
{this.inputTitle}
|
||||||
|
```
|
||||||
|
|
||||||
|
# PRESENTATION_CONTENT
|
||||||
|
|
||||||
|
```
|
||||||
|
{this.inputContent}
|
||||||
|
```
|
||||||
|
|
||||||
|
{documentContent}
|
||||||
|
""",
|
||||||
|
hideContentFromUser: true,
|
||||||
|
imageAttachments);
|
||||||
|
|
||||||
|
await this.AddAIResponseAsync(time);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -138,7 +138,8 @@ public partial class AssistantTextSummarizer : AssistantBaseCore<SettingsDialogT
|
|||||||
```
|
```
|
||||||
{this.inputText}
|
{this.inputText}
|
||||||
```
|
```
|
||||||
""");
|
""",
|
||||||
|
hideContentFromUser: true);
|
||||||
|
|
||||||
await this.AddAIResponseAsync(time);
|
await this.AddAIResponseAsync(time);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -96,11 +96,25 @@
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<MudMarkdown Value="@textContent.Text.RemoveThinkTags().Trim()" Props="Markdown.DefaultConfig" Styling="@this.MarkdownStyling" />
|
var renderPlan = this.GetMarkdownRenderPlan(textContent.Text);
|
||||||
@if (textContent.Sources.Count > 0)
|
<div @ref="this.mathContentContainer" class="chat-math-container">
|
||||||
{
|
@foreach (var segment in renderPlan.Segments)
|
||||||
<MudMarkdown Value="@textContent.Sources.ToMarkdown()" Props="Markdown.DefaultConfig" Styling="@this.MarkdownStyling" />
|
{
|
||||||
}
|
var segmentContent = segment.GetContent(renderPlan.Source);
|
||||||
|
if (segment.Type is MarkdownRenderSegmentType.MARKDOWN)
|
||||||
|
{
|
||||||
|
<MudMarkdown @key="@segment.RenderKey" Value="@segmentContent" Props="Markdown.DefaultConfig" Styling="@this.MarkdownStyling" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE" />
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MathJaxBlock @key="@segment.RenderKey" Value="@segmentContent" Class="mb-5" />
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@if (textContent.Sources.Count > 0)
|
||||||
|
{
|
||||||
|
<MudMarkdown Value="@textContent.Sources.ToMarkdown()" Props="Markdown.DefaultConfig" Styling="@this.MarkdownStyling" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE" />
|
||||||
|
}
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -135,4 +149,4 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
|
|||||||
@ -8,8 +8,32 @@ namespace AIStudio.Chat;
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The UI component for a chat content block, i.e., for any IContent.
|
/// The UI component for a chat content block, i.e., for any IContent.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class ContentBlockComponent : MSGComponentBase
|
public partial class ContentBlockComponent : MSGComponentBase, IAsyncDisposable
|
||||||
{
|
{
|
||||||
|
private const string CHAT_MATH_SYNC_FUNCTION = "chatMath.syncContainer";
|
||||||
|
private const string CHAT_MATH_DISPOSE_FUNCTION = "chatMath.disposeContainer";
|
||||||
|
private const string HTML_START_TAG = "<";
|
||||||
|
private const string HTML_END_TAG = "</";
|
||||||
|
private const string HTML_SELF_CLOSING_TAG = "/>";
|
||||||
|
private const string CODE_FENCE_MARKER_BACKTICK = "```";
|
||||||
|
private const string CODE_FENCE_MARKER_TILDE = "~~~";
|
||||||
|
private const string MATH_BLOCK_MARKER_DOLLAR = "$$";
|
||||||
|
private const string MATH_BLOCK_MARKER_BRACKET_OPEN = """\[""";
|
||||||
|
private const string MATH_BLOCK_MARKER_BRACKET_CLOSE = """\]""";
|
||||||
|
private const string HTML_CODE_FENCE_PREFIX = "```html";
|
||||||
|
|
||||||
|
private static readonly string[] HTML_TAG_MARKERS =
|
||||||
|
[
|
||||||
|
"<!doctype",
|
||||||
|
"<html",
|
||||||
|
"<head",
|
||||||
|
"<body",
|
||||||
|
"<style",
|
||||||
|
"<script",
|
||||||
|
"<iframe",
|
||||||
|
"<svg",
|
||||||
|
];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The role of the chat content block.
|
/// The role of the chat content block.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -67,19 +91,53 @@ public partial class ContentBlockComponent : MSGComponentBase
|
|||||||
[Inject]
|
[Inject]
|
||||||
private RustService RustService { get; init; } = null!;
|
private RustService RustService { get; init; } = null!;
|
||||||
|
|
||||||
|
[Inject]
|
||||||
|
private IJSRuntime JsRuntime { get; init; } = null!;
|
||||||
|
|
||||||
private bool HideContent { get; set; }
|
private bool HideContent { get; set; }
|
||||||
|
private bool hasRenderHash;
|
||||||
|
private int lastRenderHash;
|
||||||
|
private string cachedMarkdownRenderPlanInput = string.Empty;
|
||||||
|
private MarkdownRenderPlan cachedMarkdownRenderPlan = MarkdownRenderPlan.EMPTY;
|
||||||
|
private ElementReference mathContentContainer;
|
||||||
|
private string lastMathRenderSignature = string.Empty;
|
||||||
|
private bool hasActiveMathContainer;
|
||||||
|
private bool isDisposed;
|
||||||
|
|
||||||
#region Overrides of ComponentBase
|
#region Overrides of ComponentBase
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
// Register the streaming events:
|
this.RegisterStreamingEvents();
|
||||||
this.Content.StreamingDone = this.AfterStreaming;
|
|
||||||
this.Content.StreamingEvent = () => this.InvokeAsync(this.StateHasChanged);
|
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override Task OnParametersSetAsync()
|
||||||
|
{
|
||||||
|
this.RegisterStreamingEvents();
|
||||||
|
return base.OnParametersSetAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||||
|
{
|
||||||
|
await this.SyncMathRenderIfNeededAsync();
|
||||||
|
await base.OnAfterRenderAsync(firstRender);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override bool ShouldRender()
|
||||||
|
{
|
||||||
|
var currentRenderHash = this.CreateRenderHash();
|
||||||
|
if (!this.hasRenderHash || currentRenderHash != this.lastRenderHash)
|
||||||
|
{
|
||||||
|
this.lastRenderHash = currentRenderHash;
|
||||||
|
this.hasRenderHash = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets called when the content stream ended.
|
/// Gets called when the content stream ended.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -111,6 +169,47 @@ public partial class ContentBlockComponent : MSGComponentBase
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void RegisterStreamingEvents()
|
||||||
|
{
|
||||||
|
this.Content.StreamingDone = this.AfterStreaming;
|
||||||
|
this.Content.StreamingEvent = () => this.InvokeAsync(this.StateHasChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int CreateRenderHash()
|
||||||
|
{
|
||||||
|
var hash = new HashCode();
|
||||||
|
hash.Add(this.Role);
|
||||||
|
hash.Add(this.Type);
|
||||||
|
hash.Add(this.Time);
|
||||||
|
hash.Add(this.Class);
|
||||||
|
hash.Add(this.IsLastContentBlock);
|
||||||
|
hash.Add(this.IsSecondToLastBlock);
|
||||||
|
hash.Add(this.HideContent);
|
||||||
|
hash.Add(this.SettingsManager.IsDarkMode);
|
||||||
|
hash.Add(this.RegenerateEnabled());
|
||||||
|
hash.Add(this.Content.InitialRemoteWait);
|
||||||
|
hash.Add(this.Content.IsStreaming);
|
||||||
|
hash.Add(this.Content.FileAttachments.Count);
|
||||||
|
hash.Add(this.Content.Sources.Count);
|
||||||
|
|
||||||
|
switch (this.Content)
|
||||||
|
{
|
||||||
|
case ContentText text:
|
||||||
|
var textValue = text.Text;
|
||||||
|
hash.Add(textValue.Length);
|
||||||
|
hash.Add(textValue.GetHashCode(StringComparison.Ordinal));
|
||||||
|
hash.Add(text.Sources.Count);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ContentImage image:
|
||||||
|
hash.Add(image.SourceType);
|
||||||
|
hash.Add(image.Source);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hash.ToHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private string CardClasses => $"my-2 rounded-lg {this.Class}";
|
private string CardClasses => $"my-2 rounded-lg {this.Class}";
|
||||||
@ -121,6 +220,322 @@ public partial class ContentBlockComponent : MSGComponentBase
|
|||||||
{
|
{
|
||||||
CodeBlock = { Theme = this.CodeColorPalette },
|
CodeBlock = { Theme = this.CodeColorPalette },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private MarkdownRenderPlan GetMarkdownRenderPlan(string text)
|
||||||
|
{
|
||||||
|
if (ReferenceEquals(this.cachedMarkdownRenderPlanInput, text) || string.Equals(this.cachedMarkdownRenderPlanInput, text, StringComparison.Ordinal))
|
||||||
|
return this.cachedMarkdownRenderPlan;
|
||||||
|
|
||||||
|
this.cachedMarkdownRenderPlanInput = text;
|
||||||
|
this.cachedMarkdownRenderPlan = BuildMarkdownRenderPlan(text);
|
||||||
|
return this.cachedMarkdownRenderPlan;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SyncMathRenderIfNeededAsync()
|
||||||
|
{
|
||||||
|
if (this.isDisposed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!this.TryGetCompletedMathRenderState(out var mathRenderSignature))
|
||||||
|
{
|
||||||
|
await this.DisposeMathContainerIfNeededAsync();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.Equals(this.lastMathRenderSignature, mathRenderSignature, StringComparison.Ordinal))
|
||||||
|
return;
|
||||||
|
|
||||||
|
await this.JsRuntime.InvokeVoidAsync(CHAT_MATH_SYNC_FUNCTION, this.mathContentContainer, mathRenderSignature);
|
||||||
|
this.lastMathRenderSignature = mathRenderSignature;
|
||||||
|
this.hasActiveMathContainer = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task DisposeMathContainerIfNeededAsync()
|
||||||
|
{
|
||||||
|
if (!this.hasActiveMathContainer)
|
||||||
|
{
|
||||||
|
this.lastMathRenderSignature = string.Empty;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await this.JsRuntime.InvokeVoidAsync(CHAT_MATH_DISPOSE_FUNCTION, this.mathContentContainer);
|
||||||
|
}
|
||||||
|
catch (JSDisconnectedException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
catch (ObjectDisposedException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
this.hasActiveMathContainer = false;
|
||||||
|
this.lastMathRenderSignature = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool TryGetCompletedMathRenderState(out string mathRenderSignature)
|
||||||
|
{
|
||||||
|
mathRenderSignature = string.Empty;
|
||||||
|
|
||||||
|
if (this.HideContent || this.Type is not ContentType.TEXT || this.Content.IsStreaming || this.Content is not ContentText textContent || textContent.InitialRemoteWait)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var renderPlan = this.GetMarkdownRenderPlan(textContent.Text);
|
||||||
|
mathRenderSignature = CreateMathRenderSignature(renderPlan);
|
||||||
|
return !string.IsNullOrEmpty(mathRenderSignature);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string CreateMathRenderSignature(MarkdownRenderPlan renderPlan)
|
||||||
|
{
|
||||||
|
var hash = new HashCode();
|
||||||
|
var mathSegmentCount = 0;
|
||||||
|
|
||||||
|
foreach (var segment in renderPlan.Segments)
|
||||||
|
{
|
||||||
|
if (segment.Type is not MarkdownRenderSegmentType.MATH_BLOCK)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
mathSegmentCount++;
|
||||||
|
hash.Add(segment.Start);
|
||||||
|
hash.Add(segment.Length);
|
||||||
|
hash.Add(segment.GetContent(renderPlan.Source).GetHashCode(StringComparison.Ordinal));
|
||||||
|
}
|
||||||
|
|
||||||
|
return mathSegmentCount == 0
|
||||||
|
? string.Empty
|
||||||
|
: $"{mathSegmentCount}:{hash.ToHashCode()}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MarkdownRenderPlan BuildMarkdownRenderPlan(string text)
|
||||||
|
{
|
||||||
|
var normalized = NormalizeMarkdownForRendering(text);
|
||||||
|
if (string.IsNullOrWhiteSpace(normalized))
|
||||||
|
return MarkdownRenderPlan.EMPTY;
|
||||||
|
|
||||||
|
var normalizedSpan = normalized.AsSpan();
|
||||||
|
var segments = new List<MarkdownRenderSegment>();
|
||||||
|
var activeCodeFenceMarker = '\0';
|
||||||
|
var activeMathBlockFenceType = MathBlockFenceType.NONE;
|
||||||
|
var markdownSegmentStart = 0;
|
||||||
|
var mathContentStart = 0;
|
||||||
|
|
||||||
|
for (var lineStart = 0; lineStart < normalizedSpan.Length;)
|
||||||
|
{
|
||||||
|
var lineEnd = lineStart;
|
||||||
|
while (lineEnd < normalizedSpan.Length && normalizedSpan[lineEnd] is not '\r' and not '\n')
|
||||||
|
lineEnd++;
|
||||||
|
|
||||||
|
var nextLineStart = lineEnd;
|
||||||
|
if (nextLineStart < normalizedSpan.Length)
|
||||||
|
{
|
||||||
|
if (normalizedSpan[nextLineStart] == '\r')
|
||||||
|
nextLineStart++;
|
||||||
|
|
||||||
|
if (nextLineStart < normalizedSpan.Length && normalizedSpan[nextLineStart] == '\n')
|
||||||
|
nextLineStart++;
|
||||||
|
}
|
||||||
|
|
||||||
|
var trimmedLine = TrimWhitespace(normalizedSpan[lineStart..lineEnd]);
|
||||||
|
if (activeMathBlockFenceType is MathBlockFenceType.NONE && TryUpdateCodeFenceState(trimmedLine, ref activeCodeFenceMarker))
|
||||||
|
{
|
||||||
|
lineStart = nextLineStart;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeCodeFenceMarker != '\0')
|
||||||
|
{
|
||||||
|
lineStart = nextLineStart;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeMathBlockFenceType is MathBlockFenceType.NONE)
|
||||||
|
{
|
||||||
|
if (trimmedLine.SequenceEqual(MATH_BLOCK_MARKER_DOLLAR.AsSpan()))
|
||||||
|
{
|
||||||
|
AddMarkdownSegment(markdownSegmentStart, lineStart);
|
||||||
|
mathContentStart = nextLineStart;
|
||||||
|
activeMathBlockFenceType = MathBlockFenceType.DOLLAR;
|
||||||
|
lineStart = nextLineStart;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (trimmedLine.SequenceEqual(MATH_BLOCK_MARKER_BRACKET_OPEN.AsSpan()))
|
||||||
|
{
|
||||||
|
AddMarkdownSegment(markdownSegmentStart, lineStart);
|
||||||
|
mathContentStart = nextLineStart;
|
||||||
|
activeMathBlockFenceType = MathBlockFenceType.BRACKET;
|
||||||
|
lineStart = nextLineStart;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (activeMathBlockFenceType is MathBlockFenceType.DOLLAR && trimmedLine.SequenceEqual(MATH_BLOCK_MARKER_DOLLAR.AsSpan()))
|
||||||
|
{
|
||||||
|
var (start, end) = TrimLineBreaks(normalizedSpan, mathContentStart, lineStart);
|
||||||
|
segments.Add(new(MarkdownRenderSegmentType.MATH_BLOCK, start, end - start));
|
||||||
|
|
||||||
|
markdownSegmentStart = nextLineStart;
|
||||||
|
activeMathBlockFenceType = MathBlockFenceType.NONE;
|
||||||
|
lineStart = nextLineStart;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (activeMathBlockFenceType is MathBlockFenceType.BRACKET && trimmedLine.SequenceEqual(MATH_BLOCK_MARKER_BRACKET_CLOSE.AsSpan()))
|
||||||
|
{
|
||||||
|
var (start, end) = TrimLineBreaks(normalizedSpan, mathContentStart, lineStart);
|
||||||
|
segments.Add(new(MarkdownRenderSegmentType.MATH_BLOCK, start, end - start));
|
||||||
|
|
||||||
|
markdownSegmentStart = nextLineStart;
|
||||||
|
activeMathBlockFenceType = MathBlockFenceType.NONE;
|
||||||
|
lineStart = nextLineStart;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
lineStart = nextLineStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (activeMathBlockFenceType is not MathBlockFenceType.NONE)
|
||||||
|
return new(normalized, [new(MarkdownRenderSegmentType.MARKDOWN, 0, normalized.Length)]);
|
||||||
|
|
||||||
|
AddMarkdownSegment(markdownSegmentStart, normalized.Length);
|
||||||
|
if (segments.Count == 0)
|
||||||
|
segments.Add(new(MarkdownRenderSegmentType.MARKDOWN, 0, normalized.Length));
|
||||||
|
|
||||||
|
return new(normalized, segments);
|
||||||
|
|
||||||
|
void AddMarkdownSegment(int start, int end)
|
||||||
|
{
|
||||||
|
if (end <= start)
|
||||||
|
return;
|
||||||
|
|
||||||
|
segments.Add(new(MarkdownRenderSegmentType.MARKDOWN, start, end - start));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string NormalizeMarkdownForRendering(string text)
|
||||||
|
{
|
||||||
|
var textWithoutThinkTags = text.RemoveThinkTags();
|
||||||
|
var trimmed = TrimWhitespace(textWithoutThinkTags.AsSpan());
|
||||||
|
if (trimmed.IsEmpty)
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
var cleaned = trimmed.Length == textWithoutThinkTags.Length
|
||||||
|
? textWithoutThinkTags
|
||||||
|
: trimmed.ToString();
|
||||||
|
|
||||||
|
if (cleaned.Contains(CODE_FENCE_MARKER_BACKTICK, StringComparison.Ordinal))
|
||||||
|
return cleaned;
|
||||||
|
|
||||||
|
if (LooksLikeRawHtml(cleaned))
|
||||||
|
return $"{HTML_CODE_FENCE_PREFIX}{Environment.NewLine}{cleaned}{Environment.NewLine}{CODE_FENCE_MARKER_BACKTICK}";
|
||||||
|
|
||||||
|
return cleaned;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool LooksLikeRawHtml(string text)
|
||||||
|
{
|
||||||
|
var content = text.AsSpan();
|
||||||
|
var start = 0;
|
||||||
|
while (start < content.Length && char.IsWhiteSpace(content[start]))
|
||||||
|
start++;
|
||||||
|
|
||||||
|
content = content[start..];
|
||||||
|
if (!content.StartsWith(HTML_START_TAG.AsSpan(), StringComparison.Ordinal))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
foreach (var marker in HTML_TAG_MARKERS)
|
||||||
|
if (content.IndexOf(marker.AsSpan(), StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return content.IndexOf(HTML_END_TAG.AsSpan(), StringComparison.Ordinal) >= 0
|
||||||
|
|| content.IndexOf(HTML_SELF_CLOSING_TAG.AsSpan(), StringComparison.Ordinal) >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool TryUpdateCodeFenceState(ReadOnlySpan<char> trimmedLine, ref char activeCodeFenceMarker)
|
||||||
|
{
|
||||||
|
var fenceMarker = '\0';
|
||||||
|
if (trimmedLine.StartsWith(CODE_FENCE_MARKER_BACKTICK.AsSpan(), StringComparison.Ordinal))
|
||||||
|
fenceMarker = '`';
|
||||||
|
else if (trimmedLine.StartsWith(CODE_FENCE_MARKER_TILDE.AsSpan(), StringComparison.Ordinal))
|
||||||
|
fenceMarker = '~';
|
||||||
|
|
||||||
|
if (fenceMarker == '\0')
|
||||||
|
return false;
|
||||||
|
|
||||||
|
activeCodeFenceMarker = activeCodeFenceMarker == '\0'
|
||||||
|
? fenceMarker
|
||||||
|
: activeCodeFenceMarker == fenceMarker
|
||||||
|
? '\0'
|
||||||
|
: activeCodeFenceMarker;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ReadOnlySpan<char> TrimWhitespace(ReadOnlySpan<char> text)
|
||||||
|
{
|
||||||
|
var start = 0;
|
||||||
|
var end = text.Length - 1;
|
||||||
|
|
||||||
|
while (start < text.Length && char.IsWhiteSpace(text[start]))
|
||||||
|
start++;
|
||||||
|
|
||||||
|
while (end >= start && char.IsWhiteSpace(text[end]))
|
||||||
|
end--;
|
||||||
|
|
||||||
|
return start > end ? ReadOnlySpan<char>.Empty : text[start..(end + 1)];
|
||||||
|
}
|
||||||
|
|
||||||
|
private static (int Start, int End) TrimLineBreaks(ReadOnlySpan<char> text, int start, int end)
|
||||||
|
{
|
||||||
|
while (start < end && text[start] is '\r' or '\n')
|
||||||
|
start++;
|
||||||
|
|
||||||
|
while (end > start && text[end - 1] is '\r' or '\n')
|
||||||
|
end--;
|
||||||
|
|
||||||
|
return (start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum MarkdownRenderSegmentType
|
||||||
|
{
|
||||||
|
MARKDOWN,
|
||||||
|
MATH_BLOCK,
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum MathBlockFenceType
|
||||||
|
{
|
||||||
|
NONE,
|
||||||
|
DOLLAR,
|
||||||
|
BRACKET,
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed record MarkdownRenderPlan(string Source, IReadOnlyList<MarkdownRenderSegment> Segments)
|
||||||
|
{
|
||||||
|
public static readonly MarkdownRenderPlan EMPTY = new(string.Empty, []);
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class MarkdownRenderSegment(MarkdownRenderSegmentType type, int start, int length)
|
||||||
|
{
|
||||||
|
private string? cachedContent;
|
||||||
|
|
||||||
|
public MarkdownRenderSegmentType Type { get; } = type;
|
||||||
|
|
||||||
|
public int Start { get; } = start;
|
||||||
|
|
||||||
|
public int Length { get; } = length;
|
||||||
|
|
||||||
|
public int RenderKey { get; } = HashCode.Combine(type, start, length);
|
||||||
|
|
||||||
|
public string GetContent(string source)
|
||||||
|
{
|
||||||
|
if (this.cachedContent is not null)
|
||||||
|
return this.cachedContent;
|
||||||
|
|
||||||
|
this.cachedContent = this.Start == 0 && this.Length == source.Length
|
||||||
|
? source
|
||||||
|
: source.Substring(this.Start, this.Length);
|
||||||
|
|
||||||
|
return this.cachedContent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async Task RemoveBlock()
|
private async Task RemoveBlock()
|
||||||
{
|
{
|
||||||
@ -194,4 +609,14 @@ public partial class ContentBlockComponent : MSGComponentBase
|
|||||||
var result = await ReviewAttachmentsDialog.OpenDialogAsync(this.DialogService, this.Content.FileAttachments.ToHashSet());
|
var result = await ReviewAttachmentsDialog.OpenDialogAsync(this.DialogService, this.Content.FileAttachments.ToHashSet());
|
||||||
this.Content.FileAttachments = result.ToList();
|
this.Content.FileAttachments = result.ToList();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public async ValueTask DisposeAsync()
|
||||||
|
{
|
||||||
|
if (this.isDisposed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.isDisposed = true;
|
||||||
|
await this.DisposeMathContainerIfNeededAsync();
|
||||||
|
this.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -84,6 +84,9 @@ public record FileAttachment(FileAttachmentType Type, string FileName, string Fi
|
|||||||
{
|
{
|
||||||
var extension = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant();
|
var extension = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant();
|
||||||
|
|
||||||
|
if (FileTypeFilter.Executables.FilterExtensions.Contains(extension))
|
||||||
|
return FileAttachmentType.FORBIDDEN;
|
||||||
|
|
||||||
// Check if it's an image file:
|
// Check if it's an image file:
|
||||||
if (FileTypeFilter.AllImages.FilterExtensions.Contains(extension))
|
if (FileTypeFilter.AllImages.FilterExtensions.Contains(extension))
|
||||||
return FileAttachmentType.IMAGE;
|
return FileAttachmentType.IMAGE;
|
||||||
@ -96,7 +99,8 @@ public record FileAttachment(FileAttachmentType Type, string FileName, string Fi
|
|||||||
if (FileTypeFilter.PDF.FilterExtensions.Contains(extension) ||
|
if (FileTypeFilter.PDF.FilterExtensions.Contains(extension) ||
|
||||||
FileTypeFilter.Text.FilterExtensions.Contains(extension) ||
|
FileTypeFilter.Text.FilterExtensions.Contains(extension) ||
|
||||||
FileTypeFilter.AllOffice.FilterExtensions.Contains(extension) ||
|
FileTypeFilter.AllOffice.FilterExtensions.Contains(extension) ||
|
||||||
FileTypeFilter.AllSourceCode.FilterExtensions.Contains(extension))
|
FileTypeFilter.AllSourceCode.FilterExtensions.Contains(extension) ||
|
||||||
|
FileTypeFilter.IsAllowedSourceLikeFileName(filePath))
|
||||||
return FileAttachmentType.DOCUMENT;
|
return FileAttachmentType.DOCUMENT;
|
||||||
|
|
||||||
// All other file types are forbidden:
|
// All other file types are forbidden:
|
||||||
|
|||||||
5
app/MindWork AI Studio/Chat/MathJaxBlock.razor
Normal file
5
app/MindWork AI Studio/Chat/MathJaxBlock.razor
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
@namespace AIStudio.Chat
|
||||||
|
|
||||||
|
<div class="@this.RootClass" data-chat-math-block="true" style="white-space: pre-wrap;">
|
||||||
|
@this.MathText
|
||||||
|
</div>
|
||||||
18
app/MindWork AI Studio/Chat/MathJaxBlock.razor.cs
Normal file
18
app/MindWork AI Studio/Chat/MathJaxBlock.razor.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
|
||||||
|
namespace AIStudio.Chat;
|
||||||
|
|
||||||
|
public partial class MathJaxBlock
|
||||||
|
{
|
||||||
|
[Parameter]
|
||||||
|
public string Value { get; init; } = string.Empty;
|
||||||
|
|
||||||
|
[Parameter]
|
||||||
|
public string Class { get; init; } = string.Empty;
|
||||||
|
|
||||||
|
private string RootClass => string.IsNullOrWhiteSpace(this.Class)
|
||||||
|
? "chat-mathjax-block"
|
||||||
|
: $"chat-mathjax-block {this.Class}";
|
||||||
|
|
||||||
|
private string MathText => $"$${Environment.NewLine}{this.Value}{Environment.NewLine}$$";
|
||||||
|
}
|
||||||
@ -6,4 +6,4 @@
|
|||||||
}
|
}
|
||||||
</MudSelect>
|
</MudSelect>
|
||||||
|
|
||||||
<MudMarkdown Value="@this.LogContent" Props="Markdown.DefaultConfig"/>
|
<MudMarkdown Value="@this.LogContent" Props="Markdown.DefaultConfig" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE"/>
|
||||||
@ -16,6 +16,7 @@
|
|||||||
@if (!block.HideFromUser)
|
@if (!block.HideFromUser)
|
||||||
{
|
{
|
||||||
<ContentBlockComponent
|
<ContentBlockComponent
|
||||||
|
@key="@block"
|
||||||
Role="@block.Role"
|
Role="@block.Role"
|
||||||
Type="@block.ContentType"
|
Type="@block.ContentType"
|
||||||
Time="@block.Time"
|
Time="@block.Time"
|
||||||
@ -53,7 +54,8 @@
|
|||||||
Class="@this.UserInputClass"
|
Class="@this.UserInputClass"
|
||||||
Style="@this.UserInputStyle"/>
|
Style="@this.UserInputStyle"/>
|
||||||
</MudElement>
|
</MudElement>
|
||||||
<MudToolBar WrapContent="true" Gutters="@false" Class="border border-solid rounded" Style="border-color: lightgrey;">
|
<MudToolBar WrapContent="true" Gutters="@false" Class="border border-solid rounded" Style="border-color: lightgrey; gap: 2px;">
|
||||||
|
|
||||||
@if (
|
@if (
|
||||||
this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES
|
this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is not WorkspaceStorageBehavior.DISABLE_WORKSPACES
|
||||||
&& this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_OVERLAY)
|
&& this.SettingsManager.ConfigurationData.Workspace.DisplayBehavior is WorkspaceDisplayBehavior.TOGGLE_OVERLAY)
|
||||||
@ -80,9 +82,9 @@
|
|||||||
<MudIconButton Icon="@Icons.Material.Filled.CommentBank" OnClick="@(() => this.StartNewChat(useSameWorkspace: true))"/>
|
<MudIconButton Icon="@Icons.Material.Filled.CommentBank" OnClick="@(() => this.StartNewChat(useSameWorkspace: true))"/>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<ChatTemplateSelection MarginLeft="" CanChatThreadBeUsedForTemplate="@this.CanThreadBeSaved" CurrentChatThread="@this.ChatThread" CurrentChatTemplate="@this.currentChatTemplate" CurrentChatTemplateChanged="@this.ChatTemplateWasChanged"/>
|
||||||
|
|
||||||
<ChatTemplateSelection CanChatThreadBeUsedForTemplate="@this.CanThreadBeSaved" CurrentChatThread="@this.ChatThread" CurrentChatTemplate="@this.currentChatTemplate" CurrentChatTemplateChanged="@this.ChatTemplateWasChanged"/>
|
|
||||||
<AttachDocuments Name="File Attachments" Layer="@DropLayers.PAGES" @bind-DocumentPaths="@this.chatDocumentPaths" CatchAllDocuments="true" UseSmallForm="true" Provider="@this.Provider"/>
|
|
||||||
|
|
||||||
@if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY)
|
@if (this.SettingsManager.ConfigurationData.Workspace.StorageBehavior is WorkspaceStorageBehavior.STORE_CHATS_AUTOMATICALLY)
|
||||||
{
|
{
|
||||||
@ -97,7 +99,36 @@
|
|||||||
<MudIconButton Icon="@Icons.Material.Filled.MoveToInbox" Disabled="@(!this.CanThreadBeSaved)" OnClick="@(() => this.MoveChatToWorkspace())"/>
|
<MudIconButton Icon="@Icons.Material.Filled.MoveToInbox" Disabled="@(!this.CanThreadBeSaved)" OnClick="@(() => this.MoveChatToWorkspace())"/>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<AttachDocuments Name="File Attachments" Layer="@DropLayers.PAGES" @bind-DocumentPaths="@this.chatDocumentPaths" CatchAllDocuments="true" UseSmallForm="true" Provider="@this.Provider"/>
|
||||||
|
|
||||||
|
<MudDivider Vertical="true" Style="height: 24px; align-self: center;"/>
|
||||||
|
|
||||||
|
<MudTooltip Text="@T("Bold")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.FormatBold" OnClick="() => this.ApplyMarkdownFormat(MARKDOWN_BOLD)" Disabled="@this.IsInputForbidden()"/>
|
||||||
|
</MudTooltip>
|
||||||
|
<MudTooltip Text="@T("Italic")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.FormatItalic" OnClick="() => this.ApplyMarkdownFormat(MARKDOWN_ITALIC)" Disabled="@this.IsInputForbidden()"/>
|
||||||
|
</MudTooltip>
|
||||||
|
<MudTooltip Text="@T("Heading")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.TextFields" OnClick="() => this.ApplyMarkdownFormat(MARKDOWN_HEADING)" Disabled="@this.IsInputForbidden()"/>
|
||||||
|
</MudTooltip>
|
||||||
|
<MudTooltip Text="@T("Bulleted List")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.FormatListBulleted" OnClick="() => this.ApplyMarkdownFormat(MARKDOWN_BULLET_LIST)" Disabled="@this.IsInputForbidden()"/>
|
||||||
|
</MudTooltip>
|
||||||
|
<MudTooltip Text="@T("Code")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Code" OnClick="() => this.ApplyMarkdownFormat(MARKDOWN_CODE)" Disabled="@this.IsInputForbidden()"/>
|
||||||
|
</MudTooltip>
|
||||||
|
|
||||||
|
<MudDivider Vertical="true" Style="height: 24px; align-self: center;"/>
|
||||||
|
|
||||||
|
<ProfileSelection MarginLeft="" CurrentProfile="@this.currentProfile" CurrentProfileChanged="@this.ProfileWasChanged" Disabled="@(!this.currentChatTemplate.AllowProfileUsage)" DisabledText="@T("Profile usage is disabled according to your chat template settings.")"/>
|
||||||
|
|
||||||
|
@if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager))
|
||||||
|
{
|
||||||
|
<DataSourceSelection @ref="@this.dataSourceSelectionComponent" PopoverTriggerMode="PopoverTriggerMode.BUTTON" LLMProvider="@this.Provider" DataSourceOptions="@this.GetCurrentDataSourceOptions()" DataSourceOptionsChanged="@(async options => await this.SetCurrentDataSourceOptions(options))" DataSourcesAISelected="@this.GetAgentSelectedDataSources()"/>
|
||||||
|
}
|
||||||
|
|
||||||
@if (this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence)
|
@if (this.SettingsManager.ConfigurationData.LLMProviders.ShowProviderConfidence)
|
||||||
{
|
{
|
||||||
<ConfidenceInfo Mode="PopoverTriggerMode.ICON" LLMProvider="@this.Provider.UsedLLMProvider"/>
|
<ConfidenceInfo Mode="PopoverTriggerMode.ICON" LLMProvider="@this.Provider.UsedLLMProvider"/>
|
||||||
@ -109,21 +140,16 @@
|
|||||||
<MudIconButton Icon="@Icons.Material.Filled.Stop" Color="Color.Error" OnClick="@(() => this.CancelStreaming())"/>
|
<MudIconButton Icon="@Icons.Material.Filled.Stop" Color="Color.Error" OnClick="@(() => this.CancelStreaming())"/>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
}
|
}
|
||||||
|
|
||||||
<ProfileSelection CurrentProfile="@this.currentProfile" CurrentProfileChanged="@this.ProfileWasChanged" Disabled="@(!this.currentChatTemplate.AllowProfileUsage)" DisabledText="@T("Profile usage is disabled according to your chat template settings.")"/>
|
|
||||||
|
|
||||||
@if (PreviewFeatures.PRE_RAG_2024.IsEnabled(this.SettingsManager))
|
|
||||||
{
|
|
||||||
<DataSourceSelection @ref="@this.dataSourceSelectionComponent" PopoverTriggerMode="PopoverTriggerMode.BUTTON" PopoverButtonClasses="ma-3" LLMProvider="@this.Provider" DataSourceOptions="@this.GetCurrentDataSourceOptions()" DataSourceOptionsChanged="@(async options => await this.SetCurrentDataSourceOptions(options))" DataSourcesAISelected="@this.GetAgentSelectedDataSources()"/>
|
|
||||||
}
|
|
||||||
|
|
||||||
@if (!this.ChatThread.IsLLMProviderAllowed(this.Provider))
|
@if (!this.ChatThread.IsLLMProviderAllowed(this.Provider))
|
||||||
{
|
{
|
||||||
<MudTooltip Text="@T("The selected provider is not allowed in this chat due to data security reasons.")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
<MudTooltip Text="@T("The selected provider is not allowed in this chat due to data security reasons.")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Error" Color="Color.Error"/>
|
<MudIconButton Icon="@Icons.Material.Filled.Error" Color="Color.Error"/>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
}
|
}
|
||||||
<MudIconButton />
|
|
||||||
|
<MudSpacer />
|
||||||
|
<HalluzinationReminder ContainerClass="my-0 ml-2 me-2"/>
|
||||||
</MudToolBar>
|
</MudToolBar>
|
||||||
</FooterContent>
|
</FooterContent>
|
||||||
</InnerScrolling>
|
</InnerScrolling>
|
||||||
|
|||||||
@ -13,6 +13,13 @@ namespace AIStudio.Components;
|
|||||||
|
|
||||||
public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
||||||
{
|
{
|
||||||
|
private const string CHAT_INPUT_ID = "chat-user-input";
|
||||||
|
private const string MARKDOWN_CODE = "code";
|
||||||
|
private const string MARKDOWN_BOLD = "bold";
|
||||||
|
private const string MARKDOWN_ITALIC = "italic";
|
||||||
|
private const string MARKDOWN_HEADING = "heading";
|
||||||
|
private const string MARKDOWN_BULLET_LIST = "bullet_list";
|
||||||
|
|
||||||
[Parameter]
|
[Parameter]
|
||||||
public ChatThread? ChatThread { get; set; }
|
public ChatThread? ChatThread { get; set; }
|
||||||
|
|
||||||
@ -36,6 +43,9 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
|
|
||||||
[Inject]
|
[Inject]
|
||||||
private IDialogService DialogService { get; init; } = null!;
|
private IDialogService DialogService { get; init; } = null!;
|
||||||
|
|
||||||
|
[Inject]
|
||||||
|
private IJSRuntime JsRuntime { get; init; } = null!;
|
||||||
|
|
||||||
private const Placement TOOLBAR_TOOLTIP_PLACEMENT = Placement.Top;
|
private const Placement TOOLBAR_TOOLTIP_PLACEMENT = Placement.Top;
|
||||||
private static readonly Dictionary<string, object?> USER_INPUT_ATTRIBUTES = new();
|
private static readonly Dictionary<string, object?> USER_INPUT_ATTRIBUTES = new();
|
||||||
@ -56,6 +66,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
private bool autoSaveEnabled;
|
private bool autoSaveEnabled;
|
||||||
private string currentWorkspaceName = string.Empty;
|
private string currentWorkspaceName = string.Empty;
|
||||||
private Guid currentWorkspaceId = Guid.Empty;
|
private Guid currentWorkspaceId = Guid.Empty;
|
||||||
|
private Guid currentChatThreadId = Guid.Empty;
|
||||||
private CancellationTokenSource? cancellationTokenSource;
|
private CancellationTokenSource? cancellationTokenSource;
|
||||||
private HashSet<FileAttachment> chatDocumentPaths = [];
|
private HashSet<FileAttachment> chatDocumentPaths = [];
|
||||||
|
|
||||||
@ -72,6 +83,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
|
|
||||||
// Configure the spellchecking for the user input:
|
// Configure the spellchecking for the user input:
|
||||||
this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES);
|
this.SettingsManager.InjectSpellchecking(USER_INPUT_ATTRIBUTES);
|
||||||
|
USER_INPUT_ATTRIBUTES["id"] = CHAT_INPUT_ID;
|
||||||
|
|
||||||
// Get the preselected profile:
|
// Get the preselected profile:
|
||||||
this.currentProfile = this.SettingsManager.GetPreselectedProfile(Tools.Components.CHAT);
|
this.currentProfile = this.SettingsManager.GetPreselectedProfile(Tools.Components.CHAT);
|
||||||
@ -197,8 +209,9 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
//
|
//
|
||||||
if (this.ChatThread is not null)
|
if (this.ChatThread is not null)
|
||||||
{
|
{
|
||||||
|
this.currentChatThreadId = this.ChatThread.ChatId;
|
||||||
this.currentWorkspaceId = this.ChatThread.WorkspaceId;
|
this.currentWorkspaceId = this.ChatThread.WorkspaceId;
|
||||||
this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceName(this.ChatThread.WorkspaceId);
|
this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceNameAsync(this.ChatThread.WorkspaceId);
|
||||||
this.WorkspaceName(this.currentWorkspaceName);
|
this.WorkspaceName(this.currentWorkspaceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,12 +227,12 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
this.mustStoreChat = false;
|
this.mustStoreChat = false;
|
||||||
|
|
||||||
if(this.Workspaces is not null)
|
if(this.Workspaces is not null)
|
||||||
await this.Workspaces.StoreChat(this.ChatThread);
|
await this.Workspaces.StoreChatAsync(this.ChatThread);
|
||||||
else
|
else
|
||||||
await WorkspaceBehaviour.StoreChat(this.ChatThread);
|
await WorkspaceBehaviour.StoreChatAsync(this.ChatThread);
|
||||||
|
|
||||||
this.currentWorkspaceId = this.ChatThread.WorkspaceId;
|
this.currentWorkspaceId = this.ChatThread.WorkspaceId;
|
||||||
this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceName(this.ChatThread.WorkspaceId);
|
this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceNameAsync(this.ChatThread.WorkspaceId);
|
||||||
this.WorkspaceName(this.currentWorkspaceName);
|
this.WorkspaceName(this.currentWorkspaceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,14 +240,14 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
{
|
{
|
||||||
this.Logger.LogInformation($"Try to load the chat '{this.loadChat.ChatId}' now.");
|
this.Logger.LogInformation($"Try to load the chat '{this.loadChat.ChatId}' now.");
|
||||||
this.mustLoadChat = false;
|
this.mustLoadChat = false;
|
||||||
this.ChatThread = await WorkspaceBehaviour.LoadChat(this.loadChat);
|
this.ChatThread = await WorkspaceBehaviour.LoadChatAsync(this.loadChat);
|
||||||
|
|
||||||
if(this.ChatThread is not null)
|
if(this.ChatThread is not null)
|
||||||
{
|
{
|
||||||
await this.ChatThreadChanged.InvokeAsync(this.ChatThread);
|
await this.ChatThreadChanged.InvokeAsync(this.ChatThread);
|
||||||
this.Logger.LogInformation($"The chat '{this.ChatThread!.ChatId}' with title '{this.ChatThread.Name}' ({this.ChatThread.Blocks.Count} messages) was loaded successfully.");
|
this.Logger.LogInformation($"The chat '{this.ChatThread!.ChatId}' with title '{this.ChatThread.Name}' ({this.ChatThread.Blocks.Count} messages) was loaded successfully.");
|
||||||
|
|
||||||
this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceName(this.ChatThread.WorkspaceId);
|
this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceNameAsync(this.ChatThread.WorkspaceId);
|
||||||
this.WorkspaceName(this.currentWorkspaceName);
|
this.WorkspaceName(this.currentWorkspaceName);
|
||||||
await this.SelectProviderWhenLoadingChat();
|
await this.SelectProviderWhenLoadingChat();
|
||||||
}
|
}
|
||||||
@ -260,7 +273,49 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
await base.OnAfterRenderAsync(firstRender);
|
await base.OnAfterRenderAsync(firstRender);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override async Task OnParametersSetAsync()
|
||||||
|
{
|
||||||
|
await this.SyncWorkspaceHeaderWithChatThreadAsync();
|
||||||
|
await base.OnParametersSetAsync();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private async Task SyncWorkspaceHeaderWithChatThreadAsync()
|
||||||
|
{
|
||||||
|
if (this.ChatThread is null)
|
||||||
|
{
|
||||||
|
if (this.currentChatThreadId != Guid.Empty || this.currentWorkspaceId != Guid.Empty || !string.IsNullOrWhiteSpace(this.currentWorkspaceName))
|
||||||
|
{
|
||||||
|
this.currentChatThreadId = Guid.Empty;
|
||||||
|
this.currentWorkspaceId = Guid.Empty;
|
||||||
|
this.currentWorkspaceName = string.Empty;
|
||||||
|
this.WorkspaceName(this.currentWorkspaceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Guard: If ChatThread ID and WorkspaceId haven't changed, skip entirely.
|
||||||
|
// Using ID-based comparison instead of name-based to correctly handle
|
||||||
|
// temporary chats where the workspace name is always empty.
|
||||||
|
if (this.currentChatThreadId == this.ChatThread.ChatId
|
||||||
|
&& this.currentWorkspaceId == this.ChatThread.WorkspaceId)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.currentChatThreadId = this.ChatThread.ChatId;
|
||||||
|
this.currentWorkspaceId = this.ChatThread.WorkspaceId;
|
||||||
|
var loadedWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceNameAsync(this.ChatThread.WorkspaceId);
|
||||||
|
|
||||||
|
// Only notify the parent when the name actually changed to prevent
|
||||||
|
// an infinite render loop: WorkspaceName → UpdateWorkspaceName →
|
||||||
|
// StateHasChanged → re-render → OnParametersSetAsync → WorkspaceName → ...
|
||||||
|
if (this.currentWorkspaceName != loadedWorkspaceName)
|
||||||
|
{
|
||||||
|
this.currentWorkspaceName = loadedWorkspaceName;
|
||||||
|
this.WorkspaceName(this.currentWorkspaceName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private bool IsProviderSelected => this.Provider.UsedLLMProvider != LLMProviders.NONE;
|
private bool IsProviderSelected => this.Provider.UsedLLMProvider != LLMProviders.NONE;
|
||||||
|
|
||||||
@ -419,6 +474,18 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task ApplyMarkdownFormat(string formatType)
|
||||||
|
{
|
||||||
|
if (this.IsInputForbidden())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(this.dataSourceSelectionComponent?.IsVisible ?? false)
|
||||||
|
this.dataSourceSelectionComponent.Hide();
|
||||||
|
|
||||||
|
this.userInput = await this.JsRuntime.InvokeAsync<string>("formatChatInputMarkdown", CHAT_INPUT_ID, formatType);
|
||||||
|
this.hasUnsavedChanges = true;
|
||||||
|
}
|
||||||
|
|
||||||
private async Task SendMessage(bool reuseLastUserPrompt = false)
|
private async Task SendMessage(bool reuseLastUserPrompt = false)
|
||||||
{
|
{
|
||||||
@ -428,8 +495,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
if(!this.ChatThread.IsLLMProviderAllowed(this.Provider))
|
if(!this.ChatThread.IsLLMProviderAllowed(this.Provider))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// We need to blur the focus away from the input field
|
// Blur the focus away from the input field to be able to clear it:
|
||||||
// to be able to clear the field:
|
|
||||||
await this.inputField.BlurAsync();
|
await this.inputField.BlurAsync();
|
||||||
|
|
||||||
// Create a new chat thread if necessary:
|
// Create a new chat thread if necessary:
|
||||||
@ -520,8 +586,10 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
|
|
||||||
// Clear the input field:
|
// Clear the input field:
|
||||||
await this.inputField.FocusAsync();
|
await this.inputField.FocusAsync();
|
||||||
|
|
||||||
this.userInput = string.Empty;
|
this.userInput = string.Empty;
|
||||||
this.chatDocumentPaths.Clear();
|
this.chatDocumentPaths.Clear();
|
||||||
|
|
||||||
await this.inputField.BlurAsync();
|
await this.inputField.BlurAsync();
|
||||||
|
|
||||||
// Enable the stream state for the chat component:
|
// Enable the stream state for the chat component:
|
||||||
@ -583,9 +651,9 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
// the workspace gets updated automatically when the chat is saved.
|
// the workspace gets updated automatically when the chat is saved.
|
||||||
//
|
//
|
||||||
if (this.Workspaces is not null)
|
if (this.Workspaces is not null)
|
||||||
await this.Workspaces.StoreChat(this.ChatThread);
|
await this.Workspaces.StoreChatAsync(this.ChatThread);
|
||||||
else
|
else
|
||||||
await WorkspaceBehaviour.StoreChat(this.ChatThread);
|
await WorkspaceBehaviour.StoreChatAsync(this.ChatThread);
|
||||||
|
|
||||||
this.hasUnsavedChanges = false;
|
this.hasUnsavedChanges = false;
|
||||||
}
|
}
|
||||||
@ -621,9 +689,9 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
chatPath = Path.Join(SettingsManager.DataDirectory, "workspaces", this.ChatThread.WorkspaceId.ToString(), this.ChatThread.ChatId.ToString());
|
chatPath = Path.Join(SettingsManager.DataDirectory, "workspaces", this.ChatThread.WorkspaceId.ToString(), this.ChatThread.ChatId.ToString());
|
||||||
|
|
||||||
if(this.Workspaces is null)
|
if(this.Workspaces is null)
|
||||||
await WorkspaceBehaviour.DeleteChat(this.DialogService, this.ChatThread.WorkspaceId, this.ChatThread.ChatId, askForConfirmation: false);
|
await WorkspaceBehaviour.DeleteChatAsync(this.DialogService, this.ChatThread.WorkspaceId, this.ChatThread.ChatId, askForConfirmation: false);
|
||||||
else
|
else
|
||||||
await this.Workspaces.DeleteChat(chatPath, askForConfirmation: false, unloadChat: true);
|
await this.Workspaces.DeleteChatAsync(chatPath, askForConfirmation: false, unloadChat: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -665,6 +733,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
// to reset the chat thread:
|
// to reset the chat thread:
|
||||||
//
|
//
|
||||||
this.ChatThread = null;
|
this.ChatThread = null;
|
||||||
|
this.currentChatThreadId = Guid.Empty;
|
||||||
this.currentWorkspaceId = Guid.Empty;
|
this.currentWorkspaceId = Guid.Empty;
|
||||||
this.currentWorkspaceName = string.Empty;
|
this.currentWorkspaceName = string.Empty;
|
||||||
this.WorkspaceName(this.currentWorkspaceName);
|
this.WorkspaceName(this.currentWorkspaceName);
|
||||||
@ -739,13 +808,13 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Delete the chat from the current workspace or the temporary storage:
|
// Delete the chat from the current workspace or the temporary storage:
|
||||||
await WorkspaceBehaviour.DeleteChat(this.DialogService, this.ChatThread!.WorkspaceId, this.ChatThread.ChatId, askForConfirmation: false);
|
await WorkspaceBehaviour.DeleteChatAsync(this.DialogService, this.ChatThread!.WorkspaceId, this.ChatThread.ChatId, askForConfirmation: false);
|
||||||
|
|
||||||
this.ChatThread!.WorkspaceId = workspaceId;
|
this.ChatThread!.WorkspaceId = workspaceId;
|
||||||
await this.SaveThread();
|
await this.SaveThread();
|
||||||
|
|
||||||
this.currentWorkspaceId = this.ChatThread.WorkspaceId;
|
this.currentWorkspaceId = this.ChatThread.WorkspaceId;
|
||||||
this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceName(this.ChatThread.WorkspaceId);
|
this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceNameAsync(this.ChatThread.WorkspaceId);
|
||||||
this.WorkspaceName(this.currentWorkspaceName);
|
this.WorkspaceName(this.currentWorkspaceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -758,12 +827,14 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
if (this.ChatThread is not null)
|
if (this.ChatThread is not null)
|
||||||
{
|
{
|
||||||
this.currentWorkspaceId = this.ChatThread.WorkspaceId;
|
this.currentWorkspaceId = this.ChatThread.WorkspaceId;
|
||||||
this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceName(this.ChatThread.WorkspaceId);
|
this.currentWorkspaceName = await WorkspaceBehaviour.LoadWorkspaceNameAsync(this.ChatThread.WorkspaceId);
|
||||||
this.WorkspaceName(this.currentWorkspaceName);
|
this.WorkspaceName(this.currentWorkspaceName);
|
||||||
|
this.currentChatThreadId = this.ChatThread.ChatId;
|
||||||
this.dataSourceSelectionComponent?.ChangeOptionWithoutSaving(this.ChatThread.DataSourceOptions, this.ChatThread.AISelectedDataSources);
|
this.dataSourceSelectionComponent?.ChangeOptionWithoutSaving(this.ChatThread.DataSourceOptions, this.ChatThread.AISelectedDataSources);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
this.currentChatThreadId = Guid.Empty;
|
||||||
this.currentWorkspaceId = Guid.Empty;
|
this.currentWorkspaceId = Guid.Empty;
|
||||||
this.currentWorkspaceName = string.Empty;
|
this.currentWorkspaceName = string.Empty;
|
||||||
this.WorkspaceName(this.currentWorkspaceName);
|
this.WorkspaceName(this.currentWorkspaceName);
|
||||||
@ -785,6 +856,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
this.isStreaming = false;
|
this.isStreaming = false;
|
||||||
this.hasUnsavedChanges = false;
|
this.hasUnsavedChanges = false;
|
||||||
this.userInput = string.Empty;
|
this.userInput = string.Empty;
|
||||||
|
this.currentChatThreadId = Guid.Empty;
|
||||||
this.currentWorkspaceId = Guid.Empty;
|
this.currentWorkspaceId = Guid.Empty;
|
||||||
|
|
||||||
this.currentWorkspaceName = string.Empty;
|
this.currentWorkspaceName = string.Empty;
|
||||||
@ -969,4 +1041,4 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
<MudText Typo="Typo.h6">
|
<MudText Typo="Typo.h6">
|
||||||
@T("Description")
|
@T("Description")
|
||||||
</MudText>
|
</MudText>
|
||||||
<MudMarkdown Value="@this.currentConfidence.Description"/>
|
<MudMarkdown Value="@this.currentConfidence.Description" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE"/>
|
||||||
|
|
||||||
@if (this.currentConfidence.Sources.Count > 0)
|
@if (this.currentConfidence.Sources.Count > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -0,0 +1,5 @@
|
|||||||
|
<MudElement Class="@($"{this.ContainerClass} d-flex align-center")">
|
||||||
|
<MudText Typo="Typo.caption" Class="mb-0">
|
||||||
|
@this.Text
|
||||||
|
</MudText>
|
||||||
|
</MudElement>
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
using AIStudio.Tools.PluginSystem;
|
||||||
|
using Microsoft.AspNetCore.Components;
|
||||||
|
|
||||||
|
namespace AIStudio.Components;
|
||||||
|
|
||||||
|
public partial class HalluzinationReminder: ComponentBase
|
||||||
|
{
|
||||||
|
private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(HalluzinationReminder).Namespace, nameof(HalluzinationReminder));
|
||||||
|
|
||||||
|
[Parameter]
|
||||||
|
public string Text { get; set; } = TB("LLMs can make mistakes. Check important information.");
|
||||||
|
|
||||||
|
[Parameter]
|
||||||
|
public string ContainerClass { get; set; } = "mt-2 mb-1";
|
||||||
|
}
|
||||||
@ -100,7 +100,7 @@ public abstract class MSGComponentBase : ComponentBase, IDisposable, IMessageBus
|
|||||||
Event.PLUGINS_RELOADED,
|
Event.PLUGINS_RELOADED,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.MessageBus.ApplyFilters(this, filterComponents, eventsList.ToArray());
|
this.MessageBus.ApplyFilters(this, filterComponents, eventsList.ToHashSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void DisposeResources()
|
protected virtual void DisposeResources()
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<MudIconButton Size="Size.Small" Icon="@Icons.Material.Filled.Person4" />
|
<MudIconButton Icon="@Icons.Material.Filled.Person4" Color="Color.Default" />
|
||||||
}
|
}
|
||||||
</ActivatorContent>
|
</ActivatorContent>
|
||||||
<ChildContent>
|
<ChildContent>
|
||||||
@ -25,4 +25,4 @@
|
|||||||
}
|
}
|
||||||
</ChildContent>
|
</ChildContent>
|
||||||
</MudMenu>
|
</MudMenu>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
|
|||||||
@ -17,6 +17,7 @@
|
|||||||
<ConfigurationSelect OptionDescription="@T("Check for updates")" SelectedValue="@(() => this.SettingsManager.ConfigurationData.App.UpdateInterval)" Data="@ConfigurationSelectDataFactory.GetUpdateIntervalData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.App.UpdateInterval = selectedValue)" OptionHelp="@T("How often should we check for app updates?")" IsLocked="() => ManagedConfiguration.TryGet(x => x.App, x => x.UpdateInterval, out var meta) && meta.IsLocked"/>
|
<ConfigurationSelect OptionDescription="@T("Check for updates")" SelectedValue="@(() => this.SettingsManager.ConfigurationData.App.UpdateInterval)" Data="@ConfigurationSelectDataFactory.GetUpdateIntervalData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.App.UpdateInterval = selectedValue)" OptionHelp="@T("How often should we check for app updates?")" IsLocked="() => ManagedConfiguration.TryGet(x => x.App, x => x.UpdateInterval, out var meta) && meta.IsLocked"/>
|
||||||
<ConfigurationSelect OptionDescription="@T("Update installation method")" SelectedValue="@(() => this.SettingsManager.ConfigurationData.App.UpdateInstallation)" Data="@ConfigurationSelectDataFactory.GetUpdateBehaviourData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.App.UpdateInstallation = selectedValue)" OptionHelp="@T("Should updates be installed automatically or manually?")" IsLocked="() => ManagedConfiguration.TryGet(x => x.App, x => x.UpdateInstallation, out var meta) && meta.IsLocked"/>
|
<ConfigurationSelect OptionDescription="@T("Update installation method")" SelectedValue="@(() => this.SettingsManager.ConfigurationData.App.UpdateInstallation)" Data="@ConfigurationSelectDataFactory.GetUpdateBehaviourData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.App.UpdateInstallation = selectedValue)" OptionHelp="@T("Should updates be installed automatically or manually?")" IsLocked="() => ManagedConfiguration.TryGet(x => x.App, x => x.UpdateInstallation, out var meta) && meta.IsLocked"/>
|
||||||
<ConfigurationSelect OptionDescription="@T("Navigation bar behavior")" SelectedValue="@(() => this.SettingsManager.ConfigurationData.App.NavigationBehavior)" Data="@ConfigurationSelectDataFactory.GetNavBehaviorData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.App.NavigationBehavior = selectedValue)" OptionHelp="@T("Select the desired behavior for the navigation bar.")"/>
|
<ConfigurationSelect OptionDescription="@T("Navigation bar behavior")" SelectedValue="@(() => this.SettingsManager.ConfigurationData.App.NavigationBehavior)" Data="@ConfigurationSelectDataFactory.GetNavBehaviorData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.App.NavigationBehavior = selectedValue)" OptionHelp="@T("Select the desired behavior for the navigation bar.")"/>
|
||||||
|
<ConfigurationSelect OptionDescription="@T("Start page")" SelectedValue="@(() => this.SettingsManager.ConfigurationData.App.StartPage)" Data="@ConfigurationSelectDataFactory.GetStartPageData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.App.StartPage = selectedValue)" OptionHelp="@this.GetStartPageHelpText()" IsLocked="() => ManagedConfiguration.TryGet(x => x.App, x => x.StartPage, out var meta) && meta.IsLocked"/>
|
||||||
<ConfigurationOption OptionDescription="@T("Show administration settings?")" LabelOn="@T("Administration settings are visible")" LabelOff="@T("Administration settings are not visible")" State="@(() => this.SettingsManager.ConfigurationData.App.ShowAdminSettings)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.App.ShowAdminSettings = updatedState)" OptionHelp="@T("When enabled, additional administration options become visible. These options are intended for IT staff to manage organization-wide configuration, e.g. configuring and exporting providers for an entire organization.")" IsLocked="() => ManagedConfiguration.TryGet(x => x.App, x => x.ShowAdminSettings, out var meta) && meta.IsLocked"/>
|
<ConfigurationOption OptionDescription="@T("Show administration settings?")" LabelOn="@T("Administration settings are visible")" LabelOff="@T("Administration settings are not visible")" State="@(() => this.SettingsManager.ConfigurationData.App.ShowAdminSettings)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.App.ShowAdminSettings = updatedState)" OptionHelp="@T("When enabled, additional administration options become visible. These options are intended for IT staff to manage organization-wide configuration, e.g. configuring and exporting providers for an entire organization.")" IsLocked="() => ManagedConfiguration.TryGet(x => x.App, x => x.ShowAdminSettings, out var meta) && meta.IsLocked"/>
|
||||||
<ConfigurationSelect OptionDescription="@T("Preview feature visibility")" SelectedValue="@(() => this.SettingsManager.ConfigurationData.App.PreviewVisibility)" Data="@ConfigurationSelectDataFactory.GetPreviewVisibility()" SelectionUpdate="@this.UpdatePreviewFeatures" OptionHelp="@T("Do you want to show preview features in the app?")" IsLocked="() => ManagedConfiguration.TryGet(x => x.App, x => x.PreviewVisibility, out var meta) && meta.IsLocked"/>
|
<ConfigurationSelect OptionDescription="@T("Preview feature visibility")" SelectedValue="@(() => this.SettingsManager.ConfigurationData.App.PreviewVisibility)" Data="@ConfigurationSelectDataFactory.GetPreviewVisibility()" SelectionUpdate="@this.UpdatePreviewFeatures" OptionHelp="@T("Do you want to show preview features in the app?")" IsLocked="() => ManagedConfiguration.TryGet(x => x.App, x => x.PreviewVisibility, out var meta) && meta.IsLocked"/>
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,15 @@ public partial class SettingsPanelApp : SettingsPanelBase
|
|||||||
var secret = EnterpriseEncryption.GenerateSecret();
|
var secret = EnterpriseEncryption.GenerateSecret();
|
||||||
await this.RustService.CopyText2Clipboard(this.Snackbar, secret);
|
await this.RustService.CopyText2Clipboard(this.Snackbar, secret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private string GetStartPageHelpText()
|
||||||
|
{
|
||||||
|
var helpText = T("Choose which page AI Studio should open first when you start the app. Changes take effect the next time you launch AI Studio.");
|
||||||
|
if (!ManagedConfiguration.TryGet(x => x.App, x => x.StartPage, out var meta) || meta.ManagedMode is not ManagedConfigurationMode.EDITABLE_DEFAULT)
|
||||||
|
return helpText;
|
||||||
|
|
||||||
|
return $"{helpText} {T("Your organization provided a default start page, but you can still change it.")}";
|
||||||
|
}
|
||||||
|
|
||||||
private IEnumerable<ConfigurationSelectData<string>> GetFilteredTranscriptionProviders()
|
private IEnumerable<ConfigurationSelectData<string>> GetFilteredTranscriptionProviders()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -104,7 +104,7 @@
|
|||||||
@context.ToName()
|
@context.ToName()
|
||||||
</MudTd>
|
</MudTd>
|
||||||
<MudTd>
|
<MudTd>
|
||||||
<MudMarkdown Value="@context.GetConfidence(this.SettingsManager).Description"/>
|
<MudMarkdown Value="@context.GetConfidence(this.SettingsManager).Description" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE"/>
|
||||||
</MudTd>
|
</MudTd>
|
||||||
<MudTd Style="vertical-align: top;">
|
<MudTd Style="vertical-align: top;">
|
||||||
<MudMenu StartIcon="@Icons.Material.Filled.Security" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" Label="@this.GetCurrentConfidenceLevelName(context)" Variant="Variant.Filled" Style="@this.SetCurrentConfidenceLevelColorStyle(context)">
|
<MudMenu StartIcon="@Icons.Material.Filled.Security" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" Label="@this.GetCurrentConfidenceLevelName(context)" Variant="Variant.Filled" Style="@this.SetCurrentConfidenceLevelColorStyle(context)">
|
||||||
|
|||||||
@ -4,6 +4,7 @@ public enum TreeItemType
|
|||||||
{
|
{
|
||||||
NONE,
|
NONE,
|
||||||
|
|
||||||
|
LOADING,
|
||||||
CHAT,
|
CHAT,
|
||||||
WORKSPACE,
|
WORKSPACE,
|
||||||
}
|
}
|
||||||
@ -1,9 +1,7 @@
|
|||||||
@using AIStudio.Settings.DataModel
|
|
||||||
|
|
||||||
@namespace AIStudio.Components
|
@namespace AIStudio.Components
|
||||||
@inherits MSGComponentBase
|
@inherits MSGComponentBase
|
||||||
|
|
||||||
@if (PreviewFeatures.PRE_SPEECH_TO_TEXT_2026.IsEnabled(this.SettingsManager) && !string.IsNullOrWhiteSpace(this.SettingsManager.ConfigurationData.App.UseTranscriptionProvider))
|
@if (this.ShouldRenderVoiceRecording)
|
||||||
{
|
{
|
||||||
<MudTooltip Text="@this.Tooltip">
|
<MudTooltip Text="@this.Tooltip">
|
||||||
@if (this.isTranscribing || this.isPreparing)
|
@if (this.isTranscribing || this.isPreparing)
|
||||||
@ -16,6 +14,7 @@
|
|||||||
ToggledChanged="@this.OnRecordingToggled"
|
ToggledChanged="@this.OnRecordingToggled"
|
||||||
Icon="@Icons.Material.Filled.Mic"
|
Icon="@Icons.Material.Filled.Mic"
|
||||||
ToggledIcon="@Icons.Material.Filled.Stop"
|
ToggledIcon="@Icons.Material.Filled.Stop"
|
||||||
|
Disabled="@(!this.IsVoiceRecordingAvailable)"
|
||||||
Color="Color.Primary"
|
Color="Color.Primary"
|
||||||
ToggledColor="Color.Error"/>
|
ToggledColor="Color.Error"/>
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using AIStudio.Provider;
|
using AIStudio.Provider;
|
||||||
|
using AIStudio.Settings.DataModel;
|
||||||
using AIStudio.Tools.MIME;
|
using AIStudio.Tools.MIME;
|
||||||
using AIStudio.Tools.Rust;
|
using AIStudio.Tools.Rust;
|
||||||
using AIStudio.Tools.Services;
|
using AIStudio.Tools.Services;
|
||||||
@ -21,24 +22,25 @@ public partial class VoiceRecorder : MSGComponentBase
|
|||||||
[Inject]
|
[Inject]
|
||||||
private ISnackbar Snackbar { get; init; } = null!;
|
private ISnackbar Snackbar { get; init; } = null!;
|
||||||
|
|
||||||
|
[Inject]
|
||||||
|
private VoiceRecordingAvailabilityService VoiceRecordingAvailabilityService { get; init; } = null!;
|
||||||
|
|
||||||
#region Overrides of MSGComponentBase
|
#region Overrides of MSGComponentBase
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
// Register for global shortcut events:
|
// Register for global shortcut events:
|
||||||
this.ApplyFilters([], [Event.TAURI_EVENT_RECEIVED]);
|
this.ApplyFilters([], [Event.TAURI_EVENT_RECEIVED, Event.VOICE_RECORDING_AVAILABILITY_CHANGED]);
|
||||||
|
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
|
}
|
||||||
|
|
||||||
try
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||||
{
|
{
|
||||||
// Initialize sound effects. This "warms up" the AudioContext and preloads all sounds for reliable playback:
|
if (firstRender && this.ShouldRenderVoiceRecording)
|
||||||
await this.JsRuntime.InvokeVoidAsync("initSoundEffects");
|
await this.EnsureSoundEffectsAvailableAsync("during the first interactive render");
|
||||||
}
|
|
||||||
catch (Exception ex)
|
await base.OnAfterRenderAsync(firstRender);
|
||||||
{
|
|
||||||
this.Logger.LogError(ex, "Failed to initialize sound effects.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async Task ProcessIncomingMessage<T>(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default
|
protected override async Task ProcessIncomingMessage<T>(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default
|
||||||
@ -54,6 +56,10 @@ public partial class VoiceRecorder : MSGComponentBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Event.VOICE_RECORDING_AVAILABILITY_CHANGED:
|
||||||
|
this.StateHasChanged();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,6 +68,12 @@ public partial class VoiceRecorder : MSGComponentBase
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private async Task ToggleRecordingFromShortcut()
|
private async Task ToggleRecordingFromShortcut()
|
||||||
{
|
{
|
||||||
|
if (!this.IsVoiceRecordingAvailable)
|
||||||
|
{
|
||||||
|
this.Logger.LogDebug("Ignoring shortcut: voice recording is unavailable in the current session.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Don't allow toggle if transcription is in progress or preparing:
|
// Don't allow toggle if transcription is in progress or preparing:
|
||||||
if (this.isTranscribing || this.isPreparing)
|
if (this.isTranscribing || this.isPreparing)
|
||||||
{
|
{
|
||||||
@ -85,27 +97,38 @@ public partial class VoiceRecorder : MSGComponentBase
|
|||||||
private string? finalRecordingPath;
|
private string? finalRecordingPath;
|
||||||
private DotNetObjectReference<VoiceRecorder>? dotNetReference;
|
private DotNetObjectReference<VoiceRecorder>? dotNetReference;
|
||||||
|
|
||||||
private string Tooltip => this.isTranscribing
|
private bool ShouldRenderVoiceRecording => PreviewFeatures.PRE_SPEECH_TO_TEXT_2026.IsEnabled(this.SettingsManager)
|
||||||
? T("Transcription in progress...")
|
&& !string.IsNullOrWhiteSpace(this.SettingsManager.ConfigurationData.App.UseTranscriptionProvider);
|
||||||
: this.isRecording
|
|
||||||
? T("Stop recording and start transcription")
|
private bool IsVoiceRecordingAvailable => this.ShouldRenderVoiceRecording
|
||||||
: T("Start recording your voice for a transcription");
|
&& this.VoiceRecordingAvailabilityService.IsAvailable;
|
||||||
|
|
||||||
|
private string Tooltip => !this.VoiceRecordingAvailabilityService.IsAvailable
|
||||||
|
? T("Voice recording is unavailable because the client could not initialize audio playback.")
|
||||||
|
: this.isTranscribing
|
||||||
|
? T("Transcription in progress...")
|
||||||
|
: this.isRecording
|
||||||
|
? T("Stop recording and start transcription")
|
||||||
|
: T("Start recording your voice for a transcription");
|
||||||
|
|
||||||
private async Task OnRecordingToggled(bool toggled)
|
private async Task OnRecordingToggled(bool toggled)
|
||||||
{
|
{
|
||||||
if (toggled)
|
if (toggled)
|
||||||
{
|
{
|
||||||
|
if (!this.IsVoiceRecordingAvailable)
|
||||||
|
{
|
||||||
|
this.Logger.LogDebug("Ignoring recording start: voice recording is unavailable in the current session.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.isPreparing = true;
|
this.isPreparing = true;
|
||||||
this.StateHasChanged();
|
this.StateHasChanged();
|
||||||
|
|
||||||
try
|
if (!await this.EnsureSoundEffectsAvailableAsync("before starting audio recording"))
|
||||||
{
|
{
|
||||||
// Warm up sound effects:
|
this.isPreparing = false;
|
||||||
await this.JsRuntime.InvokeVoidAsync("initSoundEffects");
|
this.StateHasChanged();
|
||||||
}
|
return;
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
this.Logger.LogError(ex, "Failed to initialize sound effects.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var mimeTypes = GetPreferredMimeTypes(
|
var mimeTypes = GetPreferredMimeTypes(
|
||||||
@ -416,11 +439,66 @@ public partial class VoiceRecorder : MSGComponentBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class AudioRecordingResult
|
private async Task<bool> EnsureSoundEffectsAvailableAsync(string context)
|
||||||
{
|
{
|
||||||
public string MimeType { get; init; } = string.Empty;
|
if (!this.ShouldRenderVoiceRecording)
|
||||||
|
return false;
|
||||||
|
|
||||||
public bool ChangedMimeType { get; init; }
|
if (!this.VoiceRecordingAvailabilityService.IsAvailable)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result = await this.JsRuntime.InvokeAsync<SoundEffectsInitializationResult>("initSoundEffects");
|
||||||
|
if (result.Success)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
var failureDetails = BuildSoundEffectsFailureDetails(result);
|
||||||
|
this.Logger.LogError("Failed to initialize sound effects {Context}. {FailureDetails}", context, failureDetails);
|
||||||
|
await this.DisableVoiceRecordingAsync(failureDetails);
|
||||||
|
}
|
||||||
|
catch (JSDisconnectedException ex)
|
||||||
|
{
|
||||||
|
this.Logger.LogError(ex, "Failed to initialize sound effects {Context}. The JS runtime disconnected.", context);
|
||||||
|
await this.DisableVoiceRecordingAsync("The JS runtime disconnected while initializing audio playback.");
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException ex)
|
||||||
|
{
|
||||||
|
this.Logger.LogError(ex, "Failed to initialize sound effects {Context}. The interop call was canceled.", context);
|
||||||
|
await this.DisableVoiceRecordingAsync("The interop call for audio playback initialization was canceled.");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
this.Logger.LogError(ex, "Failed to initialize sound effects {Context}.", context);
|
||||||
|
await this.DisableVoiceRecordingAsync(ex.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task DisableVoiceRecordingAsync(string reason)
|
||||||
|
{
|
||||||
|
if (!this.VoiceRecordingAvailabilityService.TryDisable(reason))
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.Logger.LogWarning("Voice recording was disabled for the current session. Reason: {Reason}", reason);
|
||||||
|
await this.MessageBus.SendWarning(new(Icons.Material.Filled.MicOff, this.T("Voice recording has been disabled for this session because audio playback could not be initialized on the client.")));
|
||||||
|
await this.SendMessage(Event.VOICE_RECORDING_AVAILABILITY_CHANGED, reason);
|
||||||
|
this.StateHasChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string BuildSoundEffectsFailureDetails(SoundEffectsInitializationResult result)
|
||||||
|
{
|
||||||
|
var details = new List<string>();
|
||||||
|
if (result.FailedPaths.Length > 0)
|
||||||
|
details.Add($"Failed sound files: {string.Join(", ", result.FailedPaths)}.");
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(result.ErrorMessage))
|
||||||
|
details.Add($"Client error: {result.ErrorMessage}");
|
||||||
|
|
||||||
|
return details.Count > 0
|
||||||
|
? string.Join(" ", details)
|
||||||
|
: "The client did not provide additional details.";
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Overrides of MSGComponentBase
|
#region Overrides of MSGComponentBase
|
||||||
@ -440,4 +518,4 @@ public partial class VoiceRecorder : MSGComponentBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
@ -1,93 +1,114 @@
|
|||||||
@inherits MSGComponentBase
|
@inherits MSGComponentBase
|
||||||
<MudTreeView T="ITreeItem" Items="@this.treeItems" SelectionMode="SelectionMode.SingleSelection" Hover="@true" ExpandOnClick="@true" Class="ma-3">
|
@if (this.isInitialLoading)
|
||||||
<ItemTemplate Context="item">
|
{
|
||||||
@switch (item.Value)
|
<MudStack Class="ma-3" Spacing="1">
|
||||||
|
<MudSkeleton Width="40%" Height="30px"/>
|
||||||
|
@for (var i = 0; i < 10; i++)
|
||||||
{
|
{
|
||||||
case TreeDivider:
|
<MudSkeleton Width="95%" Height="26px"/>
|
||||||
<li style="min-height: 1em;">
|
|
||||||
<MudDivider Style="margin-top: 1em; width: 90%; border-width: 3pt;"/>
|
|
||||||
</li>
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TreeItemData treeItem:
|
|
||||||
@if (treeItem.Type is TreeItemType.CHAT)
|
|
||||||
{
|
|
||||||
<MudTreeViewItem T="ITreeItem" Icon="@treeItem.Icon" Value="@item.Value" Expanded="@item.Expanded" CanExpand="@treeItem.Expandable" Items="@treeItem.Children" OnClick="@(() => this.LoadChat(treeItem.Path, true))">
|
|
||||||
<BodyContent>
|
|
||||||
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%">
|
|
||||||
<MudText Style="justify-self: start;">
|
|
||||||
@if (string.IsNullOrWhiteSpace(treeItem.Text))
|
|
||||||
{
|
|
||||||
@T("Empty chat")
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@treeItem.ShortenedText
|
|
||||||
}
|
|
||||||
</MudText>
|
|
||||||
<div style="justify-self: end;">
|
|
||||||
|
|
||||||
<MudTooltip Text="@T("Move to workspace")" Placement="@WORKSPACE_ITEM_TOOLTIP_PLACEMENT">
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.MoveToInbox" Size="Size.Medium" Color="Color.Inherit" OnClick="@(() => this.MoveChat(treeItem.Path))"/>
|
|
||||||
</MudTooltip>
|
|
||||||
|
|
||||||
<MudTooltip Text="@T("Rename")" Placement="@WORKSPACE_ITEM_TOOLTIP_PLACEMENT">
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Edit" Size="Size.Medium" Color="Color.Inherit" OnClick="@(() => this.RenameChat(treeItem.Path))"/>
|
|
||||||
</MudTooltip>
|
|
||||||
|
|
||||||
<MudTooltip Text="@T("Delete")" Placement="@WORKSPACE_ITEM_TOOLTIP_PLACEMENT">
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Delete" Size="Size.Medium" Color="Color.Error" OnClick="@(() => this.DeleteChat(treeItem.Path))"/>
|
|
||||||
</MudTooltip>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</BodyContent>
|
|
||||||
</MudTreeViewItem>
|
|
||||||
}
|
|
||||||
else if (treeItem.Type is TreeItemType.WORKSPACE)
|
|
||||||
{
|
|
||||||
<MudTreeViewItem T="ITreeItem" Icon="@treeItem.Icon" Value="@item.Value" Expanded="@item.Expanded" CanExpand="@treeItem.Expandable" Items="@treeItem.Children">
|
|
||||||
<BodyContent>
|
|
||||||
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%">
|
|
||||||
<MudText Style="justify-self: start;">
|
|
||||||
@treeItem.Text
|
|
||||||
</MudText>
|
|
||||||
<div style="justify-self: end;">
|
|
||||||
<MudTooltip Text="@T("Rename")" Placement="@WORKSPACE_ITEM_TOOLTIP_PLACEMENT">
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Edit" Size="Size.Medium" Color="Color.Inherit" OnClick="@(() => this.RenameWorkspace(treeItem.Path))"/>
|
|
||||||
</MudTooltip>
|
|
||||||
|
|
||||||
<MudTooltip Text="@T("Delete")" Placement="@WORKSPACE_ITEM_TOOLTIP_PLACEMENT">
|
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Delete" Size="Size.Medium" Color="Color.Error" OnClick="@(() => this.DeleteWorkspace(treeItem.Path))"/>
|
|
||||||
</MudTooltip>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</BodyContent>
|
|
||||||
</MudTreeViewItem>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<MudTreeViewItem T="ITreeItem" Icon="@treeItem.Icon" Value="@item.Value" Expanded="@item.Expanded" CanExpand="@treeItem.Expandable" Items="@treeItem.Children">
|
|
||||||
<BodyContent>
|
|
||||||
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%">
|
|
||||||
<MudText Style="justify-self: start;">
|
|
||||||
@treeItem.Text
|
|
||||||
</MudText>
|
|
||||||
</div>
|
|
||||||
</BodyContent>
|
|
||||||
</MudTreeViewItem>
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TreeButton treeButton:
|
|
||||||
<li>
|
|
||||||
<div class="mud-treeview-item-content" style="background-color: unset;">
|
|
||||||
<div class="mud-treeview-item-arrow"></div>
|
|
||||||
<MudButton StartIcon="@treeButton.Icon" Variant="Variant.Filled" OnClick="@treeButton.Action">
|
|
||||||
@treeButton.Text
|
|
||||||
</MudButton>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
</ItemTemplate>
|
</MudStack>
|
||||||
</MudTreeView>
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudTreeView T="ITreeItem" Items="@this.treeItems" SelectionMode="SelectionMode.SingleSelection" Hover="@true" ExpandOnClick="@true" Class="ma-3">
|
||||||
|
<ItemTemplate Context="item">
|
||||||
|
@switch (item.Value)
|
||||||
|
{
|
||||||
|
case TreeDivider:
|
||||||
|
<li style="min-height: 1em;">
|
||||||
|
<MudDivider Style="margin-top: 1em; width: 90%; border-width: 3pt;"/>
|
||||||
|
</li>
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TreeItemData treeItem:
|
||||||
|
@if (treeItem.Type is TreeItemType.LOADING)
|
||||||
|
{
|
||||||
|
<MudTreeViewItem T="ITreeItem" Icon="@treeItem.Icon" Value="@item.Value" Expanded="@item.Expanded" CanExpand="@false" Items="@treeItem.Children">
|
||||||
|
<BodyContent>
|
||||||
|
<MudSkeleton Width="85%" Height="22px"/>
|
||||||
|
</BodyContent>
|
||||||
|
</MudTreeViewItem>
|
||||||
|
}
|
||||||
|
else if (treeItem.Type is TreeItemType.CHAT)
|
||||||
|
{
|
||||||
|
<MudTreeViewItem T="ITreeItem" Icon="@treeItem.Icon" Value="@item.Value" Expanded="@item.Expanded" CanExpand="@treeItem.Expandable" Items="@treeItem.Children" OnClick="@(() => this.LoadChatAsync(treeItem.Path, true))">
|
||||||
|
<BodyContent>
|
||||||
|
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%">
|
||||||
|
<MudText Style="justify-self: start;">
|
||||||
|
@if (string.IsNullOrWhiteSpace(treeItem.Text))
|
||||||
|
{
|
||||||
|
@T("Empty chat")
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@treeItem.ShortenedText
|
||||||
|
}
|
||||||
|
</MudText>
|
||||||
|
<div style="justify-self: end;">
|
||||||
|
|
||||||
|
<MudTooltip Text="@T("Move to workspace")" Placement="@WORKSPACE_ITEM_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.MoveToInbox" Size="Size.Medium" Color="Color.Inherit" OnClick="@(() => this.MoveChatAsync(treeItem.Path))"/>
|
||||||
|
</MudTooltip>
|
||||||
|
|
||||||
|
<MudTooltip Text="@T("Rename")" Placement="@WORKSPACE_ITEM_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Edit" Size="Size.Medium" Color="Color.Inherit" OnClick="@(() => this.RenameChatAsync(treeItem.Path))"/>
|
||||||
|
</MudTooltip>
|
||||||
|
|
||||||
|
<MudTooltip Text="@T("Delete")" Placement="@WORKSPACE_ITEM_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Delete" Size="Size.Medium" Color="Color.Error" OnClick="@(() => this.DeleteChatAsync(treeItem.Path))"/>
|
||||||
|
</MudTooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</BodyContent>
|
||||||
|
</MudTreeViewItem>
|
||||||
|
}
|
||||||
|
else if (treeItem.Type is TreeItemType.WORKSPACE)
|
||||||
|
{
|
||||||
|
<MudTreeViewItem T="ITreeItem" Icon="@treeItem.Icon" Value="@item.Value" Expanded="@item.Expanded" CanExpand="@treeItem.Expandable" Items="@treeItem.Children" OnClick="@(() => this.OnWorkspaceClicked(treeItem))">
|
||||||
|
<BodyContent>
|
||||||
|
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%">
|
||||||
|
<MudText Style="justify-self: start;">
|
||||||
|
@treeItem.Text
|
||||||
|
</MudText>
|
||||||
|
<div style="justify-self: end;">
|
||||||
|
<MudTooltip Text="@T("Rename")" Placement="@WORKSPACE_ITEM_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Edit" Size="Size.Medium" Color="Color.Inherit" OnClick="@(() => this.RenameWorkspaceAsync(treeItem.Path))"/>
|
||||||
|
</MudTooltip>
|
||||||
|
|
||||||
|
<MudTooltip Text="@T("Delete")" Placement="@WORKSPACE_ITEM_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Delete" Size="Size.Medium" Color="Color.Error" OnClick="@(() => this.DeleteWorkspaceAsync(treeItem.Path))"/>
|
||||||
|
</MudTooltip>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</BodyContent>
|
||||||
|
</MudTreeViewItem>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudTreeViewItem T="ITreeItem" Icon="@treeItem.Icon" Value="@item.Value" Expanded="@item.Expanded" CanExpand="@treeItem.Expandable" Items="@treeItem.Children">
|
||||||
|
<BodyContent>
|
||||||
|
<div style="display: grid; grid-template-columns: 1fr auto; align-items: center; width: 100%">
|
||||||
|
<MudText Style="justify-self: start;">
|
||||||
|
@treeItem.Text
|
||||||
|
</MudText>
|
||||||
|
</div>
|
||||||
|
</BodyContent>
|
||||||
|
</MudTreeViewItem>
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TreeButton treeButton:
|
||||||
|
<li>
|
||||||
|
<div class="mud-treeview-item-content" style="background-color: unset;">
|
||||||
|
<div class="mud-treeview-item-arrow"></div>
|
||||||
|
<MudButton StartIcon="@treeButton.Icon" Variant="Variant.Filled" OnClick="@treeButton.Action">
|
||||||
|
@treeButton.Text
|
||||||
|
</MudButton>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
</ItemTemplate>
|
||||||
|
</MudTreeView>
|
||||||
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
||||||
using AIStudio.Chat;
|
using AIStudio.Chat;
|
||||||
@ -29,31 +29,64 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
public bool ExpandRootNodes { get; set; } = true;
|
public bool ExpandRootNodes { get; set; } = true;
|
||||||
|
|
||||||
private const Placement WORKSPACE_ITEM_TOOLTIP_PLACEMENT = Placement.Bottom;
|
private const Placement WORKSPACE_ITEM_TOOLTIP_PLACEMENT = Placement.Bottom;
|
||||||
|
private readonly SemaphoreSlim treeLoadingSemaphore = new(1, 1);
|
||||||
|
private readonly List<TreeItemData<ITreeItem>> treeItems = [];
|
||||||
|
private readonly HashSet<Guid> loadingWorkspaceChatLists = [];
|
||||||
|
|
||||||
private readonly List<TreeItemData<ITreeItem>> treeItems = new();
|
private CancellationTokenSource? prefetchCancellationTokenSource;
|
||||||
|
private bool isInitialLoading = true;
|
||||||
|
private bool isDisposed;
|
||||||
|
|
||||||
#region Overrides of ComponentBase
|
#region Overrides of ComponentBase
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
|
_ = this.LoadTreeItemsAsync(startPrefetch: true);
|
||||||
//
|
|
||||||
// Notice: In order to get the server-based loading to work, we need to respect the following rules:
|
|
||||||
// - We must have initial tree items
|
|
||||||
// - Those initial tree items cannot have children
|
|
||||||
// - When assigning the tree items to the MudTreeViewItem component, we must set the Value property to the value of the item
|
|
||||||
//
|
|
||||||
// We won't await the loading of the tree items here,
|
|
||||||
// to avoid blocking the UI thread:
|
|
||||||
_ = this.LoadTreeItems();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
private async Task LoadTreeItems()
|
private async Task LoadTreeItemsAsync(bool startPrefetch = true, bool forceReload = false)
|
||||||
|
{
|
||||||
|
await this.treeLoadingSemaphore.WaitAsync();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (this.isDisposed)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (forceReload)
|
||||||
|
await WorkspaceBehaviour.ForceReloadWorkspaceTreeAsync();
|
||||||
|
|
||||||
|
var snapshot = await WorkspaceBehaviour.GetOrLoadWorkspaceTreeShellAsync();
|
||||||
|
this.BuildTreeItems(snapshot);
|
||||||
|
this.isInitialLoading = false;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
this.treeLoadingSemaphore.Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.SafeStateHasChanged();
|
||||||
|
|
||||||
|
if (startPrefetch)
|
||||||
|
await this.StartPrefetchAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BuildTreeItems(WorkspaceTreeCacheSnapshot snapshot)
|
||||||
{
|
{
|
||||||
this.treeItems.Clear();
|
this.treeItems.Clear();
|
||||||
|
|
||||||
|
var workspaceChildren = new List<TreeItemData<ITreeItem>>();
|
||||||
|
foreach (var workspace in snapshot.Workspaces)
|
||||||
|
workspaceChildren.Add(this.CreateWorkspaceTreeItem(workspace));
|
||||||
|
|
||||||
|
workspaceChildren.Add(new TreeItemData<ITreeItem>
|
||||||
|
{
|
||||||
|
Expandable = false,
|
||||||
|
Value = new TreeButton(WorkspaceBranch.WORKSPACES, 1, T("Add workspace"), Icons.Material.Filled.LibraryAdd, this.AddWorkspaceAsync),
|
||||||
|
});
|
||||||
|
|
||||||
this.treeItems.Add(new TreeItemData<ITreeItem>
|
this.treeItems.Add(new TreeItemData<ITreeItem>
|
||||||
{
|
{
|
||||||
Expanded = this.ExpandRootNodes,
|
Expanded = this.ExpandRootNodes,
|
||||||
@ -66,7 +99,7 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
Icon = Icons.Material.Filled.Folder,
|
Icon = Icons.Material.Filled.Folder,
|
||||||
Expandable = true,
|
Expandable = true,
|
||||||
Path = "root",
|
Path = "root",
|
||||||
Children = await this.LoadWorkspaces(),
|
Children = workspaceChildren,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -76,7 +109,10 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
Value = new TreeDivider(),
|
Value = new TreeDivider(),
|
||||||
});
|
});
|
||||||
|
|
||||||
await this.InvokeAsync(this.StateHasChanged);
|
var temporaryChatsChildren = new List<TreeItemData<ITreeItem>>();
|
||||||
|
foreach (var temporaryChat in snapshot.TemporaryChats.OrderByDescending(x => x.LastEditTime))
|
||||||
|
temporaryChatsChildren.Add(CreateChatTreeItem(temporaryChat, WorkspaceBranch.TEMPORARY_CHATS, depth: 1, icon: Icons.Material.Filled.Timer));
|
||||||
|
|
||||||
this.treeItems.Add(new TreeItemData<ITreeItem>
|
this.treeItems.Add(new TreeItemData<ITreeItem>
|
||||||
{
|
{
|
||||||
Expanded = this.ExpandRootNodes,
|
Expanded = this.ExpandRootNodes,
|
||||||
@ -89,234 +125,219 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
Icon = Icons.Material.Filled.Timer,
|
Icon = Icons.Material.Filled.Timer,
|
||||||
Expandable = true,
|
Expandable = true,
|
||||||
Path = "temp",
|
Path = "temp",
|
||||||
Children = await this.LoadTemporaryChats(),
|
Children = temporaryChatsChildren,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private TreeItemData<ITreeItem> CreateWorkspaceTreeItem(WorkspaceTreeWorkspace workspace)
|
||||||
|
{
|
||||||
|
var children = new List<TreeItemData<ITreeItem>>();
|
||||||
|
if (workspace.ChatsLoaded)
|
||||||
|
{
|
||||||
|
foreach (var workspaceChat in workspace.Chats.OrderByDescending(x => x.LastEditTime))
|
||||||
|
children.Add(CreateChatTreeItem(workspaceChat, WorkspaceBranch.WORKSPACES, depth: 2, icon: Icons.Material.Filled.Chat));
|
||||||
|
}
|
||||||
|
else if (this.loadingWorkspaceChatLists.Contains(workspace.WorkspaceId))
|
||||||
|
children.AddRange(this.CreateLoadingRows(workspace.WorkspacePath));
|
||||||
|
|
||||||
|
children.Add(new TreeItemData<ITreeItem>
|
||||||
|
{
|
||||||
|
Expandable = false,
|
||||||
|
Value = new TreeButton(WorkspaceBranch.WORKSPACES, 2, T("Add chat"), Icons.Material.Filled.AddComment, () => this.AddChatAsync(workspace.WorkspacePath)),
|
||||||
|
});
|
||||||
|
|
||||||
|
return new TreeItemData<ITreeItem>
|
||||||
|
{
|
||||||
|
Expandable = true,
|
||||||
|
Value = new TreeItemData
|
||||||
|
{
|
||||||
|
Type = TreeItemType.WORKSPACE,
|
||||||
|
Depth = 1,
|
||||||
|
Branch = WorkspaceBranch.WORKSPACES,
|
||||||
|
Text = workspace.Name,
|
||||||
|
Icon = Icons.Material.Filled.Description,
|
||||||
|
Expandable = true,
|
||||||
|
Path = workspace.WorkspacePath,
|
||||||
|
Children = children,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private IReadOnlyCollection<TreeItemData<ITreeItem>> CreateLoadingRows(string workspacePath)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
[
|
||||||
|
this.CreateLoadingTreeItem(workspacePath, "loading_1"),
|
||||||
|
this.CreateLoadingTreeItem(workspacePath, "loading_2"),
|
||||||
|
this.CreateLoadingTreeItem(workspacePath, "loading_3"),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private TreeItemData<ITreeItem> CreateLoadingTreeItem(string workspacePath, string suffix)
|
||||||
|
{
|
||||||
|
return new TreeItemData<ITreeItem>
|
||||||
|
{
|
||||||
|
Expandable = false,
|
||||||
|
Value = new TreeItemData
|
||||||
|
{
|
||||||
|
Type = TreeItemType.LOADING,
|
||||||
|
Depth = 2,
|
||||||
|
Branch = WorkspaceBranch.WORKSPACES,
|
||||||
|
Text = T("Loading chats..."),
|
||||||
|
Icon = Icons.Material.Filled.HourglassTop,
|
||||||
|
Expandable = false,
|
||||||
|
Path = Path.Join(workspacePath, suffix),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static TreeItemData<ITreeItem> CreateChatTreeItem(WorkspaceTreeChat chat, WorkspaceBranch branch, int depth, string icon)
|
||||||
|
{
|
||||||
|
return new TreeItemData<ITreeItem>
|
||||||
|
{
|
||||||
|
Expandable = false,
|
||||||
|
Value = new TreeItemData
|
||||||
|
{
|
||||||
|
Type = TreeItemType.CHAT,
|
||||||
|
Depth = depth,
|
||||||
|
Branch = branch,
|
||||||
|
Text = chat.Name,
|
||||||
|
Icon = icon,
|
||||||
|
Expandable = false,
|
||||||
|
Path = chat.ChatPath,
|
||||||
|
LastEditTime = chat.LastEditTime,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SafeStateHasChanged()
|
||||||
|
{
|
||||||
|
if (this.isDisposed)
|
||||||
|
return;
|
||||||
|
|
||||||
await this.InvokeAsync(this.StateHasChanged);
|
await this.InvokeAsync(this.StateHasChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<IReadOnlyCollection<TreeItemData<ITreeItem>>> LoadTemporaryChats()
|
private async Task StartPrefetchAsync()
|
||||||
{
|
{
|
||||||
var tempChildren = new List<TreeItemData>();
|
if (this.prefetchCancellationTokenSource is not null)
|
||||||
|
|
||||||
// Get the temp root directory:
|
|
||||||
var temporaryDirectories = Path.Join(SettingsManager.DataDirectory, "tempChats");
|
|
||||||
|
|
||||||
// Ensure the directory exists:
|
|
||||||
Directory.CreateDirectory(temporaryDirectories);
|
|
||||||
|
|
||||||
// Enumerate the chat directories:
|
|
||||||
foreach (var tempChatDirPath in Directory.EnumerateDirectories(temporaryDirectories))
|
|
||||||
{
|
{
|
||||||
// Read or create the `name` file (self-heal):
|
await this.prefetchCancellationTokenSource.CancelAsync();
|
||||||
var chatNamePath = Path.Join(tempChatDirPath, "name");
|
this.prefetchCancellationTokenSource.Dispose();
|
||||||
string chatName;
|
}
|
||||||
try
|
|
||||||
|
this.prefetchCancellationTokenSource = new CancellationTokenSource();
|
||||||
|
await this.PrefetchWorkspaceChatsAsync(this.prefetchCancellationTokenSource.Token);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task PrefetchWorkspaceChatsAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await WorkspaceBehaviour.TryPrefetchRemainingChatsAsync(async _ =>
|
||||||
{
|
{
|
||||||
if (!File.Exists(chatNamePath))
|
if (this.isDisposed || cancellationToken.IsCancellationRequested)
|
||||||
{
|
return;
|
||||||
chatName = T("Unnamed chat");
|
|
||||||
await File.WriteAllTextAsync(chatNamePath, chatName, Encoding.UTF8);
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
}
|
}, cancellationToken);
|
||||||
else
|
}
|
||||||
{
|
catch (OperationCanceledException)
|
||||||
chatName = await File.ReadAllTextAsync(chatNamePath, Encoding.UTF8);
|
{
|
||||||
if (string.IsNullOrWhiteSpace(chatName))
|
// Expected when the component is hidden or disposed.
|
||||||
{
|
}
|
||||||
chatName = T("Unnamed chat");
|
catch (Exception ex)
|
||||||
await File.WriteAllTextAsync(chatNamePath, chatName, Encoding.UTF8);
|
{
|
||||||
}
|
this.Logger.LogWarning(ex, "Failed while prefetching workspace chats.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
|
||||||
{
|
private async Task OnWorkspaceClicked(TreeItemData treeItem)
|
||||||
chatName = T("Unnamed chat");
|
{
|
||||||
}
|
if (treeItem.Type is not TreeItemType.WORKSPACE)
|
||||||
|
return;
|
||||||
// Read the last change time of the chat:
|
|
||||||
var chatThreadPath = Path.Join(tempChatDirPath, "thread.json");
|
if (!Guid.TryParse(Path.GetFileName(treeItem.Path), out var workspaceId))
|
||||||
var lastEditTime = File.GetLastWriteTimeUtc(chatThreadPath);
|
return;
|
||||||
|
|
||||||
tempChildren.Add(new TreeItemData
|
await this.EnsureWorkspaceChatsLoadedAsync(workspaceId);
|
||||||
{
|
}
|
||||||
Type = TreeItemType.CHAT,
|
|
||||||
Depth = 1,
|
private async Task EnsureWorkspaceChatsLoadedAsync(Guid workspaceId)
|
||||||
Branch = WorkspaceBranch.TEMPORARY_CHATS,
|
{
|
||||||
Text = chatName,
|
var snapshot = await WorkspaceBehaviour.GetOrLoadWorkspaceTreeShellAsync();
|
||||||
Icon = Icons.Material.Filled.Timer,
|
var hasWorkspace = false;
|
||||||
Expandable = false,
|
var chatsLoaded = false;
|
||||||
Path = tempChatDirPath,
|
|
||||||
LastEditTime = lastEditTime,
|
foreach (var workspace in snapshot.Workspaces)
|
||||||
});
|
{
|
||||||
|
if (workspace.WorkspaceId != workspaceId)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
hasWorkspace = true;
|
||||||
|
chatsLoaded = workspace.ChatsLoaded;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasWorkspace || chatsLoaded || !this.loadingWorkspaceChatLists.Add(workspaceId))
|
||||||
|
return;
|
||||||
|
|
||||||
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await WorkspaceBehaviour.GetWorkspaceChatsAsync(workspaceId);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
this.loadingWorkspaceChatLists.Remove(workspaceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task ForceRefreshFromDiskAsync()
|
||||||
|
{
|
||||||
|
if (this.prefetchCancellationTokenSource is not null)
|
||||||
|
{
|
||||||
|
await this.prefetchCancellationTokenSource.CancelAsync();
|
||||||
|
this.prefetchCancellationTokenSource.Dispose();
|
||||||
|
this.prefetchCancellationTokenSource = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var result = new List<TreeItemData<ITreeItem>>(tempChildren.OrderByDescending(n => n.LastEditTime).Select(n => new TreeItemData<ITreeItem>
|
this.loadingWorkspaceChatLists.Clear();
|
||||||
{
|
this.isInitialLoading = true;
|
||||||
Expandable = false,
|
|
||||||
Value = n,
|
|
||||||
}));
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<IReadOnlyCollection<TreeItemData<ITreeItem>>> LoadWorkspaces()
|
|
||||||
{
|
|
||||||
var workspaces = new List<TreeItemData<ITreeItem>>();
|
|
||||||
|
|
||||||
//
|
await this.SafeStateHasChanged();
|
||||||
// Search for workspace folders in the data directory:
|
await this.LoadTreeItemsAsync(startPrefetch: true, forceReload: true);
|
||||||
//
|
|
||||||
|
|
||||||
// Get the workspace root directory:
|
|
||||||
var workspaceDirectories = Path.Join(SettingsManager.DataDirectory, "workspaces");
|
|
||||||
|
|
||||||
// Ensure the directory exists:
|
|
||||||
Directory.CreateDirectory(workspaceDirectories);
|
|
||||||
|
|
||||||
// Enumerate the workspace directories:
|
|
||||||
foreach (var workspaceDirPath in Directory.EnumerateDirectories(workspaceDirectories))
|
|
||||||
{
|
|
||||||
// Read or create the `name` file (self-heal):
|
|
||||||
var workspaceNamePath = Path.Join(workspaceDirPath, "name");
|
|
||||||
string workspaceName;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!File.Exists(workspaceNamePath))
|
|
||||||
{
|
|
||||||
workspaceName = T("Unnamed workspace");
|
|
||||||
await File.WriteAllTextAsync(workspaceNamePath, workspaceName, Encoding.UTF8);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
workspaceName = await File.ReadAllTextAsync(workspaceNamePath, Encoding.UTF8);
|
|
||||||
if (string.IsNullOrWhiteSpace(workspaceName))
|
|
||||||
{
|
|
||||||
workspaceName = T("Unnamed workspace");
|
|
||||||
await File.WriteAllTextAsync(workspaceNamePath, workspaceName, Encoding.UTF8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
workspaceName = T("Unnamed workspace");
|
|
||||||
}
|
|
||||||
|
|
||||||
workspaces.Add(new TreeItemData<ITreeItem>
|
|
||||||
{
|
|
||||||
Expandable = true,
|
|
||||||
Value = new TreeItemData
|
|
||||||
{
|
|
||||||
Type = TreeItemType.WORKSPACE,
|
|
||||||
Depth = 1,
|
|
||||||
Branch = WorkspaceBranch.WORKSPACES,
|
|
||||||
Text = workspaceName,
|
|
||||||
Icon = Icons.Material.Filled.Description,
|
|
||||||
Expandable = true,
|
|
||||||
Path = workspaceDirPath,
|
|
||||||
Children = await this.LoadWorkspaceChats(workspaceDirPath),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
workspaces.Add(new TreeItemData<ITreeItem>
|
|
||||||
{
|
|
||||||
Expandable = false,
|
|
||||||
Value = new TreeButton(WorkspaceBranch.WORKSPACES, 1, T("Add workspace"),Icons.Material.Filled.LibraryAdd, this.AddWorkspace),
|
|
||||||
});
|
|
||||||
return workspaces;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<IReadOnlyCollection<TreeItemData<ITreeItem>>> LoadWorkspaceChats(string workspacePath)
|
public async Task StoreChatAsync(ChatThread chat, bool reloadTreeItems = false)
|
||||||
{
|
{
|
||||||
var workspaceChats = new List<TreeItemData>();
|
await WorkspaceBehaviour.StoreChatAsync(chat);
|
||||||
|
|
||||||
// Enumerate the workspace directory:
|
if (reloadTreeItems)
|
||||||
foreach (var chatPath in Directory.EnumerateDirectories(workspacePath))
|
this.loadingWorkspaceChatLists.Clear();
|
||||||
{
|
|
||||||
// Read or create the `name` file (self-heal):
|
|
||||||
var chatNamePath = Path.Join(chatPath, "name");
|
|
||||||
string chatName;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (!File.Exists(chatNamePath))
|
|
||||||
{
|
|
||||||
chatName = T("Unnamed chat");
|
|
||||||
await File.WriteAllTextAsync(chatNamePath, chatName, Encoding.UTF8);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
chatName = await File.ReadAllTextAsync(chatNamePath, Encoding.UTF8);
|
|
||||||
if (string.IsNullOrWhiteSpace(chatName))
|
|
||||||
{
|
|
||||||
chatName = T("Unnamed chat");
|
|
||||||
await File.WriteAllTextAsync(chatNamePath, chatName, Encoding.UTF8);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
chatName = T("Unnamed chat");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read the last change time of the chat:
|
|
||||||
var chatThreadPath = Path.Join(chatPath, "thread.json");
|
|
||||||
var lastEditTime = File.GetLastWriteTimeUtc(chatThreadPath);
|
|
||||||
|
|
||||||
workspaceChats.Add(new TreeItemData
|
|
||||||
{
|
|
||||||
Type = TreeItemType.CHAT,
|
|
||||||
Depth = 2,
|
|
||||||
Branch = WorkspaceBranch.WORKSPACES,
|
|
||||||
Text = chatName,
|
|
||||||
Icon = Icons.Material.Filled.Chat,
|
|
||||||
Expandable = false,
|
|
||||||
Path = chatPath,
|
|
||||||
LastEditTime = lastEditTime,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
var result = new List<TreeItemData<ITreeItem>>(workspaceChats.OrderByDescending(n => n.LastEditTime).Select(n => new TreeItemData<ITreeItem>
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
{
|
|
||||||
Expandable = false,
|
|
||||||
Value = n,
|
|
||||||
}));
|
|
||||||
|
|
||||||
result.Add(new()
|
|
||||||
{
|
|
||||||
Expandable = false,
|
|
||||||
Value = new TreeButton(WorkspaceBranch.WORKSPACES, 2, T("Add chat"),Icons.Material.Filled.AddComment, () => this.AddChat(workspacePath)),
|
|
||||||
});
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task StoreChat(ChatThread chat, bool reloadTreeItems = true)
|
private async Task<ChatThread?> LoadChatAsync(string? chatPath, bool switchToChat)
|
||||||
{
|
{
|
||||||
await WorkspaceBehaviour.StoreChat(chat);
|
if (string.IsNullOrWhiteSpace(chatPath))
|
||||||
|
|
||||||
// Reload the tree items:
|
|
||||||
if(reloadTreeItems)
|
|
||||||
await this.LoadTreeItems();
|
|
||||||
|
|
||||||
this.StateHasChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<ChatThread?> LoadChat(string? chatPath, bool switchToChat)
|
|
||||||
{
|
|
||||||
if(string.IsNullOrWhiteSpace(chatPath))
|
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if(!Directory.Exists(chatPath))
|
if (!Directory.Exists(chatPath))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
// Check if the chat has unsaved changes:
|
|
||||||
if (switchToChat && await MessageBus.INSTANCE.SendMessageUseFirstResult<bool, bool>(this, Event.HAS_CHAT_UNSAVED_CHANGES))
|
if (switchToChat && await MessageBus.INSTANCE.SendMessageUseFirstResult<bool, bool>(this, Event.HAS_CHAT_UNSAVED_CHANGES))
|
||||||
{
|
{
|
||||||
var dialogParameters = new DialogParameters<ConfirmDialog>
|
var dialogParameters = new DialogParameters<ConfirmDialog>
|
||||||
{
|
{
|
||||||
{ x => x.Message, T("Are you sure you want to load another chat? All unsaved changes will be lost.") },
|
{ x => x.Message, T("Are you sure you want to load another chat? All unsaved changes will be lost.") },
|
||||||
};
|
};
|
||||||
|
|
||||||
var dialogReference = await this.DialogService.ShowAsync<ConfirmDialog>(T("Load Chat"), dialogParameters, DialogOptions.FULLSCREEN);
|
var dialogReference = await this.DialogService.ShowAsync<ConfirmDialog>(T("Load Chat"), dialogParameters, DialogOptions.FULLSCREEN);
|
||||||
var dialogResult = await dialogReference.Result;
|
var dialogResult = await dialogReference.Result;
|
||||||
if (dialogResult is null || dialogResult.Canceled)
|
if (dialogResult is null || dialogResult.Canceled)
|
||||||
@ -344,15 +365,15 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DeleteChat(string? chatPath, bool askForConfirmation = true, bool unloadChat = true)
|
public async Task DeleteChatAsync(string? chatPath, bool askForConfirmation = true, bool unloadChat = true)
|
||||||
{
|
{
|
||||||
var chat = await this.LoadChat(chatPath, false);
|
var chat = await this.LoadChatAsync(chatPath, false);
|
||||||
if (chat is null)
|
if (chat is null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (askForConfirmation)
|
if (askForConfirmation)
|
||||||
{
|
{
|
||||||
var workspaceName = await WorkspaceBehaviour.LoadWorkspaceName(chat.WorkspaceId);
|
var workspaceName = await WorkspaceBehaviour.LoadWorkspaceNameAsync(chat.WorkspaceId);
|
||||||
var dialogParameters = new DialogParameters<ConfirmDialog>
|
var dialogParameters = new DialogParameters<ConfirmDialog>
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -370,16 +391,10 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string chatDirectory;
|
await WorkspaceBehaviour.DeleteChatAsync(this.DialogService, chat.WorkspaceId, chat.ChatId, askForConfirmation: false);
|
||||||
if (chat.WorkspaceId == Guid.Empty)
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
chatDirectory = Path.Join(SettingsManager.DataDirectory, "tempChats", chat.ChatId.ToString());
|
|
||||||
else
|
|
||||||
chatDirectory = Path.Join(SettingsManager.DataDirectory, "workspaces", chat.WorkspaceId.ToString(), chat.ChatId.ToString());
|
|
||||||
|
|
||||||
Directory.Delete(chatDirectory, true);
|
|
||||||
await this.LoadTreeItems();
|
|
||||||
|
|
||||||
if(unloadChat && this.CurrentChatThread?.ChatId == chat.ChatId)
|
if (unloadChat && this.CurrentChatThread?.ChatId == chat.ChatId)
|
||||||
{
|
{
|
||||||
this.CurrentChatThread = null;
|
this.CurrentChatThread = null;
|
||||||
await this.CurrentChatThreadChanged.InvokeAsync(this.CurrentChatThread);
|
await this.CurrentChatThreadChanged.InvokeAsync(this.CurrentChatThread);
|
||||||
@ -387,9 +402,9 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RenameChat(string? chatPath)
|
private async Task RenameChatAsync(string? chatPath)
|
||||||
{
|
{
|
||||||
var chat = await this.LoadChat(chatPath, false);
|
var chat = await this.LoadChatAsync(chatPath, false);
|
||||||
if (chat is null)
|
if (chat is null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -410,24 +425,24 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
chat.Name = (dialogResult.Data as string)!;
|
chat.Name = (dialogResult.Data as string)!;
|
||||||
if(this.CurrentChatThread?.ChatId == chat.ChatId)
|
if (this.CurrentChatThread?.ChatId == chat.ChatId)
|
||||||
{
|
{
|
||||||
this.CurrentChatThread.Name = chat.Name;
|
this.CurrentChatThread.Name = chat.Name;
|
||||||
await this.CurrentChatThreadChanged.InvokeAsync(this.CurrentChatThread);
|
await this.CurrentChatThreadChanged.InvokeAsync(this.CurrentChatThread);
|
||||||
await MessageBus.INSTANCE.SendMessage<bool>(this, Event.WORKSPACE_LOADED_CHAT_CHANGED);
|
await MessageBus.INSTANCE.SendMessage<bool>(this, Event.WORKSPACE_LOADED_CHAT_CHANGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.StoreChat(chat);
|
await WorkspaceBehaviour.StoreChatAsync(chat);
|
||||||
await this.LoadTreeItems();
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RenameWorkspace(string? workspacePath)
|
private async Task RenameWorkspaceAsync(string? workspacePath)
|
||||||
{
|
{
|
||||||
if(workspacePath is null)
|
if (workspacePath is null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var workspaceId = Guid.Parse(Path.GetFileName(workspacePath));
|
var workspaceId = Guid.Parse(Path.GetFileName(workspacePath));
|
||||||
var workspaceName = await WorkspaceBehaviour.LoadWorkspaceName(workspaceId);
|
var workspaceName = await WorkspaceBehaviour.LoadWorkspaceNameAsync(workspaceId);
|
||||||
var dialogParameters = new DialogParameters<SingleInputDialog>
|
var dialogParameters = new DialogParameters<SingleInputDialog>
|
||||||
{
|
{
|
||||||
{ x => x.Message, string.Format(T("Please enter a new or edit the name for your workspace '{0}':"), workspaceName) },
|
{ x => x.Message, string.Format(T("Please enter a new or edit the name for your workspace '{0}':"), workspaceName) },
|
||||||
@ -447,10 +462,11 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
var alteredWorkspaceName = (dialogResult.Data as string)!;
|
var alteredWorkspaceName = (dialogResult.Data as string)!;
|
||||||
var workspaceNamePath = Path.Join(workspacePath, "name");
|
var workspaceNamePath = Path.Join(workspacePath, "name");
|
||||||
await File.WriteAllTextAsync(workspaceNamePath, alteredWorkspaceName, Encoding.UTF8);
|
await File.WriteAllTextAsync(workspaceNamePath, alteredWorkspaceName, Encoding.UTF8);
|
||||||
await this.LoadTreeItems();
|
await WorkspaceBehaviour.UpdateWorkspaceNameInCacheAsync(workspaceId, alteredWorkspaceName);
|
||||||
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task AddWorkspace()
|
private async Task AddWorkspaceAsync()
|
||||||
{
|
{
|
||||||
var dialogParameters = new DialogParameters<SingleInputDialog>
|
var dialogParameters = new DialogParameters<SingleInputDialog>
|
||||||
{
|
{
|
||||||
@ -472,23 +488,23 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
var workspacePath = Path.Join(SettingsManager.DataDirectory, "workspaces", workspaceId.ToString());
|
var workspacePath = Path.Join(SettingsManager.DataDirectory, "workspaces", workspaceId.ToString());
|
||||||
Directory.CreateDirectory(workspacePath);
|
Directory.CreateDirectory(workspacePath);
|
||||||
|
|
||||||
|
var workspaceName = (dialogResult.Data as string)!;
|
||||||
var workspaceNamePath = Path.Join(workspacePath, "name");
|
var workspaceNamePath = Path.Join(workspacePath, "name");
|
||||||
await File.WriteAllTextAsync(workspaceNamePath, (dialogResult.Data as string)!, Encoding.UTF8);
|
await File.WriteAllTextAsync(workspaceNamePath, workspaceName, Encoding.UTF8);
|
||||||
|
await WorkspaceBehaviour.AddWorkspaceToCacheAsync(workspaceId, workspacePath, workspaceName);
|
||||||
|
|
||||||
await this.LoadTreeItems();
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DeleteWorkspace(string? workspacePath)
|
private async Task DeleteWorkspaceAsync(string? workspacePath)
|
||||||
{
|
{
|
||||||
if(workspacePath is null)
|
if (workspacePath is null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var workspaceId = Guid.Parse(Path.GetFileName(workspacePath));
|
var workspaceId = Guid.Parse(Path.GetFileName(workspacePath));
|
||||||
var workspaceName = await WorkspaceBehaviour.LoadWorkspaceName(workspaceId);
|
var workspaceName = await WorkspaceBehaviour.LoadWorkspaceNameAsync(workspaceId);
|
||||||
|
|
||||||
// Determine how many chats are in the workspace:
|
|
||||||
var chatCount = Directory.EnumerateDirectories(workspacePath).Count();
|
var chatCount = Directory.EnumerateDirectories(workspacePath).Count();
|
||||||
|
|
||||||
var dialogParameters = new DialogParameters<ConfirmDialog>
|
var dialogParameters = new DialogParameters<ConfirmDialog>
|
||||||
{
|
{
|
||||||
{ x => x.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) },
|
{ x => x.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) },
|
||||||
@ -500,12 +516,13 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
Directory.Delete(workspacePath, true);
|
Directory.Delete(workspacePath, true);
|
||||||
await this.LoadTreeItems();
|
await WorkspaceBehaviour.RemoveWorkspaceFromCacheAsync(workspaceId);
|
||||||
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task MoveChat(string? chatPath)
|
private async Task MoveChatAsync(string? chatPath)
|
||||||
{
|
{
|
||||||
var chat = await this.LoadChat(chatPath, false);
|
var chat = await this.LoadChatAsync(chatPath, false);
|
||||||
if (chat is null)
|
if (chat is null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -525,22 +542,9 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
if (workspaceId == Guid.Empty)
|
if (workspaceId == Guid.Empty)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Delete the chat from the current workspace or the temporary storage:
|
await WorkspaceBehaviour.DeleteChatAsync(this.DialogService, chat.WorkspaceId, chat.ChatId, askForConfirmation: false);
|
||||||
if (chat.WorkspaceId == Guid.Empty)
|
|
||||||
{
|
|
||||||
// Case: The chat is stored in the temporary storage:
|
|
||||||
await this.DeleteChat(Path.Join(SettingsManager.DataDirectory, "tempChats", chat.ChatId.ToString()), askForConfirmation: false, unloadChat: false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Case: The chat is stored in a workspace.
|
|
||||||
await this.DeleteChat(Path.Join(SettingsManager.DataDirectory, "workspaces", chat.WorkspaceId.ToString(), chat.ChatId.ToString()), askForConfirmation: false, unloadChat: false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the chat's workspace:
|
|
||||||
chat.WorkspaceId = workspaceId;
|
chat.WorkspaceId = workspaceId;
|
||||||
|
|
||||||
// Handle the case where the chat is the active chat:
|
|
||||||
if (this.CurrentChatThread?.ChatId == chat.ChatId)
|
if (this.CurrentChatThread?.ChatId == chat.ChatId)
|
||||||
{
|
{
|
||||||
this.CurrentChatThread = chat;
|
this.CurrentChatThread = chat;
|
||||||
@ -548,12 +552,12 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
await MessageBus.INSTANCE.SendMessage<bool>(this, Event.WORKSPACE_LOADED_CHAT_CHANGED);
|
await MessageBus.INSTANCE.SendMessage<bool>(this, Event.WORKSPACE_LOADED_CHAT_CHANGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.StoreChat(chat);
|
await WorkspaceBehaviour.StoreChatAsync(chat);
|
||||||
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task AddChat(string workspacePath)
|
private async Task AddChatAsync(string workspacePath)
|
||||||
{
|
{
|
||||||
// Check if the chat has unsaved changes:
|
|
||||||
if (await MessageBus.INSTANCE.SendMessageUseFirstResult<bool, bool>(this, Event.HAS_CHAT_UNSAVED_CHANGES))
|
if (await MessageBus.INSTANCE.SendMessageUseFirstResult<bool, bool>(this, Event.HAS_CHAT_UNSAVED_CHANGES))
|
||||||
{
|
{
|
||||||
var dialogParameters = new DialogParameters<ConfirmDialog>
|
var dialogParameters = new DialogParameters<ConfirmDialog>
|
||||||
@ -579,9 +583,9 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
|
|
||||||
var chatPath = Path.Join(workspacePath, chat.ChatId.ToString());
|
var chatPath = Path.Join(workspacePath, chat.ChatId.ToString());
|
||||||
|
|
||||||
await this.StoreChat(chat);
|
await WorkspaceBehaviour.StoreChatAsync(chat);
|
||||||
await this.LoadChat(chatPath, switchToChat: true);
|
await this.LoadChatAsync(chatPath, switchToChat: true);
|
||||||
await this.LoadTreeItems();
|
await this.LoadTreeItemsAsync(startPrefetch: false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Overrides of MSGComponentBase
|
#region Overrides of MSGComponentBase
|
||||||
@ -591,11 +595,20 @@ public partial class Workspaces : MSGComponentBase
|
|||||||
switch (triggeredEvent)
|
switch (triggeredEvent)
|
||||||
{
|
{
|
||||||
case Event.PLUGINS_RELOADED:
|
case Event.PLUGINS_RELOADED:
|
||||||
await this.LoadTreeItems();
|
await this.ForceRefreshFromDiskAsync();
|
||||||
await this.InvokeAsync(this.StateHasChanged);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void DisposeResources()
|
||||||
|
{
|
||||||
|
this.isDisposed = true;
|
||||||
|
this.prefetchCancellationTokenSource?.Cancel();
|
||||||
|
this.prefetchCancellationTokenSource?.Dispose();
|
||||||
|
this.prefetchCancellationTokenSource = null;
|
||||||
|
|
||||||
|
base.DisposeResources();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
@ -55,6 +55,7 @@
|
|||||||
<MudButton Class="mb-3" Color="Color.Default" OnClick="@this.UseDefaultSystemPrompt" StartIcon="@Icons.Material.Filled.ListAlt" Variant="Variant.Filled">
|
<MudButton Class="mb-3" Color="Color.Default" OnClick="@this.UseDefaultSystemPrompt" StartIcon="@Icons.Material.Filled.ListAlt" Variant="Variant.Filled">
|
||||||
@T("Use the default system prompt")
|
@T("Use the default system prompt")
|
||||||
</MudButton>
|
</MudButton>
|
||||||
|
<ReadFileContent Text="@T("Load system prompt from file")" @bind-FileContent="@this.DataSystemPrompt"/>
|
||||||
|
|
||||||
<MudText Typo="Typo.h6" Class="mb-3 mt-6">
|
<MudText Typo="Typo.h6" Class="mb-3 mt-6">
|
||||||
@T("Predefined User Input")
|
@T("Predefined User Input")
|
||||||
|
|||||||
@ -54,7 +54,7 @@
|
|||||||
Class="ma-2 pe-4"
|
Class="ma-2 pe-4"
|
||||||
HelperText="@T("This is the content we loaded from your file — including headings, lists, and formatting. Use this to verify your file loads as expected.")">
|
HelperText="@T("This is the content we loaded from your file — including headings, lists, and formatting. Use this to verify your file loads as expected.")">
|
||||||
<div style="max-height: 40vh; overflow-y: auto;">
|
<div style="max-height: 40vh; overflow-y: auto;">
|
||||||
<MudMarkdown Value="@this.FileContent" Props="Markdown.DefaultConfig" Styling="@this.MarkdownStyling"/>
|
<MudMarkdown Value="@this.FileContent" Props="Markdown.DefaultConfig" Styling="@this.MarkdownStyling" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE"/>
|
||||||
</div>
|
</div>
|
||||||
</MudField>
|
</MudField>
|
||||||
</MudTabPanel>
|
</MudTabPanel>
|
||||||
|
|||||||
@ -30,7 +30,7 @@
|
|||||||
}
|
}
|
||||||
else if (!string.IsNullOrWhiteSpace(this.licenseText))
|
else if (!string.IsNullOrWhiteSpace(this.licenseText))
|
||||||
{
|
{
|
||||||
<MudMarkdown Value="@this.licenseText" Props="Markdown.DefaultConfig"/>
|
<MudMarkdown Value="@this.licenseText" Props="Markdown.DefaultConfig" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE"/>
|
||||||
}
|
}
|
||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
|
|
||||||
|
|||||||
@ -160,7 +160,7 @@
|
|||||||
<MudJustifiedText Class="mb-5">
|
<MudJustifiedText Class="mb-5">
|
||||||
@T("Please be aware: This section is for experts only. You are responsible for verifying the correctness of the additional parameters you provide to the API call. By default, AI Studio uses the OpenAI-compatible chat completions API, when that it is supported by the underlying service and model.")
|
@T("Please be aware: This section is for experts only. You are responsible for verifying the correctness of the additional parameters you provide to the API call. By default, AI Studio uses the OpenAI-compatible chat completions API, when that it is supported by the underlying service and model.")
|
||||||
</MudJustifiedText>
|
</MudJustifiedText>
|
||||||
<MudTextField T="string" Label=@T("Additional API parameters") Variant="Variant.Outlined" Lines="4" AutoGrow="true" MaxLines="10" HelperText=@T("""Add the parameters in proper JSON formatting, e.g., "temperature": 0.5. Remove trailing commas. The usual surrounding curly brackets {} must not be used, though.""") Placeholder="@GetPlaceholderExpertSettings" @bind-Value="@this.AdditionalJsonApiParameters" OnBlur="@this.OnInputChangeExpertSettings"/>
|
<MudTextField T="string" Label=@T("Additional API parameters") Variant="Variant.Outlined" Lines="4" AutoGrow="true" MaxLines="10" HelperText=@T("""Add the parameters in proper JSON formatting, e.g., "temperature": 0.5. Remove trailing commas. The usual surrounding curly brackets {} must not be used, though.""") Placeholder="@GetPlaceholderExpertSettings" @bind-Value="@this.AdditionalJsonApiParameters" Immediate="true" Validation="@this.ValidateAdditionalJsonApiParameters" OnBlur="@this.OnInputChangeExpertSettings"/>
|
||||||
</MudCollapse>
|
</MudCollapse>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
</MudForm>
|
</MudForm>
|
||||||
@ -181,4 +181,4 @@
|
|||||||
}
|
}
|
||||||
</MudButton>
|
</MudButton>
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</MudDialog>
|
</MudDialog>
|
||||||
|
|||||||
@ -1,3 +1,6 @@
|
|||||||
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
using AIStudio.Components;
|
using AIStudio.Components;
|
||||||
using AIStudio.Provider;
|
using AIStudio.Provider;
|
||||||
using AIStudio.Provider.HuggingFace;
|
using AIStudio.Provider.HuggingFace;
|
||||||
@ -334,7 +337,168 @@ public partial class ProviderDialog : MSGComponentBase, ISecretId
|
|||||||
|
|
||||||
private void OnInputChangeExpertSettings()
|
private void OnInputChangeExpertSettings()
|
||||||
{
|
{
|
||||||
this.AdditionalJsonApiParameters = this.AdditionalJsonApiParameters.Trim().TrimEnd(',', ' ');
|
this.AdditionalJsonApiParameters = NormalizeAdditionalJsonApiParameters(this.AdditionalJsonApiParameters)
|
||||||
|
.Trim()
|
||||||
|
.TrimEnd(',', ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
private string? ValidateAdditionalJsonApiParameters(string additionalParams)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(additionalParams))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var normalized = NormalizeAdditionalJsonApiParameters(additionalParams);
|
||||||
|
if (!string.Equals(normalized, additionalParams, StringComparison.Ordinal))
|
||||||
|
this.AdditionalJsonApiParameters = normalized;
|
||||||
|
|
||||||
|
var json = $"{{{normalized}}}";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!this.TryValidateJsonObjectWithDuplicateCheck(json, out var errorMessage))
|
||||||
|
return errorMessage;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
catch (JsonException)
|
||||||
|
{
|
||||||
|
return T("Invalid JSON: Add the parameters in proper JSON formatting, e.g., \"temperature\": 0.5. Remove trailing commas. The usual surrounding curly brackets {} must not be used, though.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string NormalizeAdditionalJsonApiParameters(string input)
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder(input.Length);
|
||||||
|
var inString = false;
|
||||||
|
var escape = false;
|
||||||
|
for (var i = 0; i < input.Length; i++)
|
||||||
|
{
|
||||||
|
var c = input[i];
|
||||||
|
if (inString)
|
||||||
|
{
|
||||||
|
sb.Append(c);
|
||||||
|
if (escape)
|
||||||
|
{
|
||||||
|
escape = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == '\\')
|
||||||
|
{
|
||||||
|
escape = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == '"')
|
||||||
|
inString = false;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == '"')
|
||||||
|
{
|
||||||
|
inString = true;
|
||||||
|
sb.Append(c);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TryReadToken(input, i, "True", out var tokenLength))
|
||||||
|
{
|
||||||
|
sb.Append("true");
|
||||||
|
i += tokenLength - 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TryReadToken(input, i, "False", out tokenLength))
|
||||||
|
{
|
||||||
|
sb.Append("false");
|
||||||
|
i += tokenLength - 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TryReadToken(input, i, "Null", out tokenLength))
|
||||||
|
{
|
||||||
|
sb.Append("null");
|
||||||
|
i += tokenLength - 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.Append(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool TryReadToken(string input, int startIndex, string token, out int tokenLength)
|
||||||
|
{
|
||||||
|
tokenLength = 0;
|
||||||
|
if (startIndex + token.Length > input.Length)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!input.AsSpan(startIndex, token.Length).SequenceEqual(token))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var beforeIndex = startIndex - 1;
|
||||||
|
if (beforeIndex >= 0 && IsIdentifierChar(input[beforeIndex]))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var afterIndex = startIndex + token.Length;
|
||||||
|
if (afterIndex < input.Length && IsIdentifierChar(input[afterIndex]))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
tokenLength = token.Length;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsIdentifierChar(char c) => char.IsLetterOrDigit(c) || c == '_';
|
||||||
|
|
||||||
|
private bool TryValidateJsonObjectWithDuplicateCheck(string json, out string? errorMessage)
|
||||||
|
{
|
||||||
|
errorMessage = null;
|
||||||
|
var bytes = Encoding.UTF8.GetBytes(json);
|
||||||
|
var reader = new Utf8JsonReader(bytes, new JsonReaderOptions
|
||||||
|
{
|
||||||
|
AllowTrailingCommas = false,
|
||||||
|
CommentHandling = JsonCommentHandling.Disallow
|
||||||
|
});
|
||||||
|
|
||||||
|
var objectStack = new Stack<HashSet<string>>();
|
||||||
|
while (reader.Read())
|
||||||
|
{
|
||||||
|
switch (reader.TokenType)
|
||||||
|
{
|
||||||
|
case JsonTokenType.StartObject:
|
||||||
|
objectStack.Push(new HashSet<string>(StringComparer.Ordinal));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case JsonTokenType.EndObject:
|
||||||
|
if (objectStack.Count > 0)
|
||||||
|
objectStack.Pop();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case JsonTokenType.PropertyName:
|
||||||
|
if (objectStack.Count == 0)
|
||||||
|
{
|
||||||
|
errorMessage = T("Additional API parameters must form a JSON object.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var name = reader.GetString() ?? string.Empty;
|
||||||
|
if (!objectStack.Peek().Add(name))
|
||||||
|
{
|
||||||
|
errorMessage = string.Format(T("Duplicate key '{0}' found."), name);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (objectStack.Count != 0)
|
||||||
|
{
|
||||||
|
errorMessage = T("Invalid JSON: Add the parameters in proper JSON formatting, e.g., \"temperature\": 0.5. Remove trailing commas. The usual surrounding curly brackets {} must not be used, though.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetExpertStyles => this.showExpertSettings ? "border-2 border-dashed rounded pa-2" : string.Empty;
|
private string GetExpertStyles => this.showExpertSettings ? "border-2 border-dashed rounded pa-2" : string.Empty;
|
||||||
@ -345,4 +509,4 @@ public partial class ProviderDialog : MSGComponentBase, ISecretId
|
|||||||
"top_p": 0.9,
|
"top_p": 0.9,
|
||||||
"frequency_penalty": 0.0
|
"frequency_penalty": 0.0
|
||||||
""";
|
""";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,7 +34,7 @@
|
|||||||
}
|
}
|
||||||
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.Agenda.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Agenda.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Agenda.MinimumProviderConfidence = selectedValue)"/>
|
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.Agenda.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Agenda.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Agenda.MinimumProviderConfidence = selectedValue)"/>
|
||||||
<ConfigurationProviderSelection Component="Components.AGENDA_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.Agenda.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Agenda.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Agenda.PreselectedProvider = selectedValue)"/>
|
<ConfigurationProviderSelection Component="Components.AGENDA_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.Agenda.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Agenda.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Agenda.PreselectedProvider = selectedValue)"/>
|
||||||
<ConfigurationSelect OptionDescription="@T("Preselect one of your profiles?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.Agenda.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Agenda.PreselectedProfile)" Data="@ConfigurationSelectDataFactory.GetProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Agenda.PreselectedProfile = selectedValue)" OptionHelp="@T("Would you like to preselect one of your profiles?")"/>
|
<ConfigurationSelect OptionDescription="@T("Preselect a profile")" Disabled="@(() => !this.SettingsManager.ConfigurationData.Agenda.PreselectOptions)" SelectedValue="@(() => ProfilePreselection.FromStoredValue(this.SettingsManager.ConfigurationData.Agenda.PreselectedProfile))" Data="@ConfigurationSelectDataFactory.GetComponentProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Agenda.PreselectedProfile = selectedValue)" OptionHelp="@T("Choose whether the assistant should use the app default profile, no profile, or a specific profile.")"/>
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
<DialogActions>
|
<DialogActions>
|
||||||
@ -42,4 +42,4 @@
|
|||||||
@T("Close")
|
@T("Close")
|
||||||
</MudButton>
|
</MudButton>
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</MudDialog>
|
</MudDialog>
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
{
|
{
|
||||||
<ConfigurationText OptionDescription="@T("Preselect another language")" Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" Icon="@Icons.Material.Filled.Translate" Text="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedOtherLanguage)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedOtherLanguage = updatedText)"/>
|
<ConfigurationText OptionDescription="@T("Preselect another language")" Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" Icon="@Icons.Material.Filled.Translate" Text="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedOtherLanguage)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedOtherLanguage = updatedText)"/>
|
||||||
}
|
}
|
||||||
<ConfigurationSelect OptionDescription="@T("Preselect one of your profiles?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProfile)" Data="@ConfigurationSelectDataFactory.GetProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProfile = selectedValue)" OptionHelp="@T("Would you like to preselect one of your profiles?")"/>
|
<ConfigurationSelect OptionDescription="@T("Preselect a profile")" Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" SelectedValue="@(() => ProfilePreselection.FromStoredValue(this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProfile))" Data="@ConfigurationSelectDataFactory.GetComponentProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProfile = selectedValue)" OptionHelp="@T("Choose whether the assistant should use the app default profile, no profile, or a specific profile.")"/>
|
||||||
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.BiasOfTheDay.MinimumProviderConfidence = selectedValue)"/>
|
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.BiasOfTheDay.MinimumProviderConfidence = selectedValue)"/>
|
||||||
<ConfigurationProviderSelection Component="Components.BIAS_DAY_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProvider = selectedValue)"/>
|
<ConfigurationProviderSelection Component="Components.BIAS_DAY_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.BiasOfTheDay.PreselectedProvider = selectedValue)"/>
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
@ -38,4 +38,4 @@
|
|||||||
@T("Close")
|
@T("Close")
|
||||||
</MudButton>
|
</MudButton>
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</MudDialog>
|
</MudDialog>
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
||||||
<ConfigurationOption OptionDescription="@T("Preselect chat options?")" LabelOn="@T("Chat options are preselected")" LabelOff="@T("No chat options are preselected")" State="@(() => this.SettingsManager.ConfigurationData.Chat.PreselectOptions)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.Chat.PreselectOptions = updatedState)" OptionHelp="@T("When enabled, you can preselect chat options. This is might be useful when you prefer a specific provider.")"/>
|
<ConfigurationOption OptionDescription="@T("Preselect chat options?")" LabelOn="@T("Chat options are preselected")" LabelOff="@T("No chat options are preselected")" State="@(() => this.SettingsManager.ConfigurationData.Chat.PreselectOptions)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.Chat.PreselectOptions = updatedState)" OptionHelp="@T("When enabled, you can preselect chat options. This is might be useful when you prefer a specific provider.")"/>
|
||||||
<ConfigurationProviderSelection Component="Components.CHAT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.Chat.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Chat.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Chat.PreselectedProvider = selectedValue)"/>
|
<ConfigurationProviderSelection Component="Components.CHAT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.Chat.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Chat.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Chat.PreselectedProvider = selectedValue)"/>
|
||||||
<ConfigurationSelect OptionDescription="@T("Preselect one of your profiles?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.Chat.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Chat.PreselectedProfile)" Data="@ConfigurationSelectDataFactory.GetProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Chat.PreselectedProfile = selectedValue)" OptionHelp="@T("Would you like to set one of your profiles as the default for chats?")"/>
|
<ConfigurationSelect OptionDescription="@T("Preselect a profile")" Disabled="@(() => !this.SettingsManager.ConfigurationData.Chat.PreselectOptions)" SelectedValue="@(() => ProfilePreselection.FromStoredValue(this.SettingsManager.ConfigurationData.Chat.PreselectedProfile))" Data="@ConfigurationSelectDataFactory.GetComponentProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Chat.PreselectedProfile = selectedValue)" OptionHelp="@T("Choose whether chats should use the app default profile, no profile, or a specific profile.")"/>
|
||||||
<ConfigurationSelect OptionDescription="@T("Preselect one of your chat templates?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.Chat.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Chat.PreselectedChatTemplate)" Data="@ConfigurationSelectDataFactory.GetChatTemplatesData(this.SettingsManager.ConfigurationData.ChatTemplates)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Chat.PreselectedChatTemplate = selectedValue)" OptionHelp="@T("Would you like to set one of your chat templates as the default for chats?")"/>
|
<ConfigurationSelect OptionDescription="@T("Preselect one of your chat templates?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.Chat.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Chat.PreselectedChatTemplate)" Data="@ConfigurationSelectDataFactory.GetChatTemplatesData(this.SettingsManager.ConfigurationData.ChatTemplates)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Chat.PreselectedChatTemplate = selectedValue)" OptionHelp="@T("Would you like to set one of your chat templates as the default for chats?")"/>
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
|
|
||||||
@ -33,4 +33,4 @@
|
|||||||
@T("Close")
|
@T("Close")
|
||||||
</MudButton>
|
</MudButton>
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</MudDialog>
|
</MudDialog>
|
||||||
|
|||||||
@ -20,10 +20,10 @@
|
|||||||
}
|
}
|
||||||
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.Coding.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Coding.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Coding.MinimumProviderConfidence = selectedValue)"/>
|
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.Coding.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Coding.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Coding.MinimumProviderConfidence = selectedValue)"/>
|
||||||
<ConfigurationProviderSelection Component="Components.CODING_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.Coding.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Coding.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Coding.PreselectedProvider = selectedValue)"/>
|
<ConfigurationProviderSelection Component="Components.CODING_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.Coding.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Coding.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Coding.PreselectedProvider = selectedValue)"/>
|
||||||
<ConfigurationSelect OptionDescription="@T("Preselect one of your profiles?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.Coding.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.Coding.PreselectedProfile)" Data="@ConfigurationSelectDataFactory.GetProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Coding.PreselectedProfile = selectedValue)" OptionHelp="@T("Would you like to preselect one of your profiles?")"/>
|
<ConfigurationSelect OptionDescription="@T("Preselect a profile")" Disabled="@(() => !this.SettingsManager.ConfigurationData.Coding.PreselectOptions)" SelectedValue="@(() => ProfilePreselection.FromStoredValue(this.SettingsManager.ConfigurationData.Coding.PreselectedProfile))" Data="@ConfigurationSelectDataFactory.GetComponentProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.Coding.PreselectedProfile = selectedValue)" OptionHelp="@T("Choose whether the assistant should use the app default profile, no profile, or a specific profile.")"/>
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
<DialogActions>
|
<DialogActions>
|
||||||
<MudButton OnClick="@this.Close" Variant="Variant.Filled">Close</MudButton>
|
<MudButton OnClick="@this.Close" Variant="Variant.Filled">Close</MudButton>
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</MudDialog>
|
</MudDialog>
|
||||||
|
|||||||
@ -13,7 +13,7 @@
|
|||||||
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
||||||
<ConfigurationOption OptionDescription="@T("Preselect ERI server options?")" LabelOn="@T("ERI server options are preselected")" LabelOff="@T("No ERI server options are preselected")" State="@(() => this.SettingsManager.ConfigurationData.ERI.PreselectOptions)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.ERI.PreselectOptions = updatedState)" OptionHelp="@T("When enabled, you can preselect some ERI server options.")"/>
|
<ConfigurationOption OptionDescription="@T("Preselect ERI server options?")" LabelOn="@T("ERI server options are preselected")" LabelOff="@T("No ERI server options are preselected")" State="@(() => this.SettingsManager.ConfigurationData.ERI.PreselectOptions)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.ERI.PreselectOptions = updatedState)" OptionHelp="@T("When enabled, you can preselect some ERI server options.")"/>
|
||||||
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.ERI.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.ERI.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.ERI.MinimumProviderConfidence = selectedValue)"/>
|
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.ERI.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.ERI.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.ERI.MinimumProviderConfidence = selectedValue)"/>
|
||||||
<ConfigurationSelect OptionDescription="@T("Preselect one of your profiles?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.ERI.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.ERI.PreselectedProfile)" Data="@ConfigurationSelectDataFactory.GetProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.ERI.PreselectedProfile = selectedValue)" OptionHelp="@T("Would you like to preselect one of your profiles?")"/>
|
<ConfigurationSelect OptionDescription="@T("Preselect a profile")" Disabled="@(() => !this.SettingsManager.ConfigurationData.ERI.PreselectOptions)" SelectedValue="@(() => ProfilePreselection.FromStoredValue(this.SettingsManager.ConfigurationData.ERI.PreselectedProfile))" Data="@ConfigurationSelectDataFactory.GetComponentProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.ERI.PreselectedProfile = selectedValue)" OptionHelp="@T("Choose whether the assistant should use the app default profile, no profile, or a specific profile.")"/>
|
||||||
|
|
||||||
<MudText Typo="Typo.body1" Class="mb-3">
|
<MudText Typo="Typo.body1" Class="mb-3">
|
||||||
@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.")
|
@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.")
|
||||||
@ -25,4 +25,4 @@
|
|||||||
@T("Close")
|
@T("Close")
|
||||||
</MudButton>
|
</MudButton>
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</MudDialog>
|
</MudDialog>
|
||||||
|
|||||||
@ -15,7 +15,7 @@
|
|||||||
<ConfigurationOption OptionDescription="@T("Preselect the content cleaner agent?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.LegalCheck.PreselectOptions || this.SettingsManager.ConfigurationData.LegalCheck.HideWebContentReader)" LabelOn="@T("Content cleaner agent is preselected")" LabelOff="@T("Content cleaner agent is not preselected")" State="@(() => this.SettingsManager.ConfigurationData.LegalCheck.PreselectContentCleanerAgent)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.LegalCheck.PreselectContentCleanerAgent = updatedState)" OptionHelp="@T("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.")"/>
|
<ConfigurationOption OptionDescription="@T("Preselect the content cleaner agent?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.LegalCheck.PreselectOptions || this.SettingsManager.ConfigurationData.LegalCheck.HideWebContentReader)" LabelOn="@T("Content cleaner agent is preselected")" LabelOff="@T("Content cleaner agent is not preselected")" State="@(() => this.SettingsManager.ConfigurationData.LegalCheck.PreselectContentCleanerAgent)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.LegalCheck.PreselectContentCleanerAgent = updatedState)" OptionHelp="@T("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.")"/>
|
||||||
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.LegalCheck.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.LegalCheck.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.LegalCheck.MinimumProviderConfidence = selectedValue)"/>
|
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.LegalCheck.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.LegalCheck.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.LegalCheck.MinimumProviderConfidence = selectedValue)"/>
|
||||||
<ConfigurationProviderSelection Component="Components.LEGAL_CHECK_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.LegalCheck.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.LegalCheck.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.LegalCheck.PreselectedProvider = selectedValue)"/>
|
<ConfigurationProviderSelection Component="Components.LEGAL_CHECK_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.LegalCheck.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.LegalCheck.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.LegalCheck.PreselectedProvider = selectedValue)"/>
|
||||||
<ConfigurationSelect OptionDescription="@T("Preselect one of your profiles?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.LegalCheck.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.LegalCheck.PreselectedProfile)" Data="@ConfigurationSelectDataFactory.GetProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.LegalCheck.PreselectedProfile = selectedValue)" OptionHelp="@T("Would you like to preselect one of your profiles?")"/>
|
<ConfigurationSelect OptionDescription="@T("Preselect a profile")" Disabled="@(() => !this.SettingsManager.ConfigurationData.LegalCheck.PreselectOptions)" SelectedValue="@(() => ProfilePreselection.FromStoredValue(this.SettingsManager.ConfigurationData.LegalCheck.PreselectedProfile))" Data="@ConfigurationSelectDataFactory.GetComponentProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.LegalCheck.PreselectedProfile = selectedValue)" OptionHelp="@T("Choose whether the assistant should use the app default profile, no profile, or a specific profile.")"/>
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
<DialogActions>
|
<DialogActions>
|
||||||
@ -23,4 +23,4 @@
|
|||||||
@T("Close")
|
@T("Close")
|
||||||
</MudButton>
|
</MudButton>
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</MudDialog>
|
</MudDialog>
|
||||||
|
|||||||
@ -16,7 +16,7 @@
|
|||||||
{
|
{
|
||||||
<ConfigurationText OptionDescription="@T("Preselect another language")" Disabled="@(() => !this.SettingsManager.ConfigurationData.MyTasks.PreselectOptions)" Icon="@Icons.Material.Filled.Translate" Text="@(() => this.SettingsManager.ConfigurationData.MyTasks.PreselectOtherLanguage)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.MyTasks.PreselectOtherLanguage = updatedText)"/>
|
<ConfigurationText OptionDescription="@T("Preselect another language")" Disabled="@(() => !this.SettingsManager.ConfigurationData.MyTasks.PreselectOptions)" Icon="@Icons.Material.Filled.Translate" Text="@(() => this.SettingsManager.ConfigurationData.MyTasks.PreselectOtherLanguage)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.MyTasks.PreselectOtherLanguage = updatedText)"/>
|
||||||
}
|
}
|
||||||
<ConfigurationSelect OptionDescription="@T("Preselect one of your profiles?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.MyTasks.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.MyTasks.PreselectedProfile)" Data="@ConfigurationSelectDataFactory.GetProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.MyTasks.PreselectedProfile = selectedValue)" OptionHelp="@T("Would you like to preselect one of your profiles?")"/>
|
<ConfigurationSelect OptionDescription="@T("Preselect a profile")" Disabled="@(() => !this.SettingsManager.ConfigurationData.MyTasks.PreselectOptions)" SelectedValue="@(() => ProfilePreselection.FromStoredValue(this.SettingsManager.ConfigurationData.MyTasks.PreselectedProfile))" Data="@ConfigurationSelectDataFactory.GetComponentProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.MyTasks.PreselectedProfile = selectedValue)" OptionHelp="@T("Choose whether the assistant should use the app default profile, no profile, or a specific profile.")"/>
|
||||||
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.MyTasks.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.MyTasks.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.MyTasks.MinimumProviderConfidence = selectedValue)"/>
|
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.MyTasks.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.MyTasks.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.MyTasks.MinimumProviderConfidence = selectedValue)"/>
|
||||||
<ConfigurationProviderSelection Component="Components.MY_TASKS_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.MyTasks.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.MyTasks.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.MyTasks.PreselectedProvider = selectedValue)"/>
|
<ConfigurationProviderSelection Component="Components.MY_TASKS_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.MyTasks.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.MyTasks.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.MyTasks.PreselectedProvider = selectedValue)"/>
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
@ -26,4 +26,4 @@
|
|||||||
@T("Close")
|
@T("Close")
|
||||||
</MudButton>
|
</MudButton>
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</MudDialog>
|
</MudDialog>
|
||||||
|
|||||||
@ -0,0 +1,34 @@
|
|||||||
|
@using AIStudio.Settings
|
||||||
|
@inherits SettingsDialogBase
|
||||||
|
|
||||||
|
<MudDialog>
|
||||||
|
<TitleContent>
|
||||||
|
<MudText Typo="Typo.h6" Class="d-flex align-center">
|
||||||
|
<MudIcon Icon="@Icons.Material.Filled.Spellcheck" Class="mr-2" />
|
||||||
|
@T("Assistant: Slide Assistant Options")
|
||||||
|
</MudText>
|
||||||
|
</TitleContent>
|
||||||
|
<DialogContent>
|
||||||
|
<MudPaper Class="pa-3 mb-8 border-dashed border rounded-lg">
|
||||||
|
<ConfigurationOption OptionDescription="@T("Preselect Slide Assistant options?")" LabelOn="@T("Slide Assistant options are preselected")" LabelOff="@T("No Slide Assistant options are preselected")" State="@(() => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" StateUpdate="@(updatedState => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions = updatedState)" OptionHelp="@T("When enabled, you can preselect slide builder options. This is might be useful when you prefer a specific language or LLM model.")"/>
|
||||||
|
<ConfigurationText OptionDescription="@T("Preselect important aspects")" Disabled="@(() => !this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" Text="@(() => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedImportantAspects)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedImportantAspects = updatedText)" NumLines="2" OptionHelp="@T("Preselect aspects for the LLM to focus on when generating slides, such as bullet points or specific topics to emphasize.")" Icon="@Icons.Material.Filled.List"/>
|
||||||
|
<ConfigurationSelect OptionDescription="@T("Preselect the language")" Disabled="@(() => !this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedTargetLanguage)" Data="@ConfigurationSelectDataFactory.GetCommonLanguagesOptionalData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedTargetLanguage = selectedValue)" OptionHelp="@T("Which language should be preselected?")"/>
|
||||||
|
@if (this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedTargetLanguage is CommonLanguages.OTHER)
|
||||||
|
{
|
||||||
|
<ConfigurationText OptionDescription="@T("Preselect another language")" Disabled="@(() => !this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" Icon="@Icons.Material.Filled.Translate" Text="@(() => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedOtherLanguage)" TextUpdate="@(updatedText => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedOtherLanguage = updatedText)"/>
|
||||||
|
}
|
||||||
|
<ConfigurationSelect OptionDescription="@T("Preselect the audience profile")" Disabled="@(() => !this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceProfile)" Data="@ConfigurationSelectDataFactory.GetSlideBuilderAudienceProfileData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceProfile = selectedValue)" OptionHelp="@T("Which audience profile should be preselected?")"/>
|
||||||
|
<ConfigurationSelect OptionDescription="@T("Preselect the audience age group")" Disabled="@(() => !this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceAgeGroup)" Data="@ConfigurationSelectDataFactory.GetSlideBuilderAudienceAgeGroupData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceAgeGroup = selectedValue)" OptionHelp="@T("Which audience age group should be preselected?")"/>
|
||||||
|
<ConfigurationSelect OptionDescription="@T("Preselect the audience organizational level")" Disabled="@(() => !this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceOrganizationalLevel)" Data="@ConfigurationSelectDataFactory.GetSlideBuilderAudienceOrganizationalLevelData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceOrganizationalLevel = selectedValue)" OptionHelp="@T("Which audience organizational level should be preselected?")"/>
|
||||||
|
<ConfigurationSelect OptionDescription="@T("Preselect the audience expertise")" Disabled="@(() => !this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceExpertise)" Data="@ConfigurationSelectDataFactory.GetSlideBuilderAudienceExpertiseData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedAudienceExpertise = selectedValue)" OptionHelp="@T("Which audience expertise should be preselected?")"/>
|
||||||
|
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.SlideBuilder.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.SlideBuilder.MinimumProviderConfidence = selectedValue)"/>
|
||||||
|
<ConfigurationProviderSelection Component="Components.SLIDE_BUILDER_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedProvider = selectedValue)"/>
|
||||||
|
<ConfigurationSelect OptionDescription="@T("Preselect a profile")" Disabled="@(() => !this.SettingsManager.ConfigurationData.SlideBuilder.PreselectOptions)" SelectedValue="@(() => ProfilePreselection.FromStoredValue(this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedProfile))" Data="@ConfigurationSelectDataFactory.GetComponentProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.SlideBuilder.PreselectedProfile = selectedValue)" OptionHelp="@T("Choose whether the assistant should use the app default profile, no profile, or a specific profile.")"/>
|
||||||
|
</MudPaper>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<MudButton OnClick="@this.Close" Variant="Variant.Filled">
|
||||||
|
@T("Close")
|
||||||
|
</MudButton>
|
||||||
|
</DialogActions>
|
||||||
|
</MudDialog>
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
namespace AIStudio.Dialogs.Settings;
|
||||||
|
|
||||||
|
public partial class SettingsDialogSlideBuilder : SettingsDialogBase;
|
||||||
@ -21,7 +21,7 @@
|
|||||||
<ConfigurationSelect OptionDescription="@T("Preselect a writing style")" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.EMail.PreselectedWritingStyle)" Data="@ConfigurationSelectDataFactory.GetWritingStyles4EMailData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.PreselectedWritingStyle = selectedValue)" OptionHelp="@T("Which writing style should be preselected?")"/>
|
<ConfigurationSelect OptionDescription="@T("Preselect a writing style")" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.EMail.PreselectedWritingStyle)" Data="@ConfigurationSelectDataFactory.GetWritingStyles4EMailData()" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.PreselectedWritingStyle = selectedValue)" OptionHelp="@T("Which writing style should be preselected?")"/>
|
||||||
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.EMail.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.MinimumProviderConfidence = selectedValue)"/>
|
<ConfigurationMinConfidenceSelection Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" RestrictToGlobalMinimumConfidence="@true" SelectedValue="@(() => this.SettingsManager.ConfigurationData.EMail.MinimumProviderConfidence)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.MinimumProviderConfidence = selectedValue)"/>
|
||||||
<ConfigurationProviderSelection Component="Components.EMAIL_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.EMail.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.PreselectedProvider = selectedValue)"/>
|
<ConfigurationProviderSelection Component="Components.EMAIL_ASSISTANT" Data="@this.availableLLMProviders" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.EMail.PreselectedProvider)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.PreselectedProvider = selectedValue)"/>
|
||||||
<ConfigurationSelect OptionDescription="@T("Preselect one of your profiles?")" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" SelectedValue="@(() => this.SettingsManager.ConfigurationData.EMail.PreselectedProfile)" Data="@ConfigurationSelectDataFactory.GetProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.PreselectedProfile = selectedValue)" OptionHelp="@T("Would you like to preselect one of your profiles?")"/>
|
<ConfigurationSelect OptionDescription="@T("Preselect a profile")" Disabled="@(() => !this.SettingsManager.ConfigurationData.EMail.PreselectOptions)" SelectedValue="@(() => ProfilePreselection.FromStoredValue(this.SettingsManager.ConfigurationData.EMail.PreselectedProfile))" Data="@ConfigurationSelectDataFactory.GetComponentProfilesData(this.SettingsManager.ConfigurationData.Profiles)" SelectionUpdate="@(selectedValue => this.SettingsManager.ConfigurationData.EMail.PreselectedProfile = selectedValue)" OptionHelp="@T("Choose whether the assistant should use the app default profile, no profile, or a specific profile.")"/>
|
||||||
</MudPaper>
|
</MudPaper>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
<DialogActions>
|
<DialogActions>
|
||||||
@ -29,4 +29,4 @@
|
|||||||
@T("Close")
|
@T("Close")
|
||||||
</MudButton>
|
</MudButton>
|
||||||
</DialogActions>
|
</DialogActions>
|
||||||
</MudDialog>
|
</MudDialog>
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
<MudIcon Icon="@Icons.Material.Filled.Update" Size="Size.Large" Class="mr-3"/>
|
<MudIcon Icon="@Icons.Material.Filled.Update" Size="Size.Large" Class="mr-3"/>
|
||||||
@this.HeaderText
|
@this.HeaderText
|
||||||
</MudText>
|
</MudText>
|
||||||
<MudMarkdown Value="@this.UpdateResponse.Changelog" Props="Markdown.DefaultConfig"/>
|
<MudMarkdown Value="@this.UpdateResponse.Changelog" Props="Markdown.DefaultConfig" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE"/>
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
<DialogActions>
|
<DialogActions>
|
||||||
<MudButton OnClick="@this.Cancel" Variant="Variant.Filled">
|
<MudButton OnClick="@this.Cancel" Variant="Variant.Filled">
|
||||||
|
|||||||
@ -1,7 +1,4 @@
|
|||||||
using System.Text;
|
|
||||||
|
|
||||||
using AIStudio.Components;
|
using AIStudio.Components;
|
||||||
using AIStudio.Settings;
|
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
|
|
||||||
@ -29,25 +26,10 @@ public partial class WorkspaceSelectionDialog : MSGComponentBase
|
|||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
this.selectedWorkspace = this.SelectedWorkspace;
|
this.selectedWorkspace = this.SelectedWorkspace;
|
||||||
|
|
||||||
// Get the workspace root directory:
|
|
||||||
var workspaceDirectories = Path.Join(SettingsManager.DataDirectory, "workspaces");
|
|
||||||
if(!Directory.Exists(workspaceDirectories))
|
|
||||||
{
|
|
||||||
await base.OnInitializedAsync();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enumerate the workspace directories:
|
var snapshot = await WorkspaceBehaviour.GetOrLoadWorkspaceTreeShellAsync();
|
||||||
foreach (var workspaceDirPath in Directory.EnumerateDirectories(workspaceDirectories))
|
foreach (var workspace in snapshot.Workspaces)
|
||||||
{
|
this.workspaces[workspace.Name] = workspace.WorkspaceId;
|
||||||
// Read the `name` file:
|
|
||||||
var workspaceNamePath = Path.Join(workspaceDirPath, "name");
|
|
||||||
var workspaceName = await File.ReadAllTextAsync(workspaceNamePath, Encoding.UTF8);
|
|
||||||
|
|
||||||
// Add the workspace to the list:
|
|
||||||
this.workspaces.Add(workspaceName, Guid.Parse(Path.GetFileName(workspaceDirPath)));
|
|
||||||
}
|
|
||||||
|
|
||||||
this.StateHasChanged();
|
this.StateHasChanged();
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
|
|||||||
@ -97,7 +97,6 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, ILan
|
|||||||
|
|
||||||
// Set the snackbar for the update service:
|
// Set the snackbar for the update service:
|
||||||
UpdateService.SetBlazorDependencies(this.Snackbar);
|
UpdateService.SetBlazorDependencies(this.Snackbar);
|
||||||
GlobalShortcutService.Initialize();
|
|
||||||
TemporaryChatService.Initialize();
|
TemporaryChatService.Initialize();
|
||||||
|
|
||||||
// Should the navigation bar be open by default?
|
// Should the navigation bar be open by default?
|
||||||
@ -251,6 +250,7 @@ public partial class MainLayout : LayoutComponentBase, IMessageBusReceiver, ILan
|
|||||||
|
|
||||||
// Set up hot reloading for plugins:
|
// Set up hot reloading for plugins:
|
||||||
PluginFactory.SetUpHotReloading();
|
PluginFactory.SetUpHotReloading();
|
||||||
|
await this.MessageBus.SendMessage<bool>(this, Event.STARTUP_COMPLETED);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -49,7 +49,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CodeBeam.MudBlazor.Extensions" Version="8.3.0" />
|
<PackageReference Include="CodeBeam.MudBlazor.Extensions" Version="8.3.0" />
|
||||||
<PackageReference Include="HtmlAgilityPack" Version="1.12.4" />
|
<PackageReference Include="HtmlAgilityPack" Version="1.12.4" />
|
||||||
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="9.0.12" />
|
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="9.0.14" />
|
||||||
<PackageReference Include="MudBlazor" Version="8.15.0" />
|
<PackageReference Include="MudBlazor" Version="8.15.0" />
|
||||||
<PackageReference Include="MudBlazor.Markdown" Version="8.11.0" />
|
<PackageReference Include="MudBlazor.Markdown" Version="8.11.0" />
|
||||||
<PackageReference Include="Qdrant.Client" Version="1.17.0" />
|
<PackageReference Include="Qdrant.Client" Version="1.17.0" />
|
||||||
|
|||||||
@ -32,12 +32,13 @@
|
|||||||
|
|
||||||
@if (this.SettingsManager.IsAnyCategoryAssistantVisible("Business",
|
@if (this.SettingsManager.IsAnyCategoryAssistantVisible("Business",
|
||||||
(Components.EMAIL_ASSISTANT, PreviewFeatures.NONE),
|
(Components.EMAIL_ASSISTANT, PreviewFeatures.NONE),
|
||||||
(Components.DOCUMENT_ANALYSIS_ASSISTANT, PreviewFeatures.PRE_DOCUMENT_ANALYSIS_2025),
|
(Components.DOCUMENT_ANALYSIS_ASSISTANT, PreviewFeatures.NONE),
|
||||||
(Components.MY_TASKS_ASSISTANT, PreviewFeatures.NONE),
|
(Components.MY_TASKS_ASSISTANT, PreviewFeatures.NONE),
|
||||||
(Components.AGENDA_ASSISTANT, PreviewFeatures.NONE),
|
(Components.AGENDA_ASSISTANT, PreviewFeatures.NONE),
|
||||||
(Components.JOB_POSTING_ASSISTANT, PreviewFeatures.NONE),
|
(Components.JOB_POSTING_ASSISTANT, PreviewFeatures.NONE),
|
||||||
(Components.LEGAL_CHECK_ASSISTANT, PreviewFeatures.NONE),
|
(Components.LEGAL_CHECK_ASSISTANT, PreviewFeatures.NONE),
|
||||||
(Components.ICON_FINDER_ASSISTANT, PreviewFeatures.NONE)
|
(Components.ICON_FINDER_ASSISTANT, PreviewFeatures.NONE),
|
||||||
|
(Components.SLIDE_BUILDER_ASSISTANT, PreviewFeatures.NONE)
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
<MudText Typo="Typo.h4" Class="mb-2 mr-3 mt-6">
|
<MudText Typo="Typo.h4" Class="mb-2 mr-3 mt-6">
|
||||||
@ -45,12 +46,13 @@
|
|||||||
</MudText>
|
</MudText>
|
||||||
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
<MudStack Row="@true" Wrap="@Wrap.Wrap" Class="mb-3">
|
||||||
<AssistantBlock TSettings="SettingsDialogWritingEMails" Component="Components.EMAIL_ASSISTANT" Name="@T("E-Mail")" Description="@T("Generate an e-mail for a given context.")" Icon="@Icons.Material.Filled.Email" Link="@Routes.ASSISTANT_EMAIL"/>
|
<AssistantBlock TSettings="SettingsDialogWritingEMails" Component="Components.EMAIL_ASSISTANT" Name="@T("E-Mail")" Description="@T("Generate an e-mail for a given context.")" Icon="@Icons.Material.Filled.Email" Link="@Routes.ASSISTANT_EMAIL"/>
|
||||||
<AssistantBlock TSettings="NoSettingsPanel" Component="Components.DOCUMENT_ANALYSIS_ASSISTANT" RequiredPreviewFeature="PreviewFeatures.PRE_DOCUMENT_ANALYSIS_2025" Name="@T("Document Analysis")" Description="@T("Analyze a document regarding defined rules and extract key information.")" Icon="@Icons.Material.Filled.DocumentScanner" Link="@Routes.ASSISTANT_DOCUMENT_ANALYSIS"/>
|
<AssistantBlock TSettings="NoSettingsPanel" Component="Components.DOCUMENT_ANALYSIS_ASSISTANT" Name="@T("Document Analysis")" Description="@T("Analyze a document regarding defined rules and extract key information.")" Icon="@Icons.Material.Filled.DocumentScanner" Link="@Routes.ASSISTANT_DOCUMENT_ANALYSIS"/>
|
||||||
<AssistantBlock TSettings="SettingsDialogMyTasks" Component="Components.MY_TASKS_ASSISTANT" Name="@T("My Tasks")" Description="@T("Analyze a text or an email for tasks you need to complete.")" Icon="@Icons.Material.Filled.Task" Link="@Routes.ASSISTANT_MY_TASKS"/>
|
<AssistantBlock TSettings="SettingsDialogMyTasks" Component="Components.MY_TASKS_ASSISTANT" Name="@T("My Tasks")" Description="@T("Analyze a text or an email for tasks you need to complete.")" Icon="@Icons.Material.Filled.Task" Link="@Routes.ASSISTANT_MY_TASKS"/>
|
||||||
<AssistantBlock TSettings="SettingsDialogAgenda" Component="Components.AGENDA_ASSISTANT" Name="@T("Agenda Planner")" Description="@T("Generate an agenda for a given meeting, seminar, etc.")" Icon="@Icons.Material.Filled.CalendarToday" Link="@Routes.ASSISTANT_AGENDA"/>
|
<AssistantBlock TSettings="SettingsDialogAgenda" Component="Components.AGENDA_ASSISTANT" Name="@T("Agenda Planner")" Description="@T("Generate an agenda for a given meeting, seminar, etc.")" Icon="@Icons.Material.Filled.CalendarToday" Link="@Routes.ASSISTANT_AGENDA"/>
|
||||||
<AssistantBlock TSettings="SettingsDialogJobPostings" Component="Components.JOB_POSTING_ASSISTANT" Name="@T("Job Posting")" Description="@T("Generate a job posting for a given job description.")" Icon="@Icons.Material.Filled.Work" Link="@Routes.ASSISTANT_JOB_POSTING"/>
|
<AssistantBlock TSettings="SettingsDialogJobPostings" Component="Components.JOB_POSTING_ASSISTANT" Name="@T("Job Posting")" Description="@T("Generate a job posting for a given job description.")" Icon="@Icons.Material.Filled.Work" Link="@Routes.ASSISTANT_JOB_POSTING"/>
|
||||||
<AssistantBlock TSettings="SettingsDialogLegalCheck" Component="Components.LEGAL_CHECK_ASSISTANT" Name="@T("Legal Check")" Description="@T("Ask a question about a legal document.")" Icon="@Icons.Material.Filled.Gavel" Link="@Routes.ASSISTANT_LEGAL_CHECK"/>
|
<AssistantBlock TSettings="SettingsDialogLegalCheck" Component="Components.LEGAL_CHECK_ASSISTANT" Name="@T("Legal Check")" Description="@T("Ask a question about a legal document.")" Icon="@Icons.Material.Filled.Gavel" Link="@Routes.ASSISTANT_LEGAL_CHECK"/>
|
||||||
<AssistantBlock TSettings="SettingsDialogIconFinder" Component="Components.ICON_FINDER_ASSISTANT" Name="@T("Icon Finder")" Description="@T("Use an LLM to find an icon for a given context.")" Icon="@Icons.Material.Filled.FindInPage" Link="@Routes.ASSISTANT_ICON_FINDER"/>
|
<AssistantBlock TSettings="SettingsDialogIconFinder" Component="Components.ICON_FINDER_ASSISTANT" Name="@T("Icon Finder")" Description="@T("Use an LLM to find an icon for a given context.")" Icon="@Icons.Material.Filled.FindInPage" Link="@Routes.ASSISTANT_ICON_FINDER"/>
|
||||||
|
<AssistantBlock TSettings="SettingsDialogSlideBuilder" Component="Components.SLIDE_BUILDER_ASSISTANT" Name="@T("Slide Assistant")" Description="@T("Develop slide content based on a given topic and content.")" Icon="@Icons.Material.Filled.Slideshow" Link="@Routes.ASSISTANT_SLIDE_BUILDER"/>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -48,6 +48,9 @@
|
|||||||
<MudTooltip Text="@T("Configure your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
<MudTooltip Text="@T("Configure your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Settings" Size="Size.Medium" OnClick="@(async () => await this.OpenWorkspacesSettingsDialog())"/>
|
<MudIconButton Icon="@Icons.Material.Filled.Settings" Size="Size.Medium" OnClick="@(async () => await this.OpenWorkspacesSettingsDialog())"/>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
|
<MudTooltip Text="@T("Reload your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Refresh" Size="Size.Medium" OnClick="@this.RefreshWorkspaces"/>
|
||||||
|
</MudTooltip>
|
||||||
<MudTooltip Text="@T("Hide your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
<MudTooltip Text="@T("Hide your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
<MudIconButton Size="Size.Medium" Icon="@this.WorkspaceSidebarToggleIcon" Class="me-1" OnClick="@(() => this.ToggleWorkspaceSidebar())"/>
|
<MudIconButton Size="Size.Medium" Icon="@this.WorkspaceSidebarToggleIcon" Class="me-1" OnClick="@(() => this.ToggleWorkspaceSidebar())"/>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
@ -71,6 +74,9 @@
|
|||||||
<MudTooltip Text="@T("Configure your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
<MudTooltip Text="@T("Configure your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Settings" Size="Size.Medium" OnClick="@(async () => await this.OpenWorkspacesSettingsDialog())"/>
|
<MudIconButton Icon="@Icons.Material.Filled.Settings" Size="Size.Medium" OnClick="@(async () => await this.OpenWorkspacesSettingsDialog())"/>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
|
<MudTooltip Text="@T("Reload your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Refresh" Size="Size.Medium" OnClick="@this.RefreshWorkspaces"/>
|
||||||
|
</MudTooltip>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
</HeaderContent>
|
</HeaderContent>
|
||||||
<ChildContent>
|
<ChildContent>
|
||||||
@ -137,6 +143,9 @@
|
|||||||
<MudTooltip Text="@T("Configure your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
<MudTooltip Text="@T("Configure your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Settings" Size="Size.Medium" OnClick="@(async () => await this.OpenWorkspacesSettingsDialog())"/>
|
<MudIconButton Icon="@Icons.Material.Filled.Settings" Size="Size.Medium" OnClick="@(async () => await this.OpenWorkspacesSettingsDialog())"/>
|
||||||
</MudTooltip>
|
</MudTooltip>
|
||||||
|
<MudTooltip Text="@T("Reload your workspaces")" Placement="@TOOLBAR_TOOLTIP_PLACEMENT">
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Refresh" Size="Size.Medium" OnClick="@this.RefreshWorkspaces"/>
|
||||||
|
</MudTooltip>
|
||||||
<MudIconButton Icon="@Icons.Material.Filled.Close" Color="Color.Error" Size="Size.Medium" OnClick="@(() => this.ToggleWorkspacesOverlay())"/>
|
<MudIconButton Icon="@Icons.Material.Filled.Close" Color="Color.Error" Size="Size.Medium" OnClick="@(() => this.ToggleWorkspacesOverlay())"/>
|
||||||
</MudStack>
|
</MudStack>
|
||||||
</MudDrawerHeader>
|
</MudDrawerHeader>
|
||||||
|
|||||||
@ -98,6 +98,14 @@ public partial class Chat : MSGComponentBase
|
|||||||
await this.DialogService.ShowAsync<SettingsDialogWorkspaces>(T("Open Workspaces Configuration"), dialogParameters, DialogOptions.FULLSCREEN);
|
await this.DialogService.ShowAsync<SettingsDialogWorkspaces>(T("Open Workspaces Configuration"), dialogParameters, DialogOptions.FULLSCREEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task RefreshWorkspaces()
|
||||||
|
{
|
||||||
|
if (this.workspaces is null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
await this.workspaces.ForceRefreshFromDiskAsync();
|
||||||
|
}
|
||||||
|
|
||||||
#region Overrides of MSGComponentBase
|
#region Overrides of MSGComponentBase
|
||||||
|
|
||||||
protected override void DisposeResources()
|
protected override void DisposeResources()
|
||||||
|
|||||||
@ -27,7 +27,7 @@
|
|||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
|
|
||||||
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.EventNote" HeaderText="@T("Last Changelog")">
|
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.EventNote" HeaderText="@T("Last Changelog")">
|
||||||
<MudMarkdown Value="@this.LastChangeContent" Props="Markdown.DefaultConfig"/>
|
<MudMarkdown Value="@this.LastChangeContent" Props="Markdown.DefaultConfig" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE"/>
|
||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
|
|
||||||
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.Lightbulb" HeaderText="@T("Vision")">
|
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.Lightbulb" HeaderText="@T("Vision")">
|
||||||
@ -35,7 +35,7 @@
|
|||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
|
|
||||||
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.RocketLaunch" HeaderText="@T("Quick Start Guide")">
|
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.RocketLaunch" HeaderText="@T("Quick Start Guide")">
|
||||||
<MudMarkdown Props="Markdown.DefaultConfig" Value="@QUICK_START_GUIDE"/>
|
<MudMarkdown Props="Markdown.DefaultConfig" Value="@QUICK_START_GUIDE" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE"/>
|
||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
|
|
||||||
</MudExpansionPanels>
|
</MudExpansionPanels>
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
using AIStudio.Components;
|
using AIStudio.Components;
|
||||||
|
using AIStudio.Settings.DataModel;
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
|
|
||||||
@ -10,6 +11,9 @@ public partial class Home : MSGComponentBase
|
|||||||
{
|
{
|
||||||
[Inject]
|
[Inject]
|
||||||
private HttpClient HttpClient { get; init; } = null!;
|
private HttpClient HttpClient { get; init; } = null!;
|
||||||
|
|
||||||
|
[Inject]
|
||||||
|
private NavigationManager NavigationManager { get; init; } = null!;
|
||||||
|
|
||||||
private string LastChangeContent { get; set; } = string.Empty;
|
private string LastChangeContent { get; set; } = string.Empty;
|
||||||
|
|
||||||
@ -27,6 +31,19 @@ public partial class Home : MSGComponentBase
|
|||||||
_ = this.ReadLastChangeAsync();
|
_ = this.ReadLastChangeAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override Task OnAfterRenderAsync(bool firstRender)
|
||||||
|
{
|
||||||
|
if (this.SettingsManager.StartupStartPageRedirectHandled || !this.SettingsManager.HasCompletedInitialSettingsLoad)
|
||||||
|
return base.OnAfterRenderAsync(firstRender);
|
||||||
|
|
||||||
|
this.SettingsManager.StartupStartPageRedirectHandled = true;
|
||||||
|
var startPageRoute = this.SettingsManager.ConfigurationData.App.StartPage.ToRoute();
|
||||||
|
if (!string.IsNullOrWhiteSpace(startPageRoute))
|
||||||
|
this.NavigationManager.NavigateTo(startPageRoute, replace: true);
|
||||||
|
|
||||||
|
return base.OnAfterRenderAsync(firstRender);
|
||||||
|
}
|
||||||
|
|
||||||
private void InitializeAdvantagesItems()
|
private void InitializeAdvantagesItems()
|
||||||
{
|
{
|
||||||
this.itemsAdvantages = [
|
this.itemsAdvantages = [
|
||||||
@ -95,7 +112,7 @@ public partial class Home : MSGComponentBase
|
|||||||
## Step 4: Load OpenAI Models
|
## Step 4: Load OpenAI Models
|
||||||
1. Ensure you have an internet connection and your API key is valid.
|
1. Ensure you have an internet connection and your API key is valid.
|
||||||
2. Click "Reload" to retrieve a list of available OpenAI models.
|
2. Click "Reload" to retrieve a list of available OpenAI models.
|
||||||
3. Select "gpt-4o" to use the latest model.
|
3. Select "gpt-5.4" to use a current model.
|
||||||
4. Provide a name for this combination of provider, API key, and model. This is called the "instance name". For example, you can name it based on the usage context, such as "Personal OpenAI" or "Work OpenAI".
|
4. Provide a name for this combination of provider, API key, and model. This is called the "instance name". For example, you can name it based on the usage context, such as "Personal OpenAI" or "Work OpenAI".
|
||||||
|
|
||||||
## Step 5: Save the Provider
|
## Step 5: Save the Provider
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
@attribute [Route(Routes.ABOUT)]
|
@attribute [Route(Routes.ABOUT)]
|
||||||
@using AIStudio.Tools.PluginSystem
|
@using AIStudio.Tools.PluginSystem
|
||||||
@using AIStudio.Tools.Services
|
|
||||||
@inherits MSGComponentBase
|
@inherits MSGComponentBase
|
||||||
|
|
||||||
<div class="inner-scrolling-context">
|
<div class="inner-scrolling-context">
|
||||||
@ -85,7 +84,7 @@
|
|||||||
@T("AI Studio runs with an enterprise configuration and configuration servers. The configuration plugins are not yet available.")
|
@T("AI Studio runs with an enterprise configuration and configuration servers. The configuration plugins are not yet available.")
|
||||||
</MudText>
|
</MudText>
|
||||||
<MudCollapse Expanded="@this.showEnterpriseConfigDetails">
|
<MudCollapse Expanded="@this.showEnterpriseConfigDetails">
|
||||||
@foreach (var env in EnterpriseEnvironmentService.CURRENT_ENVIRONMENTS.Where(e => e.IsActive))
|
@foreach (var env in this.enterpriseEnvironments.Where(e => e.IsActive))
|
||||||
{
|
{
|
||||||
<ConfigPluginInfoCard HeaderIcon="@Icons.Material.Filled.HourglassBottom"
|
<ConfigPluginInfoCard HeaderIcon="@Icons.Material.Filled.HourglassBottom"
|
||||||
HeaderText="@T("Waiting for the configuration plugin...")"
|
HeaderText="@T("Waiting for the configuration plugin...")"
|
||||||
@ -123,7 +122,7 @@
|
|||||||
</MudText>
|
</MudText>
|
||||||
}
|
}
|
||||||
<MudCollapse Expanded="@this.showEnterpriseConfigDetails">
|
<MudCollapse Expanded="@this.showEnterpriseConfigDetails">
|
||||||
@foreach (var env in EnterpriseEnvironmentService.CURRENT_ENVIRONMENTS.Where(e => e.IsActive))
|
@foreach (var env in this.enterpriseEnvironments.Where(e => e.IsActive))
|
||||||
{
|
{
|
||||||
var matchingPlugin = this.FindManagedConfigurationPlugin(env.ConfigurationId);
|
var matchingPlugin = this.FindManagedConfigurationPlugin(env.ConfigurationId);
|
||||||
if (matchingPlugin is null)
|
if (matchingPlugin is null)
|
||||||
@ -297,8 +296,8 @@
|
|||||||
</MudGrid>
|
</MudGrid>
|
||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.Verified" HeaderText="License: FSL-1.1-MIT">
|
<ExpansionPanel HeaderIcon="@Icons.Material.Filled.Verified" HeaderText="License: FSL-1.1-MIT">
|
||||||
<MudMarkdown Value="@LICENSE" Props="Markdown.DefaultConfig"/>
|
<MudMarkdown Value="@LICENSE" Props="Markdown.DefaultConfig" MarkdownPipeline="Markdown.SAFE_MARKDOWN_PIPELINE"/>
|
||||||
</ExpansionPanel>
|
</ExpansionPanel>
|
||||||
</MudExpansionPanels>
|
</MudExpansionPanels>
|
||||||
</InnerScrolling>
|
</InnerScrolling>
|
||||||
</div>
|
</div>
|
||||||
@ -58,7 +58,9 @@ public partial class Information : MSGComponentBase
|
|||||||
|
|
||||||
private string VersionPdfium => $"{T("Used PDFium version")}: v{META_DATA_LIBRARIES.PdfiumVersion}";
|
private string VersionPdfium => $"{T("Used PDFium version")}: v{META_DATA_LIBRARIES.PdfiumVersion}";
|
||||||
|
|
||||||
private string VersionDatabase => $"{T("Database version")}: {this.DatabaseClient.Name} v{META_DATA_DATABASES.DatabaseVersion}";
|
private string VersionDatabase => this.DatabaseClient.IsAvailable
|
||||||
|
? $"{T("Database version")}: {this.DatabaseClient.Name} v{META_DATA_DATABASES.DatabaseVersion}"
|
||||||
|
: $"{T("Database")}: {this.DatabaseClient.Name} - {T("not available")}";
|
||||||
|
|
||||||
private string versionPandoc = TB("Determine Pandoc version, please wait...");
|
private string versionPandoc = TB("Determine Pandoc version, please wait...");
|
||||||
private PandocInstallation pandocInstallation;
|
private PandocInstallation pandocInstallation;
|
||||||
@ -73,14 +75,16 @@ public partial class Information : MSGComponentBase
|
|||||||
.Where(x => x.Type is PluginType.CONFIGURATION)
|
.Where(x => x.Type is PluginType.CONFIGURATION)
|
||||||
.OfType<IAvailablePlugin>()
|
.OfType<IAvailablePlugin>()
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
private List<EnterpriseEnvironment> enterpriseEnvironments = EnterpriseEnvironmentService.CURRENT_ENVIRONMENTS.ToList();
|
||||||
|
|
||||||
private sealed record DatabaseDisplayInfo(string Label, string Value);
|
private sealed record DatabaseDisplayInfo(string Label, string Value);
|
||||||
|
|
||||||
private readonly List<DatabaseDisplayInfo> databaseDisplayInfo = new();
|
private readonly List<DatabaseDisplayInfo> databaseDisplayInfo = new();
|
||||||
|
|
||||||
private static bool HasAnyActiveEnvironment => EnterpriseEnvironmentService.CURRENT_ENVIRONMENTS.Any(e => e.IsActive);
|
private bool HasAnyActiveEnvironment => this.enterpriseEnvironments.Any(e => e.IsActive);
|
||||||
|
|
||||||
private bool HasAnyLoadedEnterpriseConfigurationPlugin => EnterpriseEnvironmentService.CURRENT_ENVIRONMENTS
|
private bool HasAnyLoadedEnterpriseConfigurationPlugin => this.enterpriseEnvironments
|
||||||
.Where(e => e.IsActive)
|
.Where(e => e.IsActive)
|
||||||
.Any(env => this.FindManagedConfigurationPlugin(env.ConfigurationId) is not null);
|
.Any(env => this.FindManagedConfigurationPlugin(env.ConfigurationId) is not null);
|
||||||
|
|
||||||
@ -92,7 +96,7 @@ public partial class Information : MSGComponentBase
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return HasAnyActiveEnvironment switch
|
return this.HasAnyActiveEnvironment switch
|
||||||
{
|
{
|
||||||
// Case 1: No enterprise config and no plugin - no details available
|
// Case 1: No enterprise config and no plugin - no details available
|
||||||
false when this.configPlugins.Count == 0 => false,
|
false when this.configPlugins.Count == 0 => false,
|
||||||
@ -113,7 +117,10 @@ public partial class Information : MSGComponentBase
|
|||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
|
this.ApplyFilters([], [ Event.ENTERPRISE_ENVIRONMENTS_CHANGED ]);
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
|
|
||||||
|
this.RefreshEnterpriseConfigurationState();
|
||||||
|
|
||||||
this.osLanguage = await this.RustService.ReadUserLanguage();
|
this.osLanguage = await this.RustService.ReadUserLanguage();
|
||||||
this.logPaths = await this.RustService.GetLogPaths();
|
this.logPaths = await this.RustService.GetLogPaths();
|
||||||
@ -137,10 +144,8 @@ public partial class Information : MSGComponentBase
|
|||||||
switch (triggeredEvent)
|
switch (triggeredEvent)
|
||||||
{
|
{
|
||||||
case Event.PLUGINS_RELOADED:
|
case Event.PLUGINS_RELOADED:
|
||||||
this.configPlugins = PluginFactory.AvailablePlugins
|
case Event.ENTERPRISE_ENVIRONMENTS_CHANGED:
|
||||||
.Where(x => x.Type is PluginType.CONFIGURATION)
|
this.RefreshEnterpriseConfigurationState();
|
||||||
.OfType<IAvailablePlugin>()
|
|
||||||
.ToList();
|
|
||||||
await this.InvokeAsync(this.StateHasChanged);
|
await this.InvokeAsync(this.StateHasChanged);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -150,6 +155,16 @@ public partial class Information : MSGComponentBase
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
private void RefreshEnterpriseConfigurationState()
|
||||||
|
{
|
||||||
|
this.configPlugins = PluginFactory.AvailablePlugins
|
||||||
|
.Where(x => x.Type is PluginType.CONFIGURATION)
|
||||||
|
.OfType<IAvailablePlugin>()
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
this.enterpriseEnvironments = EnterpriseEnvironmentService.CURRENT_ENVIRONMENTS.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
private async Task DeterminePandocVersion()
|
private async Task DeterminePandocVersion()
|
||||||
{
|
{
|
||||||
this.pandocInstallation = await Pandoc.CheckAvailabilityAsync(this.RustService, false);
|
this.pandocInstallation = await Pandoc.CheckAvailabilityAsync(this.RustService, false);
|
||||||
|
|||||||
@ -146,6 +146,16 @@ CONFIG["SETTINGS"] = {}
|
|||||||
-- Allowed values are: MANUAL, AUTOMATIC
|
-- Allowed values are: MANUAL, AUTOMATIC
|
||||||
-- CONFIG["SETTINGS"]["DataApp.UpdateInstallation"] = "MANUAL"
|
-- CONFIG["SETTINGS"]["DataApp.UpdateInstallation"] = "MANUAL"
|
||||||
|
|
||||||
|
-- Configure the page that should be opened when AI Studio starts.
|
||||||
|
-- Allowed values are: HOME, CHAT, ASSISTANTS, INFORMATION, PLUGINS, SUPPORTERS, SETTINGS
|
||||||
|
-- CONFIG["SETTINGS"]["DataApp.StartPage"] = "CHAT"
|
||||||
|
--
|
||||||
|
-- Allow users to change the configured start page locally.
|
||||||
|
-- Allowed values are: true, false
|
||||||
|
-- When set to true, the configured start page becomes the organization default,
|
||||||
|
-- but users can still choose another start page in the app settings.
|
||||||
|
-- CONFIG["SETTINGS"]["DataApp.StartPage.AllowUserOverride"] = true
|
||||||
|
|
||||||
-- Configure the user permission to add providers:
|
-- Configure the user permission to add providers:
|
||||||
-- Allowed values are: true, false
|
-- Allowed values are: true, false
|
||||||
-- CONFIG["SETTINGS"]["DataApp.AllowUserToAddProvider"] = false
|
-- CONFIG["SETTINGS"]["DataApp.AllowUserToAddProvider"] = false
|
||||||
@ -163,8 +173,8 @@ CONFIG["SETTINGS"] = {}
|
|||||||
|
|
||||||
-- Configure the enabled preview features:
|
-- Configure the enabled preview features:
|
||||||
-- Allowed values are can be found in https://github.com/MindWorkAI/AI-Studio/app/MindWork%20AI%20Studio/Settings/DataModel/PreviewFeatures.cs
|
-- Allowed values are can be found in https://github.com/MindWorkAI/AI-Studio/app/MindWork%20AI%20Studio/Settings/DataModel/PreviewFeatures.cs
|
||||||
-- Examples are PRE_WRITER_MODE_2024, PRE_RAG_2024, PRE_DOCUMENT_ANALYSIS_2025.
|
-- Examples are PRE_WRITER_MODE_2024, PRE_RAG_2024, PRE_SPEECH_TO_TEXT_2026.
|
||||||
-- CONFIG["SETTINGS"]["DataApp.EnabledPreviewFeatures"] = { "PRE_RAG_2024", "PRE_DOCUMENT_ANALYSIS_2025" }
|
-- CONFIG["SETTINGS"]["DataApp.EnabledPreviewFeatures"] = { "PRE_RAG_2024", "PRE_SPEECH_TO_TEXT_2026" }
|
||||||
|
|
||||||
-- Configure the preselected provider.
|
-- Configure the preselected provider.
|
||||||
-- It must be one of the provider IDs defined in CONFIG["LLM_PROVIDERS"].
|
-- It must be one of the provider IDs defined in CONFIG["LLM_PROVIDERS"].
|
||||||
@ -189,7 +199,7 @@ CONFIG["SETTINGS"] = {}
|
|||||||
-- TEXT_SUMMARIZER_ASSISTANT, EMAIL_ASSISTANT, LEGAL_CHECK_ASSISTANT,
|
-- TEXT_SUMMARIZER_ASSISTANT, EMAIL_ASSISTANT, LEGAL_CHECK_ASSISTANT,
|
||||||
-- SYNONYMS_ASSISTANT, MY_TASKS_ASSISTANT, JOB_POSTING_ASSISTANT,
|
-- SYNONYMS_ASSISTANT, MY_TASKS_ASSISTANT, JOB_POSTING_ASSISTANT,
|
||||||
-- BIAS_DAY_ASSISTANT, ERI_ASSISTANT, DOCUMENT_ANALYSIS_ASSISTANT,
|
-- BIAS_DAY_ASSISTANT, ERI_ASSISTANT, DOCUMENT_ANALYSIS_ASSISTANT,
|
||||||
-- I18N_ASSISTANT
|
-- SLIDE_BUILDER_ASSISTANT, I18N_ASSISTANT
|
||||||
-- CONFIG["SETTINGS"]["DataApp.HiddenAssistants"] = { "ERI_ASSISTANT", "I18N_ASSISTANT" }
|
-- CONFIG["SETTINGS"]["DataApp.HiddenAssistants"] = { "ERI_ASSISTANT", "I18N_ASSISTANT" }
|
||||||
|
|
||||||
-- Configure a global shortcut for starting and stopping dictation.
|
-- Configure a global shortcut for starting and stopping dictation.
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
SVG = [[<svg viewBox="0 0 600 600" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2">
|
SVG = [[<svg viewBox="0 0 600 600" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2">
|
||||||
<path style="fill:none" d="M0 0h600v600H0z"/>
|
<path style="fill:none" d="M0 0h600v600H0z"/>
|
||||||
<clipPath id="a">
|
<clipPath id="clip-de">
|
||||||
<path d="M0 0h600v600H0z"/>
|
<path d="M0 0h600v600H0z"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<g clip-path="url(#a)">
|
<g clip-path="url(#clip-de)">
|
||||||
<path d="M17.467 200C58.688 83.529 169.851 0 300.369 0S542.05 83.529 583.271 200c11.072 31.284 17.098 64.944 17.098 100s-6.026 68.716-17.098 100C542.05 516.471 430.887 600 300.369 600S58.688 516.471 17.467 400C6.395 368.716.369 335.056.369 300s6.026-68.716 17.098-100Z"/>
|
<path d="M17.467 200C58.688 83.529 169.851 0 300.369 0S542.05 83.529 583.271 200c11.072 31.284 17.098 64.944 17.098 100s-6.026 68.716-17.098 100C542.05 516.471 430.887 600 300.369 600S58.688 516.471 17.467 400C6.395 368.716.369 335.056.369 300s6.026-68.716 17.098-100Z"/>
|
||||||
<path d="M583.271 200c11.072 31.284 17.098 64.944 17.098 100s-6.026 68.716-17.098 100C542.05 516.471 430.887 600 300.369 600S58.688 516.471 17.467 400C6.395 368.716.369 335.056.369 300s6.026-68.716 17.098-100h565.804Z" style="fill:#d00"/>
|
<path d="M583.271 200c11.072 31.284 17.098 64.944 17.098 100s-6.026 68.716-17.098 100C542.05 516.471 430.887 600 300.369 600S58.688 516.471 17.467 400C6.395 368.716.369 335.056.369 300s6.026-68.716 17.098-100h565.804Z" style="fill:#d00"/>
|
||||||
<path d="M583.271 400C542.05 516.471 430.887 600 300.369 600S58.688 516.471 17.467 400h565.804Z" style="fill:#ffce00"/>
|
<path d="M583.271 400C542.05 516.471 430.887 600 300.369 600S58.688 516.471 17.467 400h565.804Z" style="fill:#ffce00"/>
|
||||||
|
|||||||
@ -432,6 +432,12 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTA
|
|||||||
-- Load output rules from document
|
-- Load output rules from document
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2168201568"] = "Regeln für die Ausgabe aus einem Dokument laden"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2168201568"] = "Regeln für die Ausgabe aus einem Dokument laden"
|
||||||
|
|
||||||
|
-- Choose whether the policy should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2214900121"] = "Wählen Sie, ob das Regelwerk das Standardprofil der App, kein Profil oder ein bestimmtes Profil verwenden soll."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2322771068"] = "Profil vorauswählen"
|
||||||
|
|
||||||
-- The analysis rules specify what the AI should pay particular attention to while reviewing the documents you provide, and which aspects it should highlight or save. For example, if you want to extract the potential of green hydrogen for agriculture from a variety of general publications, you can explicitly define this in the analysis rules.
|
-- The analysis rules specify what the AI should pay particular attention to while reviewing the documents you provide, and which aspects it should highlight or save. For example, if you want to extract the potential of green hydrogen for agriculture from a variety of general publications, you can explicitly define this in the analysis rules.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T238145218"] = "Die Analyseregeln legen fest, worauf die KI bei der Prüfung der von Ihnen bereitgestellten Dokumente besonders achten und welche Aspekte sie hervorheben oder speichern soll. Wenn Sie beispielsweise das Potenzial von grünem Wasserstoff für die Landwirtschaft aus einer Vielzahl allgemeiner Publikationen extrahieren möchten, können Sie dies in den Analyseregeln explizit definieren."
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T238145218"] = "Die Analyseregeln legen fest, worauf die KI bei der Prüfung der von Ihnen bereitgestellten Dokumente besonders achten und welche Aspekte sie hervorheben oder speichern soll. Wenn Sie beispielsweise das Potenzial von grünem Wasserstoff für die Landwirtschaft aus einer Vielzahl allgemeiner Publikationen extrahieren möchten, können Sie dies in den Analyseregeln explizit definieren."
|
||||||
|
|
||||||
@ -1276,7 +1282,7 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3646084045"]
|
|||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3848935911"] = "Benutzerdefinierte Zielsprache"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T3848935911"] = "Benutzerdefinierte Zielsprache"
|
||||||
|
|
||||||
-- Please select one of your profiles.
|
-- Please select one of your profiles.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T465395981"] = "Bitte wählen Sie eines ihrer Profile aus."
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T465395981"] = "Bitte wählen Sie eines Ihrer Profile aus."
|
||||||
|
|
||||||
-- Text or email
|
-- Text or email
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T534887559"] = "Text oder E-Mail"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::MYTASKS::ASSISTANTMYTASKS::T534887559"] = "Text oder E-Mail"
|
||||||
@ -1291,7 +1297,7 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::
|
|||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T1714063121"] = "Satzstruktur"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T1714063121"] = "Satzstruktur"
|
||||||
|
|
||||||
-- Rewrite & Improve Text
|
-- Rewrite & Improve Text
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T1994150308"] = "Text umschreiben & verbessern"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T1994150308"] = "Text umformulieren & verbessern"
|
||||||
|
|
||||||
-- Improve your text
|
-- Improve your text
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T2163831433"] = "Verbessern Sie ihren Text"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::ASSISTANTREWRITEIMPROVE::T2163831433"] = "Verbessern Sie ihren Text"
|
||||||
@ -1356,6 +1362,189 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::
|
|||||||
-- Marketing (advertisements, sales texts)
|
-- Marketing (advertisements, sales texts)
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T945714286"] = "Marketing (Werbung, Verkaufstexte)"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T945714286"] = "Marketing (Werbung, Verkaufstexte)"
|
||||||
|
|
||||||
|
-- Children
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T188567026"] = "Kinder"
|
||||||
|
|
||||||
|
-- Unspecified age group
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T300604284"] = "Nicht angegebene Altersgruppe"
|
||||||
|
|
||||||
|
-- Adults
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T3335941460"] = "Erwachsene"
|
||||||
|
|
||||||
|
-- Teenagers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T3696960735"] = "Jugendliche"
|
||||||
|
|
||||||
|
-- No expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T1612807521"] = "Keine Vorkenntnisse"
|
||||||
|
|
||||||
|
-- Intermediate expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T2131860427"] = "Mittlere Kenntnisse"
|
||||||
|
|
||||||
|
-- Unspecified expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T2879202483"] = "Nicht spezifizierte Fachkenntnisse"
|
||||||
|
|
||||||
|
-- Basic expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T2909686714"] = "Grundlegende Kenntnisse"
|
||||||
|
|
||||||
|
-- Experts
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T3130182982"] = "Experten"
|
||||||
|
|
||||||
|
-- Individual contributors
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T1893672448"] = "Einzelne Mitwirkende"
|
||||||
|
|
||||||
|
-- Team leads
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2112906979"] = "Teamleitung"
|
||||||
|
|
||||||
|
-- Board members
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2483400884"] = "Vorstand"
|
||||||
|
|
||||||
|
-- Unspecified organizational level
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2633679224"] = "Nicht angegebene Organisationsebene"
|
||||||
|
|
||||||
|
-- Trainees
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2678344512"] = "Einstieg"
|
||||||
|
|
||||||
|
-- Managers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T3187355853"] = "Management"
|
||||||
|
|
||||||
|
-- Executives
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T3317335174"] = "Führung"
|
||||||
|
|
||||||
|
-- Journalists
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1589799277"] = "Journalisten"
|
||||||
|
|
||||||
|
-- Healthcare professionals
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1652521346"] = "Medizinisches Fachpersonal"
|
||||||
|
|
||||||
|
-- Unspecified audience profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1845793571"] = "Nicht angegebenes Zielgruppenprofil"
|
||||||
|
|
||||||
|
-- Lawyers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1959098902"] = "Anwälte"
|
||||||
|
|
||||||
|
-- Investors
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T2516036290"] = "Investoren"
|
||||||
|
|
||||||
|
-- Students
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T2905889225"] = "Studierende"
|
||||||
|
|
||||||
|
-- Scientists
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T332785734"] = "Wissenschaftler"
|
||||||
|
|
||||||
|
-- Business professionals
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T3670621687"] = "Business Professionals"
|
||||||
|
|
||||||
|
-- Engineers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T3904961809"] = "Ingenieure"
|
||||||
|
|
||||||
|
-- Public officials
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T439009390"] = "Amtsträger"
|
||||||
|
|
||||||
|
-- Software developers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T831424531"] = "Softwareentwickler"
|
||||||
|
|
||||||
|
-- Important Aspects
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1379883528"] = "Wichtige Aspekte"
|
||||||
|
|
||||||
|
-- Extent of the planned presentation
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1408740929"] = "Umfang der geplanten Präsentation"
|
||||||
|
|
||||||
|
-- You might want to specify important aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1672597841"] = "Vielleicht möchten Sie wichtige Aspekte angeben, die das LLM bei der Erstellung der Folien berücksichtigen soll. Zum Beispiel die Verwendung von Emojis oder bestimmte Themen, die hervorgehoben werden sollen."
|
||||||
|
|
||||||
|
-- Details about the desired presentation
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1793579367"] = "Details zur gewünschten Präsentation"
|
||||||
|
|
||||||
|
-- Text content
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1820253043"] = "Textinhalt"
|
||||||
|
|
||||||
|
-- Slide Assistant
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1883918574"] = "Folienassistent"
|
||||||
|
|
||||||
|
-- Please provide a text or at least one valid document or image.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2013746884"] = "Bitte geben Sie einen Text oder mindestens ein gültiges Dokument oder Bild an."
|
||||||
|
|
||||||
|
-- Content to derive slide from
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2086228265"] = "Inhalt, aus dem die Folie erstellt werden soll"
|
||||||
|
|
||||||
|
-- Target language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T237828418"] = "Zielsprache"
|
||||||
|
|
||||||
|
-- (Optional) Important Aspects
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T24391765"] = "(Optional) Wichtige Aspekte"
|
||||||
|
|
||||||
|
-- Audience age group
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2496533563"] = "Altersgruppe"
|
||||||
|
|
||||||
|
-- You can enter text, use one or more documents or images, or use both. At least one of these options is required.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2542045947"] = "Sie können Text eingeben, ein oder mehrere Dokumente oder Bilder verwenden oder beides nutzen. Mindestens eine dieser Optionen ist erforderlich."
|
||||||
|
|
||||||
|
-- Language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2591284123"] = "Sprache"
|
||||||
|
|
||||||
|
-- Audience organizational level
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2599228833"] = "Organisatorische Ebene der Zielgruppe"
|
||||||
|
|
||||||
|
-- Number of slides
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2823798965"] = "Anzahl der Folien"
|
||||||
|
|
||||||
|
-- This assistant helps you create clear, structured slides from long texts or documents. Enter a presentation title and provide the content either as text or with one or more documents. Important aspects allow you to add instructions to the LLM regarding output or formatting. Set the number of slides either directly or based on your desired presentation duration. You can also specify the number of bullet points. If the default value of 0 is not changed, the LLM will independently determine how many slides or bullet points to generate. The output can be flexibly generated in various languages and tailored to a specific audience.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2910177051"] = "Dieser Assistent hilft Ihnen, aus langen Texten oder Dokumenten klare, strukturierte Folien zu erstellen. Geben Sie einen Titel für die Präsentation ein und stellen Sie den Inhalt entweder als Text oder über ein oder mehrere Dokumente bereit. Unter „Wichtige Aspekte“ können Sie dem LLM Anweisungen zur Ausgabe oder Formatierung geben. Legen Sie die Anzahl der Folien entweder direkt oder anhand der gewünschten Präsentationsdauer fest. Sie können auch die Anzahl der Aufzählungspunkte angeben. Wenn der Standardwert 0 nicht geändert wird, bestimmt das LLM selbstständig, wie viele Folien oder Aufzählungspunkte erstellt werden. Die Ausgabe kann flexibel in verschiedenen Sprachen erzeugt und auf eine bestimmte Zielgruppe zugeschnitten werden."
|
||||||
|
|
||||||
|
-- The result of your previous slide builder session.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3000286990"] = "Das Ergebnis Ihrer vorherigen Folienassistent-Sitzung."
|
||||||
|
|
||||||
|
-- Please enter a title for the presentation. This will help the LLM to select more relevant content.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3013824309"] = "Bitte geben Sie einen Titel für die Präsentation ein. Dies hilft dem LLM, relevantere Inhalte auszuwählen."
|
||||||
|
|
||||||
|
-- Please provide a title
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3049299559"] = "Bitte geben Sie einen Titel ein"
|
||||||
|
|
||||||
|
-- Create Slides
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3079776593"] = "Folien erstellen"
|
||||||
|
|
||||||
|
-- Please specify the audience for the planned presentation. This will help the LLM to create a presentation that fits your needs. You can specify the audience profile, the age group, organizational level, and the expertise. You don't have to specify all of these parameters, for example you might only want to specify the audience profile and leave the other parameters at their default values.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3465256803"] = "Bitte geben Sie die Zielgruppe für die geplante Präsentation an. So kann das LLM eine Präsentation erstellen, die zu Ihren Anforderungen passt. Sie können das Profil der Zielgruppe, die Altersgruppe, die Organisationsebene und die Fachkenntnisse angeben. Sie müssen nicht alle diese Parameter festlegen; Sie können zum Beispiel nur das Profil der Zielgruppe angeben und die anderen Parameter bei ihren Standardwerten belassen."
|
||||||
|
|
||||||
|
-- (Optional) Specify aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3476149293"] = "(Optional) Gib Aspekte an, die das LLM beim Erstellen der Folien berücksichtigen soll. Zum Beispiel die Verwendung von Emojis oder bestimmte Themen, die hervorgehoben werden sollen."
|
||||||
|
|
||||||
|
-- Audience
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3506118019"] = "Zielgruppe"
|
||||||
|
|
||||||
|
-- Time specification (minutes)
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3539067305"] = "Zeitangabe (Minuten)"
|
||||||
|
|
||||||
|
-- Audience profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3649769130"] = "Profil der Zielgruppe"
|
||||||
|
|
||||||
|
-- Attach documents
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3666048746"] = "Dokumente anhängen"
|
||||||
|
|
||||||
|
-- Number of bullet points
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3796347042"] = "Anzahl der Aufzählungspunkte"
|
||||||
|
|
||||||
|
-- Custom target language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3848935911"] = "Benutzerdefinierte Zielsprache"
|
||||||
|
|
||||||
|
-- Presentation title
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3893271035"] = "Präsentationstitel"
|
||||||
|
|
||||||
|
-- {0} - Slide Builder Session
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3922788056"] = "{0} – Folienassistent-Sitzung"
|
||||||
|
|
||||||
|
-- Please specify the extent of the planned presentation. This can be the number of slides, the number of bullet points per slide, or the time specification for the presentation. This will help the LLM to create a presentation that fits your needs. Leave the default values if you don't have specific requirements regarding the extent of the presentation. You might only want to specify one of these parameters, for example the time specification, and leave the others at their default values.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T4131419342"] = "Bitte geben Sie den Umfang der geplanten Präsentation an. Das kann die Anzahl der Folien, die Anzahl der Aufzählungspunkte pro Folie oder die Zeitvorgabe für die Präsentation sein. Das hilft dem LLM, eine Präsentation zu erstellen, die Ihren Anforderungen entspricht. Lassen Sie die Standardwerte unverändert, wenn Sie keine besonderen Anforderungen an den Umfang der Präsentation haben. Möglicherweise möchten Sie nur einen dieser Parameter angeben, zum Beispiel die Zeitvorgabe, und die anderen auf den Standardwerten belassen."
|
||||||
|
|
||||||
|
-- Audience expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T4279519256"] = "Fachkenntnisse der Zielgruppe"
|
||||||
|
|
||||||
|
-- Title
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T617902505"] = "Titel"
|
||||||
|
|
||||||
|
-- Please provide a custom language.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T656744944"] = "Bitte geben Sie eine benutzerdefinierte Sprache an."
|
||||||
|
|
||||||
-- Your word or phrase
|
-- Your word or phrase
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T1847246020"] = "Ihr Wort oder Phrase"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T1847246020"] = "Ihr Wort oder Phrase"
|
||||||
|
|
||||||
@ -1593,6 +1782,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1133040906"] = "Chat vers
|
|||||||
-- Are you sure you want to move this chat? All unsaved changes will be lost.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1142475422"] = "Sind Sie sicher, dass Sie diesen Chat verschieben möchten? Alle ungespeicherten Änderungen gehen verloren."
|
||||||
|
|
||||||
|
-- Bold
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1165397398"] = "Fett"
|
||||||
|
|
||||||
-- Stop generation
|
-- Stop generation
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1317408357"] = "Generierung stoppen"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1317408357"] = "Generierung stoppen"
|
||||||
|
|
||||||
@ -1605,9 +1797,18 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1849313532"] = "Geben Sie
|
|||||||
-- Your Prompt (use selected instance '{0}', provider '{1}')
|
-- Your Prompt (use selected instance '{0}', provider '{1}')
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1967611328"] = "Ihr Prompt (verwendete Instanz: '{0}', Anbieter: '{1}')"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1967611328"] = "Ihr Prompt (verwendete Instanz: '{0}', Anbieter: '{1}')"
|
||||||
|
|
||||||
|
-- Code
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2036185364"] = "Code"
|
||||||
|
|
||||||
|
-- Italic
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2377171085"] = "Kursiv"
|
||||||
|
|
||||||
-- Profile usage is disabled according to your chat template settings.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2670286472"] = "Die Profilnutzung ist gemäß den Einstellungen ihrer Chat-Vorlage deaktiviert."
|
||||||
|
|
||||||
|
-- Bulleted List
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2957125464"] = "Aufzählungszeichen"
|
||||||
|
|
||||||
-- Delete this chat & start a new one.
|
-- Delete this chat & start a new one.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2991985411"] = "Diesen Chat löschen & einen neuen beginnen."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2991985411"] = "Diesen Chat löschen & einen neuen beginnen."
|
||||||
|
|
||||||
@ -1626,6 +1827,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3928697643"] = "Neuen Cha
|
|||||||
-- New disappearing chat
|
-- New disappearing chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4113970938"] = "Neuen selbstlöschenden Chat starten"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4113970938"] = "Neuen selbstlöschenden Chat starten"
|
||||||
|
|
||||||
|
-- Heading
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4231005109"] = "Überschrift"
|
||||||
|
|
||||||
-- Please select the workspace where you want to move the chat to.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T474393241"] = "Bitte wählen Sie den Arbeitsbereich aus, in den Sie den Chat verschieben möchten."
|
||||||
|
|
||||||
@ -1770,6 +1974,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T700666808"] = "Date
|
|||||||
-- Available Data Sources
|
-- Available Data Sources
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T86053874"] = "Verfügbare Datenquellen"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T86053874"] = "Verfügbare Datenquellen"
|
||||||
|
|
||||||
|
-- LLMs can make mistakes. Check important information.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::HALLUZINATIONREMINDER::T3528806904"] = "LLMs können Fehler machen. Überprüfen Sie wichtige Informationen."
|
||||||
|
|
||||||
-- Issues
|
-- Issues
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ISSUES::T3229841001"] = "Probleme"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ISSUES::T3229841001"] = "Probleme"
|
||||||
|
|
||||||
@ -1879,7 +2086,7 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T3451939995"] =
|
|||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T696585888"] = "Release-Kandidaten sind der letzte Schritt, bevor eine Funktion als stabil gilt."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PREVIEWRELEASECANDIDATE::T696585888"] = "Release-Kandidaten sind der letzte Schritt, bevor eine Funktion als stabil gilt."
|
||||||
|
|
||||||
-- Select one of your profiles
|
-- Select one of your profiles
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILEFORMSELECTION::T2003449133"] = "Wählen Sie eines ihrer Profile aus"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILEFORMSELECTION::T2003449133"] = "Wählen Sie eines Ihrer Profile aus"
|
||||||
|
|
||||||
-- Open Profile Options
|
-- Open Profile Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILEFORMSELECTION::T3654011106"] = "Profil-Optionen öffnen"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::PROFILEFORMSELECTION::T3654011106"] = "Profil-Optionen öffnen"
|
||||||
@ -2064,6 +2271,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1364944735"]
|
|||||||
-- Select preview features
|
-- Select preview features
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1439783084"] = "Vorschaufunktionen auswählen"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1439783084"] = "Vorschaufunktionen auswählen"
|
||||||
|
|
||||||
|
-- Your organization provided a default start page, but you can still change it.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1454730224"] = "Ihre Organisation hat eine Standard-Startseite festgelegt, die Sie jedoch ändern können."
|
||||||
|
|
||||||
-- Select the desired behavior for the navigation bar.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1555038969"] = "Wählen Sie das gewünschte Verhalten für die Navigationsleiste aus."
|
||||||
|
|
||||||
@ -2112,6 +2322,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591284123"]
|
|||||||
-- Administration settings are visible
|
-- Administration settings are visible
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591866808"] = "Die Optionen für die Administration sind sichtbar."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591866808"] = "Die Optionen für die Administration sind sichtbar."
|
||||||
|
|
||||||
|
-- Choose which page AI Studio should open first when you start the app. Changes take effect the next time you launch AI Studio.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2655930524"] = "Wählen Sie aus, welche Seite AI Studio beim Start der App zuerst öffnen soll. Änderungen werden beim nächsten Start von AI Studio wirksam."
|
||||||
|
|
||||||
-- Save energy?
|
-- Save energy?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3100928009"] = "Energie sparen?"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3100928009"] = "Energie sparen?"
|
||||||
|
|
||||||
@ -2160,6 +2373,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T71162186"] =
|
|||||||
-- Energy saving is disabled
|
-- Energy saving is disabled
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T716338721"] = "Energiesparmodus ist deaktiviert"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T716338721"] = "Energiesparmodus ist deaktiviert"
|
||||||
|
|
||||||
|
-- Start page
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T78084670"] = "Startseite"
|
||||||
|
|
||||||
-- Preview feature visibility
|
-- Preview feature visibility
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T817101267"] = "Sichtbarkeit der Vorschaufunktion"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T817101267"] = "Sichtbarkeit der Vorschaufunktion"
|
||||||
|
|
||||||
@ -2500,7 +2716,7 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2868740431"] = "Spezifische Anfo
|
|||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2899555955"] = "Wir werden weitere Assistenten für alltägliche Aufgaben entwickeln."
|
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.
|
-- 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."
|
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 umformulieren 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.
|
-- 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."
|
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."
|
||||||
@ -2520,6 +2736,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T428040679"] = "Erstellung von In
|
|||||||
-- Useful assistants
|
-- Useful assistants
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T586430036"] = "Nützliche Assistenten"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T586430036"] = "Nützliche Assistenten"
|
||||||
|
|
||||||
|
-- Voice recording has been disabled for this session because audio playback could not be initialized on the client.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T1123032432"] = "Die Sprachaufnahme wurde für diese Sitzung deaktiviert, da die Audiowiedergabe auf dem Client nicht initialisiert werden konnte."
|
||||||
|
|
||||||
-- Failed to create the transcription provider.
|
-- Failed to create the transcription provider.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T1689988905"] = "Der Anbieter für die Transkription konnte nicht erstellt werden."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T1689988905"] = "Der Anbieter für die Transkription konnte nicht erstellt werden."
|
||||||
|
|
||||||
@ -2529,6 +2748,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2144994226"] = "Audioaufn
|
|||||||
-- Stop recording and start transcription
|
-- Stop recording and start transcription
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T224155287"] = "Aufnahme beenden und Transkription starten"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T224155287"] = "Aufnahme beenden und Transkription starten"
|
||||||
|
|
||||||
|
-- Voice recording is unavailable because the client could not initialize audio playback.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2260302339"] = "Die Sprachaufnahme ist nicht verfügbar, da der Client die Audiowiedergabe nicht initialisieren konnte."
|
||||||
|
|
||||||
-- Start recording your voice for a transcription
|
-- Start recording your voice for a transcription
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2372624045"] = "Beginnen Sie mit der Aufnahme Ihrer Stimme für eine Transkription"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2372624045"] = "Beginnen Sie mit der Aufnahme Ihrer Stimme für eine Transkription"
|
||||||
|
|
||||||
@ -2559,8 +2781,8 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1016188706"] = "Möchten Sie
|
|||||||
-- Move chat
|
-- Move chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1133040906"] = "Chat verschieben"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1133040906"] = "Chat verschieben"
|
||||||
|
|
||||||
-- Unnamed workspace
|
-- Loading chats...
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1307384014"] = "Unbenannter Arbeitsbereich"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1364857726"] = "Chats werden geladen..."
|
||||||
|
|
||||||
-- Delete
|
-- Delete
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1469573738"] = "Löschen"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1469573738"] = "Löschen"
|
||||||
@ -2616,9 +2838,6 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T323280982"] = "Bitte geben S
|
|||||||
-- Please enter a workspace name.
|
-- Please enter a workspace name.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3288132732"] = "Bitte geben Sie einen Namen für diesen Arbeitsbereich ein."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3288132732"] = "Bitte geben Sie einen Namen für diesen Arbeitsbereich ein."
|
||||||
|
|
||||||
-- Unnamed chat
|
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3310482275"] = "Unbenannter Chat"
|
|
||||||
|
|
||||||
-- Rename
|
-- Rename
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3355849203"] = "Umbenennen"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3355849203"] = "Umbenennen"
|
||||||
|
|
||||||
@ -2745,6 +2964,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T380891852"] = "Beispiel
|
|||||||
-- Actions
|
-- Actions
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3865031940"] = "Aktionen"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3865031940"] = "Aktionen"
|
||||||
|
|
||||||
|
-- Load system prompt from file
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3883091650"] = "System-Prompt aus Datei laden"
|
||||||
|
|
||||||
-- Messages per page
|
-- Messages per page
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3893704289"] = "Nachrichten pro Seite"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3893704289"] = "Nachrichten pro Seite"
|
||||||
|
|
||||||
@ -3537,6 +3759,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1870831108"] = "Der API-Sch
|
|||||||
-- Please enter a model name.
|
-- Please enter a model name.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1936099896"] = "Bitte geben Sie einen Modellnamen ein."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1936099896"] = "Bitte geben Sie einen Modellnamen ein."
|
||||||
|
|
||||||
|
-- Additional API parameters must form a JSON object.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2051143391"] = "Zusätzliche API-Parameter müssen ein JSON-Objekt bilden."
|
||||||
|
|
||||||
-- Model
|
-- Model
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2189814010"] = "Modell"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2189814010"] = "Modell"
|
||||||
|
|
||||||
@ -3558,12 +3783,18 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2842060373"] = "Instanzname
|
|||||||
-- Show Expert Settings
|
-- Show Expert Settings
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3361153305"] = "Experten-Einstellungen anzeigen"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3361153305"] = "Experten-Einstellungen anzeigen"
|
||||||
|
|
||||||
|
-- Invalid JSON: Add the parameters in proper JSON formatting, e.g., \"temperature\": 0.5. Remove trailing commas. The usual surrounding curly brackets {} must not be used, though.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3502745319"] = "Ungültiges JSON: Fügen Sie die Parameter in korrektem JSON-Format hinzu, z. B. \"temperature\": 0.5. Entfernen Sie abschließende Kommas. Die üblichen umgebenden geschweiften Klammern {} dürfen jedoch nicht verwendet werden."
|
||||||
|
|
||||||
-- Show available models
|
-- Show available models
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3763891899"] = "Verfügbare Modelle anzeigen"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3763891899"] = "Verfügbare Modelle anzeigen"
|
||||||
|
|
||||||
-- This host uses the model configured at the provider level. No model selection is available.
|
-- This host uses the model configured at the provider level. No model selection is available.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3783329915"] = "Dieser Host verwendet das auf Anbieterebene konfigurierte Modell. Es ist keine Modellauswahl verfügbar."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3783329915"] = "Dieser Host verwendet das auf Anbieterebene konfigurierte Modell. Es ist keine Modellauswahl verfügbar."
|
||||||
|
|
||||||
|
-- Duplicate key '{0}' found.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3804472591"] = "Doppelter Schlüssel '{0}' gefunden."
|
||||||
|
|
||||||
-- Currently, we cannot query the models for the selected provider and/or host. Therefore, please enter the model name manually.
|
-- Currently, we cannot query the models for the selected provider and/or host. Therefore, please enter the model name manually.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T4116737656"] = "Derzeit können wir die Modelle für den ausgewählten Anbieter und/oder Host nicht abfragen. Bitte geben Sie daher den Modellnamen manuell ein."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T4116737656"] = "Derzeit können wir die Modelle für den ausgewählten Anbieter und/oder Host nicht abfragen. Bitte geben Sie daher den Modellnamen manuell ein."
|
||||||
|
|
||||||
@ -3744,6 +3975,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1471770981"
|
|||||||
-- Preselect whether participants needs to arrive and depart
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1648427207"] = "Legen Sie im Voraus fest, ob Teilnehmer anreisen und abreisen müssen"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1766361623"] = "Wählen Sie, ob der Assistent das Standardprofil der App, kein Profil oder ein bestimmtes Profil verwenden soll."
|
||||||
|
|
||||||
-- Preselect a start time?
|
-- Preselect a start time?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1901151023"] = "Startzeit vorauswählen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1901151023"] = "Startzeit vorauswählen?"
|
||||||
|
|
||||||
@ -3756,8 +3990,8 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1998244307"
|
|||||||
-- Preselect whether the meeting is virtual
|
-- Preselect whether the meeting is virtual
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2084951012"] = "Wählen Sie aus, ob das Meeting virtuell ist"
|
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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2322771068"] = "Profil vorauswählen"
|
||||||
|
|
||||||
-- When enabled, you can preselect most agenda options. This is might be useful when you need to create similar agendas often.
|
-- 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."
|
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."
|
||||||
@ -3810,9 +4044,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3709527588"
|
|||||||
-- Preselect a topic?
|
-- Preselect a topic?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3835166371"] = "Ein Thema vorauswählen?"
|
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
|
-- Preselect the agenda language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4055846391"] = "Wählen Sie die Sprache der Agenda vorab aus"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4055846391"] = "Wählen Sie die Sprache der Agenda vorab aus"
|
||||||
|
|
||||||
@ -3849,15 +4080,18 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1608
|
|||||||
-- Yes, you can only retrieve one bias per day
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1765683725"] = "Ja, Sie können nur einmal pro Tag eine Voreingenommenheit abrufen."
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1766361623"] = "Wähle aus, ob der Assistent das Standardprofil der App, kein Profil oder ein bestimmtes Profil verwenden soll."
|
||||||
|
|
||||||
-- Reset
|
-- Reset
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T180921696"] = "Zurücksetzen"
|
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.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2305356277"] = "Keine Einschränkung. Sie können beliebig viele Vorurteile pro Tag abrufen."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2322771068"] = "Profil vorauswählen"
|
||||||
|
|
||||||
-- Which language should be preselected?
|
-- Which language should be preselected?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2345162613"] = "Welche Sprache soll vorausgewählt werden?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2345162613"] = "Welche Sprache soll vorausgewählt werden?"
|
||||||
|
|
||||||
@ -3882,9 +4116,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3848
|
|||||||
-- Options are preselected
|
-- Options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3875604319"] = "Optionen sind vorausgewählt"
|
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.
|
-- 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."
|
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."
|
||||||
|
|
||||||
@ -3915,8 +4146,11 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1773585398"]
|
|||||||
-- Provider selection when creating new chats
|
-- Provider selection when creating new chats
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T189306836"] = "Anbieterauswahl beim Erstellen neuer 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?
|
-- Choose whether chats should use the app default profile, no profile, or a specific profile.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1933521846"] = "Möchten Sie eines ihrer Profile als Standardprofil für Chats festlegen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1915793195"] = "Wählen Sie aus, ob Chats das Standardprofil der App, kein Profil oder ein bestimmtes Profil verwenden sollen."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2322771068"] = "Profil vorauswählen"
|
||||||
|
|
||||||
-- Apply default data source option when sending assistant results to chat
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2510376349"] = "Standarddatenquelle verwenden, wenn Assistentenergebnisse in den Chat gesendet werden"
|
||||||
@ -3954,9 +4188,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3730599555"]
|
|||||||
-- Latest message is shown, after loading a chat
|
-- 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."
|
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?
|
-- 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?"
|
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?"
|
||||||
|
|
||||||
@ -4017,11 +4248,14 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1073540083"
|
|||||||
-- Compiler messages are preselected
|
-- Compiler messages are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1110902070"] = "Compiler-Nachrichten sind vorausgewählt"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1110902070"] = "Compiler-Nachrichten sind vorausgewählt"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1766361623"] = "Wählen Sie aus, ob der Assistent das Standardprofil der App, kein Profil oder ein bestimmtes Profil verwenden soll."
|
||||||
|
|
||||||
-- Preselect a programming language
|
-- Preselect a programming language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2181567002"] = "Programmiersprache vorauswählen"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2181567002"] = "Programmiersprache vorauswählen"
|
||||||
|
|
||||||
-- Would you like to preselect one of your profiles?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2322771068"] = "Profil 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.
|
-- 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."
|
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."
|
||||||
@ -4038,9 +4272,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3015105896"
|
|||||||
-- Coding options are preselected
|
-- Coding options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3567850751"] = "Codierungsoptionen sind vorausgewählt"
|
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
|
-- Preselect another programming language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4230412334"] = "Eine andere Programmiersprache vorauswählen"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4230412334"] = "Eine andere Programmiersprache vorauswählen"
|
||||||
|
|
||||||
@ -4140,14 +4371,17 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T12806662
|
|||||||
-- Preselect ERI server options?
|
-- Preselect ERI server options?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1664055662"] = "ERI-Serveroptionen vorauswählen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1664055662"] = "ERI-Serveroptionen vorauswählen?"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1766361623"] = "Wählen Sie, ob der Assistent das Standardprofil der App, kein Profil oder ein bestimmtes Profil verwenden soll."
|
||||||
|
|
||||||
-- No ERI server options are preselected
|
-- No ERI server options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1793785587"] = "Keine ERI-Serveroptionen sind vorausgewählt"
|
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.
|
-- 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."
|
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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2322771068"] = "Profil vorauswählen"
|
||||||
|
|
||||||
-- Close
|
-- Close
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3448155331"] = "Schließen"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3448155331"] = "Schließen"
|
||||||
@ -4155,9 +4389,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T34481553
|
|||||||
-- Assistant: ERI Server Options
|
-- Assistant: ERI Server Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3629372826"] = "Assistent: ERI-Server-Optionen"
|
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
|
-- ERI server options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T488190224"] = "ERI-Serveroptionen sind vorausgewählt"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T488190224"] = "ERI-Serveroptionen sind vorausgewählt"
|
||||||
|
|
||||||
@ -4305,6 +4536,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1633101
|
|||||||
-- Web content reader is not preselected
|
-- Web content reader is not preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1701127912"] = "Der Web-Content-Reader zum Lesen von Webinhalten ist nicht vorausgewählt"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1701127912"] = "Der Web-Content-Reader zum Lesen von Webinhalten ist nicht vorausgewählt"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1766361623"] = "Wählen Sie aus, ob der Assistent das Standardprofil der App, kein Profil oder ein bestimmtes Profil verwenden soll."
|
||||||
|
|
||||||
-- Content cleaner agent is not preselected
|
-- Content cleaner agent is not preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1969816694"] = "Agent zur Inhaltsbereinigung ist nicht vorausgewählt"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1969816694"] = "Agent zur Inhaltsbereinigung ist nicht vorausgewählt"
|
||||||
|
|
||||||
@ -4314,8 +4548,8 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2090693
|
|||||||
-- When enabled, you can preselect some legal check options. This is might be useful when you prefer a specific LLM model.
|
-- 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."
|
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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2322771068"] = "Profil vorauswählen"
|
||||||
|
|
||||||
-- Legal check options are preselected
|
-- Legal check options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T252916114"] = "Rechtsprüfungsoptionen sind vorausgewählt"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T252916114"] = "Rechtsprüfungsoptionen sind vorausgewählt"
|
||||||
@ -4335,17 +4569,17 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3641773
|
|||||||
-- Preselect the content cleaner agent?
|
-- Preselect the content cleaner agent?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3649428096"] = "Assistent zur Inhaltsbereinigungs vorauswählen?"
|
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
|
-- Assistant: Legal Check Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4033382756"] = "Assistent: Optionen für rechtliche Prüfung"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4033382756"] = "Assistent: Optionen für rechtliche Prüfung"
|
||||||
|
|
||||||
-- Preselect the web content reader?
|
-- Preselect the web content reader?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T629158142"] = "Den Web-Content-Reader zum Lesen von Webinhalten vorauswählen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T629158142"] = "Den Web-Content-Reader zum Lesen von Webinhalten vorauswählen?"
|
||||||
|
|
||||||
-- Would you like to preselect one of your profiles?
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T1766361623"] = "Wählen Sie, ob der Assistent das Standardprofil der App, kein Profil oder ein bestimmtes Profil verwenden soll."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2322771068"] = "Profil vorauswählen"
|
||||||
|
|
||||||
-- Which language should be preselected?
|
-- Which language should be preselected?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2345162613"] = "Welche Sprache soll vorausgewählt werden?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2345162613"] = "Welche Sprache soll vorausgewählt werden?"
|
||||||
@ -4368,9 +4602,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3710380967
|
|||||||
-- Options are preselected
|
-- Options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3875604319"] = "Optionen sind vorausgewählt"
|
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?
|
-- Preselect options?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T42672465"] = "Optionen vorauswählen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T42672465"] = "Optionen vorauswählen?"
|
||||||
|
|
||||||
@ -4432,7 +4663,7 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1462295644
|
|||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1621537655"] = "Satzstruktur vorauswählen"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1621537655"] = "Satzstruktur vorauswählen"
|
||||||
|
|
||||||
-- Assistant: Rewrite & Improve Text Options
|
-- Assistant: Rewrite & Improve Text Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1995708818"] = "Assistent: Text umschreiben & verbessern"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T1995708818"] = "Assistent: Text umformulieren & verbessern"
|
||||||
|
|
||||||
-- Which voice should be preselected for the sentence structure?
|
-- 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?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T2661599097"] = "Welche Stimme soll für die Satzstruktur vorausgewählt werden?"
|
||||||
@ -4441,7 +4672,7 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T2661599097
|
|||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T28456020"] = "Wählen Sie einen Schreibstil aus"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T28456020"] = "Wählen Sie einen Schreibstil aus"
|
||||||
|
|
||||||
-- Rewrite & improve text options are preselected
|
-- Rewrite & improve text options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3303192024"] = "Optionen für „Text umschreiben & verbessern“ sind bereits vorausgewählt."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3303192024"] = "Optionen für „Text umformulieren & verbessern“ sind bereits vorausgewählt."
|
||||||
|
|
||||||
-- Close
|
-- Close
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3448155331"] = "Schließen"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3448155331"] = "Schließen"
|
||||||
@ -4450,13 +4681,76 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3448155331
|
|||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3547337928"] = "Welche Zielsprache soll vorausgewählt werden?"
|
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.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3657121735"] = "Wenn diese Option aktiviert ist, können Sie Optionen für „Text umformulieren & 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?
|
-- Preselect rewrite & improve text options?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3745021518"] = "Vorauswahl von Optionen für „Text umschreiben & verbessern“?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3745021518"] = "Vorauswahl von Optionen für „Text umformulieren & verbessern“?"
|
||||||
|
|
||||||
-- No rewrite & improve text options are preselected
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T553954963"] = "Keine Optionen für „Text umformulieren & verbessern“ sind vorausgewählt"
|
||||||
|
|
||||||
|
-- Preselect the audience expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1017131030"] = "Expertise der Zielgruppe vorauswählen"
|
||||||
|
|
||||||
|
-- When enabled, you can preselect slide builder options. This is might be useful when you prefer a specific language or LLM model.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1393378753"] = "Wenn diese Option aktiviert ist, können Sie Optionen für den Folienassistent vorab auswählen. Dies kann nützlich sein, wenn Sie eine bestimmte Sprache oder ein bestimmtes LLM-Modell bevorzugen."
|
||||||
|
|
||||||
|
-- Preselect aspects for the LLM to focus on when generating slides, such as bullet points or specific topics to emphasize.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1528169602"] = "Wählen Sie Aspekte vorab aus, auf die sich das LLM bei der Erstellung von Folien konzentrieren soll, z. B. Aufzählungspunkte oder bestimmte Themen, die hervorgehoben werden sollen."
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1766361623"] = "Wählen Sie aus, ob der Assistent das Standardprofil der App, kein Profil oder ein bestimmtes Profil verwenden soll."
|
||||||
|
|
||||||
|
-- Preselect the audience organizational level
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2014662371"] = "Organisationsebene der Zielgruppe vorauswählen"
|
||||||
|
|
||||||
|
-- Which audience organizational level should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T216511105"] = "Welche organisatorische Ebene der Zielgruppe soll vorausgewählt werden?"
|
||||||
|
|
||||||
|
-- Preselect Slide Assistant options?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T227645894"] = "Optionen des Folienassistenten vorauswählen?"
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2322771068"] = "Profil vorauswählen"
|
||||||
|
|
||||||
|
-- Which language should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2345162613"] = "Welche Sprache sollte vorausgewählt sein?"
|
||||||
|
|
||||||
|
-- Preselect another language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2382415529"] = "Andere Sprache vorauswählen"
|
||||||
|
|
||||||
|
-- Preselect the language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2571465005"] = "Sprache vorauswählen"
|
||||||
|
|
||||||
|
-- Preselect the audience age group
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2645589441"] = "Altersgruppe der Zielgruppe vorauswählen"
|
||||||
|
|
||||||
|
-- Assistant: Slide Assistant Options
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3215549988"] = "Assistent: Optionen für die Erstellung von Folien"
|
||||||
|
|
||||||
|
-- Which audience expertise should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3228597992"] = "Welche Expertise der Zielgruppe sollte vorausgewählt werden?"
|
||||||
|
|
||||||
|
-- Close
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3448155331"] = "Schließen"
|
||||||
|
|
||||||
|
-- Preselect important aspects
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3705987833"] = "Wichtige Aspekte vorauswählen"
|
||||||
|
|
||||||
|
-- No Slide Assistant options are preselected
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T4214398691"] = "Keine Optionen für den Folienassistenten sind vorausgewählt."
|
||||||
|
|
||||||
|
-- Preselect the audience profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T861397972"] = "Zielgruppenprofil vorauswählen"
|
||||||
|
|
||||||
|
-- Slide Assistant options are preselected
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T93124146"] = "Optionen des Folienassistenten sind vorausgewählt"
|
||||||
|
|
||||||
|
-- Which audience age group should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T956845877"] = "Welche Altersgruppe der Zielgruppe sollte vorausgewählt sein?"
|
||||||
|
|
||||||
|
-- Which audience profile should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T973572510"] = "Welches Zielgruppenprofil soll vorausgewählt sein?"
|
||||||
|
|
||||||
-- When enabled, you can preselect synonym options. This is might be useful when you prefer a specific language or LLM model.
|
-- 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."
|
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."
|
||||||
@ -4677,6 +4971,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1417
|
|||||||
-- Preselect another target language
|
-- Preselect another target language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1462295644"] = "Eine andere Zielsprache auswählen"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1462295644"] = "Eine andere Zielsprache auswählen"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1766361623"] = "Wählen Sie, ob der Assistent das Standardprofil der App, kein Profil oder ein bestimmtes Profil verwenden soll."
|
||||||
|
|
||||||
-- Assistant: Writing E-Mails Options
|
-- Assistant: Writing E-Mails Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2021226503"] = "Assistent: Optionen zum Schreiben von E-Mails"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2021226503"] = "Assistent: Optionen zum Schreiben von E-Mails"
|
||||||
|
|
||||||
@ -4686,8 +4983,8 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2116
|
|||||||
-- Preselect your name for the closing salutation?
|
-- Preselect your name for the closing salutation?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T221974240"] = "Ihren Namen für die Grußformel vorauswählen?"
|
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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2221665527"] = "Möchten Sie eines ihrer Profile vorauswählen?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2322771068"] = "Profil vorauswählen"
|
||||||
|
|
||||||
-- Preselect a writing style
|
-- Preselect a writing style
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T28456020"] = "Wähle einen Schreibstil vor"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T28456020"] = "Wähle einen Schreibstil vor"
|
||||||
@ -4707,9 +5004,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3547
|
|||||||
-- Preselect e-mail options?
|
-- Preselect e-mail options?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3832719342"] = "E-Mail-Optionen vorauswählen?"
|
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?"
|
|
||||||
|
|
||||||
-- Save
|
-- Save
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SHORTCUTDIALOG::T1294818664"] = "Speichern"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SHORTCUTDIALOG::T1294818664"] = "Speichern"
|
||||||
|
|
||||||
@ -4896,6 +5190,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1617786407"] = "Programmieren"
|
|||||||
-- Analyze a text or an email for tasks you need to complete.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1728590051"] = "Analysieren Sie einen Text oder eine E-Mail nach Aufgaben, die Sie erledigen müssen."
|
||||||
|
|
||||||
|
-- Slide Assistant
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1883918574"] = "Folienassistent"
|
||||||
|
|
||||||
-- Text Summarizer
|
-- Text Summarizer
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1907192403"] = "Texte zusammenfassen"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1907192403"] = "Texte zusammenfassen"
|
||||||
|
|
||||||
@ -4935,6 +5232,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3011450657"] = "Meine Aufgaben"
|
|||||||
-- E-Mail
|
-- E-Mail
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3026443472"] = "E-Mail"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3026443472"] = "E-Mail"
|
||||||
|
|
||||||
|
-- Develop slide content based on a given topic and content.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T311912219"] = "Folieninhalte basierend auf einem vorgegebenen Thema und Inhalt erstellen."
|
||||||
|
|
||||||
-- Translate AI Studio text content into other languages
|
-- Translate AI Studio text content into other languages
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3181803840"] = "AI Studio Textinhalte in andere Sprachen übersetzen."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3181803840"] = "AI Studio Textinhalte in andere Sprachen übersetzen."
|
||||||
|
|
||||||
@ -4983,6 +5283,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T878695986"] = "Lerne jeden Tag ei
|
|||||||
-- Localization
|
-- Localization
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T897888480"] = "Lokalisierung"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T897888480"] = "Lokalisierung"
|
||||||
|
|
||||||
|
-- Reload your workspaces
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T194629703"] = "Arbeitsbereiche neu laden"
|
||||||
|
|
||||||
-- Hide your workspaces
|
-- Hide your workspaces
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2351468526"] = "Arbeitsbereiche ausblenden"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2351468526"] = "Arbeitsbereiche ausblenden"
|
||||||
|
|
||||||
@ -5292,6 +5595,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3494984593"] = "Tauri wird verwe
|
|||||||
-- Motivation
|
-- Motivation
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3563271893"] = "Motivation"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3563271893"] = "Motivation"
|
||||||
|
|
||||||
|
-- not available
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3574465749"] = "nicht verfügbar"
|
||||||
|
|
||||||
-- 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.
|
-- 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::INFORMATION::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."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::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."
|
||||||
|
|
||||||
@ -5313,6 +5619,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3986423270"] = "Pandoc-Installat
|
|||||||
-- Versions
|
-- Versions
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T4010195468"] = "Versionen"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T4010195468"] = "Versionen"
|
||||||
|
|
||||||
|
-- Database
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T4036243672"] = "Datenbank"
|
||||||
|
|
||||||
-- 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.
|
-- 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::INFORMATION::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."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::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."
|
||||||
|
|
||||||
@ -5586,12 +5895,21 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1188453609
|
|||||||
-- Show also prototype features: these are works in progress; expect bugs and missing features
|
-- 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"
|
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"
|
||||||
|
|
||||||
|
-- Settings
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1258653480"] = "Einstellungen"
|
||||||
|
|
||||||
-- No key is sending the input; you have to click the send button
|
-- 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"
|
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
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1402851833"] = "Navigationsleiste wird nie erweitert, keine Tooltips; es werden nur Icons angezeigt"
|
||||||
|
|
||||||
|
-- Welcome
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1485461907"] = "Willkommen"
|
||||||
|
|
||||||
|
-- Assistants
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1614176092"] = "Assistenten"
|
||||||
|
|
||||||
-- Store chats automatically
|
-- Store chats automatically
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1664293672"] = "Chats automatisch speichern"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1664293672"] = "Chats automatisch speichern"
|
||||||
|
|
||||||
@ -5616,6 +5934,9 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2195945406
|
|||||||
-- Install updates manually
|
-- Install updates manually
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T220653235"] = "Updates manuell installieren"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T220653235"] = "Updates manuell installieren"
|
||||||
|
|
||||||
|
-- Plugins
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2222816203"] = "Plugins"
|
||||||
|
|
||||||
-- Also show features ready for release; these should be stable
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2301448762"] = "Auch Funktionen anzeigen, die bereit für die Veröffentlichung sind; diese sollten stabil sein."
|
||||||
|
|
||||||
@ -5637,6 +5958,9 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2566503670
|
|||||||
-- No minimum confidence level chosen
|
-- No minimum confidence level chosen
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2828607242"] = "Kein Mindestvertrauensniveau ausgewählt"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2828607242"] = "Kein Mindestvertrauensniveau ausgewählt"
|
||||||
|
|
||||||
|
-- Supporters
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2929332068"] = "Unterstützer"
|
||||||
|
|
||||||
-- Do not specify the language
|
-- Do not specify the language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2960082609"] = "Sprache nicht festlegen"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2960082609"] = "Sprache nicht festlegen"
|
||||||
|
|
||||||
@ -5658,6 +5982,9 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3491430707
|
|||||||
-- Install updates automatically
|
-- Install updates automatically
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3569059463"] = "Updates automatisch installieren"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3569059463"] = "Updates automatisch installieren"
|
||||||
|
|
||||||
|
-- Use app default profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3587225583"] = "Standardprofil der App verwenden"
|
||||||
|
|
||||||
-- Disable workspaces
|
-- Disable workspaces
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3612390107"] = "Arbeitsbereiche deaktivieren"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3612390107"] = "Arbeitsbereiche deaktivieren"
|
||||||
|
|
||||||
@ -5667,9 +5994,15 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3711207137
|
|||||||
-- Also show features in alpha: these are in development; expect bugs and missing features
|
-- 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."
|
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."
|
||||||
|
|
||||||
|
-- Information
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4256323669"] = "Information"
|
||||||
|
|
||||||
-- All preview features are hidden
|
-- All preview features are hidden
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4289410063"] = "Alle Vorschaufunktionen sind ausgeblendet"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4289410063"] = "Alle Vorschaufunktionen sind ausgeblendet"
|
||||||
|
|
||||||
|
-- Chat
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T578410699"] = "Chat"
|
||||||
|
|
||||||
-- When possible, use the LLM provider which was used for each chat in the first place
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T75376144"] = "Wenn möglich, verwende den LLM-Anbieter, der ursprünglich für jeden Chat verwendet wurde."
|
||||||
|
|
||||||
@ -5838,6 +6171,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1546040625"] = "Meine A
|
|||||||
-- Grammar & Spelling Assistant
|
-- Grammar & Spelling Assistant
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T166453786"] = "Grammatik- & Rechtschreib-Assistent"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T166453786"] = "Grammatik- & Rechtschreib-Assistent"
|
||||||
|
|
||||||
|
-- Slide Assistant
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1883918574"] = "Folienassistent"
|
||||||
|
|
||||||
-- Legal Check Assistant
|
-- Legal Check Assistant
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1886447798"] = "Rechtlichen Prüfungs-Assistent"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1886447798"] = "Rechtlichen Prüfungs-Assistent"
|
||||||
|
|
||||||
@ -5898,6 +6234,15 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T3893997203"] = "
|
|||||||
-- Trust all LLM providers
|
-- Trust all LLM providers
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T4107860491"] = "Allen LLM-Anbietern vertrauen"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T4107860491"] = "Allen LLM-Anbietern vertrauen"
|
||||||
|
|
||||||
|
-- Reason
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::NODATABASECLIENT::T1093747001"] = "Grund"
|
||||||
|
|
||||||
|
-- Unavailable
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::NODATABASECLIENT::T3662391977"] = "Nicht verfügbar"
|
||||||
|
|
||||||
|
-- Status
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::NODATABASECLIENT::T6222351"] = "Status"
|
||||||
|
|
||||||
-- Storage size
|
-- Storage size
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::QDRANT::QDRANTCLIENTIMPLEMENTATION::T1230141403"] = "Speichergröße"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::QDRANT::QDRANTCLIENTIMPLEMENTATION::T1230141403"] = "Speichergröße"
|
||||||
|
|
||||||
@ -6521,3 +6866,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T1307384014"] = "Unbenannt
|
|||||||
|
|
||||||
-- Delete Chat
|
-- Delete Chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Chat löschen"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Chat löschen"
|
||||||
|
|
||||||
|
-- Unnamed chat
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T3310482275"] = "Unbenannter Chat"
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
SVG = [[<svg viewBox="0 0 650 650" style="fill-rule:evenodd;clip-rule:evenodd">
|
SVG = [[<svg viewBox="0 0 650 650" style="fill-rule:evenodd;clip-rule:evenodd">
|
||||||
<path style="fill:none" d="M0 0h650v650H0z"/>
|
<path style="fill:none" d="M0 0h650v650H0z"/>
|
||||||
<clipPath id="a">
|
<clipPath id="clip-en-us">
|
||||||
<path d="M0 0h650v650H0z"/>
|
<path d="M0 0h650v650H0z"/>
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<g clip-path="url(#a)">
|
<g clip-path="url(#clip-en-us)">
|
||||||
<path d="M208.018 21.723C244.323 7.694 283.77 0 325 0c44.15 0 86.256 8.823 124.649 24.8a319.796 319.796 0 0 1 9.251 4.02A324.269 324.269 0 0 1 494 47.402 326.269 326.269 0 0 1 532.582 75c33.111 27.531 60.675 61.509 80.757 100a322.631 322.631 0 0 1 32.831 100 326.842 326.842 0 0 1 3.83 50c0 17.002-1.308 33.7-3.83 50a322.631 322.631 0 0 1-32.831 100c-20.082 38.491-47.646 72.469-80.757 100-56.319 46.827-128.686 75-207.582 75-78.896 0-151.263-28.173-207.582-75-33.111-27.531-60.675-61.509-80.757-100A322.631 322.631 0 0 1 3.83 375a325.032 325.032 0 0 1-2.881-25A328.869 328.869 0 0 1 0 325c0-17.002 1.308-33.7 3.83-50a322.493 322.493 0 0 1 31.196-96.822 323.44 323.44 0 0 1 8.553-15.752C62.893 129.089 87.96 99.493 117.418 75A325.476 325.476 0 0 1 191.1 28.82a324.203 324.203 0 0 1 16.918-7.097Z" style="fill:#b31942;fill-rule:nonzero"/>
|
<path d="M208.018 21.723C244.323 7.694 283.77 0 325 0c44.15 0 86.256 8.823 124.649 24.8a319.796 319.796 0 0 1 9.251 4.02A324.269 324.269 0 0 1 494 47.402 326.269 326.269 0 0 1 532.582 75c33.111 27.531 60.675 61.509 80.757 100a322.631 322.631 0 0 1 32.831 100 326.842 326.842 0 0 1 3.83 50c0 17.002-1.308 33.7-3.83 50a322.631 322.631 0 0 1-32.831 100c-20.082 38.491-47.646 72.469-80.757 100-56.319 46.827-128.686 75-207.582 75-78.896 0-151.263-28.173-207.582-75-33.111-27.531-60.675-61.509-80.757-100A322.631 322.631 0 0 1 3.83 375a325.032 325.032 0 0 1-2.881-25A328.869 328.869 0 0 1 0 325c0-17.002 1.308-33.7 3.83-50a322.493 322.493 0 0 1 31.196-96.822 323.44 323.44 0 0 1 8.553-15.752C62.893 129.089 87.96 99.493 117.418 75A325.476 325.476 0 0 1 191.1 28.82a324.203 324.203 0 0 1 16.918-7.097Z" style="fill:#b31942;fill-rule:nonzero"/>
|
||||||
<path d="M0 75h1235m0 100H0m0 100h1235m0 100H0m0 100h1235m0 100H0" style="fill-rule:nonzero;stroke:#fff;stroke-width:50px"/>
|
<path d="M0 75h1235m0 100H0m0 100h1235m0 100H0m0 100h1235m0 100H0" style="fill-rule:nonzero;stroke:#fff;stroke-width:50px"/>
|
||||||
<path d="M208.018 21.723C244.323 7.694 283.77 0 325 0c44.15 0 86.256 8.823 124.649 24.8a319.796 319.796 0 0 1 9.251 4.02A324.269 324.269 0 0 1 494 47.402V350H.949A328.869 328.869 0 0 1 0 325c0-17.002 1.308-33.7 3.83-50a322.493 322.493 0 0 1 31.196-96.822 323.44 323.44 0 0 1 8.553-15.752C62.893 129.089 87.96 99.493 117.418 75A325.476 325.476 0 0 1 191.1 28.82a324.203 324.203 0 0 1 16.918-7.097Z" style="fill:#0a3161;fill-rule:nonzero"/>
|
<path d="M208.018 21.723C244.323 7.694 283.77 0 325 0c44.15 0 86.256 8.823 124.649 24.8a319.796 319.796 0 0 1 9.251 4.02A324.269 324.269 0 0 1 494 47.402V350H.949A328.869 328.869 0 0 1 0 325c0-17.002 1.308-33.7 3.83-50a322.493 322.493 0 0 1 31.196-96.822 323.44 323.44 0 0 1 8.553-15.752C62.893 129.089 87.96 99.493 117.418 75A325.476 325.476 0 0 1 191.1 28.82a324.203 324.203 0 0 1 16.918-7.097Z" style="fill:#0a3161;fill-rule:nonzero"/>
|
||||||
<path d="M30.895 186.613A317.843 317.843 0 0 1 36.661 175a323.44 323.44 0 0 1 6.918-12.574l2.078 6.394h14.531l-11.756 8.541 4.49 13.819-11.755-8.541-11.756 8.541 1.484-4.567ZM41.167 225l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L41.167 225ZM41.167 295l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L41.167 295ZM82.333 120l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L82.333 120ZM82.333 190l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L82.333 190ZM82.333 260l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L82.333 260ZM123.5 85l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L123.5 85ZM123.5 155l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L123.5 155ZM123.5 225l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L123.5 225ZM123.5 295l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L123.5 295ZM164.667 50l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L164.667 50ZM164.667 120l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L164.667 120ZM164.667 190l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L164.667 190ZM164.667 260l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L164.667 260ZM198.568 37.361l-10.096-7.336c.874-.405 1.75-.807 2.628-1.205h10.243l1.66-5.111a334.886 334.886 0 0 1 5.015-1.986l2.306 7.097h14.53l-11.755 8.541 4.49 13.819-11.756-8.541-11.755 8.541 4.49-13.819ZM205.833 85l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L205.833 85ZM205.833 155l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L205.833 155ZM205.833 225l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L205.833 225ZM205.833 295l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L205.833 295ZM247 50l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L247 50ZM247 120l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L247 120ZM247 190l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L247 190ZM247 260l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L247 260ZM288.167 15l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L288.167 15ZM288.167 85l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L288.167 85ZM288.167 155l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L288.167 155ZM288.167 225l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L288.167 225ZM288.167 295l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L288.167 295ZM329.333 50l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L329.333 50ZM329.333 120l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L329.333 120ZM329.333 190l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L329.333 190ZM329.333 260l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L329.333 260ZM370.5 15l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L370.5 15ZM370.5 85l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L370.5 85ZM370.5 155l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L370.5 155ZM370.5 225l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L370.5 225ZM370.5 295l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L370.5 295ZM411.667 50l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L411.667 50ZM411.667 120l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L411.667 120ZM411.667 190l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L411.667 190ZM411.667 260l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L411.667 260ZM448.343 28.82l1.306-4.02a319.796 319.796 0 0 1 7.405 3.19l.27.83h1.576a320.481 320.481 0 0 1 7.869 3.695l-6.67 4.846 4.49 13.819-11.756-8.541-11.755 8.541 4.49-13.819-11.756-8.541h14.531ZM452.833 85l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L452.833 85ZM452.833 155l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L452.833 155ZM452.833 225l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L452.833 225ZM452.833 295l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L452.833 295Z" style="fill:#fff;fill-rule:nonzero"/>
|
<path d="M30.895 186.613A317.843 317.843 0 0 1 36.661 175a323.44 323.44 0 0 1 6.918-12.574l2.078 6.394h14.531l-11.756 8.541 4.49 13.819-11.755-8.541-11.756 8.541 1.484-4.567ZM41.167 225l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L41.167 225ZM41.167 295l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L41.167 295ZM82.333 120l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L82.333 120ZM82.333 190l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L82.333 190ZM82.333 260l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L82.333 260ZM123.5 85l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L123.5 85ZM123.5 155l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L123.5 155ZM123.5 225l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L123.5 225ZM123.5 295l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L123.5 295ZM164.667 50l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L164.667 50ZM164.667 120l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L164.667 120ZM164.667 190l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L164.667 190ZM164.667 260l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L164.667 260ZM198.568 37.361l-10.096-7.336c.874-.405 1.75-.807 2.628-1.205h10.243l1.66-5.111a334.886 334.886 0 0 1 5.015-1.986l2.306 7.097h14.53l-11.755 8.541 4.49 13.819-11.756-8.541-11.755 8.541 4.49-13.819ZM205.833 85l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L205.833 85ZM205.833 155l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L205.833 155ZM205.833 225l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L205.833 225ZM205.833 295l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L205.833 295ZM247 50l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L247 50ZM247 120l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L247 120ZM247 190l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L247 190ZM247 260l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L247 260ZM288.167 15l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L288.167 15ZM288.167 85l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L288.167 85ZM288.167 155l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L288.167 155ZM288.167 225l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L288.167 225ZM288.167 295l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L288.167 295ZM329.333 50l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L329.333 50ZM329.333 120l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L329.333 120ZM329.333 190l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L329.333 190ZM329.333 260l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L329.333 260ZM370.5 15l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L370.5 15ZM370.5 85l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L370.5 85ZM370.5 155l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L370.5 155ZM370.5 225l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L370.5 225ZM370.5 295l11.756 36.18-30.777-22.36h38.042l-30.777 22.36L370.5 295ZM411.667 50l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L411.667 50ZM411.667 120l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L411.667 120ZM411.667 190l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L411.667 190ZM411.667 260l11.755 36.18-30.776-22.36h38.042l-30.777 22.36L411.667 260ZM448.343 28.82l1.306-4.02a319.796 319.796 0 0 1 7.405 3.19l.27.83h1.576a320.481 320.481 0 0 1 7.869 3.695l-6.67 4.846 4.49 13.819-11.756-8.541-11.755 8.541 4.49-13.819-11.756-8.541h14.531ZM452.833 85l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L452.833 85ZM452.833 155l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L452.833 155ZM452.833 225l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L452.833 225ZM452.833 295l11.756 36.18-30.777-22.36h38.042l-30.776 22.36L452.833 295Z" style="fill:#fff;fill-rule:nonzero"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>]]
|
</svg>]]
|
||||||
|
|||||||
@ -432,6 +432,12 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTA
|
|||||||
-- Load output rules from document
|
-- Load output rules from document
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2168201568"] = "Load output rules from document"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2168201568"] = "Load output rules from document"
|
||||||
|
|
||||||
|
-- Choose whether the policy should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2214900121"] = "Choose whether the policy should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- The analysis rules specify what the AI should pay particular attention to while reviewing the documents you provide, and which aspects it should highlight or save. For example, if you want to extract the potential of green hydrogen for agriculture from a variety of general publications, you can explicitly define this in the analysis rules.
|
-- The analysis rules specify what the AI should pay particular attention to while reviewing the documents you provide, and which aspects it should highlight or save. For example, if you want to extract the potential of green hydrogen for agriculture from a variety of general publications, you can explicitly define this in the analysis rules.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T238145218"] = "The analysis rules specify what the AI should pay particular attention to while reviewing the documents you provide, and which aspects it should highlight or save. For example, if you want to extract the potential of green hydrogen for agriculture from a variety of general publications, you can explicitly define this in the analysis rules."
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::DOCUMENTANALYSIS::DOCUMENTANALYSISASSISTANT::T238145218"] = "The analysis rules specify what the AI should pay particular attention to while reviewing the documents you provide, and which aspects it should highlight or save. For example, if you want to extract the potential of green hydrogen for agriculture from a variety of general publications, you can explicitly define this in the analysis rules."
|
||||||
|
|
||||||
@ -1356,6 +1362,189 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::
|
|||||||
-- Marketing (advertisements, sales texts)
|
-- Marketing (advertisements, sales texts)
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T945714286"] = "Marketing (advertisements, sales texts)"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::REWRITEIMPROVE::WRITINGSTYLESEXTENSIONS::T945714286"] = "Marketing (advertisements, sales texts)"
|
||||||
|
|
||||||
|
-- Children
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T188567026"] = "Children"
|
||||||
|
|
||||||
|
-- Unspecified age group
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T300604284"] = "Unspecified age group"
|
||||||
|
|
||||||
|
-- Adults
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T3335941460"] = "Adults"
|
||||||
|
|
||||||
|
-- Teenagers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEAGEGROUPEXTENSIONS::T3696960735"] = "Teenagers"
|
||||||
|
|
||||||
|
-- No expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T1612807521"] = "No expertise"
|
||||||
|
|
||||||
|
-- Intermediate expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T2131860427"] = "Intermediate expertise"
|
||||||
|
|
||||||
|
-- Unspecified expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T2879202483"] = "Unspecified expertise"
|
||||||
|
|
||||||
|
-- Basic expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T2909686714"] = "Basic expertise"
|
||||||
|
|
||||||
|
-- Experts
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEEXPERTISEEXTENSIONS::T3130182982"] = "Experts"
|
||||||
|
|
||||||
|
-- Individual contributors
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T1893672448"] = "Individual contributors"
|
||||||
|
|
||||||
|
-- Team leads
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2112906979"] = "Team leads"
|
||||||
|
|
||||||
|
-- Board members
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2483400884"] = "Board members"
|
||||||
|
|
||||||
|
-- Unspecified organizational level
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2633679224"] = "Unspecified organizational level"
|
||||||
|
|
||||||
|
-- Trainees
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T2678344512"] = "Trainees"
|
||||||
|
|
||||||
|
-- Managers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T3187355853"] = "Managers"
|
||||||
|
|
||||||
|
-- Executives
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEORGANIZATIONALLEVELEXTENSIONS::T3317335174"] = "Executives"
|
||||||
|
|
||||||
|
-- Journalists
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1589799277"] = "Journalists"
|
||||||
|
|
||||||
|
-- Healthcare professionals
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1652521346"] = "Healthcare professionals"
|
||||||
|
|
||||||
|
-- Unspecified audience profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1845793571"] = "Unspecified audience profile"
|
||||||
|
|
||||||
|
-- Lawyers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T1959098902"] = "Lawyers"
|
||||||
|
|
||||||
|
-- Investors
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T2516036290"] = "Investors"
|
||||||
|
|
||||||
|
-- Students
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T2905889225"] = "Students"
|
||||||
|
|
||||||
|
-- Scientists
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T332785734"] = "Scientists"
|
||||||
|
|
||||||
|
-- Business professionals
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T3670621687"] = "Business professionals"
|
||||||
|
|
||||||
|
-- Engineers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T3904961809"] = "Engineers"
|
||||||
|
|
||||||
|
-- Public officials
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T439009390"] = "Public officials"
|
||||||
|
|
||||||
|
-- Software developers
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::AUDIENCEPROFILEEXTENSIONS::T831424531"] = "Software developers"
|
||||||
|
|
||||||
|
-- Important Aspects
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1379883528"] = "Important Aspects"
|
||||||
|
|
||||||
|
-- Extent of the planned presentation
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1408740929"] = "Extent of the planned presentation"
|
||||||
|
|
||||||
|
-- You might want to specify important aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1672597841"] = "You might want to specify important aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted."
|
||||||
|
|
||||||
|
-- Details about the desired presentation
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1793579367"] = "Details about the desired presentation"
|
||||||
|
|
||||||
|
-- Text content
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1820253043"] = "Text content"
|
||||||
|
|
||||||
|
-- Slide Assistant
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T1883918574"] = "Slide Assistant"
|
||||||
|
|
||||||
|
-- Please provide a text or at least one valid document or image.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2013746884"] = "Please provide a text or at least one valid document or image."
|
||||||
|
|
||||||
|
-- Content to derive slide from
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2086228265"] = "Content to derive slide from"
|
||||||
|
|
||||||
|
-- Target language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T237828418"] = "Target language"
|
||||||
|
|
||||||
|
-- (Optional) Important Aspects
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T24391765"] = "(Optional) Important Aspects"
|
||||||
|
|
||||||
|
-- Audience age group
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2496533563"] = "Audience age group"
|
||||||
|
|
||||||
|
-- You can enter text, use one or more documents or images, or use both. At least one of these options is required.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2542045947"] = "You can enter text, use one or more documents or images, or use both. At least one of these options is required."
|
||||||
|
|
||||||
|
-- Language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2591284123"] = "Language"
|
||||||
|
|
||||||
|
-- Audience organizational level
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2599228833"] = "Audience organizational level"
|
||||||
|
|
||||||
|
-- Number of slides
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2823798965"] = "Number of slides"
|
||||||
|
|
||||||
|
-- This assistant helps you create clear, structured slides from long texts or documents. Enter a presentation title and provide the content either as text or with one or more documents. Important aspects allow you to add instructions to the LLM regarding output or formatting. Set the number of slides either directly or based on your desired presentation duration. You can also specify the number of bullet points. If the default value of 0 is not changed, the LLM will independently determine how many slides or bullet points to generate. The output can be flexibly generated in various languages and tailored to a specific audience.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T2910177051"] = "This assistant helps you create clear, structured slides from long texts or documents. Enter a presentation title and provide the content either as text or with one or more documents. Important aspects allow you to add instructions to the LLM regarding output or formatting. Set the number of slides either directly or based on your desired presentation duration. You can also specify the number of bullet points. If the default value of 0 is not changed, the LLM will independently determine how many slides or bullet points to generate. The output can be flexibly generated in various languages and tailored to a specific audience."
|
||||||
|
|
||||||
|
-- The result of your previous slide builder session.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3000286990"] = "The result of your previous slide builder session."
|
||||||
|
|
||||||
|
-- Please enter a title for the presentation. This will help the LLM to select more relevant content.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3013824309"] = "Please enter a title for the presentation. This will help the LLM to select more relevant content."
|
||||||
|
|
||||||
|
-- Please provide a title
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3049299559"] = "Please provide a title"
|
||||||
|
|
||||||
|
-- Create Slides
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3079776593"] = "Create Slides"
|
||||||
|
|
||||||
|
-- Please specify the audience for the planned presentation. This will help the LLM to create a presentation that fits your needs. You can specify the audience profile, the age group, organizational level, and the expertise. You don't have to specify all of these parameters, for example you might only want to specify the audience profile and leave the other parameters at their default values.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3465256803"] = "Please specify the audience for the planned presentation. This will help the LLM to create a presentation that fits your needs. You can specify the audience profile, the age group, organizational level, and the expertise. You don't have to specify all of these parameters, for example you might only want to specify the audience profile and leave the other parameters at their default values."
|
||||||
|
|
||||||
|
-- (Optional) Specify aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3476149293"] = "(Optional) Specify aspects that the LLM should consider when creating the slides. For example, the use of emojis or specific topics that should be highlighted."
|
||||||
|
|
||||||
|
-- Audience
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3506118019"] = "Audience"
|
||||||
|
|
||||||
|
-- Time specification (minutes)
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3539067305"] = "Time specification (minutes)"
|
||||||
|
|
||||||
|
-- Audience profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3649769130"] = "Audience profile"
|
||||||
|
|
||||||
|
-- Attach documents
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3666048746"] = "Attach documents"
|
||||||
|
|
||||||
|
-- Number of bullet points
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3796347042"] = "Number of bullet points"
|
||||||
|
|
||||||
|
-- Custom target language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3848935911"] = "Custom target language"
|
||||||
|
|
||||||
|
-- Presentation title
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3893271035"] = "Presentation title"
|
||||||
|
|
||||||
|
-- {0} - Slide Builder Session
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T3922788056"] = "{0} - Slide Builder Session"
|
||||||
|
|
||||||
|
-- Please specify the extent of the planned presentation. This can be the number of slides, the number of bullet points per slide, or the time specification for the presentation. This will help the LLM to create a presentation that fits your needs. Leave the default values if you don't have specific requirements regarding the extent of the presentation. You might only want to specify one of these parameters, for example the time specification, and leave the others at their default values.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T4131419342"] = "Please specify the extent of the planned presentation. This can be the number of slides, the number of bullet points per slide, or the time specification for the presentation. This will help the LLM to create a presentation that fits your needs. Leave the default values if you don't have specific requirements regarding the extent of the presentation. You might only want to specify one of these parameters, for example the time specification, and leave the others at their default values."
|
||||||
|
|
||||||
|
-- Audience expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T4279519256"] = "Audience expertise"
|
||||||
|
|
||||||
|
-- Title
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T617902505"] = "Title"
|
||||||
|
|
||||||
|
-- Please provide a custom language.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SLIDEBUILDER::SLIDEASSISTANT::T656744944"] = "Please provide a custom language."
|
||||||
|
|
||||||
-- Your word or phrase
|
-- Your word or phrase
|
||||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T1847246020"] = "Your word or phrase"
|
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::SYNONYM::ASSISTANTSYNONYMS::T1847246020"] = "Your word or phrase"
|
||||||
|
|
||||||
@ -1593,6 +1782,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1133040906"] = "Move chat
|
|||||||
-- Are you sure you want to move this chat? All unsaved changes will be lost.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1142475422"] = "Are you sure you want to move this chat? All unsaved changes will be lost."
|
||||||
|
|
||||||
|
-- Bold
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1165397398"] = "Bold"
|
||||||
|
|
||||||
-- Stop generation
|
-- Stop generation
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1317408357"] = "Stop generation"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1317408357"] = "Stop generation"
|
||||||
|
|
||||||
@ -1605,9 +1797,18 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1849313532"] = "Type your
|
|||||||
-- Your Prompt (use selected instance '{0}', provider '{1}')
|
-- Your Prompt (use selected instance '{0}', provider '{1}')
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1967611328"] = "Your Prompt (use selected instance '{0}', provider '{1}')"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T1967611328"] = "Your Prompt (use selected instance '{0}', provider '{1}')"
|
||||||
|
|
||||||
|
-- Code
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2036185364"] = "Code"
|
||||||
|
|
||||||
|
-- Italic
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2377171085"] = "Italic"
|
||||||
|
|
||||||
-- Profile usage is disabled according to your chat template settings.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2670286472"] = "Profile usage is disabled according to your chat template settings."
|
||||||
|
|
||||||
|
-- Bulleted List
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2957125464"] = "Bulleted List"
|
||||||
|
|
||||||
-- Delete this chat & start a new one.
|
-- Delete this chat & start a new one.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2991985411"] = "Delete this chat & start a new one."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T2991985411"] = "Delete this chat & start a new one."
|
||||||
|
|
||||||
@ -1626,6 +1827,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3928697643"] = "Start new
|
|||||||
-- New disappearing chat
|
-- New disappearing chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4113970938"] = "New disappearing chat"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4113970938"] = "New disappearing chat"
|
||||||
|
|
||||||
|
-- Heading
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T4231005109"] = "Heading"
|
||||||
|
|
||||||
-- Please select the workspace where you want to move the chat to.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T474393241"] = "Please select the workspace where you want to move the chat to."
|
||||||
|
|
||||||
@ -1770,6 +1974,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T700666808"] = "Mana
|
|||||||
-- Available Data Sources
|
-- Available Data Sources
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T86053874"] = "Available Data Sources"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::DATASOURCESELECTION::T86053874"] = "Available Data Sources"
|
||||||
|
|
||||||
|
-- LLMs can make mistakes. Check important information.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::HALLUZINATIONREMINDER::T3528806904"] = "LLMs can make mistakes. Check important information."
|
||||||
|
|
||||||
-- Issues
|
-- Issues
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ISSUES::T3229841001"] = "Issues"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::ISSUES::T3229841001"] = "Issues"
|
||||||
|
|
||||||
@ -2064,6 +2271,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1364944735"]
|
|||||||
-- Select preview features
|
-- Select preview features
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1439783084"] = "Select preview features"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1439783084"] = "Select preview features"
|
||||||
|
|
||||||
|
-- Your organization provided a default start page, but you can still change it.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1454730224"] = "Your organization provided a default start page, but you can still change it."
|
||||||
|
|
||||||
-- Select the desired behavior for the navigation bar.
|
-- Select the desired behavior for the navigation bar.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1555038969"] = "Select the desired behavior for the navigation bar."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T1555038969"] = "Select the desired behavior for the navigation bar."
|
||||||
|
|
||||||
@ -2112,6 +2322,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591284123"]
|
|||||||
-- Administration settings are visible
|
-- Administration settings are visible
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591866808"] = "Administration settings are visible"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2591866808"] = "Administration settings are visible"
|
||||||
|
|
||||||
|
-- Choose which page AI Studio should open first when you start the app. Changes take effect the next time you launch AI Studio.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T2655930524"] = "Choose which page AI Studio should open first when you start the app. Changes take effect the next time you launch AI Studio."
|
||||||
|
|
||||||
-- Save energy?
|
-- Save energy?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3100928009"] = "Save energy?"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T3100928009"] = "Save energy?"
|
||||||
|
|
||||||
@ -2160,6 +2373,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T71162186"] =
|
|||||||
-- Energy saving is disabled
|
-- Energy saving is disabled
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T716338721"] = "Energy saving is disabled"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T716338721"] = "Energy saving is disabled"
|
||||||
|
|
||||||
|
-- Start page
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T78084670"] = "Start page"
|
||||||
|
|
||||||
-- Preview feature visibility
|
-- Preview feature visibility
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T817101267"] = "Preview feature visibility"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::SETTINGS::SETTINGSPANELAPP::T817101267"] = "Preview feature visibility"
|
||||||
|
|
||||||
@ -2520,6 +2736,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T428040679"] = "Content creation"
|
|||||||
-- Useful assistants
|
-- Useful assistants
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T586430036"] = "Useful assistants"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T586430036"] = "Useful assistants"
|
||||||
|
|
||||||
|
-- Voice recording has been disabled for this session because audio playback could not be initialized on the client.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T1123032432"] = "Voice recording has been disabled for this session because audio playback could not be initialized on the client."
|
||||||
|
|
||||||
-- Failed to create the transcription provider.
|
-- Failed to create the transcription provider.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T1689988905"] = "Failed to create the transcription provider."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T1689988905"] = "Failed to create the transcription provider."
|
||||||
|
|
||||||
@ -2529,6 +2748,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2144994226"] = "Failed to
|
|||||||
-- Stop recording and start transcription
|
-- Stop recording and start transcription
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T224155287"] = "Stop recording and start transcription"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T224155287"] = "Stop recording and start transcription"
|
||||||
|
|
||||||
|
-- Voice recording is unavailable because the client could not initialize audio playback.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2260302339"] = "Voice recording is unavailable because the client could not initialize audio playback."
|
||||||
|
|
||||||
-- Start recording your voice for a transcription
|
-- Start recording your voice for a transcription
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2372624045"] = "Start recording your voice for a transcription"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VOICERECORDER::T2372624045"] = "Start recording your voice for a transcription"
|
||||||
|
|
||||||
@ -2559,8 +2781,8 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1016188706"] = "Are you sure
|
|||||||
-- Move chat
|
-- Move chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1133040906"] = "Move chat"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1133040906"] = "Move chat"
|
||||||
|
|
||||||
-- Unnamed workspace
|
-- Loading chats...
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1307384014"] = "Unnamed workspace"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1364857726"] = "Loading chats..."
|
||||||
|
|
||||||
-- Delete
|
-- Delete
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1469573738"] = "Delete"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T1469573738"] = "Delete"
|
||||||
@ -2616,9 +2838,6 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T323280982"] = "Please enter
|
|||||||
-- Please enter a workspace name.
|
-- Please enter a workspace name.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3288132732"] = "Please enter a workspace name."
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3288132732"] = "Please enter a workspace name."
|
||||||
|
|
||||||
-- Unnamed chat
|
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3310482275"] = "Unnamed chat"
|
|
||||||
|
|
||||||
-- Rename
|
-- Rename
|
||||||
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3355849203"] = "Rename"
|
UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::WORKSPACES::T3355849203"] = "Rename"
|
||||||
|
|
||||||
@ -2745,6 +2964,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T380891852"] = "Example
|
|||||||
-- Actions
|
-- Actions
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3865031940"] = "Actions"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3865031940"] = "Actions"
|
||||||
|
|
||||||
|
-- Load system prompt from file
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3883091650"] = "Load system prompt from file"
|
||||||
|
|
||||||
-- Messages per page
|
-- Messages per page
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3893704289"] = "Messages per page"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::CHATTEMPLATEDIALOG::T3893704289"] = "Messages per page"
|
||||||
|
|
||||||
@ -3537,6 +3759,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1870831108"] = "Failed to l
|
|||||||
-- Please enter a model name.
|
-- Please enter a model name.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1936099896"] = "Please enter a model name."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T1936099896"] = "Please enter a model name."
|
||||||
|
|
||||||
|
-- Additional API parameters must form a JSON object.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2051143391"] = "Additional API parameters must form a JSON object."
|
||||||
|
|
||||||
-- Model
|
-- Model
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2189814010"] = "Model"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2189814010"] = "Model"
|
||||||
|
|
||||||
@ -3558,12 +3783,18 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T2842060373"] = "Instance Na
|
|||||||
-- Show Expert Settings
|
-- Show Expert Settings
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3361153305"] = "Show Expert Settings"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3361153305"] = "Show Expert Settings"
|
||||||
|
|
||||||
|
-- Invalid JSON: Add the parameters in proper JSON formatting, e.g., \"temperature\": 0.5. Remove trailing commas. The usual surrounding curly brackets {} must not be used, though.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3502745319"] = "Invalid JSON: Add the parameters in proper JSON formatting, e.g., \\\"temperature\\\": 0.5. Remove trailing commas. The usual surrounding curly brackets {} must not be used, though."
|
||||||
|
|
||||||
-- Show available models
|
-- Show available models
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3763891899"] = "Show available models"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3763891899"] = "Show available models"
|
||||||
|
|
||||||
-- This host uses the model configured at the provider level. No model selection is available.
|
-- This host uses the model configured at the provider level. No model selection is available.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3783329915"] = "This host uses the model configured at the provider level. No model selection is available."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3783329915"] = "This host uses the model configured at the provider level. No model selection is available."
|
||||||
|
|
||||||
|
-- Duplicate key '{0}' found.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T3804472591"] = "Duplicate key '{0}' found."
|
||||||
|
|
||||||
-- Currently, we cannot query the models for the selected provider and/or host. Therefore, please enter the model name manually.
|
-- Currently, we cannot query the models for the selected provider and/or host. Therefore, please enter the model name manually.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T4116737656"] = "Currently, we cannot query the models for the selected provider and/or host. Therefore, please enter the model name manually."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::PROVIDERDIALOG::T4116737656"] = "Currently, we cannot query the models for the selected provider and/or host. Therefore, please enter the model name manually."
|
||||||
|
|
||||||
@ -3744,6 +3975,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1471770981"
|
|||||||
-- Preselect whether participants needs to arrive and depart
|
-- Preselect whether participants needs to arrive and depart
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1648427207"] = "Preselect whether participants needs to arrive and depart"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1648427207"] = "Preselect whether participants needs to arrive and depart"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- Preselect a start time?
|
-- Preselect a start time?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1901151023"] = "Preselect a start time?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1901151023"] = "Preselect a start time?"
|
||||||
|
|
||||||
@ -3756,8 +3990,8 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T1998244307"
|
|||||||
-- Preselect whether the meeting is virtual
|
-- Preselect whether the meeting is virtual
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2084951012"] = "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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- When enabled, you can preselect most agenda options. This is might be useful when you need to create similar agendas often.
|
-- 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."
|
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."
|
||||||
@ -3810,9 +4044,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3709527588"
|
|||||||
-- Preselect a topic?
|
-- Preselect a topic?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T3835166371"] = "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
|
-- Preselect the agenda language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4055846391"] = "Preselect the agenda language"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGAGENDA::T4055846391"] = "Preselect the agenda language"
|
||||||
|
|
||||||
@ -3849,15 +4080,18 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1608
|
|||||||
-- Yes, you can only retrieve one bias per 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"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1765683725"] = "Yes, you can only retrieve one bias per day"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- Reset
|
-- Reset
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T180921696"] = "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.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2305356277"] = "No restriction. You can retrieve as many biases as you want per day."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Which language should be preselected?
|
-- Which language should be preselected?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2345162613"] = "Which language should be preselected?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T2345162613"] = "Which language should be preselected?"
|
||||||
|
|
||||||
@ -3882,9 +4116,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3848
|
|||||||
-- Options are preselected
|
-- Options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGASSISTANTBIAS::T3875604319"] = "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.
|
-- 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."
|
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."
|
||||||
|
|
||||||
@ -3915,8 +4146,11 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1773585398"]
|
|||||||
-- Provider selection when creating new chats
|
-- Provider selection when creating new chats
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T189306836"] = "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?
|
-- Choose whether chats should use the app default profile, no profile, or a specific profile.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1933521846"] = "Would you like to set one of your profiles as the default for chats?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T1915793195"] = "Choose whether chats should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Apply default data source option when sending assistant results to chat
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T2510376349"] = "Apply default data source option when sending assistant results to chat"
|
||||||
@ -3954,9 +4188,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3730599555"]
|
|||||||
-- Latest message is shown, after loading a chat
|
-- Latest message is shown, after loading a chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T3755993611"] = "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?
|
-- 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?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCHAT::T4033153439"] = "Do you want to apply the default data source options when sending assistant results to chat?"
|
||||||
|
|
||||||
@ -4017,11 +4248,14 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1073540083"
|
|||||||
-- Compiler messages are preselected
|
-- Compiler messages are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1110902070"] = "Compiler messages are preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1110902070"] = "Compiler messages are preselected"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- Preselect a programming language
|
-- Preselect a programming language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2181567002"] = "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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- When enabled, you can preselect the coding options. This is might be useful when you prefer a specific programming language or LLM model.
|
-- 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."
|
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."
|
||||||
@ -4038,9 +4272,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3015105896"
|
|||||||
-- Coding options are preselected
|
-- Coding options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T3567850751"] = "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
|
-- Preselect another programming language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4230412334"] = "Preselect another programming language"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGCODING::T4230412334"] = "Preselect another programming language"
|
||||||
|
|
||||||
@ -4140,14 +4371,17 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T12806662
|
|||||||
-- Preselect ERI server options?
|
-- Preselect ERI server options?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1664055662"] = "Preselect ERI server options?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1664055662"] = "Preselect ERI server options?"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- No ERI server options are preselected
|
-- No ERI server options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T1793785587"] = "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.
|
-- 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."
|
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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Close
|
-- Close
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3448155331"] = "Close"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3448155331"] = "Close"
|
||||||
@ -4155,9 +4389,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T34481553
|
|||||||
-- Assistant: ERI Server Options
|
-- Assistant: ERI Server Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T3629372826"] = "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
|
-- ERI server options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T488190224"] = "ERI server options are preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGERISERVER::T488190224"] = "ERI server options are preselected"
|
||||||
|
|
||||||
@ -4305,6 +4536,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1633101
|
|||||||
-- Web content reader is not preselected
|
-- Web content reader is not preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1701127912"] = "Web content reader is not preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1701127912"] = "Web content reader is not preselected"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- Content cleaner agent is not preselected
|
-- Content cleaner agent is not preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1969816694"] = "Content cleaner agent is not preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T1969816694"] = "Content cleaner agent is not preselected"
|
||||||
|
|
||||||
@ -4314,8 +4548,8 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2090693
|
|||||||
-- When enabled, you can preselect some legal check options. This is might be useful when you prefer a specific LLM model.
|
-- 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."
|
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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Legal check options are preselected
|
-- Legal check options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T252916114"] = "Legal check options are preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T252916114"] = "Legal check options are preselected"
|
||||||
@ -4335,17 +4569,17 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3641773
|
|||||||
-- Preselect the content cleaner agent?
|
-- Preselect the content cleaner agent?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T3649428096"] = "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
|
-- Assistant: Legal Check Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4033382756"] = "Assistant: Legal Check Options"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T4033382756"] = "Assistant: Legal Check Options"
|
||||||
|
|
||||||
-- Preselect the web content reader?
|
-- Preselect the web content reader?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGLEGALCHECK::T629158142"] = "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?
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Which language should be preselected?
|
-- Which language should be preselected?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2345162613"] = "Which language should be preselected?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T2345162613"] = "Which language should be preselected?"
|
||||||
@ -4368,9 +4602,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3710380967
|
|||||||
-- Options are preselected
|
-- Options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T3875604319"] = "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?
|
-- Preselect options?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T42672465"] = "Preselect options?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGMYTASKS::T42672465"] = "Preselect options?"
|
||||||
|
|
||||||
@ -4458,6 +4689,69 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T3745021518
|
|||||||
-- No rewrite & improve text options are preselected
|
-- No rewrite & improve text options are preselected
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T553954963"] = "No rewrite & improve text options are preselected"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGREWRITE::T553954963"] = "No rewrite & improve text options are preselected"
|
||||||
|
|
||||||
|
-- Preselect the audience expertise
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1017131030"] = "Preselect the audience expertise"
|
||||||
|
|
||||||
|
-- When enabled, you can preselect slide builder options. This is might be useful when you prefer a specific language or LLM model.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1393378753"] = "When enabled, you can preselect slide builder options. This is might be useful when you prefer a specific language or LLM model."
|
||||||
|
|
||||||
|
-- Preselect aspects for the LLM to focus on when generating slides, such as bullet points or specific topics to emphasize.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1528169602"] = "Preselect aspects for the LLM to focus on when generating slides, such as bullet points or specific topics to emphasize."
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
|
-- Preselect the audience organizational level
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2014662371"] = "Preselect the audience organizational level"
|
||||||
|
|
||||||
|
-- Which audience organizational level should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T216511105"] = "Which audience organizational level should be preselected?"
|
||||||
|
|
||||||
|
-- Preselect Slide Assistant options?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T227645894"] = "Preselect Slide Assistant options?"
|
||||||
|
|
||||||
|
-- Preselect a profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
|
-- Which language should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2345162613"] = "Which language should be preselected?"
|
||||||
|
|
||||||
|
-- Preselect another language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2382415529"] = "Preselect another language"
|
||||||
|
|
||||||
|
-- Preselect the language
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2571465005"] = "Preselect the language"
|
||||||
|
|
||||||
|
-- Preselect the audience age group
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T2645589441"] = "Preselect the audience age group"
|
||||||
|
|
||||||
|
-- Assistant: Slide Assistant Options
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3215549988"] = "Assistant: Slide Assistant Options"
|
||||||
|
|
||||||
|
-- Which audience expertise should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3228597992"] = "Which audience expertise should be preselected?"
|
||||||
|
|
||||||
|
-- Close
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3448155331"] = "Close"
|
||||||
|
|
||||||
|
-- Preselect important aspects
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T3705987833"] = "Preselect important aspects"
|
||||||
|
|
||||||
|
-- No Slide Assistant options are preselected
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T4214398691"] = "No Slide Assistant options are preselected"
|
||||||
|
|
||||||
|
-- Preselect the audience profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T861397972"] = "Preselect the audience profile"
|
||||||
|
|
||||||
|
-- Slide Assistant options are preselected
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T93124146"] = "Slide Assistant options are preselected"
|
||||||
|
|
||||||
|
-- Which audience age group should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T956845877"] = "Which audience age group should be preselected?"
|
||||||
|
|
||||||
|
-- Which audience profile should be preselected?
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGSLIDEBUILDER::T973572510"] = "Which audience profile should be preselected?"
|
||||||
|
|
||||||
-- When enabled, you can preselect synonym options. This is might be useful when you prefer a specific language or LLM model.
|
-- 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."
|
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."
|
||||||
|
|
||||||
@ -4677,6 +4971,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1417
|
|||||||
-- Preselect another target language
|
-- Preselect another target language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1462295644"] = "Preselect another target language"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1462295644"] = "Preselect another target language"
|
||||||
|
|
||||||
|
-- Choose whether the assistant should use the app default profile, no profile, or a specific profile.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T1766361623"] = "Choose whether the assistant should use the app default profile, no profile, or a specific profile."
|
||||||
|
|
||||||
-- Assistant: Writing E-Mails Options
|
-- Assistant: Writing E-Mails Options
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2021226503"] = "Assistant: Writing E-Mails Options"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2021226503"] = "Assistant: Writing E-Mails Options"
|
||||||
|
|
||||||
@ -4686,8 +4983,8 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2116
|
|||||||
-- Preselect your name for the closing salutation?
|
-- Preselect your name for the closing salutation?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T221974240"] = "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?
|
-- Preselect a profile
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2221665527"] = "Would you like to preselect one of your profiles?"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T2322771068"] = "Preselect a profile"
|
||||||
|
|
||||||
-- Preselect a writing style
|
-- Preselect a writing style
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T28456020"] = "Preselect a writing style"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T28456020"] = "Preselect a writing style"
|
||||||
@ -4707,9 +5004,6 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3547
|
|||||||
-- Preselect e-mail options?
|
-- Preselect e-mail options?
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGWRITINGEMAILS::T3832719342"] = "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?"
|
|
||||||
|
|
||||||
-- Save
|
-- Save
|
||||||
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SHORTCUTDIALOG::T1294818664"] = "Save"
|
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SHORTCUTDIALOG::T1294818664"] = "Save"
|
||||||
|
|
||||||
@ -4896,6 +5190,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1617786407"] = "Coding"
|
|||||||
-- Analyze a text or an email for tasks you need to complete.
|
-- 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."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1728590051"] = "Analyze a text or an email for tasks you need to complete."
|
||||||
|
|
||||||
|
-- Slide Assistant
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1883918574"] = "Slide Assistant"
|
||||||
|
|
||||||
-- Text Summarizer
|
-- Text Summarizer
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1907192403"] = "Text Summarizer"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T1907192403"] = "Text Summarizer"
|
||||||
|
|
||||||
@ -4935,6 +5232,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3011450657"] = "My Tasks"
|
|||||||
-- E-Mail
|
-- E-Mail
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3026443472"] = "E-Mail"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3026443472"] = "E-Mail"
|
||||||
|
|
||||||
|
-- Develop slide content based on a given topic and content.
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T311912219"] = "Develop slide content based on a given topic and content."
|
||||||
|
|
||||||
-- Translate AI Studio text content into other languages
|
-- Translate AI Studio text content into other languages
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3181803840"] = "Translate AI Studio text content into other languages"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T3181803840"] = "Translate AI Studio text content into other languages"
|
||||||
|
|
||||||
@ -4983,6 +5283,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T878695986"] = "Learn about one co
|
|||||||
-- Localization
|
-- Localization
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T897888480"] = "Localization"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::ASSISTANTS::T897888480"] = "Localization"
|
||||||
|
|
||||||
|
-- Reload your workspaces
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T194629703"] = "Reload your workspaces"
|
||||||
|
|
||||||
-- Hide your workspaces
|
-- Hide your workspaces
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2351468526"] = "Hide your workspaces"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::CHAT::T2351468526"] = "Hide your workspaces"
|
||||||
|
|
||||||
@ -5292,6 +5595,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3494984593"] = "Tauri is used to
|
|||||||
-- Motivation
|
-- Motivation
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3563271893"] = "Motivation"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3563271893"] = "Motivation"
|
||||||
|
|
||||||
|
-- not available
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3574465749"] = "not available"
|
||||||
|
|
||||||
-- 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.
|
-- 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::INFORMATION::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."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::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."
|
||||||
|
|
||||||
@ -5313,6 +5619,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T3986423270"] = "Check Pandoc Ins
|
|||||||
-- Versions
|
-- Versions
|
||||||
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T4010195468"] = "Versions"
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T4010195468"] = "Versions"
|
||||||
|
|
||||||
|
-- Database
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T4036243672"] = "Database"
|
||||||
|
|
||||||
-- 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.
|
-- 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::INFORMATION::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."
|
UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::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."
|
||||||
|
|
||||||
@ -5586,12 +5895,21 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1188453609
|
|||||||
-- Show also prototype features: these are works in progress; expect bugs and missing features
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1245257804"] = "Show also prototype features: these are works in progress; expect bugs and missing features"
|
||||||
|
|
||||||
|
-- Settings
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1258653480"] = "Settings"
|
||||||
|
|
||||||
-- No key is sending the input; you have to click the send button
|
-- 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"
|
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
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1402851833"] = "Navigation never expands, no tooltips; there are only icons"
|
||||||
|
|
||||||
|
-- Welcome
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1485461907"] = "Welcome"
|
||||||
|
|
||||||
|
-- Assistants
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1614176092"] = "Assistants"
|
||||||
|
|
||||||
-- Store chats automatically
|
-- Store chats automatically
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1664293672"] = "Store chats automatically"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T1664293672"] = "Store chats automatically"
|
||||||
|
|
||||||
@ -5616,6 +5934,9 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2195945406
|
|||||||
-- Install updates manually
|
-- Install updates manually
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T220653235"] = "Install updates manually"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T220653235"] = "Install updates manually"
|
||||||
|
|
||||||
|
-- Plugins
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2222816203"] = "Plugins"
|
||||||
|
|
||||||
-- Also show features ready for release; these should be stable
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2301448762"] = "Also show features ready for release; these should be stable"
|
||||||
|
|
||||||
@ -5637,6 +5958,9 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2566503670
|
|||||||
-- No minimum confidence level chosen
|
-- No minimum confidence level chosen
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2828607242"] = "No minimum confidence level chosen"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2828607242"] = "No minimum confidence level chosen"
|
||||||
|
|
||||||
|
-- Supporters
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2929332068"] = "Supporters"
|
||||||
|
|
||||||
-- Do not specify the language
|
-- Do not specify the language
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2960082609"] = "Do not specify the language"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T2960082609"] = "Do not specify the language"
|
||||||
|
|
||||||
@ -5658,6 +5982,9 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3491430707
|
|||||||
-- Install updates automatically
|
-- Install updates automatically
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3569059463"] = "Install updates automatically"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3569059463"] = "Install updates automatically"
|
||||||
|
|
||||||
|
-- Use app default profile
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3587225583"] = "Use app default profile"
|
||||||
|
|
||||||
-- Disable workspaces
|
-- Disable workspaces
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3612390107"] = "Disable workspaces"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3612390107"] = "Disable workspaces"
|
||||||
|
|
||||||
@ -5667,9 +5994,15 @@ UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T3711207137
|
|||||||
-- Also show features in alpha: these are in development; expect bugs and missing features
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4146964761"] = "Also show features in alpha: these are in development; expect bugs and missing features"
|
||||||
|
|
||||||
|
-- Information
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4256323669"] = "Information"
|
||||||
|
|
||||||
-- All preview features are hidden
|
-- All preview features are hidden
|
||||||
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4289410063"] = "All preview features are hidden"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T4289410063"] = "All preview features are hidden"
|
||||||
|
|
||||||
|
-- Chat
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T578410699"] = "Chat"
|
||||||
|
|
||||||
-- When possible, use the LLM provider which was used for each chat in the first place
|
-- 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"
|
UI_TEXT_CONTENT["AISTUDIO::SETTINGS::CONFIGURATIONSELECTDATAFACTORY::T75376144"] = "When possible, use the LLM provider which was used for each chat in the first place"
|
||||||
|
|
||||||
@ -5838,6 +6171,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1546040625"] = "My Task
|
|||||||
-- Grammar & Spelling Assistant
|
-- Grammar & Spelling Assistant
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T166453786"] = "Grammar & Spelling Assistant"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T166453786"] = "Grammar & Spelling Assistant"
|
||||||
|
|
||||||
|
-- Slide Assistant
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1883918574"] = "Slide Assistant"
|
||||||
|
|
||||||
-- Legal Check Assistant
|
-- Legal Check Assistant
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1886447798"] = "Legal Check Assistant"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::COMPONENTSEXTENSIONS::T1886447798"] = "Legal Check Assistant"
|
||||||
|
|
||||||
@ -5898,6 +6234,15 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T3893997203"] = "
|
|||||||
-- Trust all LLM providers
|
-- Trust all LLM providers
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T4107860491"] = "Trust all LLM providers"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::CONFIDENCESCHEMESEXTENSIONS::T4107860491"] = "Trust all LLM providers"
|
||||||
|
|
||||||
|
-- Reason
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::NODATABASECLIENT::T1093747001"] = "Reason"
|
||||||
|
|
||||||
|
-- Unavailable
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::NODATABASECLIENT::T3662391977"] = "Unavailable"
|
||||||
|
|
||||||
|
-- Status
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::NODATABASECLIENT::T6222351"] = "Status"
|
||||||
|
|
||||||
-- Storage size
|
-- Storage size
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::QDRANT::QDRANTCLIENTIMPLEMENTATION::T1230141403"] = "Storage size"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::DATABASES::QDRANT::QDRANTCLIENTIMPLEMENTATION::T1230141403"] = "Storage size"
|
||||||
|
|
||||||
@ -6521,3 +6866,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T1307384014"] = "Unnamed w
|
|||||||
|
|
||||||
-- Delete Chat
|
-- Delete Chat
|
||||||
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Delete Chat"
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T2244038752"] = "Delete Chat"
|
||||||
|
|
||||||
|
-- Unnamed chat
|
||||||
|
UI_TEXT_CONTENT["AISTUDIO::TOOLS::WORKSPACEBEHAVIOUR::T3310482275"] = "Unnamed chat"
|
||||||
|
|||||||
@ -86,37 +86,46 @@ internal sealed class Program
|
|||||||
}
|
}
|
||||||
|
|
||||||
var qdrantInfo = await rust.GetQdrantInfo();
|
var qdrantInfo = await rust.GetQdrantInfo();
|
||||||
if (qdrantInfo.Path == string.Empty)
|
DatabaseClient databaseClient;
|
||||||
|
if (!qdrantInfo.IsAvailable)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Error: Failed to get the Qdrant path from Rust.");
|
Console.WriteLine($"Warning: Qdrant is not available. Starting without vector database. Reason: '{qdrantInfo.UnavailableReason ?? "unknown"}'.");
|
||||||
return;
|
databaseClient = new NoDatabaseClient("Qdrant", qdrantInfo.UnavailableReason);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
if (qdrantInfo.PortHttp == 0)
|
|
||||||
{
|
{
|
||||||
Console.WriteLine("Error: Failed to get the Qdrant HTTP port from Rust.");
|
if (qdrantInfo.Path == string.Empty)
|
||||||
return;
|
{
|
||||||
}
|
Console.WriteLine("Error: Failed to get the Qdrant path from Rust.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qdrantInfo.PortHttp == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error: Failed to get the Qdrant HTTP port from Rust.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (qdrantInfo.PortGrpc == 0)
|
if (qdrantInfo.PortGrpc == 0)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Error: Failed to get the Qdrant gRPC port from Rust.");
|
Console.WriteLine("Error: Failed to get the Qdrant gRPC port from Rust.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qdrantInfo.Fingerprint == string.Empty)
|
if (qdrantInfo.Fingerprint == string.Empty)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Error: Failed to get the Qdrant fingerprint from Rust.");
|
Console.WriteLine("Error: Failed to get the Qdrant fingerprint from Rust.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qdrantInfo.ApiToken == string.Empty)
|
if (qdrantInfo.ApiToken == string.Empty)
|
||||||
{
|
{
|
||||||
Console.WriteLine("Error: Failed to get the Qdrant API token from Rust.");
|
Console.WriteLine("Error: Failed to get the Qdrant API token from Rust.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var databaseClient = new QdrantClientImplementation("Qdrant", qdrantInfo.Path, qdrantInfo.PortHttp, qdrantInfo.PortGrpc, qdrantInfo.Fingerprint, qdrantInfo.ApiToken);
|
databaseClient = new QdrantClientImplementation("Qdrant", qdrantInfo.Path, qdrantInfo.PortHttp, qdrantInfo.PortGrpc, qdrantInfo.Fingerprint, qdrantInfo.ApiToken);
|
||||||
|
}
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder();
|
var builder = WebApplication.CreateBuilder();
|
||||||
builder.WebHost.ConfigureKestrel(kestrelServerOptions =>
|
builder.WebHost.ConfigureKestrel(kestrelServerOptions =>
|
||||||
@ -160,6 +169,7 @@ internal sealed class Program
|
|||||||
builder.Services.AddMudMarkdownClipboardService<MarkdownClipboardService>();
|
builder.Services.AddMudMarkdownClipboardService<MarkdownClipboardService>();
|
||||||
builder.Services.AddSingleton<SettingsManager>();
|
builder.Services.AddSingleton<SettingsManager>();
|
||||||
builder.Services.AddSingleton<ThreadSafeRandom>();
|
builder.Services.AddSingleton<ThreadSafeRandom>();
|
||||||
|
builder.Services.AddSingleton<VoiceRecordingAvailabilityService>();
|
||||||
builder.Services.AddSingleton<DataSourceService>();
|
builder.Services.AddSingleton<DataSourceService>();
|
||||||
builder.Services.AddScoped<PandocAvailabilityService>();
|
builder.Services.AddScoped<PandocAvailabilityService>();
|
||||||
builder.Services.AddTransient<HTMLParser>();
|
builder.Services.AddTransient<HTMLParser>();
|
||||||
@ -169,7 +179,7 @@ internal sealed class Program
|
|||||||
builder.Services.AddHostedService<UpdateService>();
|
builder.Services.AddHostedService<UpdateService>();
|
||||||
builder.Services.AddHostedService<TemporaryChatService>();
|
builder.Services.AddHostedService<TemporaryChatService>();
|
||||||
builder.Services.AddHostedService<EnterpriseEnvironmentService>();
|
builder.Services.AddHostedService<EnterpriseEnvironmentService>();
|
||||||
builder.Services.AddSingleton<DatabaseClient>(databaseClient);
|
builder.Services.AddSingleton(databaseClient);
|
||||||
builder.Services.AddHostedService<GlobalShortcutService>();
|
builder.Services.AddHostedService<GlobalShortcutService>();
|
||||||
builder.Services.AddHostedService<RustAvailabilityMonitorService>();
|
builder.Services.AddHostedService<RustAvailabilityMonitorService>();
|
||||||
|
|
||||||
|
|||||||
@ -29,6 +29,9 @@ public sealed class ProviderAnthropic() : BaseProvider(LLMProviders.ANTHROPIC, "
|
|||||||
|
|
||||||
// Parse the API parameters:
|
// Parse the API parameters:
|
||||||
var apiParameters = this.ParseAdditionalApiParameters("system");
|
var apiParameters = this.ParseAdditionalApiParameters("system");
|
||||||
|
var maxTokens = 4_096;
|
||||||
|
if (TryPopIntParameter(apiParameters, "max_tokens", out var parsedMaxTokens))
|
||||||
|
maxTokens = parsedMaxTokens;
|
||||||
|
|
||||||
// Build the list of messages:
|
// Build the list of messages:
|
||||||
var messages = await chatThread.Blocks.BuildMessagesAsync(
|
var messages = await chatThread.Blocks.BuildMessagesAsync(
|
||||||
@ -73,7 +76,7 @@ public sealed class ProviderAnthropic() : BaseProvider(LLMProviders.ANTHROPIC, "
|
|||||||
Messages = [..messages],
|
Messages = [..messages],
|
||||||
|
|
||||||
System = chatThread.PrepareSystemPrompt(settingsManager),
|
System = chatThread.PrepareSystemPrompt(settingsManager),
|
||||||
MaxTokens = apiParameters.TryGetValue("max_tokens", out var value) && value is int intValue ? intValue : 4_096,
|
MaxTokens = maxTokens,
|
||||||
|
|
||||||
// Right now, we only support streaming completions:
|
// Right now, we only support streaming completions:
|
||||||
Stream = true,
|
Stream = true,
|
||||||
@ -188,4 +191,4 @@ public sealed class ProviderAnthropic() : BaseProvider(LLMProviders.ANTHROPIC, "
|
|||||||
var modelResponse = await response.Content.ReadFromJsonAsync<ModelsResponse>(JSON_SERIALIZER_OPTIONS, token);
|
var modelResponse = await response.Content.ReadFromJsonAsync<ModelsResponse>(JSON_SERIALIZER_OPTIONS, token);
|
||||||
return modelResponse.Data;
|
return modelResponse.Data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -731,7 +731,7 @@ public abstract class BaseProvider : IProvider, ISecretId
|
|||||||
/// <param name="keysToRemove">Optional list of keys to remove from the final dictionary
|
/// <param name="keysToRemove">Optional list of keys to remove from the final dictionary
|
||||||
/// (case-insensitive). The parameters stream, model, and messages are removed by default.</param>
|
/// (case-insensitive). The parameters stream, model, and messages are removed by default.</param>
|
||||||
protected IDictionary<string, object> ParseAdditionalApiParameters(
|
protected IDictionary<string, object> ParseAdditionalApiParameters(
|
||||||
params List<string> keysToRemove)
|
params string[] keysToRemove)
|
||||||
{
|
{
|
||||||
if(string.IsNullOrWhiteSpace(this.AdditionalJsonApiParameters))
|
if(string.IsNullOrWhiteSpace(this.AdditionalJsonApiParameters))
|
||||||
return new Dictionary<string, object>();
|
return new Dictionary<string, object>();
|
||||||
@ -744,14 +744,23 @@ public abstract class BaseProvider : IProvider, ISecretId
|
|||||||
var dict = ConvertToDictionary(jsonDoc);
|
var dict = ConvertToDictionary(jsonDoc);
|
||||||
|
|
||||||
// Some keys are always removed because we set them:
|
// Some keys are always removed because we set them:
|
||||||
keysToRemove.Add("stream");
|
var removeSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||||
keysToRemove.Add("model");
|
if (keysToRemove.Length > 0)
|
||||||
keysToRemove.Add("messages");
|
removeSet.UnionWith(keysToRemove);
|
||||||
|
|
||||||
|
removeSet.Add("stream");
|
||||||
|
removeSet.Add("model");
|
||||||
|
removeSet.Add("messages");
|
||||||
|
|
||||||
// Remove the specified keys (case-insensitive):
|
// Remove the specified keys (case-insensitive):
|
||||||
var removeSet = new HashSet<string>(keysToRemove, StringComparer.OrdinalIgnoreCase);
|
if (removeSet.Count > 0)
|
||||||
foreach (var key in removeSet)
|
{
|
||||||
dict.Remove(key);
|
foreach (var key in dict.Keys.ToList())
|
||||||
|
{
|
||||||
|
if (removeSet.Contains(key))
|
||||||
|
dict.Remove(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return dict;
|
return dict;
|
||||||
}
|
}
|
||||||
@ -761,6 +770,85 @@ public abstract class BaseProvider : IProvider, ISecretId
|
|||||||
return new Dictionary<string, object>();
|
return new Dictionary<string, object>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static bool TryPopIntParameter(IDictionary<string, object> parameters, string key, out int value)
|
||||||
|
{
|
||||||
|
value = default;
|
||||||
|
if (!TryPopParameter(parameters, key, out var raw) || raw is null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
switch (raw)
|
||||||
|
{
|
||||||
|
case int i:
|
||||||
|
value = i;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case long l when l is >= int.MinValue and <= int.MaxValue:
|
||||||
|
value = (int)l;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case double d when d is >= int.MinValue and <= int.MaxValue:
|
||||||
|
value = (int)d;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case decimal m when m is >= int.MinValue and <= int.MaxValue:
|
||||||
|
value = (int)m;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static bool TryPopBoolParameter(IDictionary<string, object> parameters, string key, out bool value)
|
||||||
|
{
|
||||||
|
value = default;
|
||||||
|
if (!TryPopParameter(parameters, key, out var raw) || raw is null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
switch (raw)
|
||||||
|
{
|
||||||
|
case bool b:
|
||||||
|
value = b;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case string s when bool.TryParse(s, out var parsed):
|
||||||
|
value = parsed;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case int i:
|
||||||
|
value = i != 0;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case long l:
|
||||||
|
value = l != 0;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case double d:
|
||||||
|
value = Math.Abs(d) > double.Epsilon;
|
||||||
|
return true;
|
||||||
|
|
||||||
|
case decimal m:
|
||||||
|
value = m != 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool TryPopParameter(IDictionary<string, object> parameters, string key, out object? value)
|
||||||
|
{
|
||||||
|
value = null;
|
||||||
|
if (parameters.Count == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var foundKey = parameters.Keys.FirstOrDefault(k => string.Equals(k, key, StringComparison.OrdinalIgnoreCase));
|
||||||
|
if (foundKey is null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
value = parameters[foundKey];
|
||||||
|
parameters.Remove(foundKey);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private static IDictionary<string, object> ConvertToDictionary(JsonElement element)
|
private static IDictionary<string, object> ConvertToDictionary(JsonElement element)
|
||||||
{
|
{
|
||||||
@ -785,4 +873,4 @@ public abstract class BaseProvider : IProvider, ISecretId
|
|||||||
|
|
||||||
_ => string.Empty,
|
_ => string.Empty,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,11 +14,12 @@ public readonly record struct ChatRequest(
|
|||||||
string Model,
|
string Model,
|
||||||
IList<IMessageBase> Messages,
|
IList<IMessageBase> Messages,
|
||||||
bool Stream,
|
bool Stream,
|
||||||
int RandomSeed,
|
[property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
||||||
|
int? RandomSeed,
|
||||||
bool SafePrompt = false
|
bool SafePrompt = false
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Attention: The "required" modifier is not supported for [JsonExtensionData].
|
// Attention: The "required" modifier is not supported for [JsonExtensionData].
|
||||||
[JsonExtensionData]
|
[JsonExtensionData]
|
||||||
public IDictionary<string, object> AdditionalApiParameters { get; init; } = new Dictionary<string, object>();
|
public IDictionary<string, object> AdditionalApiParameters { get; init; } = new Dictionary<string, object>();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,6 +36,8 @@ public sealed class ProviderMistral() : BaseProvider(LLMProviders.MISTRAL, "http
|
|||||||
|
|
||||||
// Parse the API parameters:
|
// Parse the API parameters:
|
||||||
var apiParameters = this.ParseAdditionalApiParameters();
|
var apiParameters = this.ParseAdditionalApiParameters();
|
||||||
|
var safePrompt = TryPopBoolParameter(apiParameters, "safe_prompt", out var parsedSafePrompt) && parsedSafePrompt;
|
||||||
|
var randomSeed = TryPopIntParameter(apiParameters, "random_seed", out var parsedRandomSeed) ? parsedRandomSeed : (int?)null;
|
||||||
|
|
||||||
// Build the list of messages:
|
// Build the list of messages:
|
||||||
var messages = await chatThread.Blocks.BuildMessagesUsingDirectImageUrlAsync(this.Provider, chatModel);
|
var messages = await chatThread.Blocks.BuildMessagesUsingDirectImageUrlAsync(this.Provider, chatModel);
|
||||||
@ -52,7 +54,8 @@ public sealed class ProviderMistral() : BaseProvider(LLMProviders.MISTRAL, "http
|
|||||||
|
|
||||||
// Right now, we only support streaming completions:
|
// Right now, we only support streaming completions:
|
||||||
Stream = true,
|
Stream = true,
|
||||||
SafePrompt = apiParameters.TryGetValue("safe_prompt", out var value) && value is true,
|
RandomSeed = randomSeed,
|
||||||
|
SafePrompt = safePrompt,
|
||||||
AdditionalApiParameters = apiParameters
|
AdditionalApiParameters = apiParameters
|
||||||
}, JSON_SERIALIZER_OPTIONS);
|
}, JSON_SERIALIZER_OPTIONS);
|
||||||
|
|
||||||
@ -165,4 +168,4 @@ public sealed class ProviderMistral() : BaseProvider(LLMProviders.MISTRAL, "http
|
|||||||
var modelResponse = await response.Content.ReadFromJsonAsync<ModelsResponse>(token);
|
var modelResponse = await response.Content.ReadFromJsonAsync<ModelsResponse>(token);
|
||||||
return modelResponse;
|
return modelResponse;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,6 +22,7 @@ public sealed partial class Routes
|
|||||||
public const string ASSISTANT_EMAIL = "/assistant/email";
|
public const string ASSISTANT_EMAIL = "/assistant/email";
|
||||||
public const string ASSISTANT_LEGAL_CHECK = "/assistant/legal-check";
|
public const string ASSISTANT_LEGAL_CHECK = "/assistant/legal-check";
|
||||||
public const string ASSISTANT_SYNONYMS = "/assistant/synonyms";
|
public const string ASSISTANT_SYNONYMS = "/assistant/synonyms";
|
||||||
|
public const string ASSISTANT_SLIDE_BUILDER = "/assistant/slide-builder";
|
||||||
public const string ASSISTANT_MY_TASKS = "/assistant/my-tasks";
|
public const string ASSISTANT_MY_TASKS = "/assistant/my-tasks";
|
||||||
public const string ASSISTANT_JOB_POSTING = "/assistant/job-posting";
|
public const string ASSISTANT_JOB_POSTING = "/assistant/job-posting";
|
||||||
public const string ASSISTANT_BIAS = "/assistant/bias-of-the-day";
|
public const string ASSISTANT_BIAS = "/assistant/bias-of-the-day";
|
||||||
@ -29,4 +30,4 @@ public sealed partial class Routes
|
|||||||
public const string ASSISTANT_AI_STUDIO_I18N = "/assistant/ai-studio/i18n";
|
public const string ASSISTANT_AI_STUDIO_I18N = "/assistant/ai-studio/i18n";
|
||||||
public const string ASSISTANT_DOCUMENT_ANALYSIS = "/assistant/document-analysis";
|
public const string ASSISTANT_DOCUMENT_ANALYSIS = "/assistant/document-analysis";
|
||||||
// ReSharper restore InconsistentNaming
|
// ReSharper restore InconsistentNaming
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,6 +36,16 @@ public record ConfigMeta<TClass, TValue> : ConfigMetaBase
|
|||||||
/// The ID of the plugin that locked this configuration.
|
/// The ID of the plugin that locked this configuration.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Guid LockedByConfigPluginId { get; private set; }
|
public Guid LockedByConfigPluginId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// How this setting is managed by a configuration plugin, if at all.
|
||||||
|
/// </summary>
|
||||||
|
public ManagedConfigurationMode? ManagedMode { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The ID of the plugin that currently provides an editable default value.
|
||||||
|
/// </summary>
|
||||||
|
public Guid EditableDefaultByConfigPluginId { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The default value for the configuration property. This is used when resetting the property to its default state.
|
/// The default value for the configuration property. This is used when resetting the property to its default state.
|
||||||
@ -65,6 +75,8 @@ public record ConfigMeta<TClass, TValue> : ConfigMetaBase
|
|||||||
{
|
{
|
||||||
this.IsLocked = true;
|
this.IsLocked = true;
|
||||||
this.LockedByConfigPluginId = pluginId;
|
this.LockedByConfigPluginId = pluginId;
|
||||||
|
this.ManagedMode = ManagedConfigurationMode.LOCKED;
|
||||||
|
this.EditableDefaultByConfigPluginId = Guid.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -75,6 +87,9 @@ public record ConfigMeta<TClass, TValue> : ConfigMetaBase
|
|||||||
{
|
{
|
||||||
this.IsLocked = false;
|
this.IsLocked = false;
|
||||||
this.LockedByConfigPluginId = Guid.Empty;
|
this.LockedByConfigPluginId = Guid.Empty;
|
||||||
|
if (this.ManagedMode is ManagedConfigurationMode.LOCKED)
|
||||||
|
this.ManagedMode = null;
|
||||||
|
|
||||||
this.Reset();
|
this.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,6 +100,30 @@ public record ConfigMeta<TClass, TValue> : ConfigMetaBase
|
|||||||
{
|
{
|
||||||
this.IsLocked = false;
|
this.IsLocked = false;
|
||||||
this.LockedByConfigPluginId = Guid.Empty;
|
this.LockedByConfigPluginId = Guid.Empty;
|
||||||
|
if (this.ManagedMode is ManagedConfigurationMode.LOCKED)
|
||||||
|
this.ManagedMode = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Marks the setting as having an editable default provided by a configuration plugin.
|
||||||
|
/// </summary>
|
||||||
|
public void SetEditableDefaultConfiguration(Guid pluginId)
|
||||||
|
{
|
||||||
|
this.IsLocked = false;
|
||||||
|
this.LockedByConfigPluginId = Guid.Empty;
|
||||||
|
this.ManagedMode = ManagedConfigurationMode.EDITABLE_DEFAULT;
|
||||||
|
this.EditableDefaultByConfigPluginId = pluginId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clears the editable-default state without changing the current value.
|
||||||
|
/// </summary>
|
||||||
|
public void ClearEditableDefaultConfiguration()
|
||||||
|
{
|
||||||
|
if (this.ManagedMode is ManagedConfigurationMode.EDITABLE_DEFAULT)
|
||||||
|
this.ManagedMode = null;
|
||||||
|
|
||||||
|
this.EditableDefaultByConfigPluginId = Guid.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -129,4 +168,17 @@ public record ConfigMeta<TClass, TValue> : ConfigMetaBase
|
|||||||
if (memberExpression.Member is System.Reflection.PropertyInfo propertyInfo)
|
if (memberExpression.Member is System.Reflection.PropertyInfo propertyInfo)
|
||||||
propertyInfo.SetValue(configInstance, value);
|
propertyInfo.SetValue(configInstance, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the current value of the configuration property.
|
||||||
|
/// </summary>
|
||||||
|
public TValue GetValue()
|
||||||
|
{
|
||||||
|
var configInstance = this.ConfigSelection.Compile().Invoke(SETTINGS_MANAGER.ConfigurationData);
|
||||||
|
var memberExpression = this.PropertyExpression.GetMemberExpression();
|
||||||
|
if (memberExpression.Member is System.Reflection.PropertyInfo propertyInfo && propertyInfo.GetValue(configInstance) is TValue value)
|
||||||
|
return value;
|
||||||
|
|
||||||
|
return default!;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -23,6 +23,7 @@ public enum ConfigurableAssistant
|
|||||||
BIAS_DAY_ASSISTANT,
|
BIAS_DAY_ASSISTANT,
|
||||||
ERI_ASSISTANT,
|
ERI_ASSISTANT,
|
||||||
DOCUMENT_ANALYSIS_ASSISTANT,
|
DOCUMENT_ANALYSIS_ASSISTANT,
|
||||||
|
SLIDE_BUILDER_ASSISTANT,
|
||||||
|
|
||||||
// ReSharper disable InconsistentNaming
|
// ReSharper disable InconsistentNaming
|
||||||
I18N_ASSISTANT,
|
I18N_ASSISTANT,
|
||||||
|
|||||||
@ -2,6 +2,7 @@ using AIStudio.Assistants.Agenda;
|
|||||||
using AIStudio.Assistants.Coding;
|
using AIStudio.Assistants.Coding;
|
||||||
using AIStudio.Assistants.IconFinder;
|
using AIStudio.Assistants.IconFinder;
|
||||||
using AIStudio.Assistants.RewriteImprove;
|
using AIStudio.Assistants.RewriteImprove;
|
||||||
|
using AIStudio.Assistants.SlideBuilder;
|
||||||
using AIStudio.Assistants.TextSummarizer;
|
using AIStudio.Assistants.TextSummarizer;
|
||||||
using AIStudio.Assistants.EMail;
|
using AIStudio.Assistants.EMail;
|
||||||
using AIStudio.Provider;
|
using AIStudio.Provider;
|
||||||
@ -132,6 +133,17 @@ public static class ConfigurationSelectDataFactory
|
|||||||
yield return new(TB("Always expand navigation"), NavBehavior.ALWAYS_EXPAND);
|
yield return new(TB("Always expand navigation"), NavBehavior.ALWAYS_EXPAND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<ConfigurationSelectData<StartPage>> GetStartPageData()
|
||||||
|
{
|
||||||
|
yield return new(TB("Welcome"), StartPage.HOME);
|
||||||
|
yield return new(TB("Chat"), StartPage.CHAT);
|
||||||
|
yield return new(TB("Assistants"), StartPage.ASSISTANTS);
|
||||||
|
yield return new(TB("Information"), StartPage.INFORMATION);
|
||||||
|
yield return new(TB("Plugins"), StartPage.PLUGINS);
|
||||||
|
yield return new(TB("Supporters"), StartPage.SUPPORTERS);
|
||||||
|
yield return new(TB("Settings"), StartPage.SETTINGS);
|
||||||
|
}
|
||||||
|
|
||||||
public static IEnumerable<ConfigurationSelectData<IconSources>> GetIconSourcesData()
|
public static IEnumerable<ConfigurationSelectData<IconSources>> GetIconSourcesData()
|
||||||
{
|
{
|
||||||
foreach (var source in Enum.GetValues<IconSources>())
|
foreach (var source in Enum.GetValues<IconSources>())
|
||||||
@ -197,6 +209,30 @@ public static class ConfigurationSelectDataFactory
|
|||||||
foreach (var voice in Enum.GetValues<SentenceStructure>())
|
foreach (var voice in Enum.GetValues<SentenceStructure>())
|
||||||
yield return new(voice.Name(), voice);
|
yield return new(voice.Name(), voice);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<ConfigurationSelectData<AudienceProfile>> GetSlideBuilderAudienceProfileData()
|
||||||
|
{
|
||||||
|
foreach (var profile in Enum.GetValues<AudienceProfile>())
|
||||||
|
yield return new(profile.Name(), profile);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<ConfigurationSelectData<AudienceAgeGroup>> GetSlideBuilderAudienceAgeGroupData()
|
||||||
|
{
|
||||||
|
foreach (var ageGroup in Enum.GetValues<AudienceAgeGroup>())
|
||||||
|
yield return new(ageGroup.Name(), ageGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<ConfigurationSelectData<AudienceOrganizationalLevel>> GetSlideBuilderAudienceOrganizationalLevelData()
|
||||||
|
{
|
||||||
|
foreach (var level in Enum.GetValues<AudienceOrganizationalLevel>())
|
||||||
|
yield return new(level.Name(), level);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<ConfigurationSelectData<AudienceExpertise>> GetSlideBuilderAudienceExpertiseData()
|
||||||
|
{
|
||||||
|
foreach (var expertise in Enum.GetValues<AudienceExpertise>())
|
||||||
|
yield return new(expertise.Name(), expertise);
|
||||||
|
}
|
||||||
|
|
||||||
public static IEnumerable<ConfigurationSelectData<string>> GetProfilesData(IEnumerable<Profile> profiles)
|
public static IEnumerable<ConfigurationSelectData<string>> GetProfilesData(IEnumerable<Profile> profiles)
|
||||||
{
|
{
|
||||||
@ -204,6 +240,15 @@ public static class ConfigurationSelectDataFactory
|
|||||||
yield return new(profile.GetSafeName(), profile.Id);
|
yield return new(profile.GetSafeName(), profile.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<ConfigurationSelectData<ProfilePreselection>> GetComponentProfilesData(IEnumerable<Profile> profiles)
|
||||||
|
{
|
||||||
|
yield return new(TB("Use app default profile"), ProfilePreselection.AppDefault);
|
||||||
|
yield return new(Profile.NO_PROFILE.GetSafeName(), ProfilePreselection.NoProfile);
|
||||||
|
|
||||||
|
foreach (var profile in profiles)
|
||||||
|
yield return new(profile.GetSafeName(), ProfilePreselection.Specific(profile.Id));
|
||||||
|
}
|
||||||
|
|
||||||
public static IEnumerable<ConfigurationSelectData<string>> GetTranscriptionProvidersData(IEnumerable<TranscriptionProvider> transcriptionProviders)
|
public static IEnumerable<ConfigurationSelectData<string>> GetTranscriptionProvidersData(IEnumerable<TranscriptionProvider> transcriptionProviders)
|
||||||
{
|
{
|
||||||
foreach (var provider in transcriptionProviders)
|
foreach (var provider in transcriptionProviders)
|
||||||
@ -254,4 +299,4 @@ public static class ConfigurationSelectDataFactory
|
|||||||
foreach (var theme in Enum.GetValues<Themes>())
|
foreach (var theme in Enum.GetValues<Themes>())
|
||||||
yield return new(theme.GetName(), theme);
|
yield return new(theme.GetName(), theme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -51,6 +51,11 @@ public sealed class Data
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public List<Guid> EnabledPlugins { get; set; } = [];
|
public List<Guid> EnabledPlugins { get; set; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Metadata for managed settings that use a plugin-provided editable default.
|
||||||
|
/// </summary>
|
||||||
|
public Dictionary<string, ManagedEditableDefaultState> ManagedEditableDefaults { get; set; } = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The next provider number to use.
|
/// The next provider number to use.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -118,6 +123,8 @@ public sealed class Data
|
|||||||
|
|
||||||
public DataEMail EMail { get; init; } = new();
|
public DataEMail EMail { get; init; } = new();
|
||||||
|
|
||||||
|
public DataSlideBuilder SlideBuilder { get; init; } = new();
|
||||||
|
|
||||||
public DataLegalCheck LegalCheck { get; init; } = new();
|
public DataLegalCheck LegalCheck { get; init; } = new();
|
||||||
|
|
||||||
public DataSynonyms Synonyms { get; init; } = new();
|
public DataSynonyms Synonyms { get; init; } = new();
|
||||||
|
|||||||
@ -52,6 +52,11 @@ public sealed class DataApp(Expression<Func<Data, DataApp>>? configSelection = n
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public NavBehavior NavigationBehavior { get; set; } = NavBehavior.NEVER_EXPAND_USE_TOOLTIPS;
|
public NavBehavior NavigationBehavior { get; set; } = NavBehavior.NEVER_EXPAND_USE_TOOLTIPS;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Which page should be opened first when the app starts?
|
||||||
|
/// </summary>
|
||||||
|
public StartPage StartPage { get; set; } = ManagedConfiguration.Register(configSelection, n => n.StartPage, StartPage.HOME);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The visibility setting for previews features.
|
/// The visibility setting for previews features.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -0,0 +1,62 @@
|
|||||||
|
using AIStudio.Assistants.SlideBuilder;
|
||||||
|
using AIStudio.Provider;
|
||||||
|
|
||||||
|
namespace AIStudio.Settings.DataModel;
|
||||||
|
|
||||||
|
public class DataSlideBuilder
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect any Slide Builder options?
|
||||||
|
/// </summary>
|
||||||
|
public bool PreselectOptions { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect a profile?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedProfile { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect a Slide Builder provider?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedProvider { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect the target language?
|
||||||
|
/// </summary>
|
||||||
|
public CommonLanguages PreselectedTargetLanguage { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect any other language?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedOtherLanguage { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect the audience profile?
|
||||||
|
/// </summary>
|
||||||
|
public AudienceProfile PreselectedAudienceProfile { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect the audience age group?
|
||||||
|
/// </summary>
|
||||||
|
public AudienceAgeGroup PreselectedAudienceAgeGroup { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect the audience organizational level?
|
||||||
|
/// </summary>
|
||||||
|
public AudienceOrganizationalLevel PreselectedAudienceOrganizationalLevel { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect the audience expertise?
|
||||||
|
/// </summary>
|
||||||
|
public AudienceExpertise PreselectedAudienceExpertise { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Preselect any important aspects that the Slide Builder should take into account?
|
||||||
|
/// </summary>
|
||||||
|
public string PreselectedImportantAspects { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The minimum confidence level required for a provider to be considered.
|
||||||
|
/// </summary>
|
||||||
|
public ConfidenceLevel MinimumProviderConfidence { get; set; } = ConfidenceLevel.NONE;
|
||||||
|
}
|
||||||
@ -32,6 +32,7 @@ public static class PreviewFeaturesExtensions
|
|||||||
{
|
{
|
||||||
PreviewFeatures.PRE_READ_PDF_2025 => true,
|
PreviewFeatures.PRE_READ_PDF_2025 => true,
|
||||||
PreviewFeatures.PRE_PLUGINS_2025 => true,
|
PreviewFeatures.PRE_PLUGINS_2025 => true,
|
||||||
|
PreviewFeatures.PRE_DOCUMENT_ANALYSIS_2025 => true,
|
||||||
|
|
||||||
_ => false
|
_ => false
|
||||||
};
|
};
|
||||||
|
|||||||
12
app/MindWork AI Studio/Settings/DataModel/StartPage.cs
Normal file
12
app/MindWork AI Studio/Settings/DataModel/StartPage.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
namespace AIStudio.Settings.DataModel;
|
||||||
|
|
||||||
|
public enum StartPage
|
||||||
|
{
|
||||||
|
HOME,
|
||||||
|
CHAT,
|
||||||
|
ASSISTANTS,
|
||||||
|
INFORMATION,
|
||||||
|
PLUGINS,
|
||||||
|
SUPPORTERS,
|
||||||
|
SETTINGS,
|
||||||
|
}
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
namespace AIStudio.Settings.DataModel;
|
||||||
|
|
||||||
|
public static class StartPageExtensions
|
||||||
|
{
|
||||||
|
public static string ToRoute(this StartPage startPage) => startPage switch
|
||||||
|
{
|
||||||
|
StartPage.HOME => string.Empty,
|
||||||
|
StartPage.CHAT => Routes.CHAT,
|
||||||
|
StartPage.ASSISTANTS => Routes.ASSISTANTS,
|
||||||
|
StartPage.INFORMATION => Routes.ABOUT,
|
||||||
|
StartPage.PLUGINS => Routes.PLUGINS,
|
||||||
|
StartPage.SUPPORTERS => Routes.SUPPORTERS,
|
||||||
|
StartPage.SETTINGS => Routes.SETTINGS,
|
||||||
|
|
||||||
|
_ => string.Empty,
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -63,8 +63,10 @@ public static partial class ManagedConfiguration
|
|||||||
|
|
||||||
if(dryRun)
|
if(dryRun)
|
||||||
return successful;
|
return successful;
|
||||||
|
|
||||||
return HandleParsedValue(configPluginId, dryRun, successful, configMeta, configuredValue);
|
var settingName = SettingName(propertyExpression);
|
||||||
|
var managedMode = ReadManagedConfigurationMode(propertyExpression, settings);
|
||||||
|
return HandleParsedScalarValue(configPluginId, dryRun, successful, configMeta, configuredValue, managedMode, settingName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -128,8 +130,10 @@ public static partial class ManagedConfiguration
|
|||||||
|
|
||||||
if(dryRun)
|
if(dryRun)
|
||||||
return successful;
|
return successful;
|
||||||
|
|
||||||
return HandleParsedValue(configPluginId, dryRun, successful, configMeta, configuredValue);
|
var settingName = SettingName(propertyExpression);
|
||||||
|
var managedMode = ReadManagedConfigurationMode(propertyExpression, settings);
|
||||||
|
return HandleParsedScalarValue(configPluginId, dryRun, successful, configMeta, configuredValue, managedMode, settingName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -216,7 +220,9 @@ public static partial class ManagedConfiguration
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return HandleParsedValue(configPluginId, dryRun, successful, configMeta, configuredValue);
|
var settingName = SettingName(propertyExpression);
|
||||||
|
var managedMode = ReadManagedConfigurationMode(propertyExpression, settings);
|
||||||
|
return HandleParsedScalarValue(configPluginId, dryRun, successful, configMeta, configuredValue, managedMode, settingName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -857,4 +863,91 @@ public static partial class ManagedConfiguration
|
|||||||
|
|
||||||
return successful;
|
return successful;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool HandleParsedScalarValue<TClass, TValue>(
|
||||||
|
Guid configPluginId,
|
||||||
|
bool dryRun,
|
||||||
|
bool successful,
|
||||||
|
ConfigMeta<TClass, TValue> configMeta,
|
||||||
|
TValue configuredValue,
|
||||||
|
ManagedConfigurationMode managedMode,
|
||||||
|
string settingName)
|
||||||
|
{
|
||||||
|
if (dryRun)
|
||||||
|
return successful;
|
||||||
|
|
||||||
|
switch (successful)
|
||||||
|
{
|
||||||
|
case true when managedMode is ManagedConfigurationMode.LOCKED:
|
||||||
|
ClearEditableDefaultState(settingName);
|
||||||
|
configMeta.ClearEditableDefaultConfiguration();
|
||||||
|
configMeta.SetValue(configuredValue);
|
||||||
|
configMeta.LockConfiguration(configPluginId);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case true when managedMode is ManagedConfigurationMode.EDITABLE_DEFAULT:
|
||||||
|
var currentValueSerialized = SerializeManagedScalarValue(configMeta.GetValue());
|
||||||
|
var configuredValueSerialized = SerializeManagedScalarValue(configuredValue);
|
||||||
|
|
||||||
|
string lastAppliedValue;
|
||||||
|
if (!TryGetEditableDefaultState(settingName, out var editableDefaultState))
|
||||||
|
{
|
||||||
|
configMeta.SetValue(configuredValue);
|
||||||
|
lastAppliedValue = configuredValueSerialized;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lastAppliedValue = editableDefaultState.LastAppliedValue;
|
||||||
|
if (string.Equals(currentValueSerialized, lastAppliedValue, StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
configMeta.SetValue(configuredValue);
|
||||||
|
lastAppliedValue = configuredValueSerialized;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SetEditableDefaultState(settingName, configPluginId, lastAppliedValue);
|
||||||
|
configMeta.UnlockConfiguration();
|
||||||
|
configMeta.SetEditableDefaultConfiguration(configPluginId);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case false when configMeta.IsLocked && configMeta.LockedByConfigPluginId == configPluginId:
|
||||||
|
configMeta.ResetLockedConfiguration();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case false when configMeta.ManagedMode is ManagedConfigurationMode.EDITABLE_DEFAULT
|
||||||
|
&& TryGetEditableDefaultState(settingName, out var editableDefaultStateToRemove)
|
||||||
|
&& editableDefaultStateToRemove.ConfigPluginId == configPluginId:
|
||||||
|
configMeta.ClearEditableDefaultConfiguration();
|
||||||
|
ClearEditableDefaultState(settingName);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return successful;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ManagedConfigurationMode ReadManagedConfigurationMode<TClass, TValue>(
|
||||||
|
Expression<Func<TClass, TValue>> propertyExpression,
|
||||||
|
LuaTable settings)
|
||||||
|
{
|
||||||
|
var allowUserOverrideSettingName = $"{SettingsManager.ToSettingName(propertyExpression)}.AllowUserOverride";
|
||||||
|
if (!settings.TryGetValue(allowUserOverrideSettingName, out var allowUserOverrideValue))
|
||||||
|
return ManagedConfigurationMode.LOCKED;
|
||||||
|
|
||||||
|
if (allowUserOverrideValue.TryRead<bool>(out var allowUserOverride))
|
||||||
|
return allowUserOverride ? ManagedConfigurationMode.EDITABLE_DEFAULT : ManagedConfigurationMode.LOCKED;
|
||||||
|
|
||||||
|
if (allowUserOverrideValue.TryRead<string>(out var allowUserOverrideText) && bool.TryParse(allowUserOverrideText, out allowUserOverride))
|
||||||
|
return allowUserOverride ? ManagedConfigurationMode.EDITABLE_DEFAULT : ManagedConfigurationMode.LOCKED;
|
||||||
|
|
||||||
|
return ManagedConfigurationMode.LOCKED;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string SerializeManagedScalarValue<TValue>(TValue value) => value switch
|
||||||
|
{
|
||||||
|
null => string.Empty,
|
||||||
|
string text => text,
|
||||||
|
IFormattable formattable => formattable.ToString(null, CultureInfo.InvariantCulture),
|
||||||
|
|
||||||
|
_ => value.ToString() ?? string.Empty,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
@ -246,68 +246,68 @@ public static partial class ManagedConfiguration
|
|||||||
public static bool IsConfigurationLeftOver<TClass, TValue>(
|
public static bool IsConfigurationLeftOver<TClass, TValue>(
|
||||||
Expression<Func<Data, TClass>> configSelection,
|
Expression<Func<Data, TClass>> configSelection,
|
||||||
Expression<Func<TClass, TValue>> propertyExpression,
|
Expression<Func<TClass, TValue>> propertyExpression,
|
||||||
IEnumerable<IAvailablePlugin> availablePlugins)
|
IReadOnlyList<IAvailablePlugin> availablePlugins)
|
||||||
where TValue : Enum
|
where TValue : Enum
|
||||||
{
|
{
|
||||||
if (!TryGet(configSelection, propertyExpression, out var configMeta))
|
if (!TryGet(configSelection, propertyExpression, out var configMeta))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (configMeta.LockedByConfigPluginId == Guid.Empty || !configMeta.IsLocked)
|
if (configMeta.LockedByConfigPluginId != Guid.Empty && configMeta.IsLocked)
|
||||||
return false;
|
|
||||||
|
|
||||||
var plugin = availablePlugins.FirstOrDefault(x => x.Id == configMeta.LockedByConfigPluginId);
|
|
||||||
if (plugin is null)
|
|
||||||
{
|
{
|
||||||
configMeta.ResetLockedConfiguration();
|
var plugin = availablePlugins.FirstOrDefault(x => x.Id == configMeta.LockedByConfigPluginId);
|
||||||
return true;
|
if (plugin is null)
|
||||||
|
{
|
||||||
|
configMeta.ResetLockedConfiguration();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return CleanupEditableDefaultState(configMeta, SettingName(propertyExpression), availablePlugins);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool IsConfigurationLeftOver<TClass>(
|
public static bool IsConfigurationLeftOver<TClass>(
|
||||||
Expression<Func<Data, TClass>> configSelection,
|
Expression<Func<Data, TClass>> configSelection,
|
||||||
Expression<Func<TClass, string>> propertyExpression,
|
Expression<Func<TClass, string>> propertyExpression,
|
||||||
IEnumerable<IAvailablePlugin> availablePlugins)
|
IReadOnlyList<IAvailablePlugin> availablePlugins)
|
||||||
{
|
{
|
||||||
if (!TryGet(configSelection, propertyExpression, out var configMeta))
|
if (!TryGet(configSelection, propertyExpression, out var configMeta))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (configMeta.LockedByConfigPluginId == Guid.Empty || !configMeta.IsLocked)
|
if (configMeta.LockedByConfigPluginId != Guid.Empty && configMeta.IsLocked)
|
||||||
return false;
|
|
||||||
|
|
||||||
var plugin = availablePlugins.FirstOrDefault(x => x.Id == configMeta.LockedByConfigPluginId);
|
|
||||||
if (plugin is null)
|
|
||||||
{
|
{
|
||||||
configMeta.ResetLockedConfiguration();
|
var plugin = availablePlugins.FirstOrDefault(x => x.Id == configMeta.LockedByConfigPluginId);
|
||||||
return true;
|
if (plugin is null)
|
||||||
|
{
|
||||||
|
configMeta.ResetLockedConfiguration();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return CleanupEditableDefaultState(configMeta, SettingName(propertyExpression), availablePlugins);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReSharper disable MethodOverloadWithOptionalParameter
|
// ReSharper disable MethodOverloadWithOptionalParameter
|
||||||
public static bool IsConfigurationLeftOver<TClass, TValue>(
|
public static bool IsConfigurationLeftOver<TClass, TValue>(
|
||||||
Expression<Func<Data, TClass>> configSelection,
|
Expression<Func<Data, TClass>> configSelection,
|
||||||
Expression<Func<TClass, TValue>> propertyExpression,
|
Expression<Func<TClass, TValue>> propertyExpression,
|
||||||
IEnumerable<IAvailablePlugin> availablePlugins,
|
IReadOnlyList<IAvailablePlugin> availablePlugins,
|
||||||
ISpanParsable<TValue>? _ = null)
|
ISpanParsable<TValue>? _ = null)
|
||||||
where TValue : struct, ISpanParsable<TValue>
|
where TValue : struct, ISpanParsable<TValue>
|
||||||
{
|
{
|
||||||
if (!TryGet(configSelection, propertyExpression, out var configMeta))
|
if (!TryGet(configSelection, propertyExpression, out var configMeta))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (configMeta.LockedByConfigPluginId == Guid.Empty || !configMeta.IsLocked)
|
if (configMeta.LockedByConfigPluginId != Guid.Empty && configMeta.IsLocked)
|
||||||
return false;
|
|
||||||
|
|
||||||
var plugin = availablePlugins.FirstOrDefault(x => x.Id == configMeta.LockedByConfigPluginId);
|
|
||||||
if (plugin is null)
|
|
||||||
{
|
{
|
||||||
configMeta.ResetLockedConfiguration();
|
var plugin = availablePlugins.FirstOrDefault(x => x.Id == configMeta.LockedByConfigPluginId);
|
||||||
return true;
|
if (plugin is null)
|
||||||
|
{
|
||||||
|
configMeta.ResetLockedConfiguration();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return CleanupEditableDefaultState(configMeta, SettingName(propertyExpression), availablePlugins);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReSharper restore MethodOverloadWithOptionalParameter
|
// ReSharper restore MethodOverloadWithOptionalParameter
|
||||||
@ -413,4 +413,44 @@ public static partial class ManagedConfiguration
|
|||||||
var configPath = $"{configName}.{className}.{propertyName}";
|
var configPath = $"{configName}.{className}.{propertyName}";
|
||||||
return configPath;
|
return configPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string SettingName<TClass, TValue>(Expression<Func<TClass, TValue>> propertyExpression) => SettingsManager.ToSettingName(propertyExpression);
|
||||||
|
|
||||||
|
private static bool TryGetEditableDefaultState(string settingName, out ManagedEditableDefaultState editableDefaultState)
|
||||||
|
{
|
||||||
|
return SETTINGS_MANAGER.ConfigurationData.ManagedEditableDefaults.TryGetValue(settingName, out editableDefaultState!);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SetEditableDefaultState(string settingName, Guid pluginId, string lastAppliedValue)
|
||||||
|
{
|
||||||
|
SETTINGS_MANAGER.ConfigurationData.ManagedEditableDefaults[settingName] = new()
|
||||||
|
{
|
||||||
|
ConfigPluginId = pluginId,
|
||||||
|
LastAppliedValue = lastAppliedValue,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool ClearEditableDefaultState(string settingName) => SETTINGS_MANAGER.ConfigurationData.ManagedEditableDefaults.Remove(settingName);
|
||||||
|
|
||||||
|
private static bool CleanupEditableDefaultState<TClass, TValue>(
|
||||||
|
ConfigMeta<TClass, TValue> configMeta,
|
||||||
|
string settingName,
|
||||||
|
IReadOnlyList<IAvailablePlugin> availablePlugins)
|
||||||
|
{
|
||||||
|
if (!TryGetEditableDefaultState(settingName, out var editableDefaultState))
|
||||||
|
{
|
||||||
|
if (configMeta.ManagedMode is not ManagedConfigurationMode.EDITABLE_DEFAULT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
configMeta.ClearEditableDefaultConfiguration();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var plugin = availablePlugins.FirstOrDefault(x => x.Id == editableDefaultState.ConfigPluginId);
|
||||||
|
if (plugin is not null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
configMeta.ClearEditableDefaultConfiguration();
|
||||||
|
return ClearEditableDefaultState(settingName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
14
app/MindWork AI Studio/Settings/ManagedConfigurationMode.cs
Normal file
14
app/MindWork AI Studio/Settings/ManagedConfigurationMode.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
namespace AIStudio.Settings;
|
||||||
|
|
||||||
|
public enum ManagedConfigurationMode
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The configuration is locked by a configuration plugin. The user cannot change the value of this setting, and it will be overridden by the plugin on each update.
|
||||||
|
/// </summary>
|
||||||
|
LOCKED,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The configuration has an editable default provided by a configuration plugin. The user can change the value of this setting.
|
||||||
|
/// </summary>
|
||||||
|
EDITABLE_DEFAULT,
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
namespace AIStudio.Settings;
|
||||||
|
|
||||||
|
public sealed class ManagedEditableDefaultState
|
||||||
|
{
|
||||||
|
public Guid ConfigPluginId { get; init; } = Guid.Empty;
|
||||||
|
|
||||||
|
public string LastAppliedValue { get; init; } = string.Empty;
|
||||||
|
}
|
||||||
55
app/MindWork AI Studio/Settings/ProfilePreselection.cs
Normal file
55
app/MindWork AI Studio/Settings/ProfilePreselection.cs
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
namespace AIStudio.Settings;
|
||||||
|
|
||||||
|
public readonly record struct ProfilePreselection
|
||||||
|
{
|
||||||
|
public ProfilePreselectionMode Mode { get; }
|
||||||
|
|
||||||
|
public string SpecificProfileId { get; }
|
||||||
|
|
||||||
|
public bool UseAppDefault => this.Mode == ProfilePreselectionMode.USE_APP_DEFAULT;
|
||||||
|
|
||||||
|
public bool DoNotPreselectProfile => this.Mode == ProfilePreselectionMode.USE_NO_PROFILE;
|
||||||
|
|
||||||
|
public bool UseSpecificProfile => this.Mode == ProfilePreselectionMode.USE_SPECIFIC_PROFILE;
|
||||||
|
|
||||||
|
public static ProfilePreselection AppDefault => new(ProfilePreselectionMode.USE_APP_DEFAULT, string.Empty);
|
||||||
|
|
||||||
|
public static ProfilePreselection NoProfile => new(ProfilePreselectionMode.USE_NO_PROFILE, Profile.NO_PROFILE.Id);
|
||||||
|
|
||||||
|
private ProfilePreselection(ProfilePreselectionMode mode, string specificProfileId)
|
||||||
|
{
|
||||||
|
this.Mode = mode;
|
||||||
|
this.SpecificProfileId = specificProfileId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ProfilePreselection Specific(string profileId)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(profileId))
|
||||||
|
throw new ArgumentException("A specific profile preselection requires a profile ID.", nameof(profileId));
|
||||||
|
|
||||||
|
if (profileId.Equals(Profile.NO_PROFILE.Id, StringComparison.OrdinalIgnoreCase))
|
||||||
|
throw new ArgumentException("Use NoProfile for the NO_PROFILE selection.", nameof(profileId));
|
||||||
|
|
||||||
|
return new(ProfilePreselectionMode.USE_SPECIFIC_PROFILE, profileId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ProfilePreselection FromStoredValue(string? storedValue)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(storedValue))
|
||||||
|
return AppDefault;
|
||||||
|
|
||||||
|
if (storedValue.Equals(Profile.NO_PROFILE.Id, StringComparison.OrdinalIgnoreCase))
|
||||||
|
return NoProfile;
|
||||||
|
|
||||||
|
return new(ProfilePreselectionMode.USE_SPECIFIC_PROFILE, storedValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static implicit operator string(ProfilePreselection preselection) => preselection.Mode switch
|
||||||
|
{
|
||||||
|
ProfilePreselectionMode.USE_APP_DEFAULT => string.Empty,
|
||||||
|
ProfilePreselectionMode.USE_NO_PROFILE => Profile.NO_PROFILE.Id,
|
||||||
|
ProfilePreselectionMode.USE_SPECIFIC_PROFILE => preselection.SpecificProfileId,
|
||||||
|
|
||||||
|
_ => string.Empty,
|
||||||
|
};
|
||||||
|
}
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
namespace AIStudio.Settings;
|
||||||
|
|
||||||
|
public enum ProfilePreselectionMode
|
||||||
|
{
|
||||||
|
USE_APP_DEFAULT,
|
||||||
|
USE_NO_PROFILE,
|
||||||
|
USE_SPECIFIC_PROFILE,
|
||||||
|
}
|
||||||
@ -253,7 +253,7 @@ public sealed record Provider(
|
|||||||
["AdditionalJsonApiParameters"] = "{{LuaTools.EscapeLuaString(this.AdditionalJsonApiParameters)}}",
|
["AdditionalJsonApiParameters"] = "{{LuaTools.EscapeLuaString(this.AdditionalJsonApiParameters)}}",
|
||||||
["Model"] = {
|
["Model"] = {
|
||||||
["Id"] = "{{LuaTools.EscapeLuaString(this.Model.Id)}}",
|
["Id"] = "{{LuaTools.EscapeLuaString(this.Model.Id)}}",
|
||||||
["DisplayName"] = "{{LuaTools.EscapeLuaString(this.Model.DisplayName ?? string.Empty)}}",
|
["DisplayName"] = "{{LuaTools.EscapeLuaString(this.Model.DisplayName ?? this.Model.Id)}}",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
""";
|
""";
|
||||||
|
|||||||
@ -24,6 +24,17 @@ public static partial class ProviderExtensions
|
|||||||
Capability.CHAT_COMPLETION_API,
|
Capability.CHAT_COMPLETION_API,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Check for Qwen 3.5:
|
||||||
|
if(modelName.StartsWith("qwen3.5"))
|
||||||
|
return
|
||||||
|
[
|
||||||
|
Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT,
|
||||||
|
Capability.TEXT_OUTPUT,
|
||||||
|
|
||||||
|
Capability.OPTIONAL_REASONING, Capability.FUNCTION_CALLING,
|
||||||
|
Capability.CHAT_COMPLETION_API,
|
||||||
|
];
|
||||||
|
|
||||||
// Check for Qwen 3:
|
// Check for Qwen 3:
|
||||||
if(modelName.StartsWith("qwen3"))
|
if(modelName.StartsWith("qwen3"))
|
||||||
return
|
return
|
||||||
|
|||||||
@ -102,6 +102,17 @@ public static partial class ProviderExtensions
|
|||||||
Capability.CHAT_COMPLETION_API,
|
Capability.CHAT_COMPLETION_API,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Check for Qwen 3.5:
|
||||||
|
if(modelName.IndexOf("qwen3.5") is not -1)
|
||||||
|
return
|
||||||
|
[
|
||||||
|
Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT,
|
||||||
|
Capability.TEXT_OUTPUT,
|
||||||
|
|
||||||
|
Capability.ALWAYS_REASONING, Capability.FUNCTION_CALLING,
|
||||||
|
Capability.CHAT_COMPLETION_API,
|
||||||
|
];
|
||||||
|
|
||||||
if(modelName.IndexOf("-vl-") is not -1)
|
if(modelName.IndexOf("-vl-") is not -1)
|
||||||
return [
|
return [
|
||||||
Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT,
|
Capability.TEXT_INPUT, Capability.MULTIPLE_IMAGE_INPUT,
|
||||||
|
|||||||
@ -52,6 +52,16 @@ public sealed class SettingsManager
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsDarkMode { get; set; }
|
public bool IsDarkMode { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ensures that the startup start-page redirect is evaluated at most once per app session.
|
||||||
|
/// </summary>
|
||||||
|
public bool StartupStartPageRedirectHandled { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the initial settings load attempt has completed.
|
||||||
|
/// </summary>
|
||||||
|
public bool HasCompletedInitialSettingsLoad { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The configuration data.
|
/// The configuration data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -63,18 +73,31 @@ public sealed class SettingsManager
|
|||||||
/// Loads the settings from the file system.
|
/// Loads the settings from the file system.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public async Task LoadSettings()
|
public async Task LoadSettings()
|
||||||
|
{
|
||||||
|
var settingsSnapshot = await this.TryReadSettingsSnapshot();
|
||||||
|
if (settingsSnapshot is not null)
|
||||||
|
this.ConfigurationData = settingsSnapshot;
|
||||||
|
|
||||||
|
this.HasCompletedInitialSettingsLoad = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads the settings from disk without mutating the current in-memory state.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A (migrated) settings snapshot, or null if it could not be read.</returns>
|
||||||
|
public async Task<Data?> TryReadSettingsSnapshot()
|
||||||
{
|
{
|
||||||
if(!this.IsSetUp)
|
if(!this.IsSetUp)
|
||||||
{
|
{
|
||||||
this.logger.LogWarning("Cannot load settings, because the configuration is not set up yet.");
|
this.logger.LogWarning("Cannot load settings, because the configuration is not set up yet.");
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var settingsPath = Path.Combine(ConfigDirectory!, SETTINGS_FILENAME);
|
var settingsPath = Path.Combine(ConfigDirectory!, SETTINGS_FILENAME);
|
||||||
if(!File.Exists(settingsPath))
|
if(!File.Exists(settingsPath))
|
||||||
{
|
{
|
||||||
this.logger.LogWarning("Cannot load settings, because the settings file does not exist.");
|
this.logger.LogWarning("Cannot load settings, because the settings file does not exist.");
|
||||||
return;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We read the `"Version": "V3"` line to determine the version of the settings file:
|
// We read the `"Version": "V3"` line to determine the version of the settings file:
|
||||||
@ -87,30 +110,28 @@ public sealed class SettingsManager
|
|||||||
|
|
||||||
// Extract the version from the line:
|
// Extract the version from the line:
|
||||||
var settingsVersionText = line.Split('"')[3];
|
var settingsVersionText = line.Split('"')[3];
|
||||||
|
|
||||||
// Parse the version:
|
// Parse the version:
|
||||||
Enum.TryParse(settingsVersionText, out Version settingsVersion);
|
Enum.TryParse(settingsVersionText, out Version settingsVersion);
|
||||||
if(settingsVersion is Version.UNKNOWN)
|
if(settingsVersion is Version.UNKNOWN)
|
||||||
{
|
{
|
||||||
this.logger.LogError("Unknown version of the settings file found.");
|
this.logger.LogError("Unknown version of the settings file found.");
|
||||||
this.ConfigurationData = new();
|
return new();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.ConfigurationData = SettingsMigrations.Migrate(this.logger, settingsVersion, await File.ReadAllTextAsync(settingsPath), JSON_OPTIONS);
|
var settingsData = SettingsMigrations.Migrate(this.logger, settingsVersion, await File.ReadAllTextAsync(settingsPath), JSON_OPTIONS);
|
||||||
|
|
||||||
//
|
//
|
||||||
// We filter the enabled preview features based on the preview visibility.
|
// We filter the enabled preview features based on the preview visibility.
|
||||||
// This is necessary when the app starts up: some preview features may have
|
// This is necessary when the app starts up: some preview features may have
|
||||||
// been disabled or released from the last time the app was started.
|
// been disabled or released from the last time the app was started.
|
||||||
//
|
//
|
||||||
this.ConfigurationData.App.EnabledPreviewFeatures = this.ConfigurationData.App.PreviewVisibility.FilterPreviewFeatures(this.ConfigurationData.App.EnabledPreviewFeatures);
|
settingsData.App.EnabledPreviewFeatures = settingsData.App.PreviewVisibility.FilterPreviewFeatures(settingsData.App.EnabledPreviewFeatures);
|
||||||
|
return settingsData;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logger.LogError("Failed to read the version of the settings file.");
|
this.logger.LogError("Failed to read the version of the settings file.");
|
||||||
this.ConfigurationData = new();
|
return new();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -285,12 +306,32 @@ public sealed class SettingsManager
|
|||||||
|
|
||||||
public Profile GetPreselectedProfile(Tools.Components component)
|
public Profile GetPreselectedProfile(Tools.Components component)
|
||||||
{
|
{
|
||||||
var preselection = component.PreselectedProfile(this);
|
var preselection = component.GetProfilePreselection(this);
|
||||||
if (preselection != Profile.NO_PROFILE)
|
if (preselection.DoNotPreselectProfile)
|
||||||
return preselection;
|
return Profile.NO_PROFILE;
|
||||||
|
|
||||||
preselection = this.ConfigurationData.Profiles.FirstOrDefault(x => x.Id.Equals(this.ConfigurationData.App.PreselectedProfile, StringComparison.OrdinalIgnoreCase));
|
if (preselection.UseSpecificProfile)
|
||||||
return preselection ?? Profile.NO_PROFILE;
|
{
|
||||||
|
var componentProfile = this.ConfigurationData.Profiles.FirstOrDefault(x => x.Id.Equals(preselection.SpecificProfileId, StringComparison.OrdinalIgnoreCase));
|
||||||
|
return componentProfile ?? Profile.NO_PROFILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
var appPreselection = ProfilePreselection.FromStoredValue(this.ConfigurationData.App.PreselectedProfile);
|
||||||
|
if (appPreselection.DoNotPreselectProfile || !appPreselection.UseSpecificProfile)
|
||||||
|
return Profile.NO_PROFILE;
|
||||||
|
|
||||||
|
var appProfile = this.ConfigurationData.Profiles.FirstOrDefault(x => x.Id.Equals(appPreselection.SpecificProfileId, StringComparison.OrdinalIgnoreCase));
|
||||||
|
return appProfile ?? Profile.NO_PROFILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Profile GetAppPreselectedProfile()
|
||||||
|
{
|
||||||
|
var appPreselection = ProfilePreselection.FromStoredValue(this.ConfigurationData.App.PreselectedProfile);
|
||||||
|
if (appPreselection.DoNotPreselectProfile || !appPreselection.UseSpecificProfile)
|
||||||
|
return Profile.NO_PROFILE;
|
||||||
|
|
||||||
|
var appProfile = this.ConfigurationData.Profiles.FirstOrDefault(x => x.Id.Equals(appPreselection.SpecificProfileId, StringComparison.OrdinalIgnoreCase));
|
||||||
|
return appProfile ?? Profile.NO_PROFILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ChatTemplate GetPreselectedChatTemplate(Tools.Components component)
|
public ChatTemplate GetPreselectedChatTemplate(Tools.Components component)
|
||||||
|
|||||||
@ -59,6 +59,7 @@ public static class AssistantVisibilityExtensions
|
|||||||
Components.BIAS_DAY_ASSISTANT => ConfigurableAssistant.BIAS_DAY_ASSISTANT,
|
Components.BIAS_DAY_ASSISTANT => ConfigurableAssistant.BIAS_DAY_ASSISTANT,
|
||||||
Components.ERI_ASSISTANT => ConfigurableAssistant.ERI_ASSISTANT,
|
Components.ERI_ASSISTANT => ConfigurableAssistant.ERI_ASSISTANT,
|
||||||
Components.DOCUMENT_ANALYSIS_ASSISTANT => ConfigurableAssistant.DOCUMENT_ANALYSIS_ASSISTANT,
|
Components.DOCUMENT_ANALYSIS_ASSISTANT => ConfigurableAssistant.DOCUMENT_ANALYSIS_ASSISTANT,
|
||||||
|
Components.SLIDE_BUILDER_ASSISTANT => ConfigurableAssistant.SLIDE_BUILDER_ASSISTANT,
|
||||||
Components.I18N_ASSISTANT => ConfigurableAssistant.I18N_ASSISTANT,
|
Components.I18N_ASSISTANT => ConfigurableAssistant.I18N_ASSISTANT,
|
||||||
|
|
||||||
_ => ConfigurableAssistant.UNKNOWN,
|
_ => ConfigurableAssistant.UNKNOWN,
|
||||||
|
|||||||
8
app/MindWork AI Studio/Tools/AudioRecordingResult.cs
Normal file
8
app/MindWork AI Studio/Tools/AudioRecordingResult.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
namespace AIStudio.Tools;
|
||||||
|
|
||||||
|
public sealed class AudioRecordingResult
|
||||||
|
{
|
||||||
|
public string MimeType { get; init; } = string.Empty;
|
||||||
|
|
||||||
|
public bool ChangedMimeType { get; init; }
|
||||||
|
}
|
||||||
@ -58,6 +58,14 @@ public static class CommonLanguageExtensions
|
|||||||
|
|
||||||
_ => $"Translate the given text in {language.Name()} ({language}).",
|
_ => $"Translate the given text in {language.Name()} ({language}).",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static string PromptGeneralPurpose(this CommonLanguages language, string customLanguage) => language switch
|
||||||
|
{
|
||||||
|
CommonLanguages.AS_IS => "Use the language the user input is written in for the output.",
|
||||||
|
CommonLanguages.OTHER => $"use the language {customLanguage} for your output.",
|
||||||
|
|
||||||
|
_ => $"Use the language {language.Name()} ({language}) for your output.",
|
||||||
|
};
|
||||||
|
|
||||||
public static string NameSelecting(this CommonLanguages language)
|
public static string NameSelecting(this CommonLanguages language)
|
||||||
{
|
{
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user